aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io
diff options
context:
space:
mode:
authorRoman / Linnea Gräf <roman.graef@gmail.com>2022-11-03 11:34:09 +0100
committerGitHub <noreply@github.com>2022-11-03 11:34:09 +0100
commit2a6dbf5407b5772db3ac0d203da3cdfac13d69d5 (patch)
treeac8cf5047e200423c8cdbb3aee57787e1d5f6f50 /src/main/java/io
parent5f0291595204c06be9c6462dce6b166b03c19f68 (diff)
downloadNotEnoughUpdates-2a6dbf5407b5772db3ac0d203da3cdfac13d69d5.tar.gz
NotEnoughUpdates-2a6dbf5407b5772db3ac0d203da3cdfac13d69d5.tar.bz2
NotEnoughUpdates-2a6dbf5407b5772db3ac0d203da3cdfac13d69d5.zip
Add fully Hypixel-Rule compliant glowing mush highlighter (#266)
Diffstat (limited to 'src/main/java/io')
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java2
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java53
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/events/NEUEvent.java4
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/events/SpawnParticleEvent.java97
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java15
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FishingHelper.java47
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/world/GenericBlockHighlighter.java89
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/world/GlowingMushroomHighlighter.java74
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinNetHandlerPlayClient.java17
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java8
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/WorldConfig.java43
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/util/MathUtil.java26
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java4
13 files changed, 425 insertions, 54 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
index 948b2550..45efe151 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
@@ -66,6 +66,7 @@ import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.Custom
import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.CustomBlockSounds;
import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.DwarvenMinesTextures;
import io.github.moulberry.notenoughupdates.miscfeatures.updater.AutoUpdater;
+import io.github.moulberry.notenoughupdates.miscfeatures.world.GlowingMushroomHighlighter;
import io.github.moulberry.notenoughupdates.miscgui.CalendarOverlay;
import io.github.moulberry.notenoughupdates.miscgui.InventoryStorageSelector;
import io.github.moulberry.notenoughupdates.miscgui.SignCalculator;
@@ -329,6 +330,7 @@ public class NotEnoughUpdates {
MinecraftForge.EVENT_BUS.register(AuctionBINWarning.getInstance());
MinecraftForge.EVENT_BUS.register(MinionHelperManager.getInstance());
MinecraftForge.EVENT_BUS.register(navigation);
+ MinecraftForge.EVENT_BUS.register(new GlowingMushroomHighlighter());
MinecraftForge.EVENT_BUS.register(new WorldListener(this));
MinecraftForge.EVENT_BUS.register(TitleUtil.getInstance());
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java
index 107c79e9..2b14bfed 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java
@@ -308,7 +308,21 @@ public class RenderUtils {
}
}
- private static void renderBoundingBox(double x, double y, double z, int rgb, float alphaMult, float partialTicks) {
+ public static void renderBoundingBox(
+ BlockPos worldPos,
+ int rgb,
+ float partialTicks
+ ) {
+ Vector3f interpolatedPlayerPosition = getInterpolatedPlayerPosition(partialTicks);
+ renderBoundingBoxInViewSpace(
+ worldPos.getX() - interpolatedPlayerPosition.x,
+ worldPos.getY() - interpolatedPlayerPosition.y,
+ worldPos.getZ() - interpolatedPlayerPosition.z,
+ rgb
+ );
+ }
+
+ private static void renderBoundingBoxInViewSpace(double x, double y, double z, int rgb) {
AxisAlignedBB bb = new AxisAlignedBB(x, y, z, x + 1, y + 1, z + 1);
GlStateManager.disableDepth();
@@ -346,33 +360,42 @@ public class RenderUtils {
RenderUtils.renderBeaconBeam(x, y, z, rgb, 1.0f, partialTicks, distSq > 10 * 10);
}
- public static void renderBeaconBeamOrBoundingBox(BlockPos block, int rgb, float alphaMult, float partialTicks) {
- double viewerX;
- double viewerY;
- double viewerZ;
+ public static Vector3f getInterpolatedPlayerPosition(float partialTicks) {
Vector3f aoteInterpPos = CustomItemEffects.INSTANCE.getCurrentPosition();
if (aoteInterpPos != null) {
- viewerX = aoteInterpPos.x;
- viewerY = aoteInterpPos.y;
- viewerZ = aoteInterpPos.z;
+ return new Vector3f(aoteInterpPos);
} else {
Entity viewer = Minecraft.getMinecraft().getRenderViewEntity();
- viewerX = viewer.lastTickPosX + (viewer.posX - viewer.lastTickPosX) * partialTicks;
- viewerY = viewer.lastTickPosY + (viewer.posY - viewer.lastTickPosY) * partialTicks;
- viewerZ = viewer.lastTickPosZ + (viewer.posZ - viewer.lastTickPosZ) * partialTicks;
+ Vector3f lastPos = new Vector3f(
+ (float) viewer.lastTickPosX,
+ (float) viewer.lastTickPosY,
+ (float) viewer.lastTickPosZ
+ );
+ Vector3f currentPos = new Vector3f(
+ (float) viewer.posX,
+ (float) viewer.posY,
+ (float) viewer.posZ
+ );
+ Vector3f movement = Vector3f.sub(currentPos, lastPos, currentPos);
+ movement.scale(partialTicks);
+ return Vector3f.add(lastPos, movement, lastPos);
}
+ }
- double x = block.getX() - viewerX;
- double y = block.getY() - viewerY;
- double z = block.getZ() - viewerZ;
+ public static void renderBeaconBeamOrBoundingBox(BlockPos block, int rgb, float alphaMult, float partialTicks) {
+
+ Vector3f interpolatedPlayerPosition = getInterpolatedPlayerPosition(partialTicks);
+ double x = block.getX() - interpolatedPlayerPosition.x;
+ double y = block.getY() - interpolatedPlayerPosition.y;
+ double z = block.getZ() - interpolatedPlayerPosition.z;
double distSq = x * x + y * y + z * z;
if (distSq > 10 * 10) {
RenderUtils.renderBeaconBeam(x, y, z, rgb, 1.0f, partialTicks, true);
} else {
- RenderUtils.renderBoundingBox(x, y, z, rgb, 1.0f, partialTicks);
+ RenderUtils.renderBoundingBoxInViewSpace(x, y, z, rgb);
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/events/NEUEvent.java b/src/main/java/io/github/moulberry/notenoughupdates/events/NEUEvent.java
index 178431d0..ed8da0d5 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/events/NEUEvent.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/events/NEUEvent.java
@@ -27,4 +27,8 @@ public class NEUEvent extends Event {
MinecraftForge.EVENT_BUS.post(this);
return isCancelable() && isCanceled();
}
+
+ public void cancel() {
+ setCanceled(true);
+ }
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/events/SpawnParticleEvent.java b/src/main/java/io/github/moulberry/notenoughupdates/events/SpawnParticleEvent.java
new file mode 100644
index 00000000..818ad0fa
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/events/SpawnParticleEvent.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.events;
+
+import net.minecraft.util.EnumParticleTypes;
+import net.minecraftforge.fml.common.eventhandler.Cancelable;
+
+@Cancelable
+public class SpawnParticleEvent extends NEUEvent {
+
+ // I LOVE code duplication!
+ // I LOVE repeating field names five times to declare a data class!
+ // I LOVE that yummy high fructose corn syrup!
+ // I LOVE the United Nations!
+
+ EnumParticleTypes particleTypes;
+ boolean isLongDistance;
+ double xCoord;
+ double yCoord;
+ double zCoord;
+ double xOffset;
+ double yOffset;
+ double zOffset;
+ int[] params;
+
+ public SpawnParticleEvent(
+ EnumParticleTypes particleTypes,
+ boolean isLongDistance,
+ double xCoord, double yCoord, double zCoord,
+ double xOffset, double yOffset, double zOffset,
+ int[] params
+ ) {
+ this.particleTypes = particleTypes;
+ this.isLongDistance = isLongDistance;
+ this.xCoord = xCoord;
+ this.yCoord = yCoord;
+ this.zCoord = zCoord;
+ this.xOffset = xOffset;
+ this.yOffset = yOffset;
+ this.zOffset = zOffset;
+ this.params = params;
+ }
+
+ public EnumParticleTypes getParticleTypes() {
+ return particleTypes;
+ }
+
+ public boolean isLongDistance() {
+ return isLongDistance;
+ }
+
+ public double getXCoord() {
+ return xCoord;
+ }
+
+ public double getYCoord() {
+ return yCoord;
+ }
+
+ public double getZCoord() {
+ return zCoord;
+ }
+
+ public double getXOffset() {
+ return xOffset;
+ }
+
+ public double getYOffset() {
+ return yOffset;
+ }
+
+ public double getZOffset() {
+ return zOffset;
+ }
+
+ public int[] getParams() {
+ return params;
+ }
+
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java
index f378fdca..50975af9 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java
@@ -22,6 +22,7 @@ package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.core.util.Line;
import io.github.moulberry.notenoughupdates.core.util.Vec3Comparable;
+import io.github.moulberry.notenoughupdates.events.SpawnParticleEvent;
import io.github.moulberry.notenoughupdates.options.NEUConfig;
import io.github.moulberry.notenoughupdates.options.customtypes.NEUDebugFlag;
import io.github.moulberry.notenoughupdates.util.NEUDebugLogger;
@@ -346,15 +347,15 @@ public class CrystalWishingCompassSolver {
* per-area structure missing, or because Hypixel.
* Always within 1 block of X=513 Y=106 Z=551.
*/
- public void onSpawnParticle(
- EnumParticleTypes particleType,
- double x,
- double y,
- double z
- ) {
+ @SubscribeEvent
+ public void onSpawnParticle(SpawnParticleEvent event) {
+ EnumParticleTypes particleType = event.getParticleTypes();
+ double x = event.getXCoord();
+ double y = event.getYCoord();
+ double z = event.getZCoord();
if (!NotEnoughUpdates.INSTANCE.config.mining.wishingCompassSolver ||
particleType != EnumParticleTypes.VILLAGER_HAPPY ||
- !SBInfo.getInstance().getLocation().equals("crystal_hollows")) {
+ !"crystal_hollows".equals(SBInfo.getInstance().getLocation())) {
return;
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FishingHelper.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FishingHelper.java
index fff8d269..e3afc73d 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FishingHelper.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FishingHelper.java
@@ -21,6 +21,7 @@ package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.core.ChromaColour;
+import io.github.moulberry.notenoughupdates.events.SpawnParticleEvent;
import io.github.moulberry.notenoughupdates.util.SpecialColour;
import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.block.state.IBlockState;
@@ -380,24 +381,24 @@ public class FishingHelper {
return 1 / (d + (1 / (ZERO_PITCH - MAX_PITCH))) * (1 - d / MAX_DISTANCE) + MAX_PITCH;
}
- public boolean onSpawnParticle(
- EnumParticleTypes particleType,
- double x,
- double y,
- double z,
- double xOffset,
- double yOffset,
- double zOffset
- ) {
+ @SubscribeEvent
+ public void onSpawnParticle(SpawnParticleEvent event) {
+ EnumParticleTypes particleType = event.getParticleTypes();
+ double x = event.getXCoord();
+ double y = event.getYCoord();
+ double z = event.getZCoord();
+ double xOffset = event.getXOffset();
+ double yOffset = event.getYOffset();
+ double zOffset = event.getZOffset();
if (!NotEnoughUpdates.INSTANCE.config.fishing.hideOtherPlayerAll &&
!NotEnoughUpdates.INSTANCE.config.fishing.enableCustomParticles &&
!NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarning &&
!NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarningR) {
- return false;
+ return;
}
if (hookEntities.isEmpty()) {
- return false;
+ return;
}
if ((particleType == EnumParticleTypes.WATER_WAKE || particleType == EnumParticleTypes.SMOKE_NORMAL || particleType == EnumParticleTypes.FLAME) && Math.abs(
@@ -610,22 +611,24 @@ public class FishingHelper {
particleTypeI = NotEnoughUpdates.INSTANCE.config.fishing.yourParticleType;
particleCustomColour = NotEnoughUpdates.INSTANCE.config.fishing.yourParticleColour;
} else if (NotEnoughUpdates.INSTANCE.config.fishing.hideOtherPlayerAll) {
- return true;
+ event.cancel();
+ return;
} else {
particleTypeI = NotEnoughUpdates.INSTANCE.config.fishing.otherParticleType;
particleCustomColour = NotEnoughUpdates.INSTANCE.config.fishing.otherParticleColour;
}
if (!NotEnoughUpdates.INSTANCE.config.fishing.enableCustomParticles) {
- return false;
+ return;
}
int argb = SpecialColour.specialToChromaRGB(particleCustomColour);
if (particleTypeI == 0) {
- return false;
+ return;
} else if (particleTypeI == 1) {
- return true;
+ event.cancel();
+ return;
}
if (Minecraft.getMinecraft() != null && Minecraft.getMinecraft().getRenderViewEntity() != null &&
@@ -633,11 +636,13 @@ public class FishingHelper {
int i = Minecraft.getMinecraft().gameSettings.particleSetting;
if (i == 1 && Minecraft.getMinecraft().theWorld.rand.nextInt(3) == 0) {
- return true;
+ event.cancel();
+ return;
}
if (i >= 2) {
- return true;
+ event.cancel();
+ return;
}
double xDist = Minecraft.getMinecraft().getRenderViewEntity().posX - x;
@@ -678,7 +683,8 @@ public class FishingHelper {
}
if (customColour && (((argb >> 24) & 0xFF) < 10)) {
- return true;
+ event.cancel();
+ return;
}
EntityFX fx = Minecraft.getMinecraft().effectRenderer.spawnEffectParticle(
@@ -706,10 +712,9 @@ public class FishingHelper {
}
}
- return true;
+ event.cancel();
+ return;
}
}
-
- return false;
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/world/GenericBlockHighlighter.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/world/GenericBlockHighlighter.java
new file mode 100644
index 00000000..0e71c7a9
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/world/GenericBlockHighlighter.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscfeatures.world;
+
+import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.World;
+import net.minecraftforge.client.event.RenderWorldLastEvent;
+import net.minecraftforge.event.world.WorldEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public abstract class GenericBlockHighlighter {
+ protected abstract boolean isEnabled();
+
+ protected abstract boolean isValidHighlightSpot(BlockPos key);
+
+ protected abstract int getColor(BlockPos blockPos);
+
+ public final Set<BlockPos> highlightedBlocks = new HashSet<>();
+
+ @SubscribeEvent
+ public void onWorldRenderLast(RenderWorldLastEvent event) {
+ if (!isEnabled()) return;
+ World w = Minecraft.getMinecraft().theWorld;
+ if (w == null) return;
+ for (BlockPos blockPos : highlightedBlocks) {
+ RenderUtils.renderBoundingBox(blockPos, getColor(blockPos), event.partialTicks);
+ }
+ }
+
+ @SubscribeEvent
+ public void onTick(TickEvent.ClientTickEvent ev) {
+ if (ev.phase != TickEvent.Phase.END) return;
+ highlightedBlocks.removeIf(it -> !isValidHighlightSpot(it) || !canPlayerSeeBlock(it.getX(), it.getY(), it.getZ()));
+ }
+
+ protected boolean canPlayerSeeBlock(double xCoord, double yCoord, double zCoord) {
+ EntityPlayerSP p = Minecraft.getMinecraft().thePlayer;
+ if (p == null) return false;
+ World w = p.worldObj;
+ MovingObjectPosition hitResult = w.rayTraceBlocks(
+ new Vec3(p.posX, p.posY + p.eyeHeight, p.posZ),
+ new Vec3(xCoord, yCoord, zCoord),
+ false,
+ true,
+ true
+ );
+ BlockPos bp = new BlockPos(xCoord, yCoord, zCoord);
+ return hitResult == null
+ || hitResult.typeOfHit != MovingObjectPosition.MovingObjectType.BLOCK
+ || bp.equals(hitResult.getBlockPos());
+ }
+
+ @SubscribeEvent
+ public void onWorldChange(WorldEvent.Load event) {
+ highlightedBlocks.clear();
+ }
+
+ public void registerInterest(BlockPos pos) {
+ if (isValidHighlightSpot(pos) && canPlayerSeeBlock(pos.getX(), pos.getY(), pos.getZ())) {
+ highlightedBlocks.add(pos);
+ }
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/world/GlowingMushroomHighlighter.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/world/GlowingMushroomHighlighter.java
new file mode 100644
index 00000000..9857f84b
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/world/GlowingMushroomHighlighter.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscfeatures.world;
+
+import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
+import io.github.moulberry.notenoughupdates.events.SpawnParticleEvent;
+import io.github.moulberry.notenoughupdates.util.SBInfo;
+import io.github.moulberry.notenoughupdates.util.SpecialColour;
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumParticleTypes;
+import net.minecraft.world.World;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+
+import static io.github.moulberry.notenoughupdates.util.MathUtil.isDecimalPartApproximately;
+
+public class GlowingMushroomHighlighter extends GenericBlockHighlighter {
+
+ @SubscribeEvent
+ public void onParticleSpawn(SpawnParticleEvent event) {
+ if (!isEnabled()) return;
+ if (event.getParticleTypes() == EnumParticleTypes.SPELL_MOB) {
+ BlockPos blockPos = new BlockPos(event.getXCoord(), event.getYCoord(), event.getZCoord());
+ if (highlightedBlocks.contains(blockPos)) return;
+ if (
+ isDecimalPartApproximately(event.getXCoord(), 0.5)
+ && isDecimalPartApproximately(event.getYCoord(), 0.1)
+ && isDecimalPartApproximately(event.getZCoord(), 0.5)
+ ) {
+ registerInterest(blockPos);
+ }
+ }
+ }
+
+
+ @Override
+ protected boolean isEnabled() {
+ return "farming_1".equals(SBInfo.getInstance().getLocation())
+ && NotEnoughUpdates.INSTANCE.config.world.highlightGlowingMushrooms;
+ }
+
+ @Override
+ protected boolean isValidHighlightSpot(BlockPos key) {
+ World w = Minecraft.getMinecraft().theWorld;
+ if (w == null) return false;
+ Block b = w.getBlockState(key).getBlock();
+ return b == Blocks.brown_mushroom || b == Blocks.red_mushroom;
+ }
+
+ @Override
+ protected int getColor(BlockPos blockPos) {
+ return SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.world.glowingMushroomColor);
+ }
+
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinNetHandlerPlayClient.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinNetHandlerPlayClient.java
index e47b03df..4bb91109 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinNetHandlerPlayClient.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinNetHandlerPlayClient.java
@@ -19,11 +19,10 @@
package io.github.moulberry.notenoughupdates.mixins;
+import io.github.moulberry.notenoughupdates.events.SpawnParticleEvent;
import io.github.moulberry.notenoughupdates.miscfeatures.AntiCoopAdd;
-import io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver;
import io.github.moulberry.notenoughupdates.miscfeatures.CustomItemEffects;
import io.github.moulberry.notenoughupdates.miscfeatures.EnchantingSolvers;
-import io.github.moulberry.notenoughupdates.miscfeatures.FishingHelper;
import io.github.moulberry.notenoughupdates.miscfeatures.ItemCooldowns;
import io.github.moulberry.notenoughupdates.miscfeatures.MiningStuff;
import io.github.moulberry.notenoughupdates.miscfeatures.NewApiKeyHelper;
@@ -80,22 +79,18 @@ public class MixinNetHandlerPlayClient {
double xCoord, double yCoord, double zCoord,
double xOffset, double yOffset, double zOffset, int[] params
) {
- CrystalWishingCompassSolver.getInstance().onSpawnParticle(
- particleTypes,
- xCoord,
- yCoord,
- zCoord
- );
- boolean override = FishingHelper.getInstance().onSpawnParticle(
+ SpawnParticleEvent event = new SpawnParticleEvent(
particleTypes,
+ isLongDistance,
xCoord,
yCoord,
zCoord,
xOffset,
yOffset,
- zOffset
+ zOffset,
+ params
);
- if (!override) {
+ if (!event.post()) {
world.spawnParticle(particleTypes, isLongDistance, xCoord, yCoord, zCoord, xOffset, yOffset, zOffset, params);
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java
index 35f219e0..9c4343cb 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java
@@ -34,6 +34,7 @@ import io.github.moulberry.notenoughupdates.miscgui.GuiEnchantColour;
import io.github.moulberry.notenoughupdates.miscgui.GuiInvButtonEditor;
import io.github.moulberry.notenoughupdates.miscgui.NEUOverlayPlacements;
import io.github.moulberry.notenoughupdates.options.customtypes.NEUDebugFlag;
+import io.github.moulberry.notenoughupdates.options.seperateSections.WorldConfig;
import io.github.moulberry.notenoughupdates.options.seperateSections.AHGraph;
import io.github.moulberry.notenoughupdates.options.seperateSections.AHTweaks;
import io.github.moulberry.notenoughupdates.options.seperateSections.AccessoryBag;
@@ -338,6 +339,13 @@ public class NEUConfig extends Config {
@Expose
@Category(
+ name = "World Renderer",
+ desc = "In World Renderers"
+ )
+ public WorldConfig world = new WorldConfig();
+
+ @Expose
+ @Category(
name = "AH Tweaks",
desc = "Tweaks for Hypixel's (Not NEU's) Auction House"
)
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/WorldConfig.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/WorldConfig.java
new file mode 100644
index 00000000..1484cb87
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/WorldConfig.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.options.seperateSections;
+
+import com.google.gson.annotations.Expose;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorBoolean;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorColour;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption;
+
+public class WorldConfig {
+ @Expose
+ @ConfigOption(
+ name = "Highlight Glowing Mushrooms",
+ desc = "Highlight glowing mushrooms in the mushroom gorge"
+ )
+ @ConfigEditorBoolean
+ public boolean highlightGlowingMushrooms = false;
+
+ @Expose
+ @ConfigOption(
+ name = "Glowing Mushroom Colour",
+ desc = "In which colour should glowing mushrooms be highlighted"
+ )
+ @ConfigEditorColour
+ public String glowingMushroomColor = "0:255:142:88:36";
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/MathUtil.java b/src/main/java/io/github/moulberry/notenoughupdates/util/MathUtil.java
new file mode 100644
index 00000000..f358f37f
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/util/MathUtil.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.util;
+
+public class MathUtil {
+ public static boolean isDecimalPartApproximately(double fullValue, double expectedDecimalPart) {
+ return Math.abs(Math.abs(fullValue % 1) - expectedDecimalPart) < 0.01;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java
index e28e52d6..b8e8312d 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java
@@ -271,11 +271,15 @@ public class SBInfo {
}
}
+ /**
+ * @return the current mode, as returned by /locraw, usually equivalent to a skyblock public island type.
+ */
public String getLocation() {
return mode;
}
public void setLocation(String location) {
+ location = location == null ? location :location.intern();
if (!Objects.equals(this.mode, location)) {
MinecraftForge.EVENT_BUS.post(new LocationChangeEvent(location, this.mode));
}