diff options
-rw-r--r-- | sql/updates/world/master/9999_99_99_99_world.sql | 1 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/WorldDatabase.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/CreatureData.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Object/ObjectDefines.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 27 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 1 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 53 |
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); |