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/BRStorage.java b/src/main/java/ru/Jor/BeaconRadius/BRStorage.java new file mode 100644 index 0000000..8d4b608 --- /dev/null +++ b/src/main/java/ru/Jor/BeaconRadius/BRStorage.java @@ -0,0 +1,96 @@ +package ru.Jor.BeaconRadius; + +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.*; + +public class BRStorage { + private static final File StorageDir = new File(FabricLoader.getInstance().getGameDir().toFile(),"BeaconRadius"); + + public static Map blockCache = new HashMap<>(); + + public static void Toggle(BlockPos block,Identifier dim){ + if(blockCache.entrySet().contains((Map.entry(block,dim)))){ + blockCache.remove(block,dim); + }else{ + blockCache.put(block,dim); + } + save(); + } + + public static void onJoin() + { + load(); + } + + private static boolean save(){ + File worldStorage = FileName(); + + if(worldStorage==null) return false; + if(!worldStorage.exists()){ + worldStorage.getParentFile().mkdirs(); + } + //"f*ck gson" variable + Map tmp = new HashMap<>(); + + try(FileWriter writer = new FileWriter(worldStorage)){ + Gson gson = new Gson(); + 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; + } + return true; + } + + public static boolean load(){ + File worldStorage = FileName(); + + if(worldStorage==null) return false; + if(!worldStorage.exists()) return true; + //"f*ck gson" variable + Map tmp = new HashMap<>(); + + try(JsonReader reader = new JsonReader( new FileReader(worldStorage))){ + Gson gson = new Gson(); + blockCache.clear(); + 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; + } + 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 new file mode 100644 index 0000000..a03d48a --- /dev/null +++ b/src/main/java/ru/Jor/BeaconRadius/BeaconRadius.java @@ -0,0 +1,52 @@ +package ru.Jor.BeaconRadius; + + +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.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 (Minecraft.getInstance().options.keyShift.isDown()) { + if (world.getBlockState(hitResult.getBlockPos()).is(Blocks.BEACON)) { + if(world.isClientSide()) { + BRStorage.Toggle(hitResult.getBlockPos(),world.dimension().identifier()); + } + return InteractionResult.SUCCESS; + } + } + return InteractionResult.PASS; + }); + + ClientLevelEvents.AFTER_CLIENT_LEVEL_CHANGE.register((player, world)->{ + 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/BeaconRadiusClient.java b/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java new file mode 100644 index 0000000..076b98c --- /dev/null +++ b/src/main/java/ru/Jor/BeaconRadius/client/BeaconRadiusClient.java @@ -0,0 +1,21 @@ +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(){ + BeaconRadius.LOGGER.info("Client side of mod {} initialized!", BeaconRadius.MOD_ID); + 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 new file mode 100644 index 0000000..e30f7bb --- /dev/null +++ b/src/main/java/ru/Jor/BeaconRadius/client/RenderAndDraw.java @@ -0,0 +1,279 @@ +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.resources.Identifier; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.Vec3; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import org.joml.Vector4f; +import org.lwjgl.system.MemoryUtil; +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.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; + + matrices.pushPose(); + matrices.translate(-camera.x, -camera.y, -camera.z); + + if (buffer == null) { + buffer = new BufferBuilder(ALLOCATOR, RenderPipelines.DEBUG_QUADS.getVertexFormatMode(), RenderPipelines.DEBUG_QUADS.getVertexFormat()); + } + + boolean hasContent=false; + Map toDel = new HashMap<>(); + + if (world != null) { + 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.put(block.getKey(),block.getValue()); + } + } + toDel.forEach((block,dim) ->{BRStorage.blockCache.remove(block,dim);}); + if(!hasContent) + return false; + } + else + return false; + matrices.popPose(); + + return true; + } + + 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; + + 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())+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); + + 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..9d15319 --- /dev/null +++ b/src/main/java/ru/Jor/BeaconRadius/mixin/accessor/BeaconBlockEntityAccessor.java @@ -0,0 +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(); +} 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/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 2be069a..0d06de8 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -3,25 +3,27 @@ "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": [], + "mixins": [ + "BeaconRadius.mixins-client.json" + ], "depends": { "fabricloader": ">=0.19.5", "minecraft": "~26.1.2",