From fa6ad449f0cab9f22da6d134aabc009408ab70c5 Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Sat, 13 Apr 2024 20:54:29 +0200 Subject: [PATCH] feat: implement planks, slabs and particles --- .../dartcraft/block/BlockForceBrick.java | 26 +- .../dartcraft/block/BlockForceLog.java | 16 ++ .../dartcraft/block/BlockForcePlanks.java | 18 ++ .../dartcraft/block/BlockForceSlab.java | 263 ++++++++++++++++++ .../modding/dartcraft/block/DartBlocks.java | 4 + .../modding/dartcraft/client/fx/FXDisney.java | 160 +++++++++++ ...ck.java => AbstractItemBlockMetadata.java} | 10 +- .../modding/dartcraft/proxy/ClientProxy.java | 6 +- .../dartcraft/tile/TileEntityStairs.java | 46 +++ .../ley/modding/dartcraft/util/DartUtils.java | 12 +- .../ley/modding/dartcraft/util/FXUtils.java | 20 +- .../resources/assets/dartcraft/darticles.png | Bin 0 -> 21940 bytes .../assets/dartcraft/lang/en_US.lang | 18 ++ .../assets/dartcraft/textures/blocks/wood.png | Bin 0 -> 3058 bytes 14 files changed, 570 insertions(+), 29 deletions(-) create mode 100644 src/main/java/ley/modding/dartcraft/block/BlockForcePlanks.java create mode 100644 src/main/java/ley/modding/dartcraft/block/BlockForceSlab.java create mode 100644 src/main/java/ley/modding/dartcraft/client/fx/FXDisney.java rename src/main/java/ley/modding/dartcraft/item/{ItemBlockForceBrick.java => AbstractItemBlockMetadata.java} (60%) create mode 100644 src/main/java/ley/modding/dartcraft/tile/TileEntityStairs.java create mode 100644 src/main/resources/assets/dartcraft/darticles.png create mode 100644 src/main/resources/assets/dartcraft/textures/blocks/wood.png diff --git a/src/main/java/ley/modding/dartcraft/block/BlockForceBrick.java b/src/main/java/ley/modding/dartcraft/block/BlockForceBrick.java index 913092a..74bfddb 100644 --- a/src/main/java/ley/modding/dartcraft/block/BlockForceBrick.java +++ b/src/main/java/ley/modding/dartcraft/block/BlockForceBrick.java @@ -5,7 +5,7 @@ import java.util.stream.IntStream; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import ley.modding.dartcraft.item.ItemBlockForceBrick; +import ley.modding.dartcraft.item.AbstractItemBlockMetadata; import ley.modding.dartcraft.util.DartUtils; import ley.modding.dartcraft.util.FXUtils; import ley.modding.dartcraft.util.Util; @@ -99,13 +99,13 @@ public class BlockForceBrick extends Block implements ICustomItemBlockProvider { } } - // TODO: WTF - //@Override + @Override @SideOnly(Side.CLIENT) - public boolean addBlockDestroyEffects( + public boolean addDestroyEffects( World world, int x, int y, int z, int meta, EffectRenderer renderer ) { int color = world.getBlockMetadata(x, y, z); + System.out.println("ALEC: " + color + " " + Integer.toHexString(DartUtils.getMcColor(color))); FXUtils.makeShiny( world, (double) x, @@ -119,10 +119,9 @@ public class BlockForceBrick extends Block implements ICustomItemBlockProvider { return true; } - // TODO: WTF - //@Override + @Override @SideOnly(Side.CLIENT) - public boolean addBlockHitEffects( + public boolean addHitEffects( World world, MovingObjectPosition target, EffectRenderer renderer ) { int color = world.getBlockMetadata(target.blockX, target.blockY, target.blockZ); @@ -150,6 +149,17 @@ public class BlockForceBrick extends Block implements ICustomItemBlockProvider { @Override public Class getItemBlockClass() { - return ItemBlockForceBrick.class; + return BlockItem.class; + } + + public static class BlockItem extends AbstractItemBlockMetadata { + public BlockItem(Block block) { + super(block); + } + + @Override + public String getID() { + return "forcebrick"; + } } } diff --git a/src/main/java/ley/modding/dartcraft/block/BlockForceLog.java b/src/main/java/ley/modding/dartcraft/block/BlockForceLog.java index bda653a..4758a65 100644 --- a/src/main/java/ley/modding/dartcraft/block/BlockForceLog.java +++ b/src/main/java/ley/modding/dartcraft/block/BlockForceLog.java @@ -5,6 +5,7 @@ import ley.modding.dartcraft.util.Util; import net.minecraft.block.BlockLog; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; public class BlockForceLog extends BlockLog { private IIcon sideIcon; @@ -29,4 +30,19 @@ public class BlockForceLog extends BlockLog { protected IIcon getSideIcon(int p_150163_1_) { return this.sideIcon; } + + @Override + public boolean canSustainLeaves(IBlockAccess arg0, int arg1, int arg2, int arg3) { + return true; + } + + @Override + public boolean canBeReplacedByLeaves(IBlockAccess arg0, int arg1, int arg2, int arg3) { + return false; + } + + @Override + public boolean isWood(IBlockAccess arg0, int arg1, int arg2, int arg3) { + return true; + } } diff --git a/src/main/java/ley/modding/dartcraft/block/BlockForcePlanks.java b/src/main/java/ley/modding/dartcraft/block/BlockForcePlanks.java new file mode 100644 index 0000000..3e22c63 --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/block/BlockForcePlanks.java @@ -0,0 +1,18 @@ +package ley.modding.dartcraft.block; + +import ley.modding.dartcraft.util.Util; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; + +public class BlockForcePlanks extends Block { + public BlockForcePlanks() { + super(Material.wood); + Util.configureBlock(this, "forceplanks"); + } + + @Override + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg.registerIcon("dartcraft:wood"); + } +} diff --git a/src/main/java/ley/modding/dartcraft/block/BlockForceSlab.java b/src/main/java/ley/modding/dartcraft/block/BlockForceSlab.java new file mode 100644 index 0000000..c8ada1a --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/block/BlockForceSlab.java @@ -0,0 +1,263 @@ +package ley.modding.dartcraft.block; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.IntStream; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ley.modding.dartcraft.Dartcraft; +import ley.modding.dartcraft.item.AbstractItemBlockMetadata; +import ley.modding.dartcraft.tile.TileEntityStairs; +import ley.modding.dartcraft.util.DartUtils; +import ley.modding.dartcraft.util.FXUtils; +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.BlockSlab; +import net.minecraft.block.material.Material; +import net.minecraft.client.particle.EffectRenderer; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockForceSlab + extends BlockSlab implements ITEProvider, ICustomItemBlockProvider { + public BlockForceSlab() { + super(false, Material.rock); + Util.configureBlock(this, "forceslab"); + this.setHardness(2.0F); + this.setResistance(2000.0F); + this.setStepSound(Block.soundTypeStone); + this.setLightOpacity(0); + // TODO: WTF + //Block.useNeighborBrightness[id] = true; + } + + // TODO: WTF + //@Override + //public String getFullSlabName(int var1) { + // return "forceSlab"; + //} + + @Override + public ItemStack getPickBlock( + MovingObjectPosition arg0, + World arg1, + int arg2, + int arg3, + int arg4, + EntityPlayer arg5 + ) { + return new ItemStack(this); + } + + @Override + @SideOnly(Side.CLIENT) + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void getSubBlocks(Item id, CreativeTabs tab, List list) { + IntStream.range(0, 17) + .mapToObj(i -> new ItemStack(this, 1, i)) + .forEach(list::add); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered( + IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5 + ) { + return !( + par5 != 1 && par5 != 0 + && !super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5) + ); + } + + @Override + public boolean + canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) { + return false; + } + + @Override + public boolean hasTileEntity(int meta) { + return true; + } + + @Override + public TileEntity createTileEntity(World world, int meta) { + return new TileEntityStairs(); + } + + public static TileEntityStairs getStairTile(IBlockAccess world, int x, int y, int z) { + TileEntity tile = world.getTileEntity(x, y, z); + return tile != null && tile instanceof TileEntityStairs ? (TileEntityStairs) tile + : null; + } + + @Override + public boolean + removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean alec) { + int meta = world.getBlockMetadata(x, y, z); + if (Dartcraft.proxy.isSimulating(world) && this.canHarvestBlock(player, meta) + && !player.capabilities.isCreativeMode) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntityStairs) { + TileEntityStairs stairs = (TileEntityStairs) tile; + ItemStack stack = new ItemStack(this, 1, stairs.color); + DartUtils.dropItem(stack, world, (double) x, (double) y, (double) z); + } + } + + return world.setBlockToAir(x, y, z); + } + + @Override + public ArrayList + getDrops(World alec1, int alec2, int alec3, int alec4, int alec5, int alec6) { + return new ArrayList<>(); + } + + @Override + public int onBlockPlaced( + World world, + int x, + int y, + int z, + int par5, + float par6, + float par7, + float par8, + int par9 + ) { + TileEntityStairs stairs = getStairTile(world, x, y, z); + if (stairs != null) { + stairs.color = world.getBlockMetadata(x, y, z); + stairs.markDirty(); + } + + return par5 != 0 && (par5 == 1 || (double) par7 <= 0.5D) ? 0 : 8; + } + + @Override + public void onBlockPlacedBy( + World par1World, + int par2, + int par3, + int par4, + EntityLivingBase entity, + ItemStack stack + ) { + TileEntityStairs stairs = getStairTile(par1World, par2, par3, par4); + if (stack != null && stairs != null) { + stairs.color = stack.getItemDamage(); + stairs.markDirty(); + } + + super.onBlockPlacedBy(par1World, par2, par3, par4, entity, stack); + } + + @Override + public IIcon getIcon(int alec, int meta) { + return meta == 16 ? DartBlocks.forceplanks.getIcon(0, 0) + : ((BlockForceBrick) DartBlocks.forcebrick).icons[meta]; + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntityStairs stairs = getStairTile(world, x, y, z); + if (stairs != null && stairs.color >= 0) { + if (stairs.color < 16) { + return ((BlockForceBrick) DartBlocks.forcebrick).icons[stairs.color]; + } + + if (stairs.color == 16) { + return DartBlocks.forceplanks.getIcon(0, 0); + } + } + + return this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean addDestroyEffects( + World world, int x, int y, int z, int meta, EffectRenderer renderer + ) { + TileEntityStairs stairs = getStairTile(world, x, y, z); + if (stairs != null) { + FXUtils.makeShiny( + world, + (double) x, + (double) y, + (double) z, + 2, + DartUtils.getMcColor(stairs.color), + 32, + true + ); + return true; + } else { + return false; + } + } + + @Override + @SideOnly(Side.CLIENT) + public boolean addHitEffects( + World world, MovingObjectPosition target, EffectRenderer renderer + ) { + TileEntityStairs stairs + = getStairTile(world, target.blockX, target.blockY, target.blockZ); + if (stairs != null) { + FXUtils.makeShiny( + world, + (double) target.blockX, + (double) target.blockY, + (double) target.blockZ, + 2, + DartUtils.getMcColor(stairs.color), + 4, + true + ); + return true; + } else { + return false; + } + } + + @Override + public Class getTEClass() { + return TileEntityStairs.class; + } + + @Override + public String func_150002_b(int arg0) { + throw new UnsupportedOperationException("ALEC"); + } + + @Override + public Class getItemBlockClass() { + return BlockItem.class; + } + + public static class BlockItem extends AbstractItemBlockMetadata { + public BlockItem(Block block) { + super(block); + } + + @Override + public String getID() { + return "forceslab"; + } + } +} diff --git a/src/main/java/ley/modding/dartcraft/block/DartBlocks.java b/src/main/java/ley/modding/dartcraft/block/DartBlocks.java index 23a3945..b145d91 100644 --- a/src/main/java/ley/modding/dartcraft/block/DartBlocks.java +++ b/src/main/java/ley/modding/dartcraft/block/DartBlocks.java @@ -10,7 +10,9 @@ public class DartBlocks { public static Block forcebrick; public static Block forceleaves; public static Block forcelog; + public static Block forceplanks; public static Block forcesapling; + public static Block forceslab; public static Block liquidforce; public static Block powerore; @@ -25,7 +27,9 @@ public class DartBlocks { DartBlocks.forcebrick = reg.registerBlock(new BlockForceBrick()); DartBlocks.forceleaves = reg.registerBlock(new BlockForceLeaves()); DartBlocks.forcelog = reg.registerBlock(new BlockForceLog()); + DartBlocks.forceplanks = reg.registerBlock(new BlockForcePlanks()); DartBlocks.forcesapling = reg.registerBlock(new BlockForceSapling()); + DartBlocks.forceslab = reg.registerBlock(new BlockForceSlab()); 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 new file mode 100644 index 0000000..6733ba1 --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/client/fx/FXDisney.java @@ -0,0 +1,160 @@ +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.particle.EntityFX; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.world.World; + +public class FXDisney 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 = 0; + private int changeTime; + private int type; + private Color color; + + public FXDisney( + World world, double x, double y, double z, double vx, double vy, double vz + ) { + super(world, x, y, z, vx, vy, vz); + } + + public FXDisney(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()) / 255f; + this.particleGreen = ((float) this.color.getGreen()) / 255f; + this.particleBlue = ((float) this.color.getBlue()) / 255f; + 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; + } + } + + @Override + public void onUpdate() { + super.onUpdate(); + ++this.changeTime; + if (this.changeTime > 5) { + ++this.iconIndex; + this.changeTime = 0; + } + + if (this.iconIndex > 4) { + this.iconIndex = 0; + } + + switch (this.type) { + case 2: + default: + } + } + + @Override + 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 + - EntityFX.interpPosX); + float var14 = (float) (this.prevPosY + (this.posY - this.prevPosY) * (double) par2 + - EntityFX.interpPosY); + float var15 = (float) (this.prevPosZ + (this.posZ - this.prevPosZ) * (double) par2 + - EntityFX.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(); + Dartcraft.proxy.bindTexture("textures/particle/particles.png"); + tessy.startDrawingQuads(); + } +} diff --git a/src/main/java/ley/modding/dartcraft/item/ItemBlockForceBrick.java b/src/main/java/ley/modding/dartcraft/item/AbstractItemBlockMetadata.java similarity index 60% rename from src/main/java/ley/modding/dartcraft/item/ItemBlockForceBrick.java rename to src/main/java/ley/modding/dartcraft/item/AbstractItemBlockMetadata.java index 7a01b5d..1883685 100644 --- a/src/main/java/ley/modding/dartcraft/item/ItemBlockForceBrick.java +++ b/src/main/java/ley/modding/dartcraft/item/AbstractItemBlockMetadata.java @@ -5,13 +5,15 @@ import net.minecraft.block.Block; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; -public class ItemBlockForceBrick extends ItemBlock { - public ItemBlockForceBrick(Block block) { +public abstract class AbstractItemBlockMetadata extends ItemBlock { + public AbstractItemBlockMetadata(Block block) { super(block); - Util.configureItem(this, "forcebrick"); + Util.configureItem(this, this.getID()); this.setHasSubtypes(true); } + public abstract String getID(); + @Override public int getMetadata(int damage) { return damage; @@ -19,6 +21,6 @@ public class ItemBlockForceBrick extends ItemBlock { @Override public String getUnlocalizedName(ItemStack stack) { - return "tile.forcebrick" + stack.getItemDamage(); + return "tile." + this.getID() + stack.getItemDamage(); } } diff --git a/src/main/java/ley/modding/dartcraft/proxy/ClientProxy.java b/src/main/java/ley/modding/dartcraft/proxy/ClientProxy.java index e06952b..7412159 100644 --- a/src/main/java/ley/modding/dartcraft/proxy/ClientProxy.java +++ b/src/main/java/ley/modding/dartcraft/proxy/ClientProxy.java @@ -26,17 +26,20 @@ import net.minecraftforge.client.MinecraftForgeClient; public class ClientProxy extends CommonProxy { public static RenderTileForceEngine engineRender; + @Override public boolean isSimulating(World world) { return world != null && !world.isRemote; } + @Override public void bindTexture(String texture) { if (texture != null) - getClientInstance().getTextureManager().bindTexture( + this.getClientInstance().getTextureManager().bindTexture( new ResourceLocation(Dartcraft.MODID, texture) ); } + @Override public void init() { super.init(); MinecraftForgeClient.registerItemRenderer( @@ -77,6 +80,7 @@ public class ClientProxy extends CommonProxy { ); } + @Override public void sendPacketToServer(DartPacket packet) { try { Dartcraft.channel.sendToServer(packet); diff --git a/src/main/java/ley/modding/dartcraft/tile/TileEntityStairs.java b/src/main/java/ley/modding/dartcraft/tile/TileEntityStairs.java new file mode 100644 index 0000000..21fa8a5 --- /dev/null +++ b/src/main/java/ley/modding/dartcraft/tile/TileEntityStairs.java @@ -0,0 +1,46 @@ +package ley.modding.dartcraft.tile; + +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; + +public class TileEntityStairs extends TileEntity { + public int color; + + @Override + public boolean canUpdate() { + return false; + } + + @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 nm, S35PacketUpdateTileEntity pkt) { + this.readFromNBT(pkt.func_148857_g()); + } + + @Override + public void readFromNBT(NBTTagCompound comp) { + super.readFromNBT(comp); + if (comp.hasKey("color")) { + this.color = comp.getInteger("color"); + } + } + + @Override + public void writeToNBT(NBTTagCompound comp) { + super.writeToNBT(comp); + comp.setInteger("color", this.color); + } +} diff --git a/src/main/java/ley/modding/dartcraft/util/DartUtils.java b/src/main/java/ley/modding/dartcraft/util/DartUtils.java index d80d948..014bc9d 100644 --- a/src/main/java/ley/modding/dartcraft/util/DartUtils.java +++ b/src/main/java/ley/modding/dartcraft/util/DartUtils.java @@ -104,24 +104,24 @@ public class DartUtils { public static int getMcColor(int color) { int[] lookup = new int[] { - 0x333333, + 0xff333333, Color.red.getRGB(), Color.green.getRGB(), - 0x6e5334, + 0xff6e5334, Color.blue.getRGB(), - 0x6b47b8, + 0xff6b47b8, Color.cyan.getRGB(), Color.lightGray.getRGB(), Color.gray.getRGB(), Color.pink.getRGB(), - 0x9ed843, + 0xff9ed843, Color.yellow.getRGB(), - 0x51a8f4, + 0xff51a8f4, Color.magenta.getRGB(), Color.orange.getRGB(), Color.white.getRGB(), }; - return color > 0 && color < lookup.length ? lookup[color] : 0; + return color >= 0 && color < lookup.length ? lookup[color] : 0; } } diff --git a/src/main/java/ley/modding/dartcraft/util/FXUtils.java b/src/main/java/ley/modding/dartcraft/util/FXUtils.java index 0a9062d..9e3b609 100644 --- a/src/main/java/ley/modding/dartcraft/util/FXUtils.java +++ b/src/main/java/ley/modding/dartcraft/util/FXUtils.java @@ -8,6 +8,7 @@ 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.FXDisney; import ley.modding.dartcraft.proxy.CommonProxy; import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.particle.EntityFireworkStarterFX; @@ -386,16 +387,15 @@ public class FXUtils { } for (int i = 0; i < num; ++i) { - // TODO: WTF - //FXDisney fx = new FXDisney( - // world, - // x + offset + world.rand.nextDouble() - world.rand.nextDouble(), - // y + world.rand.nextDouble() - world.rand.nextDouble(), - // z + offset + world.rand.nextDouble() - world.rand.nextDouble(), - // color, - // type - //); - //renderer.addEffect(fx); + FXDisney fx = new FXDisney( + world, + x + offset + world.rand.nextDouble() - world.rand.nextDouble(), + y + world.rand.nextDouble() - world.rand.nextDouble(), + z + offset + world.rand.nextDouble() - world.rand.nextDouble(), + color, + type + ); + renderer.addEffect(fx); } } diff --git a/src/main/resources/assets/dartcraft/darticles.png b/src/main/resources/assets/dartcraft/darticles.png new file mode 100644 index 0000000000000000000000000000000000000000..75904910fe4ee68791a7d12f1b192bbebc78900d GIT binary patch literal 21940 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 Ta+s@cu>d-nh8i_$=!ky-j(CdJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dartcraft/lang/en_US.lang b/src/main/resources/assets/dartcraft/lang/en_US.lang index 416769f..ed31025 100644 --- a/src/main/resources/assets/dartcraft/lang/en_US.lang +++ b/src/main/resources/assets/dartcraft/lang/en_US.lang @@ -20,6 +20,7 @@ tile.forceleaves.name=Force Leaves tile.forcesapling.name=Force Sapling tile.forcepickaxe.name=Force Pickaxe +tile.forceplanks.name=Force Planks tile.forcebrick0.name=Black Force Brick tile.forcebrick1.name=Red Force Brick tile.forcebrick2.name=Green Force Brick @@ -36,5 +37,22 @@ 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 +tile.forceslab3.name=Brown Force Slab +tile.forceslab4.name=Blue Force Slab +tile.forceslab5.name=Purple Force Slab +tile.forceslab6.name=Cyan Force Slab +tile.forceslab7.name=Light Gray Force Slab +tile.forceslab8.name=Gray Force Slab +tile.forceslab9.name=Pink Force Slab +tile.forceslab10.name=Lime Force Slab +tile.forceslab11.name=Yellow Force Slab +tile.forceslab12.name=Light Blue Force Slab +tile.forceslab13.name=Magenta Force Slab +tile.forceslab14.name=Orange Force Slab +tile.forceslab15.name=White Force Slab +tile.forceslab16.name=Wooden Force Slab itemGroup.dartcraft=Dartcraft diff --git a/src/main/resources/assets/dartcraft/textures/blocks/wood.png b/src/main/resources/assets/dartcraft/textures/blocks/wood.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e25e46fc93c09c38b20a44139596336406ec1b GIT binary patch literal 3058 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 Al>h($ literal 0 HcmV?d00001