diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 50172f5d4..2b3237cae 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,8 @@ -March 11, 2009 +March 12, 2009 +- Fixed: After loading a savegame or unmorphing, a player's weapon slots + were empty. + +March 11, 2009 - Moved weapon slot initialization into APlayerPawn::PostBeginPlay() so that they can be initialized when players respawn in multiplayer. diff --git a/src/d_player.h b/src/d_player.h index ec3cab928..ba72c2d60 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -98,6 +98,7 @@ public: virtual void GiveDeathmatchInventory (); virtual void FilterCoopRespawnInventory (APlayerPawn *oldplayer); + void SetupWeaponSlots (); void GiveDefaultInventory (); void PlayAttacking (); void PlayAttacking2 (); diff --git a/src/g_level.cpp b/src/g_level.cpp index e368688f9..2f83495ad 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1412,7 +1412,7 @@ void G_SerializeLevel (FArchive &arc, bool hubLoad) // Hub transitions must keep the current total time if (!hubLoad) - level.totaltime=i; + level.totaltime = i; if (arc.IsStoring ()) { @@ -1501,9 +1501,19 @@ void G_SerializeLevel (FArchive &arc, bool hubLoad) P_SerializePlayers (arc, hubLoad); P_SerializeSounds (arc); - if (arc.IsLoading()) for(i=0;iSetupWeaponSlots(); + } + } } } diff --git a/src/g_shared/a_morph.cpp b/src/g_shared/a_morph.cpp index e5912c6f4..0979c88cf 100644 --- a/src/g_shared/a_morph.cpp +++ b/src/g_shared/a_morph.cpp @@ -97,7 +97,7 @@ bool P_MorphPlayer (player_t *activator, player_t *p, const PClass *spawntype, i // [MH] Used by SBARINFO to speed up face drawing p->MorphedPlayerClass = 0; - for (unsigned int i = 1; i < PlayerClasses.Size (); i++) + for (unsigned int i = 1; i < PlayerClasses.Size(); i++) { if (PlayerClasses[i].Type == spawntype) { @@ -309,6 +309,7 @@ bool P_UndoPlayerMorph (player_t *activator, player_t *player, bool force) angle = mo->angle >> ANGLETOFINESHIFT; Spawn(exit_flash, pmo->x + 20*finecosine[angle], pmo->y + 20*finesine[angle], pmo->z + TELEFOGHEIGHT, ALLOW_REPLACE); + mo->SetupWeaponSlots(); // Use original class's weapon slots. beastweap = player->ReadyWeapon; if (player->PremorphWeapon != NULL) { diff --git a/src/p_user.cpp b/src/p_user.cpp index f54c6b5bc..647c1e982 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -499,7 +499,21 @@ void APlayerPawn::Tick() void APlayerPawn::PostBeginPlay() { - // If we're not a voodoo doll, set up our weapons. + SetupWeaponSlots(); +} + +//=========================================================================== +// +// APlayerPawn :: SetupWeaponSlots +// +// Sets up the default weapon slots for this player. If this is also the +// local player, determines local modifications and sends those across the +// network. Ignores voodoo dolls. +// +//=========================================================================== + +void APlayerPawn::SetupWeaponSlots() +{ if (player != NULL && player->mo == this) { player->weapons.StandardSetup(GetClass()); diff --git a/wadsrc/wadsrc.vcproj b/wadsrc/wadsrc.vcproj index 45bc58845..ff7295451 100644 --- a/wadsrc/wadsrc.vcproj +++ b/wadsrc/wadsrc.vcproj @@ -37,7 +37,7 @@