Browse Source

Restrict runback hp reset to only when mob is in combat, face target in combat

Image 2 years ago
parent
commit
9ee124382f

+ 5 - 4
EQ2/source/WorldServer/NPC.cpp

@@ -173,7 +173,7 @@ void NPC::SetSpells(vector<Spell*>* in_spells){
 	spells = in_spells;
 }
 
-void NPC::SetRunbackLocation(float x, float y, float z, int32 gridid){
+void NPC::SetRunbackLocation(float x, float y, float z, int32 gridid, bool set_hp_runback){
 	safe_delete(runback);
 	runback = new MovementLocation;
 	runback->x = x;
@@ -181,6 +181,7 @@ void NPC::SetRunbackLocation(float x, float y, float z, int32 gridid){
 	runback->z = z;
 	runback->gridid = gridid;
 	runback->stage = 0;
+	runback->reset_hp_on_runback = set_hp_runback;
 }
 
 MovementLocation* NPC::GetRunbackLocation(){
@@ -236,12 +237,12 @@ void NPC::ClearRunback(){
 	NeedsToResumeMovement(false);
 }
 
-void NPC::StartRunback()
+void NPC::StartRunback(bool reset_hp_on_runback)
 {
 	if(GetRunbackLocation())
 		return;
 
-	SetRunbackLocation(GetX(), GetY(), GetZ(), GetLocation());
+	SetRunbackLocation(GetX(), GetY(), GetZ(), GetLocation(), reset_hp_on_runback);
 	m_runbackHeadingDir1 = appearance.pos.Dir1;
 	m_runbackHeadingDir2 = appearance.pos.Dir2;
 }
@@ -284,7 +285,7 @@ void NPC::InCombat(bool val){
 	if(!in_combat && val){
 		// if not a pet and no current run back location set then set one to the current location
 		if(!IsPet() && !GetRunbackLocation()) {
-			StartRunback();
+			StartRunback(true);
 		}
 	}
 

+ 2 - 2
EQ2/source/WorldServer/NPC.h

@@ -80,7 +80,7 @@ public:
 	void	SetAppearanceID(int32 id){ appearance_id = id; }
 	int32	GetAppearanceID(){ return appearance_id; }
 	bool	IsNPC(){ return true; }
-	void	StartRunback();
+	void	StartRunback(bool reset_hp_on_runback = false);
 	void	InCombat(bool val);
 	bool	HandleUse(Client* client, string type);
 	void	SetRandomize(int32 value) {appearance.randomize = value;}
@@ -113,7 +113,7 @@ public:
 	int8	GetCastPercentage();
 	void	SetSkills(map<string, Skill*>* in_skills);
 	void	SetSpells(vector<Spell*>* in_spells);
-	void	SetRunbackLocation(float x, float y, float z, int32 gridid);
+	void	SetRunbackLocation(float x, float y, float z, int32 gridid, bool set_hp_runback = false);
 	MovementLocation* GetRunbackLocation();
 	float	GetRunbackDistance();
 	void	Runback(float distance=0.0f, bool stopFollowing = true);

+ 6 - 1
EQ2/source/WorldServer/NPC_AI.cpp

@@ -155,9 +155,14 @@ void Brain::Think() {
 								m_body->SetLocation(m_body->GetRunbackLocation()->gridid);
 								if(m_body->GetTempActionState() == 0)
 									m_body->SetTempActionState(-1);
+
 							m_body->SetHeading(m_body->m_runbackHeadingDir1,m_body->m_runbackHeadingDir2,false);
+
+							if(m_body->GetRunbackLocation()->reset_hp_on_runback)
+								m_body->SetHP(m_body->GetTotalHP());
+
 							m_body->ClearRunback();
-							m_body->SetHP(m_body->GetTotalHP());
+							
 							m_body->GetZone()->AddChangedSpawn(m_body);
 						break;
 						default: // captures case 1 up to case 5 to turn around / reset hp

+ 2 - 1
EQ2/source/WorldServer/Spawn.cpp

@@ -3116,6 +3116,7 @@ void Spawn::AddRunningLocation(float x, float y, float z, float speed, float dis
 	data->attackable = attackable;
 	data->lua_function = lua_function;
 	data->gridid = 0; // used for runback defaults
+	data->reset_hp_on_runback = false;
 
 	MMovementLocations->writelock(__FUNCTION__, __LINE__);
 	if(movement_locations->size() > 0)
@@ -3372,10 +3373,10 @@ void Spawn::FaceTarget(Spawn* target, bool disable_action_state){
 			((NPC*)this)->StartRunback();
 			((NPC*)this)->PauseMovement(30000);
 		}
-		FaceTarget(target->GetX(), target->GetZ());
 		if(disable_action_state)
 			SetTempActionState(0);
 	}
+	FaceTarget(target->GetX(), target->GetZ());
 }
 
 bool Spawn::MeetsSpawnAccessRequirements(Player* player){

+ 1 - 0
EQ2/source/WorldServer/Spawn.h

@@ -222,6 +222,7 @@ struct MovementLocation{
 	bool	mapped;
 	int32	gridid;
 	int8	stage;
+	bool	reset_hp_on_runback;
 };
 
 struct SpawnUpdate {