From 331cbe0b028ce92d5e0d8b2d9bcf9bd1eb94b671 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 31 Jan 2026 00:37:49 +0100 Subject: [PATCH] Core/GameObjects: Implement new gameobject_template data20 for chests, consolidating all bool typed data columns --- .../world/master/2026_01_31_00_world.sql | 19 ++++++++++++++++ .../game/Entities/GameObject/GameObjectData.h | 22 ++++++------------- 2 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 sql/updates/world/master/2026_01_31_00_world.sql diff --git a/sql/updates/world/master/2026_01_31_00_world.sql b/sql/updates/world/master/2026_01_31_00_world.sql new file mode 100644 index 0000000000..ece9ff82f9 --- /dev/null +++ b/sql/updates/world/master/2026_01_31_00_world.sql @@ -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; diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h index e0adfa7d46..23d06d671c 100644 --- a/src/server/game/Entities/GameObject/GameObjectData.h +++ b/src/server/game/Entities/GameObject/GameObjectData.h @@ -27,7 +27,6 @@ #include #include -// 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(chest.ChestFlags)).HasFlag(GameObjectChestFlags::Consumable); + case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast(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(chest.ChestFlags)).HasFlag(GameObjectChestFlags::RequireLOS); + case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast(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(chest.ChestFlags)).HasFlag(GameObjectChestFlags::DamageImmuneOK); + case GAMEOBJECT_TYPE_CHEST: return !EnumFlag(static_cast(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(chest.ChestFlags)).HasFlag(GameObjectChestFlags::NotInCombat); + case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast(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(chest.ChestFlags)).HasFlag(GameObjectChestFlags::UseGroupLootRules); + case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast(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(chest.ChestFlags)).HasFlag(GameObjectChestFlags::GiganticAOI); + case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast(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(chest.ChestFlags)).HasFlag(GameObjectChestFlags::LargeAOI); + case GAMEOBJECT_TYPE_CHEST: return EnumFlag(static_cast(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;