Core/Units: Calculate HoverHeight from model data

Port From (https://github.com/TrinityCore/TrinityCore/commit/d6133c78de9e2272765c2cfda82c440663acd254)
This commit is contained in:
hondacrx
2023-04-25 17:23:24 -04:00
parent 76dd846962
commit 1ba4f55eec
9 changed files with 53 additions and 32 deletions
@@ -225,6 +225,7 @@ namespace Framework.Constants
public const float AttackDistance = 5.0f;
public const float DefaultPlayerCombatReach = 1.5f;
public const float DefaultPlayerDisplayScale = 1.0f;
public const float DefaultPlayerHoverHeight = 1.0f;
public const float MinMeleeReach = 2.0f;
public const float NominalMeleeRange = 5.0f;
public const float MeleeRange = NominalMeleeRange - MinMeleeReach * 2; //center to center for players
@@ -60,7 +60,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, 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, 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 = ?");
PrepareStatement(WorldStatements.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 = ?");
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_");
@@ -293,8 +293,6 @@ namespace Game.Entities
SetObjectScale(GetNativeObjectScale());
SetHoverHeight(cInfo.HoverHeight);
SetCanDualWield(cInfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.UseOffhandAttack));
// checked at loading
@@ -58,7 +58,6 @@ namespace Game.Entities
public string AIName;
public uint MovementType;
public CreatureMovementData Movement = new();
public float HoverHeight;
public float ModHealth;
public float ModHealthExtra;
public float ModMana;
-1
View File
@@ -2918,7 +2918,6 @@ namespace Game.Entities
}
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 UpdateAchievementCriteria)
m_achievementSys.LoadFromDB(holder.GetResult(PlayerLoginQueryLoad.Achievements), holder.GetResult(PlayerLoginQueryLoad.CriteriaProgress));
-1
View File
@@ -228,7 +228,6 @@ namespace Game.Entities
}
SetUnitFlag2(UnitFlags2.RegeneratePower);
SetHoverHeight(1.0f); // default for players in 3.0.3
SetWatchedFactionIndex(0xFFFFFFFF);
@@ -1410,6 +1410,8 @@ namespace Game.Entities
SetUnitFlag(UnitFlags.Mount);
CalculateHoverHeight();
Player player = ToPlayer();
if (player != null)
{
@@ -1461,6 +1463,8 @@ namespace Game.Entities
if (thisPlayer != null)
thisPlayer.SendMovementSetCollisionHeight(thisPlayer.GetCollisionHeight(), UpdateCollisionHeightReason.Mount);
CalculateHoverHeight();
// dismount as a vehicle
if (IsTypeId(TypeId.Player) && GetVehicleKit() != null)
{
+29 -1
View File
@@ -1894,10 +1894,12 @@ namespace Game.Entities
SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.NativeXDisplayScale), displayScale);
}
// Set Gender by modelId
// Set Gender by ModelInfo
CreatureModelInfo modelInfo = Global.ObjectMgr.GetCreatureModelInfo(displayId);
if (modelInfo != null)
SetGender((Gender)modelInfo.gender);
CalculateHoverHeight();
}
public void RestoreDisplayId(bool ignorePositiveAurasPreventingMounting = false)
@@ -1973,6 +1975,32 @@ namespace Game.Entities
uint GetCosmeticMountDisplayId() { return m_unitData.CosmeticMountDisplayID; }
public void SetCosmeticMountDisplayId(uint mountDisplayId) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.CosmeticMountDisplayID), mountDisplayId); }
void CalculateHoverHeight()
{
float hoverHeight = SharedConst.DefaultPlayerHoverHeight;
float displayScale = SharedConst.DefaultPlayerDisplayScale;
uint displayId = IsMounted() ? GetMountDisplayId() : GetDisplayId();
// Get DisplayScale for creatures
if (IsCreature())
{
CreatureModel model = ToCreature().GetCreatureTemplate().GetModelWithDisplayId(displayId);
if (model != null)
displayScale = model.DisplayScale;
}
var displayInfo = CliDB.CreatureDisplayInfoStorage.LookupByKey(displayId);
if (displayInfo != null)
{
var modelData = CliDB.CreatureModelDataStorage.LookupByKey(displayInfo.ModelID);
if (modelData != null)
hoverHeight = modelData.HoverHeight * modelData.ModelScale * displayInfo.CreatureModelScale * displayScale;
}
SetHoverHeight(hoverHeight != 0 ? hoverHeight : SharedConst.DefaultPlayerHoverHeight);
}
public virtual float GetFollowAngle() { return MathFunctions.PiOver2; }
public override ObjectGuid GetOwnerGUID() { return m_unitData.SummonedBy; }
+18 -25
View File
@@ -1883,25 +1883,24 @@ namespace Game
if (!fields.IsNull(49))
creature.Movement.InteractionPauseTimer = fields.Read<uint>(49);
creature.HoverHeight = fields.Read<float>(50);
creature.ModHealth = fields.Read<float>(51);
creature.ModHealthExtra = fields.Read<float>(52);
creature.ModMana = fields.Read<float>(53);
creature.ModManaExtra = fields.Read<float>(54);
creature.ModArmor = fields.Read<float>(55);
creature.ModDamage = fields.Read<float>(56);
creature.ModExperience = fields.Read<float>(57);
creature.RacialLeader = fields.Read<bool>(58);
creature.MovementId = fields.Read<uint>(59);
creature.CreatureDifficultyID = fields.Read<int>(60);
creature.WidgetSetID = fields.Read<int>(61);
creature.WidgetSetUnitConditionID = fields.Read<int>(62);
creature.RegenHealth = fields.Read<bool>(63);
creature.MechanicImmuneMask = fields.Read<ulong>(64);
creature.SpellSchoolImmuneMask = fields.Read<uint>(65);
creature.FlagsExtra = (CreatureFlagsExtra)fields.Read<uint>(66);
creature.ScriptID = GetScriptId(fields.Read<string>(67));
creature.StringId = fields.Read<string>(68);
creature.ModHealth = fields.Read<float>(50);
creature.ModHealthExtra = fields.Read<float>(51);
creature.ModMana = fields.Read<float>(52);
creature.ModManaExtra = fields.Read<float>(53);
creature.ModArmor = fields.Read<float>(54);
creature.ModDamage = fields.Read<float>(55);
creature.ModExperience = fields.Read<float>(56);
creature.RacialLeader = fields.Read<bool>(57);
creature.MovementId = fields.Read<uint>(58);
creature.CreatureDifficultyID = fields.Read<int>(59);
creature.WidgetSetID = fields.Read<int>(60);
creature.WidgetSetUnitConditionID = fields.Read<int>(61);
creature.RegenHealth = fields.Read<bool>(62);
creature.MechanicImmuneMask = fields.Read<ulong>(63);
creature.SpellSchoolImmuneMask = fields.Read<uint>(64);
creature.FlagsExtra = (CreatureFlagsExtra)fields.Read<uint>(65);
creature.ScriptID = GetScriptId(fields.Read<string>(66));
creature.StringId = fields.Read<string>(67);
creatureTemplateStorage[entry] = creature;
}
@@ -3005,12 +3004,6 @@ namespace Game
CheckCreatureMovement("creature_template_movement", cInfo.Entry, cInfo.Movement);
if (cInfo.HoverHeight < 0.0f)
{
Log.outError(LogFilter.Sql, "Creature (Entry: {0}) has wrong value ({1}) in `HoverHeight`", cInfo.Entry, cInfo.HoverHeight);
cInfo.HoverHeight = 1.0f;
}
if (cInfo.VehicleId != 0)
{
if (!CliDB.VehicleStorage.ContainsKey(cInfo.VehicleId))