Changeset 582 for Daodan/MSVC


Ignore:
Timestamp:
Jan 19, 2011, 5:35:43 AM (14 years ago)
Author:
gumby
Message:

Hangs on death, but netcode is improved.

Location:
Daodan/MSVC
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • Daodan/MSVC/Flatline.c

    r581 r582  
    44#include "Flatline_Server.h"
    55#include "Flatline_Events.h"
     6#include <Windows.h>
    67//#include <sys/time.h>
    78#include <time.h>
     9#include <float.h>
     10#define isnan(x) ((x) != (x))
    811uint32_t last1 = 0; uint32_t last2 = 0;
    912player_info Players[MAX_PLAYERS] = {{0}, {0}, {0}, {0}};
    1013player_info * PlayerList[MAX_CONNECTIONS] = {0};
    11 
     14multiplayer_status MultiplayerStatus;
    1215unsigned int lastPingTime;
    1316
     
    207210                break;
    208211        case PK_PONG:
    209                                 for(i = 0; i < max_connections; i++) {
     212                for(i = 0; i < max_connections; i++) {
    210213                        if(PlayerList[i] != 0 && PlayerList[i]->ip == sender.sin_addr.S_un.S_addr) {
    211214                                found_player = 1;
     
    221224                else
    222225                {
    223                         PlayerList[i]->Ping = (ONgGameState->GameTime - packet->ping) * 1000 / 60;
     226                        PlayerList[i]->Ping = GetTickCount() - packet->ping;
    224227                }
    225228                break;
     
    278281//FLrClient_Run
    279282//Looping function that waits for packets from the server.
    280 
    281283int client_slot = 0;
     284
     285void FLrClient_GetPackets()
     286{
     287        flatline_packet packet;
     288        uint16_t len;
     289        //#define SPAM_INPUT
     290#ifdef SPAM_INPUT
     291        struct timeval lasttime;
     292        struct timeval thistime;
     293        gettimeofday(&lasttime, 0);
     294#endif
     295       
     296
     297                while(NetUDPSocket_Recieve(client_sock, (sockaddr_storage *) &client_address, &packet, &len)) {
     298                        //packet = (flatline_packet*)data;
     299                        //DDrConsole_PrintF("Data recieved, length %i, type %i", len, ((flatline_packet*)data)->id);
     300                        switch(packet.id) {
     301                        case MESSAGE:
     302                                COrMessage_Print(packet.data, "chat", 0);
     303                                break;
     304                        case CONNECT_SEND:
     305                                ;if(1) {
     306                                        flatline_packet connect_recv;
     307                                        memcpy(&connect_recv.connect_reply.message,"This isn't a server!", sizeof("This isn't a server!"));
     308                                        NetUDPSocket_Send(client_sock, (sockaddr *) &address, (char*)&connect_recv, sizeof(bool) + FLATLINE_HEADER + sizeof("This isn't a server!"));                   
     309                                }
     310                        case CONNECT_REPLY:
     311                                break; //extra packet or something.
     312                        case NEW_PLAYER:
     313                                ;if(1) { //haxhaxhax
     314                                        CharacterObject* Char = &(packet.new_player.Character);
     315                                        uint32_t chr_index = 0;
     316                                        Character* PC;
     317                                        DDrConsole_PrintF("%i |  %i", packet.new_player.Playernumber ,client_slot);
     318                                        //Char->OSD.Options = 0;
     319                                        if(packet.new_player.Playernumber == client_slot) {
     320                                                PlayerList[packet.new_player.Playernumber] = &Players[0];
     321                                                PC = (ONgGameState->PlayerCharacter);
     322                                                Players[0].Chr = PC;
     323
     324                                        }
     325                                        else {
     326                                                ONrGameState_NewCharacter(Char, NULL, NULL, &chr_index);
     327                                                ONgGameState->CharacterStorage[chr_index].charType = 0;
     328                                                PlayerList[packet.new_player.Playernumber] = &Players[chr_index];
     329                                                Players[chr_index].Chr = &(ONgGameState->CharacterStorage[chr_index]);
     330                                                Players[chr_index].Chr->Flags &= 0xFFBFFFFF;
     331                                                Players[chr_index].spawnnumber = chr_index;
     332                                                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) ;
     333                                        }
     334                                        //Players[((new_player*)(packet.data))->Playernumber].spawnnumber = ONrGameState_NewCharacter(&(((new_player*)(packet.data))->Character), NULL, NULL, 0);
     335                                        break;
     336                                }
     337                        case PLAYER_DATA:
     338                                if(1) { //haxhaxhax
     339                                        player_data* pd = &packet.player_data;
     340                                        uint16_t i = pd->PlayerNum;
     341
     342                                        pd = (void*)packet.data;
     343
     344
     345                                        if (i > max_connections) break;
     346                                        if( !PlayerList[i] ) break;
     347
     348                                        memcpy( &(PlayerList[i]->player_data), pd, sizeof(player_data) );
     349
     350                                        if( !server_started && pd->rare_sync_index > PlayerList[i]->rare_sync_index )
     351                                        {
     352                                                int sent_bytes;
     353                                                flatline_packet sync_request = {0};
     354                                                sync_request.id = RARE_SYNC_DATA_REQUEST;
     355                                                sync_request.sync_request = i;
     356                                                DDrConsole_PrintF( "Requesting sync data for player %i, old index %u", i, PlayerList[i]->rare_sync_index);
     357                                                sent_bytes = NetUDPSocket_Send(client_sock,(sockaddr *) &address, (char*)&sync_request, FLATLINE_HEADER + sizeof(int) );
     358                                        }
     359
     360                                        PlayerList[i]->DataApplied = 0;
     361
     362
     363                                        break;
     364                                }
     365                        case RARE_SYNC_DATA:
     366                                if(1) {
     367                                        sl_arg hax[2];
     368                                        int dontuse;
     369                                        uint16_t i = packet.rare_sync_data.PlayerNum;
     370
     371                                        if (i > max_connections) break;
     372                                        if( !PlayerList[i] ) break;
     373
     374                                        //WEAPONS ARE DISABLED. Why? Pain in the arse to sync.
     375                                        packet.rare_sync_data.Inventory.Weapons[0] = NULL;
     376                                        packet.rare_sync_data.Inventory.Weapons[1] = NULL;
     377                                        packet.rare_sync_data.Inventory.Weapons[2] = NULL;
     378                                        //                      TMrInstance_GetDataPtr( 'ONCC', packet.rare_sync_data.Class, PlayerList[ i ]->Chr->ONCC );
     379
     380                                        //add the target character
     381                                        hax[0].type = sl_int32;
     382                                        hax[0].value_int32 = PlayerList[ packet.rare_sync_data.PlayerNum ]->spawnnumber;
     383
     384                                        //add the new class
     385                                        //fix this later so we cant buffer overflow :O
     386                                        hax[1].type = sl_str32;
     387                                        hax[1].value_str32 = packet.rare_sync_data.Class;
     388
     389                                        //we are directly calling a bsl function instead of using the normal method for two reasons
     390                                        //1. it has all the checking built in
     391                                        iSetCharacterClass( 0, 2, hax, &dontuse, &dontuse, hax );
     392                                        //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);
     393                                        memcpy( &(PlayerList[ i ]->Chr->Inventory), &(packet.rare_sync_data.Inventory), sizeof(Inventory ));
     394
     395                                        PlayerList[i]->rare_sync_index = packet.rare_sync_data.index;
     396                                }
     397                                break;
     398                        case FLATLINE_EVENT:
     399                                FLcEventHandler( packet.flatline_event.event_index, packet.flatline_event.intArray );
     400                                break;
     401                        case PK_PING:
     402                                packet.id = PK_PONG;
     403                                NetUDPSocket_Send(client_sock, (sockaddr *) &address, (char*)&packet, FLATLINE_HEADER + 4);             
     404                                break;
     405                        case PK_ALL_INPUT:
     406                                if(1)
     407                                {
     408                                        int Player, i;
     409                                        for(i = 0; packet.all_input[i].PlayerNum != -1; i++)
     410                                        {
     411                                                Player = packet.all_input[i].PlayerNum;
     412                                                if(PlayerList[Player])
     413                                                {
     414                                                        PlayerList[Player]->Actions1 = packet.all_input[Player].Actions1;
     415                                                        PlayerList[Player]->Actions2 = packet.all_input[Player].Actions2;
     416                                                        PlayerList[Player]->MouseDeltaX = packet.all_input[Player].MouseDeltaX;
     417                                                        PlayerList[Player]->MouseDeltaY = packet.all_input[Player].MouseDeltaY;
     418                                                        PlayerList[Player]->Facing = packet.all_input[Player].Facing;
     419                                                        PlayerList[Player]->DesiredFacing = packet.all_input[Player].DesiredFacing;
     420                                                        PlayerList[Player]->Position = packet.all_input[Player].Position;
     421                                                }
     422                                        }
     423                                }
     424                                break;
     425                        default:
     426                                DDrConsole_PrintF("Warning, recieved badly formed packet!");
     427                                break;
     428                        }
     429        }
     430}
     431
     432
    282433bool FLrClient_Run(flatline_packet* packet)
    283434{
     
    302453                        if(packet->id == CONNECT_REPLY) {
    303454                                if(packet->connect_reply.goodtogo){
     455
    304456                                        client_connected = 1;
    305457
     
    313465                                        //disable local input.
    314466                                        DDrPatch_NOOP(0x004FA929, 5 + 6 + 5);
     467                                       
     468                                        //Disable local turning
     469                                        //DDrPatch_NOOP(0x004F7EA8, 2);
     470                                        //DDrPatch_Byte( 0x004F7EB1 , 0xE9);
     471                                        //DDrPatch_MakeJump( 0x004F7EB1, 0x004F8030 );
     472
     473
     474                                        //DDrPatch_Byte(0x04ED6FB, 0xEB);
    315475
    316476                                        //DDrConsole_PrintF("Slot %i",  ((connect_reply*)packet)->player_slot);
     477                                        //DDrPatch_NOOP(0x43B23,0x10);
     478                                        //DDrPatch_NOOP(0x4EC248,(0x5A-0x48));
     479                                        //DDrPatch_NOOP(0x4EC861, 6);
    317480                                        break;
    318481                                }
     
    333496                return false;
    334497        }
    335         else
    336         {
    337                 ActiveCharacter * Active;
    338                 flatline_packet packet;
    339                 //#define SPAM_INPUT
    340 #ifdef SPAM_INPUT
    341                 struct timeval lasttime;
    342                 struct timeval thistime;
    343                 gettimeofday(&lasttime, 0);
    344 #endif
    345                 while(1) {
    346 #ifdef SPAM_INPUT
    347                         gettimeofday(&thistime, 0);
    348 
    349                         //DDrConsole_PrintF("%i.%i | %i.%i | %i.%i",lasttime.tv_sec, lasttime.tv_usec, thistime.tv_sec, thistime.tv_usec,
    350                         //      thistime.tv_sec - lasttime.tv_sec, thistime.tv_usec - lasttime.tv_usec);
    351                         //checks to see if enough time has passed since the last input update (by default once every 10ms)
    352                         if(
    353                                 ((thistime.tv_sec > lasttime.tv_sec) && ((thistime.tv_usec + 1000000 - lasttime.tv_usec ) > update_rate * 1000) )
    354                                 || ((thistime.tv_sec == lasttime.tv_sec) && ((thistime.tv_usec - lasttime.tv_usec ) > update_rate * 1000))
    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();
    373                         }
    374 #endif
    375                         if(NetUDPSocket_Recieve(client_sock, (sockaddr_storage *) &client_address, &packet, &len)) {
    376                                 //packet = (flatline_packet*)data;
    377                                 //DDrConsole_PrintF("Data recieved, length %i, type %i", len, ((flatline_packet*)data)->id);
    378                                 switch(packet.id) {
    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                                         NetUDPSocket_Send(client_sock, (sockaddr *) &address, (char*)&packet, FLATLINE_HEADER + 4);             
    487                                         break;
    488                                 case PK_ALL_INPUT:
    489                                         if(1)
    490                                         {
    491                                                 int Player;
    492                                                 for(Player = 0; Player < MAX_CONNECTIONS; Player++)
    493                                                 {
    494                                                         if(PlayerList[Player])
    495                                                         {
    496                                                                 PlayerList[Player]->Actions1 = packet.all_input[Player].Actions1;
    497                                                                 PlayerList[Player]->Actions2 = packet.all_input[Player].Actions2;
    498                                                                 PlayerList[Player]->MouseDeltaX = packet.all_input[Player].MouseDeltaX;
    499                                                                 PlayerList[Player]->MouseDeltaY = packet.all_input[Player].MouseDeltaY;
    500                                                         }
    501                                                 }
    502                                         }
    503                                         break;
    504                                 default:
    505                                         DDrConsole_PrintF("Warning, recieved badly formed packet!");
    506                                         break;
    507                                 }
    508                         }
    509                         else {
    510                                 Sleep(1);
    511                         }
    512                 }
    513         }
     498
    514499        return true;
    515500}
     
    543528} IMtPoint2D;
    544529static flatline_packet cache_input = {0};
    545 extern void* TSrTest;
     530enum
     531{
     532        FirstPass,
     533        SecondPass,
     534        NoPass,
     535};
     536bool ShouldSendUpdate( int i, Character* Player, ActiveCharacter* Active_Player )
     537{
     538        return
     539                MultiplayerStatus.PleaseUpdateAllPlayers ? 1 :
     540                strcmp(PlayerList[i]->player_data.Animation,
     541                TMrInstance_GetInstanceName(Active_Player->Animation)) ? 1 :
     542                PlayerList[i]->player_data.Health != Player->Health ? 1 : 0;
     543}
     544
    546545void * ONICALL FLrInput_Update_Keys(void)
    547546{
    548547        uint16_t i;
    549548        flatline_packet all_input = {0};
    550         ActiveCharacter * Active_Player = ONgGameState->ActiveCharacters;
    551         Active_Player->PhyContext->Rotation;
    552         Active_Player->PhyContext->Position;
    553         ONgGameState->PlayerCharacter->Position;
    554 
     549        int16_t InputIndex = 0;
     550        //ActiveCharacter * Active_Player = ONgGameState->ActiveCharacters;
     551       
    555552        if(client_connected)
    556553        {
    557554                int sent_bytes;
    558555                flatline_packet input_packet = {0};
     556
     557                FLrClient_GetPackets();
     558
    559559                input_packet.id = PLAYER_INPUT;
    560560                input_packet.input_struct.Time = ONgGameState->GameTime;
     561//              ((GameState*)(ONgGameState))->Input.Current.Actions1 |= Action_Backward | Action_StepLeft;
    561562                input_packet.input_struct.Actions1 = ((GameState*)(ONgGameState))->Input.Current.Actions1;
    562563                input_packet.input_struct.Actions2 = ((GameState*)(ONgGameState))->Input.Current.Actions2;
     
    577578        {
    578579                FLsPingAll();
     580        }
     581
     582        if(server_started && PlayerList[0])
     583        {
     584                PlayerList[0]->Actions1 = ONgGameState->Input.Current.Actions1;
     585                PlayerList[0]->Actions2 = ONgGameState->Input.Current.Actions2;
     586                PlayerList[0]->MouseDeltaX = ONgGameState->Input.MouseDeltaX;
     587                PlayerList[0]->MouseDeltaY = ONgGameState->Input.MouseDeltaY;
    579588        }
    580589
     
    584593                GameInput * Active_Input;
    585594                if(PlayerList[i] == 0) continue;
    586 
    587 
    588                 if(i == 0) {
    589                         all_input.all_input[i].Actions1 = ((GameState*)(ONgGameState))->Input.Current.Actions1;
    590                         all_input.all_input[i].Actions2 = ((GameState*)(ONgGameState))->Input.Current.Actions2;
    591                         all_input.all_input[i].MouseDeltaX = ONgGameState->Input.MouseDeltaX;
    592                         all_input.all_input[i].MouseDeltaY = ONgGameState->Input.MouseDeltaY;
    593                 }
    594                 else{
    595                         all_input.all_input[i].Actions1 = PlayerList[i]->Actions1;
    596                         all_input.all_input[i].Actions2 = PlayerList[i]->Actions2;
    597                         all_input.all_input[i].MouseDeltaX = PlayerList[i]->MouseDeltaX;
    598                         all_input.all_input[i].MouseDeltaY = PlayerList[i]->MouseDeltaY;
    599                 }
    600 
    601595                Player = PlayerList[i]->Chr;
     596                if(server_started)
     597                {
     598
     599                        //Set up input packets
     600
     601                        all_input.all_input[InputIndex].Actions1 = PlayerList[i]->Actions1;
     602                        all_input.all_input[InputIndex].Actions2 = PlayerList[i]->Actions2;
     603                        all_input.all_input[InputIndex].MouseDeltaX = PlayerList[i]->MouseDeltaX;
     604                        all_input.all_input[InputIndex].MouseDeltaY = PlayerList[i]->MouseDeltaY;
     605
     606                        all_input.all_input[InputIndex].Facing = Player->Facing;
     607                        all_input.all_input[InputIndex].DesiredFacing = Player->DesiredFacing;
     608
     609                        //Infinity...
     610                        *(int *)&all_input.all_input[InputIndex].Position.X = 0x7f800000;
     611
     612                        all_input.all_input[InputIndex].PlayerNum = i;
     613                        InputIndex++;
     614                }
     615
    602616                if( Player->Health == 0)
    603617                {
     
    614628                        }
    615629
    616                         if(server_started & i == 0)
     630                        if(server_started && i == 0)
    617631                        {
    618632                                Actions =  ONgGameState->Input.Current.Actions1;
     
    641655
    642656                Active_Player = ONrGetActiveCharacter( PlayerList[i]->Chr);
    643 
     657               
    644658                if(Active_Player == 0) continue;
     659
     660
     661
     662                //Active_Player->PlayingFilm.Flags = 1;
    645663                Active_Input = &(Active_Player->Input);
    646 
    647                 if(server_started && strcmp(PlayerList[i]->player_data.Animation, TMrInstance_GetInstanceName(Active_Player->Animation)))
     664                if(server_started)
     665                {
     666                        all_input.all_input[InputIndex - 1].Position = Active_Player->PhyContext->Position;
     667                }
     668                if(server_started &&
     669                        ShouldSendUpdate( i, PlayerList[i]->Chr, Active_Player) )
    648670                {
    649671                        player_data * data;
     
    656678                        data->Health = PlayerList[i]->Chr->Health;
    657679                        data->MaxHealth = PlayerList[i]->Chr->MaxHealth;
    658                         data->Position = PlayerList[i]->Chr->Position;
    659                         data->Facing = PlayerList[i]->Chr->Facing;
    660                         data->DesiredFacing = PlayerList[i]->Chr->DesiredFacing;
    661                         data->Position = Active_Player->PhyContext->Position;
     680                        //data->Position = PlayerList[i]->Chr->Position;
     681                        //data->Facing = PlayerList[i]->Chr->Facing;
     682                        //data->DesiredFacing = PlayerList[i]->Chr->DesiredFacing;
     683                        //data->Position = Active_Player->PhyContext->Position;
    662684                        memcpy(data->Animation, TMrInstance_GetInstanceName(Active_Player->Animation), 31);
    663685                        data->Frame = Active_Player->Frame;
     686
     687                        data->UD = Active_Player->HeadPitch;   
     688                        data->LR = Active_Player->HeadFacing;
    664689
    665690                        if(Active_Player->targetThrow)
     
    688713                }
    689714
    690                 if( (server_started && i !=0)  || (!server_started/* && i != client_slot*/) )
     715                if( (server_started && i !=0)  || !server_started )
    691716                {
    692717                        Active_Input->Stop.Actions1 = ~PlayerList[i]->Actions1 & Active_Input->Current.Actions1;
     
    707732                                void* Animation;
    708733                                player_data* pd = &PlayerList[i]->player_data;
    709 
    710 
    711                                 //Note to self: sort out which needs to be applied the first time and which the second.
    712                                 switch(PlayerList[i]->DataApplied)
     734                               
     735                                PlayerList[i]->Chr->Facing = PlayerList[i]->Facing;                                     
     736                                PlayerList[i]->Chr->DesiredFacing = PlayerList[i]->DesiredFacing;
     737                               
     738                                if(*(int*)&PlayerList[i]->Chr->Position.X != 0x7f800000)
    713739                                {
    714                                 case 1:
    715                                         PlayerList[i]->DataApplied = 2;
    716                                         break;
    717                                 case 0:
    718                                         PlayerList[i]->DataApplied = 1;
    719                                 case 2:
    720                                         continue;
    721                                 }
    722                                
    723                                 Player->Health = PlayerList[i]->player_data.Health;
    724                                 PlayerList[i]->Chr->MaxHealth = PlayerList[i]->player_data.MaxHealth;
    725 
    726                                 PlayerList[i]->Chr->Facing = PlayerList[i]->player_data.Facing;
    727                                 PlayerList[i]->Chr->DesiredFacing = PlayerList[i]->player_data.DesiredFacing;
    728 
    729 /*                              PlayerList[i]->Actions1 = PlayerList[i]->player_data.Inputs.Actions1;
    730                                 PlayerList[i]->Actions2 = PlayerList[i]->player_data.Inputs.Actions2;
    731                                 PlayerList[i]->MouseDeltaX = PlayerList[i]->player_data.Inputs.MouseDeltaX;
    732                                 PlayerList[i]->MouseDeltaY = PlayerList[i]->player_data.Inputs.MouseDeltaY;*/
    733                                 Active_Player->PhyContext->Position = PlayerList[i]->player_data.Position;
    734                                 OldAnimation = Active_Player->Animation;
    735 
    736                                 if (!(Player->Flags & ONcCharacterFlag_BeingThrown) &&
    737                                         (pd->Animation != 0))
     740                                        Active_Player->PhyContext->Position = PlayerList[i]->Position;                                 
     741                                }
     742                                else
    738743                                {
    739                                         // get a pointer to the animation
    740 
    741                                         TMrInstance_GetDataPtr(
    742                                                 'TRAM',
    743                                                 pd->Animation,
    744                                                 &Animation);
    745                                         if (Animation != OldAnimation)
     744                                        int breakfast = 0;
     745                                }
     746                                /*
     747                                if(isnan(Active_Player->PhyContext->Position.Y) ||
     748                                        isnan(Active_Player->PhyContext->Position.X) ||
     749                                        isnan(Active_Player->PhyContext->Position.Z) )
     750                                {
     751                                        //DDrConsole_PrintF("Player is NAN! %x %x", Active_Player->PhyContext->Position.Y, PlayerList[i]->Height);
     752                                        DDrConsole_PrintF("Player is NAN! %x %x %x", Active_Player->PhyContext->Position.X, Active_Player->PhyContext->Position.Y, Active_Player->PhyContext->Position.Z);
     753                                        //DDrConsole_PrintF("Velocity %x %x %x", Active_Player->PhyContext->Velocity.X, Active_Player->PhyContext->Velocity.Y, Active_Player->PhyContext->Velocity.Z);
     754                                       
     755                                       
     756                                }
     757                                */
     758
     759                                if( PlayerList[i]->DataApplied == FirstPass )
     760                                {
     761                                        PlayerList[i]->DataApplied = SecondPass;
     762
     763                                        Player->Health = PlayerList[i]->player_data.Health;
     764                                        PlayerList[i]->Chr->MaxHealth = PlayerList[i]->player_data.MaxHealth;
     765
     766                                }
     767                                else if( PlayerList[i]->DataApplied == SecondPass )
     768                                {
     769                                        OldAnimation = Active_Player->Animation;
     770
     771                                        PlayerList[i]->DataApplied = NoPass;
     772
     773                                        PlayerList[i]->player_data.Frame++;
     774
     775                                        if (!(Player->Flags & ONcCharacterFlag_BeingThrown) &&
     776                                                (pd->Animation[0] != 0))
    746777                                        {
    747                                                 short   num_frames;
    748                                                 bool    updateAnimation = true;
    749 
    750                                                 // if the character is dead, make sure this animation is appropriate for death
    751                                                 /*
    752                                                 if (Player->Flags & ONcCharacterFlag_Dead)
     778                                                // get a pointer to the animation
     779
     780                                                TMrInstance_GetDataPtr(
     781                                                        'TRAM',
     782                                                        pd->Animation,
     783                                                        &Animation);
     784                                                if (Animation != OldAnimation)
    753785                                                {
    754                                                 short   curToState = TRrAnimation_GetTo(Active_Player->Animation);
    755                                                 short   newToState = TRrAnimation_GetTo(animation);
    756 
    757                                                 // if we are currently heading towards fallen and the new animation would not
    758                                                 // then this is a better animation to run when we are dead
    759                                                 if ((ONrAnimState_IsFallen(curToState)) &&
    760                                                 (!ONrAnimState_IsFallen(newToState)))
    761                                                 {
    762                                                 updateAnimation = false;
    763                                                 }
    764                                                 }
    765                                                 */
    766                                                 if ((updateAnimation) && (Active_Player->Animation == Animation))
    767                                                 {
    768                                                         int             oldFrame = Active_Player->Frame;
    769                                                         int             newFrame = pd->Frame;
    770 
    771                                                         if (abs(oldFrame - newFrame) < 2)
     786                                                        short   num_frames;
     787                                                        bool    updateAnimation = true;
     788
     789                                                        // if the character is dead, make sure this animation is appropriate for death
     790                                                        /*
     791                                                        if (Player->Flags & ONcCharacterFlag_Dead)
    772792                                                        {
    773                                                                 updateAnimation = false;
     793                                                        short   curToState = TRrAnimation_GetTo(Active_Player->Animation);
     794                                                        short   newToState = TRrAnimation_GetTo(animation);
     795
     796                                                        // if we are currently heading towards fallen and the new animation would not
     797                                                        // then this is a better animation to run when we are dead
     798                                                        if ((ONrAnimState_IsFallen(curToState)) &&
     799                                                        (!ONrAnimState_IsFallen(newToState)))
     800                                                        {
     801                                                        updateAnimation = false;
     802                                                        }
     803                                                        }
     804                                                        */
     805                                                        if ((updateAnimation) && (Active_Player->Animation == Animation))
     806                                                        {
     807                                                                int             oldFrame = Active_Player->Frame;
     808                                                                int             newFrame = pd->Frame;
     809
     810                                                                if (abs(oldFrame - newFrame) < 2)
     811                                                                {
     812                                                                        updateAnimation = false;
     813                                                                }
     814                                                        }
     815
     816                                                        if (updateAnimation)
     817                                                        {
     818                                                                // set the characters animation
     819                                                                /*      ONrCharacter_SetAnimationInternal(Player,
     820                                                                Active_Player,
     821                                                                Active_Player->AnimationToState,
     822                                                                0,
     823                                                                Animation);
     824                                                                ONrCharacter_NewAnimationHook(Player, Active_Player);*/
     825                                                                //Player->Flags |= 0x00000010;
     826                                                                ONrCharacter_SetAnimationExternal(Player, TRrAnimation_GetFrom(Animation), Animation, 0);
     827                                                                //ONrCharacter_NewAnimationHook(Player, Active_Player);
     828                                                        }
     829
     830                                                        num_frames = TRrAnimation_GetDuration(Active_Player->Animation);
     831
     832                                                        if (pd->Frame == num_frames)
     833                                                        {
     834                                                                Active_Player->Frame = num_frames - 1;
     835                                                                //Active_Player->Frame = 0;
     836                                                        }
     837                                                        else
     838                                                        {
     839                                                                Active_Player->Frame = pd->Frame;
    774840                                                        }
    775841                                                }
    776 
    777                                                 if (updateAnimation)
     842                                        } //animation check
     843
     844                                        if (PlayerList[i]->player_data.throw_data.throwName[0] != 0)
     845                                        {
     846                                                short throwTarget = PlayerList[pd->throw_data.throwing]->spawnnumber;
     847                                                if ((throwTarget != Active_Player->throwing) &&
     848                                                        (pd->throw_data.throwFrame < 10))
    778849                                                {
    779                                                         // set the characters animation
    780                                                         /*      ONrCharacter_SetAnimationInternal(Player,
    781                                                         Active_Player,
    782                                                         Active_Player->AnimationToState,
    783                                                         0,
    784                                                         Animation);
    785                                                         ONrCharacter_NewAnimationHook(Player, Active_Player);*/
    786                                                         //Player->Flags |= 0x00000010;
    787                                                         ONrCharacter_SetAnimationExternal(Player, TRrAnimation_GetFrom(Animation), Animation, 0);
    788                                                         //ONrCharacter_NewAnimationHook(Player, Active_Player);
    789                                                 }
    790 
    791                                                 num_frames = TRrAnimation_GetDuration(Active_Player->Animation);
    792 
    793                                                 if (pd->Frame == num_frames)
    794                                                 {
    795                                                         Active_Player->Frame = num_frames - 1;
    796                                                         //Active_Player->Frame = 0;
    797                                                 }
    798                                                 else
    799                                                 {
    800                                                         Active_Player->Frame = pd->Frame;
    801                                                 }
    802                                         }
    803                                 }
    804 
    805                                 if (PlayerList[i]->player_data.throw_data.throwName[0] != 0)
    806                                 {
    807                                         short throwTarget = PlayerList[pd->throw_data.throwing]->spawnnumber;
    808                                         if ((throwTarget != Active_Player->throwing) &&
    809                                                 (pd->throw_data.throwFrame < 10))
    810                                         {
    811                                                 void    *throw_animation;
    812                                                 ActiveCharacter* Target;
    813                                                 // get the animation
    814 
    815                                                 TMrInstance_GetDataPtr(
    816                                                         'TRAM',
    817                                                         pd->throw_data.throwName,
    818                                                         &throw_animation);
    819                                                 //if (error) return;
    820 
    821                                                 // set the throw target
    822                                                 Active_Player->ThrowTargetCharacter = &ONgGameState->CharacterStorage[throwTarget];
    823                                                 Target = ONrGetActiveCharacter(Active_Player->ThrowTargetCharacter);
    824                                                 if ((Target->Animation != throw_animation) &&
    825                                                         (OldAnimation != Animation) &&
    826                                                         !(Active_Player->ThrowTargetCharacter->Flags & ONcCharacterFlag_BeingThrown))
    827                                                 {
    828                                                         // set the throw variables
    829                                                         Active_Player->targetThrow      = throw_animation;
    830                                                         Active_Player->throwing         = throwTarget;
    831 
    832                                                         // run the throw
    833                                                         ONrCharacter_NewAnimationHook(Player, Active_Player);
    834 
    835                                                         if (Active_Player->ThrowTargetCharacter)
     850                                                        void    *throw_animation;
     851                                                        ActiveCharacter* Target;
     852                                                        // get the animation
     853
     854                                                        TMrInstance_GetDataPtr(
     855                                                                'TRAM',
     856                                                                pd->throw_data.throwName,
     857                                                                &throw_animation);
     858                                                        //if (error) return;
     859
     860                                                        // set the throw target
     861                                                        Active_Player->ThrowTargetCharacter = &ONgGameState->CharacterStorage[throwTarget];
     862                                                        Target = ONrGetActiveCharacter(Active_Player->ThrowTargetCharacter);
     863                                                        if ((Target->Animation != throw_animation) &&
     864                                                                (OldAnimation != Animation) &&
     865                                                                !(Active_Player->ThrowTargetCharacter->Flags & ONcCharacterFlag_BeingThrown))
    836866                                                        {
    837                                                                 Target->Frame += 2;
    838                                                                 Target->thrownBy = Player->Number;
     867                                                                // set the throw variables
     868                                                                Active_Player->targetThrow      = throw_animation;
     869                                                                Active_Player->throwing         = throwTarget;
     870
     871                                                                // run the throw
     872                                                                ONrCharacter_NewAnimationHook(Player, Active_Player);
     873
     874                                                                if (Active_Player->ThrowTargetCharacter)
     875                                                                {
     876                                                                        Target->Frame += 2;
     877                                                                        Target->thrownBy = Player->Number;
     878                                                                }
    839879                                                        }
    840880                                                }
    841                                         }
    842                                 }
    843 
    844                         }
    845                 }
     881                                        } //throw check
     882                                } //second pass
     883                        } //if not dead
     884                } //if( (server_started && i !=0)  || !server_started )
     885               
     886                //Check for character switching requests
     887                if(server_started && PlayerList[i]->Actions1 & Action_Block && PlayerList[i]->ShapeshiftCooldown < ONgGameState->GameTime)
     888                {
     889                        int error;
     890
     891
     892
     893                        ONCC *newClass;
     894                        short numClasses = (short)TMrInstance_GetTagCount('ONCC');
     895                        /*
     896                        if(Active_Player->Input.Start.Actions1 & Action_Block)
     897                        {
     898                                //This might not be getting hit. Find out why, eh?
     899                                PlayerList[i]->ShapeshiftCooldown = ONgGameState->GameTime + 15;
     900                        }
     901                        else
     902                        {
     903                                PlayerList[i]->ShapeshiftCooldown = ONgGameState->GameTime + 5;
     904                        }
     905                        */
     906                        if (PlayerList[i]->Actions1 & Action_Crouch) {
     907                                Player->ONCCnumber += numClasses - 1;
     908                        }
     909                        else {
     910                                Player->ONCCnumber += 1;
     911                        }
     912
     913                        if (numClasses > 0) {
     914                                Player->ONCCnumber = Player->ONCCnumber % numClasses;
     915
     916                                error = TMrInstance_GetDataPtr_ByNumber('ONCC', Player->ONCCnumber, &newClass);
     917
     918                                if ((newClass != NULL) && (!error)) {
     919                                        ONrCharacter_SetCharacterClass(Player, newClass);
     920                                }
     921                        }
     922
     923                }
     924
    846925
    847926        }
    848927        if(server_started)
    849928        {
    850                 UDPServer_SendToAll(&all_input, FLATLINE_HEADER + sizeof(player_input) * 32);
    851         }
    852 
     929                all_input.all_input[InputIndex].PlayerNum = -1;
     930                UDPServer_SendToAll(&all_input,
     931                        FLATLINE_HEADER + sizeof(player_input) * InputIndex + sizeof(int16_t));
     932        }
     933        MultiplayerStatus.PleaseUpdateAllPlayers = 0;
    853934        return ONgGameState;
    854935}
     
    859940        {
    860941                //FLsPublic_Event(EV_DISCONNECT, &Player );
     942                MultiplayerStatus.PleaseUpdateAllPlayers = 1;
    861943        }
    862944        //Kill off the character in another function, please
     
    9321014        }
    9331015}
     1016
     1017bool FlatlineInitialize()
     1018{
     1019       
     1020        memset( Players, 0, sizeof( player_info ) * MAX_PLAYERS );
     1021        memset( PlayerList, 0, 4 * MAX_PLAYERS );
     1022        memset( &MultiplayerStatus, 0, sizeof( multiplayer_status ));
     1023        return 1;
     1024}
  • Daodan/MSVC/Flatline.h

    r581 r582  
    116116typedef struct {
    117117        uint16_t PlayerNum;
    118         Vector3 Position;
    119         float Facing;
    120         float DesiredFacing;
     118        //Vector3 Position;
     119       
     120        //float Facing;
     121        //float DesiredFacing;
     122
     123        float UD;
     124        float LR;
     125
    121126        uint32_t Health;
    122127        uint32_t MaxHealth;
     
    130135        int Deaths;
    131136        uint16_t Ping;
     137
    132138} player_data;
    133139
     
    146152
    147153typedef struct {
     154        int16_t PlayerNum;
    148155        float MouseDeltaX;
    149156        float MouseDeltaY;
    150157        uint32_t Actions1;
    151158        uint32_t Actions2;
     159        float Facing;
     160        float DesiredFacing;
     161        Vector3 Position;
    152162} player_input;
    153163
     
    210220
    211221
     222typedef struct {
     223        //Server Only
     224        bool PleaseUpdateAllPlayers;
     225        //Client stuff (can be used by server "client")
     226
     227        //Move from random scattered bools to these, please.
     228        bool ClientConnected;
     229        unsigned int ClientSlot;
     230        bool ServerStatus;
     231} multiplayer_status;
    212232
    213233enum {
     
    227247        uint16_t spawnnumber;
    228248        uint16_t list_slot;
     249       
     250        //Todo: move into struct for slightly faster copying
    229251        float MouseDeltaX;
    230252        float MouseDeltaY;
    231253        uint32_t Actions1;
    232254        uint32_t Actions2;
     255        float Facing;
     256        float DesiredFacing;
     257        //float Height;
     258        Vector3 Position;
     259
    233260        unsigned int LastInputTime;
    234261        input_struct CacheInput;
     
    242269        uint32_t Ping;
    243270        bool DataApplied;
     271       
     272        uint32_t ShapeshiftCooldown;
    244273} player_info;
    245274
     
    260289extern player_info Players[];
    261290extern player_info * PlayerList[];
    262 
     291extern multiplayer_status MultiplayerStatus;
    263292int UDPServer_SendToAll(void* packet, int size);
    264293
     
    271300void FLrPlayerRespawn( int Player );
    272301int FLrEvent_GetNumArgs( int eventIndex );
    273 
     302bool FlatlineInitialize();
    274303extern unsigned int lastPingTime;
    275304#endif
  • Daodan/MSVC/Flatline_BSL.c

    r580 r582  
    7272uint16_t ONICALL connect_to_server(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
    7373{
     74        //TODO: Move this into the client initialization. Doing it like this is silly.
    7475        if(     NetPlatform_Initalize()) {
    7576                static flatline_packet packet;
     
    128129uint16_t ONICALL kick(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
    129130{
    130         FLrPlayerDisconnect(args[0].value_int32 - 1);
     131        FLrPlayerDisconnect(args[0].value_int32);
    131132        FLsPublic_Event(EV_DISCONNECT, &args[0].value_int32);
    132133        return 0;
     
    226227        SLrScript_Command_Register_Void("kick", "Kicks a client from the server", "clientnum:int", kick);
    227228        SLrScript_Command_Register_Void("con", "Activates a console", "con:int", con);
    228         //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);
    229229        SLrScript_Command_Register_Void("ping", "pong!", "", ping);
    230230}
  • Daodan/MSVC/Flatline_Net.c

    r567 r582  
    207207}
    208208
     209
     210
    209211DWORD WINAPI StartServer(void* lol){
    210         NetPlatform_Initalize();
    211         FLrServer_Run();
     212        if(NetPlatform_Initalize() && FlatlineInitialize())
     213        {
     214                FLrServer_Run();
     215        }
    212216        return 0;
    213217}
     
    215219DWORD WINAPI StartClient(void* lol){
    216220        //NetPlatform_Initalize();
    217         FLrClient_Run((flatline_packet*)lol);
     221        if(FlatlineInitialize())
     222        {
     223                FLrClient_Run((flatline_packet*)lol);
     224        }
    218225        return 0;
    219226}
  • Daodan/MSVC/Flatline_Server.c

    r580 r582  
    11#include "Flatline.h"
    22#include "Flatline_Server.h"
     3#include <Windows.h>
    34
    45//I hereby apologize for the uglyness of the below code.
     
    9293                sprintf(PlayerList[playerlist_slot]->name,"%.31s",name);
    9394               
     95                MultiplayerStatus.PleaseUpdateAllPlayers = 1;
     96
    9497                return &Players[player_slot];
    9598        }
     
    146149        flatline_packet ping;
    147150        ping.id = PK_PING;
    148         lastPingTime = ping.ping = ONgGameState->GameTime;
     151        lastPingTime = ping.ping = GetTickCount();
    149152        UDPServer_SendToAll(&ping, FLATLINE_HEADER + 4);
    150153}
  • Daodan/MSVC/Oni_GameState.h

    r578 r582  
    769769  int field_8;
    770770  ONCC* ONCC;
    771   __int16 field_10;
     771  __int16 ONCCnumber;
    772772  __int16 Team;
    773773  char Name[32];
     
    799799  int BNV;
    800800  int GraphNode;
    801   int PelvisHeight;
     801  float PelvisHeight;
    802802  int field_190;
    803803  Inventory Inventory;
     
    12571257  int field_21AC;
    12581258  Vector3 field_21B0;
    1259   int HeadFacing;
    1260   int HeadPitch;
     1259  float HeadFacing;
     1260  float HeadPitch;
    12611261  int field_21C4;
    12621262  int field_21C8;
     
    13221322typedef struct
    13231323{
     1324        char name[64];  // Must be same as ONcMaxLevelName above (for TE)
     1325       
     1326        void *env;
     1327        void *objectsetup;
     1328        void *markers;
     1329        void *flags;
     1330        void *triggers;
     1331       
     1332        void *Sky;
     1333        float   SkyHeight;
     1334
     1335
     1336} OniLevel;
     1337
     1338typedef struct
     1339{
    13241340  int TimerMode;
    13251341  char TimerName[32];
     
    13791395  int field_148;
    13801396  int field_14C;
    1381   int Level;
     1397  OniLevel* Level;
    13821398  int field_154;
    13831399  MotionBlur MotionBlur_[64];
  • Daodan/MSVC/Oni_Symbols.h

    r579 r582  
    229229//typedef void          ( *_ONiGameState_FindAutoPromptMessage)(char* Note, void* ptr);
    230230DefFunc( void, ONiGameState_FindAutoPromptMessage, (char* Note, void* ptr), 0x004FDBE0 );
     231DefFunc( void, ONrCharacter_SetCharacterClass, (Character* Char, ONCC* Class), 0x004D7C30 );
     232DefFunc( short, TMrInstance_GetDataPtr_ByNumber, (int tag, int number, void** out), 0x00423680 );
     233DefFunc( uint32_t, TMrInstance_GetTagCount, (int tag), 0x004236F0);
    231234#endif
Note: See TracChangeset for help on using the changeset viewer.