From dbc35e34955b4ae3a1e9a96e2fab18929ec309f2 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Sun, 9 Jan 2022 01:34:39 +0100 Subject: [PATCH] feat(DB/Creature): Allow to set swim and flight speeds (#10067) --- .../rev_1641650285026899700.sql | 5 + .../Database/Implementation/WorldDatabase.cpp | 2 +- .../game/Entities/Creature/Creature.cpp | 4 +- .../game/Entities/Creature/CreatureData.h | 2 + src/server/game/Globals/ObjectMgr.cpp | 136 +++++++++--------- 5 files changed, 80 insertions(+), 69 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1641650285026899700.sql diff --git a/data/sql/updates/pending_db_world/rev_1641650285026899700.sql b/data/sql/updates/pending_db_world/rev_1641650285026899700.sql new file mode 100644 index 000000000..f99588d09 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1641650285026899700.sql @@ -0,0 +1,5 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1641650285026899700'); + +ALTER TABLE `creature_template` + ADD COLUMN `speed_swim` FLOAT NOT NULL DEFAULT '1' AFTER `speed_run`, + ADD COLUMN `speed_flight` FLOAT NOT NULL DEFAULT '1' AFTER `speed_swim`; diff --git a/src/server/database/Database/Implementation/WorldDatabase.cpp b/src/server/database/Database/Implementation/WorldDatabase.cpp index ee22036b6..5871de43c 100644 --- a/src/server/database/Database/Implementation/WorldDatabase.cpp +++ b/src/server/database/Database/Implementation/WorldDatabase.cpp @@ -77,7 +77,7 @@ void WorldDatabaseConnection::DoPrepareStatements() PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_SEL_COMMANDS, "SELECT name, security, help FROM command", CONNECTION_SYNCH); - PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, detection_range, scale, `rank`, dmgschool, DamageModifier, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, type, type_flags, lootid, pickpocketloot, skinloot, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, ExperienceModifier, RacialLeader, movementId, 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 = ?", CONNECTION_SYNCH); + PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, speed_swim, speed_flight, detection_range, scale, `rank`, dmgschool, DamageModifier, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, type, type_flags, lootid, pickpocketloot, skinloot, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, ExperienceModifier, RacialLeader, movementId, 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 = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH); diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 1ebe9cd6d..53b96654e 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -446,8 +446,8 @@ bool Creature::InitEntry(uint32 Entry, const CreatureData* data) SetSpeed(MOVE_WALK, cinfo->speed_walk); SetSpeed(MOVE_RUN, runSpeed); - SetSpeed(MOVE_SWIM, 1.0f); // using 1.0 rate - SetSpeed(MOVE_FLIGHT, 1.0f); // using 1.0 rate + SetSpeed(MOVE_SWIM, cinfo->speed_swim); + SetSpeed(MOVE_FLIGHT, cinfo->speed_flight); // Will set UNIT_FIELD_BOUNDINGRADIUS and UNIT_FIELD_COMBATREACH SetObjectScale(cinfo->scale); diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index ec43b7bf3..fdaccb4de 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -193,6 +193,8 @@ struct CreatureTemplate uint32 npcflag; float speed_walk; float speed_run; + float speed_swim; + float speed_flight; float detection_range; // Detection Range for Line of Sight aggro float scale; uint32 rank; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index e9aa731b5..838951008 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -477,16 +477,18 @@ void ObjectMgr::LoadCreatureTemplates() // 0 1 2 3 4 5 6 7 8 QueryResult result = WorldDatabase.Query("SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, " -// 9 10 11 12 13 14 15 16 17 18 19 20 21 - "modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, detection_range, " -// 22 23 24 25 26 27 28 29 30 31 32 - "scale, `rank`, dmgschool, DamageModifier, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, " -// 33 34 35 36 37 38 39 +// 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + "modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, speed_swim, speed_flight, " +// 23 24 25 26 27 28 29 30 31 32 33 34 + "detection_range, scale, `rank`, dmgschool, DamageModifier, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, " +// 35 36 37 38 39 40 41 "dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, type, " -// 40 41 42 43 44 45 46 47 48 49 +// 42 43 44 45 46 47 48 49 50 51 "type_flags, lootid, pickpocketloot, skinloot, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, " -// 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 - "ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, ExperienceModifier, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName " +// 52 53 54 55 56 57 58 59 60 61 62 63 + "ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, ExperienceModifier, " +// 64 65 66 67 68 69 70 + "RacialLeader, movementId, 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;"); if (!result) @@ -567,29 +569,31 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields) creatureTemplate.npcflag = fields[18].GetUInt32(); creatureTemplate.speed_walk = fields[19].GetFloat(); creatureTemplate.speed_run = fields[20].GetFloat(); - creatureTemplate.detection_range = fields[21].GetFloat(); - creatureTemplate.scale = fields[22].GetFloat(); - creatureTemplate.rank = uint32(fields[23].GetUInt8()); - creatureTemplate.dmgschool = uint32(fields[24].GetInt8()); - creatureTemplate.DamageModifier = fields[25].GetFloat(); - creatureTemplate.BaseAttackTime = fields[26].GetUInt32(); - creatureTemplate.RangeAttackTime = fields[27].GetUInt32(); - creatureTemplate.BaseVariance = fields[28].GetFloat(); - creatureTemplate.RangeVariance = fields[29].GetFloat(); - creatureTemplate.unit_class = uint32(fields[30].GetUInt8()); - creatureTemplate.unit_flags = fields[31].GetUInt32(); - creatureTemplate.unit_flags2 = fields[32].GetUInt32(); - creatureTemplate.dynamicflags = fields[33].GetUInt32(); - creatureTemplate.family = uint32(fields[34].GetUInt8()); - creatureTemplate.trainer_type = uint32(fields[35].GetUInt8()); - creatureTemplate.trainer_spell = fields[36].GetUInt32(); - creatureTemplate.trainer_class = uint32(fields[37].GetUInt8()); - creatureTemplate.trainer_race = uint32(fields[38].GetUInt8()); - creatureTemplate.type = uint32(fields[39].GetUInt8()); - creatureTemplate.type_flags = fields[40].GetUInt32(); - creatureTemplate.lootid = fields[41].GetUInt32(); - creatureTemplate.pickpocketLootId = fields[42].GetUInt32(); - creatureTemplate.SkinLootId = fields[43].GetUInt32(); + creatureTemplate.speed_swim = fields[21].GetFloat(); + creatureTemplate.speed_flight = fields[22].GetFloat(); + creatureTemplate.detection_range = fields[23].GetFloat(); + creatureTemplate.scale = fields[24].GetFloat(); + creatureTemplate.rank = uint32(fields[25].GetUInt8()); + creatureTemplate.dmgschool = uint32(fields[26].GetInt8()); + creatureTemplate.DamageModifier = fields[27].GetFloat(); + creatureTemplate.BaseAttackTime = fields[28].GetUInt32(); + creatureTemplate.RangeAttackTime = fields[29].GetUInt32(); + creatureTemplate.BaseVariance = fields[30].GetFloat(); + creatureTemplate.RangeVariance = fields[31].GetFloat(); + creatureTemplate.unit_class = uint32(fields[32].GetUInt8()); + creatureTemplate.unit_flags = fields[33].GetUInt32(); + creatureTemplate.unit_flags2 = fields[34].GetUInt32(); + creatureTemplate.dynamicflags = fields[35].GetUInt32(); + creatureTemplate.family = uint32(fields[36].GetUInt8()); + creatureTemplate.trainer_type = uint32(fields[37].GetUInt8()); + creatureTemplate.trainer_spell = fields[38].GetUInt32(); + creatureTemplate.trainer_class = uint32(fields[39].GetUInt8()); + creatureTemplate.trainer_race = uint32(fields[40].GetUInt8()); + creatureTemplate.type = uint32(fields[41].GetUInt8()); + creatureTemplate.type_flags = fields[42].GetUInt32(); + creatureTemplate.lootid = fields[43].GetUInt32(); + creatureTemplate.pickpocketLootId = fields[44].GetUInt32(); + creatureTemplate.SkinLootId = fields[45].GetUInt32(); for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) { @@ -601,49 +605,49 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields) creatureTemplate.spells[i] = 0; } - creatureTemplate.PetSpellDataId = fields[44].GetUInt32(); - creatureTemplate.VehicleId = fields[45].GetUInt32(); - creatureTemplate.mingold = fields[46].GetUInt32(); - creatureTemplate.maxgold = fields[47].GetUInt32(); - creatureTemplate.AIName = fields[48].GetString(); - creatureTemplate.MovementType = uint32(fields[49].GetUInt8()); - if (!fields[50].IsNull()) - { - creatureTemplate.Movement.Ground = static_cast(fields[50].GetUInt8()); - } - - creatureTemplate.Movement.Swim = fields[51].GetBool(); + creatureTemplate.PetSpellDataId = fields[46].GetUInt32(); + creatureTemplate.VehicleId = fields[47].GetUInt32(); + creatureTemplate.mingold = fields[48].GetUInt32(); + creatureTemplate.maxgold = fields[49].GetUInt32(); + creatureTemplate.AIName = fields[50].GetString(); + creatureTemplate.MovementType = uint32(fields[51].GetUInt8()); if (!fields[52].IsNull()) { - creatureTemplate.Movement.Flight = static_cast(fields[52].GetUInt8()); + creatureTemplate.Movement.Ground = static_cast(fields[52].GetUInt8()); } - creatureTemplate.Movement.Rooted = fields[53].GetBool(); + creatureTemplate.Movement.Swim = fields[53].GetBool(); if (!fields[54].IsNull()) { - creatureTemplate.Movement.Chase = static_cast(fields[54].GetUInt8()); - } - if (!fields[55].IsNull()) - { - creatureTemplate.Movement.Random = static_cast(fields[55].GetUInt8()); - } - if (!fields[56].IsNull()) - { - creatureTemplate.Movement.InteractionPauseTimer = fields[56].GetUInt32(); + creatureTemplate.Movement.Flight = static_cast(fields[54].GetUInt8()); } - creatureTemplate.HoverHeight = fields[57].GetFloat(); - creatureTemplate.ModHealth = fields[58].GetFloat(); - creatureTemplate.ModMana = fields[59].GetFloat(); - creatureTemplate.ModArmor = fields[60].GetFloat(); - creatureTemplate.ModExperience = fields[61].GetFloat(); - creatureTemplate.RacialLeader = fields[62].GetBool(); - creatureTemplate.movementId = fields[63].GetUInt32(); - creatureTemplate.RegenHealth = fields[64].GetBool(); - creatureTemplate.MechanicImmuneMask = fields[65].GetUInt32(); - creatureTemplate.SpellSchoolImmuneMask = fields[66].GetUInt8(); - creatureTemplate.flags_extra = fields[67].GetUInt32(); - creatureTemplate.ScriptID = GetScriptId(fields[68].GetCString()); + creatureTemplate.Movement.Rooted = fields[55].GetBool(); + if (!fields[56].IsNull()) + { + creatureTemplate.Movement.Chase = static_cast(fields[56].GetUInt8()); + } + if (!fields[57].IsNull()) + { + creatureTemplate.Movement.Random = static_cast(fields[57].GetUInt8()); + } + if (!fields[58].IsNull()) + { + creatureTemplate.Movement.InteractionPauseTimer = fields[58].GetUInt32(); + } + + creatureTemplate.HoverHeight = fields[59].GetFloat(); + creatureTemplate.ModHealth = fields[60].GetFloat(); + creatureTemplate.ModMana = fields[61].GetFloat(); + creatureTemplate.ModArmor = fields[62].GetFloat(); + creatureTemplate.ModExperience = fields[63].GetFloat(); + creatureTemplate.RacialLeader = fields[64].GetBool(); + creatureTemplate.movementId = fields[65].GetUInt32(); + creatureTemplate.RegenHealth = fields[66].GetBool(); + creatureTemplate.MechanicImmuneMask = fields[67].GetUInt32(); + creatureTemplate.SpellSchoolImmuneMask = fields[68].GetUInt8(); + creatureTemplate.flags_extra = fields[69].GetUInt32(); + creatureTemplate.ScriptID = GetScriptId(fields[70].GetCString()); } void ObjectMgr::LoadCreatureTemplateResistances()