From f6df183193dadde8849c169e72e84cd412289342 Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Tue, 23 Apr 2024 19:25:34 +0200 Subject: [PATCH] feat: force torches --- build.gradle | 11 ++ .../java/ley/modding/dartcraft/Dartcraft.java | 2 + .../modding/dartcraft/client/fx/FXCure.java | 163 ++++++++++++++++++ .../dartcraft/client/fx/FXWindWaker.java | 158 +++++++++++++++++ .../modding/dartcraft/entity/EntityTime.java | 6 +- .../modding/dartcraft/event/EventHandler.java | 9 +- .../dartcraft/handlers/TimeHandler.java | 143 +++++++++++++++ .../integration/ThaumCraftIntegration.java | 31 ++++ .../modding/dartcraft/network/PacketFX.java | 30 +++- .../dartcraft/tile/TileEntityForceTorch.java | 102 ++++++++--- .../ley/modding/dartcraft/util/FXUtils.java | 105 +++++------ src/main/resources/META-INF/dartcraft_at.cfg | 2 + .../resources/assets/dartcraft/sounds.json | 66 ++++++- .../assets/dartcraft/sounds/cure.ogg | Bin 0 -> 19674 bytes .../assets/dartcraft/sounds/ignite.ogg | Bin 0 -> 7000 bytes 15 files changed, 722 insertions(+), 106 deletions(-) create mode 100644 src/main/java/ley/modding/dartcraft/client/fx/FXCure.java create mode 100644 src/main/java/ley/modding/dartcraft/client/fx/FXWindWaker.java create mode 100644 src/main/java/ley/modding/dartcraft/handlers/TimeHandler.java create mode 100644 src/main/java/ley/modding/dartcraft/integration/ThaumCraftIntegration.java create mode 100644 src/main/resources/META-INF/dartcraft_at.cfg create mode 100644 src/main/resources/assets/dartcraft/sounds/cure.ogg create mode 100644 src/main/resources/assets/dartcraft/sounds/ignite.ogg diff --git a/build.gradle b/build.gradle index 8adf0aa..3c958f4 100644 --- a/build.gradle +++ b/build.gradle @@ -32,7 +32,12 @@ minecraft { runDir = "run" } +repositories { + maven { url = "https://maven.tilera.xyz" } +} + dependencies { + implementation "thaumcraft:Thaumcraft:1.7.10-4.2.3.5:deobf" } processResources { @@ -54,6 +59,12 @@ task sourcesJar(type: Jar) { classifier = 'sources' } +jar { + manifest { + attributes "FMLAT": "dartcraft_at.cfg" + } +} + publishing { tasks.publish.dependsOn 'build' publications { diff --git a/src/main/java/ley/modding/dartcraft/Dartcraft.java b/src/main/java/ley/modding/dartcraft/Dartcraft.java index 5874668..22e9cd4 100644 --- a/src/main/java/ley/modding/dartcraft/Dartcraft.java +++ b/src/main/java/ley/modding/dartcraft/Dartcraft.java @@ -19,6 +19,7 @@ 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.handlers.TimeHandler; import ley.modding.dartcraft.internal.Registry; import ley.modding.dartcraft.item.DartItems; import ley.modding.dartcraft.network.PacketClipButton; @@ -55,6 +56,7 @@ public class Dartcraft { @Mod.EventHandler public void preInit(FMLPreInitializationEvent e) { MinecraftForge.EVENT_BUS.register(new EventHandler()); + MinecraftForge.EVENT_BUS.register(new TimeHandler()); channel = NetworkRegistry.INSTANCE.newSimpleChannel("dartcraft"); int desc = 0; channel.registerMessage( diff --git a/src/main/java/ley/modding/dartcraft/client/fx/FXCure.java b/src/main/java/ley/modding/dartcraft/client/fx/FXCure.java new file mode 100644 index 0000000..aaa8ddc --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/client/fx/FXCure.java @@ -0,0 +1,163 @@ +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 FXCure extends EntityFX { + public static final int TYPE_FALL = 0; + public static final int TYPE_CHANGE = 1; + public static final int TYPE_BREAK = 2; + private int iconIndex = 16; + private int changeTime; + private int type; + private Color color; + + public FXCure( + World world, double x, double y, double z, double vx, double vy, double vz + ) { + super(world, x, y, z, vx, vy, vz); + } + + public FXCure(World world, double x, double y, double z, int color, int type) { + super(world, x, y, z); + this.color = new Color(color); + this.particleRed = (float) this.color.getRed(); + this.particleGreen = (float) this.color.getGreen(); + this.particleBlue = (float) this.color.getBlue(); + this.setSize(0.01F, 0.01F); + this.changeTime = 0; + 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.25F; + 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) (10.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) (10.0D + * ((double) world.rand.nextFloat() * 0.2D + + 0.8999999761581421D)); + this.particleGravity = 0.5F; + } + } + + public void onUpdate() { + super.onUpdate(); + ++this.changeTime; + if (this.changeTime > 5) { + ++this.iconIndex; + this.changeTime = 0; + } + + if (this.iconIndex > 19) { + this.iconIndex = 16; + } + + this.rotationPitch += 0.01F; + switch (this.type) { + case 2: + 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, 1.0F + ); + 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/fx/FXWindWaker.java b/src/main/java/ley/modding/dartcraft/client/fx/FXWindWaker.java new file mode 100644 index 0000000..2120e0e --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/client/fx/FXWindWaker.java @@ -0,0 +1,158 @@ +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 FXWindWaker 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_SKATE = 3; + private int iconIndex; + + public FXWindWaker( + World world, double x, double y, double z, double vx, double vy, double vz + ) { + super(world, x, y, z, vx, vy, vz); + } + + public FXWindWaker(World world, double x, double y, double z, int color, int type) { + super(world, x, y, z); + Color col = new Color(color); + this.particleRed = (float) col.getRed(); + this.particleGreen = (float) col.getGreen(); + this.particleBlue = (float) col.getBlue(); + this.setSize(0.005F, 0.005F); + this.noClip = true; + this.iconIndex = 9 + this.rand.nextInt(3); + float velModifier; + switch (type) { + case 0: + this.motionX = this.motionZ = 0.0D; + this.motionY = -0.25D + this.rand.nextDouble() * 0.125D; + this.particleMaxAge = (int) (20.0D + * ((double) world.rand.nextFloat() * 0.2D + + 0.8999999761581421D)); + break; + case 1: + velModifier = 0.25F; + 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) (10.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) (10.0D + * ((double) world.rand.nextFloat() * 0.2D + + 0.8999999761581421D)); + this.particleGravity = 0.5F; + break; + case 3: + this.particleScale *= 0.33F; + 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) (10.0D + * ((double) world.rand.nextFloat() * 0.2D + + 0.8999999761581421D)); + this.particleGravity = 0.0F; + } + } + + public void onUpdate() { + super.onUpdate(); + } + + 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, 1.0F); + 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, 1.0F + ); + 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/entity/EntityTime.java b/src/main/java/ley/modding/dartcraft/entity/EntityTime.java index 874f0c8..64d3b2b 100644 --- a/src/main/java/ley/modding/dartcraft/entity/EntityTime.java +++ b/src/main/java/ley/modding/dartcraft/entity/EntityTime.java @@ -109,9 +109,7 @@ public class EntityTime extends Entity { ); this.worldObj.removeEntity(j); this.worldObj.spawnEntityInWorld(chance); - } - - if (j instanceof EntityItem) { + } else if (j instanceof EntityItem) { EntityItem var19 = (EntityItem) j; if (k.hasKey("timeImmune")) { k.setInteger( @@ -247,7 +245,7 @@ public class EntityTime extends Entity { this.posX, this.posY, this.posZ, - 80d + 80f ) ); } diff --git a/src/main/java/ley/modding/dartcraft/event/EventHandler.java b/src/main/java/ley/modding/dartcraft/event/EventHandler.java index ca8198b..b84ca2e 100644 --- a/src/main/java/ley/modding/dartcraft/event/EventHandler.java +++ b/src/main/java/ley/modding/dartcraft/event/EventHandler.java @@ -12,6 +12,7 @@ import net.minecraft.entity.passive.EntityChicken; import net.minecraft.entity.passive.EntityCow; import net.minecraft.entity.passive.EntityPig; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.event.entity.player.EntityInteractEvent; @@ -116,16 +117,14 @@ public class EventHandler { } ItemStack getDrop() { - // gotta use full names here, because tilera had the brilliant idea to call - // the mod item class "Items" switch (this) { case COW: - return new ItemStack(net.minecraft.init.Items.leather); + return new ItemStack(Items.leather); case PIG: // TODO: add bacon item - return new ItemStack(net.minecraft.init.Items.porkchop); + return new ItemStack(Items.porkchop); case CHICKEN: - return new ItemStack(net.minecraft.init.Items.feather); + return new ItemStack(Items.feather); // why is the compiler so stupid to think that this is required? default: diff --git a/src/main/java/ley/modding/dartcraft/handlers/TimeHandler.java b/src/main/java/ley/modding/dartcraft/handlers/TimeHandler.java new file mode 100644 index 0000000..c47ef2a --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/handlers/TimeHandler.java @@ -0,0 +1,143 @@ +package ley.modding.dartcraft.handlers; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import ley.modding.dartcraft.api.IBaneable; +import ley.modding.dartcraft.util.UpgradeHelper; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.event.entity.EntityEvent.CanUpdate; +import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; + +public class TimeHandler { + @SubscribeEvent + public void canUpdate(CanUpdate e) { + if (e.entity == null || e.entity.worldObj.isRemote) + return; + + try { + NBTTagCompound ex = UpgradeHelper.getDartData(e.entity); + if (ex.getInteger("timeImmune") > 0) { + return; + } + + if (ex.hasKey("time")) { + int type = ex.getInteger("time"); + int time = ex.getInteger("timeTime"); + switch (type) { + case 0: + default: + break; + case 1: + e.canUpdate = false; + break; + case 2: + if (time % 8 != 0) { + e.canUpdate = false; + } + break; + case 3: + e.canUpdate = true; + break; + case 4: + e.canUpdate = true; + } + } + + if (ex.hasKey("frozen")) { + e.canUpdate = false; + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + @SubscribeEvent + public void updateEntity(LivingUpdateEvent e) { + if (e.entity == null || e.entity.worldObj.isRemote) + return; + try { + + NBTTagCompound ex = UpgradeHelper.getDartData(e.entity); + if (ex.getInteger("timeImmune") > 0) { + return; + } + + if (ex.hasKey("time") && !ex.getBoolean("updateCalling")) { + int type = ex.getInteger("time"); + int time = ex.getInteger("timeTime"); + --time; + int i; + switch (type) { + case 0: + case 2: + default: + if (time % 8 != 0) { + e.entity.motionX = 0.0D; + e.entity.motionY = 0.0D; + e.entity.motionZ = 0.0D; + e.entity.posX = e.entity.prevPosX; + e.entity.posY = e.entity.prevPosY; + e.entity.posZ = e.entity.prevPosZ; + e.entity.rotationPitch = e.entity.prevRotationPitch; + e.entity.rotationYaw = e.entity.prevRotationYaw; + e.setCanceled(true); + --e.entity.hurtResistantTime; + } + break; + case 1: + e.entity.motionX = 0.0D; + e.entity.motionY = 0.0D; + e.entity.motionZ = 0.0D; + e.entity.posX = e.entity.prevPosX; + e.entity.posY = e.entity.prevPosY; + e.entity.posZ = e.entity.prevPosZ; + e.entity.rotationPitch = e.entity.prevRotationPitch; + e.entity.rotationYaw = e.entity.prevRotationYaw; + e.setCanceled(true); + --e.entity.hurtResistantTime; + if (e.entity instanceof EntityCreeper) { + EntityCreeper creep = (EntityCreeper) e.entity; + creep.fuseTime = 10; + creep.explosionRadius = 0; + } + + if (e.entity instanceof IBaneable) { + ((IBaneable) e.entity).setBaned(); + } + break; + case 3: + ex.setBoolean("updateCalling", true); + + for (i = 0; i < 3; ++i) { + e.entity.onUpdate(); + } + + ex.removeTag("updateCalling"); + break; + case 4: + ex.setBoolean("updateCalling", true); + + for (i = 0; i < 11; ++i) { + e.entity.onUpdate(); + } + + ex.removeTag("updateCalling"); + } + + // TODO: WTF + //if (e.entity instanceof EntityBeeSwarm && (type == 3 || type == 4)) { + // ((EntityBeeSwarm) e.entity).lifeTime += type == 3 ? 3 : 11; + //} + + if (time > 0) { + ex.setInteger("timeTime", time); + } else { + ex.removeTag("timeTime"); + ex.removeTag("time"); + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } +} diff --git a/src/main/java/ley/modding/dartcraft/integration/ThaumCraftIntegration.java b/src/main/java/ley/modding/dartcraft/integration/ThaumCraftIntegration.java new file mode 100644 index 0000000..103ed85 --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/integration/ThaumCraftIntegration.java @@ -0,0 +1,31 @@ +package ley.modding.dartcraft.integration; + +import ley.modding.dartcraft.proxy.CommonProxy; +import net.minecraft.tileentity.TileEntity; +import thaumcraft.api.aspects.Aspect; +import thaumcraft.common.tiles.TileDeconstructionTable; + +public class ThaumCraftIntegration { + public static final Aspect[] PRIMAL_ASPECTS + = { Aspect.AIR, Aspect.EARTH, Aspect.FIRE, + Aspect.WATER, Aspect.ORDER, Aspect.ENTROPY }; + + public static boolean isDeconstructorWithoutAspect(TileEntity tile) { + if (!(tile instanceof TileDeconstructionTable)) + return false; + + return ((TileDeconstructionTable) tile).aspect == null; + } + + /** + * Caller asserts that decon is a TileDeconstructionTable + */ + public static void setDeconAspect(TileEntity tile) { + TileDeconstructionTable table = (TileDeconstructionTable) tile; + + Aspect aspect = PRIMAL_ASPECTS[CommonProxy.rand.nextInt(PRIMAL_ASPECTS.length)]; + table.aspect = aspect; + table.markDirty(); + table.getWorldObj().markBlockForUpdate(table.xCoord, table.yCoord, table.zCoord); + } +} diff --git a/src/main/java/ley/modding/dartcraft/network/PacketFX.java b/src/main/java/ley/modding/dartcraft/network/PacketFX.java index 9dd8b63..99d3760 100644 --- a/src/main/java/ley/modding/dartcraft/network/PacketFX.java +++ b/src/main/java/ley/modding/dartcraft/network/PacketFX.java @@ -8,6 +8,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import ley.modding.dartcraft.util.FXUtils; +import net.minecraft.world.World; public class PacketFX implements IMessage { public double x; @@ -58,7 +59,10 @@ public class PacketFX implements IMessage { } public static enum Type { - TIME; + TIME, + CHANGE, + CURE, + HEAT; public static Type fromInt(int i) { if (i >= 0 && i < Type.values().length) @@ -71,18 +75,38 @@ public class PacketFX implements IMessage { @Override @SideOnly(Side.CLIENT) public IMessage onMessage(PacketFX pkt, MessageContext ctx) { + World world = FMLClientHandler.instance().getClientPlayerEntity().worldObj; switch (pkt.type) { case TIME: FXUtils.makeTimeEffects( - FMLClientHandler.instance().getClientPlayerEntity().worldObj, + world, pkt.x, pkt.y, pkt.z, pkt.subType, pkt.amount, pkt.area + ); + break; + + case CHANGE: + FXUtils.makeWWEffects( + world, pkt.x, pkt.y, pkt.z, - 1, + 0xffffff, + pkt.subType, pkt.amount, pkt.area ); break; + + case CURE: + FXUtils.makeCureEffects( + world, pkt.x, pkt.y, pkt.z, pkt.subType, 0x4bb218, pkt.amount + ); + break; + + case HEAT: + FXUtils.makeHeatEffects( + world, pkt.x, pkt.y, pkt.z, pkt.amount, pkt.area + ); + break; } return null; diff --git a/src/main/java/ley/modding/dartcraft/tile/TileEntityForceTorch.java b/src/main/java/ley/modding/dartcraft/tile/TileEntityForceTorch.java index 9ee1fe1..5fd1856 100644 --- a/src/main/java/ley/modding/dartcraft/tile/TileEntityForceTorch.java +++ b/src/main/java/ley/modding/dartcraft/tile/TileEntityForceTorch.java @@ -3,9 +3,12 @@ package ley.modding.dartcraft.tile; import java.util.List; import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import ley.modding.dartcraft.Config; import ley.modding.dartcraft.Dartcraft; import ley.modding.dartcraft.entity.EntityTime; +import ley.modding.dartcraft.integration.ThaumCraftIntegration; +import ley.modding.dartcraft.network.PacketFX; import ley.modding.dartcraft.util.DartUtils; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.boss.EntityWither; @@ -78,14 +81,28 @@ public class TileEntityForceTorch extends TileEntity { if (entity.getHealth() < entityUpgrades) { entity.heal((float) (tile * 2)); k = true; - // TODO - //PacketHelper.sendCureFXToClients( - // entity, 8 * tile - //); + + Dartcraft.channel.sendToAllAround( + new PacketFX( + entity.posX, + entity.posY + (entity.height / 2d), + entity.posZ, + PacketFX.Type.CURE, + 2, + 0, + 8 * tile + ), + new TargetPoint( + this.worldObj.provider.dimensionId, + entity.posX, + entity.posY, + entity.posZ, + 80f + ) + ); } } else { - // TODO - //entity.attackEntityFrom(PunishDamage.instance, 2.0F); + entity.attackEntityFrom(DamageSource.magic, 2f); } if (k) { @@ -120,17 +137,33 @@ public class TileEntityForceTorch extends TileEntity { ); 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); + for (EntityLivingBase remEnt : j) { + if ((remEnt instanceof EntityMob + || remEnt instanceof EntitySlime + || remEnt instanceof EntityGhast) + && !(remEnt instanceof EntityWitch) + && !(remEnt instanceof EntityWither)) { + this.worldObj.removeEntity(remEnt); k = true; - // TODO - //PacketHelper.sendChangeFXToClients(var18, 16); + + Dartcraft.channel.sendToAllAround( + new PacketFX( + remEnt.posX, + remEnt.posY + (remEnt.height / 2d), + remEnt.posZ, + PacketFX.Type.CHANGE, + 1, + 0, + 16 + ), + new TargetPoint( + this.worldObj.provider.dimensionId, + remEnt.posX, + remEnt.posY + (remEnt.height / 2d), + remEnt.posZ, + 80f + ) + ); } } @@ -181,9 +214,25 @@ public class TileEntityForceTorch extends TileEntity { DamageSource.inFire, 0.5F * (float) tile ); k = true; - // TODO - //PacketHelper.sendHeatFXToClients(entity, 8 * tile, - //0); + + Dartcraft.channel.sendToAllAround( + new PacketFX( + entity.posX, + entity.posY + (entity.height / 2d), + entity.posZ, + PacketFX.Type.HEAT, + 0, + 0, + 8 * tile + ), + new TargetPoint( + this.worldObj.provider.dimensionId, + entity.posX, + entity.posY, + entity.posZ, + 80f + ) + ); } } } @@ -205,23 +254,24 @@ public class TileEntityForceTorch extends TileEntity { if (this.upgrades.hasKey("Repair") && Loader.isModLoaded("Thaumcraft")) { try { + outer: 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( + TileEntity tile = 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; - //} + + if (ThaumCraftIntegration + .isDeconstructorWithoutAspect(tile)) { + ThaumCraftIntegration.setDeconAspect(tile); + break outer; + } } } } diff --git a/src/main/java/ley/modding/dartcraft/util/FXUtils.java b/src/main/java/ley/modding/dartcraft/util/FXUtils.java index ab80372..4f2e581 100644 --- a/src/main/java/ley/modding/dartcraft/util/FXUtils.java +++ b/src/main/java/ley/modding/dartcraft/util/FXUtils.java @@ -8,8 +8,10 @@ import org.lwjgl.opengl.GL11; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ley.modding.dartcraft.Dartcraft; +import ley.modding.dartcraft.client.fx.FXCure; import ley.modding.dartcraft.client.fx.FXDisney; import ley.modding.dartcraft.client.fx.FXTime; +import ley.modding.dartcraft.client.fx.FXWindWaker; import ley.modding.dartcraft.proxy.CommonProxy; import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.particle.EntityFireworkStarterFX; @@ -155,23 +157,17 @@ public class FXUtils { if (!Dartcraft.proxy.isSimulating(world)) { for (int i = 0; i < number; ++i) { double var19 = (double) i / ((double) number - 1.0D); - CommonProxy var10000 = Dartcraft.proxy; float var21 = (CommonProxy.rand.nextFloat() - 0.5F) * 0.2F; - var10000 = Dartcraft.proxy; float var22 = (CommonProxy.rand.nextFloat() - 0.5F) * 0.2F; - var10000 = Dartcraft.proxy; float var23 = (CommonProxy.rand.nextFloat() - 0.5F) * 0.2F; double var221 = prevX + (entity.posX - prevX) * var19; - CommonProxy var10001 = Dartcraft.proxy; double var24 = var221 + (CommonProxy.rand.nextDouble() - 0.5D) * (double) entity.width * 2.0D; var221 = prevY + (entity.posY - prevY) * var19; - var10001 = Dartcraft.proxy; double var26 = var221 + CommonProxy.rand.nextDouble() * (double) entity.height; var221 = prevZ + (entity.posZ - prevZ) * var19; - var10001 = Dartcraft.proxy; double var28 = var221 + (CommonProxy.rand.nextDouble() - 0.5D) * (double) entity.width * 2.0D; @@ -246,24 +242,18 @@ public class FXUtils { World world, double x2, double y2, double z2, int type, int particles ) { float modifier = 0.5F; - float velModifier = 1.0F; EffectRenderer renderer = Dartcraft.proxy.getClientInstance().effectRenderer; for (int i = 0; i < particles; ++i) { - CommonProxy var10001 = Dartcraft.proxy; float x = (float) (x2 + (double) (CommonProxy.rand.nextFloat() * modifier) - (double) (modifier / 2.0F)); - var10001 = Dartcraft.proxy; float y = (float) (y2 + (double) (CommonProxy.rand.nextFloat() * modifier) - (double) (modifier / 2.0F)); - var10001 = Dartcraft.proxy; float z = (float) (z2 + (double) (CommonProxy.rand.nextFloat() * modifier) - (double) (modifier / 2.0F)); - // TODO - //renderer.addEffect( - // new FXWindWaker(world, (double) x, (double) y, (double) z, 16777215, - // type) - //); + renderer.addEffect( + new FXWindWaker(world, (double) x, (double) y, (double) z, 0xffffff, type) + ); } } @@ -274,17 +264,12 @@ public class FXUtils { float modifier = 1.0F; for (int i = 0; i < particles; ++i) { - CommonProxy var10001 = Dartcraft.proxy; float x2 = (float) (x + (double) (CommonProxy.rand.nextFloat() * modifier)); - var10001 = Dartcraft.proxy; float y2 = (float) (y + (double) (CommonProxy.rand.nextFloat() * modifier)); - var10001 = Dartcraft.proxy; float z2 = (float) (z + (double) (CommonProxy.rand.nextFloat() * modifier)); - // TODO - //renderer.addEffect( - // new FXWindWaker(world, (double) x2, (double) y2, (double) z2, '\ue4ff', - // 0) - //); + renderer.addEffect( + new FXWindWaker(world, (double) x2, (double) y2, (double) z2, '\ue4ff', 0) + ); } } @@ -295,17 +280,12 @@ public class FXUtils { float modifier = 1.0F; for (int i = 0; i < particles; ++i) { - CommonProxy var10001 = Dartcraft.proxy; float x2 = (float) (x + (double) (CommonProxy.rand.nextFloat() * modifier)); - var10001 = Dartcraft.proxy; float y2 = (float) (y + (double) (CommonProxy.rand.nextFloat() * modifier)); - var10001 = Dartcraft.proxy; float z2 = (float) (z + (double) (CommonProxy.rand.nextFloat() * modifier)); - // TODO - //renderer.addEffect( - // new FXWindWaker(world, (double) x2, (double) y2, (double) z2, '\ue4ff', - // 3) - //); + renderer.addEffect( + new FXWindWaker(world, (double) x2, (double) y2, (double) z2, '\ue4ff', 3) + ); } } @@ -407,16 +387,15 @@ public class FXUtils { EffectRenderer renderer = Dartcraft.proxy.getClientInstance().effectRenderer; for (int i = 0; i < num; ++i) { - // TODO - //FXCure fx = new FXCure( - // world, - // x + world.rand.nextDouble() - world.rand.nextDouble(), - // y + world.rand.nextDouble() - world.rand.nextDouble(), - // z + world.rand.nextDouble() - world.rand.nextDouble(), - // color, - // type - //); - //renderer.addEffect(fx); + FXCure fx = new FXCure( + world, + x + world.rand.nextDouble() - world.rand.nextDouble(), + y + world.rand.nextDouble() - world.rand.nextDouble(), + z + world.rand.nextDouble() - world.rand.nextDouble(), + color, + type + ); + renderer.addEffect(fx); } } @@ -544,35 +523,33 @@ 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 - //FXWindWaker fx1 = new FXWindWaker( - // 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(), - // color, - // type - //); - //renderer.addEffect(fx1); + FXWindWaker fx1 = new FXWindWaker( + 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(), + color, + type + ); + renderer.addEffect(fx1); } } } } } else { for (i = 0; i < num; ++i) { - // TODO - //FXWindWaker var17 = new FXWindWaker( - // world, - // x + world.rand.nextDouble() - world.rand.nextDouble(), - // y + world.rand.nextDouble() - world.rand.nextDouble(), - // z + world.rand.nextDouble() - world.rand.nextDouble(), - // color, - // type - //); - //renderer.addEffect(var17); + FXWindWaker var17 = new FXWindWaker( + world, + x + world.rand.nextDouble() - world.rand.nextDouble(), + y + world.rand.nextDouble() - world.rand.nextDouble(), + z + world.rand.nextDouble() - world.rand.nextDouble(), + color, + type + ); + renderer.addEffect(var17); } } } diff --git a/src/main/resources/META-INF/dartcraft_at.cfg b/src/main/resources/META-INF/dartcraft_at.cfg new file mode 100644 index 0000000..d018fc9 --- /dev/null +++ b/src/main/resources/META-INF/dartcraft_at.cfg @@ -0,0 +1,2 @@ +public net.minecraft.entity.monster.EntityCreeper field_82225_f # fuseTime +public net.minecraft.entity.monster.EntityCreeper field_82226_g # explosionRadius diff --git a/src/main/resources/assets/dartcraft/sounds.json b/src/main/resources/assets/dartcraft/sounds.json index aea587e..6c45a19 100644 --- a/src/main/resources/assets/dartcraft/sounds.json +++ b/src/main/resources/assets/dartcraft/sounds.json @@ -1,6 +1,64 @@ { - "bottle": {"category": "master","sounds": [{"name": "bottle","stream": false}]}, - "swipe": {"category": "master","sounds": [{"name": "swipe","stream": false}]}, - "fly": {"category": "master","sounds": [{"name": "fly1","stream": false}, {"name": "fly2","stream": false}, {"name": "fly3","stream": false}]}, - "nope": {"category": "master","sounds": [{"name": "nope","stream": false}]} + "bottle": { + "category": "master", + "sounds": [ + { + "name": "bottle", + "stream": false + } + ] + }, + "cure": { + "category": "master", + "sounds": [ + { + "name": "cure", + "stream": false + } + ] + }, + "fly": { + "category": "master", + "sounds": [ + { + "name": "fly1", + "stream": false + }, + { + "name": "fly2", + "stream": false + }, + { + "name": "fly3", + "stream": false + } + ] + }, + "ignite": { + "category": "master", + "sounds": [ + { + "name": "ignite", + "stream": false + } + ] + }, + "nope": { + "category": "master", + "sounds": [ + { + "name": "nope", + "stream": false + } + ] + }, + "swipe": { + "category": "master", + "sounds": [ + { + "name": "swipe", + "stream": false + } + ] + } } diff --git a/src/main/resources/assets/dartcraft/sounds/cure.ogg b/src/main/resources/assets/dartcraft/sounds/cure.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b2a26107b8c243208a9a93f8b6a3b8249eed9e0a GIT binary patch literal 19674 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dartcraft/sounds/ignite.ogg b/src/main/resources/assets/dartcraft/sounds/ignite.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9063eeb89a45e50f3d101dc1ceec32446abb351e GIT binary patch literal 7000 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 Jt|_Dn{ST1a5;gz; literal 0 HcmV?d00001