Added option to leave Server and go back to main server
This commit is contained in:
parent
6b2b25ce5e
commit
a00c1f174c
@ -1,31 +1,67 @@
|
|||||||
package eu.mhsl.craftattack.worldmuseum.inventory;
|
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.World;
|
||||||
import eu.mhsl.craftattack.worldmuseum.worlds.WorldManager;
|
import eu.mhsl.craftattack.worldmuseum.worlds.WorldManager;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
|
import net.minestom.server.MinecraftServer;
|
||||||
import net.minestom.server.inventory.Inventory;
|
import net.minestom.server.inventory.Inventory;
|
||||||
import net.minestom.server.inventory.InventoryType;
|
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.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
public class WorldSelector extends Inventory {
|
public class WorldSelector extends Inventory {
|
||||||
public WorldSelector() {
|
public WorldSelector() {
|
||||||
super(InventoryType.CHEST_1_ROW, Component.text("Weltenauswahl").color(NamedTextColor.DARK_GRAY));
|
super(InventoryType.CHEST_1_ROW, Component.text("Weltenauswahl").color(NamedTextColor.DARK_GRAY));
|
||||||
|
|
||||||
List<World> worlds = WorldManager.getInstance().getWorlds();
|
// Limit to seven worlds, so no overflow occurs // TODO make inventory bigger when more items are added
|
||||||
for (int i = 0; i < worlds.size(); i++) {
|
List<World> worlds = WorldManager
|
||||||
World world = worlds.get(i);
|
.getInstance()
|
||||||
setItemStack(i, world.getItem());
|
.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);
|
inventoryConditionResult.setCancel(true);
|
||||||
|
if(player.isLoading()) return;
|
||||||
|
|
||||||
player.closeInventory();
|
// leave World-Museum
|
||||||
try {
|
if(slot == 8) {
|
||||||
worlds.get(slot).movePlayer(player);
|
player.closeInventory();
|
||||||
} catch (IndexOutOfBoundsException ignore) {}
|
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);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -49,6 +49,10 @@ public class MuseumPlayer extends Player {
|
|||||||
isLoading = false;
|
isLoading = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isLoading() {
|
||||||
|
return isLoading;
|
||||||
|
}
|
||||||
|
|
||||||
public void updateFlyingSpeed(float speed) {
|
public void updateFlyingSpeed(float speed) {
|
||||||
speed = MathUtils.clamp(getFlyingSpeed() + speed, 0.01f, 0.2f);
|
speed = MathUtils.clamp(getFlyingSpeed() + speed, 0.01f, 0.2f);
|
||||||
setFlyingSpeed(speed);
|
setFlyingSpeed(speed);
|
||||||
|
Reference in New Issue
Block a user