Browse Source

Fix #416 allow FOCUS damage type, damage type 14 assigned, example: DamageSpawn(NPC, Spawn, 192, 14, 100, 100)
Does 100 damage with min/max set the same

Emagi 1 year ago
parent
commit
0c95946f48

+ 17 - 2
EQ2/source/WorldServer/Combat.cpp

@@ -893,6 +893,10 @@ float Entity::GetDamageTypeResistPercentage(int8 damage_type) {
 		LogWrite(COMBAT__DEBUG, 3, "Combat", "DamageType: Poison (%i), Amt: %.2f", damage_type, ret);
 		break;
 										   }
+	case DAMAGE_PACKET_DAMAGE_TYPE_FOCUS: {
+	   ret = 0.0f;
+		break;
+										  }
 	}
 
 	return ret;
@@ -917,6 +921,8 @@ Skill* Entity::GetSkillByWeaponType(int8 type, int8 damage_type, bool update) {
 	case DAMAGE_PACKET_DAMAGE_TYPE_DISEASE:
 	case DAMAGE_PACKET_DAMAGE_TYPE_POISON:
 		return GetSkillByName("Disruption", update);
+	case DAMAGE_PACKET_DAMAGE_TYPE_FOCUS:
+		return GetSkillByName("Focus", update);
 	}
 
 	return 0;
@@ -945,8 +951,10 @@ bool Entity::DamageSpawn(Entity* victim, int8 type, int8 damage_type, int32 low_
 		//damage = (rand()%((int)(high_damage-low_damage) + low_damage)) + (rand()%((int)(high_damage-low_damage) + low_damage)); 
 
 		//DPS mod is only applied to auto attacks
-		if (type == DAMAGE_PACKET_TYPE_SIMPLE_DAMAGE || type == DAMAGE_PACKET_TYPE_RANGE_DAMAGE ) {
-			damage *= (info_struct.get_dps_multiplier());
+		if (type == DAMAGE_PACKET_TYPE_SIMPLE_DAMAGE || type == DAMAGE_PACKET_TYPE_RANGE_DAMAGE) {
+			if(info_struct.get_dps_multiplier() != 0.0f) {
+				damage *= (info_struct.get_dps_multiplier());
+			}
 		}
 		//Potency and ability mod is only applied to spells/CAs
 		else { 
@@ -1123,6 +1131,9 @@ float Entity::CalculateMitigation(int8 type, int8 damage_type, int16 effective_l
 			case DAMAGE_PACKET_DAMAGE_TYPE_CRUSH:
 				mit_to_use += GetInfoStruct()->get_mitigation_skill3(); // crush
 			break;
+			case DAMAGE_PACKET_DAMAGE_TYPE_FOCUS:
+				return 0.0f; // focus cannot be mitigated, just break out of this now
+			break;
 			default:
 			// do nothing
 			break;
@@ -1725,6 +1736,10 @@ sint32 Entity::CalculateDamageAmount(Spawn* target, sint32 damage, int8 base_typ
 }
 
 sint32 Entity::CalculateDamageAmount(Spawn* target, sint32 damage, int8 base_type, int8 damage_type, int8 target_type) {
+	if(damage_type == DAMAGE_PACKET_RESULT_FOCUS) {
+		return damage; // cannot avoid focus damage
+	}
+	
 	// only spells may add spell damage item stat
 	if(damage_type >= DAMAGE_PACKET_DAMAGE_TYPE_HEAT && damage_type <= DAMAGE_PACKET_DAMAGE_TYPE_POISON)
 	{

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

@@ -10628,59 +10628,8 @@ void Commands::Command_Test(Client* client, EQ2_16BitString* command_parms) {
 		else if (atoi(sep->arg[0]) == 27) {
 			Spawn* target = client->GetPlayer()->GetTarget();
 			PacketStruct* packet2 = configReader.getStruct("WS_HearSimpleDamage", client->GetVersion());
-			if (packet2 && target && sep->IsSet(2)) {
-				packet2->setSubstructDataByName("header", "defender", client->GetPlayer()->GetIDWithPlayerSpawn(target));
-				packet2->setSubstructDataByName("header", "defender_proxy", client->GetPlayer()->GetIDWithPlayerSpawn(target));
-				packet2->setSubstructDataByName("header", "attacker", client->GetPlayer()->GetIDWithPlayerSpawn(client->GetPlayer()));
-				packet2->setArrayLengthByName("num_dmg", 1);				
-				packet2->setArrayDataByName("damage_type", atoi(sep->arg[1]));
-				packet2->setArrayDataByName("damage", atoi(sep->arg[2]));
-				packet2->setDataByName("spell", 1);
-				packet2->setDataByName("spell_name", "Testing");
-				EQ2Packet* app = packet2->serialize();
-				if (sep->IsSet(4)) {
-					int16 offset = atoi(sep->arg[3]);
-					uchar* ptr2 = app->pBuffer;
-					ptr2 += offset;
-					if (sep->IsNumber(4)) {
-						int32 value1 = atol(sep->arg[4]);
-						if (value1 > 0xFFFF)
-							memcpy(ptr2, (uchar*)&value1, 4);
-						else if (value1 > 0xFF)
-							memcpy(ptr2, (uchar*)&value1, 2);
-						else
-							memcpy(ptr2, (uchar*)&value1, 1);
-					}
-					else {
-						int8 len = strlen(sep->arg[4]);
-						memcpy(ptr2, (uchar*)&len, 1);
-						ptr2 += 1;
-						memcpy(ptr2, sep->arg[4], len);
-					}
-				}
-				if (sep->IsSet(6)) {
-					int16 offset = atoi(sep->arg[5]);
-					uchar* ptr2 = app->pBuffer;
-					ptr2 += offset;
-					if (sep->IsNumber(6)) {
-						int32 value1 = atol(sep->arg[6]);
-						if (value1 > 0xFFFF)
-							memcpy(ptr2, (uchar*)&value1, 4);
-						else if (value1 > 0xFF)
-							memcpy(ptr2, (uchar*)&value1, 2);
-						else
-							memcpy(ptr2, (uchar*)&value1, 1);
-					}
-					else {
-						int8 len = strlen(sep->arg[6]);
-						memcpy(ptr2, (uchar*)&len, 1);
-						ptr2 += 1;
-						memcpy(ptr2, sep->arg[6], len);
-					}
-				}
-				DumpPacket(app);
-				client->QueuePacket(app);
-				safe_delete(packet2);
+			if (packet2 && target && sep->IsSet(4)) {
+				client->GetPlayer()->GetZone()->SendDamagePacket(client->GetPlayer(), target, atoul(sep->arg[1]), atoul(sep->arg[2]), atoul(sep->arg[3]), atoul(sep->arg[4]), sep->arg[5] != nullptr ? sep->arg[5] : "");
 			}
 		}
 		else if (atoi(sep->arg[0]) == 28 && sep->IsNumber(1)) {

+ 1 - 0
EQ2/source/WorldServer/Player.cpp

@@ -6532,6 +6532,7 @@ NPC* Player::InstantiateSpiritShard(float origX, float origY, float origZ, float
 		npc->SetSpawnOrigZ(origZ);
 		npc->SetSpawnOrigHeading(origHeading);
 		npc->SetLocation(origGridID);
+		npc->SetAlive(false);
 		const char* script = rule_manager.GetGlobalRule(R_Combat, SpiritShardSpawnScript)->GetString();
 
 		int32 dbid = database.CreateSpiritShard(newName.c_str(), GetLevel(), GetRace(), GetGender(), GetAdventureClass(), GetModelType(), GetSogaModelType(), 

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

@@ -70,6 +70,7 @@
 #define DAMAGE_PACKET_RESULT_IMMUNE			44
 #define DAMAGE_PACKET_RESULT_DEFLECT		48
 #define DAMAGE_PACKET_RESULT_COUNTER		52
+#define DAMAGE_PACKET_RESULT_FOCUS			56 // focus damage
 #define DAMAGE_PACKET_RESULT_COUNTER_STRIKE	60
 #define DAMAGE_PACKET_RESULT_BASH			64
 
@@ -86,6 +87,9 @@
 #define DAMAGE_PACKET_DAMAGE_TYPE_DROWN		10
 #define DAMAGE_PACKET_DAMAGE_TYPE_FALLING	11
 #define DAMAGE_PACKET_DAMAGE_TYPE_PAIN		12
+#define DAMAGE_PACKET_DAMAGE_TYPE_HIT		13
+#define DAMAGE_PACKET_DAMAGE_TYPE_FOCUS		14 // used as a placeholder to translate over to focus from LUA functions and weapons
+
 
 #define HEAL_PACKET_TYPE_SIMPLE_HEAL        0
 #define HEAL_PACKET_TYPE_CRIT_HEAL          1

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

@@ -1188,7 +1188,8 @@ void WorldDatabase::LoadSpiritShards(ZoneServer* zone){
 		shard->SetLocation(atoul(row[32]));
 		shard->SetShardID(atoul(row[33]));
 		shard->SetShardCharID(atoul(row[34]));
-
+		shard->SetAlive(false);
+		
 		const char* script = rule_manager.GetGlobalRule(R_Combat, SpiritShardSpawnScript)->GetString();
 
 		if(script)

+ 7 - 1
EQ2/source/WorldServer/zoneserver.cpp

@@ -4921,6 +4921,12 @@ void ZoneServer::SendDamagePacket(Spawn* attacker, Spawn* victim, int8 type1, in
 			client->TargetSpawn(attacker);
 	}
 
+	if(damage_type == DAMAGE_PACKET_DAMAGE_TYPE_FOCUS) {
+		type1 = DAMAGE_PACKET_TYPE_SIMPLE_DAMAGE;
+		damage_type = 0;
+		type2 = DAMAGE_PACKET_RESULT_FOCUS;
+	}
+		
 	vector<Client*>::iterator client_itr;
 	MClientList.readlock(__FUNCTION__, __LINE__);
 	for (client_itr = clients.begin(); client_itr != clients.end(); client_itr++) {
@@ -4969,7 +4975,7 @@ void ZoneServer::SendDamagePacket(Spawn* attacker, Spawn* victim, int8 type1, in
 			MClientList.releasereadlock(__FUNCTION__, __LINE__);
 			return;
 		}
-
+		
 		if (packet) {
 			if (client->GetVersion() > 546) {
 				packet->setSubstructDataByName("header", "packet_type", type1);