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

View File

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

View File

@ -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))));
}
}

View File

@ -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.WorldManager;
@ -9,7 +9,6 @@ import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material;
public class CompassManager {
static CompassManager instance;
ItemStack compass;
Inventory inventory;
public static CompassManager getInstance() {

View File

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

View File

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

View File

@ -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);
}
}

View File

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

View File

@ -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;
}
}