From 090fbb06c759dadc1ca419d42bea084f868b47bf Mon Sep 17 00:00:00 2001 From: Sotr Date: Sat, 9 Jun 2018 02:51:40 +0800 Subject: [PATCH] Configurable spawner modify --- .../server/core/AkarinGlobalConfig.java | 5 + .../net/minecraft/server/ItemMonsterEgg.java | 250 ++++++++++++++++++ 2 files changed, 255 insertions(+) create mode 100644 sources/src/main/java/net/minecraft/server/ItemMonsterEgg.java diff --git a/sources/src/main/java/io/akarin/server/core/AkarinGlobalConfig.java b/sources/src/main/java/io/akarin/server/core/AkarinGlobalConfig.java index bb7536902..8397ab3ae 100644 --- a/sources/src/main/java/io/akarin/server/core/AkarinGlobalConfig.java +++ b/sources/src/main/java/io/akarin/server/core/AkarinGlobalConfig.java @@ -187,4 +187,9 @@ public class AkarinGlobalConfig { private static void keepAliveTimeout() { keepAliveTimeout = getSeconds(getString("core.keep-alive-response-timeout", "30s")); } + + public static boolean allowSpawnerModify; + private static void allowSpawnerModify() { + allowSpawnerModify = getBoolean("alternative.allow-spawner-modify", true); + } } diff --git a/sources/src/main/java/net/minecraft/server/ItemMonsterEgg.java b/sources/src/main/java/net/minecraft/server/ItemMonsterEgg.java new file mode 100644 index 000000000..254495385 --- /dev/null +++ b/sources/src/main/java/net/minecraft/server/ItemMonsterEgg.java @@ -0,0 +1,250 @@ +package net.minecraft.server; + +import java.util.Iterator; +import java.util.List; +import java.util.UUID; +import javax.annotation.Nullable; + +import io.akarin.server.core.AkarinGlobalConfig; + +public class ItemMonsterEgg extends Item { + + public ItemMonsterEgg() { + this.b(CreativeModeTab.f); + } + + @Override + public String b(ItemStack itemstack) { + String s = ("" + LocaleI18n.get(this.getName() + ".name")).trim(); + String s1 = EntityTypes.a(h(itemstack)); + + if (s1 != null) { + s = s + " " + LocaleI18n.get("entity." + s1 + ".name"); + } + + return s; + } + + @Override + public EnumInteractionResult a(EntityHuman entityhuman, World world, BlockPosition blockposition, EnumHand enumhand, EnumDirection enumdirection, float f, float f1, float f2) { + ItemStack itemstack = entityhuman.b(enumhand); + + if (world.isClientSide) { + return EnumInteractionResult.SUCCESS; + } else if (!entityhuman.a(blockposition.shift(enumdirection), enumdirection, itemstack)) { + return EnumInteractionResult.FAIL; + } else { + IBlockData iblockdata = world.getType(blockposition); + Block block = iblockdata.getBlock(); + + if (block == Blocks.MOB_SPAWNER && !AkarinGlobalConfig.allowSpawnerModify) { // Akarin + TileEntity tileentity = world.getTileEntity(blockposition); + + if (tileentity instanceof TileEntityMobSpawner) { + MobSpawnerAbstract mobspawnerabstract = ((TileEntityMobSpawner) tileentity).getSpawner(); + + mobspawnerabstract.setMobName(h(itemstack)); + tileentity.update(); + world.notify(blockposition, iblockdata, iblockdata, 3); + if (!entityhuman.abilities.canInstantlyBuild) { + itemstack.subtract(1); + } + + return EnumInteractionResult.SUCCESS; + } + } + + BlockPosition blockposition1 = blockposition.shift(enumdirection); + double d0 = this.a(world, blockposition1); + Entity entity = a(world, h(itemstack), blockposition1.getX() + 0.5D, blockposition1.getY() + d0, blockposition1.getZ() + 0.5D); + + if (entity != null) { + if (entity instanceof EntityLiving && itemstack.hasName()) { + entity.setCustomName(itemstack.getName()); + } + + a(world, entityhuman, itemstack, entity); + if (!entityhuman.abilities.canInstantlyBuild) { + itemstack.subtract(1); + } + } + + return EnumInteractionResult.SUCCESS; + } + } + + protected double a(World world, BlockPosition blockposition) { + AxisAlignedBB axisalignedbb = (new AxisAlignedBB(blockposition)).b(0.0D, -1.0D, 0.0D); + List list = world.getCubes((Entity) null, axisalignedbb); + + if (list.isEmpty()) { + return 0.0D; + } else { + double d0 = axisalignedbb.b; + + AxisAlignedBB axisalignedbb1; + + for (Iterator iterator = list.iterator(); iterator.hasNext(); d0 = Math.max(axisalignedbb1.e, d0)) { + axisalignedbb1 = (AxisAlignedBB) iterator.next(); + } + + return d0 - blockposition.getY(); + } + } + + public static void a(World world, @Nullable EntityHuman entityhuman, ItemStack itemstack, @Nullable Entity entity) { + MinecraftServer minecraftserver = world.getMinecraftServer(); + + if (minecraftserver != null && entity != null) { + NBTTagCompound nbttagcompound = itemstack.getTag(); + + if (nbttagcompound != null && nbttagcompound.hasKeyOfType("EntityTag", 10)) { + if (!world.isClientSide && entity.bC() && (entityhuman == null || !minecraftserver.getPlayerList().isOp(entityhuman.getProfile()))) { + return; + } + + NBTTagCompound nbttagcompound1 = entity.save(new NBTTagCompound()); + UUID uuid = entity.getUniqueID(); + + // Paper start - Filter out position and motion information + final NBTTagCompound entityTag = nbttagcompound.getCompound("EntityTag"); + if (world.paperConfig.filterNBTFromSpawnEgg) { + entityTag.remove("Pos"); + entityTag.remove("Motion"); + } + nbttagcompound1.a(entityTag); + // Paper end + entity.a(uuid); + entity.f(nbttagcompound1); + } + + } + } + + @Override + public InteractionResultWrapper a(World world, EntityHuman entityhuman, EnumHand enumhand) { + ItemStack itemstack = entityhuman.b(enumhand); + + if (world.isClientSide) { + return new InteractionResultWrapper(EnumInteractionResult.PASS, itemstack); + } else { + MovingObjectPosition movingobjectposition = this.a(world, entityhuman, true); + + if (movingobjectposition != null && movingobjectposition.type == MovingObjectPosition.EnumMovingObjectType.BLOCK) { + BlockPosition blockposition = movingobjectposition.a(); + + if (!(world.getType(blockposition).getBlock() instanceof BlockFluids)) { + return new InteractionResultWrapper(EnumInteractionResult.PASS, itemstack); + } else if (world.a(entityhuman, blockposition) && entityhuman.a(blockposition, movingobjectposition.direction, itemstack)) { + Entity entity = a(world, h(itemstack), blockposition.getX() + 0.5D, blockposition.getY() + 0.5D, blockposition.getZ() + 0.5D); + + if (entity == null) { + return new InteractionResultWrapper(EnumInteractionResult.PASS, itemstack); + } else { + if (entity instanceof EntityLiving && itemstack.hasName()) { + entity.setCustomName(itemstack.getName()); + } + + a(world, entityhuman, itemstack, entity); + if (!entityhuman.abilities.canInstantlyBuild) { + itemstack.subtract(1); + } + + entityhuman.b(StatisticList.b(this)); + return new InteractionResultWrapper(EnumInteractionResult.SUCCESS, itemstack); + } + } else { + return new InteractionResultWrapper(EnumInteractionResult.FAIL, itemstack); + } + } else { + return new InteractionResultWrapper(EnumInteractionResult.PASS, itemstack); + } + } + } + + @Nullable + public static Entity a(World world, @Nullable MinecraftKey minecraftkey, double d0, double d1, double d2) { + return spawnCreature(world, minecraftkey, d0, d1, d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); + } + + @Nullable + public static Entity spawnCreature(World world, @Nullable MinecraftKey minecraftkey, double d0, double d1, double d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { + if (minecraftkey != null && EntityTypes.eggInfo.containsKey(minecraftkey)) { + Entity entity = null; + + for (int i = 0; i < 1; ++i) { + entity = EntityTypes.a(minecraftkey, world); + if (entity instanceof EntityInsentient) { + EntityInsentient entityinsentient = (EntityInsentient) entity; + + entity.setPositionRotation(d0, d1, d2, MathHelper.g(world.random.nextFloat() * 360.0F), 0.0F); + entityinsentient.aP = entityinsentient.yaw; + entityinsentient.aN = entityinsentient.yaw; + entityinsentient.prepare(world.D(new BlockPosition(entityinsentient)), (GroupDataEntity) null); + // CraftBukkit start - don't return an entity when CreatureSpawnEvent is canceled + if (!world.addEntity(entity, spawnReason)) { + entity = null; + } else { + entityinsentient.D(); + } + // CraftBukkit end + } + } + + return entity; + } else { + return null; + } + } + + @Override + public void a(CreativeModeTab creativemodetab, NonNullList nonnulllist) { + if (this.a(creativemodetab)) { + Iterator iterator = EntityTypes.eggInfo.values().iterator(); + + while (iterator.hasNext()) { + EntityTypes.MonsterEggInfo entitytypes_monsteregginfo = (EntityTypes.MonsterEggInfo) iterator.next(); + ItemStack itemstack = new ItemStack(this, 1); + + a(itemstack, entitytypes_monsteregginfo.a); + nonnulllist.add(itemstack); + } + } + + } + + public static void a(ItemStack itemstack, MinecraftKey minecraftkey) { + NBTTagCompound nbttagcompound = itemstack.hasTag() ? itemstack.getTag() : new NBTTagCompound(); + NBTTagCompound nbttagcompound1 = new NBTTagCompound(); + + nbttagcompound1.setString("id", minecraftkey.toString()); + nbttagcompound.set("EntityTag", nbttagcompound1); + itemstack.setTag(nbttagcompound); + } + + @Nullable + public static MinecraftKey h(ItemStack itemstack) { + NBTTagCompound nbttagcompound = itemstack.getTag(); + + if (nbttagcompound == null) { + return null; + } else if (!nbttagcompound.hasKeyOfType("EntityTag", 10)) { + return null; + } else { + NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("EntityTag"); + + if (!nbttagcompound1.hasKeyOfType("id", 8)) { + return null; + } else { + String s = nbttagcompound1.getString("id"); + MinecraftKey minecraftkey = new MinecraftKey(s); + + if (!s.contains(":")) { + nbttagcompound1.setString("id", minecraftkey.toString()); + } + + return minecraftkey; + } + } + } +}