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();
@@ -0,0 +1,59 @@
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
DROP TABLE IF EXISTS `creature_template_resistance`;
CREATE TABLE IF NOT EXISTS `creature_template_resistance` (
`CreatureID` INT(10) UNSIGNED NOT NULL,
`School` TINYINT(3) UNSIGNED NOT NULL,
`Resistance` SMALLINT(6) NOT NULL,
`VerifiedBuild` INT(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`CreatureID`, `School`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `creature_template_spell`;
CREATE TABLE IF NOT EXISTS `creature_template_spell` (
`CreatureID` INT(10) unsigned NOT NULL,
`Index` TINYINT(3) unsigned NOT NULL DEFAULT '0',
`Spell` INT(10) unsigned NOT NULL,
`VerifiedBuild` INT(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`CreatureID`, `Index`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
INSERT INTO creature_template_resistance SELECT entry, 1, resistance1, VerifiedBuild FROM creature_template WHERE resistance1 <> 0;
INSERT INTO creature_template_resistance SELECT entry, 2, resistance2, VerifiedBuild FROM creature_template WHERE resistance2 <> 0;
INSERT INTO creature_template_resistance SELECT entry, 3, resistance3, VerifiedBuild FROM creature_template WHERE resistance3 <> 0;
INSERT INTO creature_template_resistance SELECT entry, 4, resistance4, VerifiedBuild FROM creature_template WHERE resistance4 <> 0;
INSERT INTO creature_template_resistance SELECT entry, 5, resistance5, VerifiedBuild FROM creature_template WHERE resistance5 <> 0;
INSERT INTO creature_template_resistance SELECT entry, 6, resistance6, VerifiedBuild FROM creature_template WHERE resistance6 <> 0;
INSERT INTO creature_template_spell SELECT entry, 0, spell1, VerifiedBuild FROM creature_template WHERE spell1 <> 0;
INSERT INTO creature_template_spell SELECT entry, 1, spell2, VerifiedBuild FROM creature_template WHERE spell2 <> 0;
INSERT INTO creature_template_spell SELECT entry, 2, spell3, VerifiedBuild FROM creature_template WHERE spell3 <> 0;
INSERT INTO creature_template_spell SELECT entry, 3, spell4, VerifiedBuild FROM creature_template WHERE spell4 <> 0;
INSERT INTO creature_template_spell SELECT entry, 4, spell5, VerifiedBuild FROM creature_template WHERE spell5 <> 0;
INSERT INTO creature_template_spell SELECT entry, 5, spell6, VerifiedBuild FROM creature_template WHERE spell6 <> 0;
INSERT INTO creature_template_spell SELECT entry, 6, spell7, VerifiedBuild FROM creature_template WHERE spell7 <> 0;
INSERT INTO creature_template_spell SELECT entry, 7, spell8, VerifiedBuild FROM creature_template WHERE spell8 <> 0;
ALTER TABLE `creature_template`
DROP COLUMN `resistance1`,
DROP COLUMN `resistance2`,
DROP COLUMN `resistance3`,
DROP COLUMN `resistance4`,
DROP COLUMN `resistance5`,
DROP COLUMN `resistance6`,
DROP COLUMN `spell1`,
DROP COLUMN `spell2`,
DROP COLUMN `spell3`,
DROP COLUMN `spell4`,
DROP COLUMN `spell5`,
DROP COLUMN `spell6`,
DROP COLUMN `spell7`,
DROP COLUMN `spell8`;