Browse Source

weaponstats command now supports a target, when client summons a npc it will stop movement, helps when summoning pets, zoning should now properly put you in your group instance when available

Emagi 1 year ago
parent
commit
00e6cdaf61

+ 27 - 10
EQ2/source/WorldServer/Commands/Commands.cpp

@@ -10784,24 +10784,39 @@ void Commands::Command_LeaveChannel(Client *client, Seperator *sep) {
 void Commands::Command_WeaponStats(Client* client)
 {
 	Player* player = client->GetPlayer();
-
+	Spawn* target = player->GetTarget();
+	
 	Item* primary = player->GetEquipmentList()->GetItem(EQ2_PRIMARY_SLOT);
 	Item* secondary = player->GetEquipmentList()->GetItem(EQ2_SECONDARY_SLOT);
 	Item* ranged = player->GetEquipmentList()->GetItem(EQ2_RANGE_SLOT);
+	const char* charName = player->GetName();
+	if(target && target->IsEntity()) {
+		primary = ((Entity*)target)->GetEquipmentList()->GetItem(EQ2_PRIMARY_SLOT);
+		secondary = ((Entity*)target)->GetEquipmentList()->GetItem(EQ2_SECONDARY_SLOT);
+		ranged = ((Entity*)target)->GetEquipmentList()->GetItem(EQ2_RANGE_SLOT);
+		charName = target->GetName();
+	}
+	else {
+		target = nullptr;
+	}
+	client->Message(0, "WeaponStats for %s", charName);
 	client->SimpleMessage(0, "Primary:");
 	if (primary) {
 		client->Message(0, "Name: %s", primary->name.c_str());
 		client->Message(0, "Base Damage: %u - %u", primary->weapon_info->damage_low3, primary->weapon_info->damage_high3);
-		client->Message(0, "Actual Damage: %u - %u", player->GetPrimaryWeaponMinDamage(), player->GetPrimaryWeaponMaxDamage());
-		client->Message(0, "Actual Delay: %u", player->GetPrimaryWeaponDelay());
+		client->Message(0, "Actual Damage: %u - %u", target ? ((Entity*)target)->GetPrimaryWeaponMinDamage() : player->GetPrimaryWeaponMinDamage(),
+													target ? ((Entity*)target)->GetPrimaryWeaponMaxDamage() : player->GetPrimaryWeaponMaxDamage());
+		client->Message(0, "Actual Delay: %u", target ? ((Entity*)target)->GetPrimaryWeaponDelay() : player->GetPrimaryWeaponDelay());
 		client->Message(0, "Proc Percent: %d%%", 0);
 		client->Message(0, "Procs Per Minute: %d", 0);
 	}
 	else {
 		client->SimpleMessage(0, "Name: fist");
-		client->Message(0, "Base Damage: %u - %u", player->GetPrimaryWeaponMinDamage(), player->GetPrimaryWeaponMaxDamage());
-		client->Message(0, "Actual Damage: %u - %u", player->GetPrimaryWeaponMinDamage(), player->GetPrimaryWeaponMaxDamage());
-		client->Message(0, "Actual Delay: %d", player->GetPrimaryWeaponDelay() * 0.1);
+		client->Message(0, "Base Damage: %u - %u", target ? ((Entity*)target)->GetPrimaryWeaponMinDamage() : player->GetPrimaryWeaponMinDamage(),
+												   target ? ((Entity*)target)->GetPrimaryWeaponMaxDamage() : player->GetPrimaryWeaponMaxDamage());
+		client->Message(0, "Actual Damage: %u - %u", target ? ((Entity*)target)->GetPrimaryWeaponMinDamage() : player->GetPrimaryWeaponMinDamage(), 
+													 target ? ((Entity*)target)->GetPrimaryWeaponMaxDamage() : player->GetPrimaryWeaponMaxDamage());
+		client->Message(0, "Actual Delay: %d", target ? ((Entity*)target)->GetPrimaryWeaponDelay() : player->GetPrimaryWeaponDelay() * 0.1);
 		client->Message(0, "Proc Percent: %d%%", 0);
 		client->Message(0, "Procs Per Minute: %d", 0);
 	}
@@ -10811,8 +10826,9 @@ void Commands::Command_WeaponStats(Client* client)
 		client->SimpleMessage(0, "Secondary:");
 		client->Message(0, "Name: %s", secondary->name.c_str());
 		client->Message(0, "Base Damage: %u - %u", secondary->weapon_info->damage_low3, secondary->weapon_info->damage_high3);
-		client->Message(0, "Actual Damage: %u - %u", player->GetSecondaryWeaponMinDamage(), player->GetSecondaryWeaponMaxDamage());
-		client->Message(0, "Actual Delay: %d", player->GetSecondaryWeaponDelay() * 0.1);
+		client->Message(0, "Actual Damage: %u - %u", target ? ((Entity*)target)->GetSecondaryWeaponMinDamage() : player->GetSecondaryWeaponMinDamage(), 
+													 target ? ((Entity*)target)->GetSecondaryWeaponMaxDamage() : player->GetSecondaryWeaponMaxDamage());
+		client->Message(0, "Actual Delay: %d", target ? ((Entity*)target)->GetSecondaryWeaponDelay() : player->GetSecondaryWeaponDelay() * 0.1);
 		client->Message(0, "Proc Percent: %d%%", 0);
 		client->Message(0, "Procs Per Minute: %d", 0);
 		client->SimpleMessage(0, " ");
@@ -10822,8 +10838,9 @@ void Commands::Command_WeaponStats(Client* client)
 	if (ranged) {
 		client->Message(0, "Name: %s", ranged->name.c_str());
 		client->Message(0, "Base Damage: %u - %u", ranged->ranged_info->weapon_info.damage_low3, ranged->ranged_info->weapon_info.damage_high3);
-		client->Message(0, "Actual Damage: %u - %u", player->GetRangedWeaponMinDamage(), player->GetRangedWeaponMaxDamage());
-		client->Message(0, "Actual Delay: %d", player->GetRangeWeaponDelay() * 0.1);
+		client->Message(0, "Actual Damage: %u - %u", target ? ((Entity*)target)->GetRangedWeaponMinDamage() : player->GetRangedWeaponMinDamage(), 
+													 target ? ((Entity*)target)->GetRangedWeaponMaxDamage() : player->GetRangedWeaponMaxDamage());
+		client->Message(0, "Actual Delay: %d",  target ? ((Entity*)target)->GetRangeWeaponDelay() : player->GetRangeWeaponDelay() * 0.1);
 		client->Message(0, "Proc Percent: %d%%", 0);
 		client->Message(0, "Procs Per Minute: %d", 0);
 	}

+ 25 - 16
EQ2/source/WorldServer/Player.cpp

@@ -5509,27 +5509,36 @@ void Player::DeleteMail(int32 mail_id, bool from_database) {
 }
 
 ZoneServer* Player::GetGroupMemberInZone(int32 zone_id) {
-	//if ( GetGroup() == NULL )
-		return NULL;
+	ZoneServer* ret = nullptr;
 
-	/*GroupMemberInfo* info = 0;
-	for(int32 i=0;i<GetGroup()->members.size(); i++){
-		info = GetGroup()->members[i];
-		if(info == group_member_info)
-			continue;
+	GroupMemberInfo* gmi = client->GetPlayer()->GetGroupMemberInfo();
+	// If the player has a group and destination zone id
+	if (gmi && zone_id) {
+		deque<GroupMemberInfo*>::iterator itr;
+
+		world.GetGroupManager()->GroupLock(__FUNCTION__, __LINE__);
 
-		// if the client exists, they are attached to a player,
-		// the player is currently in an instance, which has the same zone id (for that instance type)
-		if ( info->client != NULL && info->client->GetPlayer() != NULL && 
-			info->client->GetPlayer()->GetZone()->GetInstanceID() > 0 && 
-			info->client->GetPlayer()->GetZone()->GetZoneID() == zone_id )
+		PlayerGroup* group = world.GetGroupManager()->GetGroup(gmi->group_id);
+		if (group)
 		{
-			return info->client->GetPlayer()->GetZone();
+			group->MGroupMembers.readlock(__FUNCTION__, __LINE__);
+			deque<GroupMemberInfo*>* members = group->GetMembers();
+			// Loop through the group members
+			for (itr = members->begin(); itr != members->end(); itr++) {
+				// If a group member matches a target
+				if ((*itr)->member && (*itr)->member != this && (*itr)->member->GetZone() && (*itr)->member->GetZone()->GetInstanceID() > 0 && 
+					(*itr)->member->GetZone()->GetZoneID() == zone_id) {
+					// toggle the flag and break the loop
+					ret = (*itr)->member->GetZone();
+					break;
+				}
+			}
+			group->MGroupMembers.releasereadlock(__FUNCTION__, __LINE__);
 		}
+		
+		world.GetGroupManager()->ReleaseGroupLock(__FUNCTION__, __LINE__);
 	}
-
-	// no member is in an instance with this zone id
-	return NULL;*/
+	return ret;
 }
 
 

+ 1 - 1
EQ2/source/WorldServer/Player.h

@@ -643,7 +643,7 @@ public:
 	}
 	int32 GetIDWithPlayerSpawn(Spawn* spawn){
 		int32 id = 0;
-
+	
 		index_mutex.readlock(__FUNCTION__, __LINE__);
 		if (player_spawn_reverse_id_map.count(spawn) > 0)
 			id = player_spawn_reverse_id_map[spawn];

+ 3 - 0
EQ2/source/WorldServer/client.cpp

@@ -3924,6 +3924,9 @@ bool Client::Summon(const char* search_name) {
 				target->SetSpawnOrigHeading(target->GetHeading());
 			}
 			target->SetLocation(GetPlayer()->GetLocation());
+			if(target->IsNPC()) {
+					((NPC*)target)->HaltMovement();
+			}
 		}
 		else if (target)
 			Message(CHANNEL_COLOR_RED, "Error: You cannot summon yourself!");