From 4b22cea9abb4e40c105d3972568b0a684ac3e9fa Mon Sep 17 00:00:00 2001 From: Christian Knaapen Date: Tue, 25 Aug 2020 15:43:15 +0200 Subject: [PATCH] Fixes from 1.14 (Fixed freezing when looking up + setting NBT data). --- .../buildmode/BuildModes.java | 25 +++++++++++++++++++ .../buildmode/ThreeClicksBuildMode.java | 2 +- .../buildmode/TwoClicksBuildMode.java | 1 + .../buildmode/buildmodes/Floor.java | 2 +- .../buildmode/buildmodes/Line.java | 3 ++- .../buildmode/buildmodes/Wall.java | 2 +- .../helper/SurvivalHelper.java | 22 +++++++--------- src/main/resources/META-INF/mods.toml | 2 +- 8 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java index 09ab609..ef563a0 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java @@ -229,6 +229,31 @@ public class BuildModes { return new Vec3d(x, y, z); } + //Use this instead of player.getLookVec() in any buildmodes code + public static Vec3d getPlayerLookVec(PlayerEntity player){ + Vec3d lookVec = player.getLookVec(); + double x = lookVec.x; + double y = lookVec.y; + double z = lookVec.z; + + //Further calculations (findXBound etc) don't like any component being 0 or 1 (e.g. dividing by 0) + //isCriteriaValid below will take up to 2 minutes to raytrace blocks towards infinity if that is the case + //So make sure they are close to but never exactly 0 or 1 + if (Math.abs(x) < 0.0001) x = 0.0001; + if (Math.abs(x - 1.0) < 0.0001) x = 0.9999; + if (Math.abs(x + 1.0) < 0.0001) x = -0.9999; + + if (Math.abs(y) < 0.0001) y = 0.0001; + if (Math.abs(y - 1.0) < 0.0001) y = 0.9999; + if (Math.abs(y + 1.0) < 0.0001) y = -0.9999; + + if (Math.abs(z) < 0.0001) z = 0.0001; + if (Math.abs(z - 1.0) < 0.0001) z = 0.9999; + if (Math.abs(z + 1.0) < 0.0001) z = -0.9999; + + return new Vec3d(x, y, z); + } + public static boolean isCriteriaValid(Vec3d start, Vec3d look, int reach, PlayerEntity player, boolean skipRaytrace, Vec3d lineBound, Vec3d planeBound, double distToPlayerSq) { boolean intersects = false; if (!skipRaytrace) { diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/ThreeClicksBuildMode.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/ThreeClicksBuildMode.java index f6695a5..3d8308b 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/ThreeClicksBuildMode.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/ThreeClicksBuildMode.java @@ -169,7 +169,7 @@ public abstract class ThreeClicksBuildMode extends BaseBuildMode { //Finds height after floor has been chosen in buildmodes with 3 clicks public static BlockPos findHeight(PlayerEntity player, BlockPos secondPos, boolean skipRaytrace) { - Vec3d look = player.getLookVec(); + Vec3d look = BuildModes.getPlayerLookVec(player); Vec3d start = new Vec3d(player.getPosX(), player.getPosY() + player.getEyeHeight(), player.getPosZ()); List criteriaList = new ArrayList<>(3); diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/TwoClicksBuildMode.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/TwoClicksBuildMode.java index 744d2a0..15d53e3 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/TwoClicksBuildMode.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/TwoClicksBuildMode.java @@ -4,6 +4,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.helper.ReachHelper; import java.util.ArrayList; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Floor.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Floor.java index c2e3673..6f7fc7f 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Floor.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Floor.java @@ -35,7 +35,7 @@ public class Floor extends TwoClicksBuildMode { } public static BlockPos findFloor(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) { - Vec3d look = player.getLookVec(); + Vec3d look = BuildModes.getPlayerLookVec(player); Vec3d start = new Vec3d(player.getPosX(), player.getPosY() + player.getEyeHeight(), player.getPosZ()); List criteriaList = new ArrayList<>(3); diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Line.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Line.java index 02ec858..a49413b 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Line.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Line.java @@ -3,6 +3,7 @@ package nl.requios.effortlessbuilding.buildmode.buildmodes; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; import nl.requios.effortlessbuilding.helper.ReachHelper; @@ -60,7 +61,7 @@ public class Line extends TwoClicksBuildMode { } public static BlockPos findLine(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) { - Vec3d look = player.getLookVec(); + Vec3d look = BuildModes.getPlayerLookVec(player); Vec3d start = new Vec3d(player.getPosX(), player.getPosY() + player.getEyeHeight(), player.getPosZ()); List criteriaList = new ArrayList<>(3); diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Wall.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Wall.java index 4154ebf..807dcbf 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Wall.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Wall.java @@ -38,7 +38,7 @@ public class Wall extends TwoClicksBuildMode { } public static BlockPos findWall(PlayerEntity player, BlockPos firstPos, boolean skipRaytrace) { - Vec3d look = player.getLookVec(); + Vec3d look = BuildModes.getPlayerLookVec(player); Vec3d start = new Vec3d(player.getPosX(), player.getPosY() + player.getEyeHeight(), player.getPosZ()); List criteriaList = new ArrayList<>(3); diff --git a/src/main/java/nl/requios/effortlessbuilding/helper/SurvivalHelper.java b/src/main/java/nl/requios/effortlessbuilding/helper/SurvivalHelper.java index 172590c..428f08e 100644 --- a/src/main/java/nl/requios/effortlessbuilding/helper/SurvivalHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/helper/SurvivalHelper.java @@ -1,9 +1,11 @@ package nl.requios.effortlessbuilding.helper; +import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.block.*; import net.minecraft.block.SlabBlock; import net.minecraft.block.material.Material; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.util.*; import net.minecraft.block.BlockState; @@ -57,21 +59,15 @@ public class SurvivalHelper { //Drop existing block dropBlock(world, player, pos); - //TryPlace sets block with offset, so we only do world.setBlockState now - //Remember count of itemstack before tryPlace, and set it back after. - //TryPlace reduces stack even in creative so it is not usable here. -// int origCount = itemstack.getCount(); + //TryPlace sets block with offset and reduces itemstack count in creative, so we copy only parts of it // BlockItemUseContext blockItemUseContext = new BlockItemUseContext(world, player, itemstack, pos, facing, (float) hitVec.x, (float) hitVec.y, (float) hitVec.z); // EnumActionResult result = ((ItemBlock) itemstack.getItem()).tryPlace(blockItemUseContext); -// itemstack.setCount(origCount); - - //Set our (rotated) blockstate - world.setBlockState(pos, blockState, 3); -// blockState.onBlockAdded(world, pos, blockState); -// block.onBlockPlacedBy(world, pos, blockState, player, itemstack); -// world.notifyBlockUpdate(pos, blockState, world.getBlockState(pos), 3); - -// if (result != EnumActionResult.SUCCESS) return false; + if (!world.setBlockState(pos, blockState, 3)) return false; + BlockItem.setTileEntityNBT(world, player, pos, itemstack); //Actually BlockItem::onBlockPlaced but that is protected + block.onBlockPlacedBy(world, pos, blockState, player, itemstack); + if (player instanceof ServerPlayerEntity) { + CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayerEntity)player, pos, itemstack); + } BlockState afterState = world.getBlockState(pos); diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 062c4a5..3109408 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -18,7 +18,7 @@ version="${file.jarVersion}" #mandatory # A display name for the mod displayName="Effortless Building" #mandatory # A URL to query for updates for this mod. See the JSON update specification -updateJSONURL="http://myurl.me/" #optional +#updateJSONURL="example.com" #optional # A URL for the "homepage" for this mod, displayed in the mod UI displayURL="https://minecraft.curseforge.com/projects/effortless-building" #optional # A file name (in the root of the mod JAR) containing a logo for display