source: Daodan/MSVC/Flatline.c@ 569

Last change on this file since 569 was 569, checked in by gumby, 14 years ago

Fixes, fixes, everywhere

File size: 27.6 KB
Line 
1#include "Flatline.h"
2#include "Oni_Character.h"
3#include "Flatline_Server.h"
4//#include <sys/time.h>
5#include <time.h>
6uint32_t last1 = 0; uint32_t last2 = 0;
7player_info Players[MAX_PLAYERS] = {{0}, {0}, {0}, {0}};
8player_info * PlayerList[MAX_CONNECTIONS] = {0};
9const char * Rejection_Messages[][255] = {
10 {"Server is full"},
11 {"-2"},
12 {"-3"},
13 {"-4"},
14 {"-5"},
15};
16
17#define BETTER_SYNC
18
19void DoRareSync( short Player, sockaddr_in * sender )
20{
21 flatline_packet sync = {0};
22
23 if (Player > max_connections || !PlayerList[ Player ] ) return;
24
25
26// DDrConsole_PrintF( "Sending sync data for player %i, new index %u", Player, PlayerList[ Player ]->rare_sync_index);
27 sender->sin_addr.S_un.S_addr = htonl(sender->sin_addr.S_un.S_addr);
28 sync.id = RARE_SYNC_DATA;
29 sprintf( sync.rare_sync_data.Class, TMrInstance_GetInstanceName( PlayerList[ Player ]->Chr->ONCC ) );
30 //using ->Inventory instead of ->Chr->Inventory to keep the index and Inventory in sync, just in case.
31 memcpy( &(sync.rare_sync_data.Inventory), &(PlayerList[ Player ]->Inventory), sizeof(Inventory) );
32 //WEAPONS ARE DISABLED. Why? Pain in the arse to sync.
33 sync.rare_sync_data.Inventory.Weapons[0] = NULL;
34 sync.rare_sync_data.Inventory.Weapons[1] = NULL;
35 sync.rare_sync_data.Inventory.Weapons[2] = NULL;
36 sync.rare_sync_data.PlayerNum = Player;
37 sync.rare_sync_data.index = PlayerList[ Player ]->rare_sync_index;
38 NetTCPServer_Send( sender, (char*)&sync, sizeof(rare_sync_data) + FLATLINE_HEADER );
39}
40
41bool FLrServer_PacketCallback(char* data, int datalen, int from)
42{
43 int i, j;
44 bool found_player = 0;
45 flatline_packet * packet = (flatline_packet*)data;
46 static int recieved = 0;
47 sockaddr_in sender;
48 sender.sin_family = AF_INET;
49 sender.sin_port = htons(27777);
50 sender.sin_addr = *((struct in_addr*)(int*)&from);
51
52
53 //packet->data[datalen] = '\0';
54
55 //DDrConsole_PrintF("Packet \r%d recieved from %i", ++recieved, from);
56
57
58
59 //if data[0] != CONNECT_SEND, search in playerlist for ip address
60
61
62
63
64 switch(packet->id) {
65 flatline_packet connect_recv;
66 player_info * playah;
67 //rewrite this when we get TCP support.
68 //rewrite this before we get TCP support*
69 //the way of seeing if there is room for players sucks.
70 case CONNECT_SEND:
71 ;
72
73 connect_recv.id = CONNECT_REPLY;
74
75 //if(Players[i].ip == sender.sin_addr.S_un.S_addr) break; //needs to send an error message
76 sender.sin_addr.S_un.S_addr = htonl(sender.sin_addr.S_un.S_addr);
77 playah = FLrServer_AddPlayer(from,packet->connect_send.name, 0);
78 DDrConsole_PrintF("%s connected from %s", packet->connect_send.name, inet_ntoa(sender.sin_addr ) );
79 if(!((int)playah > -5 && (int)playah <= 0)) {
80 flatline_packet new_char = {0};
81 CharacterObject* Char;
82 connect_recv.connect_reply.goodtogo = 1;
83 connect_recv.connect_reply.player_slot = playah->list_slot;
84 DDrConsole_PrintF("Slot: %i", playah->list_slot);
85
86 //sending this several times to make sure it gets through. Really need to make up some form of packet tracking.
87 NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(connect_reply) + FLATLINE_HEADER);
88 NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(connect_reply) + FLATLINE_HEADER);
89 NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(connect_reply) + FLATLINE_HEADER);
90 NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(connect_reply) + FLATLINE_HEADER);
91 NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(connect_reply) + FLATLINE_HEADER);
92 Sleep(100);
93
94 new_char.id = NEW_PLAYER;
95 Char = &new_char.new_player.Character;
96 memset(Char, 0, sizeof(CharacterObject));
97 Char->Header.Type = 'CHAR';
98 Char->OSD.Options = chr_dontaim;
99 for(j = 0; j < max_connections; j++) {
100 if(PlayerList[j] != 0) {
101 new_char.new_player.Playernumber = j;
102 sprintf(Char->OSD.Name,"%s",PlayerList[j]->name);
103
104 sprintf(Char->OSD.Class, "%s", TMrInstance_GetInstanceName(PlayerList[j]->Chr->ONCC));
105 DDrConsole_PrintF("Class %s", Char->OSD.Class );
106
107 sprintf(Char->OSD.Class, "konoko_generic");
108 NetTCPServer_Send((sockaddr *) &sender, (char*)&new_char, sizeof(new_player) + FLATLINE_HEADER );
109 }
110
111 }
112 }
113 else {
114 //fix the error messages...
115 DDrConsole_PrintF("Server is full. :(");
116 connect_recv.connect_reply.goodtogo = 0;
117 sender.sin_addr.S_un.S_addr = htonl(sender.sin_addr.S_un.S_addr);
118 memcpy(&connect_recv.connect_reply.message,"Server is full.", sizeof("Server is full."));
119 NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(bool)*2 + FLATLINE_HEADER + sizeof("Server is full."));
120
121 }
122
123
124 break;
125 case CONNECT_REPLY:
126 break; //do nothing...a server shouldn't recieve this type of packet.
127 case MESSAGE:
128 for(i = 0; i < MAX_PLAYERS; i++) {
129 //DDrConsole_PrintF("%i : %i | %s : %s", from, Players[i].ip, inet_ntoa(*(struct in_addr*)&from), inet_ntoa(*(struct in_addr*)&(Players[i].ip)));
130 if(Players[i].ip == sender.sin_addr.S_un.S_addr) {
131 found_player = 1;
132 break;
133 }
134 }
135 if(found_player == 0) return true;
136 else {
137 char message_buffer[512] = {0};
138 flatline_packet message;
139 int message_size;
140 data[datalen] = 0;
141
142 DDrConsole_PrintF("%s: %s", Players[i].name, packet->data);
143 sprintf(message_buffer, "%s: %s", Players[i].name, packet->data);
144
145 message.id = MESSAGE;
146 message_size = sprintf(message.data, "%s", message_buffer);
147 COrMessage_Print(message_buffer, "chat", 0);
148 UDPServer_SendToAll(&message, message_size + 1 + FLATLINE_HEADER);
149 break;
150 }
151 case CHANGE_NAME:
152 ; //wtf, needed or i get an error.
153 DDrConsole_PrintF("Changing Name to: %s", packet->data);
154 for(i = 0; i < MAX_PLAYERS; i++) {
155 if(Players[i].ip == sender.sin_addr.S_un.S_addr) {
156 found_player = 1;
157 break;
158 }
159 }
160 if(found_player == 0) return true;
161 else {
162 bool name_exists = 0;
163 for(j = 0; j < MAX_PLAYERS; j++) {
164 if(!strcmp(packet->data, Players[j].name)) {
165 name_exists = 1;
166 break;
167 }
168 }
169 if(!name_exists) {
170 char message_buffer[1024];
171 sprintf(message_buffer,"%s changed their name to %s", Players[i].name, packet->data);
172 COrMessage_Print(message_buffer, "name_change", 0);
173 memcpy(Players[i].name, packet->data, 256);
174
175 }
176 break;
177 }
178 case PLAYER_INPUT:
179
180 for(i = 0; i < max_connections; i++) {
181 if(PlayerList[i] != 0 && PlayerList[i]->ip == sender.sin_addr.S_un.S_addr) {
182 found_player = 1;
183 break;
184 }
185 }
186
187 if(found_player == 0) return true;
188 else {
189 input_struct * packet_input = &packet->input_struct;
190
191
192 PlayerList[i]->Actions1 = packet_input->Actions1;
193 PlayerList[i]->Actions2 = packet_input->Actions2;
194 PlayerList[i]->MouseDeltaX = packet_input->MouseDeltaX;
195 PlayerList[i]->MouseDeltaY = packet_input->MouseDeltaY;
196 PlayerList[i]->LastInputTime = packet_input->Time;
197
198 break;
199 }
200 case RARE_SYNC_DATA_REQUEST:
201 DoRareSync( packet->sync_request , &sender);
202 break;
203 default:
204 DDrConsole_PrintF("Warning, recieved badly formed packet!");
205 break;
206 }
207 return true;
208}
209
210bool FLrServer_Run()
211{
212 // Get the local hostname
213 char szHostName[255];
214 struct hostent *host_entry;
215 gethostname(szHostName, 255);
216
217 host_entry=gethostbyname(szHostName);
218 DDrConsole_PrintF("Server started at %s...", inet_ntoa (*(struct in_addr *)*host_entry->h_addr_list));
219 return NetUDPServer_Listen(27777, FLrServer_PacketCallback);
220}
221
222
223 RGBA green = {0, 0xFF, 0, 0};
224 RGBA red = {0, 0, 0xFF, 0};
225 RGBA grey = {0x80,0x80,0x80,0x80};
226
227//FLrClient_Run
228//Looping function that waits for packets from the server.
229//TODO: Convert connection packet stuff to TCP
230int client_slot = 0;
231bool FLrClient_Run(flatline_packet* packet)
232{
233
234 char data[1400];
235 uint16_t len;
236 int j;
237 int sent_bytes;
238 client_connected = 0;
239
240
241 //starts the connection
242 DDrConsole_PrintF("Connecting to server %s on socket %i", inet_ntoa(address.sin_addr), client_sock);
243 sent_bytes = NetUDPSocket_Send(client_sock, (sockaddr*)&address, (char*)packet, 255);
244 if(sent_bytes == SOCKET_ERROR) {
245 NetCatchError();
246 }
247 //loops once per second waiting for a reply.
248 for(j = 0; j < CONNECTION_TIMEOUT; j++) {
249 while(NetUDPSocket_Recieve(client_sock, (sockaddr_storage *) &client_address, data, &len)){
250 packet = (flatline_packet*)data;
251 if(packet->id == CONNECT_REPLY) {
252 if(packet->connect_reply.goodtogo){
253 client_connected = 1;
254
255 client_slot = ((connect_reply*)packet->data)->player_slot;
256
257 PlayerList[client_slot] = Players+client_slot;
258 PlayerList[client_slot]->Chr = ONgGameState->PlayerCharacter;
259
260 DDrConsole_PrintColored("Connection successful!",0,green, grey);
261
262 //disable local input.
263 DDrPatch_NOOP(0x004FA929, 5 + 6 + 5);
264
265 //DDrConsole_PrintF("Slot %i", ((connect_reply*)packet)->player_slot);
266 break;
267 }
268 else {
269 DDrConsole_PrintF("Connection rejected: %s", ((connect_reply*)packet->data)->message);
270 return false;
271 break;
272 }
273 }
274 }
275 if(client_connected) break;
276 DDrConsole_PrintF("Connection timing out in %i seconds...", CONNECTION_TIMEOUT - j);
277 Sleep(1000);
278 }
279 //the client timed out without recieving an error message.
280 if(!client_connected) {
281 DDrConsole_PrintColored("Connection timed out.",0,red, grey);
282 return false;
283 }
284 else
285 {
286 ActiveCharacter * Active;
287 flatline_packet packet;
288//#define SPAM_INPUT
289#ifdef SPAM_INPUT
290 struct timeval lasttime;
291 struct timeval thistime;
292 gettimeofday(&lasttime, 0);
293#endif
294 while(1) {
295#ifdef SPAM_INPUT
296 gettimeofday(&thistime, 0);
297
298 //DDrConsole_PrintF("%i.%i | %i.%i | %i.%i",lasttime.tv_sec, lasttime.tv_usec, thistime.tv_sec, thistime.tv_usec,
299 // thistime.tv_sec - lasttime.tv_sec, thistime.tv_usec - lasttime.tv_usec);
300 //checks to see if enough time has passed since the last input update (by default once every 10ms)
301 if(
302 ((thistime.tv_sec > lasttime.tv_sec) && ((thistime.tv_usec + 1000000 - lasttime.tv_usec ) > update_rate * 1000) )
303 || ((thistime.tv_sec == lasttime.tv_sec) && ((thistime.tv_usec - lasttime.tv_usec ) > update_rate * 1000))
304 ) {
305
306 flatline_packet input_packet;
307 lasttime.tv_usec = ++thistime.tv_usec; //in case recieving packets takes less than 1 ms.
308
309 input_packet.id = PLAYER_INPUT;
310
311 if( ((GameState*)(ONgGameState))->Input.Current.Actions1 != last1 || ((GameState*)(ONgGameState))->Input.Current.Actions2 != last2) {
312 last1 =((GameState*)(ONgGameState))->Input.Current.Actions1;
313 last2 =((GameState*)(ONgGameState))->Input.Current.Actions2;
314 }
315
316 ((input_struct*)(void*)(input_packet.data))->Actions1 = ((GameState*)(ONgGameState))->Input.Current.Actions1;
317 ((input_struct*)(void*)(input_packet.data))->Actions2 = ((GameState*)(ONgGameState))->Input.Current.Actions2;
318 ((input_struct*)(void*)(input_packet.data))->MouseDeltaX = ((GameState*)(ONgGameState))->Input.MouseDeltaX;
319 ((input_struct*)(void*)(input_packet.data))->MouseDeltaY = ((GameState*)(ONgGameState))->Input.MouseDeltaY;
320 sent_bytes = NetUDPSocket_Send(client_sock,(sockaddr *) &address, (char*)&input_packet, sizeof(input_struct) + FLATLINE_HEADER);
321 //if(sent_bytes == SOCKET_ERROR) NetCatchError();
322 }
323#endif
324 if(NetUDPSocket_Recieve(client_sock, (sockaddr_storage *) &client_address, &packet, &len)) {
325 //packet = (flatline_packet*)data;
326 //DDrConsole_PrintF("Data recieved, length %i, type %i", len, ((flatline_packet*)data)->id);
327 switch(packet.id) {
328 case MESSAGE:
329 COrMessage_Print(packet.data, "chat", 0);
330 break;
331 case CONNECT_SEND:
332 ;if(1) {
333 flatline_packet connect_recv;
334 memcpy(&connect_recv.connect_reply.message,"This isn't a server!", sizeof("This isn't a server!"));
335 NetUDPSocket_Send(client_sock, (sockaddr *) &address, (char*)&connect_recv, sizeof(bool) + FLATLINE_HEADER + sizeof("This isn't a server!"));
336 }
337 case CONNECT_REPLY:
338 break; //extra packet or something.
339 case NEW_PLAYER:
340 ;if(1) { //haxhaxhax
341 CharacterObject* Char = &(packet.new_player.Character);
342 uint32_t chr_index = 0;
343 Character* PC;
344 DDrConsole_PrintF("%i | %i", packet.new_player.Playernumber ,client_slot);
345 //Char->OSD.Options = 0;
346 if(packet.new_player.Playernumber == client_slot) {
347 PlayerList[packet.new_player.Playernumber] = &Players[0];
348 PC = (ONgGameState->PlayerCharacter);
349 Players[0].Chr = PC;
350
351 }
352 else {
353 ONrGameState_NewCharacter(Char, NULL, NULL, &chr_index);
354 ONgGameState->CharacterStorage[chr_index].field_1E8 = 0;
355 PlayerList[packet.new_player.Playernumber] = &Players[chr_index];
356 Players[chr_index].Chr = &(ONgGameState->CharacterStorage[chr_index]);
357 Players[chr_index].Chr->Flags &= 0xFFBFFFFF;
358 Players[chr_index].spawnnumber = chr_index;
359 DDrConsole_PrintF("Spawning player %s, class %s, slot %i", ((new_player*)(packet.data))->Character.OSD.Name, ((new_player*)(packet.data))->Character.OSD.Class,chr_index) ;
360 }
361 //Players[((new_player*)(packet.data))->Playernumber].spawnnumber = ONrGameState_NewCharacter(&(((new_player*)(packet.data))->Character), NULL, NULL, 0);
362 break;
363 }
364 case PLAYER_DATA:
365 if(1) { //haxhaxhax
366 player_data* data = &packet.player_data;
367 uint16_t i = data->PlayerNum;
368 GameInput * Active_Input;
369 data = (void*)packet.data;
370
371 //DDrConsole_PrintF("Got data for Player %i, %x", i, PlayerList[i]);
372 if (i > max_connections) break;
373 if( !PlayerList[i] ) break;
374 //PlayerList[i]->Chr = ((GameState *)ONgGameState)->CharacterStorage;
375#ifndef BETTER_SYNC
376 PlayerList[i]->Chr->Health = data->Health;
377 PlayerList[i]->Chr->MaxHealth = data->MaxHealth;
378 PlayerList[i]->Chr->Position = data->Position;
379 PlayerList[i]->Chr->Location = data->Location;
380 PlayerList[i]->Chr->LastPosition = data->LastPosition;
381 PlayerList[i]->Chr->Facing = data->Facing;
382 PlayerList[i]->Chr->DesiredFacing = data->DesiredFacing;
383 PlayerList[i]->Chr->CosmeticFacing = data->CosmeticFacing;
384 PlayerList[i]->Actions1 = data->Inputs.Actions1;
385 PlayerList[i]->Actions2 = data->Inputs.Actions2;
386 PlayerList[i]->MouseDeltaX = data->Inputs.MouseDeltaX;
387 PlayerList[i]->MouseDeltaY = data->Inputs.MouseDeltaY;
388
389 Active = ((ActiveCharacter*)(ONrGetActiveCharacter(PlayerList[i]->Chr)));
390 if(!Active) break;
391
392 Active->PhyContext->Position = data->Position;
393#else
394 PlayerList[i]->Actions1 = data->Inputs.Actions1;
395 PlayerList[i]->Actions2 = data->Inputs.Actions2;
396 PlayerList[i]->MouseDeltaX = data->Inputs.MouseDeltaX;
397 PlayerList[i]->MouseDeltaY = data->Inputs.MouseDeltaY;
398 memcpy( &(PlayerList[i]->player_data), data, sizeof(player_data) );
399#endif
400 if( !server_started && data->rare_sync_index > PlayerList[i]->rare_sync_index )
401 {
402 int sent_bytes;
403 flatline_packet sync_request = {0};
404 sync_request.id = RARE_SYNC_DATA_REQUEST;
405 sync_request.sync_request = i;
406 DDrConsole_PrintF( "Requesting sync data for player %i, old index %u", i, PlayerList[i]->rare_sync_index);
407 sent_bytes = NetUDPSocket_Send(client_sock,(sockaddr *) &address, (char*)&sync_request, FLATLINE_HEADER + sizeof(int) );
408 }
409
410
411#if 0
412 TMrInstance_GetDataPtr('TRAM',data->Animation,Active->Animation);
413 Active->AnimationFromState = data->AnimationFromState;
414 Active->AnimationToState = data->AnimationToState;
415 Active->AnimationType = data->AnimationType;
416 Active->NextAnimationType = data->NextAnimationType;
417 Active->Frame = data->Frame;
418 Active->InterpolationCurrentFrame = data->InterpolationCurrentFrame;
419 Active->InterpolationFromState = data->InterpolationFromState;
420 Active->InterpolationLength = data->InterpolationLength;
421 memcpy(Active->InterpolationStartRotations, data->InterpolationStartRotations,
422 sizeof(Quaternion) * 19);
423 memcpy(Active->BoneMatrices, data->BoneMatrices,
424 sizeof(Quaternion) * 19);
425 Active->Stitch = data->Stitch;
426 Active->StitchHeight = data->StitchHeight;
427 Active->StitchVelocity = data->StitchVelocity;
428
429 Active->Overlay = data->Overlay;
430 memcpy(Active->OverlayRotations, data->OverlayRotations,
431 sizeof(Quaternion) * 19);
432#endif
433 //Active->animationtype2 = data->AnimationType2;
434 /*
435 if((int)*((char*)(Active + 0x1AF8) + 0x166) > data->Frame + 1)
436 *(uint16_t *)((char*)Active + 0x1C88) = data->Frame + 1;
437*/
438 break;
439 }
440 case RARE_SYNC_DATA:
441 if(1) {
442 sl_arg hax[2];
443 int dontuse;
444 uint16_t i = packet.rare_sync_data.PlayerNum;
445
446 if (i > max_connections) break;
447 if( !PlayerList[i] ) break;
448
449 //WEAPONS ARE DISABLED. Why? Pain in the arse to sync.
450 packet.rare_sync_data.Inventory.Weapons[0] = NULL;
451 packet.rare_sync_data.Inventory.Weapons[1] = NULL;
452 packet.rare_sync_data.Inventory.Weapons[2] = NULL;
453// TMrInstance_GetDataPtr( 'ONCC', packet.rare_sync_data.Class, PlayerList[ i ]->Chr->ONCC );
454
455 //add the target character
456 hax[0].type = sl_int32;
457 hax[0].value_int32 = PlayerList[ packet.rare_sync_data.PlayerNum ]->spawnnumber;
458
459 //add the new class
460 //fix this later so we cant buffer overflow :O
461 hax[1].type = sl_str32;
462 hax[1].value_str32 = packet.rare_sync_data.Class;
463
464 //we are directly calling a bsl function instead of using the normal method for two reasons
465 //1. it has all the checking built in
466 iSetCharacterClass( 0, 2, hax, &dontuse, &dontuse, hax );
467 //DDrConsole_PrintF( "Recieved sync data for player %i, class %s, old index %u, new index %u", i, packet.rare_sync_data.Class, PlayerList[i]->rare_sync_index, packet.rare_sync_data.index);
468 memcpy( &(PlayerList[ i ]->Chr->Inventory), &(packet.rare_sync_data.Inventory), sizeof(Inventory ));
469
470 PlayerList[i]->rare_sync_index = packet.rare_sync_data.index;
471 }
472 break;
473
474 default:
475 DDrConsole_PrintF("Warning, recieved badly formed packet!");
476 break;
477 }
478 }
479 else {
480 Sleep(1);
481 }
482 }
483 }
484 return true;
485}
486
487//wtf, this needs cleaned up...
488player_info *FLr_FindEmptySlot() {
489 int j;
490 for(j = 0; j < MAX_PLAYERS; j++) {
491 if (Players[j].ip == 0) {
492 return &Players[j];
493 }
494 }
495 return 0;
496}
497
498extern uint16_t max_connections;
499uint16_t FLr_FindEmptyListSlot() {
500 int j;
501 for(j = 0; j < max_connections; j++) {
502 if (PlayerList[j] == 0) {
503 return j;
504 }
505 }
506 return -1;
507}
508
509static flatline_packet cache_input = {0};
510extern void* TSrTest;
511void * ONICALL FLrInput_Update_Keys(void)
512{
513 uint16_t i;
514 /*DDrConsole_PrintF("Current: %x %x | Start: %x %x | Stop: %x %x | Stopped %x %x",
515 ONgGameState->Input.Current.Actions1, ONgGameState->Input.Current.Actions2,
516 ONgGameState->Input.Start.Actions1,ONgGameState->Input.Start.Actions2,
517 ONgGameState->Input.Stop.Actions1, ONgGameState->Input.Stop.Actions2,
518 ONgGameState->Input.Stopped.Actions2, ONgGameState->Input.Stopped.Actions2
519 );
520 */
521 ActiveCharacter * Active_Player = ONgGameState->ActiveCharacters;
522 Active_Player->PhyContext->Rotation;
523 Active_Player->PhyContext->Position;
524 ONgGameState->PlayerCharacter->Position;
525
526
527
528 /*
529 if( ONgGameState->Input.MouseDeltaX != 0 || ONgGameState->Input.MouseDeltaY != 0 ||
530 ONgGameState->Input.field_8 != 0 || ONgGameState->Input.field_C != 0 )
531
532 DDrConsole_PrintF("%f %f | %f %f",
533 ONgGameState->Input.MouseDeltaX , ONgGameState->Input.MouseDeltaY,
534 ONgGameState->Input.field_8, ONgGameState->Input.field_C);
535
536 */
537 //if sprint timer is equal to 0, display 0
538 //else if sprint timer is equal to -1, display -1
539 //else display difference
540 //good thing this is just quick an dirty debug stuff :)
541
542 //basically it seems that if the difference is bigger than 15 frames, you cant dash. : /
543
544#ifndef SPAM_INPUT
545 if(client_connected)
546 {
547 int sent_bytes;
548 flatline_packet input_packet = {0};
549 input_packet.id = PLAYER_INPUT;
550 input_packet.input_struct.Time = ONgGameState->GameTime;
551 input_packet.input_struct.Actions1 = ((GameState*)(ONgGameState))->Input.Current.Actions1;
552 input_packet.input_struct.Actions2 = ((GameState*)(ONgGameState))->Input.Current.Actions2;
553 input_packet.input_struct.MouseDeltaX = ((GameState*)(ONgGameState))->Input.MouseDeltaX;
554 input_packet.input_struct.MouseDeltaY = ((GameState*)(ONgGameState))->Input.MouseDeltaY;
555
556 sent_bytes = NetUDPSocket_Send(client_sock,(sockaddr *) &address, (char*)&input_packet, sizeof(input_struct) + FLATLINE_HEADER);
557
558 //return ONgGameState;
559 }
560#endif
561 //Testing drawing text to the screen...this failed. Will need to get it working eventually.
562 if( TSrTest )
563 {
564 OniRectangle TextRect = { 20, 20, 50, 50 };
565 TSrContext_DrawText(TSrTest, "Testing woohoo", 0xFF, 0, &TextRect);
566 }
567 if(!(server_started || client_connected)) return ONgGameState;
568
569 for(i = 0; i < max_connections; i++) {
570 ActiveCharacter * Active_Player;
571 GameInput * Active_Input;
572 if(PlayerList[i] == 0) continue;
573
574 //is this right?
575 Active_Player = (void*)ONrGetActiveCharacter( PlayerList[i]->Chr);
576
577 if(Active_Player == 0) continue;
578 Active_Input = &(Active_Player->Input);
579 if(server_started) {
580 player_data * data;
581 flatline_packet data_out = {0};
582
583 //if( PlayerList[i]->Chr->Health == 0) PlayerList[i]->Chr->Health = PlayerList[i]->Chr->MaxHealth;
584
585 data_out.id = PLAYER_DATA;
586 data = (void*)&(data_out.data);
587 data->PlayerNum = i;
588 data->Health = PlayerList[i]->Chr->Health;
589 data->MaxHealth = PlayerList[i]->Chr->MaxHealth;
590 data->Position = PlayerList[i]->Chr->Position;
591 data->Location = PlayerList[i]->Chr->Location;
592 data->LastPosition = PlayerList[i]->Chr->LastPosition;
593 data->Facing = PlayerList[i]->Chr->Facing;
594 data->DesiredFacing = PlayerList[i]->Chr->DesiredFacing;
595 data->CosmeticFacing = PlayerList[i]->Chr->CosmeticFacing;
596
597
598 data->Position = Active_Player->PhyContext->Position;
599
600 if( PlayerList[i]->OldClass != PlayerList[i]->Chr->ONCC || memcmp( &(PlayerList[i]->Inventory), &(PlayerList[i]->Chr->Inventory), sizeof(Inventory) ) )
601 {
602 PlayerList[i]->OldClass = PlayerList[i]->Chr->ONCC;
603 memcpy( &(PlayerList[i]->Inventory), &(PlayerList[i]->Chr->Inventory), sizeof(Inventory) );
604 PlayerList[i]->rare_sync_index++;
605
606 }
607
608 data->rare_sync_index = PlayerList[i]->rare_sync_index;
609
610#if 0
611 data->Frame = Active_Player->Frame;
612 memcpy(data->Animation, TMrInstance_GetInstanceName(Active_Player->Animation), 32);
613 data->AnimationToState = Active_Player->AnimationToState;
614 data->AnimationFromState = Active_Player->AnimationFromState;
615 data->AnimationType = Active_Player->AnimationType;
616 data->NextAnimationType = Active_Player->NextAnimationType;
617 data->InterpolationCurrentFrame = Active_Player->InterpolationCurrentFrame;
618 data->InterpolationFromState = Active_Player->InterpolationFromState;
619 data->InterpolationLength = Active_Player->InterpolationLength;
620 memcpy(data->InterpolationStartRotations, Active_Player->InterpolationStartRotations,
621 sizeof(Quaternion) * 19);
622 // data->InterpolationStartRotations = Active_Player->InterpolationStartRotations;
623 memcpy(data->BoneMatrices, Active_Player->BoneMatrices,
624 sizeof(Quaternion) * 19);
625 data->Stitch = Active_Player->Stitch;
626 data->StitchHeight = Active_Player->StitchHeight;
627 data->StitchVelocity = Active_Player->StitchVelocity;
628
629 data->Overlay = Active_Player->Overlay;
630 memcpy( data->OverlayRotations, Active_Player->OverlayRotations
631 ,sizeof(Quaternion) * 19);
632#endif
633 if(i == 0) {
634 data->Inputs.Actions1 = ((GameState*)(ONgGameState))->Input.Current.Actions1;
635 data->Inputs.Actions2 = ((GameState*)(ONgGameState))->Input.Current.Actions2;
636 data->Inputs.MouseDeltaX = ONgGameState->Input.MouseDeltaX;
637 data->Inputs.MouseDeltaY = ONgGameState->Input.MouseDeltaY;
638 }
639 else{
640 data->Inputs.Actions1 = PlayerList[i]->Actions1;
641 data->Inputs.Actions2 = PlayerList[i]->Actions2;
642 data->Inputs.MouseDeltaX = PlayerList[i]->MouseDeltaX;
643 data->Inputs.MouseDeltaY = PlayerList[i]->MouseDeltaY;
644 }
645 memcpy( &(PlayerList[i]->player_data), data, sizeof(player_data) );
646
647 UDPServer_SendToAll(&data_out, sizeof(player_data) + FLATLINE_HEADER);
648 }
649
650 if( (server_started && i !=0) || (!server_started/* && i != client_slot*/) )
651 {
652 //this just made sync even worse...
653#ifdef JITTER_FIX
654 input_struct * New_Input = &PlayerList[i]->MouseDeltaX;
655 input_struct * Cache_Input = &PlayerList[i]->CacheInput;
656 Active_Input->Stop.Actions1 = ~Cache_Input->Actions1 & Active_Input->Current.Actions1;
657 Active_Input->Stop.Actions2 = ~Cache_Input->Actions2 & Active_Input->Current.Actions2;
658 Active_Input->Start.Actions1 = ~Active_Input->Current.Actions1 & Cache_Input->Actions1;
659 Active_Input->Start.Actions2 = ~Active_Input->Current.Actions2 & Cache_Input->Actions2;
660 Active_Input->Current.Actions1 = Cache_Input->Actions1;
661 Active_Input->Current.Actions2 = Cache_Input->Actions2;
662 Active_Input->Stopped.Actions1 = ~Active_Input->Current.Actions1;
663 Active_Input->Stopped.Actions2 = ~Active_Input->Current.Actions2;
664 Active_Input->MouseDeltaX = Cache_Input->MouseDeltaX;
665 Active_Input->MouseDeltaY = Cache_Input->MouseDeltaY;
666 memcpy( Cache_Input, New_Input, sizeof(input_struct));
667#else
668
669 Active_Input->Stop.Actions1 = ~PlayerList[i]->Actions1 & Active_Input->Current.Actions1;
670 Active_Input->Stop.Actions2 = ~PlayerList[i]->Actions2 & Active_Input->Current.Actions2;
671 Active_Input->Start.Actions1 = ~Active_Input->Current.Actions1 & PlayerList[i]->Actions1;
672 Active_Input->Start.Actions2 = ~Active_Input->Current.Actions2 & PlayerList[i]->Actions2;
673
674 Active_Input->Current.Actions1 = PlayerList[i]->Actions1;
675 Active_Input->Current.Actions2 = PlayerList[i]->Actions2;
676 Active_Input->Stopped.Actions1 = ~Active_Input->Current.Actions1;
677 Active_Input->Stopped.Actions2 = ~Active_Input->Current.Actions2;
678 Active_Input->MouseDeltaX = PlayerList[i]->MouseDeltaX;
679 Active_Input->MouseDeltaY = PlayerList[i]->MouseDeltaY;
680 //DDrConsole_PrintF("Timer: %i", (Active_Player->SprintTimer != 0) ? (Active_Player->SprintTimer == -1) ? -1 : (ONgGameState->GameTime - Active_Player->SprintTimer) : 0);
681
682 //DDrConsole_PrintF("1E8 %u", ONgGameState->PlayerCharacter->field_1E8);
683/*
684 DDrConsole_PrintF("T %u | Current: %x %x | Start: %x %x | Stop: %x %x | Stopped %x %x",
685 PlayerList[i]->LastInputTime,
686 Active_Input->Current.Actions1, Active_Input->Current.Actions2,
687 Active_Input->Start.Actions1,Active_Input->Start.Actions2,
688 Active_Input->Stop.Actions1, Active_Input->Stop.Actions2,
689 Active_Input->Stopped.Actions1, Active_Input->Stopped.Actions2
690 );
691 */
692
693
694#endif
695
696#ifdef BETTER_SYNC
697 if( !server_started && PlayerList[i]->player_data.Health != 0) {
698 PlayerList[i]->Chr->Health = PlayerList[i]->player_data.Health;
699 PlayerList[i]->Chr->MaxHealth = PlayerList[i]->player_data.MaxHealth;
700 PlayerList[i]->Chr->Position = PlayerList[i]->player_data.Position;
701 PlayerList[i]->Chr->Location = PlayerList[i]->player_data.Location;
702 PlayerList[i]->Chr->LastPosition = PlayerList[i]->player_data.LastPosition;
703 PlayerList[i]->Chr->Facing = PlayerList[i]->player_data.Facing;
704 PlayerList[i]->Chr->DesiredFacing = PlayerList[i]->player_data.DesiredFacing;
705 PlayerList[i]->Chr->CosmeticFacing = PlayerList[i]->player_data.CosmeticFacing;
706 PlayerList[i]->Actions1 = PlayerList[i]->player_data.Inputs.Actions1;
707 PlayerList[i]->Actions2 = PlayerList[i]->player_data.Inputs.Actions2;
708 PlayerList[i]->MouseDeltaX = PlayerList[i]->player_data.Inputs.MouseDeltaX;
709 PlayerList[i]->MouseDeltaY = PlayerList[i]->player_data.Inputs.MouseDeltaY;
710 Active_Player->PhyContext->Position = PlayerList[i]->player_data.Position;
711 }
712#endif
713
714 }
715 }
716
717 return ONgGameState;
718}
Note: See TracBrowser for help on using the repository browser.