Changeset 580


Ignore:
Timestamp:
Jan 14, 2011, 8:39:14 AM (11 years ago)
Author:
gumby
Message:
 
Location:
Daodan/MSVC
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • Daodan/MSVC/Flatline.c

    r579 r580  
    99player_info Players[MAX_PLAYERS] = {{0}, {0}, {0}, {0}};
    1010player_info * PlayerList[MAX_CONNECTIONS] = {0};
     11
     12unsigned int lastPingTime;
     13
    1114const char * Rejection_Messages[][255] = {
    1215        {"Server is full"},
     
    2427
    2528        if (Player > max_connections || !PlayerList[ Player ] ) return;
    26        
    27                        
    28 //      DDrConsole_PrintF( "Sending sync data for player %i, new index %u", Player, PlayerList[ Player ]->rare_sync_index);
     29
     30
     31        //      DDrConsole_PrintF( "Sending sync data for player %i, new index %u", Player, PlayerList[ Player ]->rare_sync_index);
    2932        sender->sin_addr.S_un.S_addr = htonl(sender->sin_addr.S_un.S_addr);
    3033        sync.id = RARE_SYNC_DATA;
     
    5154        sender.sin_port = htons(27777);
    5255        sender.sin_addr = *((struct in_addr*)(int*)&from);
    53        
     56
    5457
    5558        //packet->data[datalen] = '\0';
    56        
     59
    5760        //DDrConsole_PrintF("Packet \r%d recieved from %i",  ++recieved, from);
    5861
    59        
    60        
     62
     63
    6164        //if data[0] != CONNECT_SEND, search in playerlist for ip address
    62        
    63 
    64 
    65        
     65
     66
     67
     68
    6669        switch(packet->id) {
    6770                flatline_packet connect_recv;
     
    7073                //rewrite this before we get TCP support*
    7174                //the way of seeing if there is room for players sucks.
    72                 case CONNECT_SEND:
    73                         ;
    74                        
    75                         connect_recv.id = CONNECT_REPLY;
    76                
    77                         //if(Players[i].ip == sender.sin_addr.S_un.S_addr) break; //needs to send an error message
     75        case CONNECT_SEND:
     76                ;
     77
     78                connect_recv.id = CONNECT_REPLY;
     79
     80                //if(Players[i].ip == sender.sin_addr.S_un.S_addr) break; //needs to send an error message
     81                sender.sin_addr.S_un.S_addr = htonl(sender.sin_addr.S_un.S_addr);
     82                playah = FLrServer_AddPlayer(from,packet->connect_send.name, 0, 0);
     83                DDrConsole_PrintF("%s connected from %s", packet->connect_send.name, inet_ntoa(sender.sin_addr ) );
     84                if(!((int)playah > -5 && (int)playah <= 0)) {
     85                        flatline_packet new_char = {0};
     86                        CharacterObject* Char;
     87                        connect_recv.connect_reply.goodtogo = 1;
     88                        connect_recv.connect_reply.player_slot = playah->list_slot;
     89                        DDrConsole_PrintF("Slot: %i", playah->list_slot);
     90
     91                        //sending this several times to make sure it gets through. Really need to make up some form of packet tracking.
     92                        NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(connect_reply) + FLATLINE_HEADER);
     93                        NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(connect_reply) + FLATLINE_HEADER);
     94                        NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(connect_reply) + FLATLINE_HEADER);
     95                        NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(connect_reply) + FLATLINE_HEADER);
     96                        NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(connect_reply) + FLATLINE_HEADER);
     97                        Sleep(100);
     98
     99                        new_char.id = NEW_PLAYER;
     100                        Char = &new_char.new_player.Character;
     101                        memset(Char, 0, sizeof(CharacterObject));
     102                        Char->Header.Type = 'CHAR';
     103                        Char->OSD.Options = chr_dontaim;
     104                        for(j = 0; j < max_connections; j++) {
     105                                if(PlayerList[j] != 0) {
     106                                        new_char.new_player.Playernumber = j;
     107                                        sprintf(Char->OSD.Name,"%s",PlayerList[j]->name);
     108
     109                                        sprintf(Char->OSD.Class, "%s", TMrInstance_GetInstanceName(PlayerList[j]->Chr->ONCC));
     110                                        DDrConsole_PrintF("Class %s", Char->OSD.Class );
     111
     112                                        sprintf(Char->OSD.Class, "konoko_generic");
     113                                        NetTCPServer_Send((sockaddr *) &sender, (char*)&new_char, sizeof(new_player) + FLATLINE_HEADER );
     114                                }
     115
     116                        }
     117                }
     118                else {
     119                        //fix the error messages...
     120                        DDrConsole_PrintF("Server is full. :(");
     121                        connect_recv.connect_reply.goodtogo = 0;
    78122                        sender.sin_addr.S_un.S_addr = htonl(sender.sin_addr.S_un.S_addr);
    79                         playah = FLrServer_AddPlayer(from,packet->connect_send.name, 0, 0);
    80                         DDrConsole_PrintF("%s connected from %s", packet->connect_send.name, inet_ntoa(sender.sin_addr ) );
    81                         if(!((int)playah > -5 && (int)playah <= 0)) {
    82                                 flatline_packet new_char = {0};
    83                                 CharacterObject* Char;
    84                                 connect_recv.connect_reply.goodtogo = 1;
    85                                 connect_recv.connect_reply.player_slot = playah->list_slot;
    86                                 DDrConsole_PrintF("Slot: %i", playah->list_slot);
    87 
    88                                 //sending this several times to make sure it gets through. Really need to make up some form of packet tracking.
    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                                 NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(connect_reply) + FLATLINE_HEADER);
    93                                 NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(connect_reply) + FLATLINE_HEADER);
    94                                 Sleep(100);
    95 
    96                                 new_char.id = NEW_PLAYER;
    97                                 Char = &new_char.new_player.Character;
    98                                 memset(Char, 0, sizeof(CharacterObject));
    99                                 Char->Header.Type = 'CHAR';
    100                                 Char->OSD.Options = chr_dontaim;
    101                                 for(j = 0; j < max_connections; j++) {
    102                                         if(PlayerList[j] != 0) {
    103                                                 new_char.new_player.Playernumber = j;
    104                                                 sprintf(Char->OSD.Name,"%s",PlayerList[j]->name);
    105 
    106                                                 sprintf(Char->OSD.Class, "%s", TMrInstance_GetInstanceName(PlayerList[j]->Chr->ONCC));
    107                                                 DDrConsole_PrintF("Class %s", Char->OSD.Class );
    108 
    109                                                 sprintf(Char->OSD.Class, "konoko_generic");
    110                                                 NetTCPServer_Send((sockaddr *) &sender, (char*)&new_char, sizeof(new_player) + FLATLINE_HEADER );
    111                                         }
    112 
    113                                 }
    114                         }
    115                         else {
    116                                 //fix the error messages...
    117                                 DDrConsole_PrintF("Server is full. :(");
    118                                 connect_recv.connect_reply.goodtogo = 0;
    119                                 sender.sin_addr.S_un.S_addr = htonl(sender.sin_addr.S_un.S_addr);
    120                                 memcpy(&connect_recv.connect_reply.message,"Server is full.", sizeof("Server is full."));
    121                                 NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(bool)*2 + FLATLINE_HEADER + sizeof("Server is full."));   
    122 
    123                         }
    124 
    125 
     123                        memcpy(&connect_recv.connect_reply.message,"Server is full.", sizeof("Server is full."));
     124                        NetTCPServer_Send((sockaddr *) &sender, (char*)&connect_recv, sizeof(bool)*2 + FLATLINE_HEADER + sizeof("Server is full."));   
     125
     126                }
     127
     128
     129                break;
     130        case CONNECT_REPLY:
     131                break;  //do nothing...a server shouldn't recieve this type of packet.
     132        case MESSAGE:
     133                for(i = 0; i < MAX_PLAYERS; i++) {
     134                        //DDrConsole_PrintF("%i : %i | %s : %s", from, Players[i].ip, inet_ntoa(*(struct in_addr*)&from), inet_ntoa(*(struct in_addr*)&(Players[i].ip)));
     135                        if(Players[i].ip == sender.sin_addr.S_un.S_addr) {
     136                                found_player = 1;
     137                                break;
     138                        }       
     139                }
     140                if(found_player == 0) return true;
     141                else {
     142                        char message_buffer[512] = {0};
     143                        flatline_packet message;
     144                        int message_size;
     145                        data[datalen] = 0;
     146
     147                        DDrConsole_PrintF("%s: %s", Players[i].name, packet->data);
     148                        sprintf(message_buffer, "%s: %s", Players[i].name, packet->data);
     149
     150                        message.id = MESSAGE;
     151                        message_size = sprintf(message.data, "%s", message_buffer);
     152                        COrMessage_Print(message_buffer, "chat", 0);
     153                        UDPServer_SendToAll(&message, message_size + 1 + FLATLINE_HEADER);
    126154                        break;
    127                 case CONNECT_REPLY:
    128                         break;  //do nothing...a server shouldn't recieve this type of packet.
    129                 case MESSAGE:
    130                         for(i = 0; i < MAX_PLAYERS; i++) {
    131                                 //DDrConsole_PrintF("%i : %i | %s : %s", from, Players[i].ip, inet_ntoa(*(struct in_addr*)&from), inet_ntoa(*(struct in_addr*)&(Players[i].ip)));
    132                                 if(Players[i].ip == sender.sin_addr.S_un.S_addr) {
    133                                         found_player = 1;
     155                }
     156        case CHANGE_NAME:
     157                ; //wtf, needed or i get an error.
     158                DDrConsole_PrintF("Changing Name to: %s", packet->data);
     159                for(i = 0; i < MAX_PLAYERS; i++) {
     160                        if(Players[i].ip == sender.sin_addr.S_un.S_addr) {
     161                                found_player = 1;
     162                                break;
     163                        }       
     164                }
     165                if(found_player == 0) return true;
     166                else {
     167                        bool name_exists = 0;
     168                        for(j = 0; j < MAX_PLAYERS; j++) {
     169                                if(!strcmp(packet->data, Players[j].name)) {
     170                                        name_exists = 1;
    134171                                        break;
    135                                 }       
    136                         }
    137                         if(found_player == 0) return true;
    138                         else {
    139                                 char message_buffer[512] = {0};
    140                                 flatline_packet message;
    141                                 int message_size;
    142                                 data[datalen] = 0;
    143 
    144                                 DDrConsole_PrintF("%s: %s", Players[i].name, packet->data);
    145                                 sprintf(message_buffer, "%s: %s", Players[i].name, packet->data);
    146                                
    147                                 message.id = MESSAGE;
    148                                 message_size = sprintf(message.data, "%s", message_buffer);
    149                                 COrMessage_Print(message_buffer, "chat", 0);
    150                                 UDPServer_SendToAll(&message, message_size + 1 + FLATLINE_HEADER);
     172                                }
     173                        }
     174                        if(!name_exists) {
     175                                char message_buffer[1024];
     176                                sprintf(message_buffer,"%s changed their name to %s", Players[i].name, packet->data);
     177                                COrMessage_Print(message_buffer, "name_change", 0);
     178                                memcpy(Players[i].name, packet->data, 256);
     179
     180                        }
     181                        break;
     182                }
     183        case PLAYER_INPUT:
     184
     185                for(i = 0; i < max_connections; i++) {
     186                        if(PlayerList[i] != 0 && PlayerList[i]->ip == sender.sin_addr.S_un.S_addr) {
     187                                found_player = 1;
    151188                                break;
    152                         }
    153                 case CHANGE_NAME:
    154                         ; //wtf, needed or i get an error.
    155                         DDrConsole_PrintF("Changing Name to: %s", packet->data);
    156                         for(i = 0; i < MAX_PLAYERS; i++) {
    157                                 if(Players[i].ip == sender.sin_addr.S_un.S_addr) {
    158                                         found_player = 1;
    159                                         break;
    160                                 }       
    161                         }
    162                         if(found_player == 0) return true;
    163                         else {
    164                                 bool name_exists = 0;
    165                                 for(j = 0; j < MAX_PLAYERS; j++) {
    166                                         if(!strcmp(packet->data, Players[j].name)) {
    167                                                 name_exists = 1;
    168                                                 break;
    169                                         }
    170                                 }
    171                                 if(!name_exists) {
    172                                         char message_buffer[1024];
    173                                         sprintf(message_buffer,"%s changed their name to %s", Players[i].name, packet->data);
    174                                         COrMessage_Print(message_buffer, "name_change", 0);
    175                                         memcpy(Players[i].name, packet->data, 256);
    176 
    177                                 }
     189                        }       
     190                }
     191
     192                if(found_player == 0) return true;
     193                else {
     194                        input_struct * packet_input = &packet->input_struct;
     195
     196
     197                        PlayerList[i]->Actions1 = packet_input->Actions1;
     198                        PlayerList[i]->Actions2 = packet_input->Actions2;
     199                        PlayerList[i]->MouseDeltaX = packet_input->MouseDeltaX;
     200                        PlayerList[i]->MouseDeltaY = packet_input->MouseDeltaY;
     201                        PlayerList[i]->LastInputTime = packet_input->Time;
     202
     203                        break;
     204                }
     205        case RARE_SYNC_DATA_REQUEST:
     206                DoRareSync( packet->sync_request , &sender);
     207                break;
     208        case PK_PONG:
     209                                for(i = 0; i < max_connections; i++) {
     210                        if(PlayerList[i] != 0 && PlayerList[i]->ip == sender.sin_addr.S_un.S_addr) {
     211                                found_player = 1;
    178212                                break;
    179                         }
    180                 case PLAYER_INPUT:
    181                        
    182                         for(i = 0; i < max_connections; i++) {
    183                                 if(PlayerList[i] != 0 && PlayerList[i]->ip == sender.sin_addr.S_un.S_addr) {
    184                                         found_player = 1;
    185                                         break;
    186                                 }       
    187                         }
    188                        
    189                         if(found_player == 0) return true;
    190                         else {
    191                                 input_struct * packet_input = &packet->input_struct;
    192 
    193 
    194                                 PlayerList[i]->Actions1 = packet_input->Actions1;
    195                                 PlayerList[i]->Actions2 = packet_input->Actions2;
    196                                 PlayerList[i]->MouseDeltaX = packet_input->MouseDeltaX;
    197                                 PlayerList[i]->MouseDeltaY = packet_input->MouseDeltaY;
    198                                 PlayerList[i]->LastInputTime = packet_input->Time;
    199 
    200                                 break;
    201                         }
    202                 case RARE_SYNC_DATA_REQUEST:
    203                         DoRareSync( packet->sync_request , &sender);
    204                         break;
    205                 default:
    206                         DDrConsole_PrintF("Warning, recieved badly formed packet!");
    207                         break;
     213                        }       
     214                }
     215
     216                if(found_player == 0) return true;
     217                if(packet->ping != lastPingTime)
     218                {
     219                        PlayerList[i]->Ping = 999;
     220                }
     221                else
     222                {
     223                        PlayerList[i]->Ping = (ONgGameState->GameTime - packet->ping) * 1000 / 60;
     224                }
     225                break;
     226        default:
     227                DDrConsole_PrintF("Warning, recieved badly formed packet!");
     228                break;
    208229        }
    209230        return true;
     
    214235        // Get the local hostname
    215236        char szHostName[255];
    216                 struct hostent *host_entry;
     237        struct hostent *host_entry;
    217238        gethostname(szHostName, 255);
    218239
     
    228249
    229250void ONrCharacter_SetAnimationInternal(Character* Char, ActiveCharacter* AChar,
    230                                                                            short inFromState, short inNextAnimType, const void *TRAM)
     251        short inFromState, short inNextAnimType, const void *TRAM)
    231252{
    232253        ONCC            *ONCC   = Char->ONCC;
     
    236257
    237258        if (TRAM == 0) return;
    238        
     259
    239260        animType = TRrAnimation_GetType(TRAM);
    240        
     261
    241262        AChar->Animation = TRAM;
    242263        AChar->Frame = 0;
    243264        AChar->AnimationFromState = inFromState;
    244265        AChar->AnimationType = animType;
    245        
     266
    246267        AChar->NextAnimationType= inNextAnimType;
    247268        AChar->AnimationToState = TRrAnimation_GetTo(TRAM);
     
    251272
    252273
    253         RGBA green = {0, 0xFF, 0, 0};
    254         RGBA red = {0, 0, 0xFF, 0};
    255         RGBA grey = {0x80,0x80,0x80,0x80};
    256        
     274RGBA green = {0, 0xFF, 0, 0};
     275RGBA red = {0, 0, 0xFF, 0};
     276RGBA grey = {0x80,0x80,0x80,0x80};
     277
    257278//FLrClient_Run
    258279//Looping function that waits for packets from the server.
     
    267288        int sent_bytes;
    268289        client_connected = 0;
    269        
     290
    270291
    271292        //starts the connection
     
    289310
    290311                                        DDrConsole_PrintColored("Connection successful!",0,green, grey);
    291                                        
     312
    292313                                        //disable local input.
    293314                                        DDrPatch_NOOP(0x004FA929, 5 + 6 + 5);
    294                                        
     315
    295316                                        //DDrConsole_PrintF("Slot %i",  ((connect_reply*)packet)->player_slot);
    296317                                        break;
     
    316337                ActiveCharacter * Active;
    317338                flatline_packet packet;
    318 //#define SPAM_INPUT
     339                //#define SPAM_INPUT
    319340#ifdef SPAM_INPUT
    320341                struct timeval lasttime;
     
    325346#ifdef SPAM_INPUT
    326347                        gettimeofday(&thistime, 0);
    327                        
     348
    328349                        //DDrConsole_PrintF("%i.%i | %i.%i | %i.%i",lasttime.tv_sec, lasttime.tv_usec, thistime.tv_sec, thistime.tv_usec,
    329350                        //      thistime.tv_sec - lasttime.tv_sec, thistime.tv_usec - lasttime.tv_usec);
     
    332353                                ((thistime.tv_sec > lasttime.tv_sec) && ((thistime.tv_usec + 1000000 - lasttime.tv_usec ) > update_rate * 1000) )
    333354                                || ((thistime.tv_sec == lasttime.tv_sec) && ((thistime.tv_usec - lasttime.tv_usec ) > update_rate * 1000))
    334                         ) {
    335                                
    336                                 flatline_packet input_packet;
    337                                 lasttime.tv_usec = ++thistime.tv_usec; //in case recieving packets takes less than 1 ms.
    338 
    339                                 input_packet.id = PLAYER_INPUT;
    340                                
    341                                 if( ((GameState*)(ONgGameState))->Input.Current.Actions1 != last1 || ((GameState*)(ONgGameState))->Input.Current.Actions2 != last2) {
    342                                         last1 =((GameState*)(ONgGameState))->Input.Current.Actions1;
    343                                         last2 =((GameState*)(ONgGameState))->Input.Current.Actions2;
    344                                 }
    345 
    346                                 ((input_struct*)(void*)(input_packet.data))->Actions1 = ((GameState*)(ONgGameState))->Input.Current.Actions1;
    347                                 ((input_struct*)(void*)(input_packet.data))->Actions2 = ((GameState*)(ONgGameState))->Input.Current.Actions2;
    348                                 ((input_struct*)(void*)(input_packet.data))->MouseDeltaX = ((GameState*)(ONgGameState))->Input.MouseDeltaX;
    349                                 ((input_struct*)(void*)(input_packet.data))->MouseDeltaY = ((GameState*)(ONgGameState))->Input.MouseDeltaY;
    350                                 sent_bytes = NetUDPSocket_Send(client_sock,(sockaddr *) &address, (char*)&input_packet, sizeof(input_struct) + FLATLINE_HEADER);                       
    351                                 //if(sent_bytes == SOCKET_ERROR)        NetCatchError();
     355                                ) {
     356
     357                                        flatline_packet input_packet;
     358                                        lasttime.tv_usec = ++thistime.tv_usec; //in case recieving packets takes less than 1 ms.
     359
     360                                        input_packet.id = PLAYER_INPUT;
     361
     362                                        if( ((GameState*)(ONgGameState))->Input.Current.Actions1 != last1 || ((GameState*)(ONgGameState))->Input.Current.Actions2 != last2) {
     363                                                last1 =((GameState*)(ONgGameState))->Input.Current.Actions1;
     364                                                last2 =((GameState*)(ONgGameState))->Input.Current.Actions2;
     365                                        }
     366
     367                                        ((input_struct*)(void*)(input_packet.data))->Actions1 = ((GameState*)(ONgGameState))->Input.Current.Actions1;
     368                                        ((input_struct*)(void*)(input_packet.data))->Actions2 = ((GameState*)(ONgGameState))->Input.Current.Actions2;
     369                                        ((input_struct*)(void*)(input_packet.data))->MouseDeltaX = ((GameState*)(ONgGameState))->Input.MouseDeltaX;
     370                                        ((input_struct*)(void*)(input_packet.data))->MouseDeltaY = ((GameState*)(ONgGameState))->Input.MouseDeltaY;
     371                                        sent_bytes = NetUDPSocket_Send(client_sock,(sockaddr *) &address, (char*)&input_packet, sizeof(input_struct) + FLATLINE_HEADER);                       
     372                                        //if(sent_bytes == SOCKET_ERROR)        NetCatchError();
    352373                        }
    353374#endif
     
    356377                                //DDrConsole_PrintF("Data recieved, length %i, type %i", len, ((flatline_packet*)data)->id);
    357378                                switch(packet.id) {
    358                 case MESSAGE:
    359                         COrMessage_Print(packet.data, "chat", 0);
    360                         break;
    361                 case CONNECT_SEND:
    362                         ;if(1) {
    363                                 flatline_packet connect_recv;
    364                                 memcpy(&connect_recv.connect_reply.message,"This isn't a server!", sizeof("This isn't a server!"));
    365                                 NetUDPSocket_Send(client_sock, (sockaddr *) &address, (char*)&connect_recv, sizeof(bool) + FLATLINE_HEADER + sizeof("This isn't a server!"));                   
    366                         }
    367                 case CONNECT_REPLY:
    368                         break; //extra packet or something.
    369                 case NEW_PLAYER:
    370                         ;if(1) { //haxhaxhax
    371                         CharacterObject* Char = &(packet.new_player.Character);
    372                         uint32_t chr_index = 0;
    373                         Character* PC;
    374                         DDrConsole_PrintF("%i |  %i", packet.new_player.Playernumber ,client_slot);
    375                         //Char->OSD.Options = 0;
    376                         if(packet.new_player.Playernumber == client_slot) {
    377                                 PlayerList[packet.new_player.Playernumber] = &Players[0];
    378                                 PC = (ONgGameState->PlayerCharacter);
    379                                 Players[0].Chr = PC;
    380 
    381                         }
    382                         else {
    383                                 ONrGameState_NewCharacter(Char, NULL, NULL, &chr_index);
    384                                 ONgGameState->CharacterStorage[chr_index].charType = 0;
    385                                 PlayerList[packet.new_player.Playernumber] = &Players[chr_index];
    386                                 Players[chr_index].Chr = &(ONgGameState->CharacterStorage[chr_index]);
    387                                 Players[chr_index].Chr->Flags &= 0xFFBFFFFF;
    388                                 Players[chr_index].spawnnumber = chr_index;
    389                                 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) ;
    390                         }
    391                         //Players[((new_player*)(packet.data))->Playernumber].spawnnumber = ONrGameState_NewCharacter(&(((new_player*)(packet.data))->Character), NULL, NULL, 0);
    392                         break;
    393                                 }
    394                 case PLAYER_DATA:
    395                         if(1) { //haxhaxhax
    396                         player_data* pd = &packet.player_data;
    397                         uint16_t i = pd->PlayerNum;
    398                         GameInput * Active_Input;
    399                         pd = (void*)packet.data;
    400                        
    401                         //DDrConsole_PrintF("Got data for Player %i, %x", i, PlayerList[i]);
    402                         if (i > max_connections) break;
    403                         if( !PlayerList[i] ) break;
    404                         //PlayerList[i]->Chr = ((GameState *)ONgGameState)->CharacterStorage;
    405 
    406                         PlayerList[i]->Actions1 = pd->Inputs.Actions1;
    407                         PlayerList[i]->Actions2 = pd->Inputs.Actions2;
    408                         PlayerList[i]->MouseDeltaX = pd->Inputs.MouseDeltaX;
    409                         PlayerList[i]->MouseDeltaY = pd->Inputs.MouseDeltaY;
    410                         memcpy( &(PlayerList[i]->player_data), pd, sizeof(player_data) );
    411 
    412                         if( !server_started && pd->rare_sync_index > PlayerList[i]->rare_sync_index )
    413                         {
    414                                         int sent_bytes;
    415                                         flatline_packet sync_request = {0};
    416                                         sync_request.id = RARE_SYNC_DATA_REQUEST;
    417                                         sync_request.sync_request = i;
    418                                         DDrConsole_PrintF( "Requesting sync data for player %i, old index %u", i, PlayerList[i]->rare_sync_index);
    419                                         sent_bytes = NetUDPSocket_Send(client_sock,(sockaddr *) &address, (char*)&sync_request, FLATLINE_HEADER + sizeof(int) );
    420                         }
    421 
    422 
    423 
    424        
    425                         break;
    426                         }
    427                 case RARE_SYNC_DATA:
    428                         if(1) {
    429                         sl_arg hax[2];
    430                         int dontuse;
    431                         uint16_t i = packet.rare_sync_data.PlayerNum;
    432                                                
    433                         if (i > max_connections) break;
    434                         if( !PlayerList[i] ) break;
    435 
    436                         //WEAPONS ARE DISABLED. Why? Pain in the arse to sync.
    437                         packet.rare_sync_data.Inventory.Weapons[0] = NULL;
    438                         packet.rare_sync_data.Inventory.Weapons[1] = NULL;
    439                         packet.rare_sync_data.Inventory.Weapons[2] = NULL;
    440 //                      TMrInstance_GetDataPtr( 'ONCC', packet.rare_sync_data.Class, PlayerList[ i ]->Chr->ONCC );
    441                        
    442                         //add the target character
    443                         hax[0].type = sl_int32;
    444                         hax[0].value_int32 = PlayerList[ packet.rare_sync_data.PlayerNum ]->spawnnumber;
    445 
    446                         //add the new class
    447                         //fix this later so we cant buffer overflow :O
    448                         hax[1].type = sl_str32;
    449                         hax[1].value_str32 = packet.rare_sync_data.Class;
    450                        
    451                         //we are directly calling a bsl function instead of using the normal method for two reasons
    452                         //1. it has all the checking built in
    453                         iSetCharacterClass( 0, 2, hax, &dontuse, &dontuse, hax );
    454                         //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);
    455                         memcpy( &(PlayerList[ i ]->Chr->Inventory), &(packet.rare_sync_data.Inventory), sizeof(Inventory ));
    456 
    457                         PlayerList[i]->rare_sync_index = packet.rare_sync_data.index;
    458                         }
    459                         break;
    460                 case FLATLINE_EVENT:
    461                         FLcEventHandler( packet.flatline_event.event_index, packet.flatline_event.intArray );
    462                         break;
    463                 default:
    464                         DDrConsole_PrintF("Warning, recieved badly formed packet!");
    465                         break;
     379                                case MESSAGE:
     380                                        COrMessage_Print(packet.data, "chat", 0);
     381                                        break;
     382                                case CONNECT_SEND:
     383                                        ;if(1) {
     384                                                flatline_packet connect_recv;
     385                                                memcpy(&connect_recv.connect_reply.message,"This isn't a server!", sizeof("This isn't a server!"));
     386                                                NetUDPSocket_Send(client_sock, (sockaddr *) &address, (char*)&connect_recv, sizeof(bool) + FLATLINE_HEADER + sizeof("This isn't a server!"));                   
     387                                        }
     388                                case CONNECT_REPLY:
     389                                        break; //extra packet or something.
     390                                case NEW_PLAYER:
     391                                        ;if(1) { //haxhaxhax
     392                                                CharacterObject* Char = &(packet.new_player.Character);
     393                                                uint32_t chr_index = 0;
     394                                                Character* PC;
     395                                                DDrConsole_PrintF("%i |  %i", packet.new_player.Playernumber ,client_slot);
     396                                                //Char->OSD.Options = 0;
     397                                                if(packet.new_player.Playernumber == client_slot) {
     398                                                        PlayerList[packet.new_player.Playernumber] = &Players[0];
     399                                                        PC = (ONgGameState->PlayerCharacter);
     400                                                        Players[0].Chr = PC;
     401
     402                                                }
     403                                                else {
     404                                                        ONrGameState_NewCharacter(Char, NULL, NULL, &chr_index);
     405                                                        ONgGameState->CharacterStorage[chr_index].charType = 0;
     406                                                        PlayerList[packet.new_player.Playernumber] = &Players[chr_index];
     407                                                        Players[chr_index].Chr = &(ONgGameState->CharacterStorage[chr_index]);
     408                                                        Players[chr_index].Chr->Flags &= 0xFFBFFFFF;
     409                                                        Players[chr_index].spawnnumber = chr_index;
     410                                                        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) ;
     411                                                }
     412                                                //Players[((new_player*)(packet.data))->Playernumber].spawnnumber = ONrGameState_NewCharacter(&(((new_player*)(packet.data))->Character), NULL, NULL, 0);
     413                                                break;
     414                                        }
     415                                case PLAYER_DATA:
     416                                        if(1) { //haxhaxhax
     417                                                player_data* pd = &packet.player_data;
     418                                                uint16_t i = pd->PlayerNum;
     419                                                GameInput * Active_Input;
     420                                                pd = (void*)packet.data;
     421
     422                                                //DDrConsole_PrintF("Got data for Player %i, %x", i, PlayerList[i]);
     423                                                if (i > max_connections) break;
     424                                                if( !PlayerList[i] ) break;
     425                                                //PlayerList[i]->Chr = ((GameState *)ONgGameState)->CharacterStorage;
     426
     427                                                PlayerList[i]->Actions1 = pd->Inputs.Actions1;
     428                                                PlayerList[i]->Actions2 = pd->Inputs.Actions2;
     429                                                PlayerList[i]->MouseDeltaX = pd->Inputs.MouseDeltaX;
     430                                                PlayerList[i]->MouseDeltaY = pd->Inputs.MouseDeltaY;
     431                                                memcpy( &(PlayerList[i]->player_data), pd, sizeof(player_data) );
     432
     433                                                if( !server_started && pd->rare_sync_index > PlayerList[i]->rare_sync_index )
     434                                                {
     435                                                        int sent_bytes;
     436                                                        flatline_packet sync_request = {0};
     437                                                        sync_request.id = RARE_SYNC_DATA_REQUEST;
     438                                                        sync_request.sync_request = i;
     439                                                        DDrConsole_PrintF( "Requesting sync data for player %i, old index %u", i, PlayerList[i]->rare_sync_index);
     440                                                        sent_bytes = NetUDPSocket_Send(client_sock,(sockaddr *) &address, (char*)&sync_request, FLATLINE_HEADER + sizeof(int) );
     441                                                }
     442
     443                                                PlayerList[i]->DataApplied = 0;
     444
     445
     446                                                break;
     447                                        }
     448                                case RARE_SYNC_DATA:
     449                                        if(1) {
     450                                                sl_arg hax[2];
     451                                                int dontuse;
     452                                                uint16_t i = packet.rare_sync_data.PlayerNum;
     453
     454                                                if (i > max_connections) break;
     455                                                if( !PlayerList[i] ) break;
     456
     457                                                //WEAPONS ARE DISABLED. Why? Pain in the arse to sync.
     458                                                packet.rare_sync_data.Inventory.Weapons[0] = NULL;
     459                                                packet.rare_sync_data.Inventory.Weapons[1] = NULL;
     460                                                packet.rare_sync_data.Inventory.Weapons[2] = NULL;
     461                                                //                      TMrInstance_GetDataPtr( 'ONCC', packet.rare_sync_data.Class, PlayerList[ i ]->Chr->ONCC );
     462
     463                                                //add the target character
     464                                                hax[0].type = sl_int32;
     465                                                hax[0].value_int32 = PlayerList[ packet.rare_sync_data.PlayerNum ]->spawnnumber;
     466
     467                                                //add the new class
     468                                                //fix this later so we cant buffer overflow :O
     469                                                hax[1].type = sl_str32;
     470                                                hax[1].value_str32 = packet.rare_sync_data.Class;
     471
     472                                                //we are directly calling a bsl function instead of using the normal method for two reasons
     473                                                //1. it has all the checking built in
     474                                                iSetCharacterClass( 0, 2, hax, &dontuse, &dontuse, hax );
     475                                                //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);
     476                                                memcpy( &(PlayerList[ i ]->Chr->Inventory), &(packet.rare_sync_data.Inventory), sizeof(Inventory ));
     477
     478                                                PlayerList[i]->rare_sync_index = packet.rare_sync_data.index;
     479                                        }
     480                                        break;
     481                                case FLATLINE_EVENT:
     482                                        FLcEventHandler( packet.flatline_event.event_index, packet.flatline_event.intArray );
     483                                        break;
     484                                case PK_PING:
     485                                        packet.id = PK_PONG;
     486
     487                                        NetUDPSocket_Send(client_sock, (sockaddr *) &address, (char*)&packet, FLATLINE_HEADER + 4);             
     488                                        break;
     489                                default:
     490                                        DDrConsole_PrintF("Warning, recieved badly formed packet!");
     491                                        break;
    466492                                }
    467493                        }
     
    495521        return -1;
    496522}
    497         typedef struct
    498         {
    499                 uint16_t x;
    500                 uint16_t y;
    501                
    502         } IMtPoint2D;
     523typedef struct
     524{
     525        uint16_t x;
     526        uint16_t y;
     527
     528} IMtPoint2D;
    503529static flatline_packet cache_input = {0};
    504530extern void* TSrTest;
     
    522548                input_packet.input_struct.MouseDeltaX = ((GameState*)(ONgGameState))->Input.MouseDeltaX;
    523549                input_packet.input_struct.MouseDeltaY = ((GameState*)(ONgGameState))->Input.MouseDeltaY;
    524                
     550
    525551                sent_bytes = NetUDPSocket_Send(client_sock,(sockaddr *) &address, (char*)&input_packet, sizeof(input_struct) + FLATLINE_HEADER);
    526                
     552
    527553                //return ONgGameState;
    528554        }
     
    530556
    531557        if(!(server_started || client_connected)) return ONgGameState;
     558
     559        if(server_started && ONgGameState->GameTime % 120 == 0)
     560        {
     561                FLsPingAll();
     562        }
    532563
    533564        for(i = 0; i < max_connections; i++) {
     
    536567                GameInput * Active_Input;
    537568                if(PlayerList[i] == 0) continue;
    538                
    539                
     569
     570
    540571                Player = PlayerList[i]->Chr;
    541572                if( Player->Health == 0)
     
    575606                        }
    576607                        continue;
    577                                
    578                        
     608
     609
    579610                }
    580611
    581612                Active_Player = ONrGetActiveCharacter( PlayerList[i]->Chr);
    582                
     613
    583614                if(Active_Player == 0) continue;
    584615                Active_Input = &(Active_Player->Input);
     
    587618                        flatline_packet data_out = {0};
    588619
    589                        
     620                        if(!strcmp(PlayerList[i]->player_data.Animation, TMrInstance_GetInstanceName(Active_Player->Animation)))
     621                                continue;
    590622
    591623                        data_out.id = PLAYER_DATA;
     
    600632                        memcpy(data->Animation, TMrInstance_GetInstanceName(Active_Player->Animation), 31);
    601633                        data->Frame = Active_Player->Frame;
    602                        
     634
    603635                        if(Active_Player->targetThrow)
    604636                        {
     
    607639                                data->throw_data.throwFrame = ONrGetActiveCharacter(Active_Player->targetThrow)->Frame;
    608640                        }
    609                        
    610                        
     641
     642
    611643                        if( PlayerList[i]->OldClass != PlayerList[i]->Chr->ONCC || memcmp( &(PlayerList[i]->Inventory), &(PlayerList[i]->Chr->Inventory), sizeof(Inventory) ) )
    612644                        {
     
    616648
    617649                        }
    618                        
     650
    619651                        data->rare_sync_index = PlayerList[i]->rare_sync_index;
    620                        
     652
    621653
    622654                        if(i == 0) {
     
    632664                                data->Inputs.MouseDeltaY = PlayerList[i]->MouseDeltaY;
    633665                        }
     666                        data->Ping = PlayerList[i]->Ping;
    634667                        memcpy( &(PlayerList[i]->player_data), data, sizeof(player_data) );
    635                        
     668
    636669                        UDPServer_SendToAll(&data_out, sizeof(player_data) + FLATLINE_HEADER);
    637670                }
    638                
     671
    639672                if( (server_started && i !=0)  || (!server_started/* && i != client_slot*/) )
    640673                {
     
    643676                        Active_Input->Start.Actions1 = ~Active_Input->Current.Actions1 & PlayerList[i]->Actions1;
    644677                        Active_Input->Start.Actions2 = ~Active_Input->Current.Actions2 & PlayerList[i]->Actions2;
    645                        
     678
    646679                        Active_Input->Current.Actions1 = PlayerList[i]->Actions1;
    647680                        Active_Input->Current.Actions2 = PlayerList[i]->Actions2;
     
    656689                                void* Animation;
    657690                                player_data* pd = &PlayerList[i]->player_data;
     691
     692                                if(PlayerList[i]->DataApplied) continue;
     693
    658694                                Player->Health = PlayerList[i]->player_data.Health;
    659695                                PlayerList[i]->Chr->MaxHealth = PlayerList[i]->player_data.MaxHealth;
     
    668704                                Active_Player->PhyContext->Position = PlayerList[i]->player_data.Position;
    669705                                OldAnimation = Active_Player->Animation;
    670                                
     706
    671707                                if (!(Player->Flags & ONcCharacterFlag_BeingThrown) &&
    672708                                        (pd->Animation != 0))
    673709                                {
    674710                                        // get a pointer to the animation
    675                                        
    676                                                 TMrInstance_GetDataPtr(
     711
     712                                        TMrInstance_GetDataPtr(
    677713                                                'TRAM',
    678714                                                pd->Animation,
    679715                                                &Animation);
    680                                                 if (Animation != OldAnimation)
     716                                        if (Animation != OldAnimation)
    681717                                        {
    682718                                                short   num_frames;
     
    684720
    685721                                                // if the character is dead, make sure this animation is appropriate for death
    686                                 /*
     722                                                /*
    687723                                                if (Player->Flags & ONcCharacterFlag_Dead)
    688724                                                {
    689                                                         short   curToState = TRrAnimation_GetTo(Active_Player->Animation);
    690                                                         short   newToState = TRrAnimation_GetTo(animation);
    691 
    692                                                         // if we are currently heading towards fallen and the new animation would not
    693                                                         // then this is a better animation to run when we are dead
    694                                                         if ((ONrAnimState_IsFallen(curToState)) &&
    695                                                                 (!ONrAnimState_IsFallen(newToState)))
    696                                                         {
    697                                                                 updateAnimation = false;
    698                                                         }
     725                                                short   curToState = TRrAnimation_GetTo(Active_Player->Animation);
     726                                                short   newToState = TRrAnimation_GetTo(animation);
     727
     728                                                // if we are currently heading towards fallen and the new animation would not
     729                                                // then this is a better animation to run when we are dead
     730                                                if ((ONrAnimState_IsFallen(curToState)) &&
     731                                                (!ONrAnimState_IsFallen(newToState)))
     732                                                {
     733                                                updateAnimation = false;
     734                                                }
    699735                                                }
    700736                                                */
     
    713749                                                {
    714750                                                        // set the characters animation
    715                                         /*      ONrCharacter_SetAnimationInternal(Player,
    716                                                                 Active_Player,
    717                                                                 Active_Player->AnimationToState,
    718                                                                 0,
    719                                                                 Animation);
    720                                                 ONrCharacter_NewAnimationHook(Player, Active_Player);*/
    721                                                 //Player->Flags |= 0x00000010;
     751                                                        /*      ONrCharacter_SetAnimationInternal(Player,
     752                                                        Active_Player,
     753                                                        Active_Player->AnimationToState,
     754                                                        0,
     755                                                        Animation);
     756                                                        ONrCharacter_NewAnimationHook(Player, Active_Player);*/
     757                                                        //Player->Flags |= 0x00000010;
    722758                                                        ONrCharacter_SetAnimationExternal(Player, TRrAnimation_GetFrom(Animation), Animation, 0);
    723759                                                }
     
    739775                                if (PlayerList[i]->player_data.throw_data.throwName[0] != 0)
    740776                                {
    741                                         pd->throw_data.throwing = PlayerList[pd->throw_data.throwing]->spawnnumber;
    742                                         if ((pd->throw_data.throwing != Active_Player->throwing) &&
     777                                        short throwTarget = PlayerList[pd->throw_data.throwing]->spawnnumber;
     778                                        if ((throwTarget != Active_Player->throwing) &&
    743779                                                (pd->throw_data.throwFrame < 10))
    744780                                        {
     
    754790
    755791                                                // set the throw target
    756                                                 Active_Player->ThrowTargetCharacter = &ONgGameState->CharacterStorage[pd->throw_data.throwing];
     792                                                Active_Player->ThrowTargetCharacter = &ONgGameState->CharacterStorage[throwTarget];
    757793                                                Target = ONrGetActiveCharacter(Active_Player->ThrowTargetCharacter);
    758794                                                if ((Target->Animation != throw_animation) &&
     
    762798                                                        // set the throw variables
    763799                                                        Active_Player->targetThrow      = throw_animation;
    764                                                         Active_Player->throwing         = pd->throw_data.throwing;
     800                                                        Active_Player->throwing         = throwTarget;
    765801
    766802                                                        // run the throw
    767803                                                        ONrCharacter_NewAnimationHook(Player, Active_Player);
    768                                                        
     804
    769805                                                        if (Active_Player->ThrowTargetCharacter)
    770806                                                        {
     
    775811                                        }
    776812                                }
     813                                PlayerList[i]->DataApplied = 1;
    777814
    778815                        }
     
    791828        //Kill off the character in another function, please
    792829        //ONrCharacter_SetHitPoints(  PlayerList[Player]->Chr, 0);
    793        
     830
    794831        memset(PlayerList[Player], 0, sizeof(player_info));
    795832        PlayerList[Player] = 0;
    796        
     833
    797834
    798835
     
    832869                        DrawLocation.x += 150;
    833870                        TSrContext_DrawText(ScoreboardInstance, "Score", 255, 0, &DrawLocation);
     871                        DrawLocation.x += 50;
     872                        TSrContext_DrawText(ScoreboardInstance, "Ping", 255, 0, &DrawLocation);
    834873                        for(i = 0; i <MAX_PLAYERS; i++)
    835874                        {
    836                                 if(PlayerList[i] == 0) continue;
     875                                if(PlayerList[i] == 0 || PlayerList[i]->Chr == 0) continue;
    837876
    838877                                DrawLocation.x = 20;
    839878                                DrawLocation.y += LineHeight;
    840                                
    841                                 if(PlayerList[i]->Chr->Health == 0)
     879
     880                                if(PlayerList[i]->Chr && PlayerList[i]->Chr->Health == 0)
    842881                                {
    843882                                        TSrContext_SetShade(ScoreboardInstance, red);
     
    852891                                sprintf(DrawString, "%i", PlayerList[i]->Chr->Damage);
    853892                                TSrContext_DrawText(ScoreboardInstance, DrawString, 255, 0, &DrawLocation);
    854 
    855                         }
    856                 }
    857         }
    858 }
     893                                DrawLocation.x += 50;
     894                                sprintf(DrawString, "%i", PlayerList[i]->player_data.Ping);
     895                                TSrContext_DrawText(ScoreboardInstance, DrawString, 255, 0, &DrawLocation);
     896                        }
     897                }
     898        }
     899}
  • Daodan/MSVC/Flatline.h

    r579 r580  
    129129        int Damage;
    130130        int Deaths;
    131 
     131        uint16_t Ping;
    132132} player_data;
    133133
     
    162162                uint16_t                sync_request;
    163163                flatline_event  flatline_event;
     164                uint32_t                ping;
    164165        };
    165166} flatline_packet;
     
    187188        RARE_SYNC_DATA_REQUEST,
    188189        FLATLINE_EVENT,
     190        PK_PING,
     191        PK_PONG,
    189192};
    190193
     
    228231        int flags;
    229232        int DeathTime;
     233        uint32_t Ping;
     234        bool DataApplied;
    230235} player_info;
    231236
     
    235240
    236241void NetCatchError();
    237 #define MAX_PLAYERS 128
     242#define MAX_PLAYERS 32
    238243#define CONNECTION_TIMEOUT 15
    239244#define MAX_CONNECTIONS 32
     
    246251extern player_info Players[];
    247252extern player_info * PlayerList[];
     253
    248254int UDPServer_SendToAll(void* packet, int size);
     255
    249256extern bool client_connected;
    250257extern bool server_started;
    251258extern char player_name[];
     259
    252260void FLrRun_Scores();
    253261void FLrPlayerDisconnect( int Player );
    254262void FLrPlayerRespawn( int Player );
    255263int FLrEvent_GetNumArgs( int eventIndex );
     264
     265extern unsigned int lastPingTime;
    256266#endif
  • Daodan/MSVC/Flatline_BSL.c

    r579 r580  
    3232uint16_t ONICALL change_name(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
    3333{
    34        
     34
    3535        //should also return your name...
    3636        sprintf(player_name, "%.31s", args[0].value_str32);
     
    7373{
    7474        if(     NetPlatform_Initalize()) {
    75         static flatline_packet packet;
    76         sock = NetUDPSocket_Create(27777);
    77         address.sin_family = AF_INET; address.sin_port = htons(27777); address.sin_addr.S_un.S_addr = inet_addr(args[0].value_str32 ); 
    78         //address.sin_family = AF_INET; address.sin_port = htons(27777); address.sin_addr.S_un.S_addr = inet_addr("192.168.0.1");       
    79 
    80         packet.id = CONNECT_SEND;
    81         memcpy(((connect_send*)(packet.data))->country ,  player_country, 2);
    82         memcpy(((connect_send*)(packet.data))->name, player_name, 256);
    83         DDrConsole_PrintF("%s", ((connect_send*)(packet.data))->name);
    84         CreateThread(NULL, 0, StartClient, &packet, 0, 0);
     75                static flatline_packet packet;
     76                sock = NetUDPSocket_Create(27777);
     77                address.sin_family = AF_INET; address.sin_port = htons(27777); address.sin_addr.S_un.S_addr = inet_addr(args[0].value_str32 ); 
     78                //address.sin_family = AF_INET; address.sin_port = htons(27777); address.sin_addr.S_un.S_addr = inet_addr("192.168.0.1");       
     79
     80                packet.id = CONNECT_SEND;
     81                memcpy(((connect_send*)(packet.data))->country ,  player_country, 2);
     82                memcpy(((connect_send*)(packet.data))->name, player_name, 256);
     83                DDrConsole_PrintF("%s", ((connect_send*)(packet.data))->name);
     84                CreateThread(NULL, 0, StartClient, &packet, 0, 0);
    8585
    8686        }
     
    111111                                        PlayerList[j]->name,
    112112                                        PlayerList[j]->Chr
    113                         );
     113                                        );
    114114                        }
    115115                }
     
    130130        FLrPlayerDisconnect(args[0].value_int32 - 1);
    131131        FLsPublic_Event(EV_DISCONNECT, &args[0].value_int32);
     132        return 0;
     133}
     134
     135uint16_t ONICALL ping(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
     136{
     137        if(server_started)
     138        {
     139                FLsPingAll();
     140        }
    132141        return 0;
    133142}
     
    160169                        new_char.id = NEW_PLAYER;
    161170                        OBJrObjectType_EnumerateObjects('CHAR',BINACHARCallback, (int)args[0].value_str32);
    162                 //      while(!spawnObject);
     171                        //      while(!spawnObject);
    163172                        if(spawnObject)
    164173                        {
     
    179188                }
    180189        }
    181        
    182                 return 0;
     190
     191        return 0;
    183192}
    184193
     
    193202                }
    194203        }
    195 return 0;
     204        return 0;
    196205}
    197206uint16_t ONICALL con(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
     
    201210}
    202211
    203                
    204 void SLrFlatline_Initialize() {
    205        
     212
     213void SLrFlatline_Initialize()
     214{
     215
    206216        DDrPatch_MakeCall(0x004FA88B, FLrInput_Update_Keys);
    207217        FLrInput_Update_Keys();
     
    217227        SLrScript_Command_Register_Void("con", "Activates a console", "con:int", con);
    218228        //SLrScript_Command_Register_ReturnType("ai2_spawn","creates and starts an AI from a character object","ai_name:string [force_spawn:string{\"force\"} | ]", sl_void, spawnAI);
    219 }
     229        SLrScript_Command_Register_Void("ping", "pong!", "", ping);
     230}
  • Daodan/MSVC/Flatline_Server.c

    r579 r580  
    126126//FLsPublic_Event
    127127//Sends an event (door opening, player disconnecting, etc) to all players
    128 //Always make sure you send a pointer to this, even if it is just one arg. ;)
    129 //Returns 0 because mixing C and assembly is stupid.
     128//Always make sure you send a pointer to this, even if it is just one arg. ;).
    130129//If it is void the double door in State crashes. Probably stack corruption,
    131130//I'm not sure exactly why.
     131//So we return 0 to stop that.
    132132int FLsPublic_Event( const unsigned int eventIndex, const int * args )
    133133{
     
    142142}
    143143
     144void FLsPingAll()
     145{
     146        flatline_packet ping;
     147        ping.id = PK_PING;
     148        lastPingTime = ping.ping = ONgGameState->GameTime;
     149        UDPServer_SendToAll(&ping, FLATLINE_HEADER + 4);
     150}
  • Daodan/MSVC/Flatline_Server.h

    r579 r580  
    1212
    1313void FLrServer_Initialize();
     14void FLsPingAll();
    1415#endif
Note: See TracChangeset for help on using the changeset viewer.