diff --git a/src/main/java/net/montoyo/wd/WebDisplays.java b/src/main/java/net/montoyo/wd/WebDisplays.java index bbcf48a..0d2a244 100644 --- a/src/main/java/net/montoyo/wd/WebDisplays.java +++ b/src/main/java/net/montoyo/wd/WebDisplays.java @@ -65,6 +65,7 @@ public class WebDisplays { public SoundEvent soundTyping; public SoundEvent soundUpgradeAdd; public SoundEvent soundUpgradeDel; + public SoundEvent soundScreenCfg; //Config public static final double PAD_RATIO = 59.0 / 30.0; @@ -150,7 +151,10 @@ public class WebDisplays { soundUpgradeDel = new SoundEvent(new ResourceLocation("webdisplays", "upgradeDel")); soundUpgradeDel.setRegistryName(soundUpgradeDel.getSoundName()); - ev.getRegistry().registerAll(soundTyping, soundUpgradeAdd, soundUpgradeDel); + soundScreenCfg = new SoundEvent(new ResourceLocation("webdisplays", "screencfgOpen")); + soundScreenCfg.setRegistryName(soundScreenCfg.getSoundName()); + + ev.getRegistry().registerAll(soundTyping, soundUpgradeAdd, soundUpgradeDel, soundScreenCfg); } @SubscribeEvent diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index d16fbf5..63aab08 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -20,11 +20,10 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumHand; import net.minecraft.util.EnumHandSide; import net.minecraft.util.NonNullList; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import net.minecraftforge.client.event.ModelBakeEvent; -import net.minecraftforge.client.event.ModelRegistryEvent; -import net.minecraftforge.client.event.RenderSpecificHandEvent; -import net.minecraftforge.client.event.TextureStitchEvent; +import net.minecraftforge.client.event.*; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.client.registry.ClientRegistry; @@ -40,15 +39,13 @@ import net.montoyo.wd.client.gui.GuiScreenConfig; import net.montoyo.wd.client.gui.GuiSetURL2; import net.montoyo.wd.client.gui.WDScreen; import net.montoyo.wd.client.gui.loading.GuiLoader; -import net.montoyo.wd.client.renderers.IModelBaker; -import net.montoyo.wd.client.renderers.MinePadRenderer; -import net.montoyo.wd.client.renderers.ScreenBaker; -import net.montoyo.wd.client.renderers.ScreenRenderer; +import net.montoyo.wd.client.renderers.*; import net.montoyo.wd.core.DefaultUpgrade; import net.montoyo.wd.data.GuiData; import net.montoyo.wd.entity.TileEntityScreen; import net.montoyo.wd.net.SMessagePadCtrl; import net.montoyo.wd.utilities.*; +import org.lwjgl.input.Mouse; import scala.tools.nsc.doc.model.Def; import java.util.ArrayList; @@ -76,6 +73,7 @@ public class ClientProxy extends SharedProxy implements IResourceManagerReloadLi private ArrayList modelBakers = new ArrayList<>(); private net.montoyo.mcef.api.API mcef; private MinePadRenderer minePadRenderer; + private LaserPointerRenderer laserPointerRenderer; //Tracking private ArrayList screenTracking = new ArrayList<>(); @@ -102,6 +100,7 @@ public class ClientProxy extends SharedProxy implements IResourceManagerReloadLi ClientRegistry.bindTileEntitySpecialRenderer(TileEntityScreen.class, new ScreenRenderer()); mcef = MCEFApi.getAPI(); minePadRenderer = new MinePadRenderer(); + laserPointerRenderer = new LaserPointerRenderer(); } @Override @@ -321,13 +320,31 @@ public class ClientProxy extends SharedProxy implements IResourceManagerReloadLi @SubscribeEvent public void onRenderPlayerHand(RenderSpecificHandEvent ev) { - if(ev.getItemStack().getItem() == WebDisplays.INSTANCE.itemMinePad) { - EnumHandSide handSide = mc.player.getPrimaryHand(); - if(ev.getHand() == EnumHand.OFF_HAND) - handSide = handSide.opposite(); + Item item = ev.getItemStack().getItem(); + IItemRenderer renderer; - minePadRenderer.render(ev.getItemStack(), (handSide == EnumHandSide.RIGHT) ? 1.0f : -1.0f, ev.getSwingProgress(), ev.getEquipProgress()); - ev.setCanceled(true); + if(item == WebDisplays.INSTANCE.itemMinePad) + renderer = minePadRenderer; + else if(item == WebDisplays.INSTANCE.itemLaserPointer) + renderer = laserPointerRenderer; + else + return; + + EnumHandSide handSide = mc.player.getPrimaryHand(); + if(ev.getHand() == EnumHand.OFF_HAND) + handSide = handSide.opposite(); + + renderer.render(ev.getItemStack(), (handSide == EnumHandSide.RIGHT) ? 1.0f : -1.0f, ev.getSwingProgress(), ev.getEquipProgress()); + ev.setCanceled(true); + } + + @SubscribeEvent + public void onMouseButton(MouseEvent ev) { + if(mc.player != null && mc.player.getHeldItem(EnumHand.MAIN_HAND).getItem() == WebDisplays.INSTANCE.itemLaserPointer) { + if(ev.getButton() == 1) { + //Right button + laserPointerRenderer.isOn = ev.isButtonstate(); + } } } diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java b/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java index 1da6e5c..7d3b8d8 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java @@ -4,6 +4,7 @@ package net.montoyo.wd.client.gui; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.util.ResourceLocation; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.client.gui.controls.*; @@ -142,6 +143,8 @@ public class GuiScreenConfig extends WDScreen { updateRights(friendRights, friendRights, friendBoxes, true); updateRights(otherRights, otherRights, otherBoxes, true); updateMyRights(); + + mc.getSoundHandler().playSound(PositionedSoundRecord.getRecord(WebDisplays.INSTANCE.soundScreenCfg, 1.0f, 1.0f)); } private void addFriend(String name) { diff --git a/src/main/java/net/montoyo/wd/client/renderers/IItemRenderer.java b/src/main/java/net/montoyo/wd/client/renderers/IItemRenderer.java new file mode 100644 index 0000000..e298c20 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/renderers/IItemRenderer.java @@ -0,0 +1,13 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client.renderers; + +import net.minecraft.item.ItemStack; + +public interface IItemRenderer { + + void render(ItemStack is, float handSideSign, float swingProgress, float equipProgress); + +} diff --git a/src/main/java/net/montoyo/wd/client/renderers/LaserPointerRenderer.java b/src/main/java/net/montoyo/wd/client/renderers/LaserPointerRenderer.java new file mode 100644 index 0000000..fa17db5 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/renderers/LaserPointerRenderer.java @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client.renderers; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.BufferUtils; + +import java.nio.FloatBuffer; + +import static org.lwjgl.opengl.GL11.*; + +@SideOnly(Side.CLIENT) +public final class LaserPointerRenderer implements IItemRenderer { + + private static final float PI = (float) Math.PI; + private final Tessellator t = Tessellator.getInstance(); + private final BufferBuilder bb = t.getBuffer(); + private final Minecraft mc = Minecraft.getMinecraft(); + private final FloatBuffer matrix1 = BufferUtils.createFloatBuffer(16); + private final FloatBuffer renderBuffer = BufferUtils.createFloatBuffer(8); + + public boolean isOn = false; + + public LaserPointerRenderer() { + for(int i = 0; i < 8; i++) + renderBuffer.put(0.0f); + + renderBuffer.position(0); + } + + @Override + public final void render(ItemStack is, float handSideSign, float swingProgress, float equipProgress) { + //This whole method is a fucking hack + float sqrtSwingProg = (float) Math.sqrt((double) swingProgress); + float sinSqrtSwingProg1 = MathHelper.sin(sqrtSwingProg * PI); + + GlStateManager.disableCull(); + GlStateManager.disableTexture2D(); + GlStateManager.enableRescaleNormal(); + + //Laser pointer + glPushMatrix(); + glTranslatef(handSideSign * -0.4f * sinSqrtSwingProg1, 0.2f * MathHelper.sin(sqrtSwingProg * PI * 2.0f), -0.2f * MathHelper.sin(swingProgress * PI)); + glTranslatef(handSideSign * 0.56f, -0.52f - equipProgress * 0.6f, -0.72f); + glRotatef(handSideSign * (45.0f - MathHelper.sin(swingProgress * swingProgress * PI) * 20.0f), 0.0f, 1.0f, 0.0f); + glRotatef(handSideSign * sinSqrtSwingProg1 * -20.0f, 0.0f, 0.0f, 1.0f); + glRotatef(sinSqrtSwingProg1 * -80.0f, 1.0f, 0.0f, 0.0f); + glRotatef(handSideSign * -30.0f, 0.0f, 1.0f, 0.0f); + glTranslatef(0.0f, 0.2f, 0.0f); + glRotatef(10.0f, 1.0f, 0.0f, 0.0f); + glScalef(1.0f / 16.0f, 1.0f / 16.0f, 1.0f / 16.0f); + + glColor4f(0.5f, 0.5f, 0.5f, 1.0f); + bb.begin(GL_QUADS, DefaultVertexFormats.POSITION_NORMAL); + bb.pos(0.0, 0.0, 0.0).normal(0.0f, 1.0f, 0.0f).endVertex(); + bb.pos(1.0, 0.0, 0.0).normal(0.0f, 1.0f, 0.0f).endVertex(); + bb.pos(1.0, 0.0, 4.0).normal(0.0f, 1.0f, 0.0f).endVertex(); + bb.pos(0.0, 0.0, 4.0).normal(0.0f, 1.0f, 0.0f).endVertex(); + + bb.pos(0.0, 0.0, 0.0).normal(-1.0f, 0.0f, 0.0f).endVertex(); + bb.pos(0.0, -1.0, 0.0).normal(-1.0f, 0.0f, 0.0f).endVertex(); + bb.pos(0.0, -1.0, 4.0).normal(-1.0f, 0.0f, 0.0f).endVertex(); + bb.pos(0.0, 0.0, 4.0).normal(-1.0f, 0.0f, 0.0f).endVertex(); + + bb.pos(1.0, 0.0, 0.0).normal(1.0f, 0.0f, 0.0f).endVertex(); + bb.pos(1.0, -1.0, 0.0).normal(1.0f, 0.0f, 0.0f).endVertex(); + bb.pos(1.0, -1.0, 4.0).normal(1.0f, 0.0f, 0.0f).endVertex(); + bb.pos(1.0, 0.0, 4.0).normal(1.0f, 0.0f, 0.0f).endVertex(); + + bb.pos(0.0, -1.0, 4.0).normal(0.0f, 0.0f, 1.0f).endVertex(); + bb.pos(1.0, -1.0, 4.0).normal(0.0f, 0.0f, 1.0f).endVertex(); + bb.pos(1.0, 0.0, 4.0).normal(0.0f, 0.0f, 1.0f).endVertex(); + bb.pos(0.0, 0.0, 4.0).normal(0.0f, 0.0f, 1.0f).endVertex(); + t.draw(); + + if(isOn) { + glTranslatef(0.5f, -0.5f, 0.0f); + matrix1.position(0); + glGetFloat(GL_MODELVIEW_MATRIX, matrix1); //Hax to get that damn position + } + + glPopMatrix(); + + if(isOn) { + RenderHelper.disableStandardItemLighting(); + GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit); + GlStateManager.disableTexture2D(); + GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit); + + //Actual laser + glPushMatrix(); + glLoadIdentity(); + GlStateManager.enableBlend(); + GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.DST_ALPHA); + glColor4f(1.0f, 0.0f, 0.0f, 0.5f); + GlStateManager.glLineWidth(3.0f); + + matrix1.position(12); + renderBuffer.put(matrix1.get()); + renderBuffer.put(matrix1.get()); + renderBuffer.put(matrix1.get() - 0.02f); //I know this is stupid, but it's the only thing that worked... + renderBuffer.put(matrix1.get()); + renderBuffer.position(0); + glVertexPointer(4, 0, renderBuffer); + glEnableClientState(GL_VERTEX_ARRAY); + glDrawArrays(GL_LINES, 0, 2); + glDisableClientState(GL_VERTEX_ARRAY); + glPopMatrix(); + } + + GlStateManager.enableTexture2D(); //Fix for shitty minecraft fire + } + + private void raycast(float ptt, double dist) { + Vec3d start = mc.player.getPositionEyes(ptt); + Vec3d lookVec = mc.player.getLook(ptt); + Vec3d end = start.addVector(lookVec.x * dist, lookVec.y * dist, lookVec.z * dist); + + RayTraceResult rtr = mc.world.rayTraceBlocks(start, end, true, true, false); + } + +} diff --git a/src/main/java/net/montoyo/wd/client/renderers/MinePadRenderer.java b/src/main/java/net/montoyo/wd/client/renderers/MinePadRenderer.java index d60a2aa..aed8f6a 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/MinePadRenderer.java +++ b/src/main/java/net/montoyo/wd/client/renderers/MinePadRenderer.java @@ -21,7 +21,7 @@ import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL12.GL_RESCALE_NORMAL; @SideOnly(Side.CLIENT) -public final class MinePadRenderer { +public final class MinePadRenderer implements IItemRenderer { private static final float PI = (float) Math.PI; private final Minecraft mc = Minecraft.getMinecraft(); @@ -34,7 +34,7 @@ public final class MinePadRenderer { private float sinSwingProg1; private float sinSwingProg2; - private static void drawAxis() { + public static void drawAxis() { glDisable(GL_TEXTURE_2D); glBegin(GL_LINES); glColor4f(1.f, 0.f, 0.f, 1.f); glVertex3d(0.0, 0.0, 0.0); @@ -47,6 +47,7 @@ public final class MinePadRenderer { glEnable(GL_TEXTURE_2D); } + @Override public final void render(ItemStack is, float handSideSign, float swingProgress, float equipProgress) { //Pre-compute values float sqrtSwingProg = (float) Math.sqrt((double) swingProgress); diff --git a/src/main/resources/assets/webdisplays/lang/en_us.lang b/src/main/resources/assets/webdisplays/lang/en_us.lang index 22469e6..bf35ef6 100644 --- a/src/main/resources/assets/webdisplays/lang/en_us.lang +++ b/src/main/resources/assets/webdisplays/lang/en_us.lang @@ -15,6 +15,7 @@ item.webdisplays.upgrade.name=Screen Upgrade item.webdisplays.upgrade.lasermouse.name=Laser Sensor item.webdisplays.upgrade.redinput.name=Redstone Input Port item.webdisplays.upgrade.redoutput.name=Redstone Output Port +item.webdisplays.laserpointer.name=Laser Pointer webdisplays.message.tooSmall=Too small! Minimum size is 2x2. webdisplays.message.invalid=Structure is invalid; look at %s. webdisplays.message.turnOn=You need to turn the screen on first! diff --git a/src/main/resources/assets/webdisplays/sounds.json b/src/main/resources/assets/webdisplays/sounds.json index 7558e4e..f1f2b2b 100644 --- a/src/main/resources/assets/webdisplays/sounds.json +++ b/src/main/resources/assets/webdisplays/sounds.json @@ -1,7 +1,6 @@ { "keyboardType": { "category": "block", - "subtitle": "block.webdisplays.keyboard", "sounds": [ "webdisplays:keyboard1", "webdisplays:keyboard2", @@ -15,16 +14,20 @@ }, "upgradeAdd": { "category": "block", - "subtitle": "block.webdisplays.upgradeAdd", "sounds": [ "webdisplays:upgrade_add" ] }, "upgradeDel": { "category": "block", - "subtitle": "block.webdisplays.upgradeDel", "sounds": [ "webdisplays:upgrade_del" ] + }, + "screencfgOpen": { + "category": "master", + "sounds": [ + "webdisplays:screencfg_open" + ] } } diff --git a/src/main/resources/assets/webdisplays/sounds/screencfg_open.ogg b/src/main/resources/assets/webdisplays/sounds/screencfg_open.ogg new file mode 100644 index 0000000..51a6d1f Binary files /dev/null and b/src/main/resources/assets/webdisplays/sounds/screencfg_open.ogg differ