Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 1 addition & 9 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,22 +35,14 @@
<id>nukkitx</id>
<url>https://repo.opencollab.dev/main/</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>cn.nukkit</groupId>
<artifactId>nukkit</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.MEFRREEX</groupId>
<artifactId>FormConstructor</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>me.onebone</groupId>
<artifactId>EconomyAPI</artifactId>
Expand Down
42 changes: 42 additions & 0 deletions src/main/java/com/indra87g/Main.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,55 @@
package com.indra87g;

import cn.nukkit.Player;
import cn.nukkit.plugin.PluginBase;
import cn.nukkit.scheduler.PluginTask;
import cn.nukkit.utils.Config;
import com.indra87g.commands.ServersCommand;
import com.indra87g.commands.SetBlockCommand;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

public class Main extends PluginBase {

private List<Map> servers;
private final Map<UUID, PluginTask<?>> countdowns = new HashMap<>();
private final Map<UUID, Player> teleportingPlayers = new HashMap<>();
private final Map<UUID, cn.nukkit.level.Location> playerLocations = new HashMap<>();

@Override
public void onEnable() {
this.saveDefaultConfig();
this.saveResource("servers.yml");

Config serversConfig = new Config(new File(this.getDataFolder(), "servers.yml"), Config.YAML);
this.servers = serversConfig.getMapList("servers");

getLogger().info("WaffleCoreNK has been enabled.");

ServersCommand serversCommand = new ServersCommand(this);
this.getServer().getPluginManager().registerEvents(new com.indra87g.listeners.PlayerMoveListener(this), this);
this.getServer().getPluginManager().registerEvents(serversCommand, this);
this.getServer().getCommandMap().register("setblock", new SetBlockCommand());
this.getServer().getCommandMap().register("servers", serversCommand);
}

public List<Map> getServers() {
return servers;
}

public Map<UUID, PluginTask<?>> getCountdowns() {
return countdowns;
}

public Map<UUID, Player> getTeleportingPlayers() {
return teleportingPlayers;
}

public Map<UUID, cn.nukkit.level.Location> getPlayerLocations() {
return playerLocations;
}
}
135 changes: 135 additions & 0 deletions src/main/java/com/indra87g/commands/ServersCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
package com.indra87g.commands;

import cn.nukkit.Player;
import cn.nukkit.command.Command;
import cn.nukkit.command.CommandSender;
import cn.nukkit.event.EventHandler;
import cn.nukkit.event.Listener;
import cn.nukkit.event.player.PlayerFormRespondedEvent;
import cn.nukkit.form.element.ElementButton;
import cn.nukkit.network.protocol.TransferPacket;
import cn.nukkit.scheduler.PluginTask;
import cn.nukkit.form.window.FormWindowSimple;
import com.indra87g.Main;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

public class ServersCommand extends Command implements Listener {

private final Main plugin;
private final Map<UUID, Integer> formIDs = new HashMap<>();

public ServersCommand(Main plugin) {
super("servers", "Display a list of servers to connect to.", "/servers");
this.plugin = plugin;
}

@Override
public boolean execute(CommandSender sender, String commandLabel, String[] args) {
if (!(sender instanceof Player)) {
sender.sendMessage("This command can only be used by a player.");
return false;
}

Player player = (Player) sender;

List<Map> servers = plugin.getServers();
if (servers == null || servers.isEmpty()) {
player.sendMessage("There are no servers available at the moment. Please try again later.");
return true;
}

FormWindowSimple form = new FormWindowSimple("Server Selector", "Choose a server to connect to.");
for (Map serverData : servers) {
form.addButton(new ElementButton(String.valueOf(serverData.get("name"))));
}

int formId = player.showFormWindow(form);
formIDs.put(player.getUniqueId(), formId);

return true;
}

@EventHandler
public void onFormResponse(PlayerFormRespondedEvent event) {
Player player = event.getPlayer();
UUID playerUUID = player.getUniqueId();

if (formIDs.containsKey(playerUUID) && formIDs.get(playerUUID) == event.getFormID()) {
formIDs.remove(playerUUID); // Prevent re-handling

if (event.getResponse() == null) {
return; // Form was closed
}

if (event.getWindow() instanceof FormWindowSimple) {
FormWindowSimple form = (FormWindowSimple) event.getWindow();
int buttonIndex = form.getResponse().getClickedButtonId();

List<Map> servers = plugin.getServers();
if (servers == null || buttonIndex >= servers.size()) {
return; // Should not happen
}

Map serverData = servers.get(buttonIndex);
String address = String.valueOf(serverData.get("address"));
int port = ((Number) serverData.get("port")).intValue();

if (plugin.getTeleportingPlayers().containsKey(playerUUID)) {
player.sendMessage("You are already being transferred to a server.");
return;
}

plugin.getPlayerLocations().put(playerUUID, player.getLocation());
plugin.getTeleportingPlayers().put(playerUUID, player);
CountdownTask task = new CountdownTask(plugin, player, address, port);
plugin.getServer().getScheduler().scheduleRepeatingTask(plugin, task, 20);
plugin.getCountdowns().put(playerUUID, task);
}
}
}

private static class CountdownTask extends PluginTask<Main> {

private final Player player;
private final String address;
private final int port;
private int countdown = 3;

public CountdownTask(Main owner, Player player, String address, int port) {
super(owner);
this.player = player;
this.address = address;
this.port = port;
}

@Override
public void onRun(int currentTick) {
if (!player.isOnline() || !this.getOwner().getTeleportingPlayers().containsKey(player.getUniqueId())) {
this.cancel();
this.getOwner().getTeleportingPlayers().remove(player.getUniqueId());
this.getOwner().getCountdowns().remove(player.getUniqueId());
this.getOwner().getPlayerLocations().remove(player.getUniqueId());
return;
}

if (countdown > 0) {
player.sendTitle("§eTeleporting in " + countdown + "...", "", 0, 25, 5);
countdown--;
} else {
player.sendTitle("§aTransferring...", "", 0, 20, 0);
TransferPacket pk = new TransferPacket();
pk.address = address;
pk.port = port;
player.dataPacket(pk);
this.getOwner().getTeleportingPlayers().remove(player.getUniqueId());
this.getOwner().getCountdowns().remove(player.getUniqueId());
this.getOwner().getPlayerLocations().remove(player.getUniqueId());
this.cancel();
}
}
}
}
43 changes: 43 additions & 0 deletions src/main/java/com/indra87g/listeners/PlayerMoveListener.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.indra87g.listeners;

import cn.nukkit.Player;
import cn.nukkit.event.EventHandler;
import cn.nukkit.event.Listener;
import cn.nukkit.event.player.PlayerMoveEvent;
import cn.nukkit.level.Location;
import cn.nukkit.scheduler.PluginTask;
import com.indra87g.Main;

import java.util.UUID;

public class PlayerMoveListener implements Listener {

private final Main plugin;

public PlayerMoveListener(Main plugin) {
this.plugin = plugin;
}

@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
Player player = event.getPlayer();
UUID playerUUID = player.getUniqueId();

if (plugin.getTeleportingPlayers().containsKey(playerUUID)) {
Location from = plugin.getPlayerLocations().get(playerUUID);
Location to = event.getTo();

if (from.getFloorX() != to.getFloorX() || from.getFloorZ() != to.getFloorZ()) {
plugin.getTeleportingPlayers().remove(playerUUID);
plugin.getPlayerLocations().remove(playerUUID);

PluginTask<?> task = plugin.getCountdowns().remove(playerUUID);
if (task != null) {
task.cancel();
}

player.sendTitle("§cTeleportation cancelled.", "You moved.", 0, 20, 5);
}
}
}
}
7 changes: 7 additions & 0 deletions src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,14 @@ commands:
description: "Sets a block at a specific location"
usage: "/setblock <x> <y> <z> <block_id>"
permission: waffle.setblock
servers:
description: "Shows a list of servers"
usage: "/servers"
permission: waffle.servers
permissions:
waffle.setblock:
description: "Allows the user to use the /setblock command"
default: op
waffle.servers:
description: "Allows the user to use the /servers command"
default: true
10 changes: 10 additions & 0 deletions src/main/resources/servers.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
servers:
- name: "Lobby"
address: "lobby.example.com"
port: 19132
- name: "Survival"
address: "survival.example.com"
port: 19133
- name: "Creative"
address: "creative.example.com"
port: 19134