diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinItemMonsterEgg.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinItemMonsterEgg.java deleted file mode 100644 index 23c182188..000000000 --- a/sources/src/main/java/io/akarin/server/mixin/core/MixinItemMonsterEgg.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.akarin.server.mixin.core; - -import org.spongepowered.asm.lib.Opcodes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import io.akarin.server.core.AkarinGlobalConfig; -import net.minecraft.server.Block; -import net.minecraft.server.Blocks; -import net.minecraft.server.ItemMonsterEgg; - -@Mixin(value = ItemMonsterEgg.class, remap = false) -public abstract class MixinItemMonsterEgg { - @Redirect(method = "a*", at = @At( - value = "FIELD", - target = "net/minecraft/server/Blocks.MOB_SPAWNER:Lnet/minecraft/server/Block;", - opcode = Opcodes.GETSTATIC - )) - private boolean configurable(Block target) { - return target == Blocks.MOB_SPAWNER && AkarinGlobalConfig.allowSpawnerModify; - } -} 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..87efc1ef7 --- /dev/null +++ b/sources/src/main/java/net/minecraft/server/ItemMonsterEgg.java @@ -0,0 +1,243 @@ +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; + +/** + * Akarin Changes Note + * 1) Restricted spawner modify (feature) + */ +public class ItemMonsterEgg extends Item { + + public ItemMonsterEgg() { + this.b(CreativeModeTab.f); + } + + 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; + } + + 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 && entityhuman.isCreativeAndOp()) { // 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), (double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + d0, (double) 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 - (double) 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(); + + nbttagcompound1.a(nbttagcompound.getCompound("EntityTag")); + entity.a(uuid); + entity.f(nbttagcompound1); + } + + } + } + + 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), (double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) 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((Item) 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; + } + } + + 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; + } + } + } +} diff --git a/sources/src/main/resources/mixins.akarin.core.json b/sources/src/main/resources/mixins.akarin.core.json index 371b8157a..9369eba12 100644 --- a/sources/src/main/resources/mixins.akarin.core.json +++ b/sources/src/main/resources/mixins.akarin.core.json @@ -26,7 +26,6 @@ "core.MixinAsyncCatcher", "core.MixinTimingHandler", "core.MixinVersionCommand", - "core.MixinItemMonsterEgg", "core.MixinMinecraftServer", "core.MixinChunkIOExecutor", "core.MixinPlayerConnectionUtils",