📄 dbcstores.h
字号:
//uint32 aunk3;
//uint32 aunk4;
//uint32 aunk5;
//uint32 aunk6;
//uint32 aunk7;
//uint32 aunk8;
//uint32 aunk9;
//uint32 aunk10;
//uint32 aunk11;
//uint32 aunk12;
//uint32 aunk13;
//uint32 aunk14;
//uint32 aunk15;
//uint32 aunk16;
//uint32 aunk17;
//uint32 aunk18;
//uint32 aunk19;
//uint32 aunk20;
//uint32 aunk21;
//uint32 aunk22;
//uint32 aunk23;
//uint32 aunk24;
//uint32 bunk1;
//uint32 bunk2;
//uint32 bunk3;
//uint32 bunk4;
//uint32 bunk5;
//uint32 bunk6;
//uint32 bunk7;
//uint32 bunk8;
//uint32 bunk9;
//uint32 bunk10;
//uint32 bunk11;
//uint32 bunk12;
//uint32 bunk13;
//uint32 bunk14;
//uint32 bunk15;
//uint32 bunk16;
//uint32 bunk17;
//uint32 bunk18;
//uint32 bunk19;
//uint32 bunk20;
//uint32 bunk21;
//uint32 bunk22;
//uint32 bunk23;
//uint32 bunk24;
};
struct ItemRandomSuffixEntry
{
uint32 id;
uint32 enchantments[3];
uint32 prefixes[3];
};
struct gtFloat
{
float val;
};
struct CombatRatingDBC
{
float val;
};
struct ChatChannelDBC
{
uint32 id;
uint32 flags;
};
struct DurabilityQualityEntry
{
uint32 id;
float quality_modifier;
};
struct DurabilityCostsEntry
{
uint32 itemlevel;
uint32 modifier[29];
};
struct AreaTriggerEntry
{
uint32 id; // 0
uint32 mapid; // 1
float x; // 2
float y; // 3
float z; // 4
float o; // 5
float box_x; // 6 extent x edge
float box_y; // 7 extent y edge
float box_z; // 8 extent z edge
float box_o; // 9 extent rotation by about z axis
};
#pragma pack(pop)
ASCENT_INLINE float GetRadius(SpellRadius *radius)
{
return radius->Radius;
}
ASCENT_INLINE uint32 GetCastTime(SpellCastTime *time)
{
return time->CastTime;
}
ASCENT_INLINE float GetMaxRange(SpellRange *range)
{
return range->maxRange;
}
ASCENT_INLINE float GetMinRange(SpellRange *range)
{
return range->minRange;
}
ASCENT_INLINE uint32 GetDuration(SpellDuration *dur)
{
return dur->Duration1;
}
#define SAFE_DBC_CODE_RETURNS /* undefine this to make out of range/nulls return null. */
template<class T>
class SERVER_DECL DBCStorage
{
T * m_heapBlock;
T * m_firstEntry;
T ** m_entries;
uint32 m_max;
uint32 m_numrows;
uint32 m_stringlength;
char * m_stringData;
uint32 rows;
uint32 cols;
uint32 useless_shit;
uint32 header;
public:
DBCStorage()
{
m_heapBlock = NULL;
m_entries = NULL;
m_firstEntry = NULL;
m_max = 0;
m_numrows = 0;
m_stringlength=0;
m_stringData = NULL;
}
~DBCStorage()
{
if(m_heapBlock)
free(m_heapBlock);
if(m_entries)
free(m_entries);
if( m_stringData != NULL )
free(m_stringData);
}
bool Load(const char * filename, const char * format, bool load_indexed, bool load_strings)
{
uint32 i;
uint32 string_length;
long pos;
FILE * f = fopen(filename, "rb");
if(f == NULL)
return false;
/* read the number of rows, and allocate our block on the heap */
fread(&header,4,1,f);
fread(&rows, 4, 1, f);
fread(&cols, 4, 1, f);
fread(&useless_shit, 4, 1, f);
fread(&string_length, 4, 1, f);
pos = ftell(f);
#ifdef USING_BIG_ENDIAN
swap32(&rows); swap32(&cols); swap32(&useless_shit); swap32(&string_length);
#endif
if( load_strings )
{
fseek( f, 20 + ( rows * cols * 4 ), SEEK_SET );
m_stringData = (char*)malloc(string_length);
m_stringlength = string_length;
fread( m_stringData, string_length, 1, f );
}
fseek(f, pos, SEEK_SET);
m_heapBlock = (T*)malloc(rows * sizeof(T));
ASSERT(m_heapBlock);
/* read the data for each row */
for(i = 0; i < rows; ++i)
{
memset(&m_heapBlock[i], 0, sizeof(T));
ReadEntry(f, &m_heapBlock[i], format, cols, filename);
if(load_indexed)
{
/* all the time the first field in the dbc is our unique entry */
if(*(uint32*)&m_heapBlock[i] > m_max)
m_max = *(uint32*)&m_heapBlock[i];
}
}
if(load_indexed)
{
m_entries = (T**)malloc(sizeof(T*) * (m_max+1));
ASSERT(m_entries);
memset(m_entries, 0, (sizeof(T*) * (m_max+1)));
for(i = 0; i < rows; ++i)
{
if(m_firstEntry == NULL)
m_firstEntry = &m_heapBlock[i];
m_entries[*(uint32*)&m_heapBlock[i]] = &m_heapBlock[i];
}
}
m_numrows = rows;
fclose(f);
return true;
}
void ReadEntry(FILE * f, T * dest, const char * format, uint32 cols, const char * filename)
{
const char * t = format;
uint32 * dest_ptr = (uint32*)dest;
uint32 c = 0;
uint32 val;
size_t len = strlen(format);
if(len!= cols)
printf("!!! possible invalid format in file %s (us: %zd, them: %u)\n", filename, len, cols);
while(*t != 0)
{
if((++c) > cols)
{
++t;
printf("!!! Read buffer overflow in DBC reading of file %s\n", filename);
continue;
}
fread(&val, 4, 1, f);
if(*t == 'x')
{
++t;
continue; // skip!
}
#ifdef USING_BIG_ENDIAN
swap32(&val);
#endif
if(*t == 's')
{
char ** new_ptr = (char**)dest_ptr;
static const char * null_str = "";
char * ptr;
if( val < m_stringlength )
ptr = m_stringData + val;
else
ptr = (char*)null_str;
*new_ptr = ptr;
new_ptr++;
dest_ptr = (uint32*)new_ptr;
}
else
{
*dest_ptr = val;
dest_ptr++;
}
++t;
}
}
ASCENT_INLINE uint32 GetNumRows()
{
return m_numrows;
}
T * LookupEntryForced(uint32 i)
{
#if 0
if(m_entries)
{
if(i > m_max || m_entries[i] == NULL)
{
printf("LookupEntryForced failed for entry %u\n", i);
return NULL;
}
else
return m_entries[i];
}
else
{
if(i >= m_numrows)
return NULL;
else
return &m_heapBlock[i];
}
#else
if(m_entries)
{
if(i > m_max || m_entries[i] == NULL)
return NULL;
else
return m_entries[i];
}
else
{
if(i >= m_numrows)
return NULL;
else
return &m_heapBlock[i];
}
#endif
}
T * CreateCopy(T * obj)
{
T * oCopy = (T*)malloc(sizeof(T));
ASSERT(oCopy);
memcpy(oCopy,obj,sizeof(T));
return oCopy;
}
void SetRow(uint32 i, T * t)
{
if(i < m_max && m_entries)
m_entries[i] = t;
}
#ifdef SAFE_DBC_CODE_RETURNS
T * LookupEntry(uint32 i)
{
if(m_entries)
{
if(i > m_max || m_entries[i] == NULL)
return m_firstEntry;
else
return m_entries[i];
}
else
{
if(i >= m_numrows)
return &m_heapBlock[0];
else
return &m_heapBlock[i];
}
}
T * LookupRow(uint32 i)
{
if(i >= m_numrows)
return &m_heapBlock[0];
else
return &m_heapBlock[i];
}
#else
T * LookupEntry(uint32 i)
{
if(m_entries)
{
if(i > m_max || m_entries[i] == NULL)
return NULL;
else
return m_entries[i];
}
else
{
if(i >= m_numrows)
return NULL;
else
return m_heapBlock[i];
}
}
T * LookupRow(uint32 i)
{
if(i >= m_numrows)
return NULL;
else
return m_heapBlock[i];
}
#endif
};
extern SERVER_DECL DBCStorage<GemPropertyEntry> dbcGemProperty;
extern SERVER_DECL DBCStorage<ItemSetEntry> dbcItemSet;
extern SERVER_DECL DBCStorage<Lock> dbcLock;
extern SERVER_DECL DBCStorage<SpellEntry> dbcSpell;
extern SERVER_DECL DBCStorage<SpellDuration> dbcSpellDuration;
extern SERVER_DECL DBCStorage<SpellRange> dbcSpellRange;
extern SERVER_DECL DBCStorage<emoteentry> dbcEmoteEntry;
extern SERVER_DECL DBCStorage<SpellRadius> dbcSpellRadius;
extern SERVER_DECL DBCStorage<SpellCastTime> dbcSpellCastTime;
extern SERVER_DECL DBCStorage<AreaTable> dbcArea;
extern SERVER_DECL DBCStorage<FactionTemplateDBC> dbcFactionTemplate;
extern SERVER_DECL DBCStorage<FactionDBC> dbcFaction;
extern SERVER_DECL DBCStorage<EnchantEntry> dbcEnchant;
extern SERVER_DECL DBCStorage<RandomProps> dbcRandomProps;
extern SERVER_DECL DBCStorage<skilllinespell> dbcSkillLineSpell;
extern SERVER_DECL DBCStorage<skilllineentry> dbcSkillLine;
extern SERVER_DECL DBCStorage<DBCTaxiNode> dbcTaxiNode;
extern SERVER_DECL DBCStorage<DBCTaxiPath> dbcTaxiPath;
extern SERVER_DECL DBCStorage<DBCTaxiPathNode> dbcTaxiPathNode;
extern SERVER_DECL DBCStorage<AuctionHouseDBC> dbcAuctionHouse;
extern SERVER_DECL DBCStorage<TalentEntry> dbcTalent;
extern SERVER_DECL DBCStorage<TalentTabEntry> dbcTalentTab;
extern SERVER_DECL DBCStorage<CreatureSpellDataEntry> dbcCreatureSpellData;
extern SERVER_DECL DBCStorage<CreatureFamilyEntry> dbcCreatureFamily;
extern SERVER_DECL DBCStorage<CharClassEntry> dbcCharClass;
extern SERVER_DECL DBCStorage<CharRaceEntry> dbcCharRace;
extern SERVER_DECL DBCStorage<MapEntry> dbcMap;
extern SERVER_DECL DBCStorage<ItemExtendedCostEntry> dbcItemExtendedCost;
extern SERVER_DECL DBCStorage<ItemRandomSuffixEntry> dbcItemRandomSuffix;
extern SERVER_DECL DBCStorage<CombatRatingDBC> dbcCombatRating;
extern SERVER_DECL DBCStorage<ChatChannelDBC> dbcChatChannels;
extern SERVER_DECL DBCStorage<DurabilityCostsEntry> dbcDurabilityCosts;
extern SERVER_DECL DBCStorage<DurabilityQualityEntry> dbcDurabilityQuality;
extern SERVER_DECL DBCStorage<BankSlotPrice> dbcBankSlotPrices;
extern SERVER_DECL DBCStorage<BankSlotPrice> dbcStableSlotPrices; //uses same structure as Bank
extern SERVER_DECL DBCStorage<gtFloat> dbcMeleeCrit;
extern SERVER_DECL DBCStorage<gtFloat> dbcMeleeCritBase;
extern SERVER_DECL DBCStorage<gtFloat> dbcSpellCrit;
extern SERVER_DECL DBCStorage<gtFloat> dbcSpellCritBase;
extern SERVER_DECL DBCStorage<gtFloat> dbcManaRegen;
extern SERVER_DECL DBCStorage<gtFloat> dbcManaRegenBase;
extern SERVER_DECL DBCStorage<gtFloat> dbcHPRegen;
extern SERVER_DECL DBCStorage<gtFloat> dbcHPRegenBase;
extern SERVER_DECL DBCStorage<AreaTriggerEntry> dbcAreaTrigger;
bool LoadDBCs();
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -