2026-02-12 22:56:36 -08:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
|
#include <string>
|
|
|
|
|
#include <unordered_map>
|
|
|
|
|
|
|
|
|
|
namespace wowee {
|
|
|
|
|
namespace game {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Logical update field identifiers (expansion-agnostic).
|
|
|
|
|
* Wire indices are loaded at runtime from JSON.
|
|
|
|
|
*/
|
|
|
|
|
enum class UF : uint16_t {
|
|
|
|
|
// Object fields
|
|
|
|
|
OBJECT_FIELD_ENTRY,
|
feat: propagate OBJECT_FIELD_SCALE_X through creature and GO spawn pipeline
Reads OBJECT_FIELD_SCALE_X (field 4, cross-expansion) from CREATE_OBJECT
update fields and passes it through the full creature and game object spawn
chain: game_handler callbacks → pending spawn structs → async load results
→ createInstance() calls. This gives boss giants, gnomes, children, and
other non-unit-scale NPCs correct visual size, and ensures scaled GOs
(e.g. large treasure chests, oversized plants) render at the server-specified
scale rather than always at 1.0.
- Added OBJECT_FIELD_SCALE_X to UF enum and all expansion update_fields.json
- Added float scale to CreatureSpawnCallback and GameObjectSpawnCallback
- Propagated scale through PendingCreatureSpawn, PreparedCreatureModel,
PendingGameObjectSpawn, PreparedGameObjectWMO
- Used scale in charRenderer/m2Renderer/wmoRenderer createInstance() calls
- Sanity-clamped raw float to [0.01, 100.0] range before use
2026-03-10 22:45:47 -07:00
|
|
|
OBJECT_FIELD_SCALE_X,
|
2026-02-12 22:56:36 -08:00
|
|
|
|
|
|
|
|
// Unit fields
|
|
|
|
|
UNIT_FIELD_TARGET_LO,
|
|
|
|
|
UNIT_FIELD_TARGET_HI,
|
2026-02-13 19:40:54 -08:00
|
|
|
UNIT_FIELD_BYTES_0,
|
2026-02-12 22:56:36 -08:00
|
|
|
UNIT_FIELD_HEALTH,
|
|
|
|
|
UNIT_FIELD_POWER1,
|
|
|
|
|
UNIT_FIELD_MAXHEALTH,
|
|
|
|
|
UNIT_FIELD_MAXPOWER1,
|
|
|
|
|
UNIT_FIELD_LEVEL,
|
|
|
|
|
UNIT_FIELD_FACTIONTEMPLATE,
|
|
|
|
|
UNIT_FIELD_FLAGS,
|
|
|
|
|
UNIT_FIELD_FLAGS_2,
|
|
|
|
|
UNIT_FIELD_DISPLAYID,
|
|
|
|
|
UNIT_FIELD_MOUNTDISPLAYID,
|
Fix mount sounds, grey WMO meshes, taxi landing, tree animations, and classic dismount
- Per-family mount sounds (kodo, tallstrider, mechanostrider, etc.) detected from M2 model path
- Skip WMO groups with SHOW_SKYBOX flag or all-untextured batches (grey mesh in Orgrimmar)
- Freeze physics during taxi landing until terrain loads to prevent falling through void
- Disable bone animations on tropical vegetation (palm, bamboo, banana, etc.) to fix wiggling
- Snap player to final taxi waypoint on flight completion
- Extract mount aura spell ID from classic UNIT_FIELD_AURAS for CMSG_CANCEL_AURA dismount
- Increase /unstuck forward nudge to 5 units
2026-02-14 21:04:20 -08:00
|
|
|
UNIT_FIELD_AURAS, // Start of aura spell ID array (48 consecutive uint32 slots, classic/vanilla only)
|
2026-02-12 22:56:36 -08:00
|
|
|
UNIT_NPC_FLAGS,
|
|
|
|
|
UNIT_DYNAMIC_FLAGS,
|
2026-02-19 17:45:09 -08:00
|
|
|
UNIT_FIELD_RESISTANCES, // Physical armor (index 0 of the resistance array)
|
2026-03-10 23:08:15 -07:00
|
|
|
UNIT_FIELD_STAT0, // Strength (effective base, includes items)
|
|
|
|
|
UNIT_FIELD_STAT1, // Agility
|
|
|
|
|
UNIT_FIELD_STAT2, // Stamina
|
|
|
|
|
UNIT_FIELD_STAT3, // Intellect
|
|
|
|
|
UNIT_FIELD_STAT4, // Spirit
|
2026-02-12 22:56:36 -08:00
|
|
|
UNIT_END,
|
|
|
|
|
|
|
|
|
|
// Player fields
|
|
|
|
|
PLAYER_FLAGS,
|
2026-02-13 19:40:54 -08:00
|
|
|
PLAYER_BYTES,
|
|
|
|
|
PLAYER_BYTES_2,
|
2026-02-12 22:56:36 -08:00
|
|
|
PLAYER_XP,
|
|
|
|
|
PLAYER_NEXT_LEVEL_XP,
|
2026-03-10 07:35:30 -07:00
|
|
|
PLAYER_REST_STATE_EXPERIENCE,
|
2026-02-12 22:56:36 -08:00
|
|
|
PLAYER_FIELD_COINAGE,
|
|
|
|
|
PLAYER_QUEST_LOG_START,
|
|
|
|
|
PLAYER_FIELD_INV_SLOT_HEAD,
|
|
|
|
|
PLAYER_FIELD_PACK_SLOT_1,
|
Implement bank, guild bank, and auction house systems
Add 27 new opcodes, packet builders/parsers, handler methods, inventory
extension with 28 bank slots + 7 bank bags, and UI windows for personal
bank, guild bank (6 tabs x 98 slots), and auction house (browse/sell/bid).
Fix Classic gossip parser to omit boxMoney/boxText fields not present in
Vanilla protocol, fix gossip icon labels with text-based NPC type detection,
and add Turtle WoW opcode mappings for bank and auction interactions.
2026-02-16 21:11:18 -08:00
|
|
|
PLAYER_FIELD_BANK_SLOT_1,
|
|
|
|
|
PLAYER_FIELD_BANKBAG_SLOT_1,
|
2026-02-12 22:56:36 -08:00
|
|
|
PLAYER_SKILL_INFO_START,
|
|
|
|
|
PLAYER_EXPLORED_ZONES_START,
|
|
|
|
|
|
|
|
|
|
// GameObject fields
|
|
|
|
|
GAMEOBJECT_DISPLAYID,
|
|
|
|
|
|
|
|
|
|
// Item fields
|
|
|
|
|
ITEM_FIELD_STACK_COUNT,
|
2026-03-10 16:21:09 -07:00
|
|
|
ITEM_FIELD_DURABILITY,
|
|
|
|
|
ITEM_FIELD_MAXDURABILITY,
|
2026-02-12 22:56:36 -08:00
|
|
|
|
2026-02-13 22:14:34 -08:00
|
|
|
// Container fields
|
|
|
|
|
CONTAINER_FIELD_NUM_SLOTS,
|
|
|
|
|
CONTAINER_FIELD_SLOT_1,
|
|
|
|
|
|
2026-02-12 22:56:36 -08:00
|
|
|
COUNT
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Maps logical update field names to expansion-specific wire indices.
|
|
|
|
|
* Loaded from JSON (e.g. Data/expansions/wotlk/update_fields.json).
|
|
|
|
|
*/
|
|
|
|
|
class UpdateFieldTable {
|
|
|
|
|
public:
|
|
|
|
|
/** Load from JSON file. Returns true if successful. */
|
|
|
|
|
bool loadFromJson(const std::string& path);
|
|
|
|
|
|
|
|
|
|
/** Get the wire index for a logical field. Returns 0xFFFF if unknown. */
|
|
|
|
|
uint16_t index(UF field) const;
|
|
|
|
|
|
2026-02-13 19:47:49 -08:00
|
|
|
/** Override a wire index at runtime (used for auto-detecting custom field layouts). */
|
|
|
|
|
void setIndex(UF field, uint16_t idx) { fieldMap_[static_cast<uint16_t>(field)] = idx; }
|
|
|
|
|
|
2026-02-12 22:56:36 -08:00
|
|
|
/** Check if a field is mapped. */
|
|
|
|
|
bool hasField(UF field) const;
|
|
|
|
|
|
|
|
|
|
/** Number of mapped fields. */
|
|
|
|
|
size_t size() const { return fieldMap_.size(); }
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::unordered_map<uint16_t, uint16_t> fieldMap_; // UF enum → wire index
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Global active update field table (set by Application at startup).
|
|
|
|
|
*/
|
|
|
|
|
void setActiveUpdateFieldTable(const UpdateFieldTable* table);
|
|
|
|
|
const UpdateFieldTable* getActiveUpdateFieldTable();
|
|
|
|
|
|
|
|
|
|
/** Convenience: get wire index for a logical field. */
|
|
|
|
|
inline uint16_t fieldIndex(UF field) {
|
|
|
|
|
const auto* t = getActiveUpdateFieldTable();
|
|
|
|
|
return t ? t->index(field) : 0xFFFF;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace game
|
|
|
|
|
} // namespace wowee
|