Core/CreatureTemplate: Outsourced resistances and spells into creature

Port From (https://github.com/TrinityCore/TrinityCore/commit/7a8d15d63bb1178457df25f37a29e020e5183631)
This commit is contained in:
hondacrx
2021-12-17 19:16:52 -05:00
parent 05e3cfc118
commit b367f70d6c
3 changed files with 179 additions and 38 deletions
@@ -76,7 +76,7 @@ namespace Framework.Database
PrepareStatement(WorldStatements.SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?");
PrepareStatement(WorldStatements.DEL_CREATURE, "DELETE FROM creature WHERE guid = ?");
PrepareStatement(WorldStatements.SEL_COMMANDS, "SELECT name, permission, help FROM command");
PrepareStatement(WorldStatements.SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, name, femaleName, subname, TitleAlt, IconName, gossip_menu_id, minlevel, maxlevel, HealthScalingExpansion, RequiredExpansion, VignetteID, faction, npcflag, speed_walk, speed_run, scale, `rank`, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, unit_flags3, dynamicflags, family, trainer_class, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, CreatureDifficultyID, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName FROM creature_template ct LEFT JOIN creature_template_movement ctm ON ct.entry = ctm.CreatureId WHERE entry = ? OR 1 = ?");
PrepareStatement(WorldStatements.SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, name, femaleName, subname, TitleAlt, IconName, gossip_menu_id, minlevel, maxlevel, HealthScalingExpansion, RequiredExpansion, VignetteID, faction, npcflag, speed_walk, speed_run, scale, `rank`, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, unit_flags3, dynamicflags, family, trainer_class, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, VehicleId, mingold, maxgold, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, CreatureDifficultyID, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName FROM creature_template ct LEFT JOIN creature_template_movement ctm ON ct.entry = ctm.CreatureId WHERE entry = ? OR 1 = ?");
PrepareStatement(WorldStatements.SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?");
PrepareStatement(WorldStatements.SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?");
PrepareStatement(WorldStatements.SEL_GAMEOBJECT_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM gameobject WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_");
+119 -37
View File
@@ -1748,6 +1748,9 @@ namespace Game
LoadCreatureTemplate(result.GetFields());
} while (result.NextRow());
LoadCreatureTemplateResistances();
LoadCreatureTemplateSpells();
// We load the creature models after loading but before checking
LoadCreatureTemplateModels();
@@ -1807,57 +1810,136 @@ namespace Game
creature.SkinLootId = fields.Read<uint>(40);
for (var i = (int)SpellSchools.Holy; i < (int)SpellSchools.Max; ++i)
creature.Resistance[i] = fields.Read<int>(41 + i - 1);
creature.Resistance[i] = 0;
for (var i = 0; i < SharedConst.MaxCreatureSpells; ++i)
creature.Spells[i] = fields.Read<uint>(47 + i);
creature.Spells[i] = 0;
creature.VehicleId = fields.Read<uint>(55);
creature.MinGold = fields.Read<uint>(56);
creature.MaxGold = fields.Read<uint>(57);
creature.AIName = fields.Read<string>(58);
creature.MovementType = fields.Read<uint>(59);
creature.VehicleId = fields.Read<uint>(41);
creature.MinGold = fields.Read<uint>(42);
creature.MaxGold = fields.Read<uint>(43);
creature.AIName = fields.Read<string>(44);
creature.MovementType = fields.Read<uint>(45);
if (!fields.IsNull(60))
creature.Movement.Ground = (CreatureGroundMovementType)fields.Read<byte>(60);
if (!fields.IsNull(46))
creature.Movement.Ground = (CreatureGroundMovementType)fields.Read<byte>(46);
if (!fields.IsNull(61))
creature.Movement.Swim = fields.Read<bool>(61);
if (!fields.IsNull(47))
creature.Movement.Swim = fields.Read<bool>(47);
if (!fields.IsNull(62))
creature.Movement.Flight = (CreatureFlightMovementType)fields.Read<byte>(62);
if (!fields.IsNull(48))
creature.Movement.Flight = (CreatureFlightMovementType)fields.Read<byte>(48);
if (!fields.IsNull(63))
creature.Movement.Rooted = fields.Read<bool>(63);
if (!fields.IsNull(49))
creature.Movement.Rooted = fields.Read<bool>(49);
if (!fields.IsNull(64))
creature.Movement.Chase = (CreatureChaseMovementType)fields.Read<byte>(64);
if (!fields.IsNull(50))
creature.Movement.Chase = (CreatureChaseMovementType)fields.Read<byte>(50);
if (!fields.IsNull(65))
creature.Movement.Random = (CreatureRandomMovementType)fields.Read<byte>(65);
if (!fields.IsNull(51))
creature.Movement.Random = (CreatureRandomMovementType)fields.Read<byte>(51);
creature.HoverHeight = fields.Read<float>(66);
creature.ModHealth = fields.Read<float>(67);
creature.ModHealthExtra = fields.Read<float>(68);
creature.ModMana = fields.Read<float>(69);
creature.ModManaExtra = fields.Read<float>(70);
creature.ModArmor = fields.Read<float>(71);
creature.ModDamage = fields.Read<float>(72);
creature.ModExperience = fields.Read<float>(73);
creature.RacialLeader = fields.Read<bool>(74);
creature.MovementId = fields.Read<uint>(75);
creature.CreatureDifficultyID = fields.Read<int>(76);
creature.WidgetSetID = fields.Read<int>(77);
creature.WidgetSetUnitConditionID = fields.Read<int>(78);
creature.RegenHealth = fields.Read<bool>(79);
creature.MechanicImmuneMask = fields.Read<uint>(80);
creature.SpellSchoolImmuneMask = fields.Read<uint>(81);
creature.FlagsExtra = (CreatureFlagsExtra)fields.Read<uint>(82);
creature.ScriptID = GetScriptId(fields.Read<string>(83));
creature.HoverHeight = fields.Read<float>(52);
creature.ModHealth = fields.Read<float>(53);
creature.ModHealthExtra = fields.Read<float>(54);
creature.ModMana = fields.Read<float>(55);
creature.ModManaExtra = fields.Read<float>(56);
creature.ModArmor = fields.Read<float>(57);
creature.ModDamage = fields.Read<float>(58);
creature.ModExperience = fields.Read<float>(59);
creature.RacialLeader = fields.Read<bool>(60);
creature.MovementId = fields.Read<uint>(61);
creature.CreatureDifficultyID = fields.Read<int>(62);
creature.WidgetSetID = fields.Read<int>(63);
creature.WidgetSetUnitConditionID = fields.Read<int>(64);
creature.RegenHealth = fields.Read<bool>(65);
creature.MechanicImmuneMask = fields.Read<uint>(66);
creature.SpellSchoolImmuneMask = fields.Read<uint>(67);
creature.FlagsExtra = (CreatureFlagsExtra)fields.Read<uint>(68);
creature.ScriptID = GetScriptId(fields.Read<string>(69));
creatureTemplateStorage[entry] = creature;
}
void LoadCreatureTemplateResistances()
{
uint oldMSTime = Time.GetMSTime();
// 0 1 2
SQLResult result = DB.World.Query("SELECT CreatureID, School, Resistance FROM creature_template_resistance");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 creature template resistance definitions. DB table `creature_template_resistance` is empty.");
return;
}
uint count = 0;
do
{
uint creatureID = result.Read<uint>(0);
SpellSchools school = (SpellSchools)result.Read<byte>(1);
if (school == SpellSchools.Normal || school >= SpellSchools.Max)
{
Log.outInfo(LogFilter.Sql, $"creature_template_resistance has resistance definitions for creature {creatureID} but this school {school} doesn't exist");
continue;
}
if (!creatureTemplateStorage.TryGetValue(creatureID, out CreatureTemplate creatureTemplate))
{
Log.outInfo(LogFilter.Sql, $"creature_template_resistance has resistance definitions for creature {creatureID} but this creature doesn't exist");
continue;
}
creatureTemplate.Resistance[(int)school] = result.Read<ushort>(2);
++count;
} while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, $"Loaded {count} creature template resistances in {Time.GetMSTimeDiffToNow(oldMSTime)} ms");
}
void LoadCreatureTemplateSpells()
{
uint oldMSTime = Time.GetMSTime();
// 0 1 2
SQLResult result = DB.World.Query("SELECT CreatureID, `Index`, Spell FROM creature_template_spell");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 creature template spell definitions. DB table `creature_template_spell` is empty.");
return;
}
uint count = 0;
do
{
uint creatureID = result.Read<uint>(0);
byte index = result.Read<byte>(1);
if (index >= SharedConst.MaxCreatureSpells)
{
Log.outInfo(LogFilter.Sql, $"creature_template_spell has spell definitions for creature {creatureID} with a incorrect index {index}");
continue;
}
if (!creatureTemplateStorage.TryGetValue(creatureID, out CreatureTemplate creatureTemplate))
{
Log.outError(LogFilter.Sql, $"creature_template_spell has spell definitions for creature {creatureID} but this creature doesn't exist");
continue;
}
creatureTemplate.Spells[index] = result.Read<uint>(2);
++count;
} while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, $"Loaded {count} creature template spells in {Time.GetMSTimeDiffToNow(oldMSTime)} ms");
}
void LoadCreatureTemplateModels()
{
uint oldMSTime = Time.GetMSTime();