mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-22 04:01:31 +00:00
Added co-op option to remember last used weapon when respawning
This commit is contained in:
parent
3e939b0ec1
commit
29a2ca0b13
5 changed files with 19 additions and 3 deletions
|
@ -579,6 +579,7 @@ CVAR(Flag, sv_localitems, dmflags3, DF3_LOCAL_ITEMS);
|
|||
CVAR(Flag, sv_nolocaldrops, dmflags3, DF3_NO_LOCAL_DROPS);
|
||||
CVAR(Flag, sv_nocoopitems, dmflags3, DF3_NO_COOP_ONLY_ITEMS);
|
||||
CVAR(Flag, sv_nocoopthings, dmflags3, DF3_NO_COOP_ONLY_THINGS);
|
||||
CVAR(Flag, sv_rememberlastweapon, dmflags3, DF3_REMEMBER_LAST_WEAP);
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
|
|
|
@ -185,6 +185,7 @@ enum : unsigned
|
|||
DF3_NO_LOCAL_DROPS = 1 << 3, // Drops from Actors aren't picked up locally
|
||||
DF3_NO_COOP_ONLY_ITEMS = 1 << 4, // Items that only appear in co-op are disabled
|
||||
DF3_NO_COOP_ONLY_THINGS = 1 << 5, // Any Actor that only appears in co-op is disabled
|
||||
DF3_REMEMBER_LAST_WEAP = 1 << 6, // When respawning in co-op, keep the last used weapon out instead of switching to the best new one.
|
||||
};
|
||||
|
||||
// [RH] Compatibility flags.
|
||||
|
|
|
@ -5508,6 +5508,7 @@ AActor *FLevelLocals::SpawnPlayer (FPlayerStart *mthing, int playernum, int flag
|
|||
p->mo = mobj;
|
||||
mobj->player = p;
|
||||
state = p->playerstate;
|
||||
const auto heldWeap = state == PST_REBORN && (dmflags3 & DF3_REMEMBER_LAST_WEAP) ? p->ReadyWeapon : nullptr;
|
||||
if (state == PST_REBORN || state == PST_ENTER)
|
||||
{
|
||||
PlayerReborn (playernum);
|
||||
|
@ -5608,7 +5609,7 @@ AActor *FLevelLocals::SpawnPlayer (FPlayerStart *mthing, int playernum, int flag
|
|||
{ // Special inventory handling for respawning in coop
|
||||
IFVM(PlayerPawn, FilterCoopRespawnInventory)
|
||||
{
|
||||
VMValue params[] = { p->mo, oldactor };
|
||||
VMValue params[] = { p->mo, oldactor, ((heldWeap == nullptr || (heldWeap->ObjectFlags & OF_EuthanizeMe)) ? nullptr : heldWeap) };
|
||||
VMCall(func, params, 2, nullptr, 0);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1705,6 +1705,7 @@ OptionMenu CoopOptions protected
|
|||
Option "$GMPLYMNU_SHAREKEYS", "sv_coopsharekeys", "YesNo"
|
||||
Option "$GMPLYMNU_LOCALITEMS", "sv_localitems", "YesNo"
|
||||
Option "$GMPLYMNU_NOLOCALDROP", "sv_nolocaldrops", "YesNo"
|
||||
Option "$GMPLYMNU_REMEMBERWEAP", "sv_rememberlastweapon", "YesNo"
|
||||
Class "GameplayMenu"
|
||||
}
|
||||
|
||||
|
|
|
@ -867,7 +867,7 @@ class PlayerPawn : Actor
|
|||
//
|
||||
//===========================================================================
|
||||
|
||||
void FilterCoopRespawnInventory (PlayerPawn oldplayer)
|
||||
void FilterCoopRespawnInventory (PlayerPawn oldplayer, Weapon curHeldWeapon = null)
|
||||
{
|
||||
// If we're losing everything, this is really simple.
|
||||
if (sv_cooploseinventory)
|
||||
|
@ -876,6 +876,10 @@ class PlayerPawn : Actor
|
|||
return;
|
||||
}
|
||||
|
||||
// Make sure to get the real held weapon before messing with the inventory.
|
||||
if (curHeldWeapon && curHeldWeapon.bPowered_Up)
|
||||
curHeldWeapon = curHeldWeapon.SisterWeapon;
|
||||
|
||||
// Walk through the old player's inventory and destroy or modify
|
||||
// according to dmflags.
|
||||
Inventory next;
|
||||
|
@ -957,8 +961,16 @@ class PlayerPawn : Actor
|
|||
ObtainInventory (oldplayer);
|
||||
|
||||
player.ReadyWeapon = NULL;
|
||||
if (curHeldWeapon && curHeldWeapon.owner == self && curHeldWeapon.CheckAmmo(Weapon.EitherFire, false))
|
||||
{
|
||||
player.PendingWeapon = curHeldWeapon;
|
||||
BringUpWeapon();
|
||||
}
|
||||
else
|
||||
{
|
||||
PickNewWeapon (NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in a new issue