diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/game/Creature.cpp | 11 | ||||
| -rw-r--r-- | src/game/Creature.h | 2 | ||||
| -rw-r--r-- | src/game/ObjectMgr.cpp | 9 | ||||
| -rw-r--r-- | src/game/SharedDefines.h | 2 | ||||
| -rw-r--r-- | src/game/SpellAuras.cpp | 7 | ||||
| -rw-r--r-- | src/game/Unit.cpp | 8 | ||||
| -rw-r--r-- | src/shared/Database/SQLStorage.cpp | 8 |
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"; |
