Core/Creatures: Changed the spawn health field in creature table to a percentage

Port From (https://github.com/TrinityCore/TrinityCore/commit/def601b4ff82ec8a90af60408a87cac92fdf070d)
This commit is contained in:
Hondacrx
2024-08-04 16:31:25 -04:00
parent 8969d59a41
commit cb16de1f15
10 changed files with 112 additions and 87 deletions
+1 -1
View File
@@ -1979,7 +1979,7 @@ namespace Framework.Constants
ContinueRegenWhileFatigued = 0x200, ContinueRegenWhileFatigued = 0x200,
RegenAffectedByHaste = 0x400, RegenAffectedByHaste = 0x400,
SetToMaxOnLevelUp = 0x1000, SetToMaxOnLevelUp = 0x1000,
SetToMaxLevelOnInitialLogIn = 0x2000, SetToMaxOnInitialLogIn = 0x2000,
AllowCostModsForPlayers = 0x4000 AllowCostModsForPlayers = 0x4000
} }
@@ -50,7 +50,7 @@ namespace Framework.Database
PrepareStatement(WorldStatements.SEL_CREATURE_BY_ID, "SELECT guid FROM creature 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_"); 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_");
PrepareStatement(WorldStatements.SEL_CREATURE_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 creature WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_"); PrepareStatement(WorldStatements.SEL_CREATURE_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 creature WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_");
PrepareStatement(WorldStatements.INS_CREATURE, "INSERT INTO creature (guid, id , map, spawnDifficulties, PhaseId, PhaseGroup, modelid, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, wander_distance, currentwaypoint, curhealth, curmana, MovementType, npcflag, unit_flags, unit_flags2, unit_flags3) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(WorldStatements.INS_CREATURE, "INSERT INTO creature(guid, id, map, spawnDifficulties, PhaseId, PhaseGroup, modelid, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, wander_distance, currentwaypoint, curHealthPct, MovementType, npcflag, unit_flags, unit_flags2, unit_flags3) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(WorldStatements.DEL_GAME_EVENT_CREATURE, "DELETE FROM game_event_creature WHERE guid = ?"); PrepareStatement(WorldStatements.DEL_GAME_EVENT_CREATURE, "DELETE FROM game_event_creature WHERE guid = ?");
PrepareStatement(WorldStatements.DEL_GAME_EVENT_MODEL_EQUIP, "DELETE FROM game_event_model_equip WHERE guid = ?"); PrepareStatement(WorldStatements.DEL_GAME_EVENT_MODEL_EQUIP, "DELETE FROM game_event_model_equip WHERE guid = ?");
PrepareStatement(WorldStatements.INS_GAMEOBJECT, "INSERT INTO gameobject (guid, id, map, spawnDifficulties, PhaseId, PhaseGroup, position_x, position_y, position_z, orientation, rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(WorldStatements.INS_GAMEOBJECT, "INSERT INTO gameobject (guid, id, map, spawnDifficulties, PhaseId, PhaseGroup, position_x, position_y, position_z, orientation, rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
+1 -2
View File
@@ -990,9 +990,8 @@ namespace Game.Chat
return false; return false;
} }
creature.SetMaxHealth((uint)(100 + 30 * lvl));
creature.SetHealth((uint)(100 + 30 * lvl));
creature.SetLevel(lvl); creature.SetLevel(lvl);
creature.UpdateLevelDependantStats();
creature.SaveToDB(); creature.SaveToDB();
return true; return true;
+6 -38
View File
@@ -1399,8 +1399,7 @@ namespace Game.Entities
// prevent add data integrity problems // prevent add data integrity problems
data.WanderDistance = GetDefaultMovementType() == MovementGeneratorType.Idle ? 0.0f : m_wanderDistance; data.WanderDistance = GetDefaultMovementType() == MovementGeneratorType.Idle ? 0.0f : m_wanderDistance;
data.currentwaypoint = 0; data.currentwaypoint = 0;
data.curhealth = (uint)GetHealth(); data.curHealthPct = (uint)GetHealthPct();
data.curmana = (uint)GetPower(PowerType.Mana);
// prevent add data integrity problems // prevent add data integrity problems
data.movementType = (byte)(m_wanderDistance == 0 && GetDefaultMovementType() == MovementGeneratorType.Random data.movementType = (byte)(m_wanderDistance == 0 && GetDefaultMovementType() == MovementGeneratorType.Random
? MovementGeneratorType.Idle : GetDefaultMovementType()); ? MovementGeneratorType.Idle : GetDefaultMovementType());
@@ -1440,8 +1439,7 @@ namespace Game.Entities
stmt.AddValue(index++, m_respawnDelay); stmt.AddValue(index++, m_respawnDelay);
stmt.AddValue(index++, m_wanderDistance); stmt.AddValue(index++, m_wanderDistance);
stmt.AddValue(index++, 0); stmt.AddValue(index++, 0);
stmt.AddValue(index++, GetHealth()); stmt.AddValue(index++, (uint)GetHealthPct());
stmt.AddValue(index++, GetPower(PowerType.Mana));
stmt.AddValue(index++, (byte)GetDefaultMovementType()); stmt.AddValue(index++, (byte)GetDefaultMovementType());
if (npcflag.HasValue) if (npcflag.HasValue)
stmt.AddValue(index++, npcflag.Value); stmt.AddValue(index++, npcflag.Value);
@@ -1478,7 +1476,7 @@ namespace Game.Entities
UpdateLevelDependantStats(); UpdateLevelDependantStats();
} }
void UpdateLevelDependantStats() public void UpdateLevelDependantStats()
{ {
CreatureTemplate cInfo = GetCreatureTemplate(); CreatureTemplate cInfo = GetCreatureTemplate();
CreatureClassifications classification = IsPet() ? CreatureClassifications.Normal : cInfo.Classification; CreatureClassifications classification = IsPet() ? CreatureClassifications.Normal : cInfo.Classification;
@@ -1502,16 +1500,7 @@ namespace Game.Entities
PowerType powerType = CalculateDisplayPowerType(); PowerType powerType = CalculateDisplayPowerType();
SetCreateMana(stats.BaseMana); SetCreateMana(stats.BaseMana);
SetStatPctModifier(UnitMods.PowerStart + (int)powerType, UnitModifierPctType.Base, GetCreatureDifficulty().ManaModifier); SetStatPctModifier(UnitMods.PowerStart + (int)powerType, UnitModifierPctType.Base, GetCreatureDifficulty().ManaModifier);
SetPowerType(powerType); SetPowerType(powerType, true, true);
PowerTypeRecord powerTypeEntry = Global.DB2Mgr.GetPowerTypeEntry(powerType);
if (powerTypeEntry != null)
{
if (powerTypeEntry.HasFlag(PowerTypeFlags.UnitsUseDefaultPowerOnInit))
SetPower(powerType, powerTypeEntry.DefaultPower);
else
SetFullPower(powerType);
}
//Damage //Damage
float basedamage = GetBaseDamageForLevel(level); float basedamage = GetBaseDamageForLevel(level);
@@ -1764,29 +1753,8 @@ namespace Game.Entities
public void SetSpawnHealth() public void SetSpawnHealth()
{ {
if (_staticFlags.HasFlag(CreatureStaticFlags5.NoHealthRegen)) SetHealth(CountPctFromMaxHealth(m_creatureData != null ? (int)m_creatureData.curHealthPct : 100));
return; SetInitialPowerValue(GetPowerType());
ulong curhealth;
if (m_creatureData != null && !_regenerateHealth)
{
curhealth = m_creatureData.curhealth;
if (curhealth != 0)
{
curhealth = (uint)(curhealth * GetHealthMod(GetCreatureTemplate().Classification));
if (curhealth < 1)
curhealth = 1;
}
SetPower(PowerType.Mana, (int)m_creatureData.curmana);
}
else
{
curhealth = GetMaxHealth();
SetFullPower(PowerType.Mana);
}
SetHealth((m_deathState == DeathState.Alive || m_deathState == DeathState.JustRespawned) ? curhealth : 0);
} }
public override bool HasQuest(uint questId) public override bool HasQuest(uint questId)
@@ -266,8 +266,7 @@ namespace Game.Entities
public sbyte equipmentId; public sbyte equipmentId;
public float WanderDistance; public float WanderDistance;
public uint currentwaypoint; public uint currentwaypoint;
public uint curhealth; public uint curHealthPct;
public uint curmana;
public byte movementType; public byte movementType;
public ulong? npcflag; public ulong? npcflag;
public uint? unit_flags; // enum UnitFlags mask values public uint? unit_flags; // enum UnitFlags mask values
+45 -20
View File
@@ -577,12 +577,43 @@ namespace Game.Entities
//Powers //Powers
public PowerType GetPowerType() { return (PowerType)(byte)m_unitData.DisplayPower; } public PowerType GetPowerType() { return (PowerType)(byte)m_unitData.DisplayPower; }
public void SetPowerType(PowerType powerType, bool sendUpdate = true) public void SetPowerType(PowerType power, bool sendUpdate = true, bool onInit = false)
{ {
if (GetPowerType() == powerType) if (!onInit && GetPowerType() == power)
return; return;
SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.DisplayPower), (byte)powerType); PowerTypeRecord powerTypeEntry = Global.DB2Mgr.GetPowerTypeEntry(power);
if (powerTypeEntry == null)
return;
if (IsCreature() && !powerTypeEntry.HasFlag(PowerTypeFlags.IsUsedByNPCs))
return;
SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.DisplayPower), (byte)power);
// Update max power
UpdateMaxPower(power);
// Update current power
if (!onInit)
{
switch (power)
{
case PowerType.Mana: // Keep the same (druid form switching...)
case PowerType.Energy:
break;
case PowerType.Rage: // Reset to zero
SetPower(PowerType.Rage, 0);
break;
case PowerType.Focus: // Make it full
SetFullPower(power);
break;
default:
break;
}
}
else
SetInitialPowerValue(power);
if (!sendUpdate) if (!sendUpdate)
return; return;
@@ -600,24 +631,18 @@ namespace Game.Entities
pet.SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_POWER_TYPE); pet.SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_POWER_TYPE);
}*/ }*/
// Update max power }
UpdateMaxPower(powerType);
// Update current power public void SetInitialPowerValue(PowerType power)
switch (powerType) {
{ PowerTypeRecord powerTypeEntry = Global.DB2Mgr.GetPowerTypeEntry(power);
case PowerType.Mana: // Keep the same (druid form switching...) if (powerTypeEntry == null)
case PowerType.Energy: return;
break;
case PowerType.Rage: // Reset to zero if (powerTypeEntry.HasFlag(PowerTypeFlags.UnitsUseDefaultPowerOnInit))
SetPower(PowerType.Rage, 0); SetPower(power, powerTypeEntry.DefaultPower);
break; else
case PowerType.Focus: // Make it full SetFullPower(power);
SetFullPower(powerType);
break;
default:
break;
}
} }
public void SetOverrideDisplayPowerId(uint powerDisplayId) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.OverrideDisplayPowerID), powerDisplayId); } public void SetOverrideDisplayPowerId(uint powerDisplayId) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.OverrideDisplayPowerID), powerDisplayId); }
+26 -20
View File
@@ -3446,9 +3446,9 @@ namespace Game
// 0 1 2 3 4 5 6 7 8 9 10 // 0 1 2 3 4 5 6 7 8 9 10
SQLResult result = DB.World.Query("SELECT creature.guid, id, map, position_x, position_y, position_z, orientation, modelid, equipment_id, spawntimesecs, wander_distance, " + SQLResult result = DB.World.Query("SELECT creature.guid, id, map, position_x, position_y, position_z, orientation, modelid, equipment_id, spawntimesecs, wander_distance, " +
//11 12 13 14 15 16 17 18 19 20 21 //11 12 13 14 15 16 17 18 19 20
"currentwaypoint, curhealth, curmana, MovementType, spawnDifficulties, eventEntry, poolSpawnId, creature.npcflag, creature.unit_flags, creature.unit_flags2, creature.unit_flags3, " + "currentwaypoint, curHealthPct, MovementType, spawnDifficulties, eventEntry, poolSpawnId, creature.npcflag, creature.unit_flags, creature.unit_flags2, creature.unit_flags3, " +
//22 23 24 25 26 27 //21 22 23 24 25 26
"creature.phaseUseFlags, creature.phaseid, creature.phasegroup, creature.terrainSwapMap, creature.ScriptName, creature.StringId " + "creature.phaseUseFlags, creature.phaseid, creature.phasegroup, creature.terrainSwapMap, creature.ScriptName, creature.StringId " +
"FROM creature LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid LEFT OUTER JOIN pool_members ON pool_members.type = 0 AND creature.guid = pool_members.spawnId"); "FROM creature LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid LEFT OUTER JOIN pool_members ON pool_members.type = 0 AND creature.guid = pool_members.spawnId");
@@ -3499,28 +3499,27 @@ namespace Game
data.spawntimesecs = result.Read<int>(9); data.spawntimesecs = result.Read<int>(9);
data.WanderDistance = result.Read<float>(10); data.WanderDistance = result.Read<float>(10);
data.currentwaypoint = result.Read<uint>(11); data.currentwaypoint = result.Read<uint>(11);
data.curhealth = result.Read<uint>(12); data.curHealthPct = result.Read<uint>(12);
data.curmana = result.Read<uint>(13); data.movementType = result.Read<byte>(13);
data.movementType = result.Read<byte>(14); data.SpawnDifficulties = ParseSpawnDifficulties(result.Read<string>(14), "creature", guid, data.MapId, spawnMasks.LookupByKey(data.MapId));
data.SpawnDifficulties = ParseSpawnDifficulties(result.Read<string>(15), "creature", guid, data.MapId, spawnMasks.LookupByKey(data.MapId)); short gameEvent = result.Read<short>(15);
short gameEvent = result.Read<short>(16); data.poolId = result.Read<uint>(16);
data.poolId = result.Read<uint>(17);
if (!result.IsNull(17))
data.npcflag = result.Read<ulong>(17);
if (!result.IsNull(18)) if (!result.IsNull(18))
data.npcflag = result.Read<ulong>(18); data.unit_flags = result.Read<uint>(18);
if (!result.IsNull(19)) if (!result.IsNull(19))
data.unit_flags = result.Read<uint>(19); data.unit_flags2 = result.Read<uint>(19);
if (!result.IsNull(20)) if (!result.IsNull(20))
data.unit_flags2 = result.Read<uint>(20); data.unit_flags3 = result.Read<uint>(20);
if (!result.IsNull(21))
data.unit_flags3 = result.Read<uint>(21);
data.PhaseUseFlags = (PhaseUseFlagsValues)result.Read<byte>(22); data.PhaseUseFlags = (PhaseUseFlagsValues)result.Read<byte>(21);
data.PhaseId = result.Read<uint>(23); data.PhaseId = result.Read<uint>(22);
data.PhaseGroup = result.Read<uint>(24); data.PhaseGroup = result.Read<uint>(23);
data.terrainSwapMap = result.Read<int>(25); data.terrainSwapMap = result.Read<int>(24);
data.ScriptId = GetScriptId(result.Read<string>(26)); data.ScriptId = GetScriptId(result.Read<string>(25));
data.StringId = result.Read<string>(27); data.StringId = result.Read<string>(26);
data.spawnGroupData = _spawnGroupDataStorage[IsTransportMap(data.MapId) ? 1 : 0u]; // transport spawns default to compatibility group data.spawnGroupData = _spawnGroupDataStorage[IsTransportMap(data.MapId) ? 1 : 0u]; // transport spawns default to compatibility group
var mapEntry = CliDB.MapStorage.LookupByKey(data.MapId); var mapEntry = CliDB.MapStorage.LookupByKey(data.MapId);
@@ -3662,6 +3661,13 @@ namespace Game
} }
} }
uint healthPct = Math.Clamp(data.curHealthPct, 1, 100);
if (data.curHealthPct != healthPct)
{
Log.outError(LogFilter.Sql, $"Table `creature` has creature (GUID: {guid} Entry: {data.Id}) with invalid `curHealthPct` {data.curHealthPct}, set to {healthPct}.");
data.curHealthPct = healthPct;
}
if (WorldConfig.GetBoolValue(WorldCfg.CalculateCreatureZoneAreaData)) if (WorldConfig.GetBoolValue(WorldCfg.CalculateCreatureZoneAreaData))
{ {
PhasingHandler.InitDbVisibleMapId(phaseShift, data.terrainSwapMap); PhasingHandler.InitDbVisibleMapId(phaseShift, data.terrainSwapMap);
@@ -56,6 +56,7 @@ namespace Scripts.EasternKingdoms.BlackrockMountain.BlackwingLair.Vaelastrasz
{ {
_Reset(); _Reset();
me.SetSpawnHealth();
me.SetStandState(UnitStandStateType.Dead); me.SetStandState(UnitStandStateType.Dead);
Initialize(); Initialize();
} }
@@ -65,7 +66,6 @@ namespace Scripts.EasternKingdoms.BlackrockMountain.BlackwingLair.Vaelastrasz
base.JustEngagedWith(who); base.JustEngagedWith(who);
DoCast(me, SpellIds.Essenceofthered); DoCast(me, SpellIds.Essenceofthered);
me.SetHealth(me.CountPctFromMaxHealth(30));
// now drop damage requirement to be able to take loot // now drop damage requirement to be able to take loot
me.ResetPlayerDamageReq(); me.ResetPlayerDamageReq();
+28
View File
@@ -5102,4 +5102,32 @@ namespace Scripts.Spells.Generic
DoEffectCalcDamageAndHealing.Add(new(CalculateHealingBonus, SpellConst.EffectAll, AuraType.Any)); DoEffectCalcDamageAndHealing.Add(new(CalculateHealingBonus, SpellConst.EffectAll, AuraType.Any));
} }
} }
// 24931 - 100 Health
// 24959 - 500 Health
// 28838 - 1 Health
// 43645 - 1 Health
// 73342 - 1 Health
[Script] // 86562 - 1 Health
class spell_gen_set_health : SpellScript
{
ulong _health;
public spell_gen_set_health(ulong health)
{
_health = health;
}
void HandleHit(uint effIndex)
{
if (GetHitUnit().IsAlive() && _health > 0)
GetHitUnit().SetHealth(_health);
}
public override void Register()
{
OnEffectHitTarget.Add(new EffectHandler(HandleHit, 0, SpellEffectName.ScriptEffect));
}
}
} }
+1 -1
View File
@@ -868,7 +868,7 @@ namespace Scripts.World.NpcsSpecial
me.SetStandState(UnitStandStateType.Kneel); me.SetStandState(UnitStandStateType.Kneel);
// expect database to have RegenHealth=0 // expect database to have RegenHealth=0
me.SetHealth(me.CountPctFromMaxHealth(70)); me.SetSpawnHealth();
} }
public override void JustEngagedWith(Unit who) { } public override void JustEngagedWith(Unit who) { }