various fixes, better worldhandling

This commit is contained in:
Martin Olischläger 2023-04-27 21:37:05 +02:00
parent 38d46dccf8
commit 431f002521
8 changed files with 138 additions and 34 deletions

@ -8,17 +8,16 @@ import eu.mhsl.craftattack.worldmuseum.skins.SkinCache;
import eu.mhsl.craftattack.worldmuseum.util.Config; import eu.mhsl.craftattack.worldmuseum.util.Config;
import eu.mhsl.craftattack.worldmuseum.worlds.World; import eu.mhsl.craftattack.worldmuseum.worlds.World;
import eu.mhsl.craftattack.worldmuseum.worlds.WorldManager; import eu.mhsl.craftattack.worldmuseum.worlds.WorldManager;
import eu.mhsl.craftattack.worldmuseum.util.CompassManager; import eu.mhsl.craftattack.worldmuseum.items.CompassManager;
import net.minestom.server.MinecraftServer; import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.GameMode; import net.minestom.server.entity.GameMode;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.PlayerSkin;
import net.minestom.server.event.GlobalEventHandler; import net.minestom.server.event.GlobalEventHandler;
import net.minestom.server.event.inventory.InventoryPreClickEvent; import net.minestom.server.event.inventory.InventoryPreClickEvent;
import net.minestom.server.event.player.*; import net.minestom.server.event.player.*;
import net.minestom.server.instance.InstanceManager;
import net.minestom.server.timer.TaskSchedule; import net.minestom.server.timer.TaskSchedule;
import java.time.Duration;
public class Main { public class Main {
static int PORT = 25565; static int PORT = 25565;
static String IP = "0.0.0.0"; static String IP = "0.0.0.0";
@ -31,6 +30,7 @@ public class Main {
//temp //temp
MinecraftServer.getSchedulerManager().scheduleTask(new TablistUpdateTask(), TaskSchedule.tick(20), TaskSchedule.tick(20)); MinecraftServer.getSchedulerManager().scheduleTask(new TablistUpdateTask(), TaskSchedule.tick(20), TaskSchedule.tick(20));
MinecraftServer.getConnectionManager().setPlayerProvider(NewPlayer::new);
//load eu.mhsl.craftattack.worldmuseum.worlds / configExample file //load eu.mhsl.craftattack.worldmuseum.worlds / configExample file
WorldManager worldManager = WorldManager.getInstance(); WorldManager worldManager = WorldManager.getInstance();
@ -41,7 +41,7 @@ public class Main {
config.loadConfig(); config.loadConfig();
World startworld = config.getStart_world(); World startworld = config.getStart_world();
//CompassManager //CompassManager & GamemodeChanger
CompassManager compassManager = CompassManager.getInstance(); CompassManager compassManager = CompassManager.getInstance();
compassManager.loadCommpassManager(); compassManager.loadCommpassManager();
@ -49,11 +49,12 @@ public class Main {
GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler();
//listeners //listeners
globalEventHandler.addListener(PlayerUseItemEvent.class, new CompassUseListener()); globalEventHandler.addListener(PlayerUseItemEvent.class, new ItemUseListener());
globalEventHandler.addListener(PlayerChunkUnloadEvent.class, new ChunkUnloading()); globalEventHandler.addListener(PlayerChunkUnloadEvent.class, new ChunkUnloading());
globalEventHandler.addListener(InventoryPreClickEvent.class, new InventoryClickListener()); globalEventHandler.addListener(InventoryPreClickEvent.class, new InventoryClickListener());
globalEventHandler.addListener(PlayerBlockBreakEvent.class, new BlockBreakListener()); globalEventHandler.addListener(PlayerBlockBreakEvent.class, new BlockBreakListener());
globalEventHandler.addListener(PlayerBlockPlaceEvent.class, new BlockPlaceListener()); globalEventHandler.addListener(PlayerBlockPlaceEvent.class, new BlockPlaceListener());
globalEventHandler.addListener(PlayerMoveEvent.class, new MovementListener());
//commands //commands
MinecraftServer.getCommandManager().register(new TeleportCommand()); MinecraftServer.getCommandManager().register(new TeleportCommand());
@ -61,10 +62,13 @@ public class Main {
MinecraftServer.getCommandManager().register(new GamemodeCommand()); MinecraftServer.getCommandManager().register(new GamemodeCommand());
globalEventHandler.addListener(PlayerLoginEvent.class, event -> { globalEventHandler.addListener(PlayerLoginEvent.class, event -> {
final Player player = event.getPlayer(); final NewPlayer player = (NewPlayer) event.getPlayer();
player.setSyncCooldown(Duration.ofSeconds(3));
SkinCache.setSkin(player); SkinCache.setSkin(player);
event.setSpawningInstance(startworld); event.setSpawningInstance(startworld);
player.setPermissionLevel(4);
player.setRespawnPoint(startworld.getSpawn()); player.setRespawnPoint(startworld.getSpawn());
player.setGameMode(GameMode.CREATIVE); player.setGameMode(GameMode.CREATIVE);
player.getInventory().setItemStack(0, compassManager.getCompass()); player.getInventory().setItemStack(0, compassManager.getCompass());

@ -0,0 +1,56 @@
package eu.mhsl.craftattack.worldmuseum;
import eu.mhsl.craftattack.worldmuseum.worlds.World;
import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.Player;
import net.minestom.server.network.player.PlayerConnection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.time.Duration;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
public class NewPlayer extends Player {
private boolean allowMovemenrt = true;
private long lastCompassUsage = System.currentTimeMillis();
public NewPlayer(@NotNull UUID uuid, @NotNull String username, @NotNull PlayerConnection playerConnection) {
super(uuid, username, playerConnection);
}
public void setSyncCooldown(@Nullable Duration cooldown) {
this.setCustomSynchronizationCooldown(cooldown);
}
public boolean isAllowMovement() {
return allowMovemenrt;
}
public void update_lastCompassUsage() {
lastCompassUsage = System.currentTimeMillis();
}
public boolean isAllowCompassUsage() {
long UsageDifference = System.currentTimeMillis() - lastCompassUsage;
System.out.println(UsageDifference);
long DIFFERENCE = 10000; //in Milisec
if (UsageDifference >= DIFFERENCE) return true;
return false;
}
public void setAllowMovement(boolean allowMovemenrt) {
this.allowMovemenrt = allowMovemenrt;
}
public void newTeleport(Point point) {
this.allowMovemenrt = false;
World world = (World) this.getInstance();
CompletableFuture.runAsync(
() -> world.loadOptionalChunk(point)
.thenRun(() -> this.teleport(new Pos(point))));
}
}

@ -1,4 +1,4 @@
package eu.mhsl.craftattack.worldmuseum.util; package eu.mhsl.craftattack.worldmuseum.items;
import eu.mhsl.craftattack.worldmuseum.worlds.World; import eu.mhsl.craftattack.worldmuseum.worlds.World;
import eu.mhsl.craftattack.worldmuseum.worlds.WorldManager; import eu.mhsl.craftattack.worldmuseum.worlds.WorldManager;
@ -9,7 +9,6 @@ import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material; import net.minestom.server.item.Material;
public class CompassManager { public class CompassManager {
static CompassManager instance; static CompassManager instance;
ItemStack compass; ItemStack compass;
Inventory inventory; Inventory inventory;
public static CompassManager getInstance() { public static CompassManager getInstance() {

@ -1,31 +1,35 @@
package eu.mhsl.craftattack.worldmuseum.listener; package eu.mhsl.craftattack.worldmuseum.listener;
import eu.mhsl.craftattack.worldmuseum.NewPlayer;
import eu.mhsl.craftattack.worldmuseum.util.ChangeWorld; import eu.mhsl.craftattack.worldmuseum.util.ChangeWorld;
import eu.mhsl.craftattack.worldmuseum.worlds.World; import eu.mhsl.craftattack.worldmuseum.worlds.World;
import eu.mhsl.craftattack.worldmuseum.worlds.WorldManager; import eu.mhsl.craftattack.worldmuseum.worlds.WorldManager;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import net.minestom.server.event.inventory.InventoryPreClickEvent; import net.minestom.server.event.inventory.InventoryPreClickEvent;
import net.minestom.server.thread.MinestomThread;
import java.util.Objects; import java.util.Objects;
import java.util.function.Consumer; import java.util.function.Consumer;
public class InventoryClickListener implements Consumer<InventoryPreClickEvent> { public class InventoryClickListener implements Consumer<InventoryPreClickEvent> {
@Override @Override
public void accept(InventoryPreClickEvent inventoryPreClickEvent) { public void accept(InventoryPreClickEvent inventoryPreClickEvent) {
Player p = inventoryPreClickEvent.getPlayer(); NewPlayer p = (NewPlayer) inventoryPreClickEvent.getPlayer();
inventoryPreClickEvent.setCancelled(true);
WorldManager worldManager = WorldManager.getInstance(); WorldManager worldManager = WorldManager.getInstance();
for (World w : worldManager.getWorlds()) { for (World w : worldManager.getWorlds()) {
if (!w.getItem().equals(inventoryPreClickEvent.getClickedItem())) continue; if (!w.getItem().equals(inventoryPreClickEvent.getClickedItem())) continue;
if (Objects.equals(p.getInstance(), w)) { if (Objects.equals(p.getInstance(), w)) {
p.closeInventory(); p.closeInventory();
p.teleport(w.getSpawn()); p.teleport(w.getSpawn());
return;
} else { } else {
p.closeInventory(); p.closeInventory();
ChangeWorld.change_world(p, w); Thread thread = new ChangeWorld(p, w);
thread.run();
return;
} }
} }
inventoryPreClickEvent.setCancelled(true);
} }
} }

@ -1,20 +1,24 @@
package eu.mhsl.craftattack.worldmuseum.listener; package eu.mhsl.craftattack.worldmuseum.listener;
import eu.mhsl.craftattack.worldmuseum.util.CompassManager; import eu.mhsl.craftattack.worldmuseum.NewPlayer;
import eu.mhsl.craftattack.worldmuseum.items.CompassManager;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import net.minestom.server.event.player.PlayerUseItemEvent; import net.minestom.server.event.player.PlayerUseItemEvent;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import java.util.function.Consumer; import java.util.function.Consumer;
public class CompassUseListener implements Consumer<PlayerUseItemEvent> { public class ItemUseListener implements Consumer<PlayerUseItemEvent> {
@Override @Override
public void accept(PlayerUseItemEvent playerUseItemEvent) { public void accept(PlayerUseItemEvent playerUseItemEvent) {
Player p = playerUseItemEvent.getPlayer(); NewPlayer p = (NewPlayer) playerUseItemEvent.getPlayer();
ItemStack usedItem = playerUseItemEvent.getItemStack(); ItemStack usedItem = playerUseItemEvent.getItemStack();
CompassManager compassManager = CompassManager.getInstance(); CompassManager compassManager = CompassManager.getInstance();
if (!usedItem.equals(compassManager.getCompass())) return; if (!usedItem.equals(compassManager.getCompass())) return;
if (!p.isAllowCompassUsage()) return;
p.update_lastCompassUsage();
p.openInventory(compassManager.getInventory()); p.openInventory(compassManager.getInventory());
playerUseItemEvent.setCancelled(true);
} }
} }

@ -0,0 +1,14 @@
package eu.mhsl.craftattack.worldmuseum.listener;
import eu.mhsl.craftattack.worldmuseum.NewPlayer;
import net.minestom.server.event.player.PlayerMoveEvent;
import java.util.function.Consumer;
public class MovementListener implements Consumer<PlayerMoveEvent> {
@Override
public void accept(PlayerMoveEvent playerMoveEvent) {
NewPlayer player = (NewPlayer) playerMoveEvent.getPlayer();
if (!player.isAllowMovement()) playerMoveEvent.setCancelled(true);
}
}

@ -1,23 +1,22 @@
package eu.mhsl.craftattack.worldmuseum.util; package eu.mhsl.craftattack.worldmuseum.util;
import eu.mhsl.craftattack.worldmuseum.NewPlayer;
import eu.mhsl.craftattack.worldmuseum.worlds.World; import eu.mhsl.craftattack.worldmuseum.worlds.World;
import net.minestom.server.MinecraftServer; import net.minestom.server.potion.Potion;
import net.minestom.server.entity.Player; import net.minestom.server.potion.PotionEffect;
import net.minestom.server.utils.chunk.ChunkUtils; import net.minestom.server.thread.MinestomThread;
import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
public class ChangeWorld { public class ChangeWorld extends MinestomThread {
public static void change_world(Player player, World targetWorld) { public ChangeWorld(NewPlayer player, World targetWorld) {
ArrayList<Future> futures = new ArrayList<>(); super("load_world_for_player");
ChunkUtils.forChunksInRange(targetWorld.getSpawn(), MinecraftServer.getChunkViewDistance(),(v1, v2) -> { player.setAllowMovement(false);
futures.add(targetWorld.loadChunk(v1, v2)); player.addEffect(new Potion(PotionEffect.BLINDNESS, (byte) 0, 1000000));
});
CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)).thenRun(()-> { player.setRespawnPoint(targetWorld.getSpawn());
player.setRespawnPoint(targetWorld.getSpawn()); player.setInstance(targetWorld, targetWorld.getSpawn()).thenRun(() -> {
player.setInstance(targetWorld); player.setAllowMovement(true);
player.teleport(targetWorld.getSpawn()); player.clearEffects();
player.update_lastCompassUsage();
}); });
} }
} }

@ -0,0 +1,24 @@
package eu.mhsl.craftattack.worldmuseum.util;
import eu.mhsl.craftattack.worldmuseum.worlds.World;
import net.minestom.server.MinecraftServer;
import net.minestom.server.coordinate.Point;
import net.minestom.server.instance.Chunk;
import net.minestom.server.utils.chunk.ChunkUtils;
import java.util.ArrayList;
import java.util.stream.Stream;
public class ChunkLoadUtil {
public static boolean areNearbyChunksLoaded(Point point, World world) {
ArrayList<Chunk> chunks = new ArrayList<>();
ChunkUtils.forChunksInRange(point, MinecraftServer.getChunkViewDistance(), (x , z) -> {
chunks.add(world.getChunk(x, z));
});
// Stream.of(new Conditional(point, world, () -> {world.getChunkAt(point).sendChunk();}))
return false;
}
}