mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-10 23:02:08 +00:00
- added a setinv cheat CCMD.
This commit is contained in:
parent
dd8963142f
commit
f70d0a6ced
10 changed files with 131 additions and 60 deletions
|
@ -714,6 +714,8 @@ public:
|
||||||
// Returns true if the initial item count is positive.
|
// Returns true if the initial item count is positive.
|
||||||
virtual bool TakeInventory (PClassActor *itemclass, int amount, bool fromdecorate = false, bool notakeinfinite = false);
|
virtual bool TakeInventory (PClassActor *itemclass, int amount, bool fromdecorate = false, bool notakeinfinite = false);
|
||||||
|
|
||||||
|
bool SetInventory(PClassActor *itemclass, int amount, bool beyondMax);
|
||||||
|
|
||||||
// Uses an item and removes it from the inventory.
|
// Uses an item and removes it from the inventory.
|
||||||
virtual bool UseInventory (AInventory *item);
|
virtual bool UseInventory (AInventory *item);
|
||||||
|
|
||||||
|
|
|
@ -422,6 +422,25 @@ CCMD (take)
|
||||||
Net_WriteLong (0);
|
Net_WriteLong (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CCMD(setinv)
|
||||||
|
{
|
||||||
|
if (CheckCheatmode() || argv.argc() < 2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Net_WriteByte(DEM_SETINV);
|
||||||
|
Net_WriteString(argv[1]);
|
||||||
|
if (argv.argc() > 2)
|
||||||
|
Net_WriteLong(atoi(argv[2]));
|
||||||
|
else
|
||||||
|
Net_WriteLong(0);
|
||||||
|
|
||||||
|
if (argv.argc() > 3)
|
||||||
|
Net_WriteByte(!!atoi(argv[3]));
|
||||||
|
else
|
||||||
|
Net_WriteByte(0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
CCMD (gameversion)
|
CCMD (gameversion)
|
||||||
{
|
{
|
||||||
Printf ("%s @ %s\nCommit %s\n", GetVersionString(), GetGitTime(), GetGitHash());
|
Printf ("%s @ %s\nCommit %s\n", GetVersionString(), GetGitTime(), GetGitHash());
|
||||||
|
|
|
@ -2207,6 +2207,12 @@ void Net_DoCommand (int type, uint8_t **stream, int player)
|
||||||
cht_Take (&players[player], s, ReadLong (stream));
|
cht_Take (&players[player], s, ReadLong (stream));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DEM_SETINV:
|
||||||
|
s = ReadString(stream);
|
||||||
|
i = ReadLong(stream);
|
||||||
|
cht_SetInv(&players[player], s, i, ReadByte(stream));
|
||||||
|
break;
|
||||||
|
|
||||||
case DEM_WARPCHEAT:
|
case DEM_WARPCHEAT:
|
||||||
{
|
{
|
||||||
int x, y, z;
|
int x, y, z;
|
||||||
|
@ -2727,6 +2733,10 @@ void Net_SkipCommand (int type, uint8_t **stream)
|
||||||
skip = strlen ((char *)(*stream)) + 5;
|
skip = strlen ((char *)(*stream)) + 5;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DEM_SETINV:
|
||||||
|
skip = strlen((char *)(*stream)) + 6;
|
||||||
|
break;
|
||||||
|
|
||||||
case DEM_NETEVENT:
|
case DEM_NETEVENT:
|
||||||
skip = strlen((char *)(*stream)) + 15;
|
skip = strlen((char *)(*stream)) + 15;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -160,7 +160,8 @@ enum EDemoCommand
|
||||||
DEM_REMOVE, // 68
|
DEM_REMOVE, // 68
|
||||||
DEM_FINISHGAME, // 69
|
DEM_FINISHGAME, // 69
|
||||||
DEM_NETEVENT, // 70 String: Event name, Byte: Arg count; each arg is a 4-byte int
|
DEM_NETEVENT, // 70 String: Event name, Byte: Arg count; each arg is a 4-byte int
|
||||||
DEM_MDK // 71 String: Damage type
|
DEM_MDK, // 71 String: Damage type
|
||||||
|
DEM_SETINV, // 72 SetInventory
|
||||||
};
|
};
|
||||||
|
|
||||||
// The following are implemented by cht_DoCheat in m_cheat.cpp
|
// The following are implemented by cht_DoCheat in m_cheat.cpp
|
||||||
|
|
|
@ -602,6 +602,30 @@ const char *cht_Morph (player_t *player, PClassActor *morphclass, bool quickundo
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cht_SetInv(player_t *player, const char *string, int amount, bool beyond)
|
||||||
|
{
|
||||||
|
if (!stricmp(string, "health"))
|
||||||
|
{
|
||||||
|
if (amount <= 0)
|
||||||
|
{
|
||||||
|
cht_Suicide(player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!beyond) amount = MIN(amount, player->mo->GetMaxHealth(true));
|
||||||
|
player->health = player->mo->health = amount;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto item = PClass::FindActor(string);
|
||||||
|
if (item != nullptr && item->IsDescendantOf(RUNTIME_CLASS(AInventory)))
|
||||||
|
{
|
||||||
|
player->mo->SetInventory(item, amount, beyond);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Printf("Unknown item \"%s\"\n", string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void cht_Give (player_t *player, const char *name, int amount)
|
void cht_Give (player_t *player, const char *name, int amount)
|
||||||
{
|
{
|
||||||
if (player->mo == nullptr) return;
|
if (player->mo == nullptr) return;
|
||||||
|
|
|
@ -35,6 +35,7 @@ void cht_DoMDK(player_t *player, const char *mod);
|
||||||
void cht_DoCheat (player_t *player, int cheat);
|
void cht_DoCheat (player_t *player, int cheat);
|
||||||
void cht_Give (player_t *player, const char *item, int amount=1);
|
void cht_Give (player_t *player, const char *item, int amount=1);
|
||||||
void cht_Take (player_t *player, const char *item, int amount=1);
|
void cht_Take (player_t *player, const char *item, int amount=1);
|
||||||
|
void cht_SetInv(player_t *player, const char *item, int amount = 1, bool beyondMax = false);
|
||||||
void cht_Suicide (player_t *player);
|
void cht_Suicide (player_t *player);
|
||||||
const char *cht_Morph (player_t *player, PClassActor *morphclass, bool quickundo);
|
const char *cht_Morph (player_t *player, PClassActor *morphclass, bool quickundo);
|
||||||
|
|
||||||
|
|
|
@ -2382,63 +2382,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_SetInventory)
|
||||||
{
|
{
|
||||||
mobj = mobj->player->mo;
|
mobj = mobj->player->mo;
|
||||||
}
|
}
|
||||||
|
ACTION_RETURN_BOOL(mobj->SetInventory(itemtype, amount, beyondMax));
|
||||||
AInventory *item = mobj->FindInventory(itemtype);
|
|
||||||
|
|
||||||
if (item != nullptr)
|
|
||||||
{
|
|
||||||
// A_SetInventory sets the absolute amount.
|
|
||||||
// Subtract or set the appropriate amount as necessary.
|
|
||||||
|
|
||||||
if (amount == item->Amount)
|
|
||||||
{
|
|
||||||
// Nothing was changed.
|
|
||||||
ACTION_RETURN_BOOL(false);
|
|
||||||
}
|
|
||||||
else if (amount <= 0)
|
|
||||||
{
|
|
||||||
//Remove it all.
|
|
||||||
res = (mobj->TakeInventory(itemtype, item->Amount, true, false));
|
|
||||||
ACTION_RETURN_BOOL(res);
|
|
||||||
}
|
|
||||||
else if (amount < item->Amount)
|
|
||||||
{
|
|
||||||
int amt = abs(item->Amount - amount);
|
|
||||||
res = (mobj->TakeInventory(itemtype, amt, true, false));
|
|
||||||
ACTION_RETURN_BOOL(res);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
item->Amount = (beyondMax ? amount : clamp(amount, 0, item->MaxAmount));
|
|
||||||
ACTION_RETURN_BOOL(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (amount <= 0)
|
|
||||||
{
|
|
||||||
ACTION_RETURN_BOOL(false);
|
|
||||||
}
|
|
||||||
item = static_cast<AInventory *>(Spawn(itemtype));
|
|
||||||
if (item == nullptr)
|
|
||||||
{
|
|
||||||
ACTION_RETURN_BOOL(false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
item->Amount = amount;
|
|
||||||
item->flags |= MF_DROPPED;
|
|
||||||
item->ItemFlags |= IF_IGNORESKILL;
|
|
||||||
item->ClearCounters();
|
|
||||||
if (!item->CallTryPickup(mobj))
|
|
||||||
{
|
|
||||||
item->Destroy();
|
|
||||||
ACTION_RETURN_BOOL(false);
|
|
||||||
}
|
|
||||||
ACTION_RETURN_BOOL(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ACTION_RETURN_BOOL(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
|
@ -920,6 +920,75 @@ DEFINE_ACTION_FUNCTION(AActor, TakeInventory)
|
||||||
ACTION_RETURN_BOOL(self->TakeInventory(item, amount, fromdecorate, notakeinfinite));
|
ACTION_RETURN_BOOL(self->TakeInventory(item, amount, fromdecorate, notakeinfinite));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool AActor::SetInventory(PClassActor *itemtype, int amount, bool beyondMax)
|
||||||
|
{
|
||||||
|
AInventory *item = FindInventory(itemtype);
|
||||||
|
|
||||||
|
if (item != nullptr)
|
||||||
|
{
|
||||||
|
// A_SetInventory sets the absolute amount.
|
||||||
|
// Subtract or set the appropriate amount as necessary.
|
||||||
|
|
||||||
|
if (amount == item->Amount)
|
||||||
|
{
|
||||||
|
// Nothing was changed.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (amount <= 0)
|
||||||
|
{
|
||||||
|
//Remove it all.
|
||||||
|
return TakeInventory(itemtype, item->Amount, true, false);
|
||||||
|
}
|
||||||
|
else if (amount < item->Amount)
|
||||||
|
{
|
||||||
|
int amt = abs(item->Amount - amount);
|
||||||
|
return TakeInventory(itemtype, amt, true, false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item->Amount = (beyondMax ? amount : clamp(amount, 0, item->MaxAmount));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (amount <= 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
item = static_cast<AInventory *>(Spawn(itemtype));
|
||||||
|
if (item == nullptr)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item->Amount = amount;
|
||||||
|
item->flags |= MF_DROPPED;
|
||||||
|
item->ItemFlags |= IF_IGNORESKILL;
|
||||||
|
item->ClearCounters();
|
||||||
|
if (!item->CallTryPickup(this))
|
||||||
|
{
|
||||||
|
item->Destroy();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFINE_ACTION_FUNCTION(AActor, SetInventory)
|
||||||
|
{
|
||||||
|
PARAM_SELF_PROLOGUE(AActor);
|
||||||
|
PARAM_CLASS_NOT_NULL(item, AInventory);
|
||||||
|
PARAM_INT(amount);
|
||||||
|
PARAM_BOOL_DEF(beyondMax);
|
||||||
|
ACTION_RETURN_BOOL(self->SetInventory(item, amount, beyondMax));
|
||||||
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
//
|
//
|
||||||
// AActor :: DestroyAllInventory
|
// AActor :: DestroyAllInventory
|
||||||
|
|
|
@ -61,7 +61,7 @@ const char *GetVersionString();
|
||||||
// Version identifier for network games.
|
// Version identifier for network games.
|
||||||
// Bump it every time you do a release unless you're certain you
|
// Bump it every time you do a release unless you're certain you
|
||||||
// didn't change anything that will affect sync.
|
// didn't change anything that will affect sync.
|
||||||
#define NETGAMEVERSION 233
|
#define NETGAMEVERSION 234
|
||||||
|
|
||||||
// Version stored in the ini's [LastRun] section.
|
// Version stored in the ini's [LastRun] section.
|
||||||
// Bump it if you made some configuration change that you want to
|
// Bump it if you made some configuration change that you want to
|
||||||
|
@ -71,7 +71,7 @@ const char *GetVersionString();
|
||||||
// Protocol version used in demos.
|
// Protocol version used in demos.
|
||||||
// Bump it if you change existing DEM_ commands or add new ones.
|
// Bump it if you change existing DEM_ commands or add new ones.
|
||||||
// Otherwise, it should be safe to leave it alone.
|
// Otherwise, it should be safe to leave it alone.
|
||||||
#define DEMOGAMEVERSION 0x21F
|
#define DEMOGAMEVERSION 0x220
|
||||||
|
|
||||||
// Minimum demo version we can play.
|
// Minimum demo version we can play.
|
||||||
// Bump it whenever you change or remove existing DEM_ commands.
|
// Bump it whenever you change or remove existing DEM_ commands.
|
||||||
|
|
|
@ -596,6 +596,7 @@ class Actor : Thinker native
|
||||||
native void RemoveInventory(Inventory inv);
|
native void RemoveInventory(Inventory inv);
|
||||||
native void ClearInventory();
|
native void ClearInventory();
|
||||||
native bool GiveInventory(class<Inventory> type, int amount, bool givecheat = false);
|
native bool GiveInventory(class<Inventory> type, int amount, bool givecheat = false);
|
||||||
|
native bool SetInventory(class<Inventory> itemclass, int amount, bool beyondMax = false);
|
||||||
native bool TakeInventory(class<Inventory> itemclass, int amount, bool fromdecorate = false, bool notakeinfinite = false);
|
native bool TakeInventory(class<Inventory> itemclass, int amount, bool fromdecorate = false, bool notakeinfinite = false);
|
||||||
native clearscope Inventory FindInventory(class<Inventory> itemtype, bool subclass = false) const;
|
native clearscope Inventory FindInventory(class<Inventory> itemtype, bool subclass = false) const;
|
||||||
native Inventory GiveInventoryType(class<Inventory> itemtype);
|
native Inventory GiveInventoryType(class<Inventory> itemtype);
|
||||||
|
|
Loading…
Reference in a new issue