테스트

aion-server 4.8

Gitteol
최고관리자 · 1 · 💬 0 클론/새로받기
 4.8 61f661d · 1 commits 새로받기(Pull)
game-server/data/handlers/admincommands/Equip.java
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 <socket|enchant|godstone> 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);
	}
}

📎 첨부파일

댓글 작성 권한이 없습니다.
🏆 포인트 랭킹 TOP 10
순위 닉네임 포인트
1 no_profile 타키야겐지쪽지보내기 자기소개 아이디로 검색 전체게시물 100,792
2 no_profile 동가리쪽지보내기 자기소개 아이디로 검색 전체게시물 58,079
3 no_profile 라프텔쪽지보내기 자기소개 아이디로 검색 전체게시물 51,771
4 no_profile 불멸의행복쪽지보내기 자기소개 아이디로 검색 전체게시물 36,923
5 서번트쪽지보내기 자기소개 아이디로 검색 전체게시물 35,011
6 no_profile 보거스쪽지보내기 자기소개 아이디로 검색 전체게시물 29,969
7 no_profile 닥터스쪽지보내기 자기소개 아이디로 검색 전체게시물 29,470
8 no_profile 검은고양이쪽지보내기 자기소개 아이디로 검색 전체게시물 29,077
9 no_profile Revolution쪽지보내기 자기소개 아이디로 검색 전체게시물 28,199
10 no_profile 호롤롤로쪽지보내기 자기소개 아이디로 검색 전체게시물 17,020
알림 0