package admincommands; import java.lang.reflect.Field; import com.aionemu.gameserver.dataholders.DataManager; import com.aionemu.gameserver.model.gameobjects.Item; import com.aionemu.gameserver.model.gameobjects.Persistable.PersistentState; import com.aionemu.gameserver.model.gameobjects.VisibleObject; import com.aionemu.gameserver.model.gameobjects.player.Player; import com.aionemu.gameserver.model.items.ManaStone; import com.aionemu.gameserver.model.stats.listeners.ItemEquipmentListener; import com.aionemu.gameserver.model.templates.item.GodstoneInfo; import com.aionemu.gameserver.model.templates.item.ItemTemplate; import com.aionemu.gameserver.model.templates.item.ItemType; import com.aionemu.gameserver.model.templates.item.enums.ItemGroup; import com.aionemu.gameserver.network.aion.serverpackets.SM_STATS_INFO; import com.aionemu.gameserver.services.item.ItemPacketService; import com.aionemu.gameserver.services.item.ItemPacketService.ItemUpdateType; import com.aionemu.gameserver.services.item.ItemSocketService; import com.aionemu.gameserver.utils.PacketSendUtility; import com.aionemu.gameserver.utils.Util; import com.aionemu.gameserver.utils.chathandlers.AdminCommand; import com.aionemu.gameserver.world.World; /** * @author Tago, Wakizashi */ public class Equip extends AdminCommand { public Equip() { super("equip"); } @Override public void execute(Player admin, String... params) { if (params.length != 0) { int i = 0; if ("help".startsWith(params[i])) { if (params[i + 1] == null) showHelp(admin); else if ("socket".startsWith(params[i + 1])) showHelpSocket(admin); else if ("enchant".startsWith(params[i + 1])) showHelpEnchant(admin); else if ("godstone".startsWith(params[i + 1])) showHelpGodstone(admin); return; } Player player = null; player = World.getInstance().getPlayer(Util.convertName(params[i])); if (player == null) { VisibleObject target = admin.getTarget(); if (target instanceof Player) player = (Player) target; else player = admin; } else i++; if ("socket".startsWith(params[i])) { int manastone = 167000551; int quant = 0; try { manastone = params[i + 1] == null ? manastone : Integer.parseInt(params[i + 1]); quant = params[i + 2] == null ? quant : Integer.parseInt(params[i + 2]); } catch (Exception ex2) { showHelpSocket(admin); return; } socket(admin, player, manastone, quant); return; } if ("enchant".startsWith(params[i])) { int enchant = 0; try { enchant = params[i + 1] == null ? enchant : Integer.parseInt(params[i + 1]); } catch (Exception ex) { showHelpEnchant(admin); return; } enchant(admin, player, enchant); return; } if ("tamper".startsWith(params[i])) { int tampering = 0; try { tampering = params[i + 1] == null ? tampering : Integer.parseInt(params[i + 1]); } catch (Exception ex) { showHelpEnchant(admin); return; } tamper(admin, player, tampering); return; } if ("godstone".startsWith(params[i])) { int godstone = 100; try { godstone = params[i + 1] == null ? godstone : Integer.parseInt(params[i + 1]); } catch (Exception ex) { showHelpGodstone(admin); return; } godstone(admin, player, godstone); return; } } showHelp(admin); } private void socket(Player admin, Player player, int manastone, int quant) { if (manastone != 0 && (manastone < 167000000 || manastone > 168000000)) { sendInfo(admin, "You are suposed to give the item id for a" + " Manastone or 0 to remove all manastones."); return; } for (Item targetItem : player.getEquipment().getEquippedItemsWithoutStigma()) { if (isUpgradeble(targetItem)) { if (manastone == 0) { ItemEquipmentListener.removeStoneStats(targetItem.getItemStones(), player.getGameStats()); ItemSocketService.removeAllManastone(player, targetItem); } else { int counter = quant <= 0 ? getMaxSlots(targetItem) : quant; while (targetItem.getItemStones().size() < getMaxSlots(targetItem) && counter >= 0) { ManaStone manaStone = ItemSocketService.addManaStone(targetItem, manastone, false); ItemEquipmentListener.addStoneStats(targetItem, manaStone, player.getGameStats()); counter--; } } PacketSendUtility.sendPacket(player, new SM_STATS_INFO(player)); ItemPacketService.updateItemAfterInfoChange(player, targetItem); targetItem.setPersistentState(PersistentState.UPDATE_REQUIRED); } } if (manastone == 0) { if (player == admin) sendInfo(player, "All Manastones removed from all equipped Items"); else { sendInfo(admin, "All Manastones removed from all equipped Items by the Player " + player.getName()); sendInfo(player, "Admin " + admin.getName() + " removed all manastones from all your equipped Items"); } } else { if (player == admin) sendInfo(player, quant + "x [item: " + manastone + "] were added to free slots on all equipped items"); else { sendInfo(admin, quant + "x [item: " + manastone + "] were added to free slots on all equipped items by the Player " + player.getName()); sendInfo(player, "Admin " + admin.getName() + " added " + quant + "x [item: " + manastone + "] to free slots on all your equipped items"); } } } private void godstone(Player admin, Player player, int godstone) { Item targetItem = player.getEquipment().getMainHandWeapon(); if (godstone > 100000000) { ItemTemplate itemTemplate = DataManager.ITEM_DATA.getItemTemplate(godstone); GodstoneInfo godstoneInfo = itemTemplate.getGodstoneInfo(); if (godstoneInfo == null) { sendInfo(admin, "Wrong GodStone ItemID"); return; } targetItem.addGodStone(godstone); PacketSendUtility.sendPacket(player, new SM_STATS_INFO(player)); ItemPacketService.updateItemAfterInfoChange(player, targetItem); targetItem.setPersistentState(PersistentState.UPDATE_REQUIRED); if (player == admin) sendInfo(player, "[Item: " + godstone + "] socketed to your equipped MainHandWeapon [Item: " + targetItem.getItemId() + "]"); else { sendInfo(admin, "[Item: " + godstone + "] socketed to the Player " + player.getName() + "equipped MainHandWeapon [Item: " + targetItem.getItemId() + "]"); sendInfo(player, "Admin " + admin.getName() + " socketed [Item: " + godstone + "] to you equipped MainHandWeapon [Item: " + targetItem.getItemId() + "]"); } } else if (targetItem.getGodStone() != null) { try { if (godstone <= 100) godstone *= 10; if (godstone > 1000) godstone = 1000; Class gs = targetItem.getGodStone().getClass(); Field probability = gs.getDeclaredField("probability"); Field probabilityLeft = gs.getDeclaredField("probability"); probability.setAccessible(true); probabilityLeft.setAccessible(true); probability.setInt(targetItem.getGodStone(), godstone); probabilityLeft.setInt(targetItem.getGodStone(), godstone); } catch (Exception ex2) { sendInfo(admin, "Occurs an error."); return; } if (player.equals(admin)) sendInfo(player, "Your godstone on your MainHandWeapon will now activate around " + (godstone / 10) + " percent of the time."); else { sendInfo(admin, "Player " + player.getName() + " godstone on MainHandWeapon will now activate around " + godstone + " percent of the time."); sendInfo(player, "Admin " + admin.getName() + " blessed your godstone on your MainHandWeapon to now activate around " + godstone + " percent of the time."); } } } private void enchant(Player admin, Player player, int enchant) { for (Item targetItem : player.getEquipment().getEquippedItemsWithoutStigma()) { if (isUpgradeble(targetItem)) { if (targetItem.getEnchantLevel() == enchant) continue; if (enchant > 255) enchant = 255; if (enchant < 0) enchant = 0; targetItem.setEnchantLevel(enchant); if (targetItem.isEquipped()) { player.getGameStats().updateStatsVisually(); } ItemPacketService.updateItemAfterInfoChange(player, targetItem, ItemUpdateType.STATS_CHANGE); } } if (player == admin) sendInfo(player, "All equipped items were enchanted to level " + enchant); else { sendInfo(admin, "All equipped items by the Player " + player.getName() + " were enchanted to " + enchant); sendInfo(player, "Admin " + admin.getName() + " enchanted all your equipped items to level " + enchant); } } private void tamper(Player admin, Player player, int tampering) { for (Item targetItem : player.getEquipment().getEquippedItemsWithoutStigma()) { if (isTampering(targetItem)) { if (targetItem.getTempering() == tampering) continue; if (tampering > 255) tampering = 255; if (tampering < 0) tampering = 0; targetItem.setTempering(tampering); if (targetItem.isEquipped()) { player.getGameStats().updateStatsVisually(); } ItemPacketService.updateItemAfterInfoChange(player, targetItem, ItemUpdateType.STATS_CHANGE); } } if (player == admin) sendInfo(player, "All equipped items were tampering to level " + tampering); else { sendInfo(admin, "All equipped items by the Player " + player.getName() + " were tampering to " + tampering); sendInfo(player, "Admin " + admin.getName() + " tampering all your equipped items to level " + tampering); } } /** * Verify if the item is enchantble and/or socketble */ public static boolean isUpgradeble(Item item) { if (item.getItemTemplate().isNoEnchant()) return false; if (item.getItemTemplate().isWeapon()) return true; if (item.getItemTemplate().isArmor()) { long at = item.getItemTemplate().getItemSlot(); if (at == 1 || /* Main Hand */ at == 2 || /* Sub Hand */ at == 8 || /* Jacket */ at == 16 || /* Gloves */ at == 32 || /* Boots */ at == 2048 || /* Shoulder */ at == 4096 || /* Pants */ at == 131072 || /* Main Off Hand */ at == 262144) /* Sub Off Hand */ return true; } return false; } public static boolean isTampering(Item item) { if (item.getItemTemplate().getItemGroup() == ItemGroup.EARRING) return true; if (item.getItemTemplate().getItemGroup() == ItemGroup.RING) return true; if (item.getItemTemplate().getItemGroup() == ItemGroup.NECKLACE) return true; if (item.getItemTemplate().getItemGroup() == ItemGroup.BELT) return true; if (item.getItemTemplate().getItemGroup() == ItemGroup.HEAD) return true; if (item.getItemTemplate().getItemGroup() == ItemGroup.PLUME) return true; return false; } /** * Returns the max number of manastones that can be socketed */ public static int getMaxSlots(Item item) { int slots = 0; switch (item.getItemTemplate().getItemQuality()) { case COMMON: case JUNK: slots = 1; break; case RARE: slots = 2; break; case LEGEND: slots = 3; break; case UNIQUE: slots = 4; break; case EPIC: slots = 5; break; case MYTHIC: slots = 5; break; default: slots = 0; break; } if (item.getItemTemplate().getItemType() == ItemType.DRACONIC) slots += 1; if (item.getItemTemplate().getItemType() == ItemType.ABYSS) slots += 2; return slots; } private void showHelp(Player admin) { sendInfo(admin, "[Help: Equip Command]\n" + " Use //equip help for more details on the command.\n" + " Notice: This command uses smart matching. You may abbreviate most commands.\n" + " For example: (//equip so 167000551 5) will match to (//equip socket 167000551 5)"); } private void showHelpEnchant(Player admin) { sendInfo(admin, "Syntax: //equip [playerName] enchant [EnchantLevel = 0]\n" + " This command Enchants all items equipped up to 255.\n" + " Notice: You can ommit parameters between [], especially playerName.\n" + " Target: Named player, then targeted player, only then self.\n" + " Default Value: EnchantLevel is 0."); } private void showHelpSocket(Player admin) { sendInfo(admin, "Syntax: //equip [playerName] socket [ManastoneID = 167000551] [Quantity = 0]\n" + " This command Sockets all free slots on equipped items, with the given manastone id.\n" + " Use ManastoneID = 0 to remove all Manastones. Quantity = 0 means to fill all free slots.\n" + " Notice: You can ommit parameters between [], especially playerName.\n" + " Target: Named player, then targeted player, only then self.\n" + " Default Value: ManastoneID is 167000551, Quantity is 0 meaning fill all slots."); } private void showHelpGodstone(Player admin) { sendInfo(admin, "Syntax: //equip [playerName] godstone [rate = 100|GodStoneID]\n" + " This command changes the godstone activation rate to the given number(0-100).\n" + " Give a GodStone ItemID and it will be socketed on you Main Hand Weapon.\n" + " Notice: You can ommit parameters between [], especially playerName.\n" + " Target: Named player, then targeted player, only then self.\n" + " Default Value: Rate is 100 which is the default action ."); } @Override public void info(Player player, String message) { showHelp(player); } }