aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/Creature.cpp11
-rw-r--r--src/game/Creature.h2
-rw-r--r--src/game/ObjectMgr.cpp9
-rw-r--r--src/game/SharedDefines.h2
-rw-r--r--src/game/SpellAuras.cpp7
-rw-r--r--src/game/Unit.cpp8
-rw-r--r--src/shared/Database/SQLStorage.cpp8
7 files changed, 30 insertions, 17 deletions
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index 6eecc3213fa..840af9b4591 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -277,6 +277,12 @@ bool Creature::InitEntry(uint32 Entry, uint32 team, const CreatureData *data )
SetEntry(Entry); // normal entry always
m_creatureInfo = cinfo; // map mode related always
+ // equal to player Race field, but creature does not have race
+ SetByteValue(UNIT_FIELD_BYTES_0, 0, 0);
+
+ // known valid are: CLASS_WARRIOR,CLASS_PALADIN,CLASS_ROGUE,CLASS_MAGE
+ SetByteValue(UNIT_FIELD_BYTES_0, 1, uint8(cinfo->unit_class));
+
// Cancel load if no model defined
if (!(cinfo->GetFirstValidModelId()))
{
@@ -1347,6 +1353,8 @@ void Creature::SelectLevel(const CreatureInfo *cinfo)
SetMaxPower(POWER_MANA, mana); //MAX Mana
SetPower(POWER_MANA, mana);
+ // TODO: set UNIT_FIELD_POWER*, for some creature class case (energy, etc)
+
SetModifierValue(UNIT_MOD_HEALTH, BASE_VALUE, health);
SetModifierValue(UNIT_MOD_MANA, BASE_VALUE, mana);
@@ -2120,9 +2128,6 @@ bool Creature::LoadCreaturesAddon(bool reload)
if (cainfo->mount != 0)
Mount(cainfo->mount);
- if (cainfo->bytes0 != 0)
- SetUInt32Value(UNIT_FIELD_BYTES_0, cainfo->bytes0);
-
if (cainfo->bytes1 != 0)
SetUInt32Value(UNIT_FIELD_BYTES_1, cainfo->bytes1);
diff --git a/src/game/Creature.h b/src/game/Creature.h
index eaf76942e58..017b617cb94 100644
--- a/src/game/Creature.h
+++ b/src/game/Creature.h
@@ -203,6 +203,7 @@ struct CreatureInfo
float dmg_multiplier;
uint32 baseattacktime;
uint32 rangeattacktime;
+ uint32 unit_class; // enum Classes. Note only 4 classes are known for creatures.
uint32 unit_flags; // enum UnitFlags mask values
uint32 dynamicflags;
uint32 family; // enum CreatureFamily values (optional)
@@ -318,7 +319,6 @@ struct CreatureDataAddon
{
uint32 guidOrEntry;
uint32 mount;
- uint32 bytes0;
uint32 bytes1;
uint32 bytes2;
uint32 emote;
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 0e684ee4213..440ee986f43 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -553,6 +553,12 @@ void ObjectMgr::LoadCreatureTemplates()
continue;
}
+ if(cInfo->unit_class != heroicInfo->unit_class)
+ {
+ sLog.outErrorDb("Creature (Entry: %u, class %u) has different `unit_class` in heroic mode (Entry: %u, class %u).",i, cInfo->unit_class, cInfo->HeroicEntry, heroicInfo->unit_class);
+ continue;
+ }
+
if(cInfo->npcflag != heroicInfo->npcflag)
{
sLog.outErrorDb("Creature (Entry: %u) listed in `creature_template_substitution` has different `npcflag` in heroic mode.",i);
@@ -629,6 +635,9 @@ void ObjectMgr::LoadCreatureTemplates()
const_cast<CreatureInfo*>(cInfo)->Modelid_H2 = 0;
}
+ if (cInfo->unit_class && ((1 << (cInfo->unit_class-1)) & CLASSMASK_ALL_CREATURES) == 0)
+ sLog.outErrorDb("Creature (Entry: %u) has invalid unit_class(%u) for creature_template", cInfo->Entry, cInfo->unit_class);
+
if(cInfo->dmgschool >= MAX_SPELL_SCHOOL)
{
sLog.outErrorDb("Creature (Entry: %u) has invalid spell school value (%u) in `dmgschool`",cInfo->Entry,cInfo->dmgschool);
diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h
index 8ccc820fa58..62d04b81646 100644
--- a/src/game/SharedDefines.h
+++ b/src/game/SharedDefines.h
@@ -91,6 +91,8 @@ enum Classes
(1<<(CLASS_MAGE-1)) |(1<<(CLASS_WARLOCK-1))|(1<<(CLASS_DRUID-1)) | \
(1<<(CLASS_DEATH_KNIGHT-1)) )
+#define CLASSMASK_ALL_CREATURES ((1<<(CLASS_WARRIOR-1)) | (1<<(CLASS_PALADIN-1)) | (1<<(CLASS_ROGUE-1)) | (1<<(CLASS_MAGE-1)) )
+
#define CLASSMASK_WAND_USERS ((1<<(CLASS_PRIEST-1))|(1<<(CLASS_MAGE-1))|(1<<(CLASS_WARLOCK-1)))
#define PLAYER_MAX_BATTLEGROUND_QUEUES 3
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index da2f2b8d7d8..bf760f6dea1 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -3683,8 +3683,9 @@ void AuraEffect::HandleAuraModPetTalentsPoints(bool Apply, bool Real, bool chang
CreatureInfo const *cinfo = ((Creature*)m_target)->GetCreatureInfo();
if(cinfo && cinfo->type == CREATURE_TYPE_DEMON)
{
+ //does not appear to have relevance. Why code added initially? See note below at !apply
//to prevent client crash
- m_target->SetFlag(UNIT_FIELD_BYTES_0, 2048);
+ //m_target->SetFlag(UNIT_FIELD_BYTES_0, 2048);
//just to enable stat window
charmInfo->SetPetNumber(objmgr.GeneratePetNumber(), true);
//if charmed two demons the same session, the 2nd gets the 1st one's name
@@ -3722,7 +3723,9 @@ void AuraEffect::HandleAuraModPetTalentsPoints(bool Apply, bool Real, bool chang
// restore UNIT_FIELD_BYTES_0
if(cinfo && caster->GetTypeId() == TYPEID_PLAYER && caster->getClass() == CLASS_WARLOCK && cinfo->type == CREATURE_TYPE_DEMON)
{
- CreatureDataAddon const *cainfo = ((Creature*)m_target)->GetCreatureAddon();
+ //does not appear to have relevance. Why code added initially? Class, gender, powertype should be same.
+ //db field removed and replaced with better way to set class, restore using this if problems
+ /*CreatureDataAddon const *cainfo = ((Creature*)m_target)->GetCreatureAddon();
if(cainfo && cainfo->bytes0 != 0)
m_target->SetUInt32Value(UNIT_FIELD_BYTES_0, cainfo->bytes0);
else
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 41293837a1b..b901f76a7f3 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -13556,7 +13556,7 @@ void Unit::SetCharmedOrPossessedBy(Unit* charmer, bool possess)
if(cinfo && cinfo->type == CREATURE_TYPE_DEMON)
{
//to prevent client crash
- SetFlag(UNIT_FIELD_BYTES_0, 2048);
+ //SetFlag(UNIT_FIELD_BYTES_0, 2048);
//just to enable stat window
if(GetCharmInfo())
@@ -13637,12 +13637,6 @@ void Unit::RemoveCharmedOrPossessedBy(Unit *charmer)
CreatureInfo const *cinfo = ((Creature*)this)->GetCreatureInfo();
if(cinfo && cinfo->type == CREATURE_TYPE_DEMON)
{
- CreatureDataAddon const *cainfo = ((Creature*)this)->GetCreatureAddon();
- if(cainfo && cainfo->bytes0 != 0)
- SetUInt32Value(UNIT_FIELD_BYTES_0, cainfo->bytes0);
- else
- RemoveFlag(UNIT_FIELD_BYTES_0, 2048);
-
if(GetCharmInfo())
GetCharmInfo()->SetPetNumber(0, true);
else
diff --git a/src/shared/Database/SQLStorage.cpp b/src/shared/Database/SQLStorage.cpp
index 8274ccb0cd9..61ecaa7412f 100644
--- a/src/shared/Database/SQLStorage.cpp
+++ b/src/shared/Database/SQLStorage.cpp
@@ -27,11 +27,11 @@ extern DatabasePostgre WorldDatabase;
extern DatabaseMysql WorldDatabase;
#endif
-const char CreatureInfosrcfmt[]="iiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiifflliiis";
-const char CreatureInfodstfmt[]="iiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiifflliiii";
-const char CreatureDataAddonInfofmt[]="iiiiiiis";
+const char CreatureInfosrcfmt[]="iiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiifflliiis";
+const char CreatureInfodstfmt[]="iiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiifflliiii";
+const char CreatureDataAddonInfofmt[]="iiiiiis";
const char CreatureModelfmt[]="iffbi";
-const char CreatureInfoAddonInfofmt[]="iiiiiiis";
+const char CreatureInfoAddonInfofmt[]="iiiiiis";
const char EquipmentInfofmt[]="iiii";
const char GameObjectInfosrcfmt[]="iiisssiifiiiiiiiiiiiiiiiiiiiiiiiis";
const char GameObjectInfodstfmt[]="iiisssiifiiiiiiiiiiiiiiiiiiiiiiiii";