From e1c23a5bec64a6770a27a0f68e83ddebf1bebdcb Mon Sep 17 00:00:00 2001 From: Christian Knaapen Date: Tue, 12 Feb 2019 16:06:54 +0100 Subject: [PATCH] Fixed dissolve shader sometimes applying to wrong blocks (server and client are synced now, no more message to render). Fixed build modes on server clicking twice. Changing config ingame is now possible. --- .../EffortlessBuilding.java | 3 ++- .../effortlessbuilding/EventHandler.java | 3 +-- .../buildmode/BuildModes.java | 4 ++- .../effortlessbuilding/buildmode/Floor.java | 24 ++++++++++------- .../effortlessbuilding/buildmode/Line.java | 27 +++++++++++-------- .../effortlessbuilding/buildmode/Wall.java | 25 ++++++++++------- .../buildmodifier/BuildModifiers.java | 8 ++++-- .../compatibility/CompatHelper.java | 2 +- .../effortlessbuilding/proxy/ClientProxy.java | 4 ++- .../render/RenderHandler.java | 4 +-- .../effortlessbuilding/shaders/dissolve.frag | 3 ++- .../effortlessbuilding/shaders/dissolve.vert | 2 +- 12 files changed, 68 insertions(+), 41 deletions(-) diff --git a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java index 266de5a..007b35d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java +++ b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java @@ -19,6 +19,7 @@ import net.minecraftforge.fml.common.event.FMLServerStartingEvent; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; import net.minecraftforge.fml.relauncher.Side; +import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.capability.ModeCapabilityManager; import nl.requios.effortlessbuilding.capability.ModifierCapabilityManager; import nl.requios.effortlessbuilding.command.CommandReach; @@ -101,7 +102,6 @@ public class EffortlessBuilding EffortlessBuilding.packetHandler.registerMessage(RequestLookAtMessage.MessageHandler.class, RequestLookAtMessage.class, 5, Side.CLIENT); proxy.preInit(event); - CompatHelper.preInit(); } @EventHandler @@ -120,6 +120,7 @@ public class EffortlessBuilding public void postInit(FMLPostInitializationEvent event) { proxy.postInit(event); + CompatHelper.postInit(); } @EventHandler diff --git a/src/main/java/nl/requios/effortlessbuilding/EventHandler.java b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java index 055bdc5..913e6f5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EventHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java @@ -54,7 +54,6 @@ public class EventHandler @SubscribeEvent public static void registerSounds(RegistryEvent.Register event) { - EffortlessBuilding.log("testing"); event.getRegistry().registerAll(EffortlessBuilding.SOUND_EVENTS); } @@ -67,7 +66,7 @@ public class EventHandler } @SubscribeEvent - public void onConfigChangedEvent(ConfigChangedEvent.OnConfigChangedEvent event) + public static void onConfigChangedEvent(ConfigChangedEvent.OnConfigChangedEvent event) { if (event.getModID().equals(EffortlessBuilding.MODID)) { diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java index 12c4c01..e0939e7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java @@ -7,6 +7,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.event.world.BlockEvent; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.relauncher.Side; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.buildmodifier.*; import nl.requios.effortlessbuilding.compatibility.CompatHelper; @@ -32,7 +34,7 @@ public class BuildModes { Cube ("Cube", new Cube()); public String name; - public final IBuildMode instance; + public IBuildMode instance; BuildModeEnum(String name, IBuildMode instance) { this.name = name; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/Floor.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/Floor.java index 0442966..014b12c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/Floor.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/Floor.java @@ -10,14 +10,18 @@ import nl.requios.effortlessbuilding.helper.ReachHelper; import java.util.*; public class Floor implements IBuildMode { - Dictionary rightClickNrTable = new Hashtable<>(); + //In singleplayer client and server variables are shared + //Split everything that needs separate values and may not be called twice in one click + Dictionary rightClickClientTable = new Hashtable<>(); + Dictionary rightClickServerTable = new Hashtable<>(); Dictionary firstPosTable = new Hashtable<>(); Dictionary sideHitTable = new Hashtable<>(); Dictionary hitVecTable = new Hashtable<>(); @Override public void initialize(EntityPlayer player) { - rightClickNrTable.put(player.getUniqueID(), 0); + rightClickClientTable.put(player.getUniqueID(), 0); + rightClickServerTable.put(player.getUniqueID(), 0); firstPosTable.put(player.getUniqueID(), BlockPos.ORIGIN); sideHitTable.put(player.getUniqueID(), EnumFacing.UP); hitVecTable.put(player.getUniqueID(), Vec3d.ZERO); @@ -27,14 +31,15 @@ public class Floor implements IBuildMode { public List onRightClick(EntityPlayer player, BlockPos blockPos, EnumFacing sideHit, Vec3d hitVec) { List list = new ArrayList<>(); - int rightClickNr = rightClickNrTable.get(player.getUniqueID()); + Dictionary rightClickTable = player.world.isRemote ? rightClickClientTable : rightClickServerTable; + int rightClickNr = rightClickTable.get(player.getUniqueID()); rightClickNr++; - rightClickNrTable.put(player.getUniqueID(), rightClickNr); + rightClickTable.put(player.getUniqueID(), rightClickNr); if (rightClickNr == 1) { //If clicking in air, reset and try again if (blockPos == null) { - rightClickNrTable.put(player.getUniqueID(), 0); + rightClickTable.put(player.getUniqueID(), 0); return list; } @@ -47,7 +52,7 @@ public class Floor implements IBuildMode { //Second click, place wall list = findCoordinates(player, blockPos); - rightClickNrTable.put(player.getUniqueID(), 0); + rightClickTable.put(player.getUniqueID(), 0); } return list; @@ -56,7 +61,8 @@ public class Floor implements IBuildMode { @Override public List findCoordinates(EntityPlayer player, BlockPos blockPos) { List list = new ArrayList<>(); - int rightClickNr = rightClickNrTable.get(player.getUniqueID()); + Dictionary rightClickTable = player.world.isRemote ? rightClickClientTable : rightClickServerTable; + int rightClickNr = rightClickTable.get(player.getUniqueID()); BlockPos firstPos = firstPosTable.get(player.getUniqueID()); if (rightClickNr == 0) { @@ -92,8 +98,8 @@ public class Floor implements IBuildMode { if (selected == null) return list; //check if it doesnt go through blocks - RayTraceResult rayTraceResult = player.world.rayTraceBlocks(start, selected, false, false, false); - if (rayTraceResult != null && rayTraceResult.typeOfHit != RayTraceResult.Type.BLOCK) { + RayTraceResult rayTraceResult = player.world.rayTraceBlocks(start, selected, false, true, false); + if (rayTraceResult != null && rayTraceResult.typeOfHit == RayTraceResult.Type.BLOCK) { //return empty list return list; } diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/Line.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/Line.java index 65a62aa..a8099c1 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/Line.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/Line.java @@ -5,20 +5,23 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; import nl.requios.effortlessbuilding.helper.ReachHelper; import java.util.*; public class Line implements IBuildMode { - Dictionary rightClickNrTable = new Hashtable<>(); + //In singleplayer client and server variables are shared + //Split everything that needs separate values and may not be called twice in one click + Dictionary rightClickClientTable = new Hashtable<>(); + Dictionary rightClickServerTable = new Hashtable<>(); Dictionary firstPosTable = new Hashtable<>(); Dictionary sideHitTable = new Hashtable<>(); Dictionary hitVecTable = new Hashtable<>(); @Override public void initialize(EntityPlayer player) { - rightClickNrTable.put(player.getUniqueID(), 0); + rightClickClientTable.put(player.getUniqueID(), 0); + rightClickServerTable.put(player.getUniqueID(), 0); firstPosTable.put(player.getUniqueID(), BlockPos.ORIGIN); sideHitTable.put(player.getUniqueID(), EnumFacing.UP); hitVecTable.put(player.getUniqueID(), Vec3d.ZERO); @@ -28,14 +31,15 @@ public class Line implements IBuildMode { public List onRightClick(EntityPlayer player, BlockPos blockPos, EnumFacing sideHit, Vec3d hitVec) { List list = new ArrayList<>(); - int rightClickNr = rightClickNrTable.get(player.getUniqueID()); + Dictionary rightClickTable = player.world.isRemote ? rightClickClientTable : rightClickServerTable; + int rightClickNr = rightClickTable.get(player.getUniqueID()); rightClickNr++; - rightClickNrTable.put(player.getUniqueID(), rightClickNr); + rightClickTable.put(player.getUniqueID(), rightClickNr); if (rightClickNr == 1) { //If clicking in air, reset and try again if (blockPos == null) { - rightClickNrTable.put(player.getUniqueID(), 0); + rightClickTable.put(player.getUniqueID(), 0); return list; } @@ -48,7 +52,7 @@ public class Line implements IBuildMode { //Second click, place wall list = findCoordinates(player, blockPos); - rightClickNrTable.put(player.getUniqueID(), 0); + rightClickTable.put(player.getUniqueID(), 0); } return list; @@ -57,7 +61,8 @@ public class Line implements IBuildMode { @Override public List findCoordinates(EntityPlayer player, BlockPos blockPos) { List list = new ArrayList<>(); - int rightClickNr = rightClickNrTable.get(player.getUniqueID()); + Dictionary rightClickTable = player.world.isRemote ? rightClickClientTable : rightClickServerTable; + int rightClickNr = rightClickTable.get(player.getUniqueID()); BlockPos firstPos = firstPosTable.get(player.getUniqueID()); if (rightClickNr == 0) { @@ -149,9 +154,9 @@ public class Line implements IBuildMode { if (selected == null) return list; - //TODO check if it doesnt go through blocks - RayTraceResult rayTraceResult = player.world.rayTraceBlocks(start, selected, false, false, false); - if (rayTraceResult != null && rayTraceResult.typeOfHit != RayTraceResult.Type.BLOCK) { + //check if it doesnt go through blocks + RayTraceResult rayTraceResult = player.world.rayTraceBlocks(start, selected, false, true, false); + if (rayTraceResult != null && rayTraceResult.typeOfHit == RayTraceResult.Type.BLOCK) { //return empty list return list; } diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/Wall.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/Wall.java index 62000ac..d5a4fee 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/Wall.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/Wall.java @@ -5,19 +5,24 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; +import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.helper.ReachHelper; import java.util.*; public class Wall implements IBuildMode { - Dictionary rightClickNrTable = new Hashtable<>(); + //In singleplayer client and server variables are shared + //Split everything that needs separate values and may not be called twice in one click + Dictionary rightClickClientTable = new Hashtable<>(); + Dictionary rightClickServerTable = new Hashtable<>(); Dictionary firstPosTable = new Hashtable<>(); Dictionary sideHitTable = new Hashtable<>(); Dictionary hitVecTable = new Hashtable<>(); @Override public void initialize(EntityPlayer player) { - rightClickNrTable.put(player.getUniqueID(), 0); + rightClickClientTable.put(player.getUniqueID(), 0); + rightClickServerTable.put(player.getUniqueID(), 0); firstPosTable.put(player.getUniqueID(), BlockPos.ORIGIN); sideHitTable.put(player.getUniqueID(), EnumFacing.UP); hitVecTable.put(player.getUniqueID(), Vec3d.ZERO); @@ -27,14 +32,15 @@ public class Wall implements IBuildMode { public List onRightClick(EntityPlayer player, BlockPos blockPos, EnumFacing sideHit, Vec3d hitVec) { List list = new ArrayList<>(); - int rightClickNr = rightClickNrTable.get(player.getUniqueID()); + Dictionary rightClickTable = player.world.isRemote ? rightClickClientTable : rightClickServerTable; + int rightClickNr = rightClickTable.get(player.getUniqueID()); rightClickNr++; - rightClickNrTable.put(player.getUniqueID(), rightClickNr); + rightClickTable.put(player.getUniqueID(), rightClickNr); if (rightClickNr == 1) { //If clicking in air, reset and try again if (blockPos == null) { - rightClickNrTable.put(player.getUniqueID(), 0); + rightClickTable.put(player.getUniqueID(), 0); return list; } @@ -47,7 +53,7 @@ public class Wall implements IBuildMode { //Second click, place wall list = findCoordinates(player, blockPos); - rightClickNrTable.put(player.getUniqueID(), 0); + rightClickTable.put(player.getUniqueID(), 0); } return list; @@ -56,7 +62,8 @@ public class Wall implements IBuildMode { @Override public List findCoordinates(EntityPlayer player, BlockPos blockPos) { List list = new ArrayList<>(); - int rightClickNr = rightClickNrTable.get(player.getUniqueID()); + Dictionary rightClickTable = player.world.isRemote ? rightClickClientTable : rightClickServerTable; + int rightClickNr = rightClickTable.get(player.getUniqueID()); BlockPos firstPos = firstPosTable.get(player.getUniqueID()); if (rightClickNr == 0) { @@ -116,8 +123,8 @@ public class Wall implements IBuildMode { if (selected == null) return list; //check if it doesnt go through blocks - RayTraceResult rayTraceResult = player.world.rayTraceBlocks(start, selected, false, false, false); - if (rayTraceResult != null && rayTraceResult.typeOfHit != RayTraceResult.Type.BLOCK) { + RayTraceResult rayTraceResult = player.world.rayTraceBlocks(start, selected, false, true, false); + if (rayTraceResult != null && rayTraceResult.typeOfHit == RayTraceResult.Type.BLOCK) { //return empty list return list; } diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java index 8e0544a..d15e7b7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java @@ -16,6 +16,7 @@ import nl.requios.effortlessbuilding.compatibility.CompatHelper; import nl.requios.effortlessbuilding.helper.SurvivalHelper; import nl.requios.effortlessbuilding.item.ItemRandomizerBag; import nl.requios.effortlessbuilding.network.BlockPlacedMessage; +import nl.requios.effortlessbuilding.render.BlockPreviewRenderer; import java.util.ArrayList; import java.util.Arrays; @@ -39,6 +40,11 @@ public class BuildModifiers { //check if valid blockstates if (blockStates.size() == 0 || coordinates.size() != blockStates.size()) return; + if (world.isRemote) { + BlockPreviewRenderer.onBlocksPlaced(); + return; + } + //place blocks for (int i = 0; i < coordinates.size(); i++) { BlockPos blockPos = coordinates.get(i); @@ -52,8 +58,6 @@ public class BuildModifiers { } } - EffortlessBuilding.packetHandler.sendTo(new BlockPlacedMessage(), ((EntityPlayerMP) player)); - } public static void onBlockBroken(EntityPlayer player, List posList) { diff --git a/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java b/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java index 91f48a6..ca05445 100644 --- a/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java @@ -18,7 +18,7 @@ public class CompatHelper { public static IChiselsAndBitsProxy chiselsAndBitsProxy; - public static void preInit() { + public static void postInit() { if (Loader.isModLoaded("chiselsandbits")) { // reflection to avoid hard dependency try { diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java index 072f5b7..ca210ca 100644 --- a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java @@ -161,6 +161,7 @@ public class ClientProxy implements IProxy { //find position in distance RayTraceResult lookingAt = getLookingAt(player); + BuildModes.onBlockPlacedMessage(player, new BlockPlacedMessage(lookingAt)); EffortlessBuilding.packetHandler.sendToServer(new BlockPlacedMessage(lookingAt)); //play sound if further than normal @@ -186,6 +187,7 @@ public class ClientProxy implements IProxy { breakCooldown = 6; RayTraceResult lookingAt = getLookingAt(player); if (lookingAt != null && lookingAt.typeOfHit == RayTraceResult.Type.BLOCK) { + BuildModes.onBlockBrokenMessage(player, new BlockBrokenMessage(lookingAt)); EffortlessBuilding.packetHandler.sendToServer(new BlockBrokenMessage(lookingAt)); //play sound @@ -251,7 +253,7 @@ public class ClientProxy implements IProxy { ShaderHandler.init(); EffortlessBuilding.log(player, "Reloaded shaders"); //player.playSound(SoundEvents.UI_BUTTON_CLICK, 1f, 1f); - player.playSound(EffortlessBuilding.SOUND_BUILD_CLICK, 1f, 1f); + //player.playSound(EffortlessBuilding.SOUND_BUILD_CLICK, 1f, 1f); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java b/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java index 106e36c..3293ddb 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java @@ -194,8 +194,8 @@ public class RenderHandler implements IWorldEventListener { GlStateManager.pushMatrix(); GlStateManager.translate(blockPos.getX(), blockPos.getY(), blockPos.getZ()); GlStateManager.rotate(-90.0F, 0.0F, 1.0F, 0.0F); - GlStateManager.translate(-0.005f, -0.005f, 0.005f); - GlStateManager.scale(1.01f, 1.01f, 1.01f); + GlStateManager.translate(-0.01f, -0.01f, 0.01f); + GlStateManager.scale(1.02f, 1.02f, 1.02f); dispatcher.renderBlockBrightness(blockState, 0.85f); GlStateManager.popMatrix(); } diff --git a/src/main/resources/assets/effortlessbuilding/shaders/dissolve.frag b/src/main/resources/assets/effortlessbuilding/shaders/dissolve.frag index 2663dff..1a34ca8 100644 --- a/src/main/resources/assets/effortlessbuilding/shaders/dissolve.frag +++ b/src/main/resources/assets/effortlessbuilding/shaders/dissolve.frag @@ -15,7 +15,8 @@ varying vec3 normal; void main() { - vec3 worldpos = blockpos + position.xyz; + vec3 pixelposition = floor(position.xyz * 8.0) / 8.0; + vec3 worldpos = blockpos + pixelposition.xyz; vec2 texcoord = vec2(gl_TexCoord[0]); vec4 texcolor = texture2D(image, texcoord); vec4 color = texcolor; diff --git a/src/main/resources/assets/effortlessbuilding/shaders/dissolve.vert b/src/main/resources/assets/effortlessbuilding/shaders/dissolve.vert index ac55820..f147aa0 100644 --- a/src/main/resources/assets/effortlessbuilding/shaders/dissolve.vert +++ b/src/main/resources/assets/effortlessbuilding/shaders/dissolve.vert @@ -16,7 +16,7 @@ void main() { gl_Position = ftransform();//gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; gl_FrontColor = gl_Color; - gl_BackColor = gl_Color; + //gl_BackColor = gl_Color; position = gl_Vertex; normal = gl_Normal;