mirror of
https://github.com/azerothcore/mod-transmog
synced 2025-11-29 22:48:30 +08:00
155 lines
4.9 KiB
C++
155 lines
4.9 KiB
C++
#ifndef DEF_TRANSMOGRIFICATION_H
|
|
#define DEF_TRANSMOGRIFICATION_H
|
|
|
|
#include <vector>
|
|
#include "Player.h"
|
|
#include "Config.h"
|
|
#include "ScriptMgr.h"
|
|
#include "ScriptedGossip.h"
|
|
#include "GameEventMgr.h"
|
|
#include <unordered_map>
|
|
|
|
#define PRESETS // comment this line to disable preset feature totally
|
|
#define MAX_OPTIONS 25 // do not alter
|
|
|
|
class Item;
|
|
class Player;
|
|
class WorldSession;
|
|
struct ItemTemplate;
|
|
|
|
enum TransmogAcoreStrings // Language.h might have same entries, appears when executing SQL, change if needed
|
|
{
|
|
LANG_ERR_TRANSMOG_OK = 11100, // change this
|
|
LANG_ERR_TRANSMOG_INVALID_SLOT,
|
|
LANG_ERR_TRANSMOG_INVALID_SRC_ENTRY,
|
|
LANG_ERR_TRANSMOG_MISSING_SRC_ITEM,
|
|
LANG_ERR_TRANSMOG_MISSING_DEST_ITEM,
|
|
LANG_ERR_TRANSMOG_INVALID_ITEMS,
|
|
LANG_ERR_TRANSMOG_NOT_ENOUGH_MONEY,
|
|
LANG_ERR_TRANSMOG_NOT_ENOUGH_TOKENS,
|
|
|
|
LANG_ERR_UNTRANSMOG_OK,
|
|
LANG_ERR_UNTRANSMOG_NO_TRANSMOGS,
|
|
|
|
#ifdef PRESETS
|
|
LANG_PRESET_ERR_INVALID_NAME,
|
|
#endif
|
|
};
|
|
|
|
class Transmogrification
|
|
{
|
|
public:
|
|
typedef unordered_map<uint64, uint64> transmogData;
|
|
typedef unordered_map<uint64, transmogData> transmogMap;
|
|
transmogMap entryMap; // entryMap[pGUID][iGUID] = entry
|
|
transmogData dataMap; // dataMap[iGUID] = pGUID
|
|
|
|
#ifdef PRESETS
|
|
bool EnableSetInfo;
|
|
uint32 SetNpcText;
|
|
|
|
typedef std::map<uint8, uint32> slotMap;
|
|
typedef std::map<uint8, slotMap> presetData;
|
|
typedef unordered_map<uint64, presetData> presetDataMap;
|
|
presetDataMap presetById; // presetById[pGUID][presetID][slot] = entry
|
|
typedef std::map<uint8, std::string> presetIdMap;
|
|
typedef unordered_map<uint64, presetIdMap> presetNameMap;
|
|
presetNameMap presetByName; // presetByName[pGUID][presetID] = presetName
|
|
|
|
void PresetTransmog(Player* player, Item* itemTransmogrified, uint32 fakeEntry, uint8 slot);
|
|
|
|
bool EnableSets;
|
|
uint8 MaxSets;
|
|
float SetCostModifier;
|
|
int32 SetCopperCost;
|
|
|
|
bool GetEnableSets() const;
|
|
uint8 GetMaxSets() const;
|
|
float GetSetCostModifier() const;
|
|
int32 GetSetCopperCost() const;
|
|
|
|
void LoadPlayerSets(uint64 pGUID);
|
|
void UnloadPlayerSets(uint64 pGUID);
|
|
#endif
|
|
|
|
bool EnableTransmogInfo;
|
|
uint32 TransmogNpcText;
|
|
|
|
// Use IsAllowed() and IsNotAllowed()
|
|
// these are thread unsafe, but assumed to be static data so it should be safe
|
|
std::set<uint32> Allowed;
|
|
std::set<uint32> NotAllowed;
|
|
|
|
float ScaledCostModifier;
|
|
int32 CopperCost;
|
|
|
|
bool RequireToken;
|
|
uint32 TokenEntry;
|
|
uint32 TokenAmount;
|
|
|
|
bool AllowPoor;
|
|
bool AllowCommon;
|
|
bool AllowUncommon;
|
|
bool AllowRare;
|
|
bool AllowEpic;
|
|
bool AllowLegendary;
|
|
bool AllowArtifact;
|
|
bool AllowHeirloom;
|
|
|
|
bool AllowMixedArmorTypes;
|
|
bool AllowMixedWeaponTypes;
|
|
bool AllowFishingPoles;
|
|
|
|
bool IgnoreReqRace;
|
|
bool IgnoreReqClass;
|
|
bool IgnoreReqSkill;
|
|
bool IgnoreReqSpell;
|
|
bool IgnoreReqLevel;
|
|
bool IgnoreReqEvent;
|
|
bool IgnoreReqStats;
|
|
|
|
bool IsAllowed(uint32 entry) const;
|
|
bool IsNotAllowed(uint32 entry) const;
|
|
bool IsAllowedQuality(uint32 quality) const;
|
|
bool IsRangedWeapon(uint32 Class, uint32 SubClass) const;
|
|
|
|
void LoadConfig(bool reload); // thread unsafe
|
|
|
|
std::string GetItemIcon(uint32 entry, uint32 width, uint32 height, int x, int y) const;
|
|
std::string GetSlotIcon(uint8 slot, uint32 width, uint32 height, int x, int y) const;
|
|
const char * GetSlotName(uint8 slot, WorldSession* session) const;
|
|
std::string GetItemLink(Item* item, WorldSession* session) const;
|
|
std::string GetItemLink(uint32 entry, WorldSession* session) const;
|
|
uint32 GetFakeEntry(uint64 itemGUID) const;
|
|
void UpdateItem(Player* player, Item* item) const;
|
|
void DeleteFakeEntry(Player* player, uint8 slot, Item* itemTransmogrified, SQLTransaction* trans = NULL);
|
|
void SetFakeEntry(Player* player, uint32 newEntry, uint8 slot, Item* itemTransmogrified);
|
|
|
|
TransmogAcoreStrings Transmogrify(Player* player, uint64 itemGUID, uint8 slot, /*uint32 newEntry, */bool no_cost = false);
|
|
bool CanTransmogrifyItemWithItem(Player* player, ItemTemplate const* destination, ItemTemplate const* source) const;
|
|
bool SuitableForTransmogrification(Player* player, ItemTemplate const* proto) const;
|
|
// bool CanBeTransmogrified(Item const* item);
|
|
// bool CanTransmogrify(Item const* item);
|
|
uint32 GetSpecialPrice(ItemTemplate const* proto) const;
|
|
|
|
void DeleteFakeFromDB(uint64 itemGUID, SQLTransaction* trans = NULL);
|
|
float GetScaledCostModifier() const;
|
|
int32 GetCopperCost() const;
|
|
|
|
bool GetRequireToken() const;
|
|
uint32 GetTokenEntry() const;
|
|
uint32 GetTokenAmount() const;
|
|
|
|
bool GetAllowMixedArmorTypes() const;
|
|
bool GetAllowMixedWeaponTypes() const;
|
|
|
|
// Config
|
|
bool GetEnableTransmogInfo() const;
|
|
uint32 GetTransmogNpcText() const;
|
|
bool GetEnableSetInfo() const;
|
|
uint32 GetSetNpcText() const;
|
|
};
|
|
#define sTransmogrification ACE_Singleton<Transmogrification, ACE_Null_Mutex>::instance()
|
|
|
|
#endif
|