aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/9999_99_99_99_world.sql1
-rw-r--r--src/server/database/Database/Implementation/WorldDatabase.cpp2
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp2
-rw-r--r--src/server/game/Entities/Creature/CreatureData.h1
-rw-r--r--src/server/game/Entities/Object/ObjectDefines.h1
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp27
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp53
9 files changed, 53 insertions, 37 deletions
diff --git a/sql/updates/world/master/9999_99_99_99_world.sql b/sql/updates/world/master/9999_99_99_99_world.sql
new file mode 100644
index 00000000000..f9ed254f65d
--- /dev/null
+++ b/sql/updates/world/master/9999_99_99_99_world.sql
@@ -0,0 +1 @@
+ALTER TABLE `creature_template` DROP COLUMN `HoverHeight`;
diff --git a/src/server/database/Database/Implementation/WorldDatabase.cpp b/src/server/database/Database/Implementation/WorldDatabase.cpp
index f5f3ae3b6c6..f5af5860cc4 100644
--- a/src/server/database/Database/Implementation/WorldDatabase.cpp
+++ b/src/server/database/Database/Implementation/WorldDatabase.cpp
@@ -76,7 +76,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, help FROM command", CONNECTION_SYNCH);
- PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, name, femaleName, subname, TitleAlt, IconName, 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, ctm.InteractionPauseTimer, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, CreatureDifficultyID, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName, StringId FROM creature_template ct LEFT JOIN creature_template_movement ctm ON ct.entry = ctm.CreatureId WHERE entry = ? OR 1 = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, name, femaleName, subname, TitleAlt, IconName, 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, ctm.InteractionPauseTimer, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, CreatureDifficultyID, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName, StringId FROM creature_template ct LEFT JOIN creature_template_movement ctm ON ct.entry = ctm.CreatureId WHERE entry = ? OR 1 = ?", 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_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH);
PrepareStatement(WORLD_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_", CONNECTION_SYNCH);
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 74d5ea3eff9..86585a35452 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -557,8 +557,6 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/)
// Will set UNIT_FIELD_BOUNDINGRADIUS, UNIT_FIELD_COMBATREACH and UNIT_FIELD_DISPLAYSCALE
SetObjectScale(GetNativeObjectScale());
- SetHoverHeight(cinfo->HoverHeight);
-
SetCanDualWield(cinfo->flags_extra & CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK);
// checked at loading
diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h
index b147c2ad04b..7044ccaf665 100644
--- a/src/server/game/Entities/Creature/CreatureData.h
+++ b/src/server/game/Entities/Creature/CreatureData.h
@@ -515,7 +515,6 @@ struct TC_GAME_API CreatureTemplate
std::string AIName;
uint32 MovementType;
CreatureMovementData Movement;
- float HoverHeight;
float ModHealth;
float ModHealthExtra;
float ModMana;
diff --git a/src/server/game/Entities/Object/ObjectDefines.h b/src/server/game/Entities/Object/ObjectDefines.h
index b34767faa51..964743fbc0e 100644
--- a/src/server/game/Entities/Object/ObjectDefines.h
+++ b/src/server/game/Entities/Object/ObjectDefines.h
@@ -39,6 +39,7 @@
#define DEFAULT_PLAYER_BOUNDING_RADIUS 0.388999998569489f // player size, also currently used (correctly?) for any non Unit world objects
#define DEFAULT_PLAYER_COMBAT_REACH 1.5f
#define DEFAULT_PLAYER_DISPLAY_SCALE 1.0f
+#define DEFAULT_PLAYER_HOVER_HEIGHT 1.0f
#define MIN_MELEE_REACH 2.0f
#define NOMINAL_MELEE_RANGE 5.0f
#define MELEE_RANGE (NOMINAL_MELEE_RANGE - MIN_MELEE_REACH * 2) //center to center for players
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index bba11970aa1..246853f2407 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -487,7 +487,6 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac
}
SetUnitFlag2(UNIT_FLAG2_REGENERATE_POWER);
- SetHoverHeight(1.0f); // default for players in 3.0.3
SetWatchedFactionIndex(-1);
@@ -17521,7 +17520,6 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol
Trinity::StringTo<uint64>(knownTitles[i]).value_or(UI64LIT(0)) << (32 * (i % 2)));
SetObjectScale(1.0f);
- SetHoverHeight(1.0f);
// load achievements before anything else to prevent multiple gains for the same achievement/criteria on every loading (as loading does call UpdateCriteria)
m_achievementMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS));
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index dda5fb90848..14a8d8b0dcf 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -7706,6 +7706,8 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry)
SetUnitFlag(UNIT_FLAG_MOUNT);
+ CalculateHoverHeight();
+
if (Player* player = ToPlayer())
{
// mount as a vehicle
@@ -7754,6 +7756,8 @@ void Unit::Dismount()
if (Player* thisPlayer = ToPlayer())
thisPlayer->SendMovementSetCollisionHeight(thisPlayer->GetCollisionHeight(), WorldPackets::Movement::UpdateCollisionHeightReason::Mount);
+ CalculateHoverHeight();
+
// dismount as a vehicle
if (GetTypeId() == TYPEID_PLAYER && GetVehicleKit())
{
@@ -10180,9 +10184,11 @@ void Unit::SetDisplayId(uint32 displayId, bool setNative /*= false*/)
SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NativeXDisplayScale), displayScale);
}
- // Set Gender by modelId
+ // Set Gender by ModelInfo
if (CreatureModelInfo const* modelInfo = sObjectMgr->GetCreatureModelInfo(displayId))
SetGender(Gender(modelInfo->gender));
+
+ CalculateHoverHeight();
}
void Unit::RestoreDisplayId(bool ignorePositiveAurasPreventingMounting /*= false*/)
@@ -13343,6 +13349,25 @@ void Unit::SetPlayHoverAnim(bool enable)
SendMessageToSet(data.Write(), true);
}
+void Unit::CalculateHoverHeight()
+{
+ float hoverHeight = DEFAULT_PLAYER_HOVER_HEIGHT;
+ float displayScale = DEFAULT_PLAYER_DISPLAY_SCALE;
+
+ uint32 displayId = IsMounted() ? GetMountDisplayId() : GetDisplayId();
+
+ // Get DisplayScale for creatures
+ if (IsCreature())
+ if (CreatureModel const* model = ToCreature()->GetCreatureTemplate()->GetModelWithDisplayId(displayId))
+ displayScale = model->DisplayScale;
+
+ if (CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.LookupEntry(displayId))
+ if (CreatureModelDataEntry const* modelData = sCreatureModelDataStore.LookupEntry(displayInfo->ModelID))
+ hoverHeight = modelData->HoverHeight * modelData->ModelScale * displayInfo->CreatureModelScale * displayScale;
+
+ SetHoverHeight(hoverHeight ? hoverHeight : DEFAULT_PLAYER_HOVER_HEIGHT);
+}
+
bool Unit::IsSplineEnabled() const
{
return movespline->Initialized() && !movespline->Finalized();
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 21d047580e9..b0de657556d 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1220,6 +1220,7 @@ class TC_GAME_API Unit : public WorldObject
bool IsPlayingHoverAnim() const { return _playHoverAnim; }
void SetPlayHoverAnim(bool enable);
+ void CalculateHoverHeight();
void SetHoverHeight(float hoverHeight) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::HoverHeight), hoverHeight); }
bool IsGravityDisabled() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); }
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 65d00b51a50..16906f2bc27 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -360,13 +360,13 @@ void ObjectMgr::LoadCreatureTemplates()
// "unit_class, unit_flags, unit_flags2, unit_flags3, dynamicflags, family, trainer_class, type, "
// 33 34 35 36 37 38 39 40 41 42
// "type_flags, type_flags2, lootid, pickpocketloot, skinloot, VehicleId, mingold, maxgold, AIName, MovementType, "
- // 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
- // "ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, "
- // 58 59 60 61 62 63
+ // 43 44 45 46 47 48 49 50 51 52 53 54 55 56
+ // "ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, "
+ // 57 58 59 60 61 62
// "RacialLeader, movementId, CreatureDifficultyID, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, "
- // 64 65 66
+ // 63 64 65
// "mechanic_immune_mask, spell_school_immune_mask, flags_extra, "
- // 67 68
+ // 66 67
// "ScriptName, StringId FROM creature_template WHERE entry = ? OR 1 = ?");
WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_CREATURE_TEMPLATE);
@@ -480,25 +480,24 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields)
if (!fields[49].IsNull())
creatureTemplate.Movement.InteractionPauseTimer = fields[49].GetUInt32();
- creatureTemplate.HoverHeight = fields[50].GetFloat();
- creatureTemplate.ModHealth = fields[51].GetFloat();
- creatureTemplate.ModHealthExtra = fields[52].GetFloat();
- creatureTemplate.ModMana = fields[53].GetFloat();
- creatureTemplate.ModManaExtra = fields[54].GetFloat();
- creatureTemplate.ModArmor = fields[55].GetFloat();
- creatureTemplate.ModDamage = fields[56].GetFloat();
- creatureTemplate.ModExperience = fields[57].GetFloat();
- creatureTemplate.RacialLeader = fields[58].GetBool();
- creatureTemplate.movementId = fields[59].GetUInt32();
- creatureTemplate.CreatureDifficultyID = fields[60].GetInt32();
- creatureTemplate.WidgetSetID = fields[61].GetInt32();
- creatureTemplate.WidgetSetUnitConditionID = fields[62].GetInt32();
- creatureTemplate.RegenHealth = fields[63].GetBool();
- creatureTemplate.MechanicImmuneMask = fields[64].GetUInt64();
- creatureTemplate.SpellSchoolImmuneMask = fields[65].GetUInt32();
- creatureTemplate.flags_extra = fields[66].GetUInt32();
- creatureTemplate.ScriptID = GetScriptId(fields[67].GetString());
- creatureTemplate.StringId = fields[68].GetString();
+ creatureTemplate.ModHealth = fields[50].GetFloat();
+ creatureTemplate.ModHealthExtra = fields[51].GetFloat();
+ creatureTemplate.ModMana = fields[52].GetFloat();
+ creatureTemplate.ModManaExtra = fields[53].GetFloat();
+ creatureTemplate.ModArmor = fields[54].GetFloat();
+ creatureTemplate.ModDamage = fields[55].GetFloat();
+ creatureTemplate.ModExperience = fields[56].GetFloat();
+ creatureTemplate.RacialLeader = fields[57].GetBool();
+ creatureTemplate.movementId = fields[58].GetUInt32();
+ creatureTemplate.CreatureDifficultyID = fields[59].GetInt32();
+ creatureTemplate.WidgetSetID = fields[60].GetInt32();
+ creatureTemplate.WidgetSetUnitConditionID = fields[61].GetInt32();
+ creatureTemplate.RegenHealth = fields[62].GetBool();
+ creatureTemplate.MechanicImmuneMask = fields[63].GetUInt64();
+ creatureTemplate.SpellSchoolImmuneMask = fields[64].GetUInt32();
+ creatureTemplate.flags_extra = fields[65].GetUInt32();
+ creatureTemplate.ScriptID = GetScriptId(fields[66].GetString());
+ creatureTemplate.StringId = fields[67].GetString();
}
void ObjectMgr::LoadCreatureTemplateGossip()
@@ -1254,12 +1253,6 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo)
CheckCreatureMovement("creature_template_movement", cInfo->Entry, const_cast<CreatureTemplate*>(cInfo)->Movement);
- if (cInfo->HoverHeight < 0.0f)
- {
- TC_LOG_ERROR("sql.sql", "Creature (Entry: {}) has wrong value ({}) in `HoverHeight`", cInfo->Entry, cInfo->HoverHeight);
- const_cast<CreatureTemplate*>(cInfo)->HoverHeight = 1.0f;
- }
-
if (cInfo->VehicleId)
{
VehicleEntry const* vehId = sVehicleStore.LookupEntry(cInfo->VehicleId);