From ad546380a314d780a88152012ff7590b7a22f4b5 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Mon, 27 Jun 2016 20:01:34 -0400 Subject: [PATCH] Initial work on the Attractor alchemy array. Very WIP and is not quite where I like it. --- .../AlchemyArrayEffectAttractor.java | 491 ++++++++++++++++++ .../AlchemyCircleRenderer.java | 2 +- .../registry/AlchemyArrayRecipeRegistry.java | 22 +- .../AttractorAlchemyCircleRenderer.java | 137 +++++ .../BindingAlchemyCircleRenderer.java | 2 +- .../fakePlayer/FakeNetHandlerPlayServer.java | 179 +++++++ .../bloodmagic/fakePlayer/FakePlayerBM.java | 48 ++ .../bloodmagic/registry/ModRecipes.java | 5 +- .../bloodmagic/tile/TileAlchemyArray.java | 14 + .../bloodmagic/tile/TileInventory.java | 1 - .../models/AlchemyArrays/ZombieBeacon.png | Bin 0 -> 40967 bytes 11 files changed, 895 insertions(+), 6 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java create mode 100644 src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java create mode 100644 src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java create mode 100644 src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/ZombieBeacon.png diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java new file mode 100644 index 00000000..08043823 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java @@ -0,0 +1,491 @@ +package WayofTime.bloodmagic.alchemyArray; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.ai.EntityAIBase; +import net.minecraft.entity.ai.EntityAITasks; +import net.minecraft.entity.ai.EntityAITasks.EntityAITaskEntry; +import net.minecraft.entity.monster.EntityBlaze; +import net.minecraft.entity.monster.EntityEnderman; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.monster.EntityPigZombie; +import net.minecraft.entity.monster.EntitySilverfish; +import net.minecraft.entity.monster.EntitySlime; +import net.minecraft.entity.monster.EntitySpider; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.pathfinding.Path; +import net.minecraft.pathfinding.PathFinder; +import net.minecraft.pathfinding.WalkNodeProcessor; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.common.util.FakePlayer; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.fakePlayer.FakePlayerBM; +import WayofTime.bloodmagic.tile.TileAlchemyArray; + +import com.mojang.authlib.GameProfile; + +/** + * Credits for the initial code go to Crazy Pants of EIO. + */ +public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect +{ + private FakePlayer target; + private Set tracking = new HashSet(); + + private int counter = 0; + private int maxMobsAttracted = 10000; + + private int cooldown = 50; + + public AlchemyArrayEffectAttractor(String key) + { + super(key); + } + + @Override + public boolean update(TileEntity tile, int ticksActive) + { + BlockPos pos = tile.getPos(); + counter++; + if (counter < 10) + { + Iterator itr = tracking.iterator(); + while (itr.hasNext()) + { + EntityLiving ent = itr.next(); + onEntityTick(pos, ent); + } + + return false; + } + + counter = 0; + + World world = tile.getWorld(); + + Set trackingThisTick = new HashSet(); + List entsInBounds = world.getEntitiesWithinAABB(EntityLiving.class, getBounds(pos)); + + for (EntityLiving ent : entsInBounds) + { + if (!ent.isDead)// && isMobInFilter(ent)) + { + double x = (pos.getX() + 0.5D - ent.posX); + double y = (pos.getY() + 1D - ent.posY); + double z = (pos.getZ() + 0.5D - ent.posZ); + double distance = Math.sqrt(x * x + y * y + z * z); + + if (distance < 2 && tracking.contains(ent)) + { + setEntityCooldown(pos, ent, cooldown); + removeAssignedAITask(pos, ent); + continue; + } + + if (!canEntityBeTracked(pos, ent)) + { +// System.out.println("Cooldown: " + getEntityCooldown(pos, ent)); + decrementEntityCooldown(pos, ent); + continue; + } + + if (tracking.contains(ent)) + { + trackingThisTick.add(ent); + onEntityTick(pos, ent); + } else if (tracking.size() < maxMobsAttracted && trackMob(pos, ent)) + { + trackingThisTick.add(ent); + onTracked(ent); + } + } + } + + for (EntityLiving e : tracking) + { + if (!trackingThisTick.contains(e)) + { + onUntracked(e); + } + } + tracking.clear(); + tracking = trackingThisTick; + + return false; + } + + public boolean canEntityBeTracked(BlockPos pos, EntityLiving entity) + { + return getEntityCooldown(pos, entity) <= 0; + } + + private String getPosKey(BlockPos pos) + { + return "BMAttractor:" + pos; + } + + public int getEntityCooldown(BlockPos pos, EntityLiving entity) + { + return entity.getEntityData().getInteger(getPosKey(pos)); + } + + public void setEntityCooldown(BlockPos pos, EntityLiving entity, int cooldown) + { + entity.getEntityData().setInteger(getPosKey(pos), cooldown); + } + + public void decrementEntityCooldown(BlockPos pos, EntityLiving entity) + { + int cooldown = getEntityCooldown(pos, entity); + if (cooldown > 0) + { + setEntityCooldown(pos, entity, cooldown - 1); + } + } + + public AxisAlignedBB getBounds(BlockPos pos) + { + return new AxisAlignedBB(pos).expand(getRange(), getRange(), getRange()); + } + + public float getRange() + { + return 10; + } + + private void onUntracked(EntityLiving e) + { + if (e instanceof EntityEnderman) + { + e.getEntityData().setBoolean("BM:tracked", false); + } + } + + private void onTracked(EntityLiving e) + { + if (e instanceof EntityEnderman) + { + e.getEntityData().setBoolean("BM:tracked", true); + } + } + + private void onEntityTick(BlockPos pos, EntityLiving ent) + { + if (ent instanceof EntitySlime) + { + ent.faceEntity(getTarget(ent.worldObj, pos), 10.0F, 20.0F); + } else if (ent instanceof EntitySilverfish) + { + if (counter < 10) + { + return; + } + EntitySilverfish sf = (EntitySilverfish) ent; + Path pathentity = getPathEntityToEntity(ent, getTarget(ent.worldObj, pos), getRange()); + sf.getNavigator().setPath(pathentity, sf.getAIMoveSpeed()); + } else if (ent instanceof EntityBlaze) + { + double x = (pos.getX() + 0.5D - ent.posX); + double y = (pos.getY() + 1D - ent.posY); + double z = (pos.getZ() + 0.5D - ent.posZ); + double distance = Math.sqrt(x * x + y * y + z * z); + if (distance > 1.25) + { + double speed = 0.01; + ent.motionX += x / distance * speed; + if (y > 0) + { + ent.motionY += (0.3 - ent.motionY) * 0.3; + } + ent.motionZ += z / distance * speed; + } + } else if (ent instanceof EntityPigZombie || ent instanceof EntitySpider) + { + forceMove(pos, ent); +// ent.setAttackTarget(target); + } else if (ent instanceof EntityEnderman) + { + ((EntityEnderman) ent).setAttackTarget(getTarget(ent.worldObj, pos)); + } + } + + private void forceMove(BlockPos pos, EntityLiving ent) + { + double x = (pos.getX() + 0.5D - ent.posX); + double y = (pos.getY() + 1D - ent.posY); + double z = (pos.getZ() + 0.5D - ent.posZ); + double distance = Math.sqrt(x * x + y * y + z * z); + if (distance > 2) + { + EntityMob mod = (EntityMob) ent; + mod.faceEntity(getTarget(ent.worldObj, pos), 180, 0); + mod.moveEntityWithHeading(0, 0.3f); + if (mod.posY < pos.getY()) + { + mod.setJumping(true); + } else + { + mod.setJumping(false); + } + } + } + + public Path getPathEntityToEntity(Entity entity, Entity targetEntity, float range) + { + int targX = MathHelper.floor_double(targetEntity.posX); + int targY = MathHelper.floor_double(targetEntity.posY + 1.0D); + int targZ = MathHelper.floor_double(targetEntity.posZ); + + PathFinder pf = new PathFinder(new WalkNodeProcessor()); + return pf.findPath(targetEntity.worldObj, (EntityLiving) entity, new BlockPos(targX, targY, targZ), range); + } + + private boolean trackMob(BlockPos pos, EntityLiving ent) + { + //TODO: Figure out if this crud is needed + if (useSetTarget(ent)) + { + ((EntityMob) ent).setAttackTarget(getTarget(ent.worldObj, pos)); + return true; + } else if (useSpecialCase(ent)) + { + return applySpecialCase(pos, ent); + } else + { + return attractUsingAITask(pos, ent); + } + } + + private boolean useSetTarget(EntityLiving ent) + { + return ent instanceof EntityPigZombie || ent instanceof EntitySpider || ent instanceof EntitySilverfish; + } + + public void removeAssignedAITask(BlockPos pos, EntityLiving ent) + { + Set entries = ent.tasks.taskEntries; + EntityAIBase remove = null; + for (EntityAITaskEntry entry : entries) + { + if (entry.action instanceof AttractTask) + { + AttractTask at = (AttractTask) entry.action; + if (at.coord.equals(pos)) + { + remove = entry.action; + } else + { + continue; + } + } + } + if (remove != null) + { + ent.tasks.removeTask(remove); + } + } + + private boolean attractUsingAITask(BlockPos pos, EntityLiving ent) + { + tracking.add(ent); + Set entries = ent.tasks.taskEntries; + // boolean hasTask = false; + EntityAIBase remove = null; + // boolean isTracked; + for (EntityAITaskEntry entry : entries) + { + if (entry.action instanceof AttractTask) + { + AttractTask at = (AttractTask) entry.action; + if (at.coord.equals(pos) || !at.continueExecuting()) + { + remove = entry.action; + } else + { + return false; + } + } + } + if (remove != null) + { + ent.tasks.removeTask(remove); + } + + cancelCurrentTasks(ent); + ent.tasks.addTask(0, new AttractTask(ent, getTarget(ent.worldObj, pos), pos)); + + return true; + } + + private void cancelCurrentTasks(EntityLiving ent) + { + Iterator iterator = ent.tasks.taskEntries.iterator(); + + List currentTasks = new ArrayList(); + while (iterator.hasNext()) + { + EntityAITaskEntry entityaitaskentry = iterator.next(); + if (entityaitaskentry != null) + { + if (entityaitaskentry.action instanceof AttractTask) + { + continue; + } + + currentTasks.add(entityaitaskentry); + } + } + // Only available way to stop current execution is to remove all current + // tasks, then re-add them + for (EntityAITaskEntry task : currentTasks) + { + ent.tasks.removeTask(task.action); + ent.tasks.addTask(task.priority, task.action); + } + } + + private boolean applySpecialCase(BlockPos pos, EntityLiving ent) + { + if (ent instanceof EntitySlime) + { + ent.faceEntity(getTarget(ent.worldObj, pos), 10.0F, 20.0F); +// ent.setAttackTarget(getTarget(ent.worldObj, pos)); + return true; + } else if (ent instanceof EntitySilverfish) + { + EntitySilverfish es = (EntitySilverfish) ent; + Path pathentity = getPathEntityToEntity(ent, getTarget(ent.worldObj, pos), getRange()); + es.getNavigator().setPath(pathentity, es.getAIMoveSpeed()); + return true; + } else if (ent instanceof EntityBlaze) + { + return true; + } + return false; + } + + private boolean useSpecialCase(EntityLiving ent) + { + return ent instanceof EntitySlime || ent instanceof EntitySilverfish || ent instanceof EntityBlaze; + } + + public FakePlayer getTarget(World world, BlockPos pos) + { + if (target == null) + { +// System.out.println("...Hi? " + pos); + target = new Target(world, pos); + } + + return target; + } + + private class Target extends FakePlayerBM + { + public Target(World world, BlockPos pos) + { + super(world, pos, new GameProfile(null, Constants.Mod.MODID + "ArrayAttractor" + ":" + pos)); + posY += 1; + } + } + + private static class AttractTask extends EntityAIBase + { + private EntityLiving mob; + private BlockPos coord; + private FakePlayer target; + private int updatesSincePathing; + + private boolean started = false; + + private AttractTask(EntityLiving mob, FakePlayer target, BlockPos coord) + { + this.mob = mob; + this.coord = coord; + this.target = target; + } + + @Override + public boolean shouldExecute() + { + return continueExecuting(); + } + + @Override + public void resetTask() + { + started = false; + updatesSincePathing = 0; + } + + @Override + public boolean continueExecuting() + { + boolean res = false; + //TODO: + TileEntity te = mob.worldObj.getTileEntity(coord); + if (te instanceof TileAlchemyArray) + { + res = true; + } + + return res; + } + + @Override + public boolean isInterruptible() + { + return true; + } + + @Override + public void updateTask() + { + if (!started || updatesSincePathing > 20) + { + started = true; + int speed = 1; + // mob.getNavigator().setAvoidsWater(false); + boolean res = mob.getNavigator().tryMoveToEntityLiving(target, speed); + if (!res) + { + mob.getNavigator().tryMoveToXYZ(target.posX, target.posY + 1, target.posZ, speed); + } + updatesSincePathing = 0; + } else + { + updatesSincePathing++; + } + } + + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + + } + + @Override + public AlchemyArrayEffect getNewCopy() + { + return new AlchemyArrayEffectAttractor(key); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java index c560c396..fb2598a6 100644 --- a/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/api/alchemyCrafting/AlchemyCircleRenderer.java @@ -133,7 +133,7 @@ public class AlchemyCircleRenderer double var35 = 0; double var37 = 1; - GlStateManager.color(0.5f, 1f, 1f, 1f); + GlStateManager.color(1f, 1f, 1f, 1f); wr.begin(7, DefaultVertexFormats.POSITION_TEX); // wr.setBrightness(200); wr.pos(size / 2f, size / 2f, 0.0D).tex(var33, var37).endVertex(); diff --git a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java index 16e66737..1991e959 100644 --- a/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/api/registry/AlchemyArrayRecipeRegistry.java @@ -174,11 +174,29 @@ public class AlchemyArrayRecipeRegistry if (input.size() == 1 && arrayRecipe.getInput().size() == 1) { if (ItemStackWrapper.getHolder(arrayRecipe.getInput().get(0)).equals(ItemStackWrapper.getHolder(input.get(0)))) - return arrayRecipe.getAlchemyArrayEffectForCatalyst(catalystStack); // TODO: Decide if a copy should be returned. + { + AlchemyArrayEffect effect = arrayRecipe.getAlchemyArrayEffectForCatalyst(catalystStack); + if (effect != null) + { + return effect.getNewCopy(); + } else + { + return null; + } + } } else { if (input.equals(arrayRecipe.getInput())) - return arrayRecipe.getAlchemyArrayEffectForCatalyst(catalystStack); + { + AlchemyArrayEffect effect = arrayRecipe.getAlchemyArrayEffectForCatalyst(catalystStack); + if (effect != null) + { + return effect.getNewCopy(); + } else + { + return null; + } + } } } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java new file mode 100644 index 00000000..7869f389 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java @@ -0,0 +1,137 @@ +package WayofTime.bloodmagic.client.render.alchemyArray; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.VertexBuffer; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; + +public class AttractorAlchemyCircleRenderer extends AlchemyCircleRenderer +{ + public AttractorAlchemyCircleRenderer() + { + super(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/ZombieBeacon.png")); + } + + @Override + public float getSizeModifier(float craftTime) + { + return 1; + } + + @Override + public float getRotation(float craftTime) + { + float offset = 2; + if (craftTime >= offset) + { + float modifier = (craftTime - offset) * 5f; + return modifier * 1f; + } + return 0; + } + + @Override + public float getSecondaryRotation(float craftTime) + { + float offset = 50; + float secondaryOffset = 150; + if (craftTime >= offset) + { + if (craftTime < secondaryOffset) + { + float modifier = 90 * (craftTime - offset) / (float) (secondaryOffset - offset); + return modifier; + } else + { + return 90; + } + } + return 0; + } + + @Override + public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) + { + Tessellator tessellator = Tessellator.getInstance(); + VertexBuffer wr = tessellator.getBuffer(); + + GlStateManager.pushMatrix(); + + float rot = getRotation(craftTime); + float secondaryRot = getSecondaryRotation(craftTime); + + float size = 1.0F * getSizeModifier(craftTime); + + // Bind the texture to the circle + Minecraft.getMinecraft().renderEngine.bindTexture(arrayResource); + + GlStateManager.disableCull(); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(770, 1); + + GlStateManager.translate(x, y, z); + + // Specify which face this "circle" is located on + EnumFacing sideHit = EnumFacing.UP; + + GlStateManager.translate(sideHit.getFrontOffsetX() * offsetFromFace, sideHit.getFrontOffsetY() * offsetFromFace, sideHit.getFrontOffsetZ() * offsetFromFace); + + switch (sideHit) + { + case DOWN: + GlStateManager.translate(0, 0, 1); + GlStateManager.rotate(-90.0f, 1, 0, 0); + break; + case EAST: + GlStateManager.rotate(-90.0f, 0, 1, 0); + GlStateManager.translate(0, 0, -1); + break; + case NORTH: + break; + case SOUTH: + GlStateManager.rotate(180.0f, 0, 1, 0); + GlStateManager.translate(-1, 0, -1); + break; + case UP: + GlStateManager.translate(0, 1, 0); + GlStateManager.rotate(90.0f, 1, 0, 0); + break; + case WEST: + GlStateManager.translate(0, 0, 1); + GlStateManager.rotate(90.0f, 0, 1, 0); + break; + } + + GlStateManager.pushMatrix(); + GlStateManager.translate(0.5f, 0.5f, getVerticalOffset(craftTime)); + GlStateManager.rotate(rot, 0, 0, 1); + GlStateManager.rotate(secondaryRot, 1, 0, 0); + double var31 = 0.0D; + double var33 = 1.0D; + double var35 = 0; + double var37 = 1; + + GlStateManager.color(1f, 1f, 1f, 1f); + wr.begin(7, DefaultVertexFormats.POSITION_TEX); + // wr.setBrightness(200); + wr.pos(size / 2f, size / 2f, 0.0D).tex(var33, var37).endVertex(); + wr.pos(size / 2f, -size / 2f, 0.0D).tex(var33, var35).endVertex(); + wr.pos(-size / 2f, -size / 2f, 0.0D).tex(var31, var35).endVertex(); + wr.pos(-size / 2f, size / 2f, 0.0D).tex(var31, var37).endVertex(); + tessellator.draw(); + + GlStateManager.popMatrix(); + + // GlStateManager.depthMask(true); + GlStateManager.disableBlend(); + GlStateManager.enableCull(); + // GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + GlStateManager.popMatrix(); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java index 72a3a47e..780b01e1 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java @@ -1,6 +1,5 @@ package WayofTime.bloodmagic.client.render.alchemyArray; -import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; @@ -9,6 +8,7 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer; public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer { diff --git a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java new file mode 100644 index 00000000..7486c89b --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java @@ -0,0 +1,179 @@ +package WayofTime.bloodmagic.fakePlayer; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.EnumPacketDirection; +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.client.CPacketAnimation; +import net.minecraft.network.play.client.CPacketChatMessage; +import net.minecraft.network.play.client.CPacketClickWindow; +import net.minecraft.network.play.client.CPacketClientSettings; +import net.minecraft.network.play.client.CPacketClientStatus; +import net.minecraft.network.play.client.CPacketCloseWindow; +import net.minecraft.network.play.client.CPacketConfirmTransaction; +import net.minecraft.network.play.client.CPacketCreativeInventoryAction; +import net.minecraft.network.play.client.CPacketEnchantItem; +import net.minecraft.network.play.client.CPacketEntityAction; +import net.minecraft.network.play.client.CPacketHeldItemChange; +import net.minecraft.network.play.client.CPacketInput; +import net.minecraft.network.play.client.CPacketKeepAlive; +import net.minecraft.network.play.client.CPacketPlayer; +import net.minecraft.network.play.client.CPacketPlayerAbilities; +import net.minecraft.network.play.client.CPacketPlayerDigging; +import net.minecraft.network.play.client.CPacketPlayerTryUseItem; +import net.minecraft.network.play.client.CPacketResourcePackStatus; +import net.minecraft.network.play.client.CPacketSpectate; +import net.minecraft.network.play.client.CPacketTabComplete; +import net.minecraft.network.play.client.CPacketUpdateSign; +import net.minecraft.network.play.client.CPacketUseEntity; +import net.minecraft.util.text.ITextComponent; +import net.minecraftforge.fml.common.FMLCommonHandler; + +/** + * All credits for this go to CrazyPants, from EIO + */ +public class FakeNetHandlerPlayServer extends NetHandlerPlayServer +{ + public FakeNetHandlerPlayServer(EntityPlayerMP p_i1530_3_) + { + super(FMLCommonHandler.instance().getMinecraftServerInstance(), new net.minecraft.network.NetworkManager(EnumPacketDirection.CLIENTBOUND), p_i1530_3_); + } + + @Override + public NetworkManager getNetworkManager() + { + return null; + } + + @Override + public void kickPlayerFromServer(String p_147360_1_) + { + } + + @Override + public void processInput(CPacketInput p_147358_1_) + { + } + + @Override + public void processPlayer(CPacketPlayer p_147347_1_) + { + } + + @Override + public void setPlayerLocation(double p_147364_1_, double p_147364_3_, double p_147364_5_, float p_147364_7_, float p_147364_8_) + { + } + + @Override + public void processPlayerDigging(CPacketPlayerDigging p_147345_1_) + { + } + + @Override + public void processPlayerBlockPlacement(CPacketPlayerTryUseItem packetIn) + { + } + + @Override + public void onDisconnect(ITextComponent p_147231_1_) + { + } + + @Override + public void sendPacket(Packet p_147359_1_) + { + } + + @Override + public void processHeldItemChange(CPacketHeldItemChange p_147355_1_) + { + } + + @Override + public void processChatMessage(CPacketChatMessage p_147354_1_) + { + } + + @Override + public void handleAnimation(CPacketAnimation packetIn) + { + + } + + @Override + public void processEntityAction(CPacketEntityAction p_147357_1_) + { + } + + @Override + public void processUseEntity(CPacketUseEntity p_147340_1_) + { + } + + @Override + public void processClientStatus(CPacketClientStatus p_147342_1_) + { + } + + @Override + public void processCloseWindow(CPacketCloseWindow p_147356_1_) + { + } + + @Override + public void processClickWindow(CPacketClickWindow p_147351_1_) + { + } + + @Override + public void processEnchantItem(CPacketEnchantItem p_147338_1_) + { + } + + @Override + public void processCreativeInventoryAction(CPacketCreativeInventoryAction p_147344_1_) + { + } + + @Override + public void processConfirmTransaction(CPacketConfirmTransaction p_147339_1_) + { + } + + @Override + public void processUpdateSign(CPacketUpdateSign p_147343_1_) + { + } + + @Override + public void processKeepAlive(CPacketKeepAlive p_147353_1_) + { + } + + @Override + public void processPlayerAbilities(CPacketPlayerAbilities p_147348_1_) + { + } + + @Override + public void processTabComplete(CPacketTabComplete p_147341_1_) + { + } + + @Override + public void processClientSettings(CPacketClientSettings p_147352_1_) + { + } + + @Override + public void handleSpectate(CPacketSpectate packetIn) + { + } + + @Override + public void handleResourcePackStatus(CPacketResourcePackStatus packetIn) + { + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java new file mode 100644 index 00000000..18e2c0d4 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java @@ -0,0 +1,48 @@ +package WayofTime.bloodmagic.fakePlayer; + +import javax.annotation.Nullable; + +import net.minecraft.item.ItemStack; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.fml.common.FMLCommonHandler; + +import com.mojang.authlib.GameProfile; + +/** + * All credits for this go to CrazyPants, from EIO + */ +public class FakePlayerBM extends FakePlayer +{ + ItemStack prevWeapon; + + public FakePlayerBM(World world, BlockPos pos, GameProfile profile) + { + super(FMLCommonHandler.instance().getMinecraftServerInstance().worldServerForDimension(world.provider.getDimension()), profile); + posX = pos.getX() + 0.5; + posY = pos.getY() + 0.5; + posZ = pos.getZ() + 0.5; + connection = new FakeNetHandlerPlayServer(this); + } + + @Override + protected void onNewPotionEffect(PotionEffect p_70670_1_) + { + } + + @Override + protected void onChangedPotionEffect(PotionEffect effect, boolean p_70695_2_) + { + } + + @Override + protected void onFinishedPotionEffect(PotionEffect effect) + { + } + + protected void playEquipSound(@Nullable ItemStack stack) + { + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 680623c3..5c6b2ecc 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -3,7 +3,6 @@ package WayofTime.bloodmagic.registry; import java.util.ArrayList; import java.util.List; -import WayofTime.bloodmagic.util.Utils; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -16,6 +15,7 @@ import net.minecraftforge.oredict.RecipeSorter; import net.minecraftforge.oredict.ShapedOreRecipe; import net.minecraftforge.oredict.ShapelessOreRecipe; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectAttractor; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectBinding; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.altar.EnumAltarTier; @@ -30,6 +30,7 @@ import WayofTime.bloodmagic.api.registry.OrbRegistry; import WayofTime.bloodmagic.api.registry.TartaricForgeRecipeRegistry; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.block.BlockBloodRune; +import WayofTime.bloodmagic.client.render.alchemyArray.AttractorAlchemyCircleRenderer; import WayofTime.bloodmagic.client.render.alchemyArray.BindingAlchemyCircleRenderer; import WayofTime.bloodmagic.compress.AdvancedCompressionHandler; import WayofTime.bloodmagic.compress.BaseCompressionHandler; @@ -40,6 +41,7 @@ import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.item.alchemy.ItemLivingArmourPointsUpgrade; import WayofTime.bloodmagic.item.soul.ItemSoulGem; import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableDyeableRecipe; +import WayofTime.bloodmagic.util.Utils; import com.google.common.base.Stopwatch; @@ -224,6 +226,7 @@ public class ModRecipes AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TELEPOSITION), new ItemStack(ModItems.slate, 1, 3), new ItemStack(ModItems.sigilTeleposition), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); AlchemyArrayRecipeRegistry.registerCraftingRecipe(ItemComponent.getStack(ItemComponent.REAGENT_TRANSPOSITION), new ItemStack(ModItems.slate, 1, 3), new ItemStack(ModItems.sigilTransposition), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WIPArray.png")); + AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.ROTTEN_FLESH), new ItemStack(Items.ROTTEN_FLESH), new AlchemyArrayEffectAttractor("attractor"), new AttractorAlchemyCircleRenderer()); } public static void addCompressionHandlers() diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index 061600e3..4f99ade0 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic.tile; +import net.minecraft.inventory.InventoryHelper; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SPacketUpdateTileEntity; @@ -75,6 +76,19 @@ public class TileAlchemyArray extends TileInventory implements ITickable } } + /** + * This occurs when the block is destroyed. + */ + @Override + public void dropItems() + { + super.dropItems(); + if (arrayEffect != null) + { + + } + } + public boolean attemptCraft() { AlchemyArrayEffect effect = AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(this.getStackInSlot(0), this.getStackInSlot(1)); diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java index 352e1c5e..0fa97dba 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java @@ -9,7 +9,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.NetworkManager; -import net.minecraft.network.Packet; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; diff --git a/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/ZombieBeacon.png b/src/main/resources/assets/bloodmagic/textures/models/AlchemyArrays/ZombieBeacon.png new file mode 100644 index 0000000000000000000000000000000000000000..52f57df6a593653e452ad45a0ccad43050209e6f GIT binary patch literal 40967 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 C_Xb!1 literal 0 HcmV?d00001