mirror of
https://github.com/EQEmu/Server.git
synced 2026-08-27 19:07:57 +00:00
Rework regens to match modern clients
This commit is contained in:
+207
-9
@@ -160,7 +160,8 @@ Client::Client(EQStreamInterface* ieqs)
|
||||
npc_close_scan_timer(6000),
|
||||
hp_self_update_throttle_timer(300),
|
||||
hp_other_update_throttle_timer(500),
|
||||
position_update_timer(10000)
|
||||
position_update_timer(10000),
|
||||
tmSitting(0)
|
||||
{
|
||||
|
||||
for (int client_filter = 0; client_filter < _FilterCount; client_filter++)
|
||||
@@ -270,9 +271,10 @@ Client::Client(EQStreamInterface* ieqs)
|
||||
m_ClientVersion = EQEmu::versions::ClientVersion::Unknown;
|
||||
m_ClientVersionBit = 0;
|
||||
AggroCount = 0;
|
||||
RestRegenHP = 0;
|
||||
RestRegenMana = 0;
|
||||
RestRegenEndurance = 0;
|
||||
ooc_regen = false;
|
||||
AreaHPRegen = 1.0f;
|
||||
AreaManaRegen = 1.0f;
|
||||
AreaEndRegen = 1.0f;
|
||||
XPRate = 100;
|
||||
current_endurance = 0;
|
||||
|
||||
@@ -329,6 +331,9 @@ Client::Client(EQStreamInterface* ieqs)
|
||||
|
||||
interrogateinv_flag = false;
|
||||
|
||||
for (int i = 0; i < InnateSkillMax; ++i)
|
||||
m_pp.InnateSkills[i] = InnateDisabled;
|
||||
|
||||
AI_Init();
|
||||
}
|
||||
|
||||
@@ -4598,7 +4603,7 @@ void Client::IncrementAggroCount() {
|
||||
//
|
||||
AggroCount++;
|
||||
|
||||
if(!RuleI(Character, RestRegenPercent))
|
||||
if(!RuleB(Character, RestRegenEnabled))
|
||||
return;
|
||||
|
||||
// If we already had aggro before this method was called, the combat indicator should already be up for SoF clients,
|
||||
@@ -4635,7 +4640,7 @@ void Client::DecrementAggroCount() {
|
||||
|
||||
AggroCount--;
|
||||
|
||||
if(!RuleI(Character, RestRegenPercent))
|
||||
if(!RuleB(Character, RestRegenEnabled))
|
||||
return;
|
||||
|
||||
// Something else is still aggro on us, can't rest yet.
|
||||
@@ -6722,7 +6727,7 @@ void Client::SendStatsWindow(Client* client, bool use_window)
|
||||
cap_regen_field = itoa(CalcHPRegenCap());
|
||||
spell_regen_field = itoa(spellbonuses.HPRegen);
|
||||
aa_regen_field = itoa(aabonuses.HPRegen);
|
||||
total_regen_field = itoa(CalcHPRegen());
|
||||
total_regen_field = itoa(CalcHPRegen(true));
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
@@ -6735,7 +6740,7 @@ void Client::SendStatsWindow(Client* client, bool use_window)
|
||||
cap_regen_field = itoa(CalcManaRegenCap());
|
||||
spell_regen_field = itoa(spellbonuses.ManaRegen);
|
||||
aa_regen_field = itoa(aabonuses.ManaRegen);
|
||||
total_regen_field = itoa(CalcManaRegen());
|
||||
total_regen_field = itoa(CalcManaRegen(true));
|
||||
}
|
||||
else { continue; }
|
||||
break;
|
||||
@@ -6749,7 +6754,7 @@ void Client::SendStatsWindow(Client* client, bool use_window)
|
||||
cap_regen_field = itoa(CalcEnduranceRegenCap());
|
||||
spell_regen_field = itoa(spellbonuses.EnduranceRegen);
|
||||
aa_regen_field = itoa(aabonuses.EnduranceRegen);
|
||||
total_regen_field = itoa(CalcEnduranceRegen());
|
||||
total_regen_field = itoa(CalcEnduranceRegen(true));
|
||||
break;
|
||||
}
|
||||
default: { break; }
|
||||
@@ -9066,3 +9071,196 @@ void Client::SetPetCommandState(int button, int state)
|
||||
FastQueuePacket(&app);
|
||||
}
|
||||
|
||||
bool Client::CanMedOnHorse()
|
||||
{
|
||||
// no horse is false
|
||||
if (GetHorseId() == 0)
|
||||
return false;
|
||||
|
||||
// can't med while attacking
|
||||
if (auto_attack)
|
||||
return false;
|
||||
|
||||
return animation == 0 && m_Delta.x == 0.0f && m_Delta.y == 0.0f; // TODO: animation is SpeedRun
|
||||
}
|
||||
|
||||
void Client::EnableAreaHPRegen(int value)
|
||||
{
|
||||
AreaHPRegen = value * 0.001f;
|
||||
SendAppearancePacket(AT_AreaHPRegen, value); // does this send to whole zone?
|
||||
// send test and particles?
|
||||
}
|
||||
|
||||
void Client::DisableAreaHPRegen()
|
||||
{
|
||||
AreaHPRegen = 1.0f;
|
||||
SendAppearancePacket(AT_AreaHPRegen, 1000);
|
||||
}
|
||||
|
||||
void Client::EnableAreaManaRegen(int value)
|
||||
{
|
||||
AreaManaRegen = value * 0.001f;
|
||||
SendAppearancePacket(AT_AreaManaRegen, value); // does this send to whole zone?
|
||||
// send test and particles?
|
||||
}
|
||||
|
||||
void Client::DisableAreaManaRegen()
|
||||
{
|
||||
AreaManaRegen = 1.0f;
|
||||
SendAppearancePacket(AT_AreaManaRegen, 1000);
|
||||
}
|
||||
|
||||
void Client::EnableAreaEndRegen(int value)
|
||||
{
|
||||
AreaEndRegen = value * 0.001f;
|
||||
SendAppearancePacket(AT_AreaEndRegen, value); // does this send to whole zone?
|
||||
// send test and particles?
|
||||
}
|
||||
|
||||
void Client::DisableAreaEndRegen()
|
||||
{
|
||||
AreaEndRegen = 1.0f;
|
||||
SendAppearancePacket(AT_AreaEndRegen, 1000);
|
||||
}
|
||||
|
||||
void Client::EnableAreaRegens(int value)
|
||||
{
|
||||
EnableAreaHPRegen(value);
|
||||
EnableAreaManaRegen(value);
|
||||
EnableAreaEndRegen(value);
|
||||
}
|
||||
|
||||
void Client::DisableAreaRegens()
|
||||
{
|
||||
DisableAreaHPRegen();
|
||||
DisableAreaManaRegen();
|
||||
DisableAreaEndRegen();
|
||||
}
|
||||
|
||||
void Client::InitInnates()
|
||||
{
|
||||
// this function on the client also inits the level one innate skills (like swimming, hide, etc)
|
||||
// we won't do that here, lets just do the InnateSkills for now. Basically translation of what the client is doing
|
||||
// A lot of these we could probably have ignored because they have no known use or are 100% client side
|
||||
// but I figured just in case we'll do them all out
|
||||
//
|
||||
// The client calls this in a few places. When you remove a vision buff and in SetHeights, which is called in
|
||||
// illusions, mounts, and a bunch of other cases. All of the calls to InitInnates are wrapped in restoring regen
|
||||
// besides the call initializing the first time
|
||||
auto race = GetRace();
|
||||
auto class_ = GetClass();
|
||||
|
||||
for (int i = 0; i < InnateSkillMax; ++i)
|
||||
m_pp.InnateSkills[i] = InnateDisabled;
|
||||
|
||||
m_pp.InnateSkills[InnateInspect] = InnateEnabled;
|
||||
m_pp.InnateSkills[InnateOpen] = InnateEnabled;
|
||||
if (race >= RT_FROGLOK_3) {
|
||||
if (race == RT_SKELETON_2 || race == RT_FROGLOK_3)
|
||||
m_pp.InnateSkills[InnateUltraVision] = InnateEnabled;
|
||||
else
|
||||
m_pp.InnateSkills[InnateInfravision] = InnateEnabled;
|
||||
}
|
||||
switch (race) {
|
||||
case RT_BARBARIAN:
|
||||
case RT_BARBARIAN_2:
|
||||
m_pp.InnateSkills[InnateSlam] = InnateEnabled;
|
||||
break;
|
||||
case RT_ERUDITE:
|
||||
case RT_ERUDITE_2:
|
||||
m_pp.InnateSkills[InnateLore] = InnateEnabled;
|
||||
break;
|
||||
case RT_WOOD_ELF:
|
||||
case RT_GUARD_3:
|
||||
m_pp.InnateSkills[InnateInfravision] = InnateEnabled;
|
||||
break;
|
||||
case RT_HIGH_ELF:
|
||||
case RT_GUARD_2:
|
||||
m_pp.InnateSkills[InnateInfravision] = InnateEnabled;
|
||||
m_pp.InnateSkills[InnateLore] = InnateEnabled;
|
||||
break;
|
||||
case RT_DARK_ELF:
|
||||
case RT_DARK_ELF_2:
|
||||
case RT_VAMPIRE_2:
|
||||
m_pp.InnateSkills[InnateUltraVision] = InnateEnabled;
|
||||
break;
|
||||
case RT_TROLL:
|
||||
case RT_TROLL_2:
|
||||
m_pp.InnateSkills[InnateRegen] = InnateEnabled;
|
||||
m_pp.InnateSkills[InnateSlam] = InnateEnabled;
|
||||
m_pp.InnateSkills[InnateInfravision] = InnateEnabled;
|
||||
break;
|
||||
case RT_DWARF:
|
||||
case RT_DWARF_2:
|
||||
m_pp.InnateSkills[InnateInfravision] = InnateEnabled;
|
||||
break;
|
||||
case RT_OGRE:
|
||||
case RT_OGRE_2:
|
||||
m_pp.InnateSkills[InnateInfravision] = InnateEnabled;
|
||||
m_pp.InnateSkills[InnateSlam] = InnateEnabled;
|
||||
m_pp.InnateSkills[InnateNoBash] = InnateEnabled;
|
||||
m_pp.InnateSkills[InnateBashDoor] = InnateEnabled;
|
||||
break;
|
||||
case RT_HALFLING:
|
||||
case RT_HALFLING_2:
|
||||
m_pp.InnateSkills[InnateInfravision] = InnateEnabled;
|
||||
break;
|
||||
case RT_GNOME:
|
||||
m_pp.InnateSkills[InnateInfravision] = InnateEnabled;
|
||||
m_pp.InnateSkills[InnateLore] = InnateEnabled;
|
||||
break;
|
||||
case RT_IKSAR:
|
||||
m_pp.InnateSkills[InnateRegen] = InnateEnabled;
|
||||
m_pp.InnateSkills[InnateInfravision] = InnateEnabled;
|
||||
break;
|
||||
case RT_VAH_SHIR:
|
||||
m_pp.InnateSkills[InnateInfravision] = InnateEnabled;
|
||||
break;
|
||||
case RT_FROGLOK_2:
|
||||
case RT_GHOST:
|
||||
case RT_GHOUL:
|
||||
case RT_SKELETON:
|
||||
case RT_VAMPIRE:
|
||||
case RT_WILL_O_WISP:
|
||||
case RT_ZOMBIE:
|
||||
case RT_SPECTRE:
|
||||
case RT_GHOST_2:
|
||||
case RT_GHOST_3:
|
||||
case RT_DRAGON_2:
|
||||
case RT_INNORUUK:
|
||||
m_pp.InnateSkills[InnateUltraVision] = InnateEnabled;
|
||||
break;
|
||||
case RT_HUMAN:
|
||||
case RT_GUARD:
|
||||
case RT_BEGGAR:
|
||||
case RT_HUMAN_2:
|
||||
case RT_HUMAN_3:
|
||||
case RT_FROGLOK_3: // client does froglok weird, but this should work out fine
|
||||
break;
|
||||
default:
|
||||
m_pp.InnateSkills[InnateInfravision] = InnateEnabled;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (class_) {
|
||||
case DRUID:
|
||||
m_pp.InnateSkills[InnateHarmony] = InnateEnabled;
|
||||
break;
|
||||
case BARD:
|
||||
m_pp.InnateSkills[InnateReveal] = InnateEnabled;
|
||||
break;
|
||||
case ROGUE:
|
||||
m_pp.InnateSkills[InnateSurprise] = InnateEnabled;
|
||||
m_pp.InnateSkills[InnateReveal] = InnateEnabled;
|
||||
break;
|
||||
case RANGER:
|
||||
m_pp.InnateSkills[InnateAwareness] = InnateEnabled;
|
||||
break;
|
||||
case MONK:
|
||||
m_pp.InnateSkills[InnateSurprise] = InnateEnabled;
|
||||
m_pp.InnateSkills[InnateAwareness] = InnateEnabled;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user