ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/Daodan/MSVC/Flatline_PacketReader.c
Revision: 586
Committed: Wed Feb 2 08:17:19 2011 UTC (14 years, 8 months ago) by gumby
Content type: text/x-csrc
File size: 4423 byte(s)
Log Message:
stuff

File Contents

# Content
1 #include "Flatline.h"
2
3 bool DoWeUpdateThis( uint16_t BitSet, uint16_t Flag )
4 {
5 if( BitSet & (1 << Flag) ) return true;
6 return false;
7 }
8
9 //Long winded?
10
11
12
13 void FLcPacketBufferToPlayerData( PlayerData* PD)
14 {
15 player_info* PI = PlayerList[PD->ID];
16 uint8_t * DataPointer = PD->data;
17
18 static player_info BufferData[MAX_PLAYERS] = {0};
19 static bool IsBuffered[32];
20
21
22 if(!PI)
23 {
24 //TODO: Store this data and then apply it once we have a character that matches!
25 flatline_packet pk;
26 pk.id = PK_MISSING_PLAYER;
27 pk.integer = PD->ID;
28 NetUDPSocket_Send(client_sock, (sockaddr*)&address, (char*)&pk, FLATLINE_HEADER + 4 );
29
30 IsBuffered[PD->ID] = 1;
31 PI = &BufferData[PD->ID];
32
33 //return;
34 }
35 else if(IsBuffered[PD->ID])
36 {
37 player_info* Buffer = BufferData + PD->ID;
38 if( DoWeUpdateThis( Buffer->UpdateFlags, PFlag_Input) ) PI->Input = Buffer->Input;
39 if( DoWeUpdateThis( Buffer->UpdateFlags, PFlag_Facing) ) PI->Facings = Buffer->Facings;
40 if( DoWeUpdateThis( Buffer->UpdateFlags, PFlag_Health) ) PI->Health = Buffer->Health;
41 if( DoWeUpdateThis( Buffer->UpdateFlags, PFlag_FramePing) ) {
42 PI->Frame = Buffer->Frame;
43 PI->Ping = Buffer->Ping;
44 }
45 //if( DoWeUpdateThis( Buffer->UpdateFlags, PFlag_Inventory) ) PI->invi= Buffer->Input;
46 if( DoWeUpdateThis( Buffer->UpdateFlags, PFlag_Class) )
47 {
48 PI->Class = Buffer->Class;
49 sprintf_s( PI->ClassString, 32, "%s", Buffer->ClassString );
50 }
51
52 if( DoWeUpdateThis( Buffer->UpdateFlags, PFlag_Position) ) PI->Position = Buffer->Position;
53 if( DoWeUpdateThis( Buffer->UpdateFlags, PFlag_Animation) )
54 {
55 PI->Animation = Buffer->Animation;
56 sprintf_s( PI->AnimationString, 32, "%s", Buffer->AnimationString);
57 }
58 if( DoWeUpdateThis( Buffer->UpdateFlags, PFlag_Throws) ) PI->ThrowData = Buffer->ThrowData;
59
60 PI->UpdateFlags |= Buffer->UpdateFlags;
61 IsBuffered[PD->ID] = 0;
62 }
63
64 if( DoWeUpdateThis( PD->UpdateFlags, PFlag_Input) )
65 {
66 PI->Input = *(PlayerInput*)DataPointer;
67 DataPointer += FLpData_PartSize( PFlag_Input);
68 }
69
70 if( DoWeUpdateThis( PD->UpdateFlags, PFlag_Facing) )
71 {
72 PI->Facings = *(PlayerFacing*)DataPointer;
73 DataPointer += FLpData_PartSize( PFlag_Facing);
74 }
75
76 if( DoWeUpdateThis( PD->UpdateFlags, PFlag_Health) )
77 {
78 PI->Health = *(PlayerHealth*)DataPointer;
79 DataPointer += FLpData_PartSize( PFlag_Health);
80 }
81
82 //Not done
83 if( DoWeUpdateThis( PD->UpdateFlags, PFlag_Score) )
84 {
85 PI->Score = *(PlayerScore*)DataPointer;
86 DataPointer += FLpData_PartSize( PFlag_Score);
87 }
88
89 if( DoWeUpdateThis( PD->UpdateFlags, PFlag_FramePing) )
90 {
91 PlayerFP* FP = (PlayerFP*)DataPointer;
92 PI->Ping = FP->Ping;
93
94 if(FP->Frame != -1)
95 {
96 PI->Frame = FP->Frame;
97 }
98 else
99 {
100 PD->UpdateFlags &= ~( 1 << PFlag_FramePing );
101 }
102 DataPointer += FLpData_PartSize( PFlag_FramePing);
103 }
104
105 //Not done
106 if( DoWeUpdateThis( PD->UpdateFlags, PFlag_Inventory) )
107 {
108 PI->Inventory = *(PlayerInventory*)DataPointer;
109 DataPointer += FLpData_PartSize( PFlag_Inventory );
110 }
111
112 if( DoWeUpdateThis( PD->UpdateFlags, PFlag_Class ) )
113 {
114 sprintf_s( PI->ClassString, 32, "%s", DataPointer );
115 TMrInstance_GetDataPtr( 'ONCC', (char*)DataPointer, &PI->Class );
116 DataPointer += FLpData_PartSize( PFlag_Class );
117 }
118
119 if( DoWeUpdateThis( PD->UpdateFlags, PFlag_Position ) )
120 {
121 PI->Position = *(Vector3*)DataPointer;
122 DataPointer += FLpData_PartSize( PFlag_Position );
123 }
124
125 if( DoWeUpdateThis( PD->UpdateFlags, PFlag_Animation ) )
126 {
127 sprintf_s( PI->AnimationString, 32, "%s", DataPointer );
128 TMrInstance_GetDataPtr( 'TRAM', PI->AnimationString, &PI->Animation );
129 DataPointer += FLpData_PartSize( PFlag_Animation );
130 }
131
132 if( DoWeUpdateThis( PD->UpdateFlags, PFlag_Throws ) )
133 {
134 PI->ThrowData = *(PlayerThrowData*)DataPointer;
135 DataPointer += FLpData_PartSize( PFlag_Throws );
136 }
137
138
139 PI->UpdateFlags |= PD->UpdateFlags;
140 }
141
142 void FLcReadPlayerData( flatline_packet* Packet, int16_t Size )
143 {
144 PlayerData* PDCast = (PlayerData*)Packet->data;
145 Size -= FLATLINE_HEADER;
146 while(Size > 0)
147 {
148 if(PDCast->Size > Size)
149 {
150 DDrConsole_PrintF( "Warning, (almost) read %hi bytes too much of player data buffer", -Size );
151 break;
152 }
153 FLcPacketBufferToPlayerData( PDCast );
154 Size -= PDCast->Size;
155 PDCast = (PlayerData*)((char*)PDCast + PDCast->Size);
156 }
157
158 //Packet
159 }