From ae1cde18dbd4544d50ad768f0fbfca571dccf288 Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Tue, 23 Apr 2024 17:31:46 +0200 Subject: [PATCH] feat: partial force torch implementation --- .../java/ley/modding/dartcraft/Config.java | 9 +- .../java/ley/modding/dartcraft/Dartcraft.java | 29 +- .../dartcraft/block/BlockForceTorch.java | 297 +++++++++++++++++ .../dartcraft/block/BlockPowerOre.java | 4 +- .../modding/dartcraft/block/DartBlocks.java | 2 + .../modding/dartcraft/client/fx/FXDisney.java | 6 +- .../modding/dartcraft/client/fx/FXTime.java | 176 ++++++++++ .../dartcraft/client/gui/GuiClipboard.java | 10 +- ...Renderer.java => RenderBlockPowerOre.java} | 7 +- .../renderer/block/RenderBlockTorch.java | 181 +++++++++++ .../entity/RenderEntityFrozenItem.java | 76 +++++ .../renderer/entity/RenderEntityTime.java | 17 + .../dartcraft/entity/EntityFrozenItem.java | 302 ++++++++++++++++++ .../modding/dartcraft/entity/EntityTime.java | 302 ++++++++++++++++++ .../item/AbstractItemBlockMetadata.java | 6 + .../modding/dartcraft/network/DartPacket.java | 74 ----- .../dartcraft/network/PacketClipButton.java | 21 +- .../modding/dartcraft/network/PacketFX.java | 91 ++++++ .../modding/dartcraft/proxy/ClientProxy.java | 36 ++- .../modding/dartcraft/proxy/CommonProxy.java | 3 - .../dartcraft/tile/TileEntityForceTorch.java | 276 ++++++++++++++++ .../ley/modding/dartcraft/util/FXUtils.java | 41 ++- .../modding/dartcraft/util/UpgradeHelper.java | 65 ++++ .../assets/dartcraft/lang/en_US.lang | 25 ++ .../dartcraft/textures/blocks/forcetorch0.png | Bin 0 -> 3071 bytes .../dartcraft/textures/blocks/forcetorch1.png | Bin 0 -> 3105 bytes .../textures/blocks/forcetorch10.png | Bin 0 -> 3091 bytes .../textures/blocks/forcetorch11.png | Bin 0 -> 3095 bytes .../textures/blocks/forcetorch12.png | Bin 0 -> 3076 bytes .../textures/blocks/forcetorch13.png | Bin 0 -> 3095 bytes .../textures/blocks/forcetorch14.png | Bin 0 -> 3096 bytes .../textures/blocks/forcetorch15.png | Bin 0 -> 3074 bytes .../dartcraft/textures/blocks/forcetorch2.png | Bin 0 -> 3104 bytes .../dartcraft/textures/blocks/forcetorch3.png | Bin 0 -> 3106 bytes .../dartcraft/textures/blocks/forcetorch4.png | Bin 0 -> 3088 bytes .../dartcraft/textures/blocks/forcetorch5.png | Bin 0 -> 3099 bytes .../dartcraft/textures/blocks/forcetorch6.png | Bin 0 -> 3095 bytes .../dartcraft/textures/blocks/forcetorch7.png | Bin 0 -> 3073 bytes .../dartcraft/textures/blocks/forcetorch8.png | Bin 0 -> 3079 bytes .../dartcraft/textures/blocks/forcetorch9.png | Bin 0 -> 3103 bytes 40 files changed, 1909 insertions(+), 147 deletions(-) create mode 100644 src/main/java/ley/modding/dartcraft/block/BlockForceTorch.java create mode 100644 src/main/java/ley/modding/dartcraft/client/fx/FXTime.java rename src/main/java/ley/modding/dartcraft/client/renderer/block/{PowerOreRenderer.java => RenderBlockPowerOre.java} (95%) create mode 100644 src/main/java/ley/modding/dartcraft/client/renderer/block/RenderBlockTorch.java create mode 100644 src/main/java/ley/modding/dartcraft/client/renderer/entity/RenderEntityFrozenItem.java create mode 100644 src/main/java/ley/modding/dartcraft/client/renderer/entity/RenderEntityTime.java create mode 100644 src/main/java/ley/modding/dartcraft/entity/EntityFrozenItem.java create mode 100644 src/main/java/ley/modding/dartcraft/entity/EntityTime.java delete mode 100644 src/main/java/ley/modding/dartcraft/network/DartPacket.java create mode 100644 src/main/java/ley/modding/dartcraft/network/PacketFX.java create mode 100644 src/main/java/ley/modding/dartcraft/tile/TileEntityForceTorch.java create mode 100644 src/main/java/ley/modding/dartcraft/util/UpgradeHelper.java create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch0.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch1.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch10.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch11.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch12.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch13.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch14.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch15.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch2.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch3.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch4.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch5.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch6.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch7.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch8.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/forcetorch9.png diff --git a/src/main/java/ley/modding/dartcraft/Config.java b/src/main/java/ley/modding/dartcraft/Config.java index 6ea3ab1..741d22e 100644 --- a/src/main/java/ley/modding/dartcraft/Config.java +++ b/src/main/java/ley/modding/dartcraft/Config.java @@ -12,7 +12,9 @@ public class Config { public static boolean easyWing; public static boolean timeUpgradeRod; public static boolean timeUpgradeSword; - public static boolean timeUpgradeTorch; + public static boolean timeUpgradeTorch = true; + public static boolean timeAffectBlocks = true; + public static boolean timeAffectTiles = true; public static boolean insaneImpervious; public static int speedLevel; @@ -21,8 +23,6 @@ public class Config { public static float gemValue = 0.25F; - public static int powerOreRenderID; - public static File engineFile; public static boolean disableRodSpeed; public static boolean disableRodHeal; @@ -35,6 +35,9 @@ public class Config { public static int powerOreRarity = 8; public static int powerOreSpawnHeight = 48; + public static int torchDist = 42; + public static int torchFreq = 42; + private static void generateDefaultEngineFile() { try { FileWriter e = new FileWriter(engineFile); diff --git a/src/main/java/ley/modding/dartcraft/Dartcraft.java b/src/main/java/ley/modding/dartcraft/Dartcraft.java index d5fa348..5874668 100644 --- a/src/main/java/ley/modding/dartcraft/Dartcraft.java +++ b/src/main/java/ley/modding/dartcraft/Dartcraft.java @@ -11,11 +11,18 @@ import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import ley.modding.dartcraft.block.DartBlocks; -import ley.modding.dartcraft.entity.*; +import ley.modding.dartcraft.entity.EntityBottle; +import ley.modding.dartcraft.entity.EntityColdChicken; +import ley.modding.dartcraft.entity.EntityColdCow; +import ley.modding.dartcraft.entity.EntityColdPig; +import ley.modding.dartcraft.entity.EntityFlyingFlask; +import ley.modding.dartcraft.entity.EntityFrozenItem; +import ley.modding.dartcraft.entity.EntityTime; import ley.modding.dartcraft.event.EventHandler; import ley.modding.dartcraft.internal.Registry; import ley.modding.dartcraft.item.DartItems; import ley.modding.dartcraft.network.PacketClipButton; +import ley.modding.dartcraft.network.PacketFX; import ley.modding.dartcraft.proxy.CommonProxy; import ley.modding.dartcraft.tab.DartcraftTab; import ley.modding.dartcraft.util.ForceEngineLiquids; @@ -48,9 +55,13 @@ public class Dartcraft { @Mod.EventHandler public void preInit(FMLPreInitializationEvent e) { MinecraftForge.EVENT_BUS.register(new EventHandler()); - channel = NetworkRegistry.INSTANCE.newSimpleChannel("Dartcraft"); + channel = NetworkRegistry.INSTANCE.newSimpleChannel("dartcraft"); + int desc = 0; channel.registerMessage( - PacketClipButton.Handler.class, PacketClipButton.class, 0, Side.SERVER + PacketClipButton.Handler.class, PacketClipButton.class, desc++, Side.SERVER + ); + channel.registerMessage( + PacketFX.Handler.class, PacketFX.class, desc++, Side.CLIENT ); FortunesUtil.load(); } @@ -99,6 +110,18 @@ public class Dartcraft { 1, true ); + EntityRegistry.registerModEntity( + EntityTime.class, "entityTime", entityId++, Dartcraft.instance, 40, 1, true + ); + EntityRegistry.registerModEntity( + EntityFrozenItem.class, + "entityFrozenItem", + entityId++, + Dartcraft.instance, + 40, + 1, + true + ); } @Mod.EventHandler diff --git a/src/main/java/ley/modding/dartcraft/block/BlockForceTorch.java b/src/main/java/ley/modding/dartcraft/block/BlockForceTorch.java new file mode 100644 index 0000000..a7ff011 --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/block/BlockForceTorch.java @@ -0,0 +1,297 @@ +package ley.modding.dartcraft.block; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Random; +import java.util.stream.IntStream; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ley.modding.dartcraft.Config; +import ley.modding.dartcraft.Dartcraft; +import ley.modding.dartcraft.client.renderer.block.RenderBlockTorch; +import ley.modding.dartcraft.item.AbstractItemBlockMetadata; +import ley.modding.dartcraft.tile.TileEntityForceTorch; +import ley.modding.dartcraft.util.DartUtils; +import ley.modding.dartcraft.util.Util; +import ley.modding.tileralib.api.ICustomItemBlockProvider; +import ley.modding.tileralib.api.ITEProvider; +import net.minecraft.block.Block; +import net.minecraft.block.BlockTorch; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class BlockForceTorch + extends BlockTorch implements ITEProvider, ICustomItemBlockProvider { + public static final String ID = "forcetorch"; + + public static HashMap upgrades = new HashMap<>(); + static { + upgrades.put("Heat", new int[] { 16, 1 }); + upgrades.put("Healing", new int[] { 17, 6 }); + upgrades.put("Bane", new int[] { 18, 14 }); + upgrades.put("Camo", new int[] { 19, 0 }); + upgrades.put("Repair", new int[] { 20, 4 }); + upgrades.put("Time", new int[] { 21, 12 }); + } + + public IIcon[] icons; + + public BlockForceTorch() { + super(); + Util.configureBlock(this, ID); + this.setResistance(2000.0F); + this.setLightLevel(1.0F); + } + + @Override + public int getRenderType() { + return RenderBlockTorch.RI; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getLightValue(IBlockAccess world, int x, int y, int z) { + return 15; + } + + @Override + public boolean hasTileEntity(int meta) { + return true; + } + + @Override + public TileEntity createTileEntity(World world, int meta) { + return new TileEntityForceTorch(); + } + + @Override + public void onBlockPlacedBy( + World world, int x, int y, int z, EntityLivingBase entity, ItemStack stack + ) { + super.onBlockPlacedBy(world, x, y, z, entity, stack); + NBTTagCompound upgrades = new NBTTagCompound(); + int color = stack.getItemDamage(); + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntityForceTorch) { + try { + for (String name : BlockForceTorch.upgrades.keySet()) { + int[] ints = (int[]) BlockForceTorch.upgrades.get(name); + if (stack.getItemDamage() == ints[0]) { + color = ints[1]; + upgrades.setInteger(name, 1); + break; + } + } + } catch (Exception var13) {} + + TileEntityForceTorch torch1 = (TileEntityForceTorch) tile; + torch1.upgrades = upgrades; + torch1.color = (byte) color; + } + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block par5, int meta) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntityForceTorch) { + TileEntityForceTorch torch = (TileEntityForceTorch) tile; + ItemStack stack = new ItemStack(this, 1, torch.color); + if (torch.upgrades != null && !torch.upgrades.hasNoTags()) { + try { + int e = -1; + for (String key : BlockForceTorch.upgrades.keySet()) { + if (torch.upgrades.hasKey(key)) { + e = ((int[]) upgrades.get(key))[0]; + break; + } + } + + if (e > 0) { + stack.setItemDamage(e); + } + } catch (Exception var13) {} + } + + DartUtils.dropItem(stack, world, (double) x, (double) y, (double) z); + world.removeTileEntity(x, y, z); + } + } + + @Override + public boolean rotateBlock(World world, int x, int y, int z, ForgeDirection axis) { + return false; + } + + @Override + public ArrayList + getDrops(World alec0, int alec1, int alec2, int alec3, int alec4, int alec5) { + return new ArrayList<>(); + } + + public IIcon getIconForColor(int color) { + switch (color) { + case 16: // heat -> red + return this.icons[1]; + + case 17: // healing -> cyan + return this.icons[6]; + + case 18: // bane -> orange + return this.icons[14]; + + case 19: // camo -> black + return this.icons[0]; + + case 20: // aspect -> blue + return this.icons[4]; + + case 21: // time -> light blue + return this.icons[12]; + + default: + return color >= 0 && color < this.icons.length ? this.icons[color] + : this.blockIcon; + } + } + + @Override + public IIcon getIcon(int alec, int meta) { + return this.getIconForColor(meta); + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + try { + return this.getIconForColor( + ((TileEntityForceTorch) world.getTileEntity(x, y, z)).color + ); + } catch (Exception var7) { + return this.blockIcon; + } + } + + @Override + @SideOnly(Side.CLIENT) + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void getSubBlocks(Item id, CreativeTabs tab, List list) { + IntStream.range(0, Config.timeUpgradeTorch ? 22 : 21) + .mapToObj(m -> new ItemStack(this, 1, m)) + .forEach(list::add); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reggie) { + this.icons = IntStream.range(0, 16) + .mapToObj(i -> "dartcraft:forcetorch" + i) + .map(reggie::registerIcon) + .toArray(IIcon[] ::new); + + this.blockIcon = this.icons[0]; + } + + @Override + public void randomDisplayTick(World world, int x, int y, int z, Random rand) { + try { + TileEntityForceTorch e = (TileEntityForceTorch) world.getTileEntity(x, y, z); + if (e.upgrades.hasKey("Camo")) { + return; + } + } catch (Exception var7) {} + + super.randomDisplayTick(world, x, y, z, rand); + } + + @Override + public boolean onBlockActivated( + World world, + int x, + int y, + int z, + EntityPlayer player, + int par6, + float par7, + float par8, + float par9 + ) { + try { + TileEntity e = world.getTileEntity(x, y, z); + if (e != null && e instanceof TileEntityForceTorch) { + TileEntityForceTorch torch = (TileEntityForceTorch) e; + if (torch.upgrades.hasKey("Time") && Config.timeUpgradeTorch) { + if (Dartcraft.proxy.isSimulating(world)) { + ++torch.timeType; + if (torch.timeType > 4) { + torch.timeType = 0; + } + + String message = "Time mode: "; + switch (torch.timeType) { + case 0: + default: + message = message + "None"; + break; + case 1: + message = message + "Stop"; + break; + case 2: + message = message + "Slow"; + break; + case 3: + message = message + "Fast"; + break; + case 4: + message = message + "Hyper"; + } + + Dartcraft.proxy.sendChatToPlayer(player, message); + } + + return true; + } + } + } catch (Exception var13) { + var13.printStackTrace(); + } + + return false; + } + + @Override + public Class getTEClass() { + return TileEntityForceTorch.class; + } + + @Override + public Class getItemBlockClass() { + return BlockItem.class; + } + + public static class BlockItem extends AbstractItemBlockMetadata { + public BlockItem(Block block) { + super(block); + } + + @Override + public String getID() { + return ID; + } + } +} diff --git a/src/main/java/ley/modding/dartcraft/block/BlockPowerOre.java b/src/main/java/ley/modding/dartcraft/block/BlockPowerOre.java index 37e7f99..5a790b8 100644 --- a/src/main/java/ley/modding/dartcraft/block/BlockPowerOre.java +++ b/src/main/java/ley/modding/dartcraft/block/BlockPowerOre.java @@ -4,8 +4,8 @@ import java.util.List; import java.util.Random; import java.util.stream.IntStream; -import ley.modding.dartcraft.Config; import ley.modding.dartcraft.Dartcraft; +import ley.modding.dartcraft.client.renderer.block.RenderBlockPowerOre; import ley.modding.dartcraft.item.AbstractItemBlockMetadata; import ley.modding.dartcraft.item.DartItems; import ley.modding.dartcraft.util.Util; @@ -60,7 +60,7 @@ public class BlockPowerOre extends BaseBlock implements ICustomItemBlockProvider @Override public int getRenderType() { - return Config.powerOreRenderID; + return RenderBlockPowerOre.RI; } @Override diff --git a/src/main/java/ley/modding/dartcraft/block/DartBlocks.java b/src/main/java/ley/modding/dartcraft/block/DartBlocks.java index 7d534ee..5c07a96 100644 --- a/src/main/java/ley/modding/dartcraft/block/DartBlocks.java +++ b/src/main/java/ley/modding/dartcraft/block/DartBlocks.java @@ -16,6 +16,7 @@ public class DartBlocks { public static Block forcesapling; public static Block[] forceslab; public static Block[] forcestairs; + public static Block forcetorch; public static Block liquidforce; public static Block powerore; @@ -43,6 +44,7 @@ public class DartBlocks { .mapToObj(BlockForceStairs::new) .map(reg::registerBlock) .toArray(Block[] ::new); + DartBlocks.forcetorch = reg.registerBlock(new BlockForceTorch()); DartBlocks.liquidforce = reg.registerBlock(new BlockLiquidForce()); DartBlocks.powerore = reg.registerBlock(new BlockPowerOre()); } diff --git a/src/main/java/ley/modding/dartcraft/client/fx/FXDisney.java b/src/main/java/ley/modding/dartcraft/client/fx/FXDisney.java index 6733ba1..b0d8a38 100644 --- a/src/main/java/ley/modding/dartcraft/client/fx/FXDisney.java +++ b/src/main/java/ley/modding/dartcraft/client/fx/FXDisney.java @@ -6,8 +6,10 @@ import org.lwjgl.opengl.GL11; import ley.modding.dartcraft.Dartcraft; import ley.modding.dartcraft.proxy.CommonProxy; +import net.minecraft.client.Minecraft; import net.minecraft.client.particle.EntityFX; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; public class FXDisney extends EntityFX { @@ -154,7 +156,9 @@ public class FXDisney extends EntityFX { GL11.glDisable(3042); GL11.glDepthMask(true); GL11.glPopMatrix(); - Dartcraft.proxy.bindTexture("textures/particle/particles.png"); + Minecraft.getMinecraft().getTextureManager().bindTexture( + new ResourceLocation("textures/particle/particles.png") + ); tessy.startDrawingQuads(); } } diff --git a/src/main/java/ley/modding/dartcraft/client/fx/FXTime.java b/src/main/java/ley/modding/dartcraft/client/fx/FXTime.java new file mode 100644 index 0000000..4e4676f --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/client/fx/FXTime.java @@ -0,0 +1,176 @@ +package ley.modding.dartcraft.client.fx; + +import java.awt.Color; + +import org.lwjgl.opengl.GL11; + +import ley.modding.dartcraft.Dartcraft; +import ley.modding.dartcraft.proxy.CommonProxy; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.EntityFX; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; + +public class FXTime extends EntityFX { + public static final int TYPE_FALL = 0; + public static final int TYPE_CHANGE = 1; + public static final int TYPE_BREAK = 2; + public static final int TYPE_FREEZE = 3; + public static final int TYPE_FREEZE_ENTITY = 4; + private int iconIndex = 22; + private int type; + private Color color; + + public FXTime( + World world, double x, double y, double z, double vx, double vy, double vz + ) { + super(world, x, y, z, vx, vy, vz); + } + + public FXTime(World world, double x, double y, double z, int type) { + super(world, x, y, z); + this.color = new Color(3574754); + this.particleRed = (float) this.color.getRed(); + this.particleGreen = (float) this.color.getGreen(); + this.particleBlue = (float) this.color.getBlue(); + this.setSize(0.02F, 0.02F); + this.noClip = true; + this.type = type; + float velModifier; + switch (type) { + case 0: + this.motionX = this.motionZ = 0.0D; + this.motionY = -0.025D; + this.particleMaxAge = (int) (85.0D + * ((double) world.rand.nextFloat() * 0.2D + + 0.8999999761581421D)); + break; + case 1: + velModifier = 0.15F; + this.motionX = (double) ((CommonProxy.rand.nextFloat() * 2.0F - 1.0F) + * velModifier); + this.motionY = (double) ((CommonProxy.rand.nextFloat() * 2.0F - 1.0F) + * velModifier); + this.motionZ = (double) ((CommonProxy.rand.nextFloat() * 2.0F - 1.0F) + * velModifier); + this.particleMaxAge = (int) (15.0D + * ((double) world.rand.nextFloat() * 0.2D + + 0.8999999761581421D)); + break; + case 2: + velModifier = 0.1F; + this.motionX = (double) ((CommonProxy.rand.nextFloat() * 2.0F - 1.0F) + * velModifier); + this.motionY = (double) velModifier; + this.motionZ = (double) ((CommonProxy.rand.nextFloat() * 2.0F - 1.0F) + * velModifier); + this.particleMaxAge = (int) (15.0D + * ((double) world.rand.nextFloat() * 0.2D + + 0.8999999761581421D)); + this.particleGravity = 0.5F; + break; + case 4: + this.particleAlpha = 0.5F; + case 3: + velModifier = 0.01F; + this.motionX = (double) ((CommonProxy.rand.nextFloat() * 2.0F - 1.0F) + * velModifier); + this.motionY = (double) velModifier; + + this.motionZ = (double) ((CommonProxy.rand.nextFloat() * 2.0F - 1.0F) + * velModifier); + this.particleMaxAge = (int) (15.0D + * ((double) world.rand.nextFloat() * 0.2D + + 0.8999999761581421D)); + this.particleGravity = 0.0F; + } + + this.particleMaxAge = (int) ((float) this.particleMaxAge * 2.0F); + this.particleScale *= 1.25F; + this.particleGravity *= 0.5F; + this.particleAlpha *= 0.3F; + } + + public void onUpdate() { + super.onUpdate(); + this.rotationPitch += 0.01F; + switch (this.type) { + case 3: + if (this.particleAge > this.particleMaxAge / 2) { + this.particleAlpha -= 0.075F; + } + default: + } + } + + public void renderParticle( + Tessellator tessy, + float par2, + float par3, + float par4, + float par5, + float par6, + float par7 + ) { + tessy.draw(); + GL11.glPushMatrix(); + GL11.glDepthMask(false); + GL11.glEnable(3042); + GL11.glBlendFunc(770, 1); + Dartcraft.proxy.bindTexture("darticles.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.75F); + float var8 = (float) (this.iconIndex % 8) / 8.0F; + float var9 = var8 + 0.124875F; + float var10 = (float) (this.iconIndex / 8) / 8.0F; + float var11 = var10 + 0.124875F; + float var12 = 0.1F * this.particleScale; + float var13 = (float) (this.prevPosX + (this.posX - this.prevPosX) * (double) par2 + - interpPosX); + float var14 = (float) (this.prevPosY + (this.posY - this.prevPosY) * (double) par2 + - interpPosY); + float var15 = (float) (this.prevPosZ + (this.posZ - this.prevPosZ) * (double) par2 + - interpPosZ); + tessy.startDrawingQuads(); + tessy.setBrightness(240); + tessy.setColorRGBA_F( + this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha + ); + tessy.addVertexWithUV( + (double) (var13 - par3 * var12 - par6 * var12), + (double) (var14 - par4 * var12), + (double) (var15 - par5 * var12 - par7 * var12), + (double) var9, + (double) var11 + ); + tessy.addVertexWithUV( + (double) (var13 - par3 * var12 + par6 * var12), + (double) (var14 + par4 * var12), + (double) (var15 - par5 * var12 + par7 * var12), + (double) var9, + (double) var10 + ); + tessy.addVertexWithUV( + (double) (var13 + par3 * var12 + par6 * var12), + (double) (var14 + par4 * var12), + (double) (var15 + par5 * var12 + par7 * var12), + (double) var8, + (double) var10 + ); + tessy.addVertexWithUV( + (double) (var13 + par3 * var12 - par6 * var12), + (double) (var14 - par4 * var12), + (double) (var15 + par5 * var12 - par7 * var12), + (double) var8, + (double) var11 + ); + tessy.draw(); + GL11.glDisable(3042); + GL11.glDepthMask(true); + GL11.glPopMatrix(); + Minecraft.getMinecraft().getTextureManager().bindTexture( + new ResourceLocation("textures/particle/particles.png") + ); + tessy.startDrawingQuads(); + } +} diff --git a/src/main/java/ley/modding/dartcraft/client/gui/GuiClipboard.java b/src/main/java/ley/modding/dartcraft/client/gui/GuiClipboard.java index 80819ee..a38effa 100644 --- a/src/main/java/ley/modding/dartcraft/client/gui/GuiClipboard.java +++ b/src/main/java/ley/modding/dartcraft/client/gui/GuiClipboard.java @@ -1,7 +1,6 @@ package ley.modding.dartcraft.client.gui; import ley.modding.dartcraft.Dartcraft; -import ley.modding.dartcraft.network.DartPacket; import ley.modding.dartcraft.network.PacketClipButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.inventory.GuiContainer; @@ -69,22 +68,19 @@ public class GuiClipboard extends GuiContainer { if (this.balanceBounds.contains(pos)) { getClass(); this.balanceRender = 8; - Dartcraft.proxy.sendPacketToServer((DartPacket - ) new PacketClipButton((EntityPlayer) ((GuiScreen) this).mc.thePlayer, 0)); + Dartcraft.channel.sendToServer(new PacketClipButton(0)); this.container.balanceItems(); } if (this.distBounds.contains(pos)) { getClass(); this.distRender = 8; - Dartcraft.proxy.sendPacketToServer((DartPacket - ) new PacketClipButton((EntityPlayer) ((GuiScreen) this).mc.thePlayer, 1)); + Dartcraft.channel.sendToServer(new PacketClipButton(1)); this.container.doDistribute(); } if (this.clearBounds.contains(pos)) { getClass(); this.clearRender = 8; - Dartcraft.proxy.sendPacketToServer((DartPacket - ) new PacketClipButton((EntityPlayer) ((GuiScreen) this).mc.thePlayer, 2)); + Dartcraft.channel.sendToServer(new PacketClipButton(2)); this.container.clearMatrix(); } } diff --git a/src/main/java/ley/modding/dartcraft/client/renderer/block/PowerOreRenderer.java b/src/main/java/ley/modding/dartcraft/client/renderer/block/RenderBlockPowerOre.java similarity index 95% rename from src/main/java/ley/modding/dartcraft/client/renderer/block/PowerOreRenderer.java rename to src/main/java/ley/modding/dartcraft/client/renderer/block/RenderBlockPowerOre.java index 108d63a..56b0b52 100644 --- a/src/main/java/ley/modding/dartcraft/client/renderer/block/PowerOreRenderer.java +++ b/src/main/java/ley/modding/dartcraft/client/renderer/block/RenderBlockPowerOre.java @@ -1,7 +1,6 @@ package ley.modding.dartcraft.client.renderer.block; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; -import ley.modding.dartcraft.Config; import ley.modding.dartcraft.block.BlockPowerOre; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; @@ -11,8 +10,10 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import org.lwjgl.opengl.GL11; -public class PowerOreRenderer +public class RenderBlockPowerOre extends BlockRenderer implements ISimpleBlockRenderingHandler { + public static int RI; + public void renderInventoryBlock(Block block, int meta, int modelID, RenderBlocks renderer) { block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); @@ -66,6 +67,6 @@ public class PowerOreRenderer @Override public int getRenderId() { - return Config.powerOreRenderID; + return RI; } } diff --git a/src/main/java/ley/modding/dartcraft/client/renderer/block/RenderBlockTorch.java b/src/main/java/ley/modding/dartcraft/client/renderer/block/RenderBlockTorch.java new file mode 100644 index 0000000..846e41f --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/client/renderer/block/RenderBlockTorch.java @@ -0,0 +1,181 @@ +package ley.modding.dartcraft.client.renderer.block; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import ley.modding.dartcraft.block.BlockForceTorch; +import ley.modding.dartcraft.block.DartBlocks; +import ley.modding.dartcraft.tile.TileEntityForceTorch; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.WorldClient; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +public class RenderBlockTorch + extends BlockRenderer implements ISimpleBlockRenderingHandler { + public static int RI; + + public boolean renderBlockTorch(Block block, int x, int y, int z) { + IIcon[] torchIcons = ((BlockForceTorch) DartBlocks.forcetorch).icons; + WorldClient world = null; + IIcon icon = null; + + try { + world = Minecraft.getMinecraft().theWorld; + TileEntityForceTorch l = (TileEntityForceTorch) world.getTileEntity(x, y, z); + icon = torchIcons[l.color]; + if (l.upgrades.hasKey("Camo")) { + return false; + } + + if (l.upgrades.hasKey("Heat")) { + icon = torchIcons[1]; + } + + if (l.upgrades.hasKey("Healing")) { + icon = torchIcons[6]; + } + + if (l.upgrades.hasKey("Bane")) { + icon = torchIcons[14]; + } + } catch (Exception var15) {} + + if (world != null && icon != null) { + int l1 = world.getBlockMetadata(x, y, z); + Tessellator tessellator = Tessellator.instance; + tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z)); + tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F); + double d0 = 0.4000000059604645D; + double d1 = 0.5D - d0; + double d2 = 0.20000000298023224D; + if (l1 == 1) { + this.renderTorchAtAngle( + icon, (double) x - d1, (double) y + d2, (double) z, -d0, 0.0D, 0 + ); + } else if (l1 == 2) { + this.renderTorchAtAngle( + icon, (double) x + d1, (double) y + d2, (double) z, d0, 0.0D, 0 + ); + } else if (l1 == 3) { + this.renderTorchAtAngle( + icon, (double) x, (double) y + d2, (double) z - d1, 0.0D, -d0, 0 + ); + } else if (l1 == 4) { + this.renderTorchAtAngle( + icon, (double) x, (double) y + d2, (double) z + d1, 0.0D, d0, 0 + ); + } else { + this.renderTorchAtAngle( + icon, (double) x, (double) y, (double) z, 0.0D, 0.0D, 0 + ); + } + + return true; + } else { + return false; + } + } + + public void renderTorchAtAngle( + IIcon icon, double x, double y, double z, double par8, double par10, int par12 + ) { + Tessellator tessellator = Tessellator.instance; + double d5 = (double) icon.getMinU(); + double d6 = (double) icon.getMinV(); + double d7 = (double) icon.getMaxU(); + double d8 = (double) icon.getMaxV(); + double d9 = (double) icon.getInterpolatedU(7.0D); + double d10 = (double) icon.getInterpolatedV(6.0D); + double d11 = (double) icon.getInterpolatedU(9.0D); + double d12 = (double) icon.getInterpolatedV(8.0D); + double d13 = (double) icon.getInterpolatedU(7.0D); + double d14 = (double) icon.getInterpolatedV(13.0D); + double d15 = (double) icon.getInterpolatedU(9.0D); + double d16 = (double) icon.getInterpolatedV(15.0D); + x += 0.5D; + z += 0.5D; + double d17 = x - 0.5D; + double d18 = x + 0.5D; + double d19 = z - 0.5D; + double d20 = z + 0.5D; + double d21 = 0.0625D; + double d22 = 0.625D; + tessellator.addVertexWithUV( + x + par8 * (1.0D - d22) - d21, + y + d22, + z + par10 * (1.0D - d22) - d21, + d9, + d10 + ); + tessellator.addVertexWithUV( + x + par8 * (1.0D - d22) - d21, + y + d22, + z + par10 * (1.0D - d22) + d21, + d9, + d12 + ); + tessellator.addVertexWithUV( + x + par8 * (1.0D - d22) + d21, + y + d22, + z + par10 * (1.0D - d22) + d21, + d11, + d12 + ); + tessellator.addVertexWithUV( + x + par8 * (1.0D - d22) + d21, + y + d22, + z + par10 * (1.0D - d22) - d21, + d11, + d10 + ); + tessellator.addVertexWithUV(x + d21 + par8, y, z - d21 + par10, d15, d14); + tessellator.addVertexWithUV(x + d21 + par8, y, z + d21 + par10, d15, d16); + tessellator.addVertexWithUV(x - d21 + par8, y, z + d21 + par10, d13, d16); + tessellator.addVertexWithUV(x - d21 + par8, y, z - d21 + par10, d13, d14); + tessellator.addVertexWithUV(x - d21, y + 1.0D, d19, d5, d6); + tessellator.addVertexWithUV(x - d21 + par8, y + 0.0D, d19 + par10, d5, d8); + tessellator.addVertexWithUV(x - d21 + par8, y + 0.0D, d20 + par10, d7, d8); + tessellator.addVertexWithUV(x - d21, y + 1.0D, d20, d7, d6); + tessellator.addVertexWithUV(x + d21, y + 1.0D, d20, d5, d6); + tessellator.addVertexWithUV(x + par8 + d21, y + 0.0D, d20 + par10, d5, d8); + tessellator.addVertexWithUV(x + par8 + d21, y + 0.0D, d19 + par10, d7, d8); + tessellator.addVertexWithUV(x + d21, y + 1.0D, d19, d7, d6); + tessellator.addVertexWithUV(d17, y + 1.0D, z + d21, d5, d6); + tessellator.addVertexWithUV(d17 + par8, y + 0.0D, z + d21 + par10, d5, d8); + tessellator.addVertexWithUV(d18 + par8, y + 0.0D, z + d21 + par10, d7, d8); + tessellator.addVertexWithUV(d18, y + 1.0D, z + d21, d7, d6); + tessellator.addVertexWithUV(d18, y + 1.0D, z - d21, d5, d6); + tessellator.addVertexWithUV(d18 + par8, y + 0.0D, z - d21 + par10, d5, d8); + tessellator.addVertexWithUV(d17 + par8, y + 0.0D, z - d21 + par10, d7, d8); + tessellator.addVertexWithUV(d17, y + 1.0D, z - d21, d7, d6); + } + + @Override + public void + renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) {} + + @Override + public boolean renderWorldBlock( + IBlockAccess world, + int x, + int y, + int z, + Block block, + int modelId, + RenderBlocks renderer + ) { + return this.renderBlockTorch(block, x, y, z); + } + + @Override + public boolean shouldRender3DInInventory(int alec) { + return false; + } + + @Override + public int getRenderId() { + return RI; + } +} diff --git a/src/main/java/ley/modding/dartcraft/client/renderer/entity/RenderEntityFrozenItem.java b/src/main/java/ley/modding/dartcraft/client/renderer/entity/RenderEntityFrozenItem.java new file mode 100644 index 0000000..5cd86dc --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/client/renderer/entity/RenderEntityFrozenItem.java @@ -0,0 +1,76 @@ +package ley.modding.dartcraft.client.renderer.entity; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ley.modding.dartcraft.entity.EntityFrozenItem; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +@SideOnly(Side.CLIENT) +public class RenderEntityFrozenItem extends RenderLiving { + public RenderItem itren = new RenderItem(); + + public RenderEntityFrozenItem() { + super((ModelBase) null, 0.2F); + } + + @Override + public void setRenderManager(RenderManager rm) { + super.setRenderManager(rm); + this.itren.setRenderManager(rm); + } + + @Override + public void doRender( + Entity entity, double par2, double par4, double par6, float par8, float par9 + ) { + EntityFrozenItem item = (EntityFrozenItem) entity; + ItemStack stack = item.getEntityItem(); + GL11.glPushMatrix(); + GL11.glTranslated(par2, par4, par6); + GL11.glScalef(0.5F, 0.5F, 0.5F); + + try { + if (item != null && stack != null) { + //if (item.dartArrow != null) { + // EntityDartArrow e = new EntityDartArrow(item.worldObj); + // e.readFromNBT(item.dartArrow); + // item.worldObj.spawnEntityInWorld(e); + // item.worldObj.removeEntity(e); + //} else + if (item.arrow != null) { + EntityArrow e1 = new EntityArrow(item.worldObj); + e1.readFromNBT(item.arrow); + //item.worldObj.spawnEntityInWorld(e1); + //item.worldObj.removeEntity(e1); + } else { + EntityItem e2 = new EntityItem( + item.worldObj, item.posX, item.posY, item.posZ, stack.copy() + ); + e2.delayBeforeCanPickup = 100; + e2.hoverStart = item.storedRotation; + itren.doRender(e2, par2, par4, par6, par8, par9); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + GL11.glPopMatrix(); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return TextureMap.locationItemsTexture; + } +} diff --git a/src/main/java/ley/modding/dartcraft/client/renderer/entity/RenderEntityTime.java b/src/main/java/ley/modding/dartcraft/client/renderer/entity/RenderEntityTime.java new file mode 100644 index 0000000..e40593a --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/client/renderer/entity/RenderEntityTime.java @@ -0,0 +1,17 @@ +package ley.modding.dartcraft.client.renderer.entity; + +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderEntityTime extends Render { + @Override + protected ResourceLocation getEntityTexture(Entity alec0) { + return null; + } + + @Override + public void doRender( + Entity alec0, double alec1, double alec2, double alec3, float alec4, float alec5 + ) {} +} diff --git a/src/main/java/ley/modding/dartcraft/entity/EntityFrozenItem.java b/src/main/java/ley/modding/dartcraft/entity/EntityFrozenItem.java new file mode 100644 index 0000000..dd5f4c1 --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/entity/EntityFrozenItem.java @@ -0,0 +1,302 @@ +package ley.modding.dartcraft.entity; + +import ley.modding.dartcraft.Dartcraft; +import ley.modding.dartcraft.api.IBottleRenderable; +import ley.modding.dartcraft.proxy.CommonProxy; +import ley.modding.dartcraft.util.UpgradeHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.init.Items; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +public class EntityFrozenItem extends EntityLiving implements IBottleRenderable { + public int frozenTime; + public int savedSpan; + public float storedRotation; + protected double storedMotionX; + protected double storedMotionY; + protected double storedMotionZ; + private int timeout; + public NBTTagCompound arrow; + public NBTTagCompound dartArrow; + + public EntityFrozenItem(World world) { + super(world); + this.motionX = 0.0D; + this.motionY = 0.0D; + this.motionZ = 0.0D; + this.storedRotation = CommonProxy.rand.nextFloat() * 2.0F; + float size = 0.1F; + this.ySize = size; + this.setSize(size, size); + this.boundingBox.maxX = (double) size; + this.boundingBox.maxY = (double) size; + this.boundingBox.maxZ = (double) size; + } + + public EntityFrozenItem(World world, Entity item, int time) { + this(world); + this.posX = item.posX; + this.posY = item.posY; + this.posZ = item.posZ; + this.storedMotionX = item.motionX; + this.storedMotionY = item.motionY; + this.storedMotionZ = item.motionZ; + this.frozenTime = time; + if (item instanceof EntityItem) { + EntityItem entityItem = (EntityItem) item; + this.savedSpan = entityItem.lifespan; + this.setEntityItem(entityItem.getEntityItem()); + //} else if (item instanceof EntityDartArrow) { + // this.dartArrow = new NBTTagCompound(); + // item.writeToNBT(this.dartArrow); + // this.setEntityItem(new ItemStack(DartItem.forceArrow)); + } else if (item instanceof EntityArrow) { + this.arrow = new NBTTagCompound(); + item.writeToNBT(this.arrow); + this.setEntityItem(new ItemStack(Items.arrow)); + } + } + + @Override + protected void entityInit() { + this.getDataWatcher().addObjectByDataType(12, 5); + super.entityInit(); + } + + @Override + public void onUpdate() { + --this.timeout; + if (!Dartcraft.proxy.isSimulating(this.worldObj) && this.timeout <= 0) { + this.timeout = 40; + //if (this.item == null) { + // //this.sendDescriptionPacket(); + //} + } + + this.motionX = 0.0D; + this.motionY = 0.0D; + this.motionZ = 0.0D; + --this.frozenTime; + if (this.frozenTime <= 0 && Dartcraft.proxy.isSimulating(this.worldObj) + && this.getEntityItem() != null) { + this.worldObj.removeEntity(this); + this.setDead(); + + try { + //if (this.dartArrow != null) { + // EntityDartArrow e = new EntityDartArrow(this.worldObj); + // e.readFromNBT(this.dartArrow); + // this.worldObj.spawnEntityInWorld(e); + //} else + if (this.arrow != null) { + EntityArrow var4 = new EntityArrow(this.worldObj); + var4.readFromNBT(this.arrow); + this.worldObj.spawnEntityInWorld(var4); + } else { + EntityItem var5 = new EntityItem( + this.worldObj, + this.posX, + this.posY, + this.posZ, + this.getEntityItem().copy() + ); + var5.lifespan = this.savedSpan; + var5.delayBeforeCanPickup = 10; + var5.prevPosX = var5.posX; + var5.prevPosY = var5.posY; + var5.prevPosZ = var5.posZ; + var5.ticksExisted = 1; + var5.motionX = this.storedMotionX; + var5.motionY = this.storedMotionY; + var5.motionZ = this.storedMotionZ; + NBTTagCompound dartTag = UpgradeHelper.getDartData(var5); + dartTag.setInteger("timeImmune", 2); + this.worldObj.spawnEntityInWorld(var5); + } + + this.setEntityItem(null); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + @Override + public void readEntityFromNBT(NBTTagCompound comp) { + if (comp.hasKey("item")) { + try { + this.setEntityItem( + ItemStack.loadItemStackFromNBT(comp.getCompoundTag("item")) + ); + this.frozenTime = comp.getInteger("frozenTime"); + this.savedSpan = comp.getInteger("savedSpan"); + this.storedMotionX = comp.getDouble("storedMotionX"); + this.storedMotionY = comp.getDouble("storedMotionY"); + this.storedMotionZ = comp.getDouble("storedMotionZ"); + if (comp.hasKey("dartArrow")) { + this.dartArrow = comp.getCompoundTag("dartArrow"); + } + + if (comp.hasKey("arrow")) { + this.arrow = comp.getCompoundTag("arrow"); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + @Override + public void writeEntityToNBT(NBTTagCompound comp) { + ItemStack item = this.getEntityItem(); + if (item != null) { + try { + NBTTagCompound e = new NBTTagCompound(); + item.writeToNBT(e); + comp.setTag("item", e); + comp.setInteger("frozenTime", this.frozenTime); + comp.setInteger("savedSpan", this.savedSpan); + comp.setDouble("storedMotionX", this.storedMotionX); + comp.setDouble("storedMotionY", this.storedMotionY); + comp.setDouble("storedMotionZ", this.storedMotionZ); + if (this.dartArrow != null) { + comp.setTag("dartArrow", this.dartArrow); + } + + if (this.arrow != null) { + comp.setTag("arrow", this.arrow); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + @Override + public ItemStack getEntityItem() { + return this.getDataWatcher().getWatchableObjectItemStack(12); + } + + @Override + public void setEntityItem(ItemStack stack) { + this.getDataWatcher().updateObject(12, stack); + //if (Dartcraft.proxy.isSimulating(this.worldObj)) { + // if (this.item != null && (this.arrow != null || this.dartArrow != null)) { + // if (!this.item.hasTagCompound()) { + // this.item.setTagCompound(new NBTTagCompound()); + // } + + // if (this.dartArrow != null) { + // this.item.getTagCompound().setTag("storedDartArrow", + // this.dartArrow); + // } else if (this.arrow != null) { + // this.item.getTagCompound().setTag("storedArrow", this.arrow); + // } + // } + + // //this.sendDescriptionPacket(); + //} else if (this.item.hasTagCompound()) { + // NBTTagCompound comp = this.item.getTagCompound(); + // if (comp.hasKey("storedDartArrow")) { + // this.dartArrow = comp.getCompoundTag("storedDartArrow"); + // } else if (comp.hasKey("storedArrow")) { + // this.arrow = comp.getCompoundTag("storedArrow"); + // } + //} + } + + //@Override + //public void sendDescriptionPacket() { + // NBTTagCompound comp; + // if (Dartcraft.proxy.isSimulating(this.worldObj)) { + // if (this.item != null) { + // comp = this.item.writeToNBT(new NBTTagCompound()); + // if (comp != null) { + // comp.setInteger("bottleID", this.entityId); + // PacketDispatcher.sendPacketToAllInDimension( + // (new PacketNBT(49, comp)).getPacket(), this.dimension + // ); + // } + // } + // } else { + // comp = new NBTTagCompound(); + // comp.setInteger("dim", this.dimension); + // comp.setInteger("bottleID", this.entityId); + // PacketDispatcher.sendPacketToServer((new PacketNBT(50, comp)).getPacket()); + // } + //} + + @Override + protected boolean interact(EntityPlayer player) { + try { + ItemStack item = this.getEntityItem(); + player.swingItem(); + if (Dartcraft.proxy.isSimulating(this.worldObj) && player != null + && item != null) { + EntityItem e = new EntityItem( + this.worldObj, player.posX, player.posY, player.posZ, item + ); + e.motionX = 0.0D; + e.motionY = 0.0D; + e.motionZ = 0.0D; + e.delayBeforeCanPickup = 0; + NBTTagCompound dartTag = UpgradeHelper.getDartData(e); + dartTag.setInteger("timeImmune", 2); + if (this.arrow != null || this.dartArrow != null) { + e.getEntityItem().setTagCompound((NBTTagCompound) null); + } + + this.setDead(); + this.worldObj.spawnEntityInWorld(e); + this.worldObj.removeEntity(this); + } + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + // TODO: WTF + //@Override + //public boolean func_85031_j(Entity entity) { + // if (entity instanceof EntityPlayer) { + // this.customInteract((EntityPlayer) entity); + // } + + // return true; + //} + + @Override + public AxisAlignedBB getBoundingBox() { + try { + ItemStack item = this.getEntityItem(); + if (item != null + && (item.getItem() instanceof ItemBlock || this.dartArrow != null + || this.arrow != null)) { + return this.boundingBox; + } + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + @Override + public boolean isEntityInvulnerable() { + return true; + } + + @Override + public boolean canBePushed() { + return false; + } +} diff --git a/src/main/java/ley/modding/dartcraft/entity/EntityTime.java b/src/main/java/ley/modding/dartcraft/entity/EntityTime.java new file mode 100644 index 0000000..874f0c8 --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/entity/EntityTime.java @@ -0,0 +1,302 @@ +package ley.modding.dartcraft.entity; + +import java.util.List; + +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import ley.modding.dartcraft.Config; +import ley.modding.dartcraft.Dartcraft; +import ley.modding.dartcraft.network.PacketFX; +import ley.modding.dartcraft.tile.TileEntityForceTorch; +import ley.modding.dartcraft.util.UpgradeHelper; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +public class EntityTime extends Entity { + public static final int TYPE_NONE = 0; + public static final int TYPE_STOP = 1; + public static final int TYPE_SLOW = 2; + public static final int TYPE_FAST = 3; + public static final int TYPE_HYPER = 4; + public int type; + public static double RANGE = 6.0D; + private int lifeTime; + private boolean checked; + + public EntityTime(World world) { + super(world); + this.lifeTime = 200; + this.checked = false; + } + + public EntityTime(World world, int life) { + this(world); + this.lifeTime = life; + } + + @Override + protected void entityInit() {} + + @Override + public void onUpdate() { + --this.lifeTime; + if (this.lifeTime <= 0) { + this.setDead(); + } else { + this.customTick(); + } + } + + private void customTick() { + if (Dartcraft.proxy.isSimulating(this.worldObj) && this.lifeTime % 20 == 0 + || !this.checked) { + this.spawnParticles(); + } + + if (this.lifeTime % 5 == 0 || !this.checked) { + this.checkEntities(); + } + } + + public void checkEntities() { + try { + if (!Config.timeAffectBlocks && !Config.timeAffectTiles + && !Config.timeUpgradeRod && !Config.timeUpgradeSword + && !Config.timeUpgradeTorch) { + return; + } + + AxisAlignedBB e = AxisAlignedBB.getBoundingBox( + this.posX - RANGE, + this.posY - RANGE, + this.posZ - RANGE, + this.posX + RANGE, + this.posY + RANGE, + this.posZ + RANGE + ); + ((List) this.worldObj.getEntitiesWithinAABB(Entity.class, e)) + .stream() + .filter( + j + -> j != null && !(j instanceof EntityTime) + && !(j instanceof EntityPlayer) && !(j instanceof EntityBottle) + ) + .forEach(j -> { + NBTTagCompound k = UpgradeHelper.getDartData(j); + if (!(j instanceof EntityFrozenItem) && !(j instanceof EntityItem)) { + if (k.getInteger("timeImmune") > 0) { + return; + } + + k.setInteger("time", this.type); + k.setInteger("timeTime", this.lifeTime); + } + + switch (this.type) { + case 1: + if (j instanceof EntityArrow + && (j.posX != j.prevPosX || j.posY != j.prevPosY + || j.posZ != j.prevPosZ)) { + EntityFrozenItem chance = new EntityFrozenItem( + this.worldObj, j, this.lifeTime + ); + this.worldObj.removeEntity(j); + this.worldObj.spawnEntityInWorld(chance); + } + + if (j instanceof EntityItem) { + EntityItem var19 = (EntityItem) j; + if (k.hasKey("timeImmune")) { + k.setInteger( + "timeImmune", k.getInteger("timeImmune") - 1 + ); + if (k.getInteger("timeImmune") <= 0) { + k.removeTag("timeImmune"); + } + } else if(var19.getEntityItem() != null && var19.getEntityItem().stackSize >= 1) { + short freq = 600; + EntityFrozenItem e1 = new EntityFrozenItem( + this.worldObj, var19, freq + ); + var19.setEntityItemStack( + var19.getEntityItem().splitStack(0) + ); + this.worldObj.removeEntity(var19); + this.worldObj.spawnEntityInWorld(e1); + } + } + + //case 0: + //case 2: + //case 3: + //case 4: + default: + break; + } + }); + ; + + if (this.type == 3 || this.type == 4) { + for (int x = (int) (this.posX - RANGE); x < (int) (this.posX + RANGE); + ++x) { + for (int y = (int) (this.posY - RANGE); y < (int) (this.posY + RANGE); + ++y) { + for (int z = (int) (this.posZ - RANGE); + z < (int) (this.posZ + RANGE); + ++z) { + float var20 = this.type == 4 ? 0.5F : 0.1F; + + try { + if (Config.timeAffectBlocks) { + Block block = this.worldObj.getBlock(x, y, z); + if (block != Blocks.air) { + if (block != null + && var20 >= this.rand.nextFloat()) { + block.updateTick( + this.worldObj, x, y, z, this.rand + ); + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + + Block var21 = this.type == 4 ? Blocks.glass : Blocks.planks; + + try { + TileEntity var23 = this.worldObj.getTileEntity(x, y, z); + if (var23 != null && !(var23 instanceof TileEntityForceTorch) + && Config.timeAffectTiles + /*&& (!Config.timeAffectWhitelist + || DartPluginForceWrench.isTileBlacklisted( + var23.getClass() + ))*/) { + // TODO: WTF + //if (var23 instanceof TileEntityMobSpawner) { + // TileEntityMobSpawner l + // = (TileEntityMobSpawner) var23; + // if (!(l.getSpawnerLogic() + // instanceof CustomEntityLogic)) { + // String logic = l.getSpawnerLogic() + // .getEntityNameToSpawn(); + // CustomEntityLogic logic1 + // = new CustomEntityLogic(l, + // this.type); + // SpawnerReflector.setLogic(l, logic1); + // } else { + // CustomEntityLogic var25 + // = (CustomEntityLogic) + // l.getSpawnerLogic(); + // var25.setHyper(); + // } + //} + + // TODO: WTF + //if (!ForestryTimer.handleTile(var23, var21)) { + // for (int var24 = 0; var24 < var21; ++var24) + // { + // var23.updateEntity(); + // } + //} + } + } catch (Exception var14) { + var14.printStackTrace(); + } + } + } + } + } + } catch (Exception var15) { + var15.printStackTrace(); + } + + this.checked = true; + } + + public void spawnParticles() { + if (this.lifeTime >= 20) { + byte type = 4; + switch (this.type) { + case 0: + return; + case 1: + case 2: + type = 3; + break; + case 3: + type = 2; + break; + case 4: + type = 1; + } + + Dartcraft.channel.sendToAllAround( + new PacketFX( + this.posX, this.posY, this.posZ, PacketFX.Type.TIME, type, 0, 1 + ), + new TargetPoint( + this.worldObj.provider.dimensionId, + this.posX, + this.posY, + this.posZ, + 80d + ) + ); + } + } + + public boolean setType(int type, boolean playSound) { + if (type >= 0 && type <= 4) { + this.type = type; + if (playSound) { + String sound = "dartcraft:"; + switch (this.type) { + case 1: + case 2: + sound = sound + "slowDown"; + break; + case 3: + case 4: + sound = sound + "speedUp"; + } + + if (this.worldObj != null) { + this.worldObj.playSoundAtEntity(this, sound, 1.0F, 1.0F); + } + } + + return true; + } else { + this.type = 0; + return false; + } + } + + @Override + protected void readEntityFromNBT(NBTTagCompound comp) { + try { + this.setType(comp.getInteger("timeType"), false); + this.lifeTime = comp.getInteger("lifeTime"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + protected void writeEntityToNBT(NBTTagCompound comp) { + try { + comp.setInteger("timeType", this.type); + comp.setInteger("lifeTime", this.lifeTime); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/ley/modding/dartcraft/item/AbstractItemBlockMetadata.java b/src/main/java/ley/modding/dartcraft/item/AbstractItemBlockMetadata.java index 1883685..df6473e 100644 --- a/src/main/java/ley/modding/dartcraft/item/AbstractItemBlockMetadata.java +++ b/src/main/java/ley/modding/dartcraft/item/AbstractItemBlockMetadata.java @@ -4,6 +4,7 @@ import ley.modding.dartcraft.util.Util; import net.minecraft.block.Block; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; public abstract class AbstractItemBlockMetadata extends ItemBlock { public AbstractItemBlockMetadata(Block block) { @@ -19,6 +20,11 @@ public abstract class AbstractItemBlockMetadata extends ItemBlock { return damage; } + @Override + public IIcon getIconFromDamage(int meta) { + return this.field_150939_a.getIcon(0, meta); + } + @Override public String getUnlocalizedName(ItemStack stack) { return "tile." + this.getID() + stack.getItemDamage(); diff --git a/src/main/java/ley/modding/dartcraft/network/DartPacket.java b/src/main/java/ley/modding/dartcraft/network/DartPacket.java deleted file mode 100644 index 1716d5d..0000000 --- a/src/main/java/ley/modding/dartcraft/network/DartPacket.java +++ /dev/null @@ -1,74 +0,0 @@ -package ley.modding.dartcraft.network; - -import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import io.netty.buffer.ByteBuf; - -public abstract class DartPacket implements IMessage { - protected String receiver; - - protected int dimensionID; - - protected NetworkRegistry.TargetPoint point; - - public abstract boolean getToClient(); - - public abstract boolean isDimPacket(); - - public int getDimID() { - return this.dimensionID; - } - - public String getReceiver() { - return this.receiver; - } - - public NetworkRegistry.TargetPoint getLocation() { - return this.point; - } - - public void fromBytes(ByteBuf buf) { - try { - if (isDimPacket()) - this.dimensionID = buf.readByte(); - int nameSize = buf.readByte(); - if (nameSize > 0) { - this.receiver = ""; - for (int i = 0; i < nameSize; i++) - this.receiver += buf.readChar(); - } - if (buf.readBoolean()) - this.point = new NetworkRegistry.TargetPoint( - buf.readInt(), - buf.readDouble(), - buf.readDouble(), - buf.readDouble(), - buf.readDouble() - ); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void toBytes(ByteBuf buf) { - if (this.receiver == null) - this.receiver = ""; - try { - if (isDimPacket()) - buf.writeByte(this.dimensionID); - buf.writeByte((this.receiver != null) ? this.receiver.length() : 0); - for (int i = 0; i < this.receiver.length(); i++) - buf.writeChar(this.receiver.charAt(i)); - buf.writeBoolean((this.point != null)); - if (this.point != null) { - buf.writeInt(this.point.dimension); - buf.writeDouble(this.point.x); - buf.writeDouble(this.point.y); - buf.writeDouble(this.point.z); - buf.writeDouble(this.point.range); - } - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/ley/modding/dartcraft/network/PacketClipButton.java b/src/main/java/ley/modding/dartcraft/network/PacketClipButton.java index 7317216..fbc5c02 100644 --- a/src/main/java/ley/modding/dartcraft/network/PacketClipButton.java +++ b/src/main/java/ley/modding/dartcraft/network/PacketClipButton.java @@ -5,40 +5,31 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import io.netty.buffer.ByteBuf; import ley.modding.dartcraft.client.gui.ContainerClipboard; -import ley.modding.dartcraft.util.EntityUtils; import net.minecraft.entity.player.EntityPlayer; -public class PacketClipButton extends DartPacket implements IMessage { +public class PacketClipButton implements IMessage { protected int button; public PacketClipButton() {} - public PacketClipButton(EntityPlayer player, int button) { + public PacketClipButton(int button) { this.button = button; - this.receiver = player.getCommandSenderName(); - } - - public boolean getToClient() { - return false; - } - - public boolean isDimPacket() { - return false; } + @Override public void fromBytes(ByteBuf buf) { - super.fromBytes(buf); this.button = buf.readByte(); } + @Override public void toBytes(ByteBuf buf) { - super.toBytes(buf); buf.writeByte(this.button); } public static class Handler implements IMessageHandler { + @Override public IMessage onMessage(PacketClipButton packet, MessageContext ctx) { - EntityPlayer player = EntityUtils.getPlayerByName(packet.getReceiver()); + EntityPlayer player = ctx.getServerHandler().playerEntity; if (player != null) { ContainerClipboard clipboard = (player.openContainer != null diff --git a/src/main/java/ley/modding/dartcraft/network/PacketFX.java b/src/main/java/ley/modding/dartcraft/network/PacketFX.java new file mode 100644 index 0000000..9dd8b63 --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/network/PacketFX.java @@ -0,0 +1,91 @@ +package ley.modding.dartcraft.network; + +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import ley.modding.dartcraft.util.FXUtils; + +public class PacketFX implements IMessage { + public double x; + public double y; + public double z; + + public Type type; + public int subType; + public int area; + public int amount; + + public PacketFX() {} + + public PacketFX( + double x, double y, double z, Type type, int subType, int area, int amount + ) { + this.x = x; + this.y = y; + this.z = z; + this.type = type; + this.subType = subType; + this.area = area; + this.amount = amount; + } + + @Override + public void fromBytes(ByteBuf buf) { + this.x = buf.readDouble(); + this.y = buf.readDouble(); + this.z = buf.readDouble(); + + this.type = Type.fromInt(buf.readInt()); + this.subType = buf.readInt(); + this.area = buf.readInt(); + this.amount = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeDouble(this.x); + buf.writeDouble(this.y); + buf.writeDouble(this.z); + + buf.writeInt(this.type.ordinal()); + buf.writeInt(this.subType); + buf.writeInt(this.area); + buf.writeInt(this.amount); + } + + public static enum Type { + TIME; + + public static Type fromInt(int i) { + if (i >= 0 && i < Type.values().length) + return Type.values()[i]; + return null; + } + } + + public static class Handler implements IMessageHandler { + @Override + @SideOnly(Side.CLIENT) + public IMessage onMessage(PacketFX pkt, MessageContext ctx) { + switch (pkt.type) { + case TIME: + FXUtils.makeTimeEffects( + FMLClientHandler.instance().getClientPlayerEntity().worldObj, + pkt.x, + pkt.y, + pkt.z, + 1, + pkt.amount, + pkt.area + ); + break; + } + + return null; + } + } +} diff --git a/src/main/java/ley/modding/dartcraft/proxy/ClientProxy.java b/src/main/java/ley/modding/dartcraft/proxy/ClientProxy.java index 7412159..12452e7 100644 --- a/src/main/java/ley/modding/dartcraft/proxy/ClientProxy.java +++ b/src/main/java/ley/modding/dartcraft/proxy/ClientProxy.java @@ -2,18 +2,25 @@ package ley.modding.dartcraft.proxy; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; -import ley.modding.dartcraft.Config; import ley.modding.dartcraft.Dartcraft; import ley.modding.dartcraft.block.DartBlocks; -import ley.modding.dartcraft.client.renderer.block.PowerOreRenderer; +import ley.modding.dartcraft.client.renderer.block.RenderBlockPowerOre; +import ley.modding.dartcraft.client.renderer.block.RenderBlockTorch; import ley.modding.dartcraft.client.renderer.block.RenderTileForceEngine; import ley.modding.dartcraft.client.renderer.entity.RenderColdAnimal; import ley.modding.dartcraft.client.renderer.entity.RenderEntityBottle; +import ley.modding.dartcraft.client.renderer.entity.RenderEntityFrozenItem; +import ley.modding.dartcraft.client.renderer.entity.RenderEntityTime; import ley.modding.dartcraft.client.renderer.item.RenderItemEngine; import ley.modding.dartcraft.client.renderer.item.RenderItemForceFlask; -import ley.modding.dartcraft.entity.*; +import ley.modding.dartcraft.entity.EntityBottle; +import ley.modding.dartcraft.entity.EntityColdChicken; +import ley.modding.dartcraft.entity.EntityColdCow; +import ley.modding.dartcraft.entity.EntityColdPig; +import ley.modding.dartcraft.entity.EntityFlyingFlask; +import ley.modding.dartcraft.entity.EntityFrozenItem; +import ley.modding.dartcraft.entity.EntityTime; import ley.modding.dartcraft.item.DartItems; -import ley.modding.dartcraft.network.DartPacket; import ley.modding.dartcraft.tile.TileEntityForceEngine; import net.minecraft.client.model.ModelChicken; import net.minecraft.client.model.ModelCow; @@ -69,8 +76,16 @@ public class ClientProxy extends CommonProxy { EntityColdPig.class, new RenderColdAnimal(new ModelPig(), 0.6f, "textures/entity/coldPig.png") ); - Config.powerOreRenderID = RenderingRegistry.getNextAvailableRenderId(); - RenderingRegistry.registerBlockHandler(new PowerOreRenderer()); + RenderingRegistry.registerEntityRenderingHandler( + EntityTime.class, new RenderEntityTime() + ); + RenderingRegistry.registerEntityRenderingHandler( + EntityFrozenItem.class, new RenderEntityFrozenItem() + ); + RenderBlockPowerOre.RI = RenderingRegistry.getNextAvailableRenderId(); + RenderingRegistry.registerBlockHandler(new RenderBlockPowerOre()); + RenderBlockTorch.RI = RenderingRegistry.getNextAvailableRenderId(); + RenderingRegistry.registerBlockHandler(new RenderBlockTorch()); engineRender = new RenderTileForceEngine(); ClientRegistry.bindTileEntitySpecialRenderer( TileEntityForceEngine.class, engineRender @@ -79,13 +94,4 @@ public class ClientProxy extends CommonProxy { Item.getItemFromBlock(DartBlocks.engine), new RenderItemEngine() ); } - - @Override - public void sendPacketToServer(DartPacket packet) { - try { - Dartcraft.channel.sendToServer(packet); - } catch (Exception e) { - e.printStackTrace(); - } - } } diff --git a/src/main/java/ley/modding/dartcraft/proxy/CommonProxy.java b/src/main/java/ley/modding/dartcraft/proxy/CommonProxy.java index 030c7b1..a9bf47b 100644 --- a/src/main/java/ley/modding/dartcraft/proxy/CommonProxy.java +++ b/src/main/java/ley/modding/dartcraft/proxy/CommonProxy.java @@ -4,7 +4,6 @@ import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.network.NetworkRegistry; import ley.modding.dartcraft.Dartcraft; import ley.modding.dartcraft.client.gui.GuiHandler; -import ley.modding.dartcraft.network.DartPacket; import ley.modding.dartcraft.util.ForceUpgradeManager; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; @@ -34,6 +33,4 @@ public class CommonProxy { ForceUpgradeManager.load(); NetworkRegistry.INSTANCE.registerGuiHandler(Dartcraft.instance, new GuiHandler()); } - - public void sendPacketToServer(DartPacket packet) {} } diff --git a/src/main/java/ley/modding/dartcraft/tile/TileEntityForceTorch.java b/src/main/java/ley/modding/dartcraft/tile/TileEntityForceTorch.java new file mode 100644 index 0000000..9ee1fe1 --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/tile/TileEntityForceTorch.java @@ -0,0 +1,276 @@ +package ley.modding.dartcraft.tile; + +import java.util.List; + +import cpw.mods.fml.common.Loader; +import ley.modding.dartcraft.Config; +import ley.modding.dartcraft.Dartcraft; +import ley.modding.dartcraft.entity.EntityTime; +import ley.modding.dartcraft.util.DartUtils; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.boss.EntityWither; +import net.minecraft.entity.monster.EntityGhast; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.monster.EntitySlime; +import net.minecraft.entity.monster.EntityWitch; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; + +public class TileEntityForceTorch extends TileEntity { + public NBTTagCompound upgrades = new NBTTagCompound(); + public byte color = 0; + public int timeType = 1; + private int timeout; + private int maxTimeout; + + @Override + public boolean canUpdate() { + return true; + } + + @Override + public void updateEntity() { + if (Dartcraft.proxy.isSimulating(this.worldObj) && this.upgrades != null + && !this.upgrades.hasNoTags()) { + ++this.timeout; + if (this.timeout >= this.maxTimeout) { + this.timeout = 0; + this.maxTimeout = Config.torchFreq + + (int) (this.worldObj.rand.nextFloat() * (float) Config.torchFreq + / 2.0F); + int time; + if (this.upgrades.hasKey("Light")) { + time = this.upgrades.getInteger("Light"); + } + + if (this.upgrades.hasKey("Healing")) { + try { + AxisAlignedBB var13 = AxisAlignedBB.getBoundingBox( + (double) this.xCoord - (double) Config.torchDist, + (double) this.yCoord - (double) Config.torchDist, + (double) this.zCoord - (double) Config.torchDist, + (double) this.xCoord + (double) Config.torchDist, + (double) this.yCoord + (double) Config.torchDist, + (double) this.zCoord + (double) Config.torchDist + ); + List j = this.worldObj.getEntitiesWithinAABB( + EntityLivingBase.class, var13 + ); + boolean k = false; + int tile = 1; + + for (EntityLivingBase entity : j) { + if (entity != null) { + if (!entity.isEntityUndead() + && !(entity instanceof EntityGhast)) { + float entityUpgrades + = (float) entity.getAttributeMap() + .getAttributeInstanceByName( + "generic.maxHealth" + ) + .getAttributeValue(); + if (entity.getHealth() < entityUpgrades) { + entity.heal((float) (tile * 2)); + k = true; + // TODO + //PacketHelper.sendCureFXToClients( + // entity, 8 * tile + //); + } + } else { + // TODO + //entity.attackEntityFrom(PunishDamage.instance, 2.0F); + } + + if (k) { + this.worldObj.playSoundEffect( + (double) this.xCoord, + (double) this.yCoord, + (double) this.zCoord, + "dartcraft:cure", + 0.5F, + DartUtils.randomPitch() + ); + } + } + } + } catch (Exception var12) { + ; + } + } + + if (this.upgrades.hasKey("Bane")) { + try { + AxisAlignedBB var13 = AxisAlignedBB.getBoundingBox( + (double) this.xCoord - (double) Config.torchDist, + (double) this.yCoord - (double) Config.torchDist, + (double) this.zCoord - (double) Config.torchDist, + (double) this.xCoord + (double) Config.torchDist, + (double) this.yCoord + (double) Config.torchDist, + (double) this.zCoord + (double) Config.torchDist + ); + List j = this.worldObj.getEntitiesWithinAABB( + EntityLivingBase.class, var13 + ); + boolean k = false; + + for (EntityLivingBase var18 : j) { + if (var18 != null + && (var18 instanceof EntityMob + || var18 instanceof EntitySlime + || var18 instanceof EntityGhast) + && !(var18 instanceof EntityWitch) + && !(var18 instanceof EntityWither)) { + this.worldObj.removeEntity(var18); + k = true; + // TODO + //PacketHelper.sendChangeFXToClients(var18, 16); + } + } + + if (k) { + this.worldObj.playSoundEffect( + (double) this.xCoord, + (double) this.yCoord, + (double) this.zCoord, + "random.pop", + 1.0F, + DartUtils.randomPitch() + ); + } + } catch (Exception var11) { + ; + } + } + + if (this.upgrades.hasKey("Heat")) { + try { + AxisAlignedBB var13 = AxisAlignedBB.getBoundingBox( + (double) this.xCoord - (double) Config.torchDist, + (double) this.yCoord - (double) Config.torchDist, + (double) this.zCoord - (double) Config.torchDist, + (double) this.xCoord + (double) Config.torchDist, + (double) this.yCoord + (double) Config.torchDist, + (double) this.zCoord + (double) Config.torchDist + ); + List j = this.worldObj.getEntitiesWithinAABB( + EntityLivingBase.class, var13 + ); + boolean k = false; + int tile = 1; + + for (EntityLivingBase entity : j) { + if (entity != null && !entity.isImmuneToFire()) { + NBTTagCompound var20 = new NBTTagCompound(); + if (entity instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) entity; + // TODO: WTF + //var20 = SocketHelper.getArmorCompound(player); + } + + if (!var20.hasKey("Heat") + || var20.getInteger("Heat") < 3) { + entity.setFire(tile); + entity.attackEntityFrom( + DamageSource.inFire, 0.5F * (float) tile + ); + k = true; + // TODO + //PacketHelper.sendHeatFXToClients(entity, 8 * tile, + //0); + } + } + } + + if (k) { + this.worldObj.playSoundEffect( + (double) this.xCoord, + (double) this.yCoord, + (double) this.zCoord, + "dartcraft:ignite", + 1.0F, + DartUtils.randomPitch() + ); + } + } catch (Exception var10) { + ; + } + } + + if (this.upgrades.hasKey("Repair") && Loader.isModLoaded("Thaumcraft")) { + try { + for (time = -Config.torchDist; time < Config.torchDist; ++time) { + for (int var15 = -Config.torchDist; var15 < Config.torchDist; + ++var15) { + for (int var19 = -Config.torchDist; + var19 < Config.torchDist; + ++var19) { + TileEntity var17 = this.worldObj.getTileEntity( + this.xCoord + time, + this.yCoord + var15, + this.zCoord + var19 + ); + // TODO: TC + //if (var17 != null + // && ThaumCraftIntegration.isDeconstructor(var17)) + // { ThaumCraftIntegration.setDeconAspect(var17); + // break label110; + //} + } + } + } + } catch (Exception var9) { + ; + } + } + + if (this.upgrades.hasKey("Time") && Config.timeUpgradeTorch) { + EntityTime var14 = new EntityTime(this.worldObj, this.maxTimeout - 2); + var14.posX = (double) this.xCoord + 0.5D; + var14.posY = (double) this.yCoord + 0.5D; + var14.posZ = (double) this.zCoord + 0.5D; + var14.setType(this.timeType, false); + this.worldObj.spawnEntityInWorld(var14); + } + } + } + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + this.writeToNBT(nbt); + + return new S35PacketUpdateTileEntity( + this.xCoord, this.yCoord, this.zCoord, this.getBlockMetadata(), nbt + ); + } + + @Override + public void onDataPacket(NetworkManager arg0, S35PacketUpdateTileEntity arg1) { + this.readFromNBT(arg1.func_148857_g()); + } + + @Override + public void readFromNBT(NBTTagCompound comp) { + super.readFromNBT(comp); + this.upgrades = comp.getCompoundTag("upgrades"); + this.color = comp.getByte("color"); + this.timeType = comp.getByte("timeType"); + } + + @Override + public void writeToNBT(NBTTagCompound comp) { + super.writeToNBT(comp); + comp.setTag("upgrades", this.upgrades); + comp.setByte("color", this.color); + comp.setByte("timeType", (byte) this.timeType); + } +} diff --git a/src/main/java/ley/modding/dartcraft/util/FXUtils.java b/src/main/java/ley/modding/dartcraft/util/FXUtils.java index 9e3b609..ab80372 100644 --- a/src/main/java/ley/modding/dartcraft/util/FXUtils.java +++ b/src/main/java/ley/modding/dartcraft/util/FXUtils.java @@ -9,6 +9,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ley.modding.dartcraft.Dartcraft; import ley.modding.dartcraft.client.fx.FXDisney; +import ley.modding.dartcraft.client.fx.FXTime; import ley.modding.dartcraft.proxy.CommonProxy; import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.particle.EntityFireworkStarterFX; @@ -503,33 +504,31 @@ public class FXUtils { for (int fx = -area; fx < area + 1; ++fx) { for (int k = -area; k < area + 1; ++k) { for (int l = 0; l < num; ++l) { - // TODO - //FXTime fx1 = new FXTime( - // world, - // x + (double) i + world.rand.nextDouble() - // - world.rand.nextDouble(), - // y + (double) fx + world.rand.nextDouble() - // - world.rand.nextDouble(), - // z + (double) k + world.rand.nextDouble() - // - world.rand.nextDouble(), - // type - //); - //renderer.addEffect(fx1); + FXTime fx1 = new FXTime( + world, + x + (double) i + world.rand.nextDouble() + - world.rand.nextDouble(), + y + (double) fx + world.rand.nextDouble() + - world.rand.nextDouble(), + z + (double) k + world.rand.nextDouble() + - world.rand.nextDouble(), + type + ); + renderer.addEffect(fx1); } } } } } else { for (i = 0; i < num; ++i) { - // TODO - //FXTime var16 = new FXTime( - // world, - // x + world.rand.nextDouble() - world.rand.nextDouble(), - // y + world.rand.nextDouble() - world.rand.nextDouble(), - // z + world.rand.nextDouble() - world.rand.nextDouble(), - // type - //); - //renderer.addEffect(var16); + FXTime var16 = new FXTime( + world, + x + world.rand.nextDouble() - world.rand.nextDouble(), + y + world.rand.nextDouble() - world.rand.nextDouble(), + z + world.rand.nextDouble() - world.rand.nextDouble(), + type + ); + renderer.addEffect(var16); } } } diff --git a/src/main/java/ley/modding/dartcraft/util/UpgradeHelper.java b/src/main/java/ley/modding/dartcraft/util/UpgradeHelper.java new file mode 100644 index 0000000..749fbfd --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/util/UpgradeHelper.java @@ -0,0 +1,65 @@ +package ley.modding.dartcraft.util; + +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class UpgradeHelper { + public static NBTTagCompound getUpgradeCompound(ItemStack stack) { + return stack != null && stack.hasTagCompound() + && stack.getTagCompound().hasKey("upgrades") + ? stack.getTagCompound().getCompoundTag("upgrades") + : new NBTTagCompound(); + } + + public static ItemStack setUpgradeData(ItemStack stack, String type, int level) { + if (stack == null) + return null; + + if (!stack.hasTagCompound()) + stack.setTagCompound(new NBTTagCompound()); + + if (!stack.getTagCompound().hasKey("upgrades")) + stack.getTagCompound().setTag("upgrades", new NBTTagCompound()); + + NBTTagCompound upgrades = stack.getTagCompound().getCompoundTag("upgrades"); + upgrades.setInteger(type, level); + return stack; + } + + public static NBTTagCompound getDartData(Entity entity) { + if (entity == null) + return new NBTTagCompound(); + NBTTagCompound entdat = entity.getEntityData(); + if (entdat == null) + return new NBTTagCompound(); + + NBTTagCompound dartdat = entdat.getCompoundTag("dartcraft"); + + // getCompoundTag may create a new tag, here we make sure it is also contained + // within entdat. + entdat.setTag("dartcraft", dartdat); + + return dartdat; + } + + //public static NBTTagCompound getPlayerEquippedComp(EntityPlayer player) { + // if (player == null) + // return new NBTTagCompound(); + + // ItemStack stack = player.getCurrentEquippedItem(); + // NBTTagCompound upgrades = new NBTTagCompound(); + // if (stack != null) { + // if (stack.getItem() instanceof ItemForceSword) { + // upgrades = (NBTTagCompound) getUpgradeCompound(stack).copy(); + // } + + // if (stack.getItem() instanceof ItemPowerSaw) { + // upgrades = (NBTTagCompound) + // SocketHelper.getSocketCompound(stack).copy(); + // } + // } + + // return upgrades; + //} +} diff --git a/src/main/resources/assets/dartcraft/lang/en_US.lang b/src/main/resources/assets/dartcraft/lang/en_US.lang index 432d485..5843599 100644 --- a/src/main/resources/assets/dartcraft/lang/en_US.lang +++ b/src/main/resources/assets/dartcraft/lang/en_US.lang @@ -38,6 +38,7 @@ tile.forcebrick12.name=Light Blue Force Brick tile.forcebrick13.name=Magenta Force Brick tile.forcebrick14.name=Orange Force Brick tile.forcebrick15.name=White Force Brick + tile.forceslab0.name=Black Force Slab tile.forceslab1.name=Red Force Slab tile.forceslab2.name=Green Force Slab @@ -55,6 +56,7 @@ tile.forceslab13.name=Magenta Force Slab tile.forceslab14.name=Orange Force Slab tile.forceslab15.name=White Force Slab tile.forceslab16.name=Wooden Force Slab + tile.forcestairs0.name=Black Force Stairs tile.forcestairs1.name=Red Force Stairs tile.forcestairs2.name=Green Force Stairs @@ -73,4 +75,27 @@ tile.forcestairs14.name=Orange Force Stairs tile.forcestairs15.name=White Force Stairs tile.forcestairs16.name=Wooden Force Stairs +tile.forcetorch0.name=Black Force Torch +tile.forcetorch1.name=Red Force Torch +tile.forcetorch2.name=Green Force Torch +tile.forcetorch3.name=Brown Force Torch +tile.forcetorch4.name=Blue Force Torch +tile.forcetorch5.name=Purple Force Torch +tile.forcetorch6.name=Cyan Force Torch +tile.forcetorch7.name=Light Gray Force Torch +tile.forcetorch8.name=Gray Force Torch +tile.forcetorch9.name=Pink Force Torch +tile.forcetorch10.name=Lime Force Torch +tile.forcetorch11.name=Yellow Force Torch +tile.forcetorch12.name=Light Blue Force Torch +tile.forcetorch13.name=Magenta Force Torch +tile.forcetorch14.name=Orange Force Torch +tile.forcetorch15.name=White Force Torch +tile.forcetorch16.name=Heat Torch +tile.forcetorch17.name=Healing Torch +tile.forcetorch18.name=Bane Torch +tile.forcetorch19.name=Camo Torch +tile.forcetorch20.name=Aspect Torch +tile.forcetorch21.name=Time Torch + itemGroup.dartcraft=Dartcraft diff --git a/src/main/resources/assets/dartcraft/textures/blocks/forcetorch0.png b/src/main/resources/assets/dartcraft/textures/blocks/forcetorch0.png new file mode 100644 index 0000000000000000000000000000000000000000..9afdfbf3dac78ca096fa4c94412bdce11a5903e5 GIT binary patch literal 3071 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 N002ovPDHLkV1gli!(9LX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dartcraft/textures/blocks/forcetorch1.png b/src/main/resources/assets/dartcraft/textures/blocks/forcetorch1.png new file mode 100644 index 0000000000000000000000000000000000000000..2d8a895e51d06dba7c32226f9ceeee736667b55a GIT binary patch literal 3105 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dartcraft/textures/blocks/forcetorch10.png b/src/main/resources/assets/dartcraft/textures/blocks/forcetorch10.png new file mode 100644 index 0000000000000000000000000000000000000000..1749fb5baaca9b008c146a7b8e87214a9f8fd559 GIT binary patch literal 3091 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dartcraft/textures/blocks/forcetorch11.png b/src/main/resources/assets/dartcraft/textures/blocks/forcetorch11.png new file mode 100644 index 0000000000000000000000000000000000000000..d382d8f61ed90578ae7e5a2fbbaa33d4065b880c GIT binary patch literal 3095 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 QK>z>%07*qoM6N<$f@|x!u>b%7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dartcraft/textures/blocks/forcetorch2.png b/src/main/resources/assets/dartcraft/textures/blocks/forcetorch2.png new file mode 100644 index 0000000000000000000000000000000000000000..2d10253dcca79a2a136d847ced18be33f6876f83 GIT binary patch literal 3104 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dartcraft/textures/blocks/forcetorch7.png b/src/main/resources/assets/dartcraft/textures/blocks/forcetorch7.png new file mode 100644 index 0000000000000000000000000000000000000000..96fe44f87bab60a748b8b15a5beb21e71e497dd4 GIT binary patch literal 3073 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 P00000NkvXXu0mjf(n`FV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dartcraft/textures/blocks/forcetorch8.png b/src/main/resources/assets/dartcraft/textures/blocks/forcetorch8.png new file mode 100644 index 0000000000000000000000000000000000000000..c34defdc2043eda24d2a78211ebe5fd07dec8429 GIT binary patch literal 3079 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 Ve0y~Vb^ZVV002ovPDHLkV1lJ7y?X!v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dartcraft/textures/blocks/forcetorch9.png b/src/main/resources/assets/dartcraft/textures/blocks/forcetorch9.png new file mode 100644 index 0000000000000000000000000000000000000000..54ab2c94ac50ae5c1582a6c9d4734e34b26bc7e5 GIT binary patch literal 3103 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