Browse Source

Fix #520 add hate-threat messages to dof client, fix modify hp and power to not reset on calculatebonuses for spells

Emagi 2 weeks ago
parent
commit
02f6f2a1af

+ 2 - 0
EQ2/source/WorldServer/Commands/Commands.cpp

@@ -1092,10 +1092,12 @@ bool Commands::SetSpawnCommand(Client* client, Spawn* target, int8 type, const c
 				break;
 									  }
 			case SPAWN_SET_VALUE_HP:{
+				target->SetTotalHPBase(val);
 				target->SetHP(val, send_update);
 				break;
 									}
 			case SPAWN_SET_VALUE_POWER:{
+				target->SetTotalPowerBase(val);
 				target->SetPower(val, send_update);
 				break;
 									   }

+ 2 - 2
EQ2/source/WorldServer/Entity.cpp

@@ -1489,8 +1489,8 @@ void Entity::CalculateBonuses(){
 	}
 	prim_power_bonus = floor(float(prim_power_bonus));
 	sta_hp_bonus = floor(float(sta_hp_bonus));
-	SetTotalHP(GetTotalHPBase() + values->health + sta_hp_bonus);
-	SetTotalPower(GetTotalPowerBase() + values->power + prim_power_bonus);
+	SetTotalHP(GetTotalHPBaseInstance() + values->health + sta_hp_bonus);
+	SetTotalPower(GetTotalPowerBaseInstance() + values->power + prim_power_bonus);
 	if(GetHP() > GetTotalHP())
 		SetHP(GetTotalHP());
 	if(GetPower() > GetTotalPower())

+ 4 - 4
EQ2/source/WorldServer/LuaFunctions.cpp

@@ -2094,8 +2094,8 @@ int EQ2Emu_lua_ModifyMaxPower(lua_State* state) {
 	sint32 value = lua_interface->GetSInt32Value(state, 2);
 	lua_interface->ResetFunctionStack(state);
 	if (spawn && value != 0) {
-		if (value > spawn->GetTotalHPBase())
-			spawn->SetTotalPower(spawn->GetTotalPower() + value);
+		spawn->SetTotalPower(value);
+		spawn->SetTotalPowerBaseInstance(value);
 	}
 	return 0;
 }
@@ -2106,8 +2106,8 @@ int EQ2Emu_lua_ModifyMaxHP(lua_State* state) {
 	sint32 value = lua_interface->GetSInt32Value(state, 2);
 	lua_interface->ResetFunctionStack(state);
 	if (spawn && value != 0) {
-		if (value > spawn->GetTotalHPBase())
-			spawn->SetTotalHP(spawn->GetTotalHP() + value);
+		spawn->SetTotalHP(value);
+		spawn->SetTotalHPBaseInstance(value);	
 	}
 	return 0;
 }

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

@@ -1474,12 +1474,18 @@ void Spawn::SetTotalHP(sint32 new_val){
 void Spawn::SetTotalHPBase(sint32 new_val)
 {
 	SetInfo(&basic_info.hp_base, new_val);
-
+	
 	if(GetZone() && basic_info.cur_hp > 0 && basic_info.cur_hp < basic_info.max_hp)
 		GetZone()->AddDamagedSpawn(this);
 
 	SendGroupUpdate();
 }
+
+void Spawn::SetTotalHPBaseInstance(sint32 new_val)
+{
+	SetInfo(&basic_info.hp_base_instance, new_val);
+}
+
 sint32 Spawn::GetHP()
 {
 	return basic_info.cur_hp;
@@ -1492,6 +1498,14 @@ sint32 Spawn::GetTotalHPBase()
 {
 	return basic_info.hp_base;
 }
+sint32 Spawn::GetTotalHPBaseInstance()
+{
+	return basic_info.hp_base_instance;
+}
+sint32 Spawn::GetTotalPowerBaseInstance()
+{
+	return basic_info.power_base_instance;
+}
 
 
 /*** POWER ***/
@@ -1546,12 +1560,18 @@ void Spawn::SetTotalPower(sint32 new_val)
 void Spawn::SetTotalPowerBase(sint32 new_val)
 {
 	SetInfo(&basic_info.power_base, new_val);
-
+	
 	if(GetZone() && basic_info.cur_power < basic_info.max_power)
 		GetZone()->AddDamagedSpawn(this);
 
 	SendGroupUpdate();
 }
+
+void Spawn::SetTotalPowerBaseInstance(sint32 new_val)
+{
+	SetInfo(&basic_info.power_base_instance, new_val);
+}
+
 sint32 Spawn::GetPower()
 {
 	return basic_info.cur_power;

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

@@ -205,9 +205,11 @@ struct BasicInfoStruct{
 	sint32	cur_hp;
 	sint32	max_hp;
 	sint32	hp_base;
+	sint32	hp_base_instance;
 	sint32	cur_power;
 	sint32	max_power;
 	sint32	power_base;
+	sint32	power_base_instance;
 	sint32	cur_savagery;
 	sint32	max_savagery;
 	sint32	savagery_base;
@@ -703,7 +705,9 @@ public:
 	sint32 GetTotalHP();
 	sint32 GetHP();
 	sint32 GetTotalHPBase();
+	sint32 GetTotalHPBaseInstance();
 	sint32 GetTotalPowerBase();
+	sint32 GetTotalPowerBaseInstance();
 	float GetHPRatio() { return GetHP() == 0 || GetTotalHP() == 0 ? 0 : ((float) GetHP() / GetTotalHP() * 100); }
 	int GetIntHPRatio() { return GetTotalHP() == 0 ? 0 : static_cast<int>(GetHPRatio()); }
 	
@@ -728,7 +732,9 @@ public:
 	void SetTotalSavagery(sint32 new_val);
 	void SetTotalDissonance(sint32 new_val);
 	void SetTotalPowerBase(sint32 new_val);
+	void SetTotalPowerBaseInstance(sint32 new_val);
 	void SetTotalHPBase(sint32 new_val);
+	void SetTotalHPBaseInstance(sint32 new_val);
 	void SetTotalSavageryBase(sint32 new_val);
 	void SetTotalDissonanceBase(sint32 new_val);
 	void SetPower(sint32 power, bool setUpdateFlags = true);

+ 18 - 8
EQ2/source/WorldServer/zoneserver.cpp

@@ -5356,16 +5356,26 @@ void ZoneServer::SendThreatPacket(Spawn* caster, Spawn* target, int32 threat_amt
 		if(target && target->GetDistance(client->GetPlayer()) > 50)
 			continue;
 		
-		PacketStruct* packet = configReader.getStruct("WS_HearThreatCmd", client->GetVersion());
-		if (packet) {
-			packet->setDataByName("spell_name", spell_name);
-			packet->setDataByName("spawn_id", client->GetPlayer()->GetIDWithPlayerSpawn(caster));
-			packet->setDataByName("target", client->GetPlayer()->GetIDWithPlayerSpawn(target));
-			packet->setDataByName("threat_amount", threat_amt);
+		if(client->GetVersion() <= 547) {
+			int8 channel = 46;
 			
-			client->QueuePacket(packet->serialize());
+			if(client->GetPlayer() == caster || client->GetPlayer() == target)
+				channel = 42;
+			
+			client->Message(channel, "%s increases %s hate with %s for %u threat.", spell_name, (client->GetPlayer() == caster) ? "YOUR" : caster->GetName(), (client->GetPlayer() == target) ? "YOU" : target->GetName(), threat_amt);
+		}
+		else {
+			PacketStruct* packet = configReader.getStruct("WS_HearThreatCmd", client->GetVersion());
+			if (packet) {
+				packet->setDataByName("spell_name", spell_name);
+				packet->setDataByName("spawn_id", client->GetPlayer()->GetIDWithPlayerSpawn(caster));
+				packet->setDataByName("target", client->GetPlayer()->GetIDWithPlayerSpawn(target));
+				packet->setDataByName("threat_amount", threat_amt);
+				
+				client->QueuePacket(packet->serialize());
+			}
+			safe_delete(packet);
 		}
-		safe_delete(packet);
 	}
 	MClientList.releasereadlock(__FUNCTION__, __LINE__);
 }