From e2d5a708f8d2e7e4765451aa2ec5e38ee6196d26 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 23 Feb 2017 20:18:02 +0100 Subject: [PATCH] - added an amount parameter to the 'drop' CCMD. --- src/actor.h | 2 +- src/d_net.cpp | 10 ++++++++-- src/g_game.cpp | 5 +++++ src/g_game.h | 1 + src/p_mobj.cpp | 9 +++++---- wadsrc/static/zscript/inventory/ammo.txt | 8 ++++---- wadsrc/static/zscript/inventory/armor.txt | 2 +- wadsrc/static/zscript/inventory/health.txt | 4 ++-- wadsrc/static/zscript/inventory/inventory.txt | 10 ++++++---- wadsrc/static/zscript/inventory/powerups.txt | 2 +- wadsrc/static/zscript/inventory/weapons.txt | 6 +++--- wadsrc/static/zscript/strife/coin.txt | 13 ++++++++----- 12 files changed, 45 insertions(+), 27 deletions(-) diff --git a/src/actor.h b/src/actor.h index d3c430759e..d387da2c88 100644 --- a/src/actor.h +++ b/src/actor.h @@ -713,7 +713,7 @@ public: virtual bool UseInventory (AInventory *item); // Tosses an item out of the inventory. - AInventory *DropInventory (AInventory *item); + AInventory *DropInventory (AInventory *item, int amt = -1); // Removes all items from the inventory. void ClearInventory(); diff --git a/src/d_net.cpp b/src/d_net.cpp index a480ae0ae7..7163cdd55d 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2271,6 +2271,9 @@ void Net_DoCommand (int type, BYTE **stream, int player) case DEM_INVDROP: { DWORD which = ReadLong (stream); + int amt = -1; + + if (type == DEM_INVDROP) amt = ReadLong(stream); if (gamestate == GS_LEVEL && !paused && players[player].playerstate != PST_DEAD) @@ -2288,7 +2291,7 @@ void Net_DoCommand (int type, BYTE **stream, int player) } else { - players[player].mo->DropInventory (item); + players[player].mo->DropInventory (item, amt); } } } @@ -2764,10 +2767,13 @@ void Net_SkipCommand (int type, BYTE **stream) break; case DEM_INVUSE: - case DEM_INVDROP: skip = 4; break; + case DEM_INVDROP: + skip = 8; + break; + case DEM_GENERICCHEAT: case DEM_DROPPLAYER: case DEM_FOV: diff --git a/src/g_game.cpp b/src/g_game.cpp index e5a48c245e..d93d6743bf 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -241,6 +241,7 @@ FString BackupSaveName; bool SendLand; const AInventory *SendItemUse, *SendItemDrop; +int SendItemDropAmount; EXTERN_CVAR (Int, team) @@ -457,12 +458,14 @@ CCMD (invdrop) if (players[consoleplayer].mo) { SendItemDrop = players[consoleplayer].mo->InvSel; + SendItemDropAmount = -1; } } CCMD (weapdrop) { SendItemDrop = players[consoleplayer].ReadyWeapon; + SendItemDropAmount = -1; } CCMD (drop) @@ -470,6 +473,7 @@ CCMD (drop) if (argv.argc() > 1 && who != NULL) { SendItemDrop = who->FindInventory(argv[1]); + SendItemDropAmount = argv.argc() > 2 ? atoi(argv[2]) : -1; } } @@ -762,6 +766,7 @@ void G_BuildTiccmd (ticcmd_t *cmd) { Net_WriteByte (DEM_INVDROP); Net_WriteLong (SendItemDrop->InventoryID); + Net_WriteLong(SendItemDropAmount); SendItemDrop = NULL; } diff --git a/src/g_game.h b/src/g_game.h index 0a11527fd7..f3f7740398 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -94,6 +94,7 @@ extern AActor *bodyque[BODYQUESIZE]; extern int bodyqueslot; class AInventory; extern const AInventory *SendItemUse, *SendItemDrop; +extern int SendItemDropAmount; #endif diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index f9a62892a9..e2f7b18c35 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -1035,14 +1035,14 @@ DEFINE_ACTION_FUNCTION(AActor, UseInventory) // //=========================================================================== -AInventory *AActor::DropInventory (AInventory *item) +AInventory *AActor::DropInventory (AInventory *item, int amt) { AInventory *drop = nullptr; IFVIRTUALPTR(item, AInventory, CreateTossable) { - VMValue params[1] = { (DObject*)item }; + VMValue params[] = { (DObject*)item, amt }; VMReturn ret((void**)&drop); - GlobalVMStack.Call(func, params, 1, &ret, 1, nullptr); + GlobalVMStack.Call(func, params, countof(params), &ret, 1, nullptr); } if (drop == nullptr) return NULL; drop->SetOrigin(PosPlusZ(10.), false); @@ -1059,7 +1059,8 @@ DEFINE_ACTION_FUNCTION(AActor, DropInventory) { PARAM_SELF_PROLOGUE(AActor); PARAM_OBJECT_NOT_NULL(item, AInventory); - ACTION_RETURN_OBJECT(self->DropInventory(item)); + PARAM_INT(amt); + ACTION_RETURN_OBJECT(self->DropInventory(item, amt)); } //============================================================================ diff --git a/wadsrc/static/zscript/inventory/ammo.txt b/wadsrc/static/zscript/inventory/ammo.txt index ba087a8942..e742e806d9 100644 --- a/wadsrc/static/zscript/inventory/ammo.txt +++ b/wadsrc/static/zscript/inventory/ammo.txt @@ -173,9 +173,9 @@ class Ammo : Inventory // //=========================================================================== - override Inventory CreateTossable() + override Inventory CreateTossable(int amt) { - Inventory copy = Super.CreateTossable(); + Inventory copy = Super.CreateTossable(amt); if (copy != null) { // Do not increase ammo by dropping it and picking it back up at // certain skill levels. @@ -306,9 +306,9 @@ class BackpackItem : Inventory // //=========================================================================== - override Inventory CreateTossable () + override Inventory CreateTossable (int amount) { - let pack = BackpackItem(Super.CreateTossable()); + let pack = BackpackItem(Super.CreateTossable(-1)); if (pack != NULL) { pack.bDepleted = true; diff --git a/wadsrc/static/zscript/inventory/armor.txt b/wadsrc/static/zscript/inventory/armor.txt index 50161e8af2..ae9ab562e2 100644 --- a/wadsrc/static/zscript/inventory/armor.txt +++ b/wadsrc/static/zscript/inventory/armor.txt @@ -489,7 +489,7 @@ class HexenArmor : Armor // //=========================================================================== - override Inventory CreateTossable () + override Inventory CreateTossable (int amount) { return NULL; } diff --git a/wadsrc/static/zscript/inventory/health.txt b/wadsrc/static/zscript/inventory/health.txt index 88bf6b133c..230b3575be 100644 --- a/wadsrc/static/zscript/inventory/health.txt +++ b/wadsrc/static/zscript/inventory/health.txt @@ -120,9 +120,9 @@ class HealthPickup : Inventory // //=========================================================================== - override Inventory CreateTossable () + override Inventory CreateTossable (int amount) { - Inventory copy = Super.CreateTossable (); + Inventory copy = Super.CreateTossable (-1); if (copy != NULL) { copy.health = health; diff --git a/wadsrc/static/zscript/inventory/inventory.txt b/wadsrc/static/zscript/inventory/inventory.txt index 28b20cdd5d..06caedad73 100644 --- a/wadsrc/static/zscript/inventory/inventory.txt +++ b/wadsrc/static/zscript/inventory/inventory.txt @@ -440,7 +440,7 @@ class Inventory : Actor native // //=========================================================================== - virtual Inventory CreateTossable () + virtual Inventory CreateTossable (int amt = -1) { // If self actor lacks a SpawnState, don't drop it. (e.g. A base weapon // like the fist can't be dropped because you'll never see it.) @@ -448,7 +448,7 @@ class Inventory : Actor native { return NULL; } - if (bUndroppable || bUntossable || Owner == NULL || Amount <= 0) + if (bUndroppable || bUntossable || Owner == NULL || Amount <= 0 || amt == 0) { return NULL; } @@ -462,11 +462,13 @@ class Inventory : Actor native let copy = Inventory(Spawn (GetClass(), Owner.Pos, NO_REPLACE)); if (copy != NULL) { + amt = clamp(amt, 1, Amount); + copy.MaxAmount = MaxAmount; - copy.Amount = 1; + copy.Amount = amt; copy.DropTime = 30; copy.bSpecial = copy.bSolid = false; - Amount--; + Amount -= amt; } return copy; } diff --git a/wadsrc/static/zscript/inventory/powerups.txt b/wadsrc/static/zscript/inventory/powerups.txt index 828113ac8b..346f3d1a76 100644 --- a/wadsrc/static/zscript/inventory/powerups.txt +++ b/wadsrc/static/zscript/inventory/powerups.txt @@ -174,7 +174,7 @@ class Powerup : Inventory // //=========================================================================== - override Inventory CreateTossable () + override Inventory CreateTossable (int amount) { return NULL; } diff --git a/wadsrc/static/zscript/inventory/weapons.txt b/wadsrc/static/zscript/inventory/weapons.txt index c1fbf43846..c76aaef54c 100644 --- a/wadsrc/static/zscript/inventory/weapons.txt +++ b/wadsrc/static/zscript/inventory/weapons.txt @@ -435,7 +435,7 @@ class Weapon : StateProvider native // //=========================================================================== - override Inventory CreateTossable () + override Inventory CreateTossable (int amt) { // Only drop the weapon that is meant to be placed in a level. That is, // only drop the weapon that normally gives you ammo. @@ -443,9 +443,9 @@ class Weapon : StateProvider native Default.AmmoGive1 == 0 && Default.AmmoGive2 == 0 && (SisterWeapon.Default.AmmoGive1 > 0 || SisterWeapon.Default.AmmoGive2 > 0)) { - return SisterWeapon.CreateTossable (); + return SisterWeapon.CreateTossable (amt); } - let copy = Weapon(Super.CreateTossable ()); + let copy = Weapon(Super.CreateTossable (-1)); if (copy != NULL) { diff --git a/wadsrc/static/zscript/strife/coin.txt b/wadsrc/static/zscript/strife/coin.txt index b6a83ecf2a..6f7815cac2 100644 --- a/wadsrc/static/zscript/strife/coin.txt +++ b/wadsrc/static/zscript/strife/coin.txt @@ -79,7 +79,7 @@ class Coin : Inventory // //=========================================================================== - override Inventory CreateTossable () + override Inventory CreateTossable (int amt) { Coin tossed; @@ -87,17 +87,20 @@ class Coin : Inventory { return NULL; } - if (Amount >= 50) + if (amt == -1) amt = Amount >= 50? 50 : Amount >= 25? 25 : Amount >= 10? 10 : 1; + else if (amt > Amount) amt = Amount; + if (amt > 25) { - Amount -= 50; + Amount -= amt; tossed = Coin(Spawn("Gold50")); + tossed.Amount = amt; } - else if (Amount >= 25) + else if (amt > 10) { Amount -= 25; tossed = Coin(Spawn("Gold25")); } - else if (Amount >= 10) + else if (amt > 1) { Amount -= 10; tossed = Coin(Spawn("Gold10"));