package admincommands; import java.awt.Color; import java.util.List; 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.player.Player; import com.aionemu.gameserver.model.templates.item.ItemTemplate; import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE; import com.aionemu.gameserver.network.aion.serverpackets.SM_UPDATE_PLAYER_APPEARANCE; import com.aionemu.gameserver.services.item.ItemPacketService; import com.aionemu.gameserver.utils.ChatUtil; import com.aionemu.gameserver.utils.PacketSendUtility; import com.aionemu.gameserver.utils.chathandlers.AdminCommand; /** * @author loleron, Neon */ public class Dye extends AdminCommand { public Dye() { super("dye", "Dyes a players visible equipment."); setSyntaxInfo(" - Dyes the selected player in the specified color (can be dye item link/ID, color name or color HEX code). 0 removes all dyeing."); } @Override public void execute(Player player, String... params) { if (params.length == 0) { sendInfo(player); return; } Player target = player.getTarget() instanceof Player p ? p : player; Integer itemColor = null; // null = default item color String colorText = "default"; String colorParam = params[0]; if (!"0".equalsIgnoreCase(colorParam)) { // try to get itemId of a dyeing item itemColor = ChatUtil.getItemId(colorParam); ItemTemplate dyeItemTemplate = DataManager.ITEM_DATA.getItemTemplate(itemColor); if (itemColor != 0 && dyeItemTemplate != null && dyeItemTemplate.getActions() != null && dyeItemTemplate.getActions().getDyeAction() != null) { itemColor = dyeItemTemplate.getActions().getDyeAction().getColor(); colorText = ChatUtil.item(dyeItemTemplate.getTemplateId()); } else { try { try { // try to get color by name itemColor = ((Color) Class.forName("java.awt.Color").getField(colorParam.toUpperCase()).get(null)).getRGB(); } catch (Exception e) { // try to get color by hex code if (colorParam.length() <= 8) { if (colorParam.startsWith("#")) colorParam = colorParam.substring(1); else if (colorParam.startsWith("0x") || colorParam.startsWith("0X")) colorParam = colorParam.substring(2); } itemColor = Integer.valueOf(colorParam, 16); } colorText = ChatUtil.color("#" + String.format("%06X", itemColor & 0xFFFFFF), itemColor); } catch (NumberFormatException e) { sendInfo(player, "Invalid color."); return; } } } List appearanceItems = target.getEquipment().getEquippedForAppearance(); if (appearanceItems.isEmpty()) { PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_CHANGE_ITEM_SKIN_NO_TARGET_ITEM()); return; } if (appearanceItems.stream().noneMatch(item -> item.getItemTemplate().isItemDyePermitted())) { PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_ITEM_COLOR_CHANGE_ERROR_CANNOTDYE(appearanceItems.get(0).getL10n())); return; } for (Item item : appearanceItems) { if (item.getItemSkinTemplate().isItemDyePermitted()) item.setItemColor(itemColor); ItemPacketService.updateItemAfterInfoChange(target, item); } PacketSendUtility.broadcastPacket(target, new SM_UPDATE_PLAYER_APPEARANCE(target.getObjectId(), appearanceItems), true); target.getEquipment().setPersistentState(PersistentState.UPDATE_REQUIRED); if (itemColor == null) sendInfo(player, "Removed dyeing from " + target.getName() + "'s visible equipment."); else sendInfo(player, "Dyed " + target.getName() + " (color: " + colorText + ")"); if (!target.equals(player)) sendInfo(target, player.getName() + " has changed the color of your visible equipment to: " + colorText); } }