Browse Source

Disable second ear slot for DoF and earlier clients

Emagi 9 months ago
parent
commit
9eeeb1e012

+ 4 - 1
EQ2/source/WorldServer/Items/Items.cpp

@@ -4302,7 +4302,7 @@ bool EquipmentItemList::CheckEquipSlot(Item* tmp, int8 slot){
 	return false;
 }
 
-int8 EquipmentItemList::GetFreeSlot(Item* tmp, int8 slot_id){
+int8 EquipmentItemList::GetFreeSlot(Item* tmp, int8 slot_id, int16 version){
 	int8 slot = 0;
 	MEquipmentItems.lock();
 	for(int8 i=0;tmp && i<tmp->slot_data.size();i++){
@@ -4321,6 +4321,9 @@ int8 EquipmentItemList::GetFreeSlot(Item* tmp, int8 slot_id){
 			}
 			else if ( slot == EQ2_LRING_SLOT || slot == EQ2_EARS_SLOT_1 || slot == EQ2_LWRIST_SLOT || slot == EQ2_CHARM_SLOT_1)
 			{
+				if(version <= 546 && slot == EQ2_EARS_SLOT_1)
+					continue;
+			
 				Item* rslot = GetItem(slot+1);
 				if(!rslot)
 				{

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

@@ -1168,7 +1168,7 @@ public:
 	bool	AddItem(int8 slot, Item* item);
 	bool	CheckEquipSlot(Item* tmp, int8 slot);
 	bool	CanItemBeEquippedInSlot(Item* tmp, int8 slot);
-	int8	GetFreeSlot(Item* tmp, int8 slot_id = 255);
+	int8	GetFreeSlot(Item* tmp, int8 slot_id = 255, int16 version = 0);
 	int32	CheckSlotConflict(Item* tmp, bool check_lore_only = false, int16* lore_stack_count = 0);
 	
 	int8	GetSlotByItem(Item* item);

+ 10 - 4
EQ2/source/WorldServer/Player.cpp

@@ -1704,6 +1704,9 @@ EQ2Packet* Player::SwapEquippedItems(int8 slot1, int8 slot2, int16 version, int1
 	return 0;
 }
 bool Player::CanEquipItem(Item* item, int8 slot) {
+	if(client && client->GetVersion() <= 546 && slot == EQ2_EARS_SLOT_2)
+		return false;
+	
 	if (item) {
 		Client* client = GetZone()->GetClientBySpawn(this);
 		if (client) {
@@ -1767,7 +1770,8 @@ vector<EQ2Packet*> Player::EquipItem(int16 index, int16 version, int8 appearance
 			item_list.MPlayerItems.releasereadlock(__FUNCTION__, __LINE__);
 			return packets;
 		}
-		int8 slot = equipList->GetFreeSlot(item, slot_id);
+		int8 slot = equipList->GetFreeSlot(item, slot_id, version);
+		
 		bool canEquip = CanEquipItem(item,slot);
 		int32 conflictSlot = 0;
 		
@@ -4618,13 +4622,15 @@ int32 Player::GetStepProgress(int32 quest_id, int32 step_id) {
 
 void Player::RemoveQuest(int32 id, bool delete_quest){
 	MPlayerQuests.writelock(__FUNCTION__, __LINE__);
-	if(delete_quest){
-		safe_delete(player_quests[id]);
-	}
 	map<int32, Quest*>::iterator itr = player_quests.find(id);
 	if(itr != player_quests.end()) {
 		player_quests.erase(itr);
 	}
+	
+	if(delete_quest){
+		safe_delete(player_quests[id]);
+	}
+	
 	MPlayerQuests.releasewritelock(__FUNCTION__, __LINE__);
 	SendQuestRequiredSpawns(id);
 }