package org.bukkit.craftbukkit.entity; import com.google.common.base.Preconditions; import net.minecraft.core.BlockPosition; import net.minecraft.core.IRegistry; import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.monster.EntityZombie; import net.minecraft.world.entity.monster.EntityZombieVillager; import net.minecraft.world.entity.npc.EntityVillager; import net.minecraft.world.entity.npc.VillagerProfession; import net.minecraft.world.entity.npc.VillagerType; import net.minecraft.world.level.block.BlockBed; import net.minecraft.world.level.block.state.IBlockData; import org.bukkit.Location; import org.bukkit.Registry; import org.bukkit.craftbukkit.CraftRegistry; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.util.CraftLocation; import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.entity.Villager; import org.bukkit.entity.ZombieVillager; import org.bukkit.event.entity.CreatureSpawnEvent; public class CraftVillager extends CraftAbstractVillager implements Villager { public CraftVillager(CraftServer server, EntityVillager entity) { super(server, entity); } @Override public EntityVillager getHandle() { return (EntityVillager) entity; } @Override public String toString() { return "CraftVillager"; } @Override public void remove() { getHandle().releaseAllPois(); super.remove(); } @Override public Profession getProfession() { return CraftProfession.minecraftToBukkit(getHandle().getVillagerData().getProfession()); } @Override public void setProfession(Profession profession) { Preconditions.checkArgument(profession != null, "Profession cannot be null"); getHandle().setVillagerData(getHandle().getVillagerData().setProfession(CraftProfession.bukkitToMinecraft(profession))); } @Override public Type getVillagerType() { return CraftType.minecraftToBukkit(getHandle().getVillagerData().getType()); } @Override public void setVillagerType(Type type) { Preconditions.checkArgument(type != null, "Type cannot be null"); getHandle().setVillagerData(getHandle().getVillagerData().setType(CraftType.bukkitToMinecraft(type))); } @Override public int getVillagerLevel() { return getHandle().getVillagerData().getLevel(); } @Override public void setVillagerLevel(int level) { Preconditions.checkArgument(1 <= level && level <= 5, "level (%s) must be between [1, 5]", level); getHandle().setVillagerData(getHandle().getVillagerData().setLevel(level)); } @Override public int getVillagerExperience() { return getHandle().getVillagerXp(); } @Override public void setVillagerExperience(int experience) { Preconditions.checkArgument(experience >= 0, "Experience (%s) must be positive", experience); getHandle().setVillagerXp(experience); } @Override public boolean sleep(Location location) { Preconditions.checkArgument(location != null, "Location cannot be null"); Preconditions.checkArgument(location.getWorld() != null, "Location needs to be in a world"); Preconditions.checkArgument(location.getWorld().equals(getWorld()), "Cannot sleep across worlds"); Preconditions.checkState(!getHandle().generation, "Cannot sleep during world generation"); BlockPosition position = CraftLocation.toBlockPosition(location); IBlockData iblockdata = getHandle().level().getBlockState(position); if (!(iblockdata.getBlock() instanceof BlockBed)) { return false; } getHandle().startSleeping(position); return true; } @Override public void wakeup() { Preconditions.checkState(isSleeping(), "Cannot wakeup if not sleeping"); Preconditions.checkState(!getHandle().generation, "Cannot wakeup during world generation"); getHandle().stopSleeping(); } @Override public void shakeHead() { getHandle().setUnhappy(); } @Override public ZombieVillager zombify() { EntityZombieVillager entityzombievillager = EntityZombie.zombifyVillager(getHandle().level().getMinecraftWorld(), getHandle(), getHandle().blockPosition(), isSilent(), CreatureSpawnEvent.SpawnReason.CUSTOM); return (entityzombievillager != null) ? (ZombieVillager) entityzombievillager.getBukkitEntity() : null; } public static class CraftType { public static Type minecraftToBukkit(VillagerType minecraft) { Preconditions.checkArgument(minecraft != null); IRegistry registry = CraftRegistry.getMinecraftRegistry(Registries.VILLAGER_TYPE); Type bukkit = Registry.VILLAGER_TYPE.get(CraftNamespacedKey.fromMinecraft(registry.getResourceKey(minecraft).orElseThrow().location())); Preconditions.checkArgument(bukkit != null); return bukkit; } public static VillagerType bukkitToMinecraft(Type bukkit) { Preconditions.checkArgument(bukkit != null); return CraftRegistry.getMinecraftRegistry(Registries.VILLAGER_TYPE) .getOptional(CraftNamespacedKey.toMinecraft(bukkit.getKey())).orElseThrow(); } } public static class CraftProfession { public static Profession minecraftToBukkit(VillagerProfession minecraft) { Preconditions.checkArgument(minecraft != null); IRegistry registry = CraftRegistry.getMinecraftRegistry(Registries.VILLAGER_PROFESSION); Profession bukkit = Registry.VILLAGER_PROFESSION.get(CraftNamespacedKey.fromMinecraft(registry.getResourceKey(minecraft).orElseThrow().location())); Preconditions.checkArgument(bukkit != null); return bukkit; } public static VillagerProfession bukkitToMinecraft(Profession bukkit) { Preconditions.checkArgument(bukkit != null); return CraftRegistry.getMinecraftRegistry(Registries.VILLAGER_PROFESSION) .getOptional(CraftNamespacedKey.toMinecraft(bukkit.getKey())).orElseThrow(); } } }