diff --git a/src/main/java/com/hbm/render/tileentity/RenderStirling.java b/src/main/java/com/hbm/render/tileentity/RenderStirling.java index b241459e9..7d6bfd224 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderStirling.java +++ b/src/main/java/com/hbm/render/tileentity/RenderStirling.java @@ -7,14 +7,16 @@ import com.hbm.blocks.ModBlocks; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; import com.hbm.tileentity.machine.TileEntityStirling; +import com.hbm.wiaj.actors.ITileActorRenderer; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.client.IItemRenderer; -public class RenderStirling extends TileEntitySpecialRenderer implements IItemRendererProvider { +public class RenderStirling extends TileEntitySpecialRenderer implements IItemRendererProvider, ITileActorRenderer { @Override public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { @@ -93,4 +95,49 @@ public class RenderStirling extends TileEntitySpecialRenderer implements IItemRe RenderStirling.this.renderCommon(cog ? System.currentTimeMillis() % 3600 * 0.1F : 0, cog, item.getItem() == Item.getItemFromBlock(ModBlocks.machine_stirling) ? 0 : 1); }}; } + + @Override + public void renderActor(int ticks, float interp, NBTTagCompound data) { + double x = data.getDouble("x"); + double y = data.getDouble("y"); + double z = data.getDouble("z"); + int rotation = data.getInteger("rotation"); + int type = data.getInteger("type"); + boolean hasCog = data.getBoolean("hasCog"); + float lastSpin = data.getFloat("lastSpin"); + float spin = data.getFloat("spin"); + + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5D, y, z + 0.5D); + + switch(rotation) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + renderCommon(lastSpin + (spin - lastSpin) * interp, hasCog, type); + + GL11.glPopMatrix(); + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { + + float lastSpin = 0; + float spin = data.getFloat("spin"); + float speed = data.getFloat("speed"); + + lastSpin = spin; + spin += speed; + + if(spin >= 360) { + lastSpin -= 360; + spin -= 360; + } + + data.setFloat("lastSpin", lastSpin); + data.setFloat("spin", spin); + } } diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index 3b26be2ba..5989c07e1 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -1,11 +1,14 @@ package com.hbm.wiaj; +import java.util.Map.Entry; + import org.lwjgl.opengl.GL11; import com.hbm.blocks.ModBlocks; import com.hbm.wiaj.actions.ActionRotate; import com.hbm.wiaj.actions.ActionSetBlock; import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ISpecialActor; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -131,7 +134,6 @@ public class GuiWorldInAJar extends GuiScreen { GL11.glTranslated(-7, 0 , -7); GL11.glTranslated(world.sizeX / 2D, 0 , world.sizeZ / 2D); - //GL11.glRotated(System.currentTimeMillis() % (360 * 20) / 20D, 0, -1, 0); GL11.glTranslated(world.sizeX / -2D, 0 , world.sizeZ / -2D); Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationBlocksTexture); @@ -148,6 +150,11 @@ public class GuiWorldInAJar extends GuiScreen { Tessellator.instance.draw(); GL11.glShadeModel(GL11.GL_FLAT); + + for(Entry actor : this.testScript.actors.entrySet()) { + actor.getValue().draw(this.testScript.ticksElapsed, this.testScript.interp); + } + GL11.glPopMatrix(); } diff --git a/src/main/java/com/hbm/wiaj/JarScene.java b/src/main/java/com/hbm/wiaj/JarScene.java index 95d8e6f91..e6af1ae44 100644 --- a/src/main/java/com/hbm/wiaj/JarScene.java +++ b/src/main/java/com/hbm/wiaj/JarScene.java @@ -5,8 +5,6 @@ import java.util.List; import com.hbm.wiaj.actions.IJarAction; -import net.minecraft.util.MathHelper; - /** * A scene is a simple sequence of tasks, every script can have multiple scenes * Scenes depend on each other, in order to rewind we'll have to re-init the playing field and FFW through all previous scenes diff --git a/src/main/java/com/hbm/wiaj/JarScript.java b/src/main/java/com/hbm/wiaj/JarScript.java index 0e4404dd6..6a315a67c 100644 --- a/src/main/java/com/hbm/wiaj/JarScript.java +++ b/src/main/java/com/hbm/wiaj/JarScript.java @@ -3,6 +3,7 @@ package com.hbm.wiaj; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map.Entry; import com.hbm.wiaj.actors.ISpecialActor; @@ -12,7 +13,7 @@ public class JarScript { public WorldInAJar world; private List scenes = new ArrayList(); - private HashMap actors = new HashMap(); + public HashMap actors = new HashMap(); private JarScene currentScene; private int sceneNumber = 0; @@ -61,10 +62,16 @@ public class JarScript { this.interp = MathHelper.clamp_float((float) (now - this.lastTick) / 50F, 0F, 1F); if(nextTick) { + this.lastRotationPitch = this.rotationPitch; this.lastRotationYaw = this.rotationYaw; if(this.currentScene != null) { + + for(Entry actor : this.actors.entrySet()) { + actor.getValue().updateActor(this.currentScene); + } + tickScene(); } } diff --git a/src/main/java/com/hbm/wiaj/actions/ActionCreateActor.java b/src/main/java/com/hbm/wiaj/actions/ActionCreateActor.java new file mode 100644 index 000000000..c18986376 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionCreateActor.java @@ -0,0 +1,26 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actors.ISpecialActor; + +public class ActionCreateActor implements IJarAction { + + int id; + ISpecialActor actor; + + public ActionCreateActor(int id, ISpecialActor actor) { + this.id = id; + this.actor = actor; + } + + @Override + public int getDuration() { + return 0; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.actors.put(id, actor); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionRemoveActor.java b/src/main/java/com/hbm/wiaj/actions/ActionRemoveActor.java new file mode 100644 index 000000000..62e94b615 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionRemoveActor.java @@ -0,0 +1,23 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +public class ActionRemoveActor implements IJarAction { + + int id; + + public ActionRemoveActor(int id) { + this.id = id; + } + + @Override + public int getDuration() { + return 0; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.actors.remove(id); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionSetActorData.java b/src/main/java/com/hbm/wiaj/actions/ActionSetActorData.java new file mode 100644 index 000000000..b39c5888e --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionSetActorData.java @@ -0,0 +1,27 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +import net.minecraft.nbt.NBTTagCompound; + +public class ActionSetActorData implements IJarAction { + + int id; + NBTTagCompound data; + + public ActionSetActorData(int id, NBTTagCompound data) { + this.id = id; + this.data = data; + } + + @Override + public int getDuration() { + return 0; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.actors.get(id).setActorData(data); + } +} diff --git a/src/main/java/com/hbm/wiaj/actions/ActionUpdateActor.java b/src/main/java/com/hbm/wiaj/actions/ActionUpdateActor.java new file mode 100644 index 000000000..6c28be0f2 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actions/ActionUpdateActor.java @@ -0,0 +1,27 @@ +package com.hbm.wiaj.actions; + +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; + +public class ActionUpdateActor implements IJarAction { + + int id; + String key; + Object data; + + public ActionUpdateActor(int id, String key, Object data) { + this.id = id; + this.key = key; + this.data = data; + } + + @Override + public int getDuration() { + return 0; + } + + @Override + public void act(WorldInAJar world, JarScene scene) { + scene.script.actors.get(id).setDataPoint(key, data); + } +} diff --git a/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java new file mode 100644 index 000000000..b184744d0 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java @@ -0,0 +1,38 @@ +package com.hbm.wiaj.actors; + +import com.hbm.wiaj.JarScene; + +import net.minecraft.nbt.NBTTagCompound; + +public class ActorTileEntity implements ISpecialActor { + + ITileActorRenderer renderer; + NBTTagCompound data = new NBTTagCompound(); + + public ActorTileEntity(ITileActorRenderer renderer) { + this.renderer = renderer; + } + + @Override + public void draw(int ticks, float interp) { + renderer.renderActor(ticks, interp, data); + } + + @Override + public void updateActor(JarScene scene) { + renderer.updateActor(scene.script.ticksElapsed, data); + } + + @Override + public void setActorData(NBTTagCompound data) { + this.data = data; + } + + @Override + public void setDataPoint(String tag, Object o) { + if(o instanceof String) this.data.setString(tag, (String) o); + if(o instanceof Integer) this.data.setInteger(tag, (Integer) o); + if(o instanceof Float) this.data.setFloat(tag, (Float) o); + if(o instanceof Double) this.data.setDouble(tag, (Double) o); + } +} diff --git a/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java b/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java index 0c4e12a6c..0ac958a45 100644 --- a/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java +++ b/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java @@ -2,9 +2,17 @@ package com.hbm.wiaj.actors; import com.hbm.wiaj.JarScene; +import net.minecraft.nbt.NBTTagCompound; + +/** + * Actors, anything that can receive ticks (for rendering movement for example) and renders on screen + * Can be tile entity models, faux entities or tooltips + * @author hbm + */ public interface ISpecialActor { - public void draw(); + public void draw(int ticks, float interp); public void updateActor(JarScene scene); - public void setActorData(Object... data); + public void setActorData(NBTTagCompound data); + public void setDataPoint(String tag, Object o); } diff --git a/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java b/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java index 26ba99f3e..22fcaa9c5 100644 --- a/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java +++ b/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java @@ -1,6 +1,9 @@ package com.hbm.wiaj.actors; +import net.minecraft.nbt.NBTTagCompound; + public interface ITileActorRenderer { - public void renderActor(Object... data); + public void renderActor(int ticks, float interp, NBTTagCompound data); + public void updateActor(int ticks, NBTTagCompound data); }