From 29cb1cc5dabb876fd401af652148f51ce9d9e885 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sat, 8 Mar 2025 01:11:24 +0100 Subject: [PATCH] Implemented first tracer lib version --- .../features/script/lua/libs/TracerLib.java | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/TracerLib.java diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/TracerLib.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/TracerLib.java new file mode 100644 index 00000000..1e6b005e --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/TracerLib.java @@ -0,0 +1,86 @@ +package de.steamwar.bausystem.features.script.lua.libs; + +import de.steamwar.bausystem.features.tracer.TNTPoint; +import de.steamwar.bausystem.features.tracer.Trace; +import de.steamwar.bausystem.features.tracer.TraceManager; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; +import org.luaj.vm2.LuaError; +import org.luaj.vm2.LuaInteger; +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.OneArgFunction; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +public class TracerLib implements LuaLib{ + @Override + public String name() { + return "tracer"; + } + + private LuaTable convertTrace(Trace trace) { + return LuaValue.listOf( + trace.getHistories() + .stream() + .map((history) -> LuaValue.listOf(history.stream().map(this::convertTntPoint).toArray(LuaValue[]::new))) + .toArray(LuaValue[]::new) + ); + } + + private LuaTable convertTntPoint(TNTPoint tntPoint) { + Location pointPos = tntPoint.getLocation(); + LuaTable luaPos = LuaValue.listOf(new LuaValue[] { + LuaValue.valueOf(pointPos.getX()), + LuaValue.valueOf(pointPos.getY()), + LuaValue.valueOf(pointPos.getZ()), + }); + + Vector pointVel = tntPoint.getVelocity(); + LuaTable luaVel = LuaValue.listOf(new LuaValue[] { + LuaValue.valueOf(pointVel.getX()), + LuaValue.valueOf(pointVel.getY()), + LuaValue.valueOf(pointVel.getZ()), + }); + + return LuaValue.tableOf(new LuaValue[] { + LuaValue.valueOf("pos"), luaPos, + LuaValue.valueOf("vel"), luaVel, + LuaValue.valueOf("ticksSinceStart"), LuaValue.valueOf(tntPoint.getTicksSinceStart()), + LuaValue.valueOf("fuse"), LuaValue.valueOf(tntPoint.getFuse()), + LuaValue.valueOf("isExplosion"), LuaValue.valueOf(tntPoint.isExplosion()), + LuaValue.valueOf("isInWater"), LuaValue.valueOf(tntPoint.isInWater()), + LuaValue.valueOf("hasDestroyedBuild"), LuaValue.valueOf(tntPoint.isDestroyedBuildArea()), + LuaValue.valueOf("hasDestroyedTestblock"), LuaValue.valueOf(tntPoint.isDestroyedTestBlock()) + }); + } + + @Override + public LuaTable get(Player player) { + LuaTable rootTable = new LuaTable(); + + rootTable.set("getTrace", new OneArgFunction() { + @Override + public LuaValue call(LuaValue arg) { + int id = arg.checkint(); + + Optional traceResult = TraceManager.instance.get(id); + if(traceResult.isEmpty()) { + throw new LuaError("No trace found with id " + id); + } else { + return convertTrace(traceResult.get()); + } + } + }); + + rootTable.set("getAllTraceIds", getter(() -> LuaValue.listOf(TraceManager.instance.getAllIds() + .stream() + .map((id) -> LuaValue.valueOf(id)).toArray(LuaValue[]::new)) + )); + + return rootTable; + } +}