From 957a0ffba182dcafa07d773c76d6851484df0b7f Mon Sep 17 00:00:00 2001 From: DragonOfVoid <47323076+DragonOfVoid@users.noreply.github.com> Date: Sat, 26 Sep 2026 16:11:51 +0300 Subject: [PATCH 1/6] Intercepted shift-clicking event on the beacon. --- gradle.properties | 11 ++--- .../ru/Jor/BeaconRadius/BeaconRadius.java | 44 +++++++++++++++++++ .../client/BeaconRadiusClient.java | 11 +++++ .../ru/joutak/templatemod/TemplateMod.java | 23 ---------- .../templatemod/client/TemplateModClient.java | 12 ----- src/main/resources/fabric.mod.json | 10 ++--- 6 files changed, 66 insertions(+), 45 deletions(-) create mode 100644 src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java create mode 100644 src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java delete mode 100644 src/main/java/ru/joutak/templatemod/TemplateMod.java delete mode 100644 src/main/java/ru/joutak/templatemod/client/TemplateModClient.java diff --git a/gradle.properties b/gradle.properties index 75dbe5b..b3bdb46 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,9 +1,10 @@ # Mod properties -repo=https://github.com/JouTak/TemplateMod-Java -group=ru.joutak -mod_name=TemplateMod-Java -mod_id=templatemod -version=1.0.0 +repo=https://github.com/DragonOfVoid/BeaconRadius +group=ru.jor +mod_name=beacon-radius +mod_id=beaconradius +version=0.0.1 # Gradle properties org.gradle.parallel=true +org.gradle.configuration-cache=true \ No newline at end of file diff --git a/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java b/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java new file mode 100644 index 0000000..f5a7894 --- /dev/null +++ b/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java @@ -0,0 +1,44 @@ +package ru.Jor.BeaconRadius; + + +import com.mojang.authlib.minecraft.client.MinecraftClient; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.event.player.UseBlockCallback; +import net.minecraft.util.datafix.fixes.TextComponentStringifiedFlagsFix; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.level.block.Blocks; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.awt.*; + +public class BeaconRadius implements ModInitializer { + + public static final String MOD_ID = "beaconradius"; + public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); + + private static BeaconRadius instance; + + public static BeaconRadius getInstance() { + return instance; + } + + @Override + public void onInitialize() { + instance = this; + UseBlockCallback.EVENT.register((player, world, hand, hitResult) -> { + if (player.isCrouching()) { + if (world.getBlockState(hitResult.getBlockPos()).is(Blocks.BEACON)) { + System.out.println("interacted with beacon"); + return InteractionResult.SUCCESS; + } + } + return InteractionResult.PASS; + }); + LOGGER.info("Mod {} initialized!", MOD_ID); + } + + public static void injectIntoBeacon(){ + + } +} diff --git a/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java b/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java new file mode 100644 index 0000000..c4bcb22 --- /dev/null +++ b/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java @@ -0,0 +1,11 @@ +package ru.Jor.BeaconRadius.client; + +import net.fabricmc.api.ClientModInitializer; +import ru.Jor.BeaconRadius.BeaconRadius; +public class BeaconRadiusClient implements ClientModInitializer { + + @Override + public void onInitializeClient() { + BeaconRadius.LOGGER.info("Client side of mod {} initialized!", BeaconRadius.MOD_ID); + } +} diff --git a/src/main/java/ru/joutak/templatemod/TemplateMod.java b/src/main/java/ru/joutak/templatemod/TemplateMod.java deleted file mode 100644 index 670de0e..0000000 --- a/src/main/java/ru/joutak/templatemod/TemplateMod.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.joutak.templatemod; - -import net.fabricmc.api.ModInitializer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class TemplateMod implements ModInitializer { - - public static final String MOD_ID = "templatemod"; - public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); - - private static TemplateMod instance; - - public static TemplateMod getInstance() { - return instance; - } - - @Override - public void onInitialize() { - instance = this; - LOGGER.info("Mod {} initialized!", MOD_ID); - } -} diff --git a/src/main/java/ru/joutak/templatemod/client/TemplateModClient.java b/src/main/java/ru/joutak/templatemod/client/TemplateModClient.java deleted file mode 100644 index 0a91541..0000000 --- a/src/main/java/ru/joutak/templatemod/client/TemplateModClient.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.joutak.templatemod.client; - -import net.fabricmc.api.ClientModInitializer; -import ru.joutak.templatemod.TemplateMod; - -public class TemplateModClient implements ClientModInitializer { - - @Override - public void onInitializeClient() { - TemplateMod.LOGGER.info("Client side of mod {} initialized!", TemplateMod.MOD_ID); - } -} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 2be069a..d32b6a4 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -3,22 +3,22 @@ "id": "${MOD_ID}", "version": "${VERSION}", "name": "${MOD_NAME}", - "description": "Заготовка для мода на JouTak (joutak.ru)", + "description": "Visualase beacon AOE", "authors": [ - "JouTak" + "Jor" ], "contact": { - "homepage": "https://joutak.ru", + "homepage": "goshavas2000@ya.ru", "sources": "${WEBSITE}" }, "license": "MIT", "environment": "*", "entrypoints": { "main": [ - "ru.joutak.templatemod.TemplateMod" + "ru.Jor.BeaconRadius.BeaconRadius" ], "client": [ - "ru.joutak.templatemod.client.TemplateModClient" + "ru.Jor.BeaconRadius.client.BeaconRadiusClient" ] }, "mixins": [], From cea24b1eb543143e68908632ff7a1d3eee315096 Mon Sep 17 00:00:00 2001 From: DragonOfVoid <47323076+DragonOfVoid@users.noreply.github.com> Date: Sun, 27 Sep 2026 02:55:21 +0300 Subject: [PATCH 2/6] added external storage for beacon locations, linked to SP world name or address of MP one --- .../java/ru/Jor/BeaconRadius/BRStorage.java | 100 ++++++++++++++++++ .../ru/Jor/BeaconRadius/BeaconRadius.java | 24 +++-- 2 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 src/main/java/ru/Jor/BeaconRadius/BRStorage.java diff --git a/src/main/java/ru/Jor/BeaconRadius/BRStorage.java b/src/main/java/ru/Jor/BeaconRadius/BRStorage.java new file mode 100644 index 0000000..43e4662 --- /dev/null +++ b/src/main/java/ru/Jor/BeaconRadius/BRStorage.java @@ -0,0 +1,100 @@ +package ru.Jor.BeaconRadius; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.mojang.authlib.minecraft.client.MinecraftClient; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.storage.LevelResource; +import org.spongepowered.include.com.google.gson.GsonBuilder; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.util.ArrayList; +import java.util.List; + +public class BRStorage { + private static File StorageDir = new File(FabricLoader.getInstance().getGameDir().toFile(),"BeaconRadius"); + + private static List blockCache = new ArrayList<>(); + + public static void Toggle(BlockPos block){ + //if(blockCache.isEmpty()){ + // blockCache.add(block); + //} else + if(blockCache.contains(block)){ + blockCache.remove(block); + BeaconRadius.LOGGER.info("removed block"); + }else{ + blockCache.add(block); + BeaconRadius.LOGGER.info("added block"); + } + save(); + } + + public static void onJoin(){ + load(); + } + + private static boolean save(){ + File worldStorage = FileName(); + + if(worldStorage==null) return false; + if(!worldStorage.exists()){ + worldStorage.getParentFile().mkdirs(); + } + try(FileWriter writer = new FileWriter(worldStorage)){ + JsonArray array = new JsonArray(); + for(BlockPos block : blockCache){ + JsonObject object = new JsonObject(); + object.addProperty("x",block.getX()); + object.addProperty("y",block.getY()); + object.addProperty("z",block.getZ()); + array.add(object); + } + new GsonBuilder().setPrettyPrinting().create().toJson(array,writer); + } catch(Exception e) { + BeaconRadius.LOGGER.error("Error while writing file " + e.toString()); + return false; + } + return true; + } + + public static boolean load(){ + File worldStorage = FileName(); + + if(worldStorage==null) return false; + if(!worldStorage.exists()) return true; + + try(FileReader reader = new FileReader(worldStorage)){ + blockCache.clear(); + JsonArray array = JsonParser.parseReader(reader).getAsJsonArray(); + for(JsonElement element : array){ + JsonObject object = element.getAsJsonObject(); + blockCache.add(new BlockPos(object.get("x").getAsInt(),object.get("y").getAsInt(),object.get("z").getAsInt())); + } + } catch(Exception e) { + BeaconRadius.LOGGER.error("Error while reading file " + e.toString()); + return false; + } + return true; + } + + private static File FileName(){ + Minecraft client = Minecraft.getInstance(); + + if (client.getCurrentServer()!=null){ + return new File(StorageDir,client.getCurrentServer().ip.replace(".","_").replace(":","-").toString()+".json"); + + } + else if(client.getSingleplayerServer()!=null){ + return new File(StorageDir,client.getSingleplayerServer().getWorldPath(LevelResource.ROOT).getParent().getFileName().toString()+".json"); + } + else return null; + + } +} diff --git a/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java b/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java index f5a7894..fc0ae68 100644 --- a/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java +++ b/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java @@ -3,7 +3,9 @@ import com.mojang.authlib.minecraft.client.MinecraftClient; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLevelEvents; import net.fabricmc.fabric.api.event.player.UseBlockCallback; +import net.minecraft.client.Minecraft; import net.minecraft.util.datafix.fixes.TextComponentStringifiedFlagsFix; import net.minecraft.world.InteractionResult; import net.minecraft.world.level.block.Blocks; @@ -27,18 +29,24 @@ public static BeaconRadius getInstance() { public void onInitialize() { instance = this; UseBlockCallback.EVENT.register((player, world, hand, hitResult) -> { - if (player.isCrouching()) { - if (world.getBlockState(hitResult.getBlockPos()).is(Blocks.BEACON)) { - System.out.println("interacted with beacon"); - return InteractionResult.SUCCESS; + + if (player.isCrouching()) { + if (world.getBlockState(hitResult.getBlockPos()).is(Blocks.BEACON)) { + if(world.isClientSide()) { + BRStorage.Toggle(hitResult.getBlockPos()); + } + return InteractionResult.SUCCESS; + } } - } return InteractionResult.PASS; }); + + ClientLevelEvents.AFTER_CLIENT_LEVEL_CHANGE.register((player, world)->{ + if(player.getCurrentServer()!=null||player.getCurrentServer()!=null){ + BRStorage.onJoin(); + } + }); LOGGER.info("Mod {} initialized!", MOD_ID); } - public static void injectIntoBeacon(){ - - } } From 10292ca5b34e9a424b3c090a830ffef6105a9d61 Mon Sep 17 00:00:00 2001 From: DragonOfVoid <47323076+DragonOfVoid@users.noreply.github.com> Date: Fri, 30 Oct 2026 00:08:56 +0300 Subject: [PATCH 3/6] Added template area render for toggled beacons, respecting its power level -render stopping in unloaded chunks isn't implemented, but added state for each tracked position, allowing such feature. Somewhat works now only because of cleanup of removed beacons triggers by unloading block. --- .../java/ru/Jor/BeaconRadius/BRStorage.java | 31 ++-- .../ru/Jor/BeaconRadius/BeaconRadius.java | 9 +- .../client/BeaconRadiusClient.java | 13 +- .../BeaconRadius/client/RenderAndDraw.java | 166 ++++++++++++++++++ .../accessor/BeaconBlockEntityAccessor.java | 11 ++ .../resources/BeaconRadius.mixins-client.json | 8 + src/main/resources/fabric.mod.json | 4 +- 7 files changed, 224 insertions(+), 18 deletions(-) create mode 100644 src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java create mode 100644 src/main/java/ru/Jor/BeaconRadius/mixin/accessor/BeaconBlockEntityAccessor.java create mode 100644 src/main/resources/BeaconRadius.mixins-client.json diff --git a/src/main/java/ru/Jor/BeaconRadius/BRStorage.java b/src/main/java/ru/Jor/BeaconRadius/BRStorage.java index 43e4662..cb1ccde 100644 --- a/src/main/java/ru/Jor/BeaconRadius/BRStorage.java +++ b/src/main/java/ru/Jor/BeaconRadius/BRStorage.java @@ -1,5 +1,9 @@ package ru.Jor.BeaconRadius; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.world.level.Level; +import ru.Jor.BeaconRadius.BRStorage; + import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -15,28 +19,32 @@ import java.io.FileReader; import java.io.FileWriter; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class BRStorage { private static File StorageDir = new File(FabricLoader.getInstance().getGameDir().toFile(),"BeaconRadius"); - private static List blockCache = new ArrayList<>(); + public static Map blockCache = new HashMap<>(); public static void Toggle(BlockPos block){ - //if(blockCache.isEmpty()){ - // blockCache.add(block); - //} else - if(blockCache.contains(block)){ + if(blockCache.containsKey(block)){ blockCache.remove(block); BeaconRadius.LOGGER.info("removed block"); }else{ - blockCache.add(block); + blockCache.put(block,true); BeaconRadius.LOGGER.info("added block"); } save(); } + public static void setVisibility(BlockPos block, Boolean visible){ + blockCache.replace(block,visible); + } + - public static void onJoin(){ + public static void onJoin() + { load(); } @@ -49,13 +57,13 @@ private static boolean save(){ } try(FileWriter writer = new FileWriter(worldStorage)){ JsonArray array = new JsonArray(); - for(BlockPos block : blockCache){ + blockCache.forEach((block,visible)->{ JsonObject object = new JsonObject(); object.addProperty("x",block.getX()); object.addProperty("y",block.getY()); object.addProperty("z",block.getZ()); - array.add(object); - } + array.add(object);} + ); new GsonBuilder().setPrettyPrinting().create().toJson(array,writer); } catch(Exception e) { BeaconRadius.LOGGER.error("Error while writing file " + e.toString()); @@ -75,7 +83,7 @@ public static boolean load(){ JsonArray array = JsonParser.parseReader(reader).getAsJsonArray(); for(JsonElement element : array){ JsonObject object = element.getAsJsonObject(); - blockCache.add(new BlockPos(object.get("x").getAsInt(),object.get("y").getAsInt(),object.get("z").getAsInt())); + blockCache.put(new BlockPos(object.get("x").getAsInt(),object.get("y").getAsInt(),object.get("z").getAsInt()),false); } } catch(Exception e) { BeaconRadius.LOGGER.error("Error while reading file " + e.toString()); @@ -86,7 +94,6 @@ public static boolean load(){ private static File FileName(){ Minecraft client = Minecraft.getInstance(); - if (client.getCurrentServer()!=null){ return new File(StorageDir,client.getCurrentServer().ip.replace(".","_").replace(":","-").toString()+".json"); diff --git a/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java b/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java index fc0ae68..17bacb5 100644 --- a/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java +++ b/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java @@ -1,17 +1,17 @@ package ru.Jor.BeaconRadius; -import com.mojang.authlib.minecraft.client.MinecraftClient; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLevelEvents; +import net.fabricmc.fabric.api.client.rendering.v1.level.LevelRenderEvents; import net.fabricmc.fabric.api.event.player.UseBlockCallback; -import net.minecraft.client.Minecraft; -import net.minecraft.util.datafix.fixes.TextComponentStringifiedFlagsFix; import net.minecraft.world.InteractionResult; import net.minecraft.world.level.block.Blocks; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + + import java.awt.*; public class BeaconRadius implements ModInitializer { @@ -43,9 +43,10 @@ public void onInitialize() { ClientLevelEvents.AFTER_CLIENT_LEVEL_CHANGE.register((player, world)->{ if(player.getCurrentServer()!=null||player.getCurrentServer()!=null){ - BRStorage.onJoin(); + BRStorage.onJoin(); } }); + LOGGER.info("Mod {} initialized!", MOD_ID); } diff --git a/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java b/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java index c4bcb22..6a894c8 100644 --- a/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java +++ b/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java @@ -1,11 +1,22 @@ package ru.Jor.BeaconRadius.client; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.rendering.v1.level.LevelRenderEvents; + + import ru.Jor.BeaconRadius.BeaconRadius; public class BeaconRadiusClient implements ClientModInitializer { @Override - public void onInitializeClient() { + public void onInitializeClient(){ BeaconRadius.LOGGER.info("Client side of mod {} initialized!", BeaconRadius.MOD_ID); + LevelRenderEvents.AFTER_TRANSLUCENT_TERRAIN.register(RenderAndDraw::renderAndDraw); } + + + + + + + } diff --git a/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java b/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java new file mode 100644 index 0000000..6606986 --- /dev/null +++ b/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java @@ -0,0 +1,166 @@ +package ru.Jor.BeaconRadius.client; + +import com.mojang.blaze3d.buffers.GpuBuffer; +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.systems.CommandEncoder; +import com.mojang.blaze3d.systems.RenderPass; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import net.fabricmc.fabric.api.client.rendering.v1.level.LevelRenderContext; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.MappableRingBuffer; +import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.client.renderer.rendertype.RenderType; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.Vec3; +import org.joml.Matrix4f; +import org.joml.Matrix4fc; +import org.joml.Vector3f; +import org.joml.Vector4f; +import org.lwjgl.system.MemoryUtil; +import org.spongepowered.asm.mixin.injection.struct.InjectorGroupInfo; +import ru.Jor.BeaconRadius.BRStorage; +import ru.Jor.BeaconRadius.mixin.accessor.BeaconBlockEntityAccessor; +import ru.Jor.BeaconRadius.BeaconRadius; + +import java.util.*; + +public class RenderAndDraw { + private static final ByteBufferBuilder ALLOCATOR = new ByteBufferBuilder(RenderType.SMALL_BUFFER_SIZE); + private static final Vector4f COLOR_MODULATOR = new Vector4f(1f, 1f, 1f, 1f); + private static final Vector3f MODEL_OFFSET = new Vector3f(); + private static final Matrix4f TEXTURE_MATRIX = new Matrix4f(); + + private static BufferBuilder buffer; + private static MappableRingBuffer vertexBuffer; + + public static void renderAndDraw(LevelRenderContext context) { + if(render(context)) + drawLine(Minecraft.getInstance(), RenderPipelines.LINES); + } + + private static boolean render(LevelRenderContext context) { + if(BRStorage.blockCache.isEmpty()) + return false; + ClientLevel world = Minecraft.getInstance().level; + + PoseStack matrices = context.poseStack(); + Vec3 camera = context.levelState().cameraRenderState.pos; + + matrices.pushPose(); + matrices.translate(-camera.x, -camera.y, -camera.z); + + if (buffer == null) { + buffer = new BufferBuilder(ALLOCATOR, RenderPipelines.LINES.getVertexFormatMode(), RenderPipelines.LINES.getVertexFormat()); + } + + boolean hasContent=false; + List toDel = new ArrayList<>(); + if (world != null) { + for(Map.Entry entry:BRStorage.blockCache.entrySet()) { + if (entry.getValue()) { + if (world.getBlockState(entry.getKey()).is(Blocks.BEACON)) { + if (renderMyObject(matrices.last().pose(), buffer, entry.getKey(), ((BeaconBlockEntityAccessor) world.getBlockEntity(entry.getKey())).BeaconRadius$getLevels())) + hasContent = true; + } + else + toDel.add(entry.getKey()); + } + } + toDel.forEach(block ->{BRStorage.blockCache.remove(block);}); + if(!hasContent) + return false; + } + else + return false; + matrices.popPose(); + + return true; + } + + private static boolean renderMyObject(Matrix4fc positionMatrix, BufferBuilder buffer, BlockPos pos, int level){ + if(level == 0) return false; + + float radius = (level+1f)*10; + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())+radius+1).setColor(0f,0f,1f,1f).setLineWidth(2).setNormal(0,0,0); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())-radius ).setColor(0f,0f,1f,1f).setLineWidth(2).setNormal(0,0,0); + + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())-radius ).setColor(0f,0f,1f,1f).setLineWidth(2).setNormal(0,0,0); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())-radius ).setColor(0f,0f,1f,1f).setLineWidth(2).setNormal(0,0,0); + + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())-radius ).setColor(0f,0f,1f,1).setLineWidth(2).setNormal(0,0,0); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())+radius+1).setColor(0f,0f,1f,1f).setLineWidth(2).setNormal(0,0,0); + + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())+radius+1).setColor(0f,0f,1f,1f).setLineWidth(2).setNormal(0,0,0); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())+radius+1).setColor(0f,0f,1f,1f).setLineWidth(2).setNormal(0,0,0); + return true; + } + + private static void drawLine(Minecraft client, RenderPipeline pipeline) { + MeshData builtBuffer = buffer.buildOrThrow(); + MeshData.DrawState drawParameters = builtBuffer.drawState(); + VertexFormat format = drawParameters.format(); + + GpuBuffer vertices = upload(drawParameters, format, builtBuffer); + + draw(client, pipeline, builtBuffer, drawParameters, vertices, format); + + vertexBuffer.rotate(); + buffer = null; + } + + private static GpuBuffer upload(MeshData.DrawState drawParameters, VertexFormat format, MeshData builtBuffer) { + int vertexBufferSize = drawParameters.vertexCount() * format.getVertexSize(); + + if (vertexBuffer == null || vertexBuffer.size() < vertexBufferSize) { + if (vertexBuffer != null) { + vertexBuffer.close(); + } + + vertexBuffer = new MappableRingBuffer(() -> BeaconRadius.MOD_ID + " example render pipeline", GpuBuffer.USAGE_VERTEX | GpuBuffer.USAGE_MAP_WRITE, vertexBufferSize); + } + + CommandEncoder commandEncoder = RenderSystem.getDevice().createCommandEncoder(); + + try (GpuBuffer.MappedView mappedView = commandEncoder.mapBuffer(vertexBuffer.currentBuffer().slice(0, builtBuffer.vertexBuffer().remaining()), false, true)) { + MemoryUtil.memCopy(builtBuffer.vertexBuffer(), mappedView.data()); + } + + return vertexBuffer.currentBuffer(); + } + + private static void draw(Minecraft client, RenderPipeline pipeline, MeshData builtBuffer, MeshData.DrawState drawParameters, GpuBuffer vertices, VertexFormat format){ + RenderSystem.AutoStorageIndexBuffer shapeIndexBuffer = RenderSystem.getSequentialBuffer(pipeline.getVertexFormatMode()); + GpuBuffer indices = shapeIndexBuffer.getBuffer(drawParameters.indexCount()); + VertexFormat.IndexType indexType = shapeIndexBuffer.type(); + GpuBufferSlice dynamicTransforms = RenderSystem.getDynamicUniforms() + .writeTransform(RenderSystem.getModelViewMatrix(), COLOR_MODULATOR, MODEL_OFFSET, TEXTURE_MATRIX); + try (RenderPass renderPass = RenderSystem.getDevice() + .createCommandEncoder() + .createRenderPass(() -> BeaconRadius.MOD_ID + " example render pipeline rendering", client.getMainRenderTarget().getColorTextureView(), OptionalInt.empty(), client.getMainRenderTarget().getDepthTextureView(), OptionalDouble.empty())) { + renderPass.setPipeline(pipeline); + + RenderSystem.bindDefaultUniforms(renderPass); + renderPass.setUniform("DynamicTransforms", dynamicTransforms); + + renderPass.setVertexBuffer(0, vertices); + renderPass.setIndexBuffer(indices, indexType); + + renderPass.drawIndexed(0 / format.getVertexSize(), 0, drawParameters.indexCount(), 1); + } + + builtBuffer.close(); + } + + public void close() { + ALLOCATOR.close(); + + if (vertexBuffer != null) { + vertexBuffer.close(); + vertexBuffer = null; + } + } +} diff --git a/src/main/java/ru/Jor/BeaconRadius/mixin/accessor/BeaconBlockEntityAccessor.java b/src/main/java/ru/Jor/BeaconRadius/mixin/accessor/BeaconBlockEntityAccessor.java new file mode 100644 index 0000000..66ed7f0 --- /dev/null +++ b/src/main/java/ru/Jor/BeaconRadius/mixin/accessor/BeaconBlockEntityAccessor.java @@ -0,0 +1,11 @@ +package ru.Jor.BeaconRadius.mixin.accessor; + +import net.minecraft.world.level.block.entity.BeaconBlockEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(BeaconBlockEntity.class) +public interface BeaconBlockEntityAccessor { + @Accessor("levels") + int BeaconRadius$getLevels(); +} diff --git a/src/main/resources/BeaconRadius.mixins-client.json b/src/main/resources/BeaconRadius.mixins-client.json new file mode 100644 index 0000000..d104e26 --- /dev/null +++ b/src/main/resources/BeaconRadius.mixins-client.json @@ -0,0 +1,8 @@ +{ + "required": true, + "package": "ru.Jor.BeaconRadius.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "accessor.BeaconBlockEntityAccessor" + ] +} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index d32b6a4..0d06de8 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -21,7 +21,9 @@ "ru.Jor.BeaconRadius.client.BeaconRadiusClient" ] }, - "mixins": [], + "mixins": [ + "BeaconRadius.mixins-client.json" + ], "depends": { "fabricloader": ">=0.19.5", "minecraft": "~26.1.2", From 1394d9c2e618759e9988f85461d8fe72cd79481b Mon Sep 17 00:00:00 2001 From: DragonOfVoid <47323076+DragonOfVoid@users.noreply.github.com> Date: Fri, 30 Oct 2026 17:54:45 +0300 Subject: [PATCH 4/6] reflected on previous decisions, and rewrote them. - fixed mess of a file storage, works properly now - switched back to BlockPos list, rendering toggled by checking if block is loaded --- .../java/ru/Jor/BeaconRadius/BRStorage.java | 39 +++++++++++-------- .../ru/Jor/BeaconRadius/BeaconRadius.java | 4 +- .../BeaconRadius/client/RenderAndDraw.java | 13 ++++--- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/main/java/ru/Jor/BeaconRadius/BRStorage.java b/src/main/java/ru/Jor/BeaconRadius/BRStorage.java index cb1ccde..6a243d2 100644 --- a/src/main/java/ru/Jor/BeaconRadius/BRStorage.java +++ b/src/main/java/ru/Jor/BeaconRadius/BRStorage.java @@ -1,13 +1,11 @@ package ru.Jor.BeaconRadius; +import com.google.gson.*; +import com.google.gson.reflect.TypeToken; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.world.level.Level; import ru.Jor.BeaconRadius.BRStorage; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import com.mojang.authlib.minecraft.client.MinecraftClient; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; @@ -18,6 +16,7 @@ import java.io.File; import java.io.FileReader; import java.io.FileWriter; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -26,22 +25,20 @@ public class BRStorage { private static File StorageDir = new File(FabricLoader.getInstance().getGameDir().toFile(),"BeaconRadius"); - public static Map blockCache = new HashMap<>(); + public static List blockCache = new ArrayList<>(); + + private static Type listType = new TypeToken>() {}.getType(); public static void Toggle(BlockPos block){ - if(blockCache.containsKey(block)){ + if(blockCache.contains(block)){ blockCache.remove(block); BeaconRadius.LOGGER.info("removed block"); }else{ - blockCache.put(block,true); + blockCache.add(block); BeaconRadius.LOGGER.info("added block"); } save(); } - public static void setVisibility(BlockPos block, Boolean visible){ - blockCache.replace(block,visible); - } - public static void onJoin() { @@ -56,15 +53,19 @@ private static boolean save(){ worldStorage.getParentFile().mkdirs(); } try(FileWriter writer = new FileWriter(worldStorage)){ + Gson gson = new Gson(); + String result = gson.toJson(blockCache,listType); + writer.write(result); + /* JsonArray array = new JsonArray(); - blockCache.forEach((block,visible)->{ + blockCache.forEach((block)->{ JsonObject object = new JsonObject(); object.addProperty("x",block.getX()); object.addProperty("y",block.getY()); object.addProperty("z",block.getZ()); array.add(object);} ); - new GsonBuilder().setPrettyPrinting().create().toJson(array,writer); + new GsonBuilder().create().toJson(array,writer);*/ } catch(Exception e) { BeaconRadius.LOGGER.error("Error while writing file " + e.toString()); return false; @@ -79,16 +80,22 @@ public static boolean load(){ if(!worldStorage.exists()) return true; try(FileReader reader = new FileReader(worldStorage)){ + Gson gson = new Gson(); blockCache.clear(); - JsonArray array = JsonParser.parseReader(reader).getAsJsonArray(); + blockCache = gson.fromJson(reader,listType); + + /*JsonArray array = JsonParser.parseReader(reader).getAsJsonArray(); + System.out.println("2"); for(JsonElement element : array){ + System.out.println("cycle"); JsonObject object = element.getAsJsonObject(); - blockCache.put(new BlockPos(object.get("x").getAsInt(),object.get("y").getAsInt(),object.get("z").getAsInt()),false); - } + blockCache.add(new BlockPos(object.get("x").getAsInt(),object.get("y").getAsInt(),object.get("z").getAsInt())); + }*/ } catch(Exception e) { BeaconRadius.LOGGER.error("Error while reading file " + e.toString()); return false; } + System.out.println(blockCache.toString()); return true; } diff --git a/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java b/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java index 17bacb5..291280c 100644 --- a/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java +++ b/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java @@ -2,6 +2,7 @@ import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientBlockEntityEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLevelEvents; import net.fabricmc.fabric.api.client.rendering.v1.level.LevelRenderEvents; import net.fabricmc.fabric.api.event.player.UseBlockCallback; @@ -42,11 +43,10 @@ public void onInitialize() { }); ClientLevelEvents.AFTER_CLIENT_LEVEL_CHANGE.register((player, world)->{ - if(player.getCurrentServer()!=null||player.getCurrentServer()!=null){ + if(player.getCurrentServer()!=null||player.getSingleplayerServer()!=null){ BRStorage.onJoin(); } }); - LOGGER.info("Mod {} initialized!", MOD_ID); } diff --git a/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java b/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java index 6606986..c24ae62 100644 --- a/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java +++ b/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java @@ -60,15 +60,16 @@ private static boolean render(LevelRenderContext context) { boolean hasContent=false; List toDel = new ArrayList<>(); if (world != null) { - for(Map.Entry entry:BRStorage.blockCache.entrySet()) { - if (entry.getValue()) { - if (world.getBlockState(entry.getKey()).is(Blocks.BEACON)) { - if (renderMyObject(matrices.last().pose(), buffer, entry.getKey(), ((BeaconBlockEntityAccessor) world.getBlockEntity(entry.getKey())).BeaconRadius$getLevels())) + for(BlockPos block:BRStorage.blockCache) { + if (world.isLoaded(block)){ + if (world.getBlockState(block).is(Blocks.BEACON)) { + if (renderMyObject(matrices.last().pose(), buffer, block, + ((BeaconBlockEntityAccessor) world.getBlockEntity(block)).BeaconRadius$getLevels())) hasContent = true; } else - toDel.add(entry.getKey()); - } + toDel.add(block); + } } toDel.forEach(block ->{BRStorage.blockCache.remove(block);}); if(!hasContent) From 21e3d1642974b5e902779bea4211c503da00c0ad Mon Sep 17 00:00:00 2001 From: DragonOfVoid <47323076+DragonOfVoid@users.noreply.github.com> Date: Sun, 1 Nov 2026 22:56:03 +0300 Subject: [PATCH 5/6] refined visuals cleaned up debug console outputs moved from line pipeline to quads. inconsistencies in line width annoys me. changed moment of rendering, so it's able to see them through translucent blocks --- .../java/ru/Jor/BeaconRadius/BRStorage.java | 31 ---- .../client/BeaconRadiusClient.java | 2 +- .../BeaconRadius/client/RenderAndDraw.java | 144 ++++++++++++++++-- .../accessor/BeaconBlockEntityAccessor.java | 6 + 4 files changed, 136 insertions(+), 47 deletions(-) diff --git a/src/main/java/ru/Jor/BeaconRadius/BRStorage.java b/src/main/java/ru/Jor/BeaconRadius/BRStorage.java index 6a243d2..3e17d8a 100644 --- a/src/main/java/ru/Jor/BeaconRadius/BRStorage.java +++ b/src/main/java/ru/Jor/BeaconRadius/BRStorage.java @@ -2,25 +2,17 @@ import com.google.gson.*; import com.google.gson.reflect.TypeToken; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.world.level.Level; -import ru.Jor.BeaconRadius.BRStorage; - -import com.mojang.authlib.minecraft.client.MinecraftClient; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.world.level.storage.LevelResource; -import org.spongepowered.include.com.google.gson.GsonBuilder; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.lang.reflect.Type; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; public class BRStorage { private static File StorageDir = new File(FabricLoader.getInstance().getGameDir().toFile(),"BeaconRadius"); @@ -32,10 +24,8 @@ public class BRStorage { public static void Toggle(BlockPos block){ if(blockCache.contains(block)){ blockCache.remove(block); - BeaconRadius.LOGGER.info("removed block"); }else{ blockCache.add(block); - BeaconRadius.LOGGER.info("added block"); } save(); } @@ -56,18 +46,7 @@ private static boolean save(){ Gson gson = new Gson(); String result = gson.toJson(blockCache,listType); writer.write(result); - /* - JsonArray array = new JsonArray(); - blockCache.forEach((block)->{ - JsonObject object = new JsonObject(); - object.addProperty("x",block.getX()); - object.addProperty("y",block.getY()); - object.addProperty("z",block.getZ()); - array.add(object);} - ); - new GsonBuilder().create().toJson(array,writer);*/ } catch(Exception e) { - BeaconRadius.LOGGER.error("Error while writing file " + e.toString()); return false; } return true; @@ -83,19 +62,9 @@ public static boolean load(){ Gson gson = new Gson(); blockCache.clear(); blockCache = gson.fromJson(reader,listType); - - /*JsonArray array = JsonParser.parseReader(reader).getAsJsonArray(); - System.out.println("2"); - for(JsonElement element : array){ - System.out.println("cycle"); - JsonObject object = element.getAsJsonObject(); - blockCache.add(new BlockPos(object.get("x").getAsInt(),object.get("y").getAsInt(),object.get("z").getAsInt())); - }*/ } catch(Exception e) { - BeaconRadius.LOGGER.error("Error while reading file " + e.toString()); return false; } - System.out.println(blockCache.toString()); return true; } diff --git a/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java b/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java index 6a894c8..c7a88fd 100644 --- a/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java +++ b/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java @@ -10,7 +10,7 @@ public class BeaconRadiusClient implements ClientModInitializer { @Override public void onInitializeClient(){ BeaconRadius.LOGGER.info("Client side of mod {} initialized!", BeaconRadius.MOD_ID); - LevelRenderEvents.AFTER_TRANSLUCENT_TERRAIN.register(RenderAndDraw::renderAndDraw); + LevelRenderEvents.BEFORE_TRANSLUCENT_TERRAIN.register(RenderAndDraw::renderAndDraw); } diff --git a/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java b/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java index c24ae62..37de8ca 100644 --- a/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java +++ b/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java @@ -14,6 +14,7 @@ import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.BeaconBeamBlock; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.Vec3; import org.joml.Matrix4f; @@ -29,6 +30,9 @@ import java.util.*; public class RenderAndDraw { + + + private static final ByteBufferBuilder ALLOCATOR = new ByteBufferBuilder(RenderType.SMALL_BUFFER_SIZE); private static final Vector4f COLOR_MODULATOR = new Vector4f(1f, 1f, 1f, 1f); private static final Vector3f MODEL_OFFSET = new Vector3f(); @@ -39,14 +43,13 @@ public class RenderAndDraw { public static void renderAndDraw(LevelRenderContext context) { if(render(context)) - drawLine(Minecraft.getInstance(), RenderPipelines.LINES); + drawLine(Minecraft.getInstance(), RenderPipelines.DEBUG_QUADS); } private static boolean render(LevelRenderContext context) { if(BRStorage.blockCache.isEmpty()) return false; ClientLevel world = Minecraft.getInstance().level; - PoseStack matrices = context.poseStack(); Vec3 camera = context.levelState().cameraRenderState.pos; @@ -54,18 +57,21 @@ private static boolean render(LevelRenderContext context) { matrices.translate(-camera.x, -camera.y, -camera.z); if (buffer == null) { - buffer = new BufferBuilder(ALLOCATOR, RenderPipelines.LINES.getVertexFormatMode(), RenderPipelines.LINES.getVertexFormat()); + buffer = new BufferBuilder(ALLOCATOR, RenderPipelines.DEBUG_QUADS.getVertexFormatMode(), RenderPipelines.DEBUG_QUADS.getVertexFormat()); } boolean hasContent=false; List toDel = new ArrayList<>(); + if (world != null) { for(BlockPos block:BRStorage.blockCache) { if (world.isLoaded(block)){ if (world.getBlockState(block).is(Blocks.BEACON)) { - if (renderMyObject(matrices.last().pose(), buffer, block, - ((BeaconBlockEntityAccessor) world.getBlockEntity(block)).BeaconRadius$getLevels())) - hasContent = true; + if (!((BeaconBlockEntityAccessor) world.getBlockEntity(block)).BeaconRadius$getbeamSections().isEmpty()) + if (renderMyObject(matrices.last(), buffer, block, + ((BeaconBlockEntityAccessor) world.getBlockEntity(block)).BeaconRadius$getLevels(),world.getGameTime(), + world.getMaxY())) + hasContent = true; } else toDel.add(block); @@ -82,21 +88,129 @@ private static boolean render(LevelRenderContext context) { return true; } - private static boolean renderMyObject(Matrix4fc positionMatrix, BufferBuilder buffer, BlockPos pos, int level){ + private static boolean renderMyObject(PoseStack.Pose positionMatrix, BufferBuilder buffer, BlockPos pos, int level, long tick, int maxheight){ if(level == 0) return false; float radius = (level+1f)*10; - buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())+radius+1).setColor(0f,0f,1f,1f).setLineWidth(2).setNormal(0,0,0); - buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())-radius ).setColor(0f,0f,1f,1f).setLineWidth(2).setNormal(0,0,0); - buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())-radius ).setColor(0f,0f,1f,1f).setLineWidth(2).setNormal(0,0,0); - buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())-radius ).setColor(0f,0f,1f,1f).setLineWidth(2).setNormal(0,0,0); + float width = 1f/20f; + //top-middle rings + for (float Y=maxheight;Y>(pos.getY()-radius);Y=Y-16) { + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, Y , Float.valueOf(pos.getZ()) + radius + 1).setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, Y , Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, Y + width , Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, Y + width , Float.valueOf(pos.getZ()) + radius + 1).setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, Y , Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, Y , Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, Y + width , Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, Y + width , Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, Y , Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, Y , Float.valueOf(pos.getZ()) + radius + 1) .setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, Y + width , Float.valueOf(pos.getZ()) + radius + 1) .setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, Y + width , Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, Y , Float.valueOf(pos.getZ()) + radius + 1) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, Y , Float.valueOf(pos.getZ()) + radius + 1) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, Y + width , Float.valueOf(pos.getZ()) + radius + 1) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, Y + width , Float.valueOf(pos.getZ()) + radius + 1) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + } + //bottom ring + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, pos.getY()-radius, Float.valueOf(pos.getZ()) + radius + 1).setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, pos.getY()-radius, Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, pos.getY()-radius + width, Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, pos.getY()-radius + width, Float.valueOf(pos.getZ()) + radius + 1).setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, pos.getY()-radius , Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, pos.getY()-radius , Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, pos.getY()-radius + width, Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, pos.getY()-radius + width, Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, pos.getY()-radius , Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, pos.getY()-radius , Float.valueOf(pos.getZ()) + radius + 1) .setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, pos.getY()-radius + width , Float.valueOf(pos.getZ()) + radius + 1) .setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, pos.getY()-radius + width , Float.valueOf(pos.getZ()) - radius) .setColor(0f, 0f, 1f, 1f).setNormal(1, 0, 0); + + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, pos.getY()-radius , Float.valueOf(pos.getZ()) + radius + 1) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, pos.getY()-radius , Float.valueOf(pos.getZ()) + radius + 1) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) + radius + 1, pos.getY()-radius + width , Float.valueOf(pos.getZ()) + radius + 1) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX()) - radius, pos.getY()-radius + width , Float.valueOf(pos.getZ()) + radius + 1) .setColor(0f, 0f, 1f, 1f).setNormal(0, 0, 1); + + double angle = Math.toRadians((tick%451)/5f-45f); + //criss-cross,beacon level + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(pos.getY())+0.5f, Float.valueOf(pos.getZ())+0.5f+((float) Math.tan(angle))*radius).setColor(1f,0f,0f,1f).setNormal((float) Math.sin(angle),0,(float) Math.cos(angle)); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius , Float.valueOf(pos.getY())+0.5f, Float.valueOf(pos.getZ())+0.5f-((float) Math.tan(angle))*radius).setColor(1f,0f,0f,1f).setNormal((float) Math.sin(angle),0,(float) Math.cos(angle)); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius , Float.valueOf(pos.getY())+0.5f+width,Float.valueOf(pos.getZ())+0.5f-((float) Math.tan(angle))*radius).setColor(1f,0f,0f,1f).setNormal((float) Math.sin(angle),0,(float) Math.cos(angle)); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(pos.getY())+0.5f+width,Float.valueOf(pos.getZ())+0.5f+((float) Math.tan(angle))*radius).setColor(1f,0f,0f,1f).setNormal((float) Math.sin(angle),0,(float) Math.cos(angle)); + + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f-((float) Math.tan(angle))*radius, Float.valueOf(pos.getY())+0.5f, Float.valueOf(pos.getZ())+radius+1).setColor(1f,0f,0f,1f).setNormal((float) Math.cos(angle),0,(float) Math.sin(angle)); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f+((float) Math.tan(angle))*radius, Float.valueOf(pos.getY())+0.5f, Float.valueOf(pos.getZ())-radius ).setColor(1f,0f,0f,1f).setNormal((float) Math.cos(angle),0,(float) Math.sin(angle)); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f+((float) Math.tan(angle))*radius, Float.valueOf(pos.getY())+0.5f+width,Float.valueOf(pos.getZ())-radius ).setColor(1f,0f,0f,1f).setNormal((float) Math.cos(angle),0,(float) Math.sin(angle)); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f-((float) Math.tan(angle))*radius, Float.valueOf(pos.getY())+0.5f+width,Float.valueOf(pos.getZ())+radius+1).setColor(1f,0f,0f,1f).setNormal((float) Math.cos(angle),0,(float) Math.sin(angle)); + //criss-cross, bottom layer + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(pos.getY())-radius, Float.valueOf(pos.getZ())+0.5f+((float) Math.tan(angle))*radius).setColor(1f,0f,0f,1f).setNormal((float) Math.sin(angle),0,(float) Math.cos(angle)); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius , Float.valueOf(pos.getY())-radius, Float.valueOf(pos.getZ())+0.5f-((float) Math.tan(angle))*radius).setColor(1f,0f,0f,1f).setNormal((float) Math.sin(angle),0,(float) Math.cos(angle)); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius , Float.valueOf(pos.getY())-radius+width,Float.valueOf(pos.getZ())+0.5f-((float) Math.tan(angle))*radius).setColor(1f,0f,0f,1f).setNormal((float) Math.sin(angle),0,(float) Math.cos(angle)); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(pos.getY())-radius+width,Float.valueOf(pos.getZ())+0.5f+((float) Math.tan(angle))*radius).setColor(1f,0f,0f,1f).setNormal((float) Math.sin(angle),0,(float) Math.cos(angle)); + + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f-((float) Math.tan(angle))*radius, Float.valueOf(pos.getY())-radius, Float.valueOf(pos.getZ())+radius+1).setColor(1f,0f,0f,1f).setNormal((float) Math.cos(angle),0,(float) Math.sin(angle)); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f+((float) Math.tan(angle))*radius, Float.valueOf(pos.getY())-radius, Float.valueOf(pos.getZ())-radius ).setColor(1f,0f,0f,1f).setNormal((float) Math.cos(angle),0,(float) Math.sin(angle)); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f+((float) Math.tan(angle))*radius, Float.valueOf(pos.getY())-radius+width,Float.valueOf(pos.getZ())-radius ).setColor(1f,0f,0f,1f).setNormal((float) Math.cos(angle),0,(float) Math.sin(angle)); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f-((float) Math.tan(angle))*radius, Float.valueOf(pos.getY())-radius+width,Float.valueOf(pos.getZ())+radius+1).setColor(1f,0f,0f,1f).setNormal((float) Math.cos(angle),0,(float) Math.sin(angle)); + //vertical lines + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(maxheight), Float.valueOf(pos.getZ())+0.5f+((float) Math.tan(angle))*radius-width/2).setColor(1f,0f,0f,1f).setNormal(1,0,0); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(pos.getY())-radius,Float.valueOf(pos.getZ())+0.5f+((float) Math.tan(angle))*radius-width/2).setColor(1f,0f,0f,1f).setNormal(1,0,0); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(pos.getY())-radius,Float.valueOf(pos.getZ())+0.5f+((float) Math.tan(angle))*radius+width/2).setColor(1f,0f,0f,1f).setNormal(1,0,0); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(maxheight), Float.valueOf(pos.getZ())+0.5f+((float) Math.tan(angle))*radius+width/2).setColor(1f,0f,0f,1f).setNormal(1,0,0); + + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius, Float.valueOf(maxheight), Float.valueOf(pos.getZ())+0.5f-((float) Math.tan(angle))*radius-width/2).setColor(1f,0f,0f,1f).setNormal(1,0,0); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius, Float.valueOf(pos.getY())-radius,Float.valueOf(pos.getZ())+0.5f-((float) Math.tan(angle))*radius-width/2).setColor(1f,0f,0f,1f).setNormal(1,0,0); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius, Float.valueOf(pos.getY())-radius,Float.valueOf(pos.getZ())+0.5f-((float) Math.tan(angle))*radius+width/2).setColor(1f,0f,0f,1f).setNormal(1,0,0); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius, Float.valueOf(maxheight), Float.valueOf(pos.getZ())+0.5f-((float) Math.tan(angle))*radius+width/2).setColor(1f,0f,0f,1f).setNormal(1,0,0); + + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f-((float) Math.tan(angle))*radius-width, Float.valueOf(maxheight), Float.valueOf(pos.getZ())+radius+1).setColor(1f,0f,0f,1f).setNormal(0,0,1); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f-((float) Math.tan(angle))*radius-width, Float.valueOf(pos.getY())-radius,Float.valueOf(pos.getZ())+radius+1).setColor(1f,0f,0f,1f).setNormal(0,0,1); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f-((float) Math.tan(angle))*radius+width, Float.valueOf(pos.getY())-radius,Float.valueOf(pos.getZ())+radius+1).setColor(1f,0f,0f,1f).setNormal(0,0,1); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f-((float) Math.tan(angle))*radius+width, Float.valueOf(maxheight), Float.valueOf(pos.getZ())+radius+1).setColor(1f,0f,0f,1f).setNormal(0,0,1); + + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f+((float) Math.tan(angle))*radius-width, Float.valueOf(maxheight), Float.valueOf(pos.getZ())-radius).setColor(1f,0f,0f,1f).setNormal(0,0,1); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f+((float) Math.tan(angle))*radius-width, Float.valueOf(pos.getY())-radius,Float.valueOf(pos.getZ())-radius).setColor(1f,0f,0f,1f).setNormal(0,0,1); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f+((float) Math.tan(angle))*radius+width, Float.valueOf(pos.getY())-radius,Float.valueOf(pos.getZ())-radius).setColor(1f,0f,0f,1f).setNormal(0,0,1); + buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+0.5f+((float) Math.tan(angle))*radius+width, Float.valueOf(maxheight), Float.valueOf(pos.getZ())-radius).setColor(1f,0f,0f,1f).setNormal(0,0,1); + float zFightOfset = 0.0001f; + //beacon block highlight + //X + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())-zFightOfset,Float.valueOf(pos.getY())+1,Float.valueOf(pos.getZ())+0).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())-zFightOfset,Float.valueOf(pos.getY())+1,Float.valueOf(pos.getZ())+1).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())-zFightOfset,Float.valueOf(pos.getY())+0,Float.valueOf(pos.getZ())+1).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())-zFightOfset,Float.valueOf(pos.getY())+0,Float.valueOf(pos.getZ())+0).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+1+zFightOfset,Float.valueOf(pos.getY())+1,Float.valueOf(pos.getZ())+0).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+1+zFightOfset,Float.valueOf(pos.getY())+1,Float.valueOf(pos.getZ())+1).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+1+zFightOfset,Float.valueOf(pos.getY())+0,Float.valueOf(pos.getZ())+1).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+1+zFightOfset,Float.valueOf(pos.getY())+0,Float.valueOf(pos.getZ())+0).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + //Y + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+0,Float.valueOf(pos.getY())-zFightOfset,Float.valueOf(pos.getZ())+0).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+0,Float.valueOf(pos.getY())-zFightOfset,Float.valueOf(pos.getZ())+1).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+1,Float.valueOf(pos.getY())-zFightOfset,Float.valueOf(pos.getZ())+1).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+1,Float.valueOf(pos.getY())-zFightOfset,Float.valueOf(pos.getZ())+0).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+0,Float.valueOf(pos.getY())+1+zFightOfset,Float.valueOf(pos.getZ())+0).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+0,Float.valueOf(pos.getY())+1+zFightOfset,Float.valueOf(pos.getZ())+1).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+1,Float.valueOf(pos.getY())+1+zFightOfset,Float.valueOf(pos.getZ())+1).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+1,Float.valueOf(pos.getY())+1+zFightOfset,Float.valueOf(pos.getZ())+0).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + //Z + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+0,Float.valueOf(pos.getY())+1,Float.valueOf(pos.getZ())-zFightOfset).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+1,Float.valueOf(pos.getY())+1,Float.valueOf(pos.getZ())-zFightOfset).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+1,Float.valueOf(pos.getY())+0,Float.valueOf(pos.getZ())-zFightOfset).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+0,Float.valueOf(pos.getY())+0,Float.valueOf(pos.getZ())-zFightOfset).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); - buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())-radius ).setColor(0f,0f,1f,1).setLineWidth(2).setNormal(0,0,0); - buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())+radius+1).setColor(0f,0f,1f,1f).setLineWidth(2).setNormal(0,0,0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+0,Float.valueOf(pos.getY())+1,Float.valueOf(pos.getZ())+1+zFightOfset).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+1,Float.valueOf(pos.getY())+1,Float.valueOf(pos.getZ())+1+zFightOfset).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+1,Float.valueOf(pos.getY())+0,Float.valueOf(pos.getZ())+1+zFightOfset).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); + buffer.addVertex(positionMatrix, Float.valueOf(pos.getX())+0,Float.valueOf(pos.getY())+0,Float.valueOf(pos.getZ())+1+zFightOfset).setColor(0f, 1f, 0f, 0.25f).setNormal(1, 0, 0); - buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())-radius, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())+radius+1).setColor(0f,0f,1f,1f).setLineWidth(2).setNormal(0,0,0); - buffer.addVertex(positionMatrix,Float.valueOf(pos.getX())+radius+1, Float.valueOf(pos.getY()),Float.valueOf(pos.getZ())+radius+1).setColor(0f,0f,1f,1f).setLineWidth(2).setNormal(0,0,0); return true; } diff --git a/src/main/java/ru/Jor/BeaconRadius/mixin/accessor/BeaconBlockEntityAccessor.java b/src/main/java/ru/Jor/BeaconRadius/mixin/accessor/BeaconBlockEntityAccessor.java index 66ed7f0..9d15319 100644 --- a/src/main/java/ru/Jor/BeaconRadius/mixin/accessor/BeaconBlockEntityAccessor.java +++ b/src/main/java/ru/Jor/BeaconRadius/mixin/accessor/BeaconBlockEntityAccessor.java @@ -1,11 +1,17 @@ package ru.Jor.BeaconRadius.mixin.accessor; +import net.minecraft.world.level.block.entity.BeaconBeamOwner; import net.minecraft.world.level.block.entity.BeaconBlockEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; +import java.util.List; + @Mixin(BeaconBlockEntity.class) public interface BeaconBlockEntityAccessor { @Accessor("levels") int BeaconRadius$getLevels(); + + @Accessor("beamSections") + List BeaconRadius$getbeamSections(); } From cbac0661d2428aa127cd15e7e6a7bac97591bc93 Mon Sep 17 00:00:00 2001 From: DragonOfVoid <47323076+DragonOfVoid@users.noreply.github.com> Date: Wed, 4 Nov 2026 21:16:18 +0300 Subject: [PATCH 6/6] Dimensions now don't reset stored beacons of other dims Toggling function available now in midair --- .../java/ru/Jor/BeaconRadius/BRStorage.java | 41 ++++++++++++------- .../ru/Jor/BeaconRadius/BeaconRadius.java | 7 ++-- .../client/BeaconRadiusClient.java | 1 - .../BeaconRadius/client/RenderAndDraw.java | 24 +++++------ 4 files changed, 41 insertions(+), 32 deletions(-) diff --git a/src/main/java/ru/Jor/BeaconRadius/BRStorage.java b/src/main/java/ru/Jor/BeaconRadius/BRStorage.java index 3e17d8a..8d4b608 100644 --- a/src/main/java/ru/Jor/BeaconRadius/BRStorage.java +++ b/src/main/java/ru/Jor/BeaconRadius/BRStorage.java @@ -2,30 +2,29 @@ import com.google.gson.*; import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; +import net.minecraft.resources.Identifier; import net.minecraft.world.level.storage.LevelResource; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class BRStorage { - private static File StorageDir = new File(FabricLoader.getInstance().getGameDir().toFile(),"BeaconRadius"); + private static final File StorageDir = new File(FabricLoader.getInstance().getGameDir().toFile(),"BeaconRadius"); - public static List blockCache = new ArrayList<>(); + public static Map blockCache = new HashMap<>(); - private static Type listType = new TypeToken>() {}.getType(); - - public static void Toggle(BlockPos block){ - if(blockCache.contains(block)){ - blockCache.remove(block); + public static void Toggle(BlockPos block,Identifier dim){ + if(blockCache.entrySet().contains((Map.entry(block,dim)))){ + blockCache.remove(block,dim); }else{ - blockCache.add(block); + blockCache.put(block,dim); } save(); } @@ -42,9 +41,16 @@ private static boolean save(){ if(!worldStorage.exists()){ worldStorage.getParentFile().mkdirs(); } + //"f*ck gson" variable + Map tmp = new HashMap<>(); + try(FileWriter writer = new FileWriter(worldStorage)){ Gson gson = new Gson(); - String result = gson.toJson(blockCache,listType); + blockCache.entrySet().forEach(entry->{ + tmp.put(gson.toJson(entry.getKey()),gson.toJson(entry.getValue())); + }); + String result = gson.toJson(tmp); + writer.write(result); } catch(Exception e) { return false; @@ -57,11 +63,19 @@ public static boolean load(){ if(worldStorage==null) return false; if(!worldStorage.exists()) return true; + //"f*ck gson" variable + Map tmp = new HashMap<>(); - try(FileReader reader = new FileReader(worldStorage)){ + try(JsonReader reader = new JsonReader( new FileReader(worldStorage))){ Gson gson = new Gson(); blockCache.clear(); - blockCache = gson.fromJson(reader,listType); + tmp = gson.fromJson(reader,blockCache.getClass()); + tmp.entrySet().forEach(entry ->{ + BlockPos pos = gson.fromJson(entry.getKey(),new TypeToken() {}.getType()); + Identifier id = gson.fromJson(entry.getValue(),new TypeToken() {}.getType()); + blockCache.put(pos,id); + + }); } catch(Exception e) { return false; } @@ -78,6 +92,5 @@ else if(client.getSingleplayerServer()!=null){ return new File(StorageDir,client.getSingleplayerServer().getWorldPath(LevelResource.ROOT).getParent().getFileName().toString()+".json"); } else return null; - } } diff --git a/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java b/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java index 291280c..a03d48a 100644 --- a/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java +++ b/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java @@ -2,10 +2,9 @@ import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientBlockEntityEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLevelEvents; -import net.fabricmc.fabric.api.client.rendering.v1.level.LevelRenderEvents; import net.fabricmc.fabric.api.event.player.UseBlockCallback; +import net.minecraft.client.Minecraft; import net.minecraft.world.InteractionResult; import net.minecraft.world.level.block.Blocks; import org.slf4j.Logger; @@ -31,10 +30,10 @@ public void onInitialize() { instance = this; UseBlockCallback.EVENT.register((player, world, hand, hitResult) -> { - if (player.isCrouching()) { + if (Minecraft.getInstance().options.keyShift.isDown()) { if (world.getBlockState(hitResult.getBlockPos()).is(Blocks.BEACON)) { if(world.isClientSide()) { - BRStorage.Toggle(hitResult.getBlockPos()); + BRStorage.Toggle(hitResult.getBlockPos(),world.dimension().identifier()); } return InteractionResult.SUCCESS; } diff --git a/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java b/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java index c7a88fd..076b98c 100644 --- a/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java +++ b/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java @@ -3,7 +3,6 @@ import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.rendering.v1.level.LevelRenderEvents; - import ru.Jor.BeaconRadius.BeaconRadius; public class BeaconRadiusClient implements ClientModInitializer { diff --git a/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java b/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java index 37de8ca..e30f7bb 100644 --- a/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java +++ b/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java @@ -14,15 +14,13 @@ import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.block.BeaconBeamBlock; +import net.minecraft.resources.Identifier; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.Vec3; import org.joml.Matrix4f; -import org.joml.Matrix4fc; import org.joml.Vector3f; import org.joml.Vector4f; import org.lwjgl.system.MemoryUtil; -import org.spongepowered.asm.mixin.injection.struct.InjectorGroupInfo; import ru.Jor.BeaconRadius.BRStorage; import ru.Jor.BeaconRadius.mixin.accessor.BeaconBlockEntityAccessor; import ru.Jor.BeaconRadius.BeaconRadius; @@ -61,23 +59,23 @@ private static boolean render(LevelRenderContext context) { } boolean hasContent=false; - List toDel = new ArrayList<>(); + Map toDel = new HashMap<>(); if (world != null) { - for(BlockPos block:BRStorage.blockCache) { - if (world.isLoaded(block)){ - if (world.getBlockState(block).is(Blocks.BEACON)) { - if (!((BeaconBlockEntityAccessor) world.getBlockEntity(block)).BeaconRadius$getbeamSections().isEmpty()) - if (renderMyObject(matrices.last(), buffer, block, - ((BeaconBlockEntityAccessor) world.getBlockEntity(block)).BeaconRadius$getLevels(),world.getGameTime(), + for(Map.Entry block:BRStorage.blockCache.entrySet()) { + if (world.isLoaded(block.getKey())&&(block.getValue().equals(world.dimension().identifier()))){ + if (world.getBlockState(block.getKey()).is(Blocks.BEACON)) { + if (!((BeaconBlockEntityAccessor) world.getBlockEntity(block.getKey())).BeaconRadius$getbeamSections().isEmpty()) + if (renderMyObject(matrices.last(), buffer, block.getKey(), + ((BeaconBlockEntityAccessor) world.getBlockEntity(block.getKey())).BeaconRadius$getLevels(),world.getGameTime(), world.getMaxY())) hasContent = true; } else - toDel.add(block); - } + toDel.put(block.getKey(),block.getValue()); + } } - toDel.forEach(block ->{BRStorage.blockCache.remove(block);}); + toDel.forEach((block,dim) ->{BRStorage.blockCache.remove(block,dim);}); if(!hasContent) return false; }