diff --git a/pom.xml b/pom.xml
index bd395f3..e379901 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,7 @@
com.loohp
Limbo
Limbo
- 0.6.13-ALPHA
+ 0.6.14-ALPHA
Standalone Limbo Minecraft Server.
https://github.com/LOOHP/Limbo
diff --git a/src/main/java/com/loohp/limbo/events/player/PlayerJoinEvent.java b/src/main/java/com/loohp/limbo/events/player/PlayerJoinEvent.java
index 997d6e1..4a79839 100644
--- a/src/main/java/com/loohp/limbo/events/player/PlayerJoinEvent.java
+++ b/src/main/java/com/loohp/limbo/events/player/PlayerJoinEvent.java
@@ -19,23 +19,12 @@
package com.loohp.limbo.events.player;
-import com.loohp.limbo.location.Location;
import com.loohp.limbo.player.Player;
public class PlayerJoinEvent extends PlayerEvent {
- private Location spawnLocation;
-
- public PlayerJoinEvent(Player player, Location spawnLoc) {
+ public PlayerJoinEvent(Player player) {
super(player);
- spawnLocation = spawnLoc;
}
- public Location getSpawnLocation() {
- return spawnLocation;
- }
-
- public void setSpawnLocation(Location spawnLocation) {
- this.spawnLocation = spawnLocation;
- }
}
diff --git a/src/main/java/com/loohp/limbo/events/player/PlayerSpawnEvent.java b/src/main/java/com/loohp/limbo/events/player/PlayerSpawnEvent.java
new file mode 100644
index 0000000..5a4ed10
--- /dev/null
+++ b/src/main/java/com/loohp/limbo/events/player/PlayerSpawnEvent.java
@@ -0,0 +1,41 @@
+/*
+ * This file is part of Limbo.
+ *
+ * Copyright (C) 2022. LoohpJames
+ * Copyright (C) 2022. Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.loohp.limbo.events.player;
+
+import com.loohp.limbo.location.Location;
+import com.loohp.limbo.player.Player;
+
+public class PlayerSpawnEvent extends PlayerEvent {
+
+ private Location spawnLocation;
+
+ public PlayerSpawnEvent(Player player, Location spawnLoc) {
+ super(player);
+ spawnLocation = spawnLoc;
+ }
+
+ public Location getSpawnLocation() {
+ return spawnLocation;
+ }
+
+ public void setSpawnLocation(Location spawnLocation) {
+ this.spawnLocation = spawnLocation;
+ }
+}
diff --git a/src/main/java/com/loohp/limbo/events/player/PluginMessageEvent.java b/src/main/java/com/loohp/limbo/events/player/PluginMessageEvent.java
new file mode 100644
index 0000000..8e15a56
--- /dev/null
+++ b/src/main/java/com/loohp/limbo/events/player/PluginMessageEvent.java
@@ -0,0 +1,46 @@
+/*
+ * This file is part of Limbo.
+ *
+ * Copyright (C) 2022. LoohpJames
+ * Copyright (C) 2022. Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.loohp.limbo.events.player;
+
+import com.loohp.limbo.player.Player;
+import com.loohp.limbo.utils.NamespacedKey;
+
+import java.util.Arrays;
+
+public class PluginMessageEvent extends PlayerEvent {
+
+ private String channel;
+ private byte[] data;
+
+ public PluginMessageEvent(Player player, String channel, byte[] data) {
+ super(player);
+ this.channel = channel;
+ this.data = data;
+ }
+
+ public String getChannel() {
+ return channel;
+ }
+
+ public byte[] getData() {
+ return Arrays.copyOf(data, data.length);
+ }
+
+}
diff --git a/src/main/java/com/loohp/limbo/network/ClientConnection.java b/src/main/java/com/loohp/limbo/network/ClientConnection.java
index b1f3cb1..52934da 100644
--- a/src/main/java/com/loohp/limbo/network/ClientConnection.java
+++ b/src/main/java/com/loohp/limbo/network/ClientConnection.java
@@ -21,11 +21,13 @@ package com.loohp.limbo.network;
import com.loohp.limbo.Limbo;
import com.loohp.limbo.events.player.PlayerJoinEvent;
+import com.loohp.limbo.events.player.PlayerSpawnEvent;
import com.loohp.limbo.events.player.PlayerLoginEvent;
import com.loohp.limbo.events.player.PlayerMoveEvent;
import com.loohp.limbo.events.player.PlayerQuitEvent;
import com.loohp.limbo.events.player.PlayerResourcePackStatusEvent;
import com.loohp.limbo.events.player.PlayerSelectedSlotChangeEvent;
+import com.loohp.limbo.events.player.PluginMessageEvent;
import com.loohp.limbo.events.status.StatusPingEvent;
import com.loohp.limbo.file.ServerProperties;
import com.loohp.limbo.location.Location;
@@ -41,6 +43,7 @@ import com.loohp.limbo.network.protocol.packets.PacketOut;
import com.loohp.limbo.network.protocol.packets.PacketPlayInChat;
import com.loohp.limbo.network.protocol.packets.PacketPlayInHeldItemChange;
import com.loohp.limbo.network.protocol.packets.PacketPlayInKeepAlive;
+import com.loohp.limbo.network.protocol.packets.PacketPlayInPluginMessaging;
import com.loohp.limbo.network.protocol.packets.PacketPlayInPosition;
import com.loohp.limbo.network.protocol.packets.PacketPlayInPositionAndLook;
import com.loohp.limbo.network.protocol.packets.PacketPlayInResourcePackStatus;
@@ -119,7 +122,7 @@ import java.util.stream.Stream;
public class ClientConnection extends Thread {
private static final NamespacedKey DEFAULT_HANDLER_NAMESPACE = new NamespacedKey("default");
- private static final NamespacedKey BRAND_ANNOUNCE_CHANNEL = new NamespacedKey("brand");
+ private static final String BRAND_ANNOUNCE_CHANNEL = new NamespacedKey("brand").toString();
private final Random random = new Random();
private final Socket clientSocket;
@@ -192,6 +195,11 @@ public class ClientConnection extends Thread {
return ready;
}
+ public void sendPluginMessage(String channel, byte[] data) throws IOException {
+ PacketPlayOutPluginMessaging packet = new PacketPlayOutPluginMessaging(channel, data);
+ sendPacket(packet);
+ }
+
public synchronized void sendPacket(PacketOut packet) throws IOException {
if (channel.writePacket(packet)) {
setLastPacketTimestamp(System.currentTimeMillis());
@@ -459,8 +467,8 @@ public class ClientConnection extends Thread {
ServerProperties properties = Limbo.getInstance().getServerProperties();
Location worldSpawn = properties.getWorldSpawn();
- PlayerJoinEvent joinEvent = Limbo.getInstance().getEventsManager().callEvent(new PlayerJoinEvent(player, worldSpawn));
- worldSpawn = joinEvent.getSpawnLocation();
+ PlayerSpawnEvent spawnEvent = Limbo.getInstance().getEventsManager().callEvent(new PlayerSpawnEvent(player, worldSpawn));
+ worldSpawn = spawnEvent.getSpawnLocation();
World world = worldSpawn.getWorld();
PacketPlayOutLogin join = new PacketPlayOutLogin(player.getEntityId(), false, properties.getDefaultGamemode(), Limbo.getInstance().getWorlds(), Limbo.getInstance().getDimensionRegistry().getCodec(), world, 0, (byte) properties.getMaxPlayers(), 8, 8, properties.isReducedDebugInfo(), true, false, true);
@@ -469,8 +477,7 @@ public class ClientConnection extends Thread {
ByteArrayOutputStream brandOut = new ByteArrayOutputStream();
DataTypeIO.writeString(new DataOutputStream(brandOut), properties.getServerModName(), StandardCharsets.UTF_8);
- PacketPlayOutPluginMessaging brand = new PacketPlayOutPluginMessaging(BRAND_ANNOUNCE_CHANNEL, brandOut.toByteArray());
- sendPacket(brand);
+ sendPluginMessage(BRAND_ANNOUNCE_CHANNEL, brandOut.toByteArray());
SkinResponse skinresponce = (isVelocityModern || isBungeeGuard || isBungeecord) && forwardedSkin != null ? forwardedSkin : MojangAPIUtils.getSkinFromMojangServer(player.getName());
PlayerSkinProperty skin = skinresponce != null ? new PlayerSkinProperty(skinresponce.getSkin(), skinresponce.getSignature()) : null;
@@ -508,6 +515,8 @@ public class ClientConnection extends Thread {
PacketPlayOutEntityMetadata show = new PacketPlayOutEntityMetadata(player, false, Player.class.getDeclaredField("skinLayers"));
sendPacket(show);
+ Limbo.getInstance().getEventsManager().callEvent(new PlayerJoinEvent(player));
+
if (properties.isAllowFlight()) {
PacketPlayOutGameState state = new PacketPlayOutGameState(3, player.getGamemode().getId());
sendPacket(state);
@@ -643,6 +652,9 @@ public class ClientConnection extends Thread {
if (rpcheck.getLoadedValue().equals(EnumResourcePackStatus.DECLINED) && properties.getResourcePackRequired()) {
player.disconnect(new TranslatableComponent("multiplayer.requiredTexturePrompt.disconnect"));
}
+ } else if (packetIn instanceof PacketPlayInPluginMessaging) {
+ PacketPlayInPluginMessaging inPluginMessaging = (PacketPlayInPluginMessaging) packetIn;
+ Limbo.getInstance().getEventsManager().callEvent(new PluginMessageEvent(player, inPluginMessaging.getChannel(), inPluginMessaging.getData()));
}
} catch (Exception e) {
break;
diff --git a/src/main/java/com/loohp/limbo/network/protocol/packets/PacketPlayInPluginMessaging.java b/src/main/java/com/loohp/limbo/network/protocol/packets/PacketPlayInPluginMessaging.java
index c1b1569..6373a5c 100644
--- a/src/main/java/com/loohp/limbo/network/protocol/packets/PacketPlayInPluginMessaging.java
+++ b/src/main/java/com/loohp/limbo/network/protocol/packets/PacketPlayInPluginMessaging.java
@@ -19,32 +19,30 @@
package com.loohp.limbo.network.protocol.packets;
+import com.loohp.limbo.utils.DataTypeIO;
+
import java.io.DataInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
-import com.loohp.limbo.utils.DataTypeIO;
-import com.loohp.limbo.utils.NamespacedKey;
-
public class PacketPlayInPluginMessaging extends PacketIn {
- private NamespacedKey channel;
+ private String channel;
private byte[] data;
- public PacketPlayInPluginMessaging(NamespacedKey channel, byte[] data) {
+ public PacketPlayInPluginMessaging(String channel, byte[] data) {
this.channel = channel;
this.data = data;
}
public PacketPlayInPluginMessaging(DataInputStream in, int packetLength, int packetId) throws IOException {
- String rawChannel = DataTypeIO.readString(in, StandardCharsets.UTF_8);
- channel = new NamespacedKey(rawChannel);
- int dataLength = packetLength - DataTypeIO.getVarIntLength(packetId) - DataTypeIO.getStringLength(rawChannel, StandardCharsets.UTF_8);
+ String channel = DataTypeIO.readString(in, StandardCharsets.UTF_8);
+ int dataLength = packetLength - DataTypeIO.getVarIntLength(packetId) - DataTypeIO.getStringLength(channel, StandardCharsets.UTF_8);
data = new byte[dataLength];
in.readFully(data);
}
- public NamespacedKey getChannel() {
+ public String getChannel() {
return channel;
}
diff --git a/src/main/java/com/loohp/limbo/network/protocol/packets/PacketPlayOutPluginMessaging.java b/src/main/java/com/loohp/limbo/network/protocol/packets/PacketPlayOutPluginMessaging.java
index f94a182..ab9fa24 100644
--- a/src/main/java/com/loohp/limbo/network/protocol/packets/PacketPlayOutPluginMessaging.java
+++ b/src/main/java/com/loohp/limbo/network/protocol/packets/PacketPlayOutPluginMessaging.java
@@ -19,25 +19,24 @@
package com.loohp.limbo.network.protocol.packets;
+import com.loohp.limbo.utils.DataTypeIO;
+
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
-import com.loohp.limbo.utils.DataTypeIO;
-import com.loohp.limbo.utils.NamespacedKey;
-
public class PacketPlayOutPluginMessaging extends PacketOut {
- private NamespacedKey channel;
+ private String channel;
private byte[] data;
- public PacketPlayOutPluginMessaging(NamespacedKey channel, byte[] data) {
+ public PacketPlayOutPluginMessaging(String channel, byte[] data) {
this.channel = channel;
this.data = data;
}
- public NamespacedKey getChannel() {
+ public String getChannel() {
return channel;
}
@@ -51,7 +50,7 @@ public class PacketPlayOutPluginMessaging extends PacketOut {
DataOutputStream output = new DataOutputStream(buffer);
output.writeByte(Packet.getPlayOut().get(getClass()));
- DataTypeIO.writeString(output, channel.toString(), StandardCharsets.UTF_8);
+ DataTypeIO.writeString(output, channel, StandardCharsets.UTF_8);
output.write(data);
return buffer.toByteArray();
diff --git a/src/main/java/com/loohp/limbo/player/Player.java b/src/main/java/com/loohp/limbo/player/Player.java
index 9f87864..d82aadb 100644
--- a/src/main/java/com/loohp/limbo/player/Player.java
+++ b/src/main/java/com/loohp/limbo/player/Player.java
@@ -48,6 +48,7 @@ import com.loohp.limbo.network.protocol.packets.PacketPlayOutRespawn;
import com.loohp.limbo.utils.BungeecordAdventureConversionUtils;
import com.loohp.limbo.utils.GameMode;
+import com.loohp.limbo.utils.NamespacedKey;
import net.kyori.adventure.audience.MessageType;
import net.kyori.adventure.bossbar.BossBar;
import net.kyori.adventure.identity.Identity;
@@ -232,6 +233,15 @@ public class Player extends LivingEntity implements CommandSender {
protected void setLocation(Location location) {
super.teleport(location);
}
+
+ public void sendPluginMessage(NamespacedKey channel, byte[] data) throws IOException {
+ sendPluginMessage(channel.toString(), data);
+ }
+
+ @Deprecated
+ public void sendPluginMessage(String channel, byte[] data) throws IOException {
+ clientConnection.sendPluginMessage(channel, data);
+ }
public void sendMessage(String message, UUID uuid) {
sendMessage(Identity.identity(uuid), LegacyComponentSerializer.legacySection().deserialize(message));
diff --git a/src/main/java/com/loohp/limbo/utils/BungeeLoginMessageUtils.java b/src/main/java/com/loohp/limbo/utils/BungeeLoginMessageUtils.java
index 49ba78f..e482bfe 100644
--- a/src/main/java/com/loohp/limbo/utils/BungeeLoginMessageUtils.java
+++ b/src/main/java/com/loohp/limbo/utils/BungeeLoginMessageUtils.java
@@ -32,11 +32,13 @@ import com.loohp.limbo.network.protocol.packets.PacketPlayOutPluginMessaging;
public class BungeeLoginMessageUtils {
+ public static final String BUNGEECORD_MAIN = new NamespacedKey("bungeecord", "main").toString();
+
public static void sendUUIDRequest(DataOutputStream output) throws IOException {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("UUID");
- PacketPlayOutPluginMessaging packet = new PacketPlayOutPluginMessaging(new NamespacedKey("bungeecord", "main"), out.toByteArray());
+ PacketPlayOutPluginMessaging packet = new PacketPlayOutPluginMessaging(BUNGEECORD_MAIN, out.toByteArray());
byte[] packetByte = packet.serializePacket();
DataTypeIO.writeVarInt(output, packetByte.length);
output.write(packetByte);
@@ -48,7 +50,7 @@ public class BungeeLoginMessageUtils {
if (subchannel.equals("UUID")) {
return UUID.fromString(in.readUTF());
} else {
- throw new RuntimeException("Bungeecord Message receieved is not an IP");
+ throw new RuntimeException("Bungeecord Message received is not an IP");
}
}
@@ -56,7 +58,7 @@ public class BungeeLoginMessageUtils {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("IP");
- PacketPlayOutPluginMessaging packet = new PacketPlayOutPluginMessaging(new NamespacedKey("bungeecord", "main"), out.toByteArray());
+ PacketPlayOutPluginMessaging packet = new PacketPlayOutPluginMessaging(BUNGEECORD_MAIN, out.toByteArray());
byte[] packetByte = packet.serializePacket();
DataTypeIO.writeVarInt(output, packetByte.length);
output.write(packetByte);
@@ -70,7 +72,7 @@ public class BungeeLoginMessageUtils {
in.readInt();
return InetAddress.getByName(ip);
} else {
- throw new RuntimeException("Bungeecord Message receieved is not an IP");
+ throw new RuntimeException("Bungeecord Message received is not an IP");
}
}