Here is the latest diffs after making the recommended changes.
Code:
--- C:\Code\EQEmu800\zone\attack.cpp Wed Jun 07 18:29:26 2006
+++ C:\EQEmuSP\Source\0.7.0\zone\attack.cpp Sun Jun 25 22:25:28 2006
@@ -1727,10 +1727,18 @@
if (other == myowner)
return;
- if (owner) { // Other has a pet, add him and it
+ if (owner) { // Other is a pet, add him and it
hate_list.Add(other, hate, 0, bFrenzy, !iBuffTic);
+ // EverHood 6/12/06
+ // Can't add a feigned owner to hate list
+ if(owner->IsClient()){
+ if(!owner->CastToClient()->GetFeigned()){
hate_list.Add(owner, 1, damage, false, !iBuffTic);
}
+ }else{
+ hate_list.Add(owner, 1, damage, false, !iBuffTic);
+ }
+ }
else { // Other has no pet, add other
hate_list.Add(other, hate, damage, false, !iBuffTic);
}
@@ -2068,9 +2077,21 @@
else
hate = damage; // normal aggro for everything else
- mlog(COMBAT__HITS, "Generating hate %d towards %s", hate, attacker->GetName());
- // now add done damage to the hate list
+ // EverHood 6/12/06
+ if(attacker->IsClient()){
+ // check if attacker is feigned
+ if(attacker->CastToClient()->GetFeigned()){
+ hate = -1; // no hate for feigned attackers
+ }
+ }
+
+ if(hate != -1){
+ // attacker generated some hate so
+ // add damage done by attacker to the hate list
+ // mlog(COMBAT__HITS, "Generating %d hate towards %s", hate, attacker->GetName());
AddToHateList(attacker, hate, damage, true, false, iBuffTic);
+ }
+
}
if(damage > 0) {
--- C:\Code\EQEmu800\zone\client.cpp Fri May 12 19:35:58 2006
+++ C:\EQEmuSP\Source\0.7.0\zone\client.cpp Sun Jun 25 17:55:21 2006
@@ -143,6 +143,8 @@
ooc_timer(1000),
shield_timer(500),
fishing_timer(8000),
+ // EverHood 6/16/06
+ forget_timer(0),
#ifdef REVERSE_AGGRO
scanarea_timer(AIClientScanarea_delay),
#endif
@@ -1763,13 +1765,25 @@
}
void Client::SetFeigned(bool in_feigned) {
+ feigned=in_feigned;
if (in_feigned)
{
+// EverHood 6/12/06
+// Live doesn't kill pets when owner feigns anymore
+// Hasn't since mobs quit agroing pets.
+// If you're worried necros will Feign and let pet solo
+// mobs turn this on in Features.h.
+// *Note: If a necro pet can solo an xp bearing mob while owner is FD
+// that mob needs it's stats bumped.
+#ifdef KILL_PET_ON_FEIGN
SetPet(0);
+#endif
SetHorseId(0);
entity_list.ClearFeignAggro(this);
+ forget_timer.Start(FeignMemoryDuration);
+ }else{
+ forget_timer.Disable();
}
- feigned=in_feigned;
}
void Client::LogMerchant(Client* player, Mob* merchant, Merchant_Sell_Struct* mp, const Item_Struct* item, bool buying)
--- C:\Code\EQEmu800\zone\client.h Wed Jun 07 18:29:26 2006
+++ C:\EQEmuSP\Source\0.7.0\zone\client.h Sun Jun 25 22:29:31 2006
@@ -512,7 +512,9 @@
inline void SetBecomeNPCLevel(int8 level) { npclevel = level; }
bool LootToStack(uint32 itemid);
void SetFeigned(bool in_feigned);
- inline bool GetFeigned() { return(GetAppearance() != eaDead ? false : feigned); }
+ // EverHood 6/16/06
+ /// this cures timing issues cuz dead animation isn't done but server side feigning is?
+ inline bool GetFeigned() {return(feigned); }
EQStreamInterface* Connection() { return eqs; }
#ifdef PACKET_PROFILER
void DumpPacketProfile() { if(eqs) eqs->DumpPacketProfile(); }
@@ -768,6 +770,9 @@
Timer ooc_timer;
Timer shield_timer;
Timer fishing_timer;
+ // EverHood 6/16/06
+ // our 2 min everybody forgets you timer
+ Timer forget_timer;
#ifdef REVERSE_AGGRO
Timer scanarea_timer;
#endif
--- C:\Code\EQEmu800\zone\client_process.cpp Mon Apr 17 06:59:14 2006
+++ C:\EQEmuSP\Source\0.7.0\zone\client_process.cpp Sun Jun 25 01:29:00 2006
@@ -533,7 +533,8 @@
#ifdef REVERSE_AGGRO
//At this point, we are still connected, everything important has taken
//place, now check to see if anybody wants to aggro us.
- if(ret && scanarea_timer.Check()) {
+ // Everhood 6/15/06 - only if client is not feigned
+ if(ret && !GetFeigned() && scanarea_timer.Check()) {
entity_list.CheckClientAggro(this);
}
#endif
@@ -576,7 +577,12 @@
}
OnDisconnect(true);
}
-
+ // EverHood Feign Death 2 minutes and zone forgets you
+ if (forget_timer.Check()) {
+ forget_timer.Disable();
+ entity_list.ClearZoneFeignAggro(this);
+ Message(0,"Your enemies have forgotten you!");
+ }
return ret;
}
--- C:\Code\EQEmu800\zone\entity.cpp Wed May 31 21:13:32 2006
+++ C:\EQEmuSP\Source\0.7.0\zone\entity.cpp Sun Jun 25 21:28:04 2006
@@ -2471,12 +2471,31 @@
iterator.Reset();
while(iterator.MoreElements())
{
- if (iterator.GetData()->CastToNPC()->CheckAggro(targ))
+ if (iterator.GetData()->CheckAggro(targ))
{
- iterator.GetData()->CastToNPC()->RemoveFromHateList(targ);
- if (iterator.GetData()->CastToMob()->GetLevel() >= 35)
- iterator.GetData()->CastToNPC()->SetFeignMemory(targ->CastToMob()->GetName());
+ iterator.GetData()->RemoveFromHateList(targ);
+ // EverHood 6/24/06
+ // For client targets if the mob that hated us is 35+
+ // there is a 3 outta 5 chance he adds us to feign memory
+ if(targ->IsClient()){
+ if (iterator.GetData()->GetLevel() >= 35){
+ if(MakeRandomInt(1,100)<=60){
+ iterator.GetData()->AddFeignMemory(targ->CastToClient());
}
+ }
+ }
+ }
+ iterator.Advance();
+ }
+}
+// EverHood 6/17/06
+void EntityList::ClearZoneFeignAggro(Client* targ)
+{
+ LinkedListIterator<NPC*> iterator(npc_list);
+ iterator.Reset();
+ while(iterator.MoreElements())
+ {
+ iterator.GetData()->RemoveFromFeignMemory(targ);
iterator.Advance();
}
}
--- C:\Code\EQEmu800\zone\entity.h Wed May 31 21:13:32 2006
+++ C:\EQEmuSP\Source\0.7.0\zone\entity.h Sun Jun 18 02:07:29 2006
@@ -251,6 +251,8 @@
void Process();
void ClearFeignAggro(Mob* targ);
+ // Everhood 6/17/06
+ void ClearZoneFeignAggro(Client* targ);
bool Fighting(Mob* targ);
void RemoveFromHateLists(Mob* mob, bool settoone = false);
--- C:\Code\EQEmu800\zone\features.h Sat Mar 18 21:09:26 2006
+++ C:\EQEmuSP\Source\0.7.0\zone\features.h Sun Jun 25 22:35:20 2006
@@ -207,7 +207,8 @@
AIassistcheck_delay = 3000, //now often a fighting NPC will yell for help
ClientProximity_interval = 1000,
Tribute_duration = 600000,
- ZoneTimerResolution = 3 //sleep time between zone main loop runs (milliseconds)
+ ZoneTimerResolution = 3, //sleep time between zone main loop runs (milliseconds)
+ FeignMemoryDuration = 120000 // EverHood - Duration player must feign death to clear zonewide agro.
};
enum { //some random constants
@@ -262,7 +263,7 @@
#define MIN_FACTION -1500
//The Level Cap:
-#define LEVEL_CAP 65 //hard cap is 127
+#define LEVEL_CAP 70 //hard cap is 127
//the square of the maximum range at whihc you could possibly use NPC services (shop, tribute, etc)
#define USE_NPC_RANGE2 200*200 //arbitrary right now
--- C:\Code\EQEmu800\zone\MobAI.cpp Wed May 31 21:13:32 2006
+++ C:\EQEmuSP\Source\0.7.0\zone\MobAI.cpp Sun Jun 25 21:55:28 2006
@@ -938,16 +938,30 @@
if (cur_wp_x == GetX() && cur_wp_y == GetY())
{ // are we there yet? then stop
mlog(AI__WAYPOINTS, "We have reached waypoint %d (%.3f,%.3f,%.3f) on grid %d", cur_wp, GetX(), GetY(), GetZ(), GetGrid());
SetWaypointPause();
SetAppearance(eaStanding, false);
SetMoving(false);
SendPosition();
+ // EverHood - wipe feign memory since we reached our first waypoint
+ if(cur_wp==1){
+ ClearFeignMemory();
+ }
}
@@ -969,6 +983,8 @@
{
if(moved) {
mlog(AI__WAYPOINTS, "Reached guard point (%.3f,%.3f,%.3f)", guard_x, guard_y, guard_z);
+ // EverHood 6/18/06
+ ClearFeignMemory();
moved=false;
SetMoving(false);
SendPosition();