Core/GameObjects: Implement new gameobject_template data20 for chests, consolidating all bool typed data columns

This commit is contained in:
Shauren
2026-01-31 00:37:49 +01:00
parent 26f7402502
commit 331cbe0b02
2 changed files with 26 additions and 15 deletions

View File

@@ -0,0 +1,19 @@
UPDATE `gameobject_template` SET `Data20`=0 WHERE `type`=3;
UPDATE `gameobject_template` SET `Data20`=`Data20`|0x0001 WHERE `type`=3 AND `Data3`!=0;
UPDATE `gameobject_template` SET `Data20`=`Data20`|0x0002 WHERE `type`=3 AND `Data10`!=0;
UPDATE `gameobject_template` SET `Data20`=`Data20`|0x0004 WHERE `type`=3 AND `Data11`!=0;
UPDATE `gameobject_template` SET `Data20`=`Data20`|0x0008 WHERE `type`=3 AND `Data12`!=0;
UPDATE `gameobject_template` SET `Data20`=`Data20`|0x0010 WHERE `type`=3 AND `Data13`!=0;
UPDATE `gameobject_template` SET `Data20`=`Data20`|0x0020 WHERE `type`=3 AND `Data15`!=0;
UPDATE `gameobject_template` SET `Data20`=`Data20`|0x0040 WHERE `type`=3 AND `Data16`!=0;
UPDATE `gameobject_template` SET `Data20`=`Data20`|0x0080 WHERE `type`=3 AND `Data21`!=0;
UPDATE `gameobject_template` SET `Data20`=`Data20`|0x0100 WHERE `type`=3 AND `Data22`!=0;
UPDATE `gameobject_template` SET `Data20`=`Data20`|0x0200 WHERE `type`=3 AND `Data27`!=0;
UPDATE `gameobject_template` SET `Data20`=`Data20`|0x0400 WHERE `type`=3 AND `Data28`!=0;
UPDATE `gameobject_template` SET `Data20`=`Data20`|0x0800 WHERE `type`=3 AND `Data31`!=0;
UPDATE `gameobject_template` SET `Data20`=`Data20`|0x1000 WHERE `type`=3 AND `Data34`!=0;
-- reset fields that were reused for something else
UPDATE `gameobject_template` SET `Data21`=0 WHERE `type`=3;
UPDATE `gameobject_template` SET `Data22`=0 WHERE `type`=3;

View File

@@ -27,7 +27,6 @@
#include <set>
#include <string>
// TODO: Reorder properly, this is temporary to fix compile
enum class GameObjectChestFlags : int32
{
Consumable = 0x0001,
@@ -891,8 +890,7 @@ struct GameObjectTemplate
{
switch (type)
{
case GAMEOBJECT_TYPE_CHEST: return chest.Unused != 0; // TODO: update database values and research flag order
// case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast<GameObjectChestFlags>(chest.ChestFlags)).HasFlag(GameObjectChestFlags::Consumable);
case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast<GameObjectChestFlags>(chest.ChestFlags)).HasFlag(GameObjectChestFlags::Consumable);
case GAMEOBJECT_TYPE_GOOBER: return goober.consumable != 0;
default: return false;
}
@@ -1019,8 +1017,7 @@ struct GameObjectTemplate
{
case GAMEOBJECT_TYPE_BUTTON: return button.requireLOS;
case GAMEOBJECT_TYPE_QUESTGIVER: return questgiver.requireLOS;
case GAMEOBJECT_TYPE_CHEST: return chest.Unused2; // TODO: update database values and research flag order
// case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast<GameObjectChestFlags>(chest.ChestFlags)).HasFlag(GameObjectChestFlags::RequireLOS);
case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast<GameObjectChestFlags>(chest.ChestFlags)).HasFlag(GameObjectChestFlags::RequireLOS);
case GAMEOBJECT_TYPE_TRAP: return trap.requireLOS;
case GAMEOBJECT_TYPE_GOOBER: return goober.requireLOS;
case GAMEOBJECT_TYPE_FLAGSTAND: return flagStand.requireLOS;
@@ -1078,8 +1075,7 @@ struct GameObjectTemplate
case GAMEOBJECT_TYPE_DOOR: return door.noDamageImmune;
case GAMEOBJECT_TYPE_BUTTON: return button.noDamageImmune;
case GAMEOBJECT_TYPE_QUESTGIVER: return questgiver.noDamageImmune;
case GAMEOBJECT_TYPE_CHEST: return !chest.OneTimeChestAccountFlag; // TODO: update database values and research flag order
// case GAMEOBJECT_TYPE_CHEST: return !EnumFlag(static_cast<GameObjectChestFlags>(chest.ChestFlags)).HasFlag(GameObjectChestFlags::DamageImmuneOK);
case GAMEOBJECT_TYPE_CHEST: return !EnumFlag(static_cast<GameObjectChestFlags>(chest.ChestFlags)).HasFlag(GameObjectChestFlags::DamageImmuneOK);
case GAMEOBJECT_TYPE_GOOBER: return goober.noDamageImmune;
case GAMEOBJECT_TYPE_FLAGSTAND: return flagStand.noDamageImmune;
case GAMEOBJECT_TYPE_FLAGDROP: return flagDrop.noDamageImmune;
@@ -1091,8 +1087,7 @@ struct GameObjectTemplate
{
switch (type)
{
case GAMEOBJECT_TYPE_CHEST: return chest.Unused4; // TODO: update database values and research flag order
//case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast<GameObjectChestFlags>(chest.ChestFlags)).HasFlag(GameObjectChestFlags::NotInCombat);
case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast<GameObjectChestFlags>(chest.ChestFlags)).HasFlag(GameObjectChestFlags::NotInCombat);
case GAMEOBJECT_TYPE_GATHERING_NODE: return gatheringNode.notInCombat;
default: return 0;
}
@@ -1153,8 +1148,7 @@ struct GameObjectTemplate
{
switch (type)
{
case GAMEOBJECT_TYPE_CHEST: return chest.Unused6 != 0; // TODO: update database values and research flag order
//case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast<GameObjectChestFlags>(chest.ChestFlags)).HasFlag(GameObjectChestFlags::UseGroupLootRules);
case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast<GameObjectChestFlags>(chest.ChestFlags)).HasFlag(GameObjectChestFlags::UseGroupLootRules);
default: return false;
}
}
@@ -1301,8 +1295,7 @@ struct GameObjectTemplate
case GAMEOBJECT_TYPE_DOOR: return door.GiganticAOI != 0;
case GAMEOBJECT_TYPE_BUTTON: return button.GiganticAOI != 0;
case GAMEOBJECT_TYPE_QUESTGIVER: return questgiver.GiganticAOI != 0;
case GAMEOBJECT_TYPE_CHEST: return chest.Unused8 != 0; // TODO: update database values and research flag order
// case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast<GameObjectChestFlags>(chest.ChestFlags)).HasFlag(GameObjectChestFlags::GiganticAOI);
case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast<GameObjectChestFlags>(chest.ChestFlags)).HasFlag(GameObjectChestFlags::GiganticAOI);
case GAMEOBJECT_TYPE_GENERIC: return generic.GiganticAOI != 0;
case GAMEOBJECT_TYPE_TRAP: return trap.GiganticAOI != 0;
case GAMEOBJECT_TYPE_SPELL_FOCUS: return spellFocus.GiganticAOI != 0;
@@ -1330,8 +1323,7 @@ struct GameObjectTemplate
{
switch (type)
{
case GAMEOBJECT_TYPE_CHEST: return chest.Unused9 != 0; // TODO: update database values and research flag order
// case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast<GameObjectChestFlags>(chest.ChestFlags)).HasFlag(GameObjectChestFlags::LargeAOI);
case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast<GameObjectChestFlags>(chest.ChestFlags)).HasFlag(GameObjectChestFlags::LargeAOI);
case GAMEOBJECT_TYPE_GENERIC: return generic.LargeAOI != 0;
case GAMEOBJECT_TYPE_GOOBER: return goober.LargeAOI != 0;
case GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY: return dungeonDifficulty.LargeAOI != 0;