From c7d08045d888eb5badff7980f95ec35e96484d6b Mon Sep 17 00:00:00 2001 From: JackCarterSmith Date: Sat, 24 Mar 2018 22:00:15 +0100 Subject: [PATCH] Finaly, first model render of Defender --- .../orbsat/client/ClientProxy.java | 10 + .../orbsat/client/model/ModelDefender.java | 106 ++++++++ .../client/render/block/RenderDefender.java | 44 +++ .../render/tile/RenderTileDefender.java | 52 ++++ .../orbsat/common/CommonProxy.java | 3 +- .../orbsat/common/OSBlocks.java | 25 ++ .../orbsat/common/OSItems.java | 3 - .../common/blocks/BlockContainerOS.java | 39 +++ .../orbsat/common/blocks/BlockCustomDrop.java | 80 ++++++ .../orbsat/common/blocks/Defender.java | 91 +++++++ .../common/container/ContainerDataSync.java | 43 +++ .../orbsat/common/lib/OSStrings.java | 2 + .../common/network/TileObjectPacket.java | 101 +++++++ .../common/tileentities/TileDefender.java | 68 +++++ .../common/tileentities/TileObjectSync.java | 40 +++ .../orbsat/common/utils/DataUtils.java | 255 ++++++++++++++++++ .../orbsat/common/utils/ItemNBTHelper.java | 117 ++++++++ .../resources/assets/orbsat/lang/en_US.lang | 2 +- .../orbsat/textures/blocks/machine_side.png | Bin 0 -> 10430 bytes .../textures/{blocks => models}/defender.png | Bin 20 files changed, 1076 insertions(+), 5 deletions(-) create mode 100644 src/main/java/fr/jackcartersmith/orbsat/client/model/ModelDefender.java create mode 100644 src/main/java/fr/jackcartersmith/orbsat/client/render/block/RenderDefender.java create mode 100644 src/main/java/fr/jackcartersmith/orbsat/client/render/tile/RenderTileDefender.java create mode 100644 src/main/java/fr/jackcartersmith/orbsat/common/blocks/BlockContainerOS.java create mode 100644 src/main/java/fr/jackcartersmith/orbsat/common/blocks/BlockCustomDrop.java create mode 100644 src/main/java/fr/jackcartersmith/orbsat/common/blocks/Defender.java create mode 100644 src/main/java/fr/jackcartersmith/orbsat/common/container/ContainerDataSync.java create mode 100644 src/main/java/fr/jackcartersmith/orbsat/common/network/TileObjectPacket.java create mode 100644 src/main/java/fr/jackcartersmith/orbsat/common/tileentities/TileDefender.java create mode 100644 src/main/java/fr/jackcartersmith/orbsat/common/tileentities/TileObjectSync.java create mode 100644 src/main/java/fr/jackcartersmith/orbsat/common/utils/DataUtils.java create mode 100644 src/main/java/fr/jackcartersmith/orbsat/common/utils/ItemNBTHelper.java create mode 100644 src/main/resources/assets/orbsat/textures/blocks/machine_side.png rename src/main/resources/assets/orbsat/textures/{blocks => models}/defender.png (100%) diff --git a/src/main/java/fr/jackcartersmith/orbsat/client/ClientProxy.java b/src/main/java/fr/jackcartersmith/orbsat/client/ClientProxy.java index 2e9ec74..6983322 100644 --- a/src/main/java/fr/jackcartersmith/orbsat/client/ClientProxy.java +++ b/src/main/java/fr/jackcartersmith/orbsat/client/ClientProxy.java @@ -12,7 +12,11 @@ import fr.jackcartersmith.orbsat.OrbitalSatellite; import fr.jackcartersmith.orbsat.client.handler.ClientEventHandler; import fr.jackcartersmith.orbsat.client.handler.ParticleHandler; import fr.jackcartersmith.orbsat.client.handler.ResourceHandler; +import fr.jackcartersmith.orbsat.client.render.block.RenderDefender; +import fr.jackcartersmith.orbsat.client.render.tile.RenderTileDefender; import fr.jackcartersmith.orbsat.common.CommonProxy; +import fr.jackcartersmith.orbsat.common.OSBlocks; +import fr.jackcartersmith.orbsat.common.tileentities.TileDefender; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.ISound; import net.minecraft.client.particle.EntityFX; @@ -53,6 +57,12 @@ public class ClientProxy extends CommonProxy { } public void registerRendering() { + //Item Renderers + MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(OSBlocks.defender), new RenderDefender()); + + //TileEntitySpecialRenderers + ClientRegistry.bindTileEntitySpecialRenderer(TileDefender.class, new RenderTileDefender()); + /* //Item Renderers MinecraftForgeClient.registerItemRenderer(ModItems.wyvernBow, new RenderBow()); diff --git a/src/main/java/fr/jackcartersmith/orbsat/client/model/ModelDefender.java b/src/main/java/fr/jackcartersmith/orbsat/client/model/ModelDefender.java new file mode 100644 index 0000000..88e8e79 --- /dev/null +++ b/src/main/java/fr/jackcartersmith/orbsat/client/model/ModelDefender.java @@ -0,0 +1,106 @@ +package fr.jackcartersmith.orbsat.client.model; + +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.entity.Entity; + +public class ModelDefender extends ModelBase { + public ModelRenderer Shape1; + public ModelRenderer Shape2; + public ModelRenderer Shape3; + public ModelRenderer Shape4; + public ModelRenderer Shape5; + public ModelRenderer Shape6; + public ModelRenderer Shape7; + public ModelRenderer Shape8; + + public ModelDefender() + { + this.textureWidth = 128; + this.textureHeight = 128; + this.Shape1 = new ModelRenderer(this, 0, 0); + this.Shape1.addBox(-8.0F, 0.0F, -8.0F, 16, 1, 16); + this.Shape1.setRotationPoint(0.0F, 23.0F, 0.0F); + this.Shape1.setTextureSize(128, 128); + this.Shape1.mirror = true; + this.setRotateAngle(this.Shape1, 0.0F, 0.0F, 0.0F); + this.Shape2 = new ModelRenderer(this, 64, 0); + this.Shape2.addBox(0.0F, 0.0F, -4.0F, 1, 7, 8); + this.Shape2.setRotationPoint(0.0F, 16.0F, -7.0F); + this.Shape2.setTextureSize(128, 128); + this.Shape2.mirror = true; + this.setRotateAngle(this.Shape2, 0.0F, ((float)Math.PI / 2F), 0.0F); + this.Shape3 = new ModelRenderer(this, 64, 0); + this.Shape3.addBox(0.0F, 0.0F, -4.0F, 1, 7, 8); + this.Shape3.setRotationPoint(-7.0F, 16.0F, 0.0F); + this.Shape3.setTextureSize(128, 128); + this.Shape3.mirror = true; + this.setRotateAngle(this.Shape3, 0.0F, (float)Math.PI, 0.0F); + this.Shape4 = new ModelRenderer(this, 64, 0); + this.Shape4.addBox(0.0F, 0.0F, -4.0F, 1, 7, 8); + this.Shape4.setRotationPoint(0.0F, 16.0F, 7.0F); + this.Shape4.setTextureSize(128, 128); + this.Shape4.mirror = true; + this.setRotateAngle(this.Shape4, 0.0F, -((float)Math.PI / 2F), 0.0F); + this.Shape5 = new ModelRenderer(this, 64, 0); + this.Shape5.addBox(0.0F, 0.0F, -4.0F, 1, 7, 8); + this.Shape5.setRotationPoint(7.0F, 16.0F, 0.0F); + this.Shape5.setTextureSize(128, 128); + this.Shape5.mirror = true; + this.setRotateAngle(this.Shape5, 0.0F, 0.0F, 0.0F); + this.Shape6 = new ModelRenderer(this, 0, 21); + this.Shape6.addBox(-1.0F, 0.0F, -1.0F, 2, 22, 2); + this.Shape6.setRotationPoint(0.0F, 0.0F, 0.0F); + this.Shape6.setTextureSize(128, 128); + this.Shape6.mirror = true; + this.setRotateAngle(this.Shape6, 0.0F, 0.0F, 0.0F); + this.Shape7 = new ModelRenderer(this, 85, 0); + this.Shape7.addBox(-3.0F, -3.0F, -3.0F, 6, 6, 6); + this.Shape7.setRotationPoint(0.0F, -3.0F, 0.0F); + this.Shape7.setTextureSize(128, 128); + this.Shape7.mirror = true; + this.setRotateAngle(this.Shape7, ((float)Math.PI / 4F), 0.0F, ((float)Math.PI / 4F)); + this.Shape8 = new ModelRenderer(this, 10, 26); + this.Shape8.addBox(-3.0F, 0.0F, -3.0F, 6, 2, 6); + this.Shape8.setRotationPoint(0.0F, 20.0F, 0.0F); + this.Shape8.setTextureSize(128, 128); + this.Shape8.mirror = true; + this.setRotateAngle(this.Shape8, 0.0F, 0.0F, 0.0F); + } + + @Override + public void render(Entity entity, float embitterRotation, float brightness, float x, float y, float z, float scale) { + this.Shape1.render(scale); + this.Shape2.render(scale); + this.Shape3.render(scale); + this.Shape4.render(scale); + this.Shape5.render(scale); + this.Shape6.render(scale); + this.Shape8.render(scale); + + float lastBrightnessX = OpenGlHelper.lastBrightnessX; + float lastBrightnessY = OpenGlHelper.lastBrightnessY; + + float b = brightness * 200F; + float colour = Math.min(2F, (brightness * 2F) + 0.5F); + if (brightness > 0F) GL11.glDisable(GL11.GL_LIGHTING); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, Math.min(200F, lastBrightnessX + b), Math.min(200F, lastBrightnessY + b)); + GL11.glColor4f(colour, colour, colour, 1F); + this.Shape7.render(scale); + GL11.glColor4f(1F, 1F, 1F, 1F); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, lastBrightnessX, lastBrightnessY); + if (brightness > 0F) GL11.glEnable(GL11.GL_LIGHTING); + } + + /** + * This is a helper function from Tabula to set the rotation of model parts + */ + public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } +} diff --git a/src/main/java/fr/jackcartersmith/orbsat/client/render/block/RenderDefender.java b/src/main/java/fr/jackcartersmith/orbsat/client/render/block/RenderDefender.java new file mode 100644 index 0000000..e8a4ea9 --- /dev/null +++ b/src/main/java/fr/jackcartersmith/orbsat/client/render/block/RenderDefender.java @@ -0,0 +1,44 @@ +package fr.jackcartersmith.orbsat.client.render.block; + +import org.lwjgl.opengl.GL11; + +import fr.jackcartersmith.orbsat.client.handler.ResourceHandler; +import fr.jackcartersmith.orbsat.client.render.tile.RenderTileDefender; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.IItemRenderer; + +public class RenderDefender implements IItemRenderer{ + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return true; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + GL11.glPushMatrix(); + float scale = (1F / 16F); + + if (type == ItemRenderType.INVENTORY) { + GL11.glScaled(0.76, 0.76, 0.76); + GL11.glTranslated(0.5, 1.0, 0.5); + GL11.glRotated(180, 0, 1, 0); + } else if (type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON) { + GL11.glTranslated(0.5, 2, 0.5); + GL11.glRotated(90, 0, 1, 0); + } else if (type == ItemRenderType.ENTITY) { + GL11.glScaled(3.0, 3.0, 3.0); + GL11.glTranslated(0.0, 1.5, 0.0); + GL11.glRotated(180, 0, 1, 0); + } + GL11.glRotated(180, 0, 0, 1); + + ResourceHandler.bindResource("textures/models/defender.png"); + RenderTileDefender.modelDefender.render(null, 1F, 0F, 0F, 0F, 0F, scale); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/fr/jackcartersmith/orbsat/client/render/tile/RenderTileDefender.java b/src/main/java/fr/jackcartersmith/orbsat/client/render/tile/RenderTileDefender.java new file mode 100644 index 0000000..7a1d9d4 --- /dev/null +++ b/src/main/java/fr/jackcartersmith/orbsat/client/render/tile/RenderTileDefender.java @@ -0,0 +1,52 @@ +package fr.jackcartersmith.orbsat.client.render.tile; + +import org.lwjgl.opengl.GL11; +import fr.jackcartersmith.orbsat.client.handler.ResourceHandler; +import fr.jackcartersmith.orbsat.client.model.ModelDefender; +import fr.jackcartersmith.orbsat.common.tileentities.TileDefender; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; + +public class RenderTileDefender extends TileEntitySpecialRenderer { + public static ModelDefender modelDefender = new ModelDefender(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float partialTick) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y + 1.5, z + 0.5); + + renderCore((TileDefender) tileEntity, partialTick); + + GL11.glPopMatrix(); + } + + public static void renderCore(TileDefender tile, float partialTick) { + GL11.glPushMatrix(); + float scale = (1F / 16F); + GL11.glRotated(180, 2, 0, 0); + + /* + switch (tile.facingDirection) { + case 1: + GL11.glRotated(180, -1, 0, 0); + break; + case 2: + GL11.glRotated(90, 1, 0, 0); + break; + case 3: + GL11.glRotated(90, -1, 0, 0); + break; + case 4: + GL11.glRotated(90, 0, 0, -1); + break; + case 5: + GL11.glRotated(90, 0, 0, 1); + } + */ + + ResourceHandler.bindResource("textures/models/defender.png"); + modelDefender.render(null, tile.modelIllumination, 0F, 0F, 0F, 0F, scale); + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/fr/jackcartersmith/orbsat/common/CommonProxy.java b/src/main/java/fr/jackcartersmith/orbsat/common/CommonProxy.java index 28439ad..ae2c73f 100644 --- a/src/main/java/fr/jackcartersmith/orbsat/common/CommonProxy.java +++ b/src/main/java/fr/jackcartersmith/orbsat/common/CommonProxy.java @@ -14,6 +14,7 @@ import fr.jackcartersmith.orbsat.client.gui.OSGuiHandler; import fr.jackcartersmith.orbsat.common.handler.FMLEventHandler; import fr.jackcartersmith.orbsat.common.lib.OSConstants; import fr.jackcartersmith.orbsat.common.lib.OSRefs; +import fr.jackcartersmith.orbsat.common.tileentities.TileDefender; import fr.jackcartersmith.orbsat.common.utils.OSLogHelper; import net.minecraft.client.audio.ISound; import net.minecraft.entity.player.EntityPlayer; @@ -81,7 +82,7 @@ public class CommonProxy { } public void registerTileEntities() { - //GameRegistry.registerTileEntity(DefenderTileEntity.class, OSRefs.RESOURCESPREFIX + "TileDefender"); + GameRegistry.registerTileEntity(TileDefender.class, OSRefs.RESOURCESPREFIX + "TileDefender"); diff --git a/src/main/java/fr/jackcartersmith/orbsat/common/OSBlocks.java b/src/main/java/fr/jackcartersmith/orbsat/common/OSBlocks.java index f4ed0df..b234c4c 100644 --- a/src/main/java/fr/jackcartersmith/orbsat/common/OSBlocks.java +++ b/src/main/java/fr/jackcartersmith/orbsat/common/OSBlocks.java @@ -3,8 +3,11 @@ package fr.jackcartersmith.orbsat.common; import cpw.mods.fml.common.registry.GameRegistry; import fr.jackcartersmith.orbsat.OrbitalSatellite; import fr.jackcartersmith.orbsat.common.blocks.BlockOS; +import fr.jackcartersmith.orbsat.common.blocks.Defender; import fr.jackcartersmith.orbsat.common.lib.OSRefs; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @GameRegistry.ObjectHolder(OSRefs.MODID) @@ -22,6 +25,10 @@ public class OSBlocks { public static BlockOS laserDef; public static void init(){ + defender = new Defender(); + + + /* laserLow = new LaserLowBlock(Material.fire).setBlockName("obLaserLow").setBlockTextureName(OSRefs.MODID + ":laserLow").setHardness(-1.0F).setResistance(-1.0F).setLightLevel(25.0F);; @@ -87,4 +94,22 @@ public class OSBlocks { resurrectionStone = new ItemStack(ModBlocks.draconiumBlock, 1, 1); */ } + + public static void register(BlockOS block) { + String name = block.getUnwrappedUnlocalizedName(block.getUnlocalizedName()); + //if (isEnabled(block)) GameRegistry.registerBlock(block, name.substring(name.indexOf(":") + 1)); + GameRegistry.registerBlock(block, name.substring(name.indexOf(":") + 1)); + } + + public static void register(BlockOS block, Class item) { + String name = block.getUnwrappedUnlocalizedName(block.getUnlocalizedName()); + //if (isEnabled(block)) GameRegistry.registerBlock(block, item, name.substring(name.indexOf(":") + 1)); + GameRegistry.registerBlock(block, item, name.substring(name.indexOf(":") + 1)); + } + + public static void registerOther(Block block) { + String name = block.getUnlocalizedName().substring(block.getUnlocalizedName().indexOf(".") + 1); + //if (isEnabled(block)) GameRegistry.registerBlock(block, name.substring(name.indexOf(":") + 1)); + GameRegistry.registerBlock(block, name.substring(name.indexOf(":") + 1)); + } } diff --git a/src/main/java/fr/jackcartersmith/orbsat/common/OSItems.java b/src/main/java/fr/jackcartersmith/orbsat/common/OSItems.java index e1859ca..b901799 100644 --- a/src/main/java/fr/jackcartersmith/orbsat/common/OSItems.java +++ b/src/main/java/fr/jackcartersmith/orbsat/common/OSItems.java @@ -1,7 +1,6 @@ package fr.jackcartersmith.orbsat.common; import cpw.mods.fml.common.registry.GameRegistry; -import fr.jackcartersmith.orbsat.OrbitalSatellite; import fr.jackcartersmith.orbsat.common.items.AdvancedExtrapolCircuit; import fr.jackcartersmith.orbsat.common.items.AdvancedTargetDevice; import fr.jackcartersmith.orbsat.common.items.BasicExtrapolCircuit; @@ -13,8 +12,6 @@ import fr.jackcartersmith.orbsat.common.items.PhotonCapacitor; import fr.jackcartersmith.orbsat.common.items.PhotonLense; import fr.jackcartersmith.orbsat.common.items.PhotonCondenser; import fr.jackcartersmith.orbsat.common.lib.OSRefs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; @GameRegistry.ObjectHolder(OSRefs.MODID) public class OSItems{ diff --git a/src/main/java/fr/jackcartersmith/orbsat/common/blocks/BlockContainerOS.java b/src/main/java/fr/jackcartersmith/orbsat/common/blocks/BlockContainerOS.java new file mode 100644 index 0000000..3d58e4b --- /dev/null +++ b/src/main/java/fr/jackcartersmith/orbsat/common/blocks/BlockContainerOS.java @@ -0,0 +1,39 @@ +package fr.jackcartersmith.orbsat.common.blocks; + +import net.minecraft.block.Block; +import net.minecraft.block.ITileEntityProvider; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class BlockContainerOS extends BlockOS implements ITileEntityProvider{ + public BlockContainerOS(final Material material) { + super(material); + this.isBlockContainer = true; + } + + public BlockContainerOS() { + super(Material.rock); + this.isBlockContainer = true; + } + + @Override + public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { + return null; + } + + public void onBlockAdded(World world, int x, int y, int z) { + super.onBlockAdded(world, x, y, z); + } + + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + super.breakBlock(world, x, y, z, block, meta); + world.removeTileEntity(x, y, z); + } + + public boolean onBlockEventReceived(World world, int x, int y, int z, int p_149696_5_, int p_149696_6_) { + super.onBlockEventReceived(world, x, y, z, p_149696_5_, p_149696_6_); + TileEntity tileentity = world.getTileEntity(x, y, z); + return tileentity != null ? tileentity.receiveClientEvent(p_149696_5_, p_149696_6_) : false; + } +} diff --git a/src/main/java/fr/jackcartersmith/orbsat/common/blocks/BlockCustomDrop.java b/src/main/java/fr/jackcartersmith/orbsat/common/blocks/BlockCustomDrop.java new file mode 100644 index 0000000..9d64252 --- /dev/null +++ b/src/main/java/fr/jackcartersmith/orbsat/common/blocks/BlockCustomDrop.java @@ -0,0 +1,80 @@ +package fr.jackcartersmith.orbsat.common.blocks; + +import java.util.ArrayList; +import java.util.List; + +import com.google.common.collect.Lists; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public abstract class BlockCustomDrop extends BlockContainerOS{ + public BlockCustomDrop(final Material material) { + super(material); + } + + /** + * If true the tile will drop its inventory when broken + */ + protected abstract boolean dropInventory(); + + /** + * If true the tile will drop a custom block with custom data when broken + */ + protected abstract boolean hasCustomDropps(); + + /** + * Use to specify custom drops + */ + protected abstract void getCustomTileEntityDrops(TileEntity te, List droppes); + + /* + private void getCustomDrops(TileEntity te, List droppes) { + if (te == null) return; + if (hasCustomDropps()) { + getCustomTileEntityDrops(te, droppes); + } + if (dropInventory() && te instanceof IInventory) { + droppes.addAll(InventoryUtils.getInventoryContents((IInventory) te)); + for (int i = 0; i < ((IInventory) te).getSizeInventory(); i++) + ((IInventory) te).setInventorySlotContents(i, null); + } + } + + @Override + public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) { + if (willHarvest) { + TileEntity te = world.getTileEntity(x, y, z); + + boolean result = super.removedByPlayer(world, player, x, y, z, willHarvest); + + if (result) { + List teDrops = Lists.newArrayList(); + getCustomDrops(te, teDrops); + for (ItemStack drop : teDrops) + dropBlockAsItem(world, x, y, z, drop); + } + + return result; + } + + return super.removedByPlayer(world, player, x, y, z, willHarvest); + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList result = Lists.newArrayList(); + if (!hasCustomDropps()) result.addAll(super.getDrops(world, x, y, z, metadata, fortune)); + if (hasCustomDropps() || dropInventory()) { + TileEntity te = world.getTileEntity(x, y, z); + getCustomDrops(te, result); + } + + return result; + } + */ +} diff --git a/src/main/java/fr/jackcartersmith/orbsat/common/blocks/Defender.java b/src/main/java/fr/jackcartersmith/orbsat/common/blocks/Defender.java new file mode 100644 index 0000000..48245b6 --- /dev/null +++ b/src/main/java/fr/jackcartersmith/orbsat/common/blocks/Defender.java @@ -0,0 +1,91 @@ +package fr.jackcartersmith.orbsat.common.blocks; + +import java.util.List; +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import fr.jackcartersmith.orbsat.OrbitalSatellite; +import fr.jackcartersmith.orbsat.common.OSBlocks; +import fr.jackcartersmith.orbsat.common.lib.OSRefs; +import fr.jackcartersmith.orbsat.common.lib.OSStrings; +import fr.jackcartersmith.orbsat.common.tileentities.TileDefender; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class Defender extends BlockCustomDrop { + public Defender() { + super(Material.iron); + this.setBlockName(OSStrings.defenderName); + this.setCreativeTab(OrbitalSatellite.OSCreaTab); + this.setStepSound(soundTypeStone); + this.setBlockBounds(0f, 0f, 0f, 1f, 0.5f, 1f); + OSBlocks.register(this); + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister iconRegister) { + blockIcon = iconRegister.registerIcon(OSRefs.RESOURCESPREFIX + "machine_side"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileDefender(); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float prx, float pry, float prz) { + if (!world.isRemote) { + //FMLNetworkHandler.openGui(player, OrbitalSatellite.instance, GuiHandler.GUIID_ENERGY_INFUSER, world, x, y, z); + } + world.markBlockForUpdate(x, y, z); + return true; + } + + @SideOnly(Side.CLIENT) + @Override + public int getRenderType() { + return -1; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + protected boolean dropInventory() { + return true; + } + + @Override + protected boolean hasCustomDropps() { + return false; + } + + @Override + protected void getCustomTileEntityDrops(TileEntity te, List droppes) { + + } + + @Override + public boolean shouldSideBeRendered(IBlockAccess access, int x, int y, int z, int side) { + return false; + } + + @Override + public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { + return true; + } +} diff --git a/src/main/java/fr/jackcartersmith/orbsat/common/container/ContainerDataSync.java b/src/main/java/fr/jackcartersmith/orbsat/common/container/ContainerDataSync.java new file mode 100644 index 0000000..f2cf5da --- /dev/null +++ b/src/main/java/fr/jackcartersmith/orbsat/common/container/ContainerDataSync.java @@ -0,0 +1,43 @@ +package fr.jackcartersmith.orbsat.common.container; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import fr.jackcartersmith.orbsat.OrbitalSatellite; +import fr.jackcartersmith.orbsat.common.lib.OSRefs; +import fr.jackcartersmith.orbsat.common.network.TileObjectPacket; +import fr.jackcartersmith.orbsat.common.tileentities.TileObjectSync; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.Container; + +public abstract class ContainerDataSync extends Container { + + //TODO WTF? Was i sleep coding when i wrote this? In 1.8 re write this as a common container class for all mod containers and use a dedicated sender/receiver method for each data type i want to send (Unless i think of something better between now and then) + + /** + * Sends two ints to the client-side Container. Normally the first int identifies which variable to update, and the second contains the new + * value. + * if tile != null the packet will be sent to the tile client tile instead of the client container. + */ + public Object sendObjectToClient(TileObjectSync tile, int index, Object object) { + for (Object p : crafters) { + OrbitalSatellite.network.sendTo(new TileObjectPacket(tile, OSRefs.INT_ID, index, object), (EntityPlayerMP) p); + } + return object; + } + + /** + * Sends two ints to the server-side Container. Normally the first int identifies which variable to update, and the second contains the new + * value. + * if tile != null the packet will be sent to the tile client tile instead of the client container. + */ + @SideOnly(Side.CLIENT) + public Object sendObjectToServer(TileObjectSync tile, int index, Object object) { + OrbitalSatellite.network.sendToServer(new TileObjectPacket(tile, OSRefs.INT_ID, index, object)); + return object; + } + + /** + * Called when a packet is received from ether the client or the server + */ + public abstract void receiveSyncData(int index, int value); +} diff --git a/src/main/java/fr/jackcartersmith/orbsat/common/lib/OSStrings.java b/src/main/java/fr/jackcartersmith/orbsat/common/lib/OSStrings.java index 7e96f23..6690095 100644 --- a/src/main/java/fr/jackcartersmith/orbsat/common/lib/OSStrings.java +++ b/src/main/java/fr/jackcartersmith/orbsat/common/lib/OSStrings.java @@ -10,4 +10,6 @@ public class OSStrings { public static final String basicTargetDeviceName = "basicTargetDevice"; public static final String advancedTargetDeviceName = "advancedTargetDevice"; public static final String involvedTargetDeviceName = "involvedTargetDevice"; + + public static final String defenderName = "defender"; } diff --git a/src/main/java/fr/jackcartersmith/orbsat/common/network/TileObjectPacket.java b/src/main/java/fr/jackcartersmith/orbsat/common/network/TileObjectPacket.java new file mode 100644 index 0000000..104aeea --- /dev/null +++ b/src/main/java/fr/jackcartersmith/orbsat/common/network/TileObjectPacket.java @@ -0,0 +1,101 @@ +package fr.jackcartersmith.orbsat.common.network; + +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 fr.jackcartersmith.orbsat.common.container.ContainerDataSync; +import fr.jackcartersmith.orbsat.common.tileentities.TileObjectSync; +import fr.jackcartersmith.orbsat.common.utils.DataUtils; +import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; + +public class TileObjectPacket implements IMessage { + int x; + int y; + int z; + short index; + short dataType = -1; + Object object; + boolean isContainerPacket; + + /** + * Used for Tile and Container synchronization + */ + public TileObjectPacket() { + } + + public TileObjectPacket(TileObjectSync tile, byte dataType, int index, Object object) { + this.isContainerPacket = tile == null; + if (!isContainerPacket) { + this.x = tile.xCoord; + this.y = tile.yCoord; + this.z = tile.zCoord; + } + this.dataType = dataType; + this.object = object; + this.index = (short) index; + } + + @Override + public void toBytes(ByteBuf bytes) { + bytes.writeBoolean(isContainerPacket); + + if (!isContainerPacket) { + bytes.writeInt(x); + bytes.writeInt(y); + bytes.writeInt(z); + } + + bytes.writeByte(dataType); + bytes.writeShort(index); + + DataUtils.instance.writeObjectToBytes(bytes, dataType, object); + + } + + @Override + public void fromBytes(ByteBuf bytes) { + isContainerPacket = bytes.readBoolean(); + + if (!isContainerPacket) { + x = bytes.readInt(); + y = bytes.readInt(); + z = bytes.readInt(); + } + + dataType = bytes.readByte(); + index = bytes.readShort(); + + object = DataUtils.instance.readObjectFromBytes(bytes, dataType); + } + + public static class Handler implements IMessageHandler { + + @Override + public IMessage onMessage(TileObjectPacket message, MessageContext ctx) { + if (ctx.side == Side.CLIENT) { + if (message.isContainerPacket) { + ContainerDataSync container = Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerDataSync ? (ContainerDataSync) Minecraft.getMinecraft().thePlayer.openContainer : null; + if (container == null) return null; + container.receiveSyncData(message.index, (Integer) message.object); + } else { + if (!(Minecraft.getMinecraft().theWorld.getTileEntity(message.x, message.y, message.z) instanceof TileObjectSync)) + return null; + ((TileObjectSync) Minecraft.getMinecraft().theWorld.getTileEntity(message.x, message.y, message.z)).receiveObjectFromServer(message.index, message.object); + } + } else { + if (message.isContainerPacket) { + ContainerDataSync container = ctx.getServerHandler().playerEntity.openContainer instanceof ContainerDataSync ? (ContainerDataSync) ctx.getServerHandler().playerEntity.openContainer : null; + if (container == null) return null; + container.receiveSyncData(message.index, (Integer) message.object); + } else { + if (!(ctx.getServerHandler().playerEntity.worldObj.getTileEntity(message.x, message.y, message.z) instanceof TileObjectSync)) + return null; + ((TileObjectSync) ctx.getServerHandler().playerEntity.worldObj.getTileEntity(message.x, message.y, message.z)).receiveObjectFromClient(message.index, message.object); + } + } + return null; + } + } +} diff --git a/src/main/java/fr/jackcartersmith/orbsat/common/tileentities/TileDefender.java b/src/main/java/fr/jackcartersmith/orbsat/common/tileentities/TileDefender.java new file mode 100644 index 0000000..c102bab --- /dev/null +++ b/src/main/java/fr/jackcartersmith/orbsat/common/tileentities/TileDefender.java @@ -0,0 +1,68 @@ +package fr.jackcartersmith.orbsat.common.tileentities; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +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.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; + +//public class TileDefender extends TileObjectSync implements IEnergyReceiver, ISidedInventory { +public class TileDefender extends TileObjectSync { + public float modelIllumination = 1F; + public int facingDirection = ForgeDirection.UP.ordinal(); + public boolean isValid = false; + public int tick = 0; + + //@SideOnly(Side.CLIENT) + //private ParticleReactorBeam beam; + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound compound = new NBTTagCompound(); + //masterLocation.writeToNBT(compound, "Master"); + compound.setInteger("Facing", facingDirection); + //compound.setBoolean("IsValid", isValid); + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, compound); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound compound = pkt.func_148857_g(); + //masterLocation.readFromNBT(compound, "Master"); + facingDirection = compound.getInteger("Facing"); + //isValid = compound.getBoolean("IsValid"); + super.onDataPacket(net, pkt); + } + + @Override + public void writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + /* + masterLocation.writeToNBT(compound, "Master"); + compound.setInteger("Facing", facingDirection); + compound.setBoolean("IsValid", isValid); + compound.setInteger("RedstoneMode", redstoneMode); + */ + } + + @Override + public void readFromNBT(NBTTagCompound compound) { + super.readFromNBT(compound); + /* + masterLocation.readFromNBT(compound, "Master"); + facingDirection = compound.getInteger("Facing"); + isValid = compound.getBoolean("IsValid"); + redstoneMode = compound.getInteger("RedstoneMode"); + */ + } + + @Override + public AxisAlignedBB getRenderBoundingBox() { + return AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 1, zCoord + 1); + } +} diff --git a/src/main/java/fr/jackcartersmith/orbsat/common/tileentities/TileObjectSync.java b/src/main/java/fr/jackcartersmith/orbsat/common/tileentities/TileObjectSync.java new file mode 100644 index 0000000..52abe8e --- /dev/null +++ b/src/main/java/fr/jackcartersmith/orbsat/common/tileentities/TileObjectSync.java @@ -0,0 +1,40 @@ +package fr.jackcartersmith.orbsat.common.tileentities; + +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import fr.jackcartersmith.orbsat.OrbitalSatellite; +import fr.jackcartersmith.orbsat.common.network.TileObjectPacket; +import net.minecraft.tileentity.TileEntity; + +public class TileObjectSync extends TileEntity{ + /** + * Sends a primitive to the client in the form of an object + */ + public Object sendObjectToClient(byte dataType, int index, Object object) { + return sendObjectToClient(dataType, index, object, new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 64)); + } + + /** + * Sends a primitive to the client in the form of an object + */ + public Object sendObjectToClient(byte dataType, int index, Object object, TargetPoint point) { + OrbitalSatellite.network.sendToAllAround(new TileObjectPacket(this, dataType, index, object), point); + return object; + } + + public Object sendObjectToServer(byte dataType, int index, Object object) { + OrbitalSatellite.network.sendToServer(new TileObjectPacket(this, dataType, index, object)); + return object; + } + + /** + * Receives an object from the server + */ + public void receiveObjectFromClient(int index, Object object) { + } + + /** + * Receives an object from the server + */ + public void receiveObjectFromServer(int index, Object object) { + } +} diff --git a/src/main/java/fr/jackcartersmith/orbsat/common/utils/DataUtils.java b/src/main/java/fr/jackcartersmith/orbsat/common/utils/DataUtils.java new file mode 100644 index 0000000..f6503fc --- /dev/null +++ b/src/main/java/fr/jackcartersmith/orbsat/common/utils/DataUtils.java @@ -0,0 +1,255 @@ +package fr.jackcartersmith.orbsat.common.utils; + +import java.text.DecimalFormat; +import cpw.mods.fml.common.network.ByteBufUtils; +import fr.jackcartersmith.orbsat.common.lib.OSRefs; +import io.netty.buffer.ByteBuf; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class DataUtils { + public static DataUtils instance = new DataUtils(); + + public void writeObjectToBytes(ByteBuf bytes, int dataType, Object object){ + switch (dataType){ + case OSRefs.BYTE_ID: + bytes.writeByte((Byte)object); + break; + case OSRefs.SHORT_ID: + bytes.writeShort((Short) object); + break; + case OSRefs.INT_ID: + bytes.writeInt((Integer) object); + break; + case OSRefs.LONG_ID: + bytes.writeLong((Long) object); + break; + case OSRefs.FLOAT_ID: + bytes.writeFloat((Float) object); + break; + case OSRefs.DOUBLE_ID: + bytes.writeDouble((Double) object); + break; + case OSRefs.CHAR_ID: + bytes.writeChar((Character) object); + break; + case OSRefs.STRING_ID: + ByteBufUtils.writeUTF8String(bytes, (String) object); + break; + case OSRefs.BOOLEAN_ID: + bytes.writeBoolean((Boolean) object); + break; + case OSRefs.INT_PAIR_ID: + bytes.writeInt(((IntPair)object).i1); + bytes.writeInt(((IntPair)object).i2); + break; + } + } + + public Object readObjectFromBytes(ByteBuf bytes, int dataType){ + switch (dataType){ + case OSRefs.BYTE_ID: + return bytes.readByte(); + case OSRefs.SHORT_ID: + return bytes.readShort(); + case OSRefs.INT_ID: + return bytes.readInt(); + case OSRefs.LONG_ID: + return bytes.readLong(); + case OSRefs.FLOAT_ID: + return bytes.readFloat(); + case OSRefs.DOUBLE_ID: + return bytes.readDouble(); + case OSRefs.CHAR_ID: + return bytes.readChar(); + case OSRefs.STRING_ID: + return ByteBufUtils.readUTF8String(bytes); + case OSRefs.BOOLEAN_ID: + return bytes.readBoolean(); + case OSRefs.INT_PAIR_ID: + IntPair tx = new IntPair(0, 0); + tx.i1 = bytes.readInt(); + tx.i2 = bytes.readInt(); + return tx; + } + return null; + } + + public static void writeObjectToItem(ItemStack stack, Object value, int datatype, String name){ + switch (datatype){ + case OSRefs.BYTE_ID: + ItemNBTHelper.setByte(stack, name, (Byte) value); + break; + case OSRefs.SHORT_ID: + ItemNBTHelper.setShort(stack, name, (Short) value); + break; + case OSRefs.INT_ID: + ItemNBTHelper.setInteger(stack, name, (Integer) value); + break; + case OSRefs.LONG_ID: + ItemNBTHelper.setLong(stack, name, (Long) value); + break; + case OSRefs.FLOAT_ID: + ItemNBTHelper.setFloat(stack, name, (Float) value); + break; + case OSRefs.DOUBLE_ID: + ItemNBTHelper.setDouble(stack, name, (Double) value); + break; +// case OSRefs.CHAR_ID: +// ItemNBTHelper.setChar(stack, value.name, (Byte)value.value); +// break; + case OSRefs.STRING_ID: + ItemNBTHelper.setString(stack, name, (String) value); + break; + case OSRefs.BOOLEAN_ID: + ItemNBTHelper.setBoolean(stack, name, (Boolean) value); + break; + } + } + + public static void writeObjectToCompound(NBTTagCompound compound, Object value, int datatype, String name){ + switch (datatype){ + case OSRefs.BYTE_ID: + compound.setByte(name, (Byte) value); + break; + case OSRefs.SHORT_ID: + compound.setShort(name, (Short) value); + break; + case OSRefs.INT_ID: + compound.setInteger(name, (Integer) value); + break; + case OSRefs.LONG_ID: + compound.setLong(name, (Long) value); + break; + case OSRefs.FLOAT_ID: + compound.setFloat(name, (Float) value); + break; + case OSRefs.DOUBLE_ID: + compound.setDouble(name, (Double) value); + break; +// case OSRefs.CHAR_ID: +// ItemNBTHelper.setChar(stack, value.name, (Byte)value.value); +// break; + case OSRefs.STRING_ID: + compound.setString(name, (String) value); + break; + case OSRefs.BOOLEAN_ID: + compound.setBoolean(name, (Boolean) value); + break; + } + } + + public static Object readObjectFromItem(ItemStack stack, int dataType, String name, Object defaultExpected){ + switch (dataType){ + case OSRefs.BYTE_ID: + return ItemNBTHelper.getByte(stack, name, (Byte)defaultExpected); + case OSRefs.SHORT_ID: + return ItemNBTHelper.getShort(stack, name, (Short)defaultExpected); + case OSRefs.INT_ID: + return ItemNBTHelper.getInteger(stack, name, (Integer)defaultExpected); + case OSRefs.LONG_ID: + return ItemNBTHelper.getLong(stack, name, (Long)defaultExpected); + case OSRefs.FLOAT_ID: + return ItemNBTHelper.getFloat(stack, name, (Float)defaultExpected); + case OSRefs.DOUBLE_ID: + return ItemNBTHelper.getDouble(stack, name, (Double)defaultExpected); + //case OSRefs.CHAR_ID: + case OSRefs.STRING_ID: + return ItemNBTHelper.getString(stack, name, (String)defaultExpected); + case OSRefs.BOOLEAN_ID: + return ItemNBTHelper.getBoolean(stack, name, (Boolean)defaultExpected); + } + return null; + } + + public static Object readObjectFromItem(ItemStack stack, int dataType, String name){ + switch (dataType){ + case OSRefs.BYTE_ID: + return ItemNBTHelper.getByte(stack, name, (byte)0); + case OSRefs.SHORT_ID: + return ItemNBTHelper.getShort(stack, name, (short) 0); + case OSRefs.INT_ID: + return ItemNBTHelper.getInteger(stack, name, 0); + case OSRefs.LONG_ID: + return ItemNBTHelper.getLong(stack, name, 0L); + case OSRefs.FLOAT_ID: + return ItemNBTHelper.getFloat(stack, name, 0F); + case OSRefs.DOUBLE_ID: + return ItemNBTHelper.getDouble(stack, name, 0D); + //case OSRefs.CHAR_ID: + case OSRefs.STRING_ID: + return ItemNBTHelper.getString(stack, name, ""); + case OSRefs.BOOLEAN_ID: + return ItemNBTHelper.getBoolean(stack, name, false); + } + return null; + } + + public static Object readObjectFromCompound(NBTTagCompound compound, int dataType, String name, Object defaultExpected){ + switch (dataType){ + case OSRefs.BYTE_ID: + return compound.hasKey(name) ? compound.getByte(name) : (Byte)defaultExpected; + case OSRefs.SHORT_ID: + return compound.hasKey(name) ? compound.getShort(name) : (Short)defaultExpected; + case OSRefs.INT_ID: + return compound.hasKey(name) ? compound.getInteger(name) : (Integer)defaultExpected; + case OSRefs.LONG_ID: + return compound.hasKey(name) ? compound.getLong(name) : (Long)defaultExpected; + case OSRefs.FLOAT_ID: + return compound.hasKey(name) ? compound.getFloat(name) : (Float)defaultExpected; + case OSRefs.DOUBLE_ID: + return compound.hasKey(name) ? compound.getDouble(name) : (Double)defaultExpected; + //case OSRefs.CHAR_ID: + case OSRefs.STRING_ID: + return compound.hasKey(name) ? compound.getString(name) : (String)defaultExpected; + case OSRefs.BOOLEAN_ID: + return compound.hasKey(name) ? compound.getBoolean(name) : (Boolean)defaultExpected; + } + return null; + } + + public static class IntPair + { + public int i1; + public int i2; + + public IntPair(int i1, int i2) + { + this.i1 = i1; + this.i2 = i2; + } + } + + public static class XZPair{ + public X x; + public Z z; + + public XZPair(X x, Z z){ + this.x = x; + this.z = z; + } + + public X getKey() { return x; } + + public Z getValue() { return z; } + } + + public static class XYZTri{ + public X x; + public Y y; + public Z z; + + public XYZTri(X x, Y y, Z z){ + this.x = x; + this.y = y; + this.z = z; + } + } + + public static String formatFileSize(long size) { + if(size <= 0) return "0"; + final String[] units = new String[] { "B", "kB", "MB", "GB", "TB" }; + int digitGroups = (int) (Math.log10(size)/Math.log10(1024)); + return new DecimalFormat("#,##0.#").format(size/Math.pow(1024, digitGroups)) + " " + units[digitGroups]; + } +} diff --git a/src/main/java/fr/jackcartersmith/orbsat/common/utils/ItemNBTHelper.java b/src/main/java/fr/jackcartersmith/orbsat/common/utils/ItemNBTHelper.java new file mode 100644 index 0000000..1b3f38b --- /dev/null +++ b/src/main/java/fr/jackcartersmith/orbsat/common/utils/ItemNBTHelper.java @@ -0,0 +1,117 @@ +package fr.jackcartersmith.orbsat.common.utils; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class ItemNBTHelper { + // SETTERS /////////////////////////////////////////////////////////////////// + public static NBTTagCompound getCompound(ItemStack stack){ + if (stack.getTagCompound() == null) stack.setTagCompound(new NBTTagCompound()); + return stack.getTagCompound(); + } + + public static ItemStack setByte(ItemStack stack, String tag, byte b) + { + NBTTagCompound compound = getCompound(stack); + compound.setByte(tag, b); + stack.setTagCompound(compound); + return stack; + } + + public static ItemStack setBoolean(ItemStack stack, String tag, boolean b) + { + NBTTagCompound compound = getCompound(stack); + compound.setBoolean(tag, b); + stack.setTagCompound(compound); + return stack; + } + + public static ItemStack setShort(ItemStack stack, String tag, short s) + { + NBTTagCompound compound = getCompound(stack); + compound.setShort(tag, s); + stack.setTagCompound(compound); + return stack; + } + + public static ItemStack setInteger(ItemStack stack, String tag, int i) + { + NBTTagCompound compound = getCompound(stack); + compound.setInteger(tag, i); + stack.setTagCompound(compound); + return stack; + } + + public static ItemStack setLong(ItemStack stack, String tag, long i) + { + NBTTagCompound compound = getCompound(stack); + compound.setLong(tag, i); + stack.setTagCompound(compound); + return stack; + } + + public static ItemStack setFloat(ItemStack stack, String tag, float f) + { + NBTTagCompound compound = getCompound(stack); + compound.setFloat(tag, f); + stack.setTagCompound(compound); + return stack; + } + + public static ItemStack setDouble(ItemStack stack, String tag, double d) + { + NBTTagCompound compound = getCompound(stack); + compound.setDouble(tag, d); + stack.setTagCompound(compound); + return stack; + } + + public static ItemStack setString(ItemStack stack, String tag, String s) { + NBTTagCompound compound = getCompound(stack); + compound.setString(tag, s); + stack.setTagCompound(compound); + return stack; + } + + // GETTERS /////////////////////////////////////////////////////////////////// + + public static boolean verifyExistance(ItemStack stack, String tag) { + NBTTagCompound compound = stack.getTagCompound(); + if (compound == null) + return false; + else + return stack.getTagCompound().hasKey(tag); + } + + public static byte getByte(ItemStack stack, String tag, byte defaultExpected) { + return verifyExistance(stack, tag) ? stack.getTagCompound().getByte(tag) : defaultExpected; + } + + public static boolean getBoolean(ItemStack stack, String tag, boolean defaultExpected) { + return verifyExistance(stack, tag) ? stack.getTagCompound().getBoolean(tag) : defaultExpected; + } + + public static short getShort(ItemStack stack, String tag, short defaultExpected) { + return verifyExistance(stack, tag) ? stack.getTagCompound().getShort(tag) : defaultExpected; + } + + public static int getInteger(ItemStack stack, String tag, int defaultExpected) { + return verifyExistance(stack, tag) ? stack.getTagCompound().getInteger(tag) : defaultExpected; + } + + public static long getLong(ItemStack stack, String tag, long defaultExpected) { + return verifyExistance(stack, tag) ? stack.getTagCompound().getLong(tag) : defaultExpected; + } + + public static float getFloat(ItemStack stack, String tag, float defaultExpected) { + return verifyExistance(stack, tag) ? stack.getTagCompound().getFloat(tag) : defaultExpected; + } + + public static double getDouble(ItemStack stack, String tag, double defaultExpected) { + return verifyExistance(stack, tag) ? stack.getTagCompound().getDouble(tag) : defaultExpected; + } + + public static String getString(ItemStack stack, String tag, String defaultExpected) { + return verifyExistance(stack, tag) ? stack.getTagCompound().getString(tag) : defaultExpected; + } +} diff --git a/src/main/resources/assets/orbsat/lang/en_US.lang b/src/main/resources/assets/orbsat/lang/en_US.lang index f4b29ab..f0b503c 100644 --- a/src/main/resources/assets/orbsat/lang/en_US.lang +++ b/src/main/resources/assets/orbsat/lang/en_US.lang @@ -13,10 +13,10 @@ item.orbsat:advancedTargetDevice.name=Advanced Targeting Device item.orbsat:involvedTargetDevice.name=Involved Targeting Device // Tiles -------------------------------------------------- +tile.orbsat:defender.name=Laser Defender tile.obOverrider.name=Laser Satelite Overrider tile.obExtender.name=Extender tile.obSatelite.name=Laser Satelite Prototype LX-I -tile.obDefender.name=Laser Strike Defender tile.obAccelerator.name=Photon Accelerator tile.obDecelerator.name=Photon Deccelerator tile.obInverterAdv.name=Advanced Photonic Converter diff --git a/src/main/resources/assets/orbsat/textures/blocks/machine_side.png b/src/main/resources/assets/orbsat/textures/blocks/machine_side.png new file mode 100644 index 0000000000000000000000000000000000000000..0e7e0cc0af0c9597a2fa45c4dc16a3a12f3553a9 GIT binary patch literal 10430 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/orbsat/textures/blocks/defender.png b/src/main/resources/assets/orbsat/textures/models/defender.png similarity index 100% rename from src/main/resources/assets/orbsat/textures/blocks/defender.png rename to src/main/resources/assets/orbsat/textures/models/defender.png