diff --git a/src/b_bot.cpp b/src/b_bot.cpp index eb2052a26a..dc6f2cdc49 100644 --- a/src/b_bot.cpp +++ b/src/b_bot.cpp @@ -30,8 +30,6 @@ DBot::DBot () void DBot::Clear () { - savedyaw = 0; - savedpitch = 0; angle = 0; dest = NULL; prev = NULL; @@ -59,9 +57,15 @@ void DBot::Serialize (FArchive &arc) { Super::Serialize (arc); - arc << savedyaw - << savedpitch - << angle + if (SaveVersion < 4515) + { + angle_t savedyaw; + int savedpitch; + arc << savedyaw + << savedpitch; + } + + arc << angle << dest << prev << enemy diff --git a/src/b_bot.h b/src/b_bot.h index 375b09abb0..1862faee5a 100644 --- a/src/b_bot.h +++ b/src/b_bot.h @@ -165,9 +165,6 @@ public: void Clear (); void Serialize (FArchive &arc); - angle_t savedyaw; - int savedpitch; - angle_t angle; // The wanted angle that the bot try to get every tic. // (used to get a smooth view movement) TObjPtr dest; // Move Destination. diff --git a/src/b_game.cpp b/src/b_game.cpp index f13c168dbf..853ba7f23a 100644 --- a/src/b_game.cpp +++ b/src/b_game.cpp @@ -102,7 +102,7 @@ void FCajunMaster::Main (int buf) BotThinkCycles.Reset(); - if (consoleplayer != Net_Arbitrator || demoplayback) + if (demoplayback) return; if (gamestate != GS_LEVEL) @@ -122,37 +122,40 @@ void FCajunMaster::Main (int buf) BotThinkCycles.Unclock(); } - //Add new bots? - if (wanted_botnum > botnum && !freeze) + if (consoleplayer == Net_Arbitrator) { - if (t_join == ((wanted_botnum - botnum) * SPAWN_DELAY)) + //Add new bots? + if (wanted_botnum > botnum && !freeze) { - if (!SpawnBot (getspawned[spawn_tries])) - wanted_botnum--; - spawn_tries++; + if (t_join == ((wanted_botnum - botnum) * SPAWN_DELAY)) + { + if (!SpawnBot (getspawned[spawn_tries])) + wanted_botnum--; + spawn_tries++; + } + + t_join--; } - t_join--; - } - - //Check if player should go observer. Or un observe - if (bot_observer && !observer && !netgame) - { - Printf ("%s is now observer\n", players[consoleplayer].userinfo.GetName()); - observer = true; - players[consoleplayer].mo->UnlinkFromWorld (); - players[consoleplayer].mo->flags = MF_DROPOFF|MF_NOBLOCKMAP|MF_NOCLIP|MF_NOTDMATCH|MF_NOGRAVITY|MF_FRIENDLY; - players[consoleplayer].mo->flags2 |= MF2_FLY; - players[consoleplayer].mo->LinkToWorld (); - } - else if (!bot_observer && observer && !netgame) //Go back - { - Printf ("%s returned to the fray\n", players[consoleplayer].userinfo.GetName()); - observer = false; - players[consoleplayer].mo->UnlinkFromWorld (); - players[consoleplayer].mo->flags = MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_PICKUP|MF_NOTDMATCH|MF_FRIENDLY; - players[consoleplayer].mo->flags2 &= ~MF2_FLY; - players[consoleplayer].mo->LinkToWorld (); + //Check if player should go observer. Or un observe + if (bot_observer && !observer && !netgame) + { + Printf ("%s is now observer\n", players[consoleplayer].userinfo.GetName()); + observer = true; + players[consoleplayer].mo->UnlinkFromWorld (); + players[consoleplayer].mo->flags = MF_DROPOFF|MF_NOBLOCKMAP|MF_NOCLIP|MF_NOTDMATCH|MF_NOGRAVITY|MF_FRIENDLY; + players[consoleplayer].mo->flags2 |= MF2_FLY; + players[consoleplayer].mo->LinkToWorld (); + } + else if (!bot_observer && observer && !netgame) //Go back + { + Printf ("%s returned to the fray\n", players[consoleplayer].userinfo.GetName()); + observer = false; + players[consoleplayer].mo->UnlinkFromWorld (); + players[consoleplayer].mo->flags = MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_PICKUP|MF_NOTDMATCH|MF_FRIENDLY; + players[consoleplayer].mo->flags2 &= ~MF2_FLY; + players[consoleplayer].mo->LinkToWorld (); + } } m_Thinking = false; @@ -348,11 +351,8 @@ void FCajunMaster::TryAddBot (BYTE **stream, int player) if (DoAddBot ((BYTE *)info, skill)) { - if (consoleplayer == Net_Arbitrator) - { - //Increment this. - botnum++; - } + //Increment this. + botnum++; if (thebot != NULL) { diff --git a/src/d_main.cpp b/src/d_main.cpp index e08b1539e3..7eb09c4e4d 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -975,25 +975,6 @@ void D_DoomLoop () I_StartTic (); D_ProcessEvents (); G_BuildTiccmd (&netcmds[consoleplayer][maketic%BACKUPTICS]); - //Added by MC: For some of that bot stuff. The main bot function. - int i; - for (i = 0; i < MAXPLAYERS; i++) - { - if (playeringame[i] && players[i].Bot != NULL && players[i].mo) - { - players[i].Bot->savedyaw = players[i].mo->angle; - players[i].Bot->savedpitch = players[i].mo->pitch; - } - } - bglobal.Main (maketic%BACKUPTICS); - for (i = 0; i < MAXPLAYERS; i++) - { - if (playeringame[i] && players[i].Bot != NULL && players[i].mo) - { - players[i].mo->angle = players[i].Bot->savedyaw; - players[i].mo->pitch = players[i].Bot->savedpitch; - } - } if (advancedemo) D_DoAdvanceDemo (); C_Ticker (); diff --git a/src/d_net.cpp b/src/d_net.cpp index 3d0d20b419..c3e656c451 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -824,7 +824,6 @@ void GetPackets (void) } if (netbuffer[0] & NCMD_QUITTERS) - { numplayers = netbuffer[k++]; for (int i = 0; i < numplayers; ++i) @@ -902,64 +901,18 @@ void GetPackets (void) for (i = 0; i < numplayers; ++i) { - int node = (players[playerbytes[i]].Bot == NULL) ? - nodeforplayer[playerbytes[i]] : netnode; + int node = nodeforplayer[playerbytes[i]]; SkipTicCmd (&start, nettics[node] - realstart); for (tics = nettics[node]; tics < realend; tics++) ReadTicCmd (&start, playerbytes[i], tics); - } - // Update the number of tics received from each node. This must - // be separate from the above loop in case the master is also - // sending bot movements. If it's not separate, then the bots - // will only move on the master, because the other players will - // read the master's tics and then think they already got all - // the tics for the bots and skip the bot tics included in the - // packet. - for (i = 0; i < numplayers; ++i) - { - if (players[playerbytes[i]].Bot == NULL) - { - nettics[nodeforplayer[playerbytes[i]]] = realend; - } - } - } - } -} -void AdjustBots (int gameticdiv) -{ - // [RH] This loop adjusts the bots' rotations for ticcmds that have - // been already created but not yet executed. This way, the bot is still - // able to create ticcmds that accurately reflect the state it wants to - // be in even when gametic lags behind maketic. - for (int i = 0; i < MAXPLAYERS; i++) - { - if (playeringame[i] && players[i].Bot != NULL && players[i].mo) - { - players[i].Bot->savedyaw = players[i].mo->angle; - players[i].Bot->savedpitch = players[i].mo->pitch; - for (int j = gameticdiv; j < maketic/ticdup; j++) - { - players[i].mo->angle += (netcmds[i][j%BACKUPTICS].ucmd.yaw << 16) * ticdup; - players[i].mo->pitch -= (netcmds[i][j%BACKUPTICS].ucmd.pitch << 16) * ticdup; + nettics[nodeforplayer[playerbytes[i]]] = realend; } } } } -void UnadjustBots () -{ - for (int i = 0; i < MAXPLAYERS; i++) - { - if (playeringame[i] && players[i].Bot != NULL && players[i].mo) - { - players[i].mo->angle = players[i].Bot->savedyaw; - players[i].mo->pitch = players[i].Bot->savedpitch; - } - } -} - // // NetUpdate // Builds ticcmds for console player, @@ -1006,9 +959,7 @@ void NetUpdate (void) newtics = 0; } - // build new ticcmds for console player (and bots if I am the arbitrator) - AdjustBots (gametic / ticdup); - + // build new ticcmds for console player for (i = 0; i < newtics; i++) { I_StartTic (); @@ -1018,11 +969,6 @@ void NetUpdate (void) //Printf ("mk:%i ",maketic); G_BuildTiccmd (&localcmds[maketic % LOCALCMDTICS]); - if (maketic % ticdup == 0) - { - //Added by MC: For some of that bot stuff. The main bot function. - bglobal.Main ((maketic / ticdup) % BACKUPTICS); - } maketic++; if (ticdup == 1 || maketic == 0) @@ -1102,8 +1048,6 @@ void NetUpdate (void) } } - UnadjustBots (); - if (singletics) return; // singletic update is synchronous @@ -1123,14 +1067,11 @@ void NetUpdate (void) if (consoleplayer == Net_Arbitrator) { - for (j = 0; j < MAXPLAYERS; j++) + for (j = 0; j < doomcom.numnodes; j++) { - if (playeringame[j]) + if (nodeingame[j] && NetMode == NET_PacketServer) { - if (players[j].Bot != NULL || NetMode == NET_PacketServer) - { - count++; - } + count++; } } @@ -1265,15 +1206,12 @@ void NetUpdate (void) netbuffer[0] |= NCMD_MULTI; netbuffer[k++] = count; - for (l = 1, j = 0; j < MAXPLAYERS; j++) + for (l = 1, j = 0; j < doomcom.numnodes; j++) { - if (playeringame[j] && j != playerfornode[i] && j != consoleplayer) + if (nodeingame[j] && j != i && j != nodeforplayer[consoleplayer] && NetMode == NET_PacketServer) { - if (players[j].Bot != NULL || NetMode == NET_PacketServer) - { - playerbytes[l++] = j; - netbuffer[k++] = j; - } + playerbytes[l++] = playerfornode[j]; + netbuffer[k++] = playerfornode[j]; } } } @@ -1293,7 +1231,7 @@ void NetUpdate (void) prev %= BACKUPTICS; // The local player has their tics sent first, followed by - // the other players/bots. + // the other players. if (l == 0) { WriteWord (localcmds[localstart].consistancy, &cmddata); @@ -1308,23 +1246,17 @@ void NetUpdate (void) } else if (i != 0) { - if (players[playerbytes[l]].Bot != NULL) - { - WriteWord (0, &cmddata); // fake consistancy word - } - else - { - int len; - BYTE *spec; + int len; + BYTE *spec; - WriteWord (netcmds[playerbytes[l]][start].consistancy, &cmddata); - spec = NetSpecs[playerbytes[l]][start].GetData (&len); - if (spec != NULL) - { - memcpy (cmddata, spec, len); - cmddata += len; - } + WriteWord (netcmds[playerbytes[l]][start].consistancy, &cmddata); + spec = NetSpecs[playerbytes[l]][start].GetData (&len); + if (spec != NULL) + { + memcpy (cmddata, spec, len); + cmddata += len; } + WriteUserCmdMessage (&netcmds[playerbytes[l]][start].ucmd, prev >= 0 ? &netcmds[playerbytes[l]][prev].ucmd : NULL, &cmddata); } diff --git a/src/g_game.cpp b/src/g_game.cpp index 1ea1c6b68d..af4a5411e2 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1127,6 +1127,12 @@ void G_Ticker () // check, not just the player's x position like BOOM. DWORD rngsum = FRandom::StaticSumSeeds (); + if ((gametic % ticdup) == 0) + { + //Added by MC: For some of that bot stuff. The main bot function. + bglobal.Main (buf); + } + for (i = 0; i < MAXPLAYERS; i++) { if (playeringame[i]) diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index d0d1152179..88d95b25ea 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -606,7 +606,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags) player->respawn_time = level.time + TICRATE; //Added by MC: Respawn bots - if (bglobal.botnum && consoleplayer == Net_Arbitrator && !demoplayback) + if (bglobal.botnum && !demoplayback) { if (player->Bot != NULL) player->Bot->t_respawn = (pr_botrespawn()%15)+((bglobal.botnum-1)*2)+TICRATE+1; diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index bae4563b39..c7bfcea21e 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -3228,7 +3228,7 @@ void AActor::Tick () } } - if (bglobal.botnum && consoleplayer == Net_Arbitrator && !demoplayback && + if (bglobal.botnum && !demoplayback && ((flags & (MF_SPECIAL|MF_MISSILE)) || (flags3 & MF3_ISMONSTER))) { BotSupportCycles.Clock(); diff --git a/src/version.h b/src/version.h index d9597d2f40..f091f416a5 100644 --- a/src/version.h +++ b/src/version.h @@ -76,7 +76,7 @@ const char *GetVersionString(); // Use 4500 as the base git save version, since it's higher than the // SVN revision ever got. -#define SAVEVER 4514 +#define SAVEVER 4515 #define SAVEVERSTRINGIFY2(x) #x #define SAVEVERSTRINGIFY(x) SAVEVERSTRINGIFY2(x)