Added option to leave Server and go back to main server

This commit is contained in:
Elias Müller 2023-10-23 08:49:31 +02:00
parent 6b2b25ce5e
commit a00c1f174c
3 changed files with 72 additions and 10 deletions

View File

@ -1,31 +1,67 @@
package eu.mhsl.craftattack.worldmuseum.inventory;
import eu.mhsl.craftattack.worldmuseum.util.BunggeCordComunicator;
import eu.mhsl.craftattack.worldmuseum.util.MuseumPlayer;
import eu.mhsl.craftattack.worldmuseum.worlds.World;
import eu.mhsl.craftattack.worldmuseum.worlds.WorldManager;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.minestom.server.MinecraftServer;
import net.minestom.server.inventory.Inventory;
import net.minestom.server.inventory.InventoryType;
import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material;
import net.minestom.server.timer.TaskSchedule;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class WorldSelector extends Inventory {
public WorldSelector() {
super(InventoryType.CHEST_1_ROW, Component.text("Weltenauswahl").color(NamedTextColor.DARK_GRAY));
List<World> worlds = WorldManager.getInstance().getWorlds();
for (int i = 0; i < worlds.size(); i++) {
World world = worlds.get(i);
setItemStack(i, world.getItem());
}
// Limit to seven worlds, so no overflow occurs // TODO make inventory bigger when more items are added
List<World> worlds = WorldManager
.getInstance()
.getWorlds()
.stream()
.limit(7)
.toList();
addInventoryCondition((player, slot, clickType, inventoryConditionResult) -> {
Map<Integer, World> worldIndex = IntStream
.range(0, worlds.size())
.boxed()
.collect(Collectors.toMap(i -> i, worlds::get));
worldIndex.forEach((integer, world) -> setItemStack(integer, world.getItem()));
setItemStack(8, ItemStack.of(Material.IRON_DOOR).withDisplayName(Component.text("Zurück zum Server").color(NamedTextColor.GOLD)));
addInventoryCondition((p, slot, clickType, inventoryConditionResult) -> {
MuseumPlayer player = (MuseumPlayer) p;
inventoryConditionResult.setCancel(true);
if(player.isLoading()) return;
player.closeInventory();
try {
worlds.get(slot).movePlayer(player);
} catch (IndexOutOfBoundsException ignore) {}
// leave World-Museum
if(slot == 8) {
player.closeInventory();
player.startLoading();
BunggeCordComunicator.connect(player, "server");
MinecraftServer.getSchedulerManager().scheduleTask(() -> {
if(player.isOnline()) player.kick("Timeout beim Serverwechsel. Bitte joine dem Server erneut!");
}, TaskSchedule.seconds(5), TaskSchedule.stop());
return;
}
// join any world
if(worldIndex.containsKey(slot)) {
player.closeInventory();
worldIndex.get(slot).movePlayer(player);
}
});
}
}

View File

@ -0,0 +1,22 @@
package eu.mhsl.craftattack.worldmuseum.util;
import net.minestom.server.entity.Player;
import net.minestom.server.network.packet.server.play.PluginMessagePacket;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class BunggeCordComunicator {
private static final String bungeeTargetSelector = "BungeeCord";
public static void connect(Player p, String bungeeServerTargetName) {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write("Connect".getBytes(StandardCharsets.UTF_8));
out.write(bungeeServerTargetName.getBytes(StandardCharsets.UTF_8));
p.sendPacket(new PluginMessagePacket(bungeeTargetSelector, out.toByteArray()));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

View File

@ -49,6 +49,10 @@ public class MuseumPlayer extends Player {
isLoading = false;
}
public boolean isLoading() {
return isLoading;
}
public void updateFlyingSpeed(float speed) {
speed = MathUtils.clamp(getFlyingSpeed() + speed, 0.01f, 0.2f);
setFlyingSpeed(speed);