Merge pull request #177 from clucksoft/raid_ooc_regen

Implemented Raid OOC Regen
This commit is contained in:
Michael Cook 2014-08-12 22:46:17 -04:00
commit 12b9531d8a
10 changed files with 47 additions and 7 deletions

View File

@ -76,6 +76,7 @@ RULE_BOOL ( Character, SharedBankPlat, false) //off by default to prevent duping
RULE_BOOL ( Character, BindAnywhere, false) RULE_BOOL ( Character, BindAnywhere, false)
RULE_INT ( Character, RestRegenPercent, 0) // Set to >0 to enable rest state bonus HP and mana regen. RULE_INT ( Character, RestRegenPercent, 0) // Set to >0 to enable rest state bonus HP and mana regen.
RULE_INT ( Character, RestRegenTimeToActivate, 30) // Time in seconds for rest state regen to kick in. RULE_INT ( Character, RestRegenTimeToActivate, 30) // Time in seconds for rest state regen to kick in.
RULE_INT ( Character, RestRegenRaidTimeToActivate, 300) // Time in seconds for rest state regen to kick in with a raid target.
RULE_BOOL ( Character, RestRegenEndurance, false) // Whether rest regen will work for endurance or not. RULE_BOOL ( Character, RestRegenEndurance, false) // Whether rest regen will work for endurance or not.
RULE_INT ( Character, KillsPerGroupLeadershipAA, 250) // Number of dark blues or above per Group Leadership AA RULE_INT ( Character, KillsPerGroupLeadershipAA, 250) // Number of dark blues or above per Group Leadership AA
RULE_INT ( Character, KillsPerRaidLeadershipAA, 250) // Number of dark blues or above per Raid Leadership AA RULE_INT ( Character, KillsPerRaidLeadershipAA, 250) // Number of dark blues or above per Raid Leadership AA

View File

@ -324,6 +324,9 @@ Client::Client(EQStreamInterface* ieqs)
initial_respawn_selection = 0; initial_respawn_selection = 0;
alternate_currency_loaded = false; alternate_currency_loaded = false;
EngagedRaidTarget = false;
SavedRaidRestTimer = 0;
} }
Client::~Client() { Client::~Client() {
@ -4330,12 +4333,16 @@ void Client::IncrementAggroCount() {
if(!RuleI(Character, RestRegenPercent)) if(!RuleI(Character, RestRegenPercent))
return; return;
// If we already had aggro before this method was called, the combat indicator should already be up for SoF clients, // If we already had aggro before this method was called, the combat indicator should already be up for SoF clients,
// so we don't need to send it again. // so we don't need to send it again.
// //
if(AggroCount > 1) if(AggroCount > 1)
return; return;
// Pause the rest timer
if (AggroCount == 1)
SavedRaidRestTimer = rest_timer.GetRemainingTime();
if(GetClientVersion() >= EQClientSoF) { if(GetClientVersion() >= EQClientSoF) {
@ -4367,14 +4374,27 @@ void Client::DecrementAggroCount() {
// Something else is still aggro on us, can't rest yet. // Something else is still aggro on us, can't rest yet.
if(AggroCount) return; if(AggroCount) return;
rest_timer.Start(RuleI(Character, RestRegenTimeToActivate) * 1000); uint32 time_until_rest;
if (GetEngagedRaidTarget()) {
time_until_rest = RuleI(Character, RestRegenRaidTimeToActivate) * 1000;
SetEngagedRaidTarget(false);
} else {
if (SavedRaidRestTimer > (RuleI(Character, RestRegenTimeToActivate) * 1000)) {
time_until_rest = SavedRaidRestTimer;
SavedRaidRestTimer = 0;
} else {
time_until_rest = RuleI(Character, RestRegenTimeToActivate) * 1000;
}
}
rest_timer.Start(time_until_rest);
if(GetClientVersion() >= EQClientSoF) { if(GetClientVersion() >= EQClientSoF) {
EQApplicationPacket *outapp = new EQApplicationPacket(OP_RestState, 5); EQApplicationPacket *outapp = new EQApplicationPacket(OP_RestState, 5);
char *Buffer = (char *)outapp->pBuffer; char *Buffer = (char *)outapp->pBuffer;
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0x00); VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0x00);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, RuleI(Character, RestRegenTimeToActivate)); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, (uint32)(time_until_rest / 1000));
QueuePacket(outapp); QueuePacket(outapp);
safe_delete(outapp); safe_delete(outapp);
} }

View File

@ -1198,6 +1198,9 @@ public:
int mod_food_value(const Item_Struct *item, int change); int mod_food_value(const Item_Struct *item, int change);
int mod_drink_value(const Item_Struct *item, int change); int mod_drink_value(const Item_Struct *item, int change);
void SetEngagedRaidTarget(bool value) { EngagedRaidTarget = value; }
bool GetEngagedRaidTarget() const { return EngagedRaidTarget; }
protected: protected:
friend class Mob; friend class Mob;
void CalcItemBonuses(StatBonuses* newbon); void CalcItemBonuses(StatBonuses* newbon);
@ -1442,6 +1445,9 @@ private:
unsigned int RestRegenHP; unsigned int RestRegenHP;
unsigned int RestRegenMana; unsigned int RestRegenMana;
unsigned int RestRegenEndurance; unsigned int RestRegenEndurance;
bool EngagedRaidTarget;
uint32 SavedRaidRestTimer;
std::set<uint32> zone_flags; std::set<uint32> zone_flags;

View File

@ -9140,7 +9140,8 @@ bool Client::FinishConnState2(DBAsyncWork* dbaw) {
m_pp.timeentitledonaccount = database.GetTotalTimeEntitledOnAccount(AccountID()) / 1440; m_pp.timeentitledonaccount = database.GetTotalTimeEntitledOnAccount(AccountID()) / 1440;
if(m_pp.RestTimer > RuleI(Character, RestRegenTimeToActivate)) // Reset rest timer if the durations have been lowered in the database
if ((m_pp.RestTimer > RuleI(Character, RestRegenTimeToActivate)) && (m_pp.RestTimer > RuleI(Character, RestRegenRaidTimeToActivate)))
m_pp.RestTimer = 0; m_pp.RestTimer = 0;
//This checksum should disappear once dynamic structs are in... each struct strategy will do it //This checksum should disappear once dynamic structs are in... each struct strategy will do it

View File

@ -198,8 +198,11 @@ void HateList::Add(Mob *ent, int32 in_hate, int32 in_dam, bool bFrenzy, bool iAd
list.push_back(p); list.push_back(p);
parse->EventNPC(EVENT_HATE_LIST, owner->CastToNPC(), ent, "1", 0); parse->EventNPC(EVENT_HATE_LIST, owner->CastToNPC(), ent, "1", 0);
if(ent->IsClient()) if (ent->IsClient()) {
if (owner->CastToNPC()->IsRaidTarget())
ent->CastToClient()->SetEngagedRaidTarget(true);
ent->CastToClient()->IncrementAggroCount(); ent->CastToClient()->IncrementAggroCount();
}
} }
} }

View File

@ -524,6 +524,7 @@ public:
//More stuff to sort: //More stuff to sort:
virtual bool IsRaidTarget() { return false; };
virtual bool IsAttackAllowed(Mob *target, bool isSpellAttack = false); virtual bool IsAttackAllowed(Mob *target, bool isSpellAttack = false);
bool IsTargeted() const { return (targeted > 0); } bool IsTargeted() const { return (targeted > 0); }
inline void IsTargeted(int in_tar) { targeted += in_tar; if(targeted < 0) targeted = 0;} inline void IsTargeted(int in_tar) { targeted += in_tar; if(targeted < 0) targeted = 0;}

View File

@ -358,6 +358,7 @@ NPC::NPC(const NPCType* d, Spawn2* in_respawn, float x, float y, float z, float
SetEmoteID(d->emoteid); SetEmoteID(d->emoteid);
InitializeBuffSlots(); InitializeBuffSlots();
CalcBonuses(); CalcBonuses();
raid_target = d->raid_target;
} }
NPC::~NPC() NPC::~NPC()

View File

@ -395,6 +395,8 @@ public:
void mod_npc_killed_merit(Mob* c); void mod_npc_killed_merit(Mob* c);
void mod_npc_killed(Mob* oos); void mod_npc_killed(Mob* oos);
void AISpellsList(Client *c); void AISpellsList(Client *c);
bool IsRaidTarget() const { return raid_target; };
protected: protected:
@ -500,6 +502,8 @@ protected:
//mercenary stuff //mercenary stuff
std::list<MercType> mercTypeList; std::list<MercType> mercTypeList;
std::list<MercData> mercDataList; std::list<MercData> mercDataList;
bool raid_target;
private: private:
uint32 loottable_id; uint32 loottable_id;

View File

@ -1115,7 +1115,8 @@ const NPCType* ZoneDatabase::GetNPCType (uint32 id) {
"npc_types.emoteid," "npc_types.emoteid,"
"npc_types.spellscale," "npc_types.spellscale,"
"npc_types.healscale," "npc_types.healscale,"
"npc_types.no_target_hotkey"; "npc_types.no_target_hotkey,"
"npc_types.raid_target";
MakeAnyLenString(&query, "%s FROM npc_types WHERE id=%d", basic_query, id); MakeAnyLenString(&query, "%s FROM npc_types WHERE id=%d", basic_query, id);
@ -1302,6 +1303,7 @@ const NPCType* ZoneDatabase::GetNPCType (uint32 id) {
tmpNPCType->spellscale = atoi(row[r++]); tmpNPCType->spellscale = atoi(row[r++]);
tmpNPCType->healscale = atoi(row[r++]); tmpNPCType->healscale = atoi(row[r++]);
tmpNPCType->no_target_hotkey = atoi(row[r++]) == 1 ? true : false; tmpNPCType->no_target_hotkey = atoi(row[r++]) == 1 ? true : false;
tmpNPCType->raid_target = atoi(row[r++]) == 0 ? false : true;
// If NPC with duplicate NPC id already in table, // If NPC with duplicate NPC id already in table,
// free item we attempted to add. // free item we attempted to add.

View File

@ -125,6 +125,7 @@ struct NPCType
float spellscale; float spellscale;
float healscale; float healscale;
bool no_target_hotkey; bool no_target_hotkey;
bool raid_target;
}; };
/* /*