2
0
Эх сурвалжийг харах

BETA: Partially reverted [5055], now RequestUnEquipItem is updated, custom checks and system messages removed/updated with retail information.

Also removed custom checks for Cursed Weapons.
Zoey76 13 жил өмнө
parent
commit
c0072c1dc4

+ 1 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java

@@ -183,8 +183,7 @@ public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>,
 						client.handleCheat("Used obsolete RequestEquipItem packet!");
 						break;
 					case 0x16:
-						// RequestUnEquipItem
-						client.handleCheat("Used obsolete RequestUnEquipItem packet!");
+						msg = new RequestUnEquipItem();
 						break;
 					case 0x17:
 						msg = new RequestDropItem();

+ 140 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestUnEquipItem.java

@@ -0,0 +1,140 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.network.clientpackets;
+
+import java.util.logging.Logger;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.model.L2ItemInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
+import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
+import com.l2jserver.gameserver.templates.item.L2EtcItem;
+import com.l2jserver.gameserver.templates.item.L2Item;
+
+/**
+ * @author Zoey76
+ */
+public class RequestUnEquipItem extends L2GameClientPacket
+{
+	private static final String _C__16_REQUESTUNEQUIPITEM = "[C] 16 RequestUnequipItem";
+	private static Logger _log = Logger.getLogger(RequestUnEquipItem.class.getName());
+	
+	private int _slot;
+	
+	/**
+	 * Packet type id 0x16 format: cd
+	 */
+	@Override
+	protected void readImpl()
+	{
+		_slot = readD();
+	}
+	
+	@Override
+	protected void runImpl()
+	{
+		if (Config.DEBUG)
+		{
+			_log.fine("Request unequip slot " + _slot);
+		}
+		
+		final L2PcInstance activeChar = getClient().getActiveChar();
+		if (activeChar == null)
+		{
+			return;
+		}
+		
+		final L2ItemInstance item = activeChar.getInventory().getPaperdollItemByL2ItemId(_slot);
+		// Wear-items are not to be unequipped.
+		if (item == null)
+		{
+			return;
+		}
+		
+		// The English system message say weapon, but it's applied to any equipped item.
+		if (activeChar.isAttackingNow() || activeChar.isCastingNow() || activeChar.isCastingSimultaneouslyNow())
+		{
+			activeChar.sendPacket(SystemMessageId.CANNOT_CHANGE_WEAPON_DURING_AN_ATTACK);
+			return;
+		}
+		
+		// Arrows and bolts.
+		if ((_slot == L2Item.SLOT_L_HAND) && (item.getItem() instanceof L2EtcItem))
+		{
+			return;
+		}
+		
+		// Prevent of unequipping a cursed weapon.
+		if ((_slot == L2Item.SLOT_LR_HAND) && (activeChar.isCursedWeaponEquipped() || activeChar.isCombatFlagEquipped()))
+		{
+			return;
+		}
+		
+		// Prevent player from unequipping items in special conditions.
+		if (activeChar.isStunned() || activeChar.isSleeping() || activeChar.isParalyzed() || activeChar.isAlikeDead())
+		{
+			return;
+		}
+		
+		if (!activeChar.getInventory().canManipulateWithItemId(item.getItemId()))
+		{
+			activeChar.sendPacket(SystemMessageId.ITEM_CANNOT_BE_TAKEN_OFF);
+			return;
+		}
+		
+		if (item.isWeapon() && item.getWeaponItem().isForceEquip() && !activeChar.isGM())
+		{
+			activeChar.sendPacket(SystemMessageId.ITEM_CANNOT_BE_TAKEN_OFF);
+			return;
+		}
+		
+		final L2ItemInstance[] unequipped = activeChar.getInventory().unEquipItemInBodySlotAndRecord(_slot);
+		final InventoryUpdate iu = new InventoryUpdate();
+		for (L2ItemInstance itm : unequipped)
+		{
+			activeChar.checkSShotsMatch(null, itm);
+			iu.addModifiedItem(itm);
+		}
+		
+		// Show the update in the inventory.
+		activeChar.sendPacket(iu);
+		activeChar.broadcastUserInfo();
+		
+		// This can be 0 if the user pressed the right mouse button twice very fast.
+		if (unequipped.length > 0)
+		{
+			SystemMessage sm = null;
+			if (unequipped[0].getEnchantLevel() > 0)
+			{
+				sm = SystemMessage.getSystemMessage(SystemMessageId.EQUIPMENT_S1_S2_REMOVED);
+				sm.addNumber(unequipped[0].getEnchantLevel());
+			}
+			else
+			{
+				sm = SystemMessage.getSystemMessage(SystemMessageId.S1_DISARMED);
+			}
+			sm.addItemName(unequipped[0]);
+			activeChar.sendPacket(sm);
+		}
+	}
+	
+	@Override
+	public String getType()
+	{
+		return _C__16_REQUESTUNEQUIPITEM;
+	}
+}

+ 22 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/skills/l2skills/L2SkillMount.java

@@ -20,13 +20,12 @@ import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.network.SystemMessageId;
-import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.gameserver.templates.StatsSet;
 
 public class L2SkillMount extends L2Skill
 {
-	private int _npcId;
-	private int _itemId;
+	private final int _npcId;
+	private final int _itemId;
 	
 	public L2SkillMount(StatsSet set)
 	{
@@ -39,15 +38,21 @@ public class L2SkillMount extends L2Skill
 	public void useSkill(L2Character caster, L2Object[] targets)
 	{
 		if (!(caster instanceof L2PcInstance))
+		{
 			return;
+		}
 		
 		if (!TvTEvent.onItemSummon(caster.getObjectId()))
+		{
 			return;
+		}
 		
-		L2PcInstance activePlayer = (L2PcInstance)caster;
+		L2PcInstance activePlayer = (L2PcInstance) caster;
 		
 		if (!activePlayer.getFloodProtectors().getItemPetSummon().tryPerformAction("mount"))
+		{
 			return;
+		}
 		
 		// Dismount Action
 		if (_npcId == 0)
@@ -58,28 +63,35 @@ public class L2SkillMount extends L2Skill
 		
 		if (activePlayer.isSitting())
 		{
-			activePlayer.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANT_MOVE_SITTING));
+			activePlayer.sendPacket(SystemMessageId.CANT_MOVE_SITTING);
 			return;
 		}
 		
 		if (activePlayer.inObserverMode())
+		{
 			return;
+		}
 		
 		if (activePlayer.isInOlympiadMode())
 		{
-			activePlayer.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.THIS_ITEM_IS_NOT_AVAILABLE_FOR_THE_OLYMPIAD_EVENT));
+			activePlayer.sendPacket(SystemMessageId.THIS_ITEM_IS_NOT_AVAILABLE_FOR_THE_OLYMPIAD_EVENT);
+			return;
+		}
+		
+		if ((activePlayer.getPet() != null) || activePlayer.isMounted())
+		{
+			activePlayer.sendPacket(SystemMessageId.YOU_ALREADY_HAVE_A_PET);
 			return;
 		}
 		
-		if (activePlayer.getPet() != null || activePlayer.isMounted())
+		if (activePlayer.isAttackingNow())
 		{
-			activePlayer.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_ALREADY_HAVE_A_PET));
+			activePlayer.sendPacket(SystemMessageId.YOU_CANNOT_SUMMON_IN_COMBAT);
 			return;
 		}
 		
-		if (activePlayer.isAttackingNow() || activePlayer.isCursedWeaponEquipped())
+		if (activePlayer.isCursedWeaponEquipped())
 		{
-			activePlayer.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_CANNOT_SUMMON_IN_COMBAT));
 			return;
 		}