123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- /*
- * 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.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 D0_35_REQUEST_EX_ENCHANT_ITEM_ATTRIBUTE = "[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(new SystemMessage(SystemMessageId.ELEMENTAL_ENHANCE_CANCELED));
- return;
- }
- if (player.isOnline() == 0)
- {
- player.setActiveEnchantAttrItem(null);
- return;
- }
- if (player.getPrivateStoreType() != 0)
- {
- player.sendPacket(new SystemMessage(SystemMessageId.CANNOT_ADD_ELEMENTAL_POWER_WHILE_OPERATING_PRIVATE_STORE_OR_WORKSHOP));
- return;
- }
- // Restrict enchant during a trade (bug if enchant fails)
- if (player.getActiveRequester() != null)
- {
- // Cancel trade
- player.cancelActiveTrade();
- 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))
- return;
- if (item.isWear())
- {
- Util.handleIllegalPlayerAction(player, "Player "+player.getName()+" tried to enchant a weared Item", Config.DEFAULT_PUNISH);
- return;
- }
- //can't enchant rods, shadow items, adventurers', PvP items, hero items, cloaks, bracelets, underwear (e.g. shirt), belt, necklace, earring, ring
- if (item.getItem().getItemType() == L2WeaponType.ROD || item.isShadowItem() || 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 || item.getItem().getBodyPart() == L2Item.SLOT_R_FINGER ||
- item.getItem().getElementals() != null)
- {
- player.sendPacket(new SystemMessage(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();
- Elementals oldElement = item.getElementals();
- int elementValue = oldElement == null ? 0 : oldElement.getValue();
- int limit = getLimit(stoneId, item);
- int powerToAdd = getPowerToAdd(stoneId, elementValue, item);
- byte elementToAdd = getElementFromItemId(stoneId);
- // Armors have the opposite element
- if (item.isArmor())
- elementToAdd = Elementals.getOppositeElement(elementToAdd);
- int newPower = elementValue + powerToAdd;
- if (newPower > limit)
- {
- newPower = limit;
- powerToAdd = limit - elementValue;
- }
- if (oldElement != null && oldElement.getElement() != elementToAdd && oldElement.getElement() != -2)
- {
- player.sendPacket(new SystemMessage(SystemMessageId.ANOTHER_ELEMENTAL_POWER_ALREADY_ADDED));
- player.setActiveEnchantAttrItem(null);
- return;
- }
- if (powerToAdd <= 0)
- {
- player.sendPacket(new SystemMessage(SystemMessageId.ELEMENTAL_ENHANCE_CANCELED));
- player.setActiveEnchantAttrItem(null);
- return;
- }
- if(!player.destroyItem("AttrEnchant", stone, 1, player, true))
- {
- player.sendPacket(new SystemMessage(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;
- }
- if (Rnd.get(100) <= Elementals.ENCHANT_CHANCE)
- {
- SystemMessage sm;
- if (item.getEnchantLevel() == 0)
- {
- sm = new SystemMessage(SystemMessageId.ELEMENTAL_POWER_S2_SUCCESSFULLY_ADDED_TO_S1);
- sm.addItemName(item);
- sm.addString(Elementals.getElementName(elementToAdd));
- }
- else
- {
- sm = new SystemMessage(SystemMessageId.ELEMENTAL_POWER_S3_SUCCESSFULLY_ADDED_TO_S1_S2);
- sm.addNumber(item.getEnchantLevel());
- sm.addItemName(item);
- sm.addString(Elementals.getElementName(elementToAdd));
- }
- 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(new SystemMessage(SystemMessageId.FAILED_ADDING_ELEMENTAL_POWER));
- player.sendPacket(new ExAttributeEnchantResult(powerToAdd));
- player.sendPacket(new UserInfo(player));
- player.sendPacket(new ExBrExtraUserInfo(player));
- player.setActiveEnchantAttrItem(null);
- }
- public byte getElementFromItemId(int itemId)
- {
- byte element = 0;
- for (int id : Elementals.STONES)
- {
- if (id == itemId)
- return element;
- element++;
- }
- element = 0;
- for (int id : Elementals.CRYSTALS)
- {
- if (id == itemId)
- return element;
- element++;
- }
- element = 0;
- for (int id : Elementals.JEWELS)
- {
- if (id == itemId)
- return element;
- element++;
- }
- element = 0;
- for (int id : Elementals.ENERGIES)
- {
- if (id == itemId)
- return element;
- element++;
- }
- element = 0;
- for (int id : Elementals.ROUGHORES)
- {
- if (id == itemId)
- return element;
- element++;
- }
- return -1;
- }
- public int getLimit(int itemId, L2ItemInstance item)
- {
- for (int id : Elementals.STONES)
- {
- if (id == itemId)
- {
- if (item.isWeapon())
- return Elementals.WEAPON_VALUES[3];
- return Elementals.ARMOR_VALUES[3];
- }
- }
- for (int id : Elementals.CRYSTALS)
- {
- if (id == itemId)
- {
- if (item.isWeapon())
- return Elementals.WEAPON_VALUES[6];
- return Elementals.ARMOR_VALUES[6];
- }
- }
- for (int id : Elementals.JEWELS)
- {
- if (id == itemId)
- {
- if (item.isWeapon())
- return Elementals.WEAPON_VALUES[9];
- return Elementals.ARMOR_VALUES[9];
- }
- }
- for (int id : Elementals.ENERGIES)
- {
- if (id == itemId)
- {
- if (item.isWeapon())
- return Elementals.WEAPON_VALUES[12];
- return Elementals.ARMOR_VALUES[12];
- }
- }
- for (int id : Elementals.ROUGHORES)
- {
- if (id == itemId)
- {
- if (item.isWeapon())
- return Elementals.WEAPON_VALUES[3];
- return Elementals.ARMOR_VALUES[3];
- }
- }
- return 0;
- }
- public int getPowerToAdd(int stoneId, int oldValue, L2ItemInstance item)
- {
- boolean found = false;
- for (int id : Elementals.STONES)
- {
- if (id == stoneId)
- {
- found = true;
- break;
- }
- }
- if (!found)
- {
- for (int id : Elementals.CRYSTALS)
- {
- if (id == stoneId)
- {
- found = true;
- break;
- }
- }
- if (!found)
- {
- for (int id : Elementals.JEWELS)
- {
- if (id == stoneId)
- {
- found = true;
- break;
- }
- }
- if (!found)
- {
- for (int id : Elementals.ENERGIES)
- {
- if (id == stoneId)
- {
- found = true;
- break;
- }
- }
- if (!found)
- {
- for (int id : Elementals.ROUGHORES)
- {
- if (id == stoneId)
- {
- found = true;
- break;
- }
- }
- }
- }
- }
- }
- if (found)
- {
- 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 D0_35_REQUEST_EX_ENCHANT_ITEM_ATTRIBUTE;
- }
- }
|