package consolecommands;
import java.io.File;
import java.util.List;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.*;
import com.aionemu.gameserver.model.gameobjects.Item;
import com.aionemu.gameserver.model.gameobjects.VisibleObject;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.templates.item.enums.EquipType;
import com.aionemu.gameserver.model.templates.spawns.SpawnTemplate;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
import com.aionemu.gameserver.services.AdminService;
import com.aionemu.gameserver.services.EnchantService;
import com.aionemu.gameserver.services.item.ItemFactory;
import com.aionemu.gameserver.services.item.ItemService;
import com.aionemu.gameserver.spawnengine.SpawnEngine;
import com.aionemu.gameserver.utils.ChatUtil;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.utils.chathandlers.ConsoleCommand;
import com.aionemu.gameserver.utils.xml.JAXBUtil;
/**
* Sent in the following cases:
* - Spawning npcs from the npc tab in the GM Panel (Shift + F1)
* - Adding items from the item tab in the GM Panel (Shift + F1)
* - Pressing Ctrl + Shift + Alt while clicking on an item if the console has been activated via "\con_disable_console 0" from the command tab of the
* GM Panel (Shift + F1). Left-clicking allows to choose how many items to add, right-clicking always adds one.
*
* @author ginho1, Neon
*/
public class Wish extends ConsoleCommand {
public Wish() {
super("wish", "Spawns npcs and adds items.");
// @formatter:off
setSyntaxInfo(
" - Spawns the specified npc on your targets position.",
" - - Adds the specified item to your target.",
"
- - Adds the specified item with the enchant level to your target."
);
// @formatter:on
}
@Override
public void execute(Player admin, String... params) {
if (params.length == 0) {
sendInfo(admin);
return;
}
if (params.length == 1) { // spawn npc
String npcName = params[0];
File xml = new File("./data/handlers/consolecommands/data/npcs.xml");
NpcData data = JAXBUtil.deserialize(xml, NpcData.class);
NpcTemplate npcTemplate = data.getNpcTemplate(npcName);
if (npcTemplate == null) {
sendInfo(admin, "There is no template with this name");
return;
}
int npcId = npcTemplate.getTemplateId();
SpawnTemplate spawn = SpawnEngine.newSpawn(admin.getWorldId(), npcId, admin.getX(), admin.getY(), admin.getZ(), admin.getHeading(), 0);
VisibleObject visibleObject = SpawnEngine.spawnObject(spawn, admin.getInstanceId());
if (visibleObject == null) {
sendInfo(admin, "Spawn id " + npcId + " was not found!");
return;
}
String objectName = visibleObject.getObjectTemplate().getName();
sendInfo(admin, objectName + " spawned");
} else { // add item
if (!(admin.getTarget() instanceof Player player)) {
PacketSendUtility.sendPacket(admin, SM_SYSTEM_MESSAGE.STR_INVALID_TARGET());
return;
}
String itemName = params[0];
long addCount = 1;
int itemId;
int enchant = 0;
try {
addCount = Integer.parseInt(params[0]);
itemName = params[1];
} catch (NumberFormatException e) {
try {
enchant = Integer.parseInt(params[1]);
} catch (NumberFormatException e2) {
}
}
File xml = new File("./data/handlers/consolecommands/data/items.xml");
ItemData data = JAXBUtil.deserialize(xml, ItemData.class);
ItemTemplate itemTemplate = data.getItemTemplate(itemName);
if (itemTemplate != null) {
itemId = itemTemplate.getTemplateId();
if (!AdminService.getInstance().canOperate(admin, player, itemId, "command ///wish"))
return;
long addedCount;
if (enchant > 0) {
Item newItem = ItemFactory.newItem(itemId);
if (newItem == null)
return;
enchant = Math.min(enchant, 255);
if (newItem.getItemTemplate().getEquipmentType() != EquipType.PLUME) {
if (newItem.getItemTemplate().canTune() && newItem.getItemTemplate().getMaxEnchantBonus() > 0)
enchant = Math.min(enchant, newItem.getItemTemplate().getMaxEnchantLevel());
newItem.setEnchantLevel(enchant);
if (enchant > newItem.getItemTemplate().getMaxEnchantLevel()) {
newItem.setAmplified(true);
if (enchant >= 20)
newItem.setBuffSkill(EnchantService.getEquipBuff(newItem));
}
} else {
newItem.setTempering(enchant);
}
addedCount = addCount - ItemService.addItem(player, newItem);
} else {
addedCount = addCount - ItemService.addItem(player, itemId, addCount, true);
}
if (addedCount <= 0) {
sendInfo(admin, "Item couldn't be added");
} else {
if (!admin.equals(player)) {
sendInfo(admin, "You gave " + addedCount + " " + ChatUtil.item(itemId) + " to " + player.getName() + ".");
sendInfo(player, "You received " + addedCount + " " + ChatUtil.item(itemId) + " from " + admin.getName() + ".");
}
}
}
}
}
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(namespace = "", name = "ItemTemplate")
private static class ItemTemplate {
@XmlAttribute(name = "id", required = true)
@XmlID
private String id;
@XmlAttribute(name = "name")
private String name;
public String getName() {
return name;
}
public int getTemplateId() {
return itemId;
}
private int itemId;
public void setItemId(int itemId) {
this.itemId = itemId;
}
@SuppressWarnings("unused")
void afterUnmarshal(Unmarshaller u, Object parent) {
setItemId(Integer.parseInt(id));
}
}
@XmlRootElement(name = "items")
@XmlAccessorType(XmlAccessType.FIELD)
private static class ItemData {
@XmlElement(name = "item")
private List its;
public ItemTemplate getItemTemplate(String item) {
for (ItemTemplate it : getData()) {
if (it.getName().equals(item))
return it;
}
return null;
}
protected List getData() {
return its;
}
}
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(namespace = "", name = "NpcTemplate")
private static class NpcTemplate {
@XmlAttribute(name = "id", required = true)
@XmlID
private String id;
@XmlAttribute(name = "name")
private String name;
public String getName() {
return name;
}
public int getTemplateId() {
return npcId;
}
private int npcId;
public void setNpcId(int npcId) {
this.npcId = npcId;
}
@SuppressWarnings("unused")
void afterUnmarshal(Unmarshaller u, Object parent) {
setNpcId(Integer.parseInt(id));
}
}
@XmlRootElement(name = "npcs")
@XmlAccessorType(XmlAccessType.FIELD)
private static class NpcData {
@XmlElement(name = "npc")
private List its;
public NpcTemplate getNpcTemplate(String npcName) {
for (NpcTemplate it : getData()) {
if (it.getName().equalsIgnoreCase(npcName))
return it;
}
return null;
}
protected List getData() {
return its;
}
}
}