Adapted appearance stone rework to all branches.
This commit is contained in:
@@ -22,13 +22,13 @@ import java.util.Map;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
import com.l2jmobius.commons.util.IGameXmlReader;
|
||||
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import com.l2jmobius.gameserver.enums.Race;
|
||||
import com.l2jmobius.gameserver.model.StatsSet;
|
||||
import com.l2jmobius.gameserver.model.holders.AppearanceHolder;
|
||||
import com.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
|
||||
import com.l2jmobius.gameserver.model.items.appearance.AppearanceTargetType;
|
||||
import com.l2jmobius.gameserver.model.items.type.CrystalType;
|
||||
@@ -75,9 +75,6 @@ public class AppearanceItemData implements IGameXmlReader
|
||||
@Override
|
||||
public void parseDocument(Document doc, File f)
|
||||
{
|
||||
StatsSet set;
|
||||
Node att;
|
||||
NamedNodeMap attrs;
|
||||
for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
|
||||
{
|
||||
if ("list".equalsIgnoreCase(n.getNodeName()))
|
||||
@@ -86,15 +83,7 @@ public class AppearanceItemData implements IGameXmlReader
|
||||
{
|
||||
if ("appearance_stone".equalsIgnoreCase(d.getNodeName()))
|
||||
{
|
||||
attrs = d.getAttributes();
|
||||
set = new StatsSet();
|
||||
for (int i = 0; i < attrs.getLength(); i++)
|
||||
{
|
||||
att = attrs.item(i);
|
||||
set.set(att.getNodeName(), att.getNodeValue());
|
||||
}
|
||||
|
||||
final AppearanceStone stone = new AppearanceStone(set);
|
||||
final AppearanceStone stone = new AppearanceStone(new StatsSet(parseAttributes(d)));
|
||||
for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling())
|
||||
{
|
||||
switch (c.getNodeName())
|
||||
@@ -129,6 +118,10 @@ public class AppearanceItemData implements IGameXmlReader
|
||||
stone.addRaceNot(raceNot);
|
||||
break;
|
||||
}
|
||||
case "visual":
|
||||
{
|
||||
stone.addVisualId(new AppearanceHolder(new StatsSet(parseAttributes(c))));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ItemTable.getInstance().getTemplate(stone.getId()) != null)
|
||||
@@ -145,6 +138,11 @@ public class AppearanceItemData implements IGameXmlReader
|
||||
}
|
||||
}
|
||||
|
||||
public int getLoadedElementsCount()
|
||||
{
|
||||
return _stones.size();
|
||||
}
|
||||
|
||||
public AppearanceStone getStone(int stone)
|
||||
{
|
||||
return _stones.get(stone);
|
||||
|
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* 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.l2jmobius.gameserver.model.holders;
|
||||
|
||||
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import com.l2jmobius.gameserver.model.StatsSet;
|
||||
import com.l2jmobius.gameserver.model.items.appearance.AppearanceHandType;
|
||||
import com.l2jmobius.gameserver.model.items.appearance.AppearanceMagicType;
|
||||
import com.l2jmobius.gameserver.model.items.appearance.AppearanceTargetType;
|
||||
import com.l2jmobius.gameserver.model.items.type.ArmorType;
|
||||
import com.l2jmobius.gameserver.model.items.type.WeaponType;
|
||||
|
||||
/**
|
||||
* @author Sdw
|
||||
*/
|
||||
public class AppearanceHolder
|
||||
{
|
||||
private final int _visualId;
|
||||
private final WeaponType _weaponType;
|
||||
private final ArmorType _armorType;
|
||||
private final AppearanceHandType _handType;
|
||||
private final AppearanceMagicType _magicType;
|
||||
private final AppearanceTargetType _targetType;
|
||||
private final Integer _bodyPart;
|
||||
|
||||
public AppearanceHolder(StatsSet set)
|
||||
{
|
||||
_visualId = set.getInt("id", 0);
|
||||
_weaponType = set.getEnum("weaponType", WeaponType.class, WeaponType.NONE);
|
||||
_armorType = set.getEnum("armorType", ArmorType.class, ArmorType.NONE);
|
||||
_handType = set.getEnum("handType", AppearanceHandType.class, AppearanceHandType.NONE);
|
||||
_magicType = set.getEnum("magicType", AppearanceMagicType.class, AppearanceMagicType.NONE);
|
||||
_targetType = set.getEnum("targetType", AppearanceTargetType.class, AppearanceTargetType.NONE);
|
||||
_bodyPart = ItemTable.SLOTS.get(set.getString("bodyPart", "none"));
|
||||
}
|
||||
|
||||
public WeaponType getWeaponType()
|
||||
{
|
||||
return _weaponType;
|
||||
}
|
||||
|
||||
public ArmorType getArmorType()
|
||||
{
|
||||
return _armorType;
|
||||
}
|
||||
|
||||
public AppearanceHandType getHandType()
|
||||
{
|
||||
return _handType;
|
||||
}
|
||||
|
||||
public AppearanceMagicType getMagicType()
|
||||
{
|
||||
return _magicType;
|
||||
}
|
||||
|
||||
public AppearanceTargetType getTargetType()
|
||||
{
|
||||
return _targetType;
|
||||
}
|
||||
|
||||
public int getBodyPart()
|
||||
{
|
||||
return _bodyPart;
|
||||
}
|
||||
|
||||
public int getVisualId()
|
||||
{
|
||||
return _visualId;
|
||||
}
|
||||
}
|
@@ -24,10 +24,14 @@ import java.util.List;
|
||||
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import com.l2jmobius.gameserver.enums.Race;
|
||||
import com.l2jmobius.gameserver.model.StatsSet;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.holders.AppearanceHolder;
|
||||
import com.l2jmobius.gameserver.model.items.L2Item;
|
||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||
import com.l2jmobius.gameserver.model.items.type.ArmorType;
|
||||
import com.l2jmobius.gameserver.model.items.type.CrystalType;
|
||||
import com.l2jmobius.gameserver.model.items.type.WeaponType;
|
||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||
|
||||
/**
|
||||
* @author UnAfraid
|
||||
@@ -48,6 +52,7 @@ public class AppearanceStone
|
||||
private List<Integer> _bodyParts;
|
||||
private List<Race> _races;
|
||||
private List<Race> _racesNot;
|
||||
private List<AppearanceHolder> _allVisualIds;
|
||||
|
||||
public AppearanceStone(StatsSet set)
|
||||
{
|
||||
@@ -61,15 +66,35 @@ public class AppearanceStone
|
||||
_handType = set.getEnum("handType", AppearanceHandType.class, AppearanceHandType.NONE);
|
||||
_magicType = set.getEnum("magicType", AppearanceMagicType.class, AppearanceMagicType.NONE);
|
||||
|
||||
// No grade items cannot change appearance, because client doesn't have No-Grade restoration stones.
|
||||
final CrystalType crystalType = set.getEnum("crystalType", CrystalType.class, CrystalType.NONE);
|
||||
if (crystalType == CrystalType.NONE)
|
||||
final AppearanceTargetType targetType = set.getEnum("targetType", AppearanceTargetType.class, AppearanceTargetType.NONE);
|
||||
if (targetType != AppearanceTargetType.NONE)
|
||||
{
|
||||
for (CrystalType cryType : CrystalType.values())
|
||||
addTargetType(targetType);
|
||||
}
|
||||
|
||||
// No grade items cannot change appearance, because client doesn't have No-Grade restoration stones.
|
||||
final CrystalType crystalType = set.getEnum("grade", CrystalType.class, null);
|
||||
|
||||
// If no crystal type is defined, we must add all defaults.
|
||||
if (crystalType == null)
|
||||
{
|
||||
switch (targetType)
|
||||
{
|
||||
if ((cryType != CrystalType.NONE) && (cryType != CrystalType.EVENT))
|
||||
case ACCESSORY:
|
||||
case ALL:
|
||||
{
|
||||
addCrystalType(cryType);
|
||||
addCrystalType(CrystalType.NONE);
|
||||
}
|
||||
case WEAPON:
|
||||
case ARMOR:
|
||||
{
|
||||
for (CrystalType cryType : CrystalType.values())
|
||||
{
|
||||
if ((cryType != CrystalType.NONE) && (cryType != CrystalType.EVENT))
|
||||
{
|
||||
addCrystalType(cryType);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -78,12 +103,6 @@ public class AppearanceStone
|
||||
addCrystalType(crystalType);
|
||||
}
|
||||
|
||||
final AppearanceTargetType targetType = set.getEnum("targetType", AppearanceTargetType.class, AppearanceTargetType.NONE);
|
||||
if (targetType != AppearanceTargetType.NONE)
|
||||
{
|
||||
addTargetType(targetType);
|
||||
}
|
||||
|
||||
final int bodyPart = ItemTable.SLOTS.get(set.getString("bodyPart", "none"));
|
||||
if (bodyPart != L2Item.SLOT_NONE)
|
||||
{
|
||||
@@ -185,6 +204,20 @@ public class AppearanceStone
|
||||
_bodyParts.add(part);
|
||||
}
|
||||
|
||||
public void addVisualId(AppearanceHolder appearanceHolder)
|
||||
{
|
||||
if (_allVisualIds == null)
|
||||
{
|
||||
_allVisualIds = new ArrayList<>();
|
||||
}
|
||||
_allVisualIds.add(appearanceHolder);
|
||||
}
|
||||
|
||||
public List<AppearanceHolder> getVisualIds()
|
||||
{
|
||||
return _allVisualIds != null ? _allVisualIds : Collections.emptyList();
|
||||
}
|
||||
|
||||
public List<Integer> getBodyParts()
|
||||
{
|
||||
return _bodyParts != null ? _bodyParts : Collections.emptyList();
|
||||
@@ -217,4 +250,297 @@ public class AppearanceStone
|
||||
{
|
||||
return _racesNot != null ? _racesNot : Collections.emptyList();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param player the actor requesting to use this appearance.
|
||||
* @param targetItem the item to be modified with this appearance.
|
||||
* @return {@code true} if the item is valid for appearance change, {@code false} otherwise.
|
||||
*/
|
||||
public boolean checkConditions(L2PcInstance player, L2ItemInstance targetItem)
|
||||
{
|
||||
if (targetItem == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (getTargetTypes().isEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (targetItem.isEquipped() && (getRacesNot().contains(player.getRace()) || (!getRaces().isEmpty() && !getRaces().contains(player.getRace()))))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.YOU_CANNOT_MODIFY_AN_EQUIPPED_ITEM_INTO_THE_APPEARANCE_OF_AN_UNEQUIPPABLE_ITEM_PLEASE_CHECK_RACE_GENDER_RESTRICTIONS_YOU_CAN_MODIFY_THE_APPEARANCE_IF_YOU_UNEQUIP_THE_ITEM);
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (getType())
|
||||
{
|
||||
case RESTORE:
|
||||
{
|
||||
if (targetItem.getVisualId() == 0)
|
||||
{
|
||||
player.sendPacket(SystemMessageId.YOU_CANNOT_RESTORE_ITEMS_THAT_HAVE_NOT_BEEN_MODIFIED);
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((targetItem.isWeapon() && !getTargetTypes().contains(AppearanceTargetType.WEAPON)) || (targetItem.isArmor() && !getTargetTypes().contains(AppearanceTargetType.ARMOR)) || (targetItem.isEtcItem() && !getTargetTypes().contains(AppearanceTargetType.ACCESSORY)))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (((targetItem.getItem().getBodyPart() == L2Item.SLOT_HAIR) || (targetItem.getItem().getBodyPart() == L2Item.SLOT_HAIR2) || (targetItem.getItem().getBodyPart() == L2Item.SLOT_HAIRALL)) && !getTargetTypes().contains(AppearanceTargetType.ACCESSORY))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// Seems like in retail item with already changed appearance, can be changed again without being restored.
|
||||
|
||||
final AppearanceTargetType targetType = getTargetTypes().get(0);
|
||||
switch (targetType)
|
||||
{
|
||||
case NONE:
|
||||
{
|
||||
return false;
|
||||
}
|
||||
case WEAPON:
|
||||
{
|
||||
if (!targetItem.isWeapon())
|
||||
{
|
||||
player.sendPacket(SystemMessageId.WEAPONS_ONLY);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (targetItem.getItem().getCrystalType() == CrystalType.NONE)
|
||||
{
|
||||
player.sendPacket(SystemMessageId.YOU_CANNOT_MODIFY_OR_RESTORE_NO_GRADE_ITEMS);
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case ARMOR:
|
||||
{
|
||||
if (!targetItem.isArmor())
|
||||
{
|
||||
player.sendPacket(SystemMessageId.ARMOR_ONLY);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (targetItem.getItem().getCrystalType() == CrystalType.NONE)
|
||||
{
|
||||
player.sendPacket(SystemMessageId.YOU_CANNOT_MODIFY_OR_RESTORE_NO_GRADE_ITEMS);
|
||||
return false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case ACCESSORY:
|
||||
{
|
||||
if ((targetItem.getItem().getBodyPart() != L2Item.SLOT_HAIR) && (targetItem.getItem().getBodyPart() != L2Item.SLOT_HAIR2) && (targetItem.getItem().getBodyPart() != L2Item.SLOT_HAIRALL))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.HAIR_ACCESSORIES_ONLY);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ALL:
|
||||
{
|
||||
if (!getCrystalTypes().isEmpty() && !getCrystalTypes().contains(targetItem.getItem().getCrystalType()))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (findVisualChange(targetItem) == null)
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!getCrystalTypes().isEmpty() && !getCrystalTypes().contains(targetItem.getItem().getCrystalType()))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (targetItem.isArmor() && !getBodyParts().isEmpty() && !getBodyParts().contains(targetItem.getItem().getBodyPart()))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (getWeaponType() != WeaponType.NONE)
|
||||
{
|
||||
if (!targetItem.isWeapon() || (targetItem.getItemType() != getWeaponType()))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_CANNOT_BE_USED_AS_AN_APPEARANCE_WEAPON);
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (getHandType())
|
||||
{
|
||||
case ONE_HANDED:
|
||||
{
|
||||
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_R_HAND) != L2Item.SLOT_R_HAND)
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TWO_HANDED:
|
||||
{
|
||||
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_LR_HAND) != L2Item.SLOT_LR_HAND)
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (getMagicType())
|
||||
{
|
||||
case MAGICAL:
|
||||
{
|
||||
if (!targetItem.getItem().isMagicWeapon())
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PHYISICAL:
|
||||
{
|
||||
if (targetItem.getItem().isMagicWeapon())
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (getArmorType() != ArmorType.NONE)
|
||||
{
|
||||
switch (getArmorType())
|
||||
{
|
||||
case SHIELD:
|
||||
{
|
||||
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SHIELD))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SIGIL:
|
||||
{
|
||||
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SIGIL))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public AppearanceHolder findVisualChange(L2ItemInstance targetItem)
|
||||
{
|
||||
for (AppearanceHolder holder : _allVisualIds)
|
||||
{
|
||||
if (targetItem.isArmor() && (holder.getBodyPart() != 0) && (targetItem.getItem().getBodyPart() != holder.getBodyPart()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (holder.getWeaponType() != WeaponType.NONE)
|
||||
{
|
||||
if (!targetItem.isWeapon() || (targetItem.getItemType() != holder.getWeaponType()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (holder.getHandType())
|
||||
{
|
||||
case ONE_HANDED:
|
||||
{
|
||||
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_R_HAND) != L2Item.SLOT_R_HAND)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TWO_HANDED:
|
||||
{
|
||||
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_LR_HAND) != L2Item.SLOT_LR_HAND)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (holder.getMagicType())
|
||||
{
|
||||
case MAGICAL:
|
||||
{
|
||||
if (!targetItem.getItem().isMagicWeapon())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PHYISICAL:
|
||||
{
|
||||
if (targetItem.getItem().isMagicWeapon())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (holder.getArmorType() != ArmorType.NONE)
|
||||
{
|
||||
switch (holder.getArmorType())
|
||||
{
|
||||
case SHIELD:
|
||||
{
|
||||
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SHIELD))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SIGIL:
|
||||
{
|
||||
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SIGIL))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return holder;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@@ -26,13 +26,11 @@ import com.l2jmobius.gameserver.model.items.L2Item;
|
||||
import com.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
|
||||
import com.l2jmobius.gameserver.model.items.appearance.AppearanceType;
|
||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||
import com.l2jmobius.gameserver.model.items.type.ArmorType;
|
||||
import com.l2jmobius.gameserver.model.items.type.WeaponType;
|
||||
import com.l2jmobius.gameserver.network.L2GameClient;
|
||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import com.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.appearance.ExPutShapeShiftingExtractionItemResult;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.appearance.ExShapeShiftingResult;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.appearance.ExPutShapeShiftingTargetItemResult;
|
||||
|
||||
/**
|
||||
* @author UnAfraid
|
||||
@@ -63,175 +61,100 @@ public class RequestExTryToPutShapeShiftingEnchantSupportItem implements IClient
|
||||
|
||||
if (player.isInStoreMode() || player.isInCraftMode() || player.isProcessingRequest() || player.isProcessingTransaction() || (request == null))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(SystemMessageId.YOU_CANNOT_USE_THIS_SYSTEM_DURING_TRADING_PRIVATE_STORE_AND_WORKSHOP_SETUP);
|
||||
return;
|
||||
}
|
||||
|
||||
final PcInventory inventory = player.getInventory();
|
||||
final L2ItemInstance targetItem = inventory.getItemByObjectId(_targetItemObjId);
|
||||
final L2ItemInstance extracItem = inventory.getItemByObjectId(_extracItemObjId);
|
||||
final L2ItemInstance extractItem = inventory.getItemByObjectId(_extracItemObjId);
|
||||
L2ItemInstance stone = request.getAppearanceStone();
|
||||
if ((targetItem == null) || (extracItem == null) || (stone == null))
|
||||
if ((targetItem == null) || (extractItem == null) || (stone == null))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!extracItem.getItem().isAppearanceable())
|
||||
if ((stone.getOwnerId() != player.getObjectId()) || (targetItem.getOwnerId() != player.getObjectId()) || (extractItem.getOwnerId() != player.getObjectId()))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((extracItem.getItemLocation() != ItemLocation.INVENTORY) && (extracItem.getItemLocation() != ItemLocation.PAPERDOLL))
|
||||
if (!extractItem.getItem().isAppearanceable())
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
client.sendPacket(ExPutShapeShiftingExtractionItemResult.FAILED);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((extractItem.getItemLocation() != ItemLocation.INVENTORY) && (extractItem.getItemLocation() != ItemLocation.PAPERDOLL))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
stone = inventory.getItemByObjectId(stone.getObjectId());
|
||||
if (stone == null)
|
||||
if ((stone = inventory.getItemByObjectId(stone.getObjectId())) == null)
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
final AppearanceStone appearanceStone = AppearanceItemData.getInstance().getStone(stone.getId());
|
||||
if (appearanceStone == null)
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((appearanceStone.getType() == AppearanceType.RESTORE) || (appearanceStone.getType() == AppearanceType.FIXED))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if (extracItem.getVisualId() > 0)
|
||||
if (extractItem.getVisualId() > 0)
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExPutShapeShiftingExtractionItemResult.FAILED);
|
||||
client.sendPacket(SystemMessageId.YOU_CANNOT_EXTRACT_FROM_A_MODIFIED_ITEM);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if (appearanceStone.getWeaponType() != WeaponType.NONE)
|
||||
if ((extractItem.getItemLocation() != ItemLocation.INVENTORY) && (extractItem.getItemLocation() != ItemLocation.PAPERDOLL))
|
||||
{
|
||||
if (!targetItem.isWeapon() || (targetItem.getItemType() != appearanceStone.getWeaponType()))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (appearanceStone.getWeaponType() != WeaponType.NONE)
|
||||
{
|
||||
if (!targetItem.isWeapon() || (targetItem.getItemType() != appearanceStone.getWeaponType()))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (appearanceStone.getHandType())
|
||||
{
|
||||
case ONE_HANDED:
|
||||
{
|
||||
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_R_HAND) != L2Item.SLOT_R_HAND)
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TWO_HANDED:
|
||||
{
|
||||
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_LR_HAND) != L2Item.SLOT_LR_HAND)
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (appearanceStone.getMagicType())
|
||||
{
|
||||
case MAGICAL:
|
||||
{
|
||||
if (!targetItem.getItem().isMagicWeapon())
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PHYISICAL:
|
||||
{
|
||||
if (targetItem.getItem().isMagicWeapon())
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (appearanceStone.getArmorType() != ArmorType.NONE)
|
||||
{
|
||||
switch (appearanceStone.getArmorType())
|
||||
{
|
||||
case SHIELD:
|
||||
{
|
||||
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SHIELD))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SIGIL:
|
||||
{
|
||||
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SIGIL))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (extracItem.getOwnerId() != player.getObjectId())
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExPutShapeShiftingExtractionItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
request.setAppearanceExtractItem(extracItem);
|
||||
if ((extractItem.getItemType() != targetItem.getItemType()) || (extractItem.getId() == targetItem.getId()) || (extractItem.getObjectId() == targetItem.getObjectId()))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
client.sendPacket(ExPutShapeShiftingExtractionItemResult.FAILED);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((extractItem.getItem().getBodyPart() != targetItem.getItem().getBodyPart()) && ((extractItem.getItem().getBodyPart() != L2Item.SLOT_FULL_ARMOR) || (targetItem.getItem().getBodyPart() != L2Item.SLOT_CHEST)))
|
||||
{
|
||||
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
client.sendPacket(ExPutShapeShiftingExtractionItemResult.FAILED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (extractItem.getItem().getCrystalType().isGreater(targetItem.getItem().getCrystalType()))
|
||||
{
|
||||
client.sendPacket(SystemMessageId.YOU_CANNOT_EXTRACT_FROM_ITEMS_THAT_ARE_HIGHER_GRADE_THAN_ITEMS_TO_BE_MODIFIED);
|
||||
player.sendPacket(ExPutShapeShiftingExtractionItemResult.FAILED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!appearanceStone.checkConditions(player, targetItem))
|
||||
{
|
||||
player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
return;
|
||||
}
|
||||
|
||||
request.setAppearanceExtractItem(extractItem);
|
||||
client.sendPacket(ExPutShapeShiftingExtractionItemResult.SUCCESS);
|
||||
}
|
||||
}
|
||||
|
@@ -22,13 +22,8 @@ import com.l2jmobius.gameserver.enums.ItemLocation;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.actor.request.ShapeShiftingItemRequest;
|
||||
import com.l2jmobius.gameserver.model.itemcontainer.PcInventory;
|
||||
import com.l2jmobius.gameserver.model.items.L2Item;
|
||||
import com.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
|
||||
import com.l2jmobius.gameserver.model.items.appearance.AppearanceTargetType;
|
||||
import com.l2jmobius.gameserver.model.items.appearance.AppearanceType;
|
||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||
import com.l2jmobius.gameserver.model.items.type.ArmorType;
|
||||
import com.l2jmobius.gameserver.model.items.type.WeaponType;
|
||||
import com.l2jmobius.gameserver.network.L2GameClient;
|
||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import com.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
|
||||
@@ -77,13 +72,20 @@ public class RequestExTryToPutShapeShiftingTargetItem implements IClientIncoming
|
||||
return;
|
||||
}
|
||||
|
||||
if (!targetItem.getItem().isAppearanceable())
|
||||
if ((stone.getOwnerId() != player.getObjectId()) || (targetItem.getOwnerId() != player.getObjectId()))
|
||||
{
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!targetItem.getItem().isAppearanceable())
|
||||
{
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_CANNOT_BE_MODIFIED_OR_RESTORED);
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((targetItem.getItemLocation() != ItemLocation.INVENTORY) && (targetItem.getItemLocation() != ItemLocation.PAPERDOLL))
|
||||
{
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
@@ -91,8 +93,7 @@ public class RequestExTryToPutShapeShiftingTargetItem implements IClientIncoming
|
||||
return;
|
||||
}
|
||||
|
||||
stone = inventory.getItemByObjectId(stone.getObjectId());
|
||||
if (stone == null)
|
||||
if ((stone = inventory.getItemByObjectId(stone.getObjectId())) == null)
|
||||
{
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
@@ -107,158 +108,9 @@ public class RequestExTryToPutShapeShiftingTargetItem implements IClientIncoming
|
||||
return;
|
||||
}
|
||||
|
||||
if (((appearanceStone.getType() != AppearanceType.RESTORE) && (targetItem.getVisualId() > 0)) || ((appearanceStone.getType() == AppearanceType.RESTORE) && (targetItem.getVisualId() == 0)))
|
||||
if (!appearanceStone.checkConditions(player, targetItem))
|
||||
{
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: Handle hair accessory!
|
||||
// if (!targetItem.isEtcItem() && (targetItem.getItem().getCrystalType() == CrystalType.NONE))
|
||||
{
|
||||
// client.sendPacket(SystemMessageId.YOU_CANNOT_MODIFY_OR_RESTORE_NOGRADE_ITEMS);
|
||||
// return;
|
||||
}
|
||||
|
||||
if (!appearanceStone.getTargetTypes().contains(AppearanceTargetType.ACCESSORY)) // accessory tempfix
|
||||
{
|
||||
if (!appearanceStone.getCrystalTypes().isEmpty() && !appearanceStone.getCrystalTypes().contains(targetItem.getItem().getCrystalType()))
|
||||
{
|
||||
client.sendPacket(SystemMessageId.ITEM_GRADES_DO_NOT_MATCH);
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (appearanceStone.getTargetTypes().isEmpty())
|
||||
{
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!appearanceStone.getTargetTypes().contains(AppearanceTargetType.ALL))
|
||||
{
|
||||
if (targetItem.isWeapon() && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.WEAPON))
|
||||
{
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
|
||||
}
|
||||
else if (targetItem.isArmor() && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.ARMOR) && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.ACCESSORY))
|
||||
{
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
else if (targetItem.isArmor() && !appearanceStone.getBodyParts().isEmpty() && !appearanceStone.getBodyParts().contains(targetItem.getItem().getBodyPart()))
|
||||
{
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (appearanceStone.getWeaponType() != WeaponType.NONE)
|
||||
{
|
||||
if (!targetItem.isWeapon() || (targetItem.getItemType() != appearanceStone.getWeaponType()))
|
||||
{
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (appearanceStone.getHandType())
|
||||
{
|
||||
case ONE_HANDED:
|
||||
{
|
||||
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_R_HAND) != L2Item.SLOT_R_HAND)
|
||||
{
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TWO_HANDED:
|
||||
{
|
||||
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_LR_HAND) != L2Item.SLOT_LR_HAND)
|
||||
{
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (appearanceStone.getMagicType())
|
||||
{
|
||||
case MAGICAL:
|
||||
{
|
||||
if (!targetItem.getItem().isMagicWeapon())
|
||||
{
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PHYISICAL:
|
||||
{
|
||||
if (targetItem.getItem().isMagicWeapon())
|
||||
{
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (appearanceStone.getArmorType() != ArmorType.NONE)
|
||||
{
|
||||
switch (appearanceStone.getArmorType())
|
||||
{
|
||||
case SHIELD:
|
||||
{
|
||||
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SHIELD))
|
||||
{
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SIGIL:
|
||||
{
|
||||
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SIGIL))
|
||||
{
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (targetItem.getOwnerId() != player.getObjectId())
|
||||
{
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -22,14 +22,12 @@ import com.l2jmobius.gameserver.enums.InventorySlot;
|
||||
import com.l2jmobius.gameserver.enums.ItemLocation;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.actor.request.ShapeShiftingItemRequest;
|
||||
import com.l2jmobius.gameserver.model.holders.AppearanceHolder;
|
||||
import com.l2jmobius.gameserver.model.itemcontainer.PcInventory;
|
||||
import com.l2jmobius.gameserver.model.items.L2Item;
|
||||
import com.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
|
||||
import com.l2jmobius.gameserver.model.items.appearance.AppearanceTargetType;
|
||||
import com.l2jmobius.gameserver.model.items.appearance.AppearanceType;
|
||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||
import com.l2jmobius.gameserver.model.items.type.ArmorType;
|
||||
import com.l2jmobius.gameserver.model.items.type.WeaponType;
|
||||
import com.l2jmobius.gameserver.model.variables.ItemVariables;
|
||||
import com.l2jmobius.gameserver.network.L2GameClient;
|
||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||
@@ -37,8 +35,6 @@ import com.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.ExAdenaInvenCount;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.InventoryUpdate;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.appearance.ExPutShapeShiftingTargetItemResult;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.appearance.ExShapeShiftingResult;
|
||||
|
||||
/**
|
||||
@@ -68,7 +64,7 @@ public class RequestShapeShiftingItem implements IClientIncomingPacket
|
||||
|
||||
if (player.isInStoreMode() || player.isInCraftMode() || player.isProcessingRequest() || player.isProcessingTransaction() || (request == null))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
client.sendPacket(SystemMessageId.YOU_CANNOT_USE_THIS_SYSTEM_DURING_TRADING_PRIVATE_STORE_AND_WORKSHOP_SETUP);
|
||||
return;
|
||||
}
|
||||
@@ -79,36 +75,36 @@ public class RequestShapeShiftingItem implements IClientIncomingPacket
|
||||
|
||||
if ((targetItem == null) || (stone == null))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if (stone.getOwnerId() != player.getObjectId())
|
||||
if ((stone.getOwnerId() != player.getObjectId()) || (targetItem.getOwnerId() != player.getObjectId()))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!targetItem.getItem().isAppearanceable())
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(SystemMessageId.THIS_ITEM_CANNOT_BE_MODIFIED_OR_RESTORED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((targetItem.getItemLocation() != ItemLocation.INVENTORY) && (targetItem.getItemLocation() != ItemLocation.PAPERDOLL))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
stone = inventory.getItemByObjectId(stone.getObjectId());
|
||||
if (stone == null)
|
||||
if ((stone = inventory.getItemByObjectId(stone.getObjectId())) == null)
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
@@ -116,223 +112,100 @@ public class RequestShapeShiftingItem implements IClientIncomingPacket
|
||||
final AppearanceStone appearanceStone = AppearanceItemData.getInstance().getStone(stone.getId());
|
||||
if (appearanceStone == null)
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if (((appearanceStone.getType() != AppearanceType.RESTORE) && (targetItem.getVisualId() > 0)) || ((appearanceStone.getType() == AppearanceType.RESTORE) && (targetItem.getVisualId() == 0)))
|
||||
if (!appearanceStone.checkConditions(player, targetItem))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: Handle hair accessory!
|
||||
// if (!targetItem.isEtcItem() && (targetItem.getItem().getCrystalType() == CrystalType.NONE))
|
||||
{
|
||||
// client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
// player.removeRequest(ShapeShiftingItemRequest.class.getName());
|
||||
// return;
|
||||
}
|
||||
|
||||
if (!appearanceStone.getTargetTypes().contains(AppearanceTargetType.ACCESSORY)) // accessory tempfix
|
||||
{
|
||||
if (!appearanceStone.getCrystalTypes().isEmpty() && !appearanceStone.getCrystalTypes().contains(targetItem.getItem().getCrystalType()))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (appearanceStone.getTargetTypes().isEmpty())
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!appearanceStone.getTargetTypes().contains(AppearanceTargetType.ALL))
|
||||
{
|
||||
if (targetItem.isWeapon() && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.WEAPON))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
|
||||
}
|
||||
else if (targetItem.isArmor() && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.ARMOR) && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.ACCESSORY))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
else if (targetItem.isArmor() && !appearanceStone.getBodyParts().isEmpty() && !appearanceStone.getBodyParts().contains(targetItem.getItem().getBodyPart()))
|
||||
{
|
||||
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (appearanceStone.getWeaponType() != WeaponType.NONE)
|
||||
{
|
||||
if (!targetItem.isWeapon() || (targetItem.getItemType() != appearanceStone.getWeaponType()))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (appearanceStone.getHandType())
|
||||
{
|
||||
case ONE_HANDED:
|
||||
{
|
||||
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_R_HAND) != L2Item.SLOT_R_HAND)
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TWO_HANDED:
|
||||
{
|
||||
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_LR_HAND) != L2Item.SLOT_LR_HAND)
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (appearanceStone.getMagicType())
|
||||
{
|
||||
case MAGICAL:
|
||||
{
|
||||
if (!targetItem.getItem().isMagicWeapon())
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PHYISICAL:
|
||||
{
|
||||
if (targetItem.getItem().isMagicWeapon())
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (appearanceStone.getArmorType() != ArmorType.NONE)
|
||||
{
|
||||
switch (appearanceStone.getArmorType())
|
||||
{
|
||||
case SHIELD:
|
||||
{
|
||||
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SHIELD))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SIGIL:
|
||||
{
|
||||
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SIGIL))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final L2ItemInstance extracItem = request.getAppearanceExtractItem();
|
||||
final L2ItemInstance extractItem = request.getAppearanceExtractItem();
|
||||
|
||||
int extracItemId = 0;
|
||||
if ((appearanceStone.getType() != AppearanceType.RESTORE) && (appearanceStone.getType() != AppearanceType.FIXED))
|
||||
{
|
||||
if (extracItem == null)
|
||||
if (extractItem == null)
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!targetItem.getItem().isAppearanceable())
|
||||
if (extractItem.getOwnerId() != player.getObjectId())
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((extracItem.getItemLocation() != ItemLocation.INVENTORY) && (extracItem.getItemLocation() != ItemLocation.PAPERDOLL))
|
||||
if (!extractItem.getItem().isAppearanceable())
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!extracItem.isEtcItem() && (targetItem.getItem().getCrystalType().ordinal() <= extracItem.getItem().getCrystalType().ordinal()))
|
||||
if ((extractItem.getItemLocation() != ItemLocation.INVENTORY) && (extractItem.getItemLocation() != ItemLocation.PAPERDOLL))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if (extracItem.getVisualId() > 0)
|
||||
if (extractItem.getItem().getCrystalType().isGreater(targetItem.getItem().getCrystalType()))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if (extracItem.getOwnerId() != player.getObjectId())
|
||||
if (extractItem.getVisualId() > 0)
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
extracItemId = extracItem.getId();
|
||||
|
||||
if ((extractItem.getItemType() != targetItem.getItemType()) || (extractItem.getId() == targetItem.getId()) || (extractItem.getObjectId() == targetItem.getObjectId()))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((extractItem.getItem().getBodyPart() != targetItem.getItem().getBodyPart()) && ((extractItem.getItem().getBodyPart() != L2Item.SLOT_FULL_ARMOR) || (targetItem.getItem().getBodyPart() != L2Item.SLOT_CHEST)))
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
extracItemId = extractItem.getId();
|
||||
}
|
||||
|
||||
if (targetItem.getOwnerId() != player.getObjectId())
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
final long cost = appearanceStone.getCost();
|
||||
long cost = appearanceStone.getCost();
|
||||
if (cost > player.getAdena())
|
||||
{
|
||||
client.sendPacket(SystemMessageId.YOU_CANNOT_MODIFY_AS_YOU_DO_NOT_HAVE_ENOUGH_ADENA);
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
|
||||
if (stone.getCount() < 1L)
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
client.sendPacket(ExShapeShiftingResult.CLOSE);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
return;
|
||||
}
|
||||
if (appearanceStone.getType() == AppearanceType.NORMAL)
|
||||
{
|
||||
if (inventory.destroyItem(getClass().getSimpleName(), extracItem, 1, player, this) == null)
|
||||
if (inventory.destroyItem(getClass().getSimpleName(), extractItem, 1, player, this) == null)
|
||||
{
|
||||
client.sendPacket(ExShapeShiftingResult.FAILED);
|
||||
player.removeRequest(ShapeShiftingItemRequest.class);
|
||||
@@ -341,7 +214,7 @@ public class RequestShapeShiftingItem implements IClientIncomingPacket
|
||||
}
|
||||
|
||||
inventory.destroyItem(getClass().getSimpleName(), stone, 1, player, this);
|
||||
player.reduceAdena(getClass().getSimpleName(), cost, extracItem, true);
|
||||
player.reduceAdena(getClass().getSimpleName(), cost, extractItem, false);
|
||||
|
||||
switch (appearanceStone.getType())
|
||||
{
|
||||
@@ -353,18 +226,32 @@ public class RequestShapeShiftingItem implements IClientIncomingPacket
|
||||
}
|
||||
case NORMAL:
|
||||
{
|
||||
targetItem.setVisualId(extracItem.getId());
|
||||
targetItem.setVisualId(extractItem.getId());
|
||||
break;
|
||||
}
|
||||
case BLESSED:
|
||||
{
|
||||
targetItem.setVisualId(extracItem.getId());
|
||||
targetItem.setVisualId(extractItem.getId());
|
||||
break;
|
||||
}
|
||||
case FIXED:
|
||||
{
|
||||
targetItem.setVisualId(appearanceStone.getVisualId());
|
||||
targetItem.getVariables().set(ItemVariables.VISUAL_APPEARANCE_STONE_ID, appearanceStone.getId());
|
||||
if (appearanceStone.getVisualIds().isEmpty())
|
||||
{
|
||||
extracItemId = appearanceStone.getVisualId();
|
||||
targetItem.setVisualId(appearanceStone.getVisualId());
|
||||
targetItem.getVariables().set(ItemVariables.VISUAL_APPEARANCE_STONE_ID, appearanceStone.getId());
|
||||
}
|
||||
else
|
||||
{
|
||||
final AppearanceHolder holder = appearanceStone.findVisualChange(targetItem);
|
||||
if (holder != null)
|
||||
{
|
||||
extracItemId = holder.getVisualId();
|
||||
targetItem.setVisualId(holder.getVisualId());
|
||||
targetItem.getVariables().set(ItemVariables.VISUAL_APPEARANCE_STONE_ID, appearanceStone.getId());
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -376,17 +263,13 @@ public class RequestShapeShiftingItem implements IClientIncomingPacket
|
||||
}
|
||||
|
||||
targetItem.getVariables().storeMe();
|
||||
if (appearanceStone.getCost() > 0)
|
||||
{
|
||||
client.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_SPENT_S1_ON_A_SUCCESSFUL_APPEARANCE_MODIFICATION).addLong(cost));
|
||||
}
|
||||
else
|
||||
{
|
||||
client.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.S1_S_APPEARANCE_MODIFICATION_HAS_FINISHED).addItemName(targetItem.getDisplayId()));
|
||||
}
|
||||
|
||||
final InventoryUpdate iu = new InventoryUpdate();
|
||||
iu.addModifiedItem(targetItem);
|
||||
if (extractItem != null)
|
||||
{
|
||||
iu.addModifiedItem(extractItem);
|
||||
}
|
||||
if (inventory.getItemByObjectId(stone.getObjectId()) == null)
|
||||
{
|
||||
iu.addRemovedItem(stone);
|
||||
|
@@ -27,8 +27,10 @@ public class ExShapeShiftingResult implements IClientOutgoingPacket
|
||||
{
|
||||
public static int RESULT_FAILED = 0x00;
|
||||
public static int RESULT_SUCCESS = 0x01;
|
||||
public static int RESULT_CLOSE = 0x02;
|
||||
|
||||
public static ExShapeShiftingResult FAILED = new ExShapeShiftingResult(RESULT_FAILED, 0, 0);
|
||||
public static ExShapeShiftingResult CLOSE = new ExShapeShiftingResult(RESULT_CLOSE, 0, 0);
|
||||
|
||||
private final int _result;
|
||||
private final int _targetItemId;
|
||||
|
Reference in New Issue
Block a user