Skip to content
This repository has been archived by the owner on Aug 31, 2021. It is now read-only.

Command .preview

Sipherion edited this page Aug 21, 2016 · 1 revision

Command itself:

package com.aionemu.gameserver.command.player;

import com.aionemu.gameserver.command.BaseCommand;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.services.ItemRemodelService;

/**
 * @author Kashim
 */
public class CmdPreview extends BaseCommand {

	public void execute(Player player, String... params) {
		if (params.length != 1) {
			showHelp(player);
			return;
		}

		ItemRemodelService.commandPreviewRemodelItem(player, ParseInteger(params[0]), 15);
	}
}

ItemRemodelService.java:

public static boolean commandPreviewRemodelItem(Player player, int itemId, int duration) {
	ItemTemplate template = DataManager.ITEM_DATA.getItemTemplate(itemId);
	if (template == null) {
		return false;
	}

	Equipment equip = player.getEquipment();
	if (equip == null) {
		return false;
	}

	for (Item item : equip.getEquippedItemsWithoutStigma()) {
		if (item.getEquipmentSlot() == ItemSlot.MAIN_OFF_HAND.getSlotIdMask()
				|| item.getEquipmentSlot() == ItemSlot.SUB_OFF_HAND.getSlotIdMask()) {
			continue;
		}

		if (item.getItemTemplate().isWeapon()) {
			if (item.getItemTemplate().getWeaponType() == template.getWeaponType()
					&& item.getItemSkinTemplate().getTemplateId() != itemId) {
				systemPreviewRemodelItem(player, item, template, duration);
				return true;
			}
			else if (template.isWeapon()){
				PacketSendUtility.sendMessage(player, 
						"[Preview] Vous avez en main une arme de type " + item.getItemTemplate().getWeaponType() + ", " +
						"vous ne pouvez pas afficher un apper\u00E7u d'une arme de type " + template.getWeaponType());
			}
		}
		else if (item.getItemTemplate().isArmor()) {
			if (item.getItemTemplate().getItemSlot() == template.getItemSlot()
					&& item.getItemSkinTemplate().getTemplateId() != itemId) {
				systemPreviewRemodelItem(player, item, template, duration);
				return true;
			}
		}
		else {
			PacketSendUtility.sendMessage(player, 
					"[Preview] L'objet [item: " + itemId + "] n'a aucun apper\u00E7u disponible. " + 
					"Veuillez utiliser cette commande uniquement pour des armes / armures / costumes / ailes.");
		}
	}

	return false;
}

public static void systemPreviewRemodelItem(final Player player, final Item item,
	ItemTemplate template, int duration) {
	final ItemTemplate oldTemplate = item.getItemSkinTemplate();
	item.setItemSkinTemplate(template);
	
	PacketSendUtility.sendPacket(player, 
		new SM_UPDATE_PLAYER_APPEARANCE(player.getObjectId(), player.getEquipment().getEquippedForApparence()));
	PacketSendUtility.sendPacket(player, 
		new SM_SYSTEM_MESSAGE(1300483, new DescriptionId(item.getItemTemplate().getNameId())));
	
	PacketSendUtility.broadcastPacket(player,
		new SM_UPDATE_PLAYER_APPEARANCE(player.getObjectId(), player.getEquipment().getEquippedItemsWithoutStigma()), true);
	
	ThreadPoolManager.getInstance().schedule(new Runnable() {
		@Override
		public void run() {
			item.setItemSkinTemplate(oldTemplate);
		}
	}, 50);
	
	ThreadPoolManager.getInstance().schedule(new Runnable() {
		@Override
		public void run() {
			PacketSendUtility.sendPacket(player, 
					new SM_UPDATE_PLAYER_APPEARANCE(player.getObjectId(), player.getEquipment().getEquippedForApparence()));
			PacketSendUtility.broadcastPacket(player,
					new SM_UPDATE_PLAYER_APPEARANCE(player.getObjectId(), player.getEquipment().getEquippedItemsWithoutStigma()), true);
		}
	}, duration * 1000);
}

Equipment.java:

public List<Item> getEquippedForApparence() {
	FastList<Item> equippedItems = FastList.newInstance();
	Item twoHanded = null;
	for (Item item : equipment.values()) {
		long slot = item.getEquipmentSlot();
		if (!ItemSlot.isStigma(slot)) {
			if (slot <= ItemSlot.WINGS.getSlotIdMask()) {
				if (item.getItemTemplate().isTwoHandWeapon()) {
					if (twoHanded != null) {
						continue;
					}
					twoHanded = item;
				}
				equippedItems.add(item);
			}
		}
	}
	return equippedItems;
}
Clone this wiki locally