/* * ExperienceMod - Bukkit server plugin for modifying the experience system in Minecraft. * Copyright (C) 2012 Kristian S. Stangeland * * This program 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 2 of * the License, or (at your option) any later version. * * This program 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 this program; * if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA */ package com.comphenix.xp.lookup; import java.util.HashSet; import java.util.Set; import org.bukkit.entity.Skeleton.SkeletonType; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import com.comphenix.xp.Action; public class MobTree extends ActionTree<MobQuery> implements Multipliable<MobTree> { // DON'T CARE fields are marked with NULL protected Parameter<Short> type; protected Parameter<DamageCause> deathCause; protected Parameter<Integer> size; protected Parameter<SkeletonType> skeletonType; protected Parameter<Boolean> spawner; protected Parameter<Boolean> baby; protected Parameter<Boolean> tamed; protected Parameter<Boolean> playerKill; protected Parameter<Boolean> villaged; // For cloning protected MobTree(MobTree other, double newMultiplier) { super(other, newMultiplier); if (other == null) throw new IllegalArgumentException("other"); this.type = other.type; this.deathCause = other.deathCause; this.size = other.size; this.skeletonType = other.skeletonType; this.spawner = other.spawner; this.baby = other.baby; this.tamed = other.tamed; this.playerKill = other.playerKill; this.villaged = other.villaged; } public MobTree(double multiplier) { super(multiplier); this.type = new Parameter<Short>(); this.deathCause = new Parameter<DamageCause>(); this.size = new Parameter<Integer>(); this.skeletonType = new Parameter<SkeletonType>(); this.spawner = new Parameter<Boolean>(); this.baby = new Parameter<Boolean>(); this.tamed = new Parameter<Boolean>(); this.playerKill = new Parameter<Boolean>(); this.villaged = new Parameter<Boolean>(); } @Override public MobTree withMultiplier(double newMultiplier) { return new MobTree(this, newMultiplier); } @Override protected Integer putFromParameters(MobQuery source, Integer id) { int paramCount = 0; if (source.hasType()) { type.put(source.getType(), id); paramCount++; } if (source.hasDeathCause()) { deathCause.put(source.getDeathCause(), id); paramCount++; } if (source.hasSize()) { size.put(source.getSize(), id); paramCount++; } if (source.hasSkeletonType()) { skeletonType.put(source.getSkeletonType(), id); paramCount++; } if (source.hasSpawner()) { spawner.put(source.getSpawner(), id); paramCount++; } if (source.hasBaby()) { baby.put(source.getBaby(), id); paramCount++; } if (source.hasTamed()) { tamed.put(source.getTamed(), id); paramCount++; } if (source.hasPlayerKill()) { playerKill.put(source.getPlayerKill(), id); paramCount++; } if (source.hasVillaged()) { villaged.put(source.getVillaged(), id); paramCount++; } return paramCount; } @Override protected Set<Integer> getFromParameters(MobQuery source) { Set<Integer> candidates = new HashSet<Integer>(flatten.keySet()); if (source.hasType()) { type.retain(candidates, source.getType()); } if (source.hasDeathCause()) { deathCause.retain(candidates, source.getDeathCause()); } if (source.hasSize()) { size.retain(candidates, source.getSize()); } if (source.hasSkeletonType()) { skeletonType.retain(candidates, source.getSkeletonType()); } if (source.hasSpawner()) { spawner.retain(candidates, source.getSpawner()); } if (source.hasBaby()) { baby.retain(candidates, source.getBaby()); } if (source.hasTamed()) { tamed.retain(candidates, source.getTamed()); } if (source.hasPlayerKill()) { playerKill.retain(candidates, source.getPlayerKill()); } if (source.hasVillaged()) { villaged.retain(candidates, source.getVillaged()); } return candidates; } @Override protected void putAllParameters(SearchTree<MobQuery, Action> other, Integer offset) { MobTree tree = (MobTree) other; type.putAll(tree.type, offset); deathCause.putAll(tree.deathCause, offset); size.putAll(tree.size, offset); skeletonType.putAll(tree.skeletonType, offset); spawner.putAll(tree.spawner, offset); baby.putAll(tree.baby, offset); tamed.putAll(tree.tamed, offset); playerKill.putAll(tree.playerKill, offset); villaged.putAll(tree.villaged, offset); } public Parameter<Short> getType() { return type; } public Parameter<DamageCause> getDeathCause() { return deathCause; } public Parameter<Integer> getSize() { return size; } public Parameter<SkeletonType> getSkeletonType() { return skeletonType; } public Parameter<Boolean> getSpawner() { return spawner; } public Parameter<Boolean> getBaby() { return baby; } public Parameter<Boolean> getTamed() { return tamed; } public Parameter<Boolean> getPlayerKill() { return playerKill; } public Parameter<Boolean> getVillaged() { return villaged; } }