diff --git a/gradle.properties b/gradle.properties index c4069c5..d278092 100644 --- a/gradle.properties +++ b/gradle.properties @@ -49,7 +49,7 @@ mod_name=Aria's Essentials # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=GPLv3 # The mod version. See https://semver.org/ -mod_version=1.1.121823.1531 +mod_version=1.1.121823.1657 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/src/main/java/dev/zontreck/essentials/commands/teleport/RTPCommand.java b/src/main/java/dev/zontreck/essentials/commands/teleport/RTPCommand.java index 091958c..d5efcb1 100644 --- a/src/main/java/dev/zontreck/essentials/commands/teleport/RTPCommand.java +++ b/src/main/java/dev/zontreck/essentials/commands/teleport/RTPCommand.java @@ -2,7 +2,7 @@ package dev.zontreck.essentials.commands.teleport; import com.mojang.brigadier.CommandDispatcher; -import dev.zontreck.essentials.util.RandomPositionFactory; +import dev.zontreck.essentials.rtp.RandomPositionFactory; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.server.level.ServerPlayer; @@ -51,7 +51,7 @@ public class RTPCommand { Vec3 pos = pla.position(); //boolean found_place= false; - RandomPositionFactory.beginRTPSearch(pla, pos, pla.getRotationVector(), pla.serverLevel()); + RandomPositionFactory.beginRTP(pla, pla.serverLevel()); return; diff --git a/src/main/java/dev/zontreck/essentials/commands/teleport/SpawnCommand.java b/src/main/java/dev/zontreck/essentials/commands/teleport/SpawnCommand.java index 0d1b0f7..4656e41 100644 --- a/src/main/java/dev/zontreck/essentials/commands/teleport/SpawnCommand.java +++ b/src/main/java/dev/zontreck/essentials/commands/teleport/SpawnCommand.java @@ -1,40 +1,12 @@ package dev.zontreck.essentials.commands.teleport; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.util.Iterator; -import java.util.List; - import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import dev.zontreck.essentials.AriasEssentials; import dev.zontreck.essentials.Messages; -import dev.zontreck.essentials.commands.teleport.TeleportActioner; -import dev.zontreck.essentials.commands.teleport.TeleportContainer; -import dev.zontreck.essentials.commands.teleport.TeleportDestination; -import dev.zontreck.essentials.configs.AEServerConfig; -import dev.zontreck.essentials.util.RTPContainer; -import dev.zontreck.essentials.util.RandomPositionFactory; -import dev.zontreck.essentials.warps.NoSuchWarpException; -import dev.zontreck.essentials.warps.Warp; -import dev.zontreck.essentials.warps.WarpsProvider; -import dev.zontreck.libzontreck.chat.ChatColor; -import dev.zontreck.libzontreck.chat.Clickable; -import dev.zontreck.libzontreck.exceptions.InvalidSideException; import dev.zontreck.libzontreck.util.ChatHelpers; -import dev.zontreck.libzontreck.vectors.Vector3; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.core.BlockPos; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.ComponentUtils; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.Style; -import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/dev/zontreck/essentials/commands/warps/WarpCommand.java b/src/main/java/dev/zontreck/essentials/commands/warps/WarpCommand.java index c07afb7..a5daf28 100644 --- a/src/main/java/dev/zontreck/essentials/commands/warps/WarpCommand.java +++ b/src/main/java/dev/zontreck/essentials/commands/warps/WarpCommand.java @@ -1,37 +1,22 @@ package dev.zontreck.essentials.commands.warps; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.util.Iterator; -import java.util.List; - import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import dev.zontreck.essentials.AriasEssentials; import dev.zontreck.essentials.Messages; import dev.zontreck.essentials.commands.teleport.TeleportActioner; import dev.zontreck.essentials.commands.teleport.TeleportContainer; import dev.zontreck.essentials.commands.teleport.TeleportDestination; -import dev.zontreck.essentials.util.RTPContainer; -import dev.zontreck.essentials.util.RandomPositionFactory; +import dev.zontreck.essentials.rtp.RandomPositionFactory; import dev.zontreck.essentials.warps.NoSuchWarpException; import dev.zontreck.essentials.warps.Warp; import dev.zontreck.essentials.warps.WarpsProvider; -import dev.zontreck.libzontreck.chat.ChatColor; import dev.zontreck.libzontreck.chat.Clickable; -import dev.zontreck.libzontreck.exceptions.InvalidSideException; import dev.zontreck.libzontreck.util.ChatHelpers; import dev.zontreck.libzontreck.vectors.Vector3; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.ComponentUtils; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.Style; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.phys.Vec2; @@ -78,7 +63,7 @@ public class WarpCommand { if(type==1){ try { dest.Position = Vector3.ZERO; - RandomPositionFactory.beginRTPSearch(p, Vec3.ZERO, Vec2.ZERO, f_dim); + RandomPositionFactory.beginRTP(p, f_dim); return; } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/dev/zontreck/essentials/events/RTPFoundEvent.java b/src/main/java/dev/zontreck/essentials/events/RTPFoundEvent.java new file mode 100644 index 0000000..25b942c --- /dev/null +++ b/src/main/java/dev/zontreck/essentials/events/RTPFoundEvent.java @@ -0,0 +1,14 @@ +package dev.zontreck.essentials.events; + +import dev.zontreck.essentials.rtp.RTP; +import net.minecraftforge.eventbus.api.Event; + +public class RTPFoundEvent extends Event +{ + public RTP rtp; + + public RTPFoundEvent(RTP rtp) + { + this.rtp=rtp; + } +} diff --git a/src/main/java/dev/zontreck/essentials/events/RTPNotCancelledEvent.java b/src/main/java/dev/zontreck/essentials/events/RTPNotCancelledEvent.java index d60c4d1..63addae 100644 --- a/src/main/java/dev/zontreck/essentials/events/RTPNotCancelledEvent.java +++ b/src/main/java/dev/zontreck/essentials/events/RTPNotCancelledEvent.java @@ -1,6 +1,6 @@ package dev.zontreck.essentials.events; -import dev.zontreck.essentials.util.RTPContainer; +import dev.zontreck.essentials.rtp.RTPContainer; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.Event; diff --git a/src/main/java/dev/zontreck/essentials/rtp/RTP.java b/src/main/java/dev/zontreck/essentials/rtp/RTP.java new file mode 100644 index 0000000..9b62acc --- /dev/null +++ b/src/main/java/dev/zontreck/essentials/rtp/RTP.java @@ -0,0 +1,278 @@ +package dev.zontreck.essentials.rtp; + +import dev.zontreck.ariaslib.util.DelayedExecutorService; +import dev.zontreck.ariaslib.util.Lists; +import dev.zontreck.essentials.AriasEssentials; +import dev.zontreck.essentials.Messages; +import dev.zontreck.essentials.events.RTPEvent; +import dev.zontreck.essentials.events.RTPNotCancelledEvent; +import dev.zontreck.libzontreck.util.ChatHelpers; +import dev.zontreck.libzontreck.vectors.Vector3; +import dev.zontreck.libzontreck.vectors.WorldPosition; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraftforge.common.MinecraftForge; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + +/** + * As of v1.1.121823.x, this is now used for RTP + *

+ * This ensures that RTP is only scanned once every so often. This is because RTP lags the server when it is having to check block positions. + *

+ * If the RTP system scans each dimension (Not blacklisted), then it can build a list of safe locations that will be rotated out every 2 hours. + *

+ * Every 10 minutes, a new RTP location is scanned. This ensures sufficiently semi-random locations. Eventually old locations will be removed from the list. + *

+ * At server start, it will scan 10 RTP locations per dimension while there are no players. + */ +public class RTP +{ + public RTP(ServerLevel level) + { + Age = Instant.now().getEpochSecond(); + position = new WorldPosition(new Vector3(0,500,0), WorldPosition.getDim(level)); + + if(position.getActualDimension().dimensionType().hasCeiling()) + { + heightMapType = Heightmap.Types.MOTION_BLOCKING_NO_LEAVES; + SearchDirection=-1; + }else { + heightMapType = Heightmap.Types.MOTION_BLOCKING_NO_LEAVES; + SearchDirection=1; + } + } + private int SearchDirection; + private Thread containingThread; + private Heightmap.Types heightMapType; + public WorldPosition position; + private List BLACKLIST = Lists.of(Blocks.LAVA, Blocks.WATER); + protected int tries; + /** + * This is a unix timestamp, that is checked for being Stale + */ + public long Age; + + public boolean isDimension(ServerLevel level) + { + String dim = WorldPosition.getDim(level); + if(dim.equals(position.Dimension)) + { + return true; + }else return false; + } + + /** + * Checks if the RTP Cached position is stale. This means over 2 hours old + * @return True if stale + */ + public boolean isStale() + { + if((Age+(2*60*60)) < Instant.now().getEpochSecond()) + { + return true; + } else return false; + } + + public boolean readyForNewer() + { + return ((Age + (10*60)) < Instant.now().getEpochSecond()); + } + + /** + * Searches for, and finds, a valid RTP location + * @param level The level to scan + * @return RTP data + */ + public static void find(ServerLevel level) + { + RandomPositionFactory.beginRTPSearch(level); + } + + public static List slicedByDimension(ServerLevel lvl) + { + List slice = new ArrayList<>(); + + Iterator it = RTPCaches.Locations.iterator(); + while(it.hasNext()) + { + RTP nxt = it.next(); + if(nxt.isDimension(lvl)) + { + slice.add(nxt); + } + } + + return slice; + } + + public static RTP getRTP(ServerLevel level) + { + List slice = slicedByDimension(level); + if(slice.size()>0) + { + return slice.get(AriasEssentials.random.nextInt(0, slice.size())); + } else return null; + } + + + public void moveDown() { + position.Position = position.Position.moveDown(); + } + + public void moveUp() { + position.Position = position.Position.moveUp(); + } + + public void move() + { + if(SearchDirection==1){ + moveUp(); + }else if(SearchDirection==0) + { + moveDown(); + } + } + public void moveOpposite() + { + if(SearchDirection==1){ + moveDown(); + }else if(SearchDirection==0) + { + moveUp(); + } + } + + public void newPosition() { + if(!AriasEssentials.ALIVE)return; + containingThread=Thread.currentThread(); + if(tries>=30)return; + AriasEssentials.LOGGER.info("RTPContainer starts looking for new position"); + Random rng = new Random(Instant.now().getEpochSecond()); + Vector3 pos = new Vector3(rng.nextDouble(0xFFFF), 0, rng.nextDouble(0xFFFF)); + BlockPos bpos = pos.asBlockPos(); + position.getActualDimension().getChunk(bpos.getX() >> 4, bpos.getZ() >> 4, ChunkStatus.SPAWN); + pos = new Vector3( + position.getActualDimension().getHeightmapPos(heightMapType, pos.asBlockPos())); + while (!position.getActualDimension().getWorldBorder().isWithinBounds(pos.asBlockPos())) { + pos = new Vector3(rng.nextDouble(0xffff), 0, rng.nextDouble(0xffff)); + bpos = pos.asBlockPos(); + position.getActualDimension().getChunk(bpos.getX() >> 4, bpos.getZ() >> 4, ChunkStatus.SPAWN); + pos = new Vector3( + position.getActualDimension().getHeightmapPos(heightMapType, pos.asBlockPos())); + } + + position.Position = pos; + + if (pos.y < -60) { + newPosition(); + return; + } + + if (pos.y >= position.getActualDimension().getLogicalHeight()) { + spiralPositions(pos); + } + + tries++; + AriasEssentials.LOGGER.info("RTPContainer returns new position"); + } + + private void spiralPositions(Vector3 position) + { + Vec3i posi = position.asMinecraftVec3i(); + for(BlockPos pos : BlockPos.spiralAround(new BlockPos(posi.getX(), this.position.getActualDimension().getSeaLevel(), posi.getZ()), 16, Direction.WEST, Direction.NORTH)){ + if(isSafe(pos)){ + // Set the new position + this.position.Position = new Vector3(pos); + return; + } + } + } + + private boolean safe(BlockPos blockPos) + { + containingThread=Thread.currentThread(); + BlockState b = position.getActualDimension().getBlockState(blockPos); + BlockState b2 = position.getActualDimension().getBlockState(blockPos.above()); + BlockState b3 = position.getActualDimension().getBlockState(blockPos.below()); + + if (b.isAir() && b2.isAir()) { + if (!b3.isAir()) { + if (BLACKLIST.contains(b3.getBlock())) { + return false; + } else + return true; + } else + return false; + } else + return false; + + } + public boolean isSafe(BlockPos blockPos) { + boolean s = safe(blockPos); + if(s) + { + AriasEssentials.LOGGER.info("/!\\ SAFE /!\\"); + }else AriasEssentials.LOGGER.info("/!\\ NOT SAFE /!\\"); + + return s; + } + + public void putAge() + { + Age = Instant.now().getEpochSecond(); + } + + public static void checkStale() + { + Iterator it = RTPCaches.Locations.iterator(); + List uniqueDims = new ArrayList<>(); + while(it.hasNext()) + { + RTP loc = it.next(); + if(loc.isStale()){ + it.remove(); + } + + if(!uniqueDims.contains(loc.position.getActualDimension())) + { + uniqueDims.add(loc.position.getActualDimension()); + } + } + + checkNeedsNewer(uniqueDims); + } + + public static void checkNeedsNewer(List dims) + { + Iterator it = dims.iterator(); + while(it.hasNext()) + { + ServerLevel lvl = it.next(); + List slice = slicedByDimension(lvl); + boolean needsNewer = true; + for(var X : slice) + { + if(!X.readyForNewer()) needsNewer=false; + } + + if(needsNewer) + { + RandomPositionFactory.beginRTPSearch(lvl); + } + } + } +} diff --git a/src/main/java/dev/zontreck/essentials/rtp/RTPCaches.java b/src/main/java/dev/zontreck/essentials/rtp/RTPCaches.java new file mode 100644 index 0000000..0751638 --- /dev/null +++ b/src/main/java/dev/zontreck/essentials/rtp/RTPCaches.java @@ -0,0 +1,11 @@ +package dev.zontreck.essentials.rtp; + +import dev.zontreck.libzontreck.vectors.WorldPosition; + +import java.util.ArrayList; +import java.util.List; + +public class RTPCaches +{ + public static List Locations = new ArrayList<>(); +} diff --git a/src/main/java/dev/zontreck/essentials/rtp/RTPCachesEventHandlers.java b/src/main/java/dev/zontreck/essentials/rtp/RTPCachesEventHandlers.java new file mode 100644 index 0000000..875c04d --- /dev/null +++ b/src/main/java/dev/zontreck/essentials/rtp/RTPCachesEventHandlers.java @@ -0,0 +1,20 @@ +package dev.zontreck.essentials.rtp; + +import dev.zontreck.essentials.events.RTPFoundEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +public class RTPCachesEventHandlers +{ + @SubscribeEvent + public void onTick(TickEvent.ServerTickEvent event) + { + RTP.checkStale(); + } + + @SubscribeEvent + public void onRTPFound(RTPFoundEvent event) + { + RTPCaches.Locations.add(event.rtp); + } +} diff --git a/src/main/java/dev/zontreck/essentials/rtp/RTPContainer.java b/src/main/java/dev/zontreck/essentials/rtp/RTPContainer.java new file mode 100644 index 0000000..109b3a8 --- /dev/null +++ b/src/main/java/dev/zontreck/essentials/rtp/RTPContainer.java @@ -0,0 +1,37 @@ +package dev.zontreck.essentials.rtp; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.stream.Stream; + +import dev.zontreck.essentials.AriasEssentials; +import dev.zontreck.essentials.commands.teleport.TeleportContainer; +import dev.zontreck.libzontreck.vectors.Vector3; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Vec3i; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec2; +import net.minecraft.world.phys.Vec3; + +@Deprecated +/** + * @see RTP instead + */ +public class RTPContainer { +} diff --git a/src/main/java/dev/zontreck/essentials/rtp/RandomPositionFactory.java b/src/main/java/dev/zontreck/essentials/rtp/RandomPositionFactory.java new file mode 100644 index 0000000..4010afb --- /dev/null +++ b/src/main/java/dev/zontreck/essentials/rtp/RandomPositionFactory.java @@ -0,0 +1,44 @@ +package dev.zontreck.essentials.rtp; + +import dev.zontreck.ariaslib.util.DelayedExecutorService; +import dev.zontreck.essentials.commands.teleport.TeleportActioner; +import dev.zontreck.essentials.commands.teleport.TeleportContainer; +import dev.zontreck.libzontreck.vectors.Vector3; +import dev.zontreck.libzontreck.vectors.WorldPosition; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.phys.Vec2; +import net.minecraft.world.phys.Vec3; + +import java.time.Instant; + +/** + * The factory system used to start searching for a random teleport position + */ +public class RandomPositionFactory { + + public static RTP beginRTPSearch(ServerLevel level) + { + RTP tmp = new RTP(level); + tmp.position = new WorldPosition(new Vector3(0,0,0), WorldPosition.getDim(level)); + Thread tx = new Thread(new RandomPositionLocator(tmp)); + tx.setName("RTPTask-"+String.valueOf(DelayedExecutorService.getNext())); + tx.start(); + + return tmp; + } + + public static void beginRTP(ServerPlayer player, ServerLevel level) + { + RTP tmp = RTP.getRTP(level); + if(tmp == null) + { + throw new RuntimeException("No valid destinations were found"); + } + + TeleportActioner.ApplyTeleportEffect(player); + TeleportContainer cont = new TeleportContainer(player, tmp.position.Position.asMinecraftVector(), player.getRotationVector(), level); + + TeleportActioner.PerformTeleport(cont); + } +} diff --git a/src/main/java/dev/zontreck/essentials/util/RandomPositionLocator.java b/src/main/java/dev/zontreck/essentials/rtp/RandomPositionLocator.java similarity index 61% rename from src/main/java/dev/zontreck/essentials/util/RandomPositionLocator.java rename to src/main/java/dev/zontreck/essentials/rtp/RandomPositionLocator.java index 34d312a..f692dfc 100644 --- a/src/main/java/dev/zontreck/essentials/util/RandomPositionLocator.java +++ b/src/main/java/dev/zontreck/essentials/rtp/RandomPositionLocator.java @@ -1,12 +1,12 @@ -package dev.zontreck.essentials.util; +package dev.zontreck.essentials.rtp; import dev.zontreck.ariaslib.terminal.Task; import dev.zontreck.ariaslib.util.DelayedExecutorService; import dev.zontreck.essentials.AriasEssentials; import dev.zontreck.essentials.Messages; import dev.zontreck.essentials.events.RTPEvent; +import dev.zontreck.essentials.events.RTPFoundEvent; import dev.zontreck.essentials.events.RTPNotCancelledEvent; -import dev.zontreck.libzontreck.chat.ChatColor; import dev.zontreck.libzontreck.util.ChatHelpers; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; @@ -21,9 +21,9 @@ import net.minecraftforge.common.MinecraftForge; */ public class RandomPositionLocator extends Task { - private final RTPContainer contain; + private final RTP contain; - public RandomPositionLocator(RTPContainer rtp) + public RandomPositionLocator(RTP rtp) { super("RPL",true); contain=rtp; @@ -33,10 +33,10 @@ public class RandomPositionLocator extends Task public void run() { if(!AriasEssentials.ALIVE)return; - ChatHelpers.broadcastTo(contain.container.PlayerInst.getUUID(), ChatHelpers.macro(Messages.RTP_SEARCHING, String.valueOf(contain.tries), "30"), contain.container.PlayerInst.server); + //ChatHelpers.broadcastTo(contain.container.PlayerInst.getUUID(), ChatHelpers.macro(Messages.RTP_SEARCHING, String.valueOf(contain.tries), "30"), contain.container.PlayerInst.server); - ServerLevel levl = contain.container.Dimension; - ChunkAccess chunk = levl.getChunk(contain.container.world_pos.Position.asBlockPos()); + ServerLevel levl = contain.position.getActualDimension(); + ChunkAccess chunk = levl.getChunk(contain.position.Position.asBlockPos()); ChunkPos cpos = chunk.getPos(); boolean needsLoading = false; needsLoading = !(levl.getForcedChunks().contains(cpos.toLong())); @@ -48,25 +48,16 @@ public class RandomPositionLocator extends Task int curChecks=0; while(curChecks<10) { - if(contain.isSafe(contain.container.world_pos.Position.asBlockPos())) + if(contain.isSafe(contain.position.Position.asBlockPos())) { - contain.complete=true; + contain.putAge(); if(needsLoading) levl.setChunkForced(cpos.x, cpos.z, false); - - if(MinecraftForge.EVENT_BUS.post(new RTPEvent(contain.container.PlayerInst, contain.container.world_pos))) - { - contain.complete=false; - contain.container.Position = contain.container.world_pos.Position.asMinecraftVector(); - ChatHelpers.broadcastTo(contain.container.PlayerInst.getUUID(), ChatHelpers.macro(Messages.RTP_CANCELLED), contain.container.PlayerInst.server); - break; - }else { - AriasEssentials.LOGGER.info("RTP Not cancelled. Actioning"); - new RTPNotCancelledEvent(contain).send(); - } + MinecraftForge.EVENT_BUS.post(new RTPFoundEvent(contain)); + return; - }else { + } else { curChecks++; contain.move(); //AriasEssentials.LOGGER.info("[DEBUG] "+ChatColor.doColors("!Dark_Red!Checking position: "+contain.container.world_pos.Position.toString()+"; "+contain.container.Dimension.getBlockState(contain.container.world_pos.Position.asBlockPos()).getBlock().toString()+"; "+contain.container.Dimension.getBlockState(contain.container.world_pos.Position.asBlockPos().below()).getBlock().toString())); @@ -80,8 +71,6 @@ public class RandomPositionLocator extends Task if(contain.tries > 30) { // Abort - ChatHelpers.broadcastTo(contain.container.PlayerInst.getUUID(), ChatHelpers.macro(Messages.RTP_ABORTED,"30"), contain.container.PlayerInst.server); - contain.aborted=true; return; }else { // Schedule the task to execute diff --git a/src/main/java/dev/zontreck/essentials/util/RTPContainer.java b/src/main/java/dev/zontreck/essentials/util/RTPContainer.java deleted file mode 100644 index b6689b8..0000000 --- a/src/main/java/dev/zontreck/essentials/util/RTPContainer.java +++ /dev/null @@ -1,169 +0,0 @@ -package dev.zontreck.essentials.util; - -import java.time.Instant; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.stream.Stream; - -import dev.zontreck.essentials.AriasEssentials; -import dev.zontreck.essentials.commands.teleport.TeleportContainer; -import dev.zontreck.libzontreck.vectors.Vector3; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.core.Vec3i; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkStatus; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec2; -import net.minecraft.world.phys.Vec3; - -public class RTPContainer { - public TeleportContainer container; - public int tries = -1; - public boolean complete = false; - public boolean aborted=false; - public Thread containingThread; - private Types heightMapType; - private int SearchDirection; - - public static final List BLACKLIST; - - static { - List tmp = new ArrayList<>(); - tmp.add(Blocks.LAVA); - tmp.add(Blocks.BEDROCK); - tmp.add(Blocks.WATER); - - BLACKLIST = tmp; - } - - public void moveDown() { - container.world_pos.Position = container.world_pos.Position.moveDown(); - container.Position = container.world_pos.Position.asMinecraftVector(); - } - - public void moveUp() { - container.world_pos.Position = container.world_pos.Position.moveUp(); - container.Position = container.world_pos.Position.asMinecraftVector(); - } - - public void move() - { - if(SearchDirection==1){ - moveUp(); - }else if(SearchDirection==0) - { - moveDown(); - } - } - public void moveOpposite() - { - if(SearchDirection==1){ - moveDown(); - }else if(SearchDirection==0) - { - moveUp(); - } - } - - public void newPosition() { - if(!AriasEssentials.ALIVE)return; - containingThread=Thread.currentThread(); - if(tries>=30)return; - AriasEssentials.LOGGER.info("RTPContainer starts looking for new position"); - Random rng = new Random(Instant.now().getEpochSecond()); - Vector3 pos = new Vector3(rng.nextDouble(0xFFFF), 0, rng.nextDouble(0xFFFF)); - BlockPos bpos = pos.asBlockPos(); - container.Dimension.getChunk(bpos.getX() >> 4, bpos.getZ() >> 4, ChunkStatus.SPAWN); - pos = new Vector3( - container.Dimension.getHeightmapPos(heightMapType, pos.asBlockPos())); - while (!container.Dimension.getWorldBorder().isWithinBounds(pos.asBlockPos())) { - pos = new Vector3(rng.nextDouble(0xffff), 0, rng.nextDouble(0xffff)); - bpos = pos.asBlockPos(); - container.Dimension.getChunk(bpos.getX() >> 4, bpos.getZ() >> 4, ChunkStatus.SPAWN); - pos = new Vector3( - container.Dimension.getHeightmapPos(heightMapType, pos.asBlockPos())); - } - - container.world_pos.Position = pos; - container.Position = container.world_pos.Position.asMinecraftVector(); - - if (pos.y < -60) { - newPosition(); - return; - } - - if (pos.y >= container.Dimension.getLogicalHeight()) { - spiralPositions(pos); - } - - tries++; - AriasEssentials.LOGGER.info("RTPContainer returns new position"); - } - - private void spiralPositions(Vector3 position) - { - Vec3i posi = position.asMinecraftVec3i(); - for(BlockPos pos : BlockPos.spiralAround(new BlockPos(posi.getX(), container.Dimension.getSeaLevel(), posi.getZ()), 16, Direction.WEST, Direction.NORTH)){ - if(isSafe(pos)){ - // Set the new position - container.world_pos.Position = new Vector3(pos); - container.Position = container.world_pos.Position.asMinecraftVector(); - return; - } - } - } - - protected RTPContainer(ServerPlayer player, Vec3 pos, Vec2 rot, ServerLevel level) { - container = new TeleportContainer(player, pos, rot, level); - if(container.Dimension.dimensionType().hasCeiling()) - { - heightMapType = Heightmap.Types.MOTION_BLOCKING_NO_LEAVES; - SearchDirection=-1; - }else { - heightMapType = Types.MOTION_BLOCKING_NO_LEAVES; - SearchDirection=1; - } - newPosition(); - } - private boolean safe(BlockPos blockPos) - { - containingThread=Thread.currentThread(); - BlockState b = container.Dimension.getBlockState(blockPos); - BlockState b2 = container.Dimension.getBlockState(blockPos.above()); - BlockState b3 = container.Dimension.getBlockState(blockPos.below()); - - if (b.isAir() && b2.isAir()) { - if (!b3.isAir()) { - if (BLACKLIST.contains(b3.getBlock())) { - return false; - } else - return true; - } else - return false; - } else - return false; - - } - public boolean isSafe(BlockPos blockPos) { - boolean s = safe(blockPos); - if(s) - { - AriasEssentials.LOGGER.info("/!\\ SAFE /!\\"); - }else AriasEssentials.LOGGER.info("/!\\ NOT SAFE /!\\"); - - return s; - } -} diff --git a/src/main/java/dev/zontreck/essentials/util/RandomPositionFactory.java b/src/main/java/dev/zontreck/essentials/util/RandomPositionFactory.java deleted file mode 100644 index d973c04..0000000 --- a/src/main/java/dev/zontreck/essentials/util/RandomPositionFactory.java +++ /dev/null @@ -1,23 +0,0 @@ -package dev.zontreck.essentials.util; - -import dev.zontreck.ariaslib.util.DelayedExecutorService; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.phys.Vec2; -import net.minecraft.world.phys.Vec3; - -/** - * The factory system used to start searching for a random teleport position - */ -public class RandomPositionFactory { - - public static RTPContainer beginRTPSearch(ServerPlayer player, Vec3 pos, Vec2 rot, ServerLevel level) - { - RTPContainer contain= new RTPContainer(player, pos, rot, level); - Thread tx = new Thread(new RandomPositionLocator(contain)); - tx.setName("RTPTask-"+String.valueOf(DelayedExecutorService.getNext())); - tx.start(); - - return contain; - } -}