/* * This file is part of MyPet * * Copyright © 2011-2016 Keyle * MyPet is licensed under the GNU Lesser General Public License. * * MyPet 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. * * MyPet 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, see <http://www.gnu.org/licenses/>. */ package de.Keyle.MyPet.compat.v1_9_R1.entity; import de.Keyle.MyPet.MyPetApi; import de.Keyle.MyPet.api.entity.MyPet; import de.Keyle.MyPet.api.entity.MyPetMinecraftEntity; import de.Keyle.MyPet.api.entity.MyPetType; import de.Keyle.MyPet.api.util.Compat; import de.Keyle.MyPet.api.util.ReflectionUtil; import de.Keyle.MyPet.compat.v1_9_R1.entity.types.*; import net.minecraft.server.v1_9_R1.EntityTypes; import net.minecraft.server.v1_9_R1.World; import org.bukkit.ChatColor; import org.bukkit.craftbukkit.v1_9_R1.CraftWorld; import org.bukkit.event.entity.CreatureSpawnEvent; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import static de.Keyle.MyPet.api.entity.MyPetType.*; @Compat("v1_9_R1") public class EntityRegistry extends de.Keyle.MyPet.api.entity.EntityRegistry { protected Map<MyPetType, Class<? extends MyPetMinecraftEntity>> entityClasses = new HashMap<>(); public EntityRegistry() { entityClasses.put(Bat, EntityMyBat.class); entityClasses.put(Blaze, EntityMyBlaze.class); entityClasses.put(CaveSpider, EntityMyCaveSpider.class); entityClasses.put(Chicken, EntityMyChicken.class); entityClasses.put(Cow, EntityMyCow.class); entityClasses.put(Creeper, EntityMyCreeper.class); entityClasses.put(EnderDragon, EntityMyEnderDragon.class); entityClasses.put(Enderman, EntityMyEnderman.class); entityClasses.put(Endermite, EntityMyEndermite.class); entityClasses.put(Ghast, EntityMyGhast.class); entityClasses.put(Giant, EntityMyGiant.class); entityClasses.put(Guardian, EntityMyGuardian.class); entityClasses.put(Horse, EntityMyHorse.class); entityClasses.put(IronGolem, EntityMyIronGolem.class); entityClasses.put(MagmaCube, EntityMyMagmaCube.class); entityClasses.put(Mooshroom, EntityMyMooshroom.class); entityClasses.put(Ocelot, EntityMyOcelot.class); entityClasses.put(Pig, EntityMyPig.class); entityClasses.put(PigZombie, EntityMyPigZombie.class); entityClasses.put(Rabbit, EntityMyRabbit.class); entityClasses.put(Sheep, EntityMySheep.class); entityClasses.put(Silverfish, EntityMySilverfish.class); entityClasses.put(Skeleton, EntityMySkeleton.class); entityClasses.put(Slime, EntityMySlime.class); entityClasses.put(Snowman, EntityMySnowman.class); entityClasses.put(Spider, EntityMySpider.class); entityClasses.put(Squid, EntityMySquid.class); entityClasses.put(Witch, EntityMyWitch.class); entityClasses.put(Wither, EntityMyWither.class); entityClasses.put(Wolf, EntityMyWolf.class); entityClasses.put(Villager, EntityMyVillager.class); entityClasses.put(Zombie, EntityMyZombie.class); } @Override public MyPetMinecraftEntity createMinecraftEntity(MyPet pet, org.bukkit.World bukkitWorld) { EntityMyPet petEntity = null; Class<? extends MyPetMinecraftEntity> entityClass = entityClasses.get(pet.getPetType()); World world = ((CraftWorld) bukkitWorld).getHandle(); try { Constructor<?> ctor = entityClass.getConstructor(World.class, MyPet.class); Object obj = ctor.newInstance(world, pet); if (obj instanceof EntityMyPet) { petEntity = (EntityMyPet) obj; } } catch (Exception e) { MyPetApi.getLogger().info(ChatColor.RED + entityClass.getName() + " is no valid MyPet(Entity)!"); e.printStackTrace(); } return petEntity; } @Override public boolean spawnMinecraftEntity(MyPetMinecraftEntity entity, org.bukkit.World bukkitWorld) { if (entity != null) { World world = ((CraftWorld) bukkitWorld).getHandle(); return world.addEntity(((EntityMyPet) entity), CreatureSpawnEvent.SpawnReason.CUSTOM); } return false; } @Override public void registerEntityTypes() { for (MyPetType type : entityClasses.keySet()) { registerEntityType(type, entityClasses.get(type)); } } @SuppressWarnings("unchecked") public void registerEntityType(MyPetType type, Class<? extends MyPetMinecraftEntity> entityClass) { try { Field EntityTypes_d = ReflectionUtil.getField(EntityTypes.class, "d"); Field EntityTypes_f = ReflectionUtil.getField(EntityTypes.class, "f"); Map<Class, String> d = (Map) EntityTypes_d.get(EntityTypes_d); Map<Class, Integer> f = (Map) EntityTypes_f.get(EntityTypes_f); Iterator cIterator = d.keySet().iterator(); while (cIterator.hasNext()) { Class clazz = (Class) cIterator.next(); if (clazz.getCanonicalName().equals(entityClass.getCanonicalName())) { cIterator.remove(); } } Iterator eIterator = f.keySet().iterator(); while (eIterator.hasNext()) { Class clazz = (Class) eIterator.next(); if (clazz.getCanonicalName().equals(entityClass.getCanonicalName())) { eIterator.remove(); } } d.put(entityClass, type.getMinecraftName()); f.put(entityClass, type.getTypeID()); } catch (Exception e) { MyPetApi.getLogger().warning("Error while registering " + entityClass.getCanonicalName()); } } @Override @SuppressWarnings("unchecked") public void unregisterEntityTypes() { try { Field EntityTypes_d = ReflectionUtil.getField(EntityTypes.class, "d"); Field EntityTypes_f = ReflectionUtil.getField(EntityTypes.class, "f"); Map<Class, String> d = (Map) EntityTypes_d.get(EntityTypes_d); Map<Class, Integer> f = (Map) EntityTypes_f.get(EntityTypes_f); Iterator dIterator = d.keySet().iterator(); while (dIterator.hasNext()) { Class clazz = (Class) dIterator.next(); if (clazz.getCanonicalName().startsWith("de.Keyle.MyPet")) { dIterator.remove(); } } Iterator fIterator = f.keySet().iterator(); while (fIterator.hasNext()) { Class clazz = (Class) fIterator.next(); if (clazz.getCanonicalName().startsWith("de.Keyle.MyPet")) { fIterator.remove(); } } } catch (Exception e) { MyPetApi.getLogger().warning("Error while unregistering MyPet entities"); } } }