/* * This file is part of Skript. * * Skript is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Skript is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Skript. If not, see <http://www.gnu.org/licenses/>. * * * Copyright 2011-2014 Peter Güttinger * */ package ch.njol.skript.entity; import java.util.Arrays; import org.bukkit.entity.Enderman; import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; import org.eclipse.jdt.annotation.Nullable; import ch.njol.skript.aliases.ItemType; import ch.njol.skript.lang.Literal; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.skript.localization.ArgsMessage; import ch.njol.skript.registrations.Classes; import ch.njol.util.Checker; import ch.njol.util.coll.CollectionUtils; /** * @author Peter Güttinger */ public class EndermanData extends EntityData<Enderman> { static { EntityData.register(EndermanData.class, "enderman", Enderman.class, "enderman"); } @Nullable private ItemType[] hand = null; @SuppressWarnings("unchecked") @Override protected boolean init(final Literal<?>[] exprs, final int matchedPattern, final ParseResult parseResult) { if (exprs[0] != null) hand = ((Literal<ItemType>) exprs[0]).getAll(); return true; } @Override protected boolean init(final @Nullable Class<? extends Enderman> c, final @Nullable Enderman e) { if (e != null) { final MaterialData m = e.getCarriedMaterial(); if (m != null) { final ItemStack i = m.toItemStack(1); if (i == null) return false; hand = new ItemType[] {new ItemType(i)}; } } return true; } @Override public void set(final Enderman entity) { if (hand != null) { final ItemType t = CollectionUtils.getRandom(hand); assert t != null; final ItemStack i = t.getBlock().getRandom(); if (i != null) entity.setCarriedMaterial(i.getData()); } } @Override public boolean match(final Enderman entity) { return hand == null || SimpleExpression.check(hand, new Checker<ItemType>() { @SuppressWarnings("deprecation") @Override public boolean check(final @Nullable ItemType t) { return t != null && t.isOfType(entity.getCarriedMaterial().getItemTypeId(), entity.getCarriedMaterial().getData()); } }, false, false); } @Override public Class<Enderman> getType() { return Enderman.class; } private final static ArgsMessage format = new ArgsMessage("entities.enderman.format"); @Override public String toString(final int flags) { final ItemType[] hand = this.hand; if (hand == null) return super.toString(flags); return format.toString(super.toString(flags), Classes.toString(hand, false)); } @Override protected int hashCode_i() { return Arrays.hashCode(hand); } @Override protected boolean equals_i(final EntityData<?> obj) { if (!(obj instanceof EndermanData)) return false; final EndermanData other = (EndermanData) obj; return Arrays.equals(hand, other.hand); } // if (hand == null) // return ""; // final StringBuilder b = new StringBuilder(); // for (final ItemType h : hand) { // final Pair<String, String> s = Classes.serialize(h); // if (s == null) // return null; // if (b.length() != 0) // b.append(","); // b.append(s.first); // b.append(":"); // b.append(s.second.replace(",", ",,").replace(":", "::")); // } // return b.toString(); @SuppressWarnings("null") @Override @Deprecated protected boolean deserialize(final String s) { if (s.isEmpty()) return true; final String[] split = s.split("(?<!,),(?!,)"); hand = new ItemType[split.length]; for (int i = 0; i < hand.length; i++) { final String[] t = split[i].split("(?<!:):(?::)"); if (t.length != 2) return false; final Object o = Classes.deserialize(t[0], t[1].replace(",,", ",").replace("::", ":")); if (o == null || !(o instanceof ItemType)) return false; hand[i] = (ItemType) o; } return false; } private boolean isSubhand(final @Nullable ItemType[] sub) { if (hand != null) return sub != null && ItemType.isSubset(hand, sub); return true; } @Override public boolean isSupertypeOf(final EntityData<?> e) { if (e instanceof EndermanData) return isSubhand(((EndermanData) e).hand); return false; } @Override public EntityData getSuperType() { return new EndermanData(); } }