summaryrefslogtreecommitdiff
path: root/src/main/java/moe/nea
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-11-09 18:11:18 +0100
committerLinnea Gräf <nea@nea.moe>2024-11-09 18:11:18 +0100
commit94f12b5bc032aac26371bf5c086492436d92878c (patch)
treec940adb066653ed4f1386e8ded60d064375861dd /src/main/java/moe/nea
downloadbeacon-range-extender-94f12b5bc032aac26371bf5c086492436d92878c.tar.gz
beacon-range-extender-94f12b5bc032aac26371bf5c086492436d92878c.tar.bz2
beacon-range-extender-94f12b5bc032aac26371bf5c086492436d92878c.zip
Init
Diffstat (limited to 'src/main/java/moe/nea')
-rw-r--r--src/main/java/moe/nea/beacons/BeaconBeamSectionExtra.java13
-rw-r--r--src/main/java/moe/nea/beacons/BeaconBlockEntityExtra.java17
-rw-r--r--src/main/java/moe/nea/beacons/BeaconRangeExtender.java5
-rw-r--r--src/main/java/moe/nea/beacons/BeaconRangeIncreaser.java16
-rw-r--r--src/main/java/moe/nea/beacons/mixin/BeaconBeamSectionMixin.java22
-rw-r--r--src/main/java/moe/nea/beacons/mixin/BeaconMixin.java94
-rw-r--r--src/main/java/moe/nea/beacons/mixin/SkullBlockRangeExtender.java14
7 files changed, 181 insertions, 0 deletions
diff --git a/src/main/java/moe/nea/beacons/BeaconBeamSectionExtra.java b/src/main/java/moe/nea/beacons/BeaconBeamSectionExtra.java
new file mode 100644
index 0000000..2f5698a
--- /dev/null
+++ b/src/main/java/moe/nea/beacons/BeaconBeamSectionExtra.java
@@ -0,0 +1,13 @@
+package moe.nea.beacons;
+
+import net.minecraft.world.level.block.entity.BeaconBlockEntity;
+
+public interface BeaconBeamSectionExtra {
+ static BeaconBeamSectionExtra cast(BeaconBlockEntity.BeaconBeamSection beaconBeamSection) {
+ return (BeaconBeamSectionExtra) beaconBeamSection;
+ }
+
+ void setRangeExtenders_nea(int newRangeExtenders);
+
+ int getRangeExtenders_nea();
+}
diff --git a/src/main/java/moe/nea/beacons/BeaconBlockEntityExtra.java b/src/main/java/moe/nea/beacons/BeaconBlockEntityExtra.java
new file mode 100644
index 0000000..46eb2eb
--- /dev/null
+++ b/src/main/java/moe/nea/beacons/BeaconBlockEntityExtra.java
@@ -0,0 +1,17 @@
+package moe.nea.beacons;
+
+import net.minecraft.world.level.block.entity.BeaconBlockEntity;
+
+import java.util.List;
+
+public interface BeaconBlockEntityExtra {
+ static BeaconBlockEntityExtra cast(BeaconBlockEntity beaconBlockEntity) {
+ return (BeaconBlockEntityExtra) beaconBlockEntity;
+ }
+
+ void setRangeExtender_nea(int rangeExtender);
+
+ int getRangeExtender_nea();
+
+ List<BeaconBlockEntity.BeaconBeamSection> getCheckingBeamSections_nea();
+}
diff --git a/src/main/java/moe/nea/beacons/BeaconRangeExtender.java b/src/main/java/moe/nea/beacons/BeaconRangeExtender.java
new file mode 100644
index 0000000..f4fd12e
--- /dev/null
+++ b/src/main/java/moe/nea/beacons/BeaconRangeExtender.java
@@ -0,0 +1,5 @@
+package moe.nea.beacons;
+
+public interface BeaconRangeExtender {
+ int extraBeaconRange_nea();
+}
diff --git a/src/main/java/moe/nea/beacons/BeaconRangeIncreaser.java b/src/main/java/moe/nea/beacons/BeaconRangeIncreaser.java
new file mode 100644
index 0000000..702a4fe
--- /dev/null
+++ b/src/main/java/moe/nea/beacons/BeaconRangeIncreaser.java
@@ -0,0 +1,16 @@
+package moe.nea.beacons;
+
+import net.fabricmc.api.ModInitializer;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BeaconRangeIncreaser implements ModInitializer {
+ public static final String MOD_ID = "beacon-range-increaser";
+
+ public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
+
+ @Override
+ public void onInitialize() {
+ }
+} \ No newline at end of file
diff --git a/src/main/java/moe/nea/beacons/mixin/BeaconBeamSectionMixin.java b/src/main/java/moe/nea/beacons/mixin/BeaconBeamSectionMixin.java
new file mode 100644
index 0000000..f4fe948
--- /dev/null
+++ b/src/main/java/moe/nea/beacons/mixin/BeaconBeamSectionMixin.java
@@ -0,0 +1,22 @@
+package moe.nea.beacons.mixin;
+
+import moe.nea.beacons.BeaconBeamSectionExtra;
+import net.minecraft.world.level.block.entity.BeaconBlockEntity;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Unique;
+
+@Mixin(BeaconBlockEntity.BeaconBeamSection.class)
+public class BeaconBeamSectionMixin implements BeaconBeamSectionExtra {
+ @Unique
+ private int rangeExtenders;
+
+ @Override
+ public void setRangeExtenders_nea(int newRangeExtenders) {
+ rangeExtenders = newRangeExtenders;
+ }
+
+ @Override
+ public int getRangeExtenders_nea() {
+ return rangeExtenders;
+ }
+}
diff --git a/src/main/java/moe/nea/beacons/mixin/BeaconMixin.java b/src/main/java/moe/nea/beacons/mixin/BeaconMixin.java
new file mode 100644
index 0000000..4602208
--- /dev/null
+++ b/src/main/java/moe/nea/beacons/mixin/BeaconMixin.java
@@ -0,0 +1,94 @@
+package moe.nea.beacons.mixin;
+
+import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
+import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
+import com.llamalad7.mixinextras.sugar.Local;
+import moe.nea.beacons.BeaconBeamSectionExtra;
+import moe.nea.beacons.BeaconBlockEntityExtra;
+import moe.nea.beacons.BeaconRangeExtender;
+import moe.nea.beacons.BeaconRangeIncreaser;
+import net.minecraft.core.BlockPos;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.block.entity.BeaconBlockEntity;
+import net.minecraft.world.level.block.state.BlockState;
+import org.objectweb.asm.Opcodes;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.ModifyArg;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import java.util.List;
+
+@Mixin(BeaconBlockEntity.class)
+public class BeaconMixin implements BeaconBlockEntityExtra {
+
+ @Shadow
+ private List<BeaconBlockEntity.BeaconBeamSection> checkingBeamSections;
+ @Unique
+ private int rangeExtenders;
+
+ @Override
+ public int getRangeExtender_nea() {
+ return rangeExtenders;
+ }
+
+ @Override
+ public void setRangeExtender_nea(int rangeExtender) {
+ this.rangeExtenders = rangeExtender;
+ }
+
+ @Override
+ public List<BeaconBlockEntity.BeaconBeamSection> getCheckingBeamSections_nea() {
+ return this.checkingBeamSections;
+ }
+
+ @Inject(method = "tick", at = @At(value = "FIELD", target = "Lnet/minecraft/world/level/block/entity/BeaconBlockEntity;beamSections:Ljava/util/List;", opcode = Opcodes.ASTORE))
+ private static void saveRangeExtender(Level level, BlockPos blockPos, BlockState blockState, BeaconBlockEntity beaconBlockEntity, CallbackInfo ci) {
+ var extra = BeaconBlockEntityExtra.cast(beaconBlockEntity);
+ var accExtraRange = 0;
+ for (var beaconBeamSection : extra.getCheckingBeamSections_nea()) {
+ var extraSection = BeaconBeamSectionExtra.cast(beaconBeamSection);
+ accExtraRange += extraSection.getRangeExtenders_nea();
+ }
+ extra.setRangeExtender_nea(accExtraRange);
+ }
+
+ @WrapOperation(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/BlockPos;above()Lnet/minecraft/core/BlockPos;"))
+ private static BlockPos checkForRangeExtender(
+ BlockPos oldBlockPos, Operation<BlockPos> original, @Local BeaconBlockEntity.BeaconBeamSection lastSection,
+ @Local(argsOnly = true) Level level) {
+ var newPos = original.call(oldBlockPos);
+ var blockState = level.getBlockState(oldBlockPos);
+ if (blockState.getBlock() instanceof BeaconRangeExtender extender && lastSection != null) {
+ var lastSectionExtra = BeaconBeamSectionExtra.cast(lastSection);
+ lastSectionExtra.setRangeExtenders_nea(
+ extender.extraBeaconRange_nea() + lastSectionExtra.getRangeExtenders_nea()
+ );
+ }
+ return newPos;
+ }
+
+ @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/entity/BeaconBlockEntity;applyEffects(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;ILnet/minecraft/core/Holder;Lnet/minecraft/core/Holder;)V"))
+ private static void applyExtraEffects(Level level, BlockPos blockPos, BlockState blockState, BeaconBlockEntity beaconBlockEntity, CallbackInfo ci) {
+ var extra = BeaconBlockEntityExtra.cast(beaconBlockEntity);
+ lastRangeExtend = extra.getRangeExtender_nea();
+ }
+
+ @Unique
+ private static int lastRangeExtend = -1;
+
+ @ModifyArg(method = "applyEffects", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/AABB;inflate(D)Lnet/minecraft/world/phys/AABB;"))
+ private static double increaseRange(double d) {
+ if (lastRangeExtend < 0) {
+ BeaconRangeIncreaser.LOGGER.error("Could not get extended range from beacon range increase mod (which is awesome, btw)");
+ return d;
+ }
+ d += lastRangeExtend;
+ lastRangeExtend = -1;
+ return d;
+ }
+
+}
diff --git a/src/main/java/moe/nea/beacons/mixin/SkullBlockRangeExtender.java b/src/main/java/moe/nea/beacons/mixin/SkullBlockRangeExtender.java
new file mode 100644
index 0000000..90a1fc0
--- /dev/null
+++ b/src/main/java/moe/nea/beacons/mixin/SkullBlockRangeExtender.java
@@ -0,0 +1,14 @@
+package moe.nea.beacons.mixin;
+
+import moe.nea.beacons.BeaconRangeExtender;
+import net.minecraft.world.level.block.SkullBlock;
+import net.minecraft.world.level.block.WitherSkullBlock;
+import org.spongepowered.asm.mixin.Mixin;
+
+@Mixin(SkullBlock.class)
+public class SkullBlockRangeExtender implements BeaconRangeExtender {
+ @Override
+ public int extraBeaconRange_nea() {
+ return ((SkullBlock) (Object) this) instanceof WitherSkullBlock ? 32 : 5;
+ }
+}