/*
* 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 com.l2jserver.Config;
import com.l2jserver.gameserver.model.Elementals;
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.ExAttributeEnchantResult;
import com.l2jserver.gameserver.network.serverpackets.ExBrExtraUserInfo;
import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
import com.l2jserver.gameserver.network.serverpackets.UserInfo;
import com.l2jserver.gameserver.templates.item.L2ArmorType;
import com.l2jserver.gameserver.templates.item.L2Item;
import com.l2jserver.gameserver.templates.item.L2WeaponType;
import com.l2jserver.gameserver.util.Util;
import com.l2jserver.util.Rnd;
public class RequestExEnchantItemAttribute extends L2GameClientPacket
{
private static final String _C__D0_35_REQUESTEXENCHANTITEMATTRIBUTE = "[C] D0:35 RequestExEnchantItemAttribute";
private int _objectId;
@Override
protected void readImpl()
{
_objectId = readD();
}
@Override
protected void runImpl()
{
L2PcInstance player = getClient().getActiveChar();
if (player == null)
return;
if (_objectId == 0xFFFFFFFF)
{
// Player canceled enchant
player.setActiveEnchantAttrItem(null);
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.ELEMENTAL_ENHANCE_CANCELED));
return;
}
if (!player.isOnline())
{
player.setActiveEnchantAttrItem(null);
return;
}
if (player.getPrivateStoreType() != 0)
{
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_ADD_ELEMENTAL_POWER_WHILE_OPERATING_PRIVATE_STORE_OR_WORKSHOP));
player.setActiveEnchantAttrItem(null);
return;
}
// Restrict enchant during a trade (bug if enchant fails)
if (player.getActiveRequester() != null)
{
// Cancel trade
player.cancelActiveTrade();
player.setActiveEnchantAttrItem(null);
player.sendMessage("Enchanting items is not allowed during a trade.");
return;
}
L2ItemInstance item = player.getInventory().getItemByObjectId(_objectId);
L2ItemInstance stone = player.getActiveEnchantAttrItem();
if (item == null || stone == null)
{
player.setActiveEnchantAttrItem(null);
return;
}
if ((item.getLocation() != L2ItemInstance.ItemLocation.INVENTORY) && (item.getLocation() != L2ItemInstance.ItemLocation.PAPERDOLL))
{
player.setActiveEnchantAttrItem(null);
return;
}
//can't enchant rods, shadow items, adventurers', Common Items, PvP items, hero items, cloaks, bracelets, underwear (e.g. shirt), belt, necklace, earring, ring
if (item.getItem().getItemType() == L2WeaponType.FISHINGROD || item.isShadowItem() || item.isCommonItem() || item.isPvp() || item.isHeroItem() || item.isTimeLimitedItem() ||
(item.getItemId() >= 7816 && item.getItemId() <= 7831) || (item.getItem().getItemType() == L2WeaponType.NONE) ||
item.getItem().getItemGradeSPlus() != L2Item.CRYSTAL_S || item.getItem().getBodyPart() == L2Item.SLOT_BACK ||
item.getItem().getBodyPart() == L2Item.SLOT_R_BRACELET || item.getItem().getBodyPart() == L2Item.SLOT_UNDERWEAR ||
item.getItem().getBodyPart() == L2Item.SLOT_BELT || item.getItem().getBodyPart() == L2Item.SLOT_NECK ||
(item.getItem().getBodyPart() & L2Item.SLOT_R_EAR) != 0 || (item.getItem().getBodyPart() & L2Item.SLOT_R_FINGER) != 0 ||
item.getItem().getElementals() != null || item.getItemType() == L2ArmorType.SHIELD || item.getItemType() == L2ArmorType.SIGIL)
{
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.ELEMENTAL_ENHANCE_REQUIREMENT_NOT_SUFFICIENT));
player.setActiveEnchantAttrItem(null);
return;
}
switch (item.getLocation())
{
case INVENTORY:
case PAPERDOLL:
{
if (item.getOwnerId() != player.getObjectId())
{
player.setActiveEnchantAttrItem(null);
return;
}
break;
}
default:
{
player.setActiveEnchantAttrItem(null);
Util.handleIllegalPlayerAction(player, "Player "+player.getName()+" tried to use enchant Exploit!", Config.DEFAULT_PUNISH);
return;
}
}
int stoneId = stone.getItemId();
byte elementToAdd = Elementals.getItemElement(stoneId);
// Armors have the opposite element
if (item.isArmor())
elementToAdd = Elementals.getOppositeElement(elementToAdd);
byte opositeElement = Elementals.getOppositeElement(elementToAdd);
Elementals oldElement = item.getElemental(elementToAdd);
int elementValue = oldElement == null ? 0 : oldElement.getValue();
int limit = getLimit(item, stoneId);
int powerToAdd = getPowerToAdd(stoneId, elementValue, item);
if ((item.isWeapon() && oldElement != null && oldElement.getElement() != elementToAdd && oldElement.getElement() != -2)
|| (item.isArmor() && item.getElemental(elementToAdd) == null && item.getElementals() != null && item.getElementals().length >= 3))
{
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.ANOTHER_ELEMENTAL_POWER_ALREADY_ADDED));
player.setActiveEnchantAttrItem(null);
return;
}
if (item.isArmor() && item.getElementals() != null)
{
//cant add opposite element
for (Elementals elm : item.getElementals())
{
if (elm.getElement() == opositeElement)
{
player.setActiveEnchantAttrItem(null);
Util.handleIllegalPlayerAction(player, "Player "+player.getName()+" tried to add oposite attribute to item!", Config.DEFAULT_PUNISH);
return;
}
}
}
int newPower = elementValue + powerToAdd;
if (newPower > limit)
{
newPower = limit;
powerToAdd = limit - elementValue;
}
if (powerToAdd <= 0)
{
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.ELEMENTAL_ENHANCE_CANCELED));
player.setActiveEnchantAttrItem(null);
return;
}
if(!player.destroyItem("AttrEnchant", stone, 1, player, true))
{
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.NOT_ENOUGH_ITEMS));
Util.handleIllegalPlayerAction(player, "Player "+player.getName()+" tried to attribute enchant with a stone he doesn't have", Config.DEFAULT_PUNISH);
player.setActiveEnchantAttrItem(null);
return;
}
boolean success = false;
switch(Elementals.getItemElemental(stoneId)._type)
{
case Stone:
case Roughore:
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_STONE;
break;
case Crystal:
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_CRYSTAL;
break;
case Jewel:
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_JEWEL;
break;
case Energy:
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_ENERGY;
break;
}
if (success)
{
byte realElement = item.isArmor() ? opositeElement : elementToAdd;
SystemMessage sm;
if (item.getEnchantLevel() == 0)
{
if (item.isArmor())
sm = SystemMessage.getSystemMessage(SystemMessageId.THE_S2_ATTRIBUTE_WAS_SUCCESSFULLY_BESTOWED_ON_S1_RES_TO_S3_INCREASED);
else
sm = SystemMessage.getSystemMessage(SystemMessageId.ELEMENTAL_POWER_S2_SUCCESSFULLY_ADDED_TO_S1);
sm.addItemName(item);
sm.addElemntal(realElement);
if (item.isArmor())
sm.addElemntal(Elementals.getOppositeElement(realElement));
}
else
{
if (item.isArmor())
sm = SystemMessage.getSystemMessage(SystemMessageId.THE_S3_ATTRIBUTE_BESTOWED_ON_S1_S2_RESISTANCE_TO_S4_INCREASED);
else
sm = SystemMessage.getSystemMessage(SystemMessageId.ELEMENTAL_POWER_S3_SUCCESSFULLY_ADDED_TO_S1_S2);
sm.addNumber(item.getEnchantLevel());
sm.addItemName(item);
sm.addElemntal(realElement);
if (item.isArmor())
sm.addElemntal(Elementals.getOppositeElement(realElement));
}
player.sendPacket(sm);
item.setElementAttr(elementToAdd, newPower);
if (item.isEquipped())
item.updateElementAttrBonus(player);
// send packets
InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(item);
player.sendPacket(iu);
}
else
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.FAILED_ADDING_ELEMENTAL_POWER));
player.sendPacket(new ExAttributeEnchantResult(powerToAdd));
player.sendPacket(new UserInfo(player));
player.sendPacket(new ExBrExtraUserInfo(player));
player.setActiveEnchantAttrItem(null);
}
public int getLimit(L2ItemInstance item, int sotneId)
{
Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId);
if (elementItem == null)
return 0;
if (item.isWeapon())
return Elementals.WEAPON_VALUES[elementItem._type._maxLevel];
else
return Elementals.ARMOR_VALUES[elementItem._type._maxLevel];
}
public int getPowerToAdd(int stoneId, int oldValue, L2ItemInstance item)
{
if (Elementals.getItemElement(stoneId) != Elementals.NONE)
{
if (item.isWeapon())
{
if (oldValue == 0)
return Elementals.FIRST_WEAPON_BONUS;
else
return Elementals.NEXT_WEAPON_BONUS;
}
else if (item.isArmor())
return Elementals.ARMOR_BONUS;
}
return 0;
}
@Override
public String getType()
{
return _C__D0_35_REQUESTEXENCHANTITEMATTRIBUTE;
}
}