feat: 适配 HamsterCore 更新
This commit is contained in:
@@ -43,11 +43,6 @@ public class BallBukkitListener implements Listener, BallListener {
|
|||||||
private BallBukkitListener() {
|
private BallBukkitListener() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onServiceDead() {
|
|
||||||
Bukkit.shutdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onMessageReceived(@NotNull BallMessageInfo info) {
|
public void onMessageReceived(@NotNull BallMessageInfo info) {
|
||||||
switch (info.getAction()) {
|
switch (info.getAction()) {
|
||||||
|
@@ -120,11 +120,6 @@ public final class BallBungeeCordListener implements Listener, BallListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onServiceDead() {
|
|
||||||
ProxyServer.getInstance().stop("HamsterBall 重连失败.");
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGH)
|
@EventHandler(priority = EventPriority.HIGH)
|
||||||
public void onPreLogin(PreLoginEvent event) {
|
public void onPreLogin(PreLoginEvent event) {
|
||||||
BallAPI.getInstance().sendBallMessage(
|
BallAPI.getInstance().sendBallMessage(
|
||||||
|
@@ -14,8 +14,8 @@ import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent;
|
|||||||
import cn.hamster3.mc.plugin.ball.common.listener.BallListener;
|
import cn.hamster3.mc.plugin.ball.common.listener.BallListener;
|
||||||
import cn.hamster3.mc.plugin.ball.common.listener.BallMessageListener;
|
import cn.hamster3.mc.plugin.ball.common.listener.BallMessageListener;
|
||||||
import cn.hamster3.mc.plugin.ball.common.listener.ListenerPriority;
|
import cn.hamster3.mc.plugin.ball.common.listener.ListenerPriority;
|
||||||
|
import cn.hamster3.mc.plugin.core.common.api.CoreAPI;
|
||||||
import cn.hamster3.mc.plugin.core.common.data.DisplayMessage;
|
import cn.hamster3.mc.plugin.core.common.data.DisplayMessage;
|
||||||
import cn.hamster3.mc.plugin.core.common.util.CoreUtils;
|
|
||||||
import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.Component;
|
import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.Component;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -277,7 +277,7 @@ public abstract class BallAPI {
|
|||||||
null,
|
null,
|
||||||
BallServerType.PROXY,
|
BallServerType.PROXY,
|
||||||
BroadcastPlayerMessageEvent.ACTION,
|
BroadcastPlayerMessageEvent.ACTION,
|
||||||
CoreUtils.GSON.toJsonTree(
|
CoreAPI.getInstance().getGson().toJsonTree(
|
||||||
new BroadcastPlayerMessageEvent(message)
|
new BroadcastPlayerMessageEvent(message)
|
||||||
)
|
)
|
||||||
));
|
));
|
||||||
@@ -297,7 +297,7 @@ public abstract class BallAPI {
|
|||||||
null,
|
null,
|
||||||
BallServerType.GAME,
|
BallServerType.GAME,
|
||||||
DispatchConsoleCommandEvent.ACTION,
|
DispatchConsoleCommandEvent.ACTION,
|
||||||
CoreUtils.GSON.toJsonTree(
|
CoreAPI.getInstance().getGson().toJsonTree(
|
||||||
new DispatchConsoleCommandEvent(type, serverID, command)
|
new DispatchConsoleCommandEvent(type, serverID, command)
|
||||||
)
|
)
|
||||||
));
|
));
|
||||||
@@ -317,7 +317,7 @@ public abstract class BallAPI {
|
|||||||
null,
|
null,
|
||||||
BallServerType.GAME,
|
BallServerType.GAME,
|
||||||
DispatchPlayerCommandEvent.ACTION,
|
DispatchPlayerCommandEvent.ACTION,
|
||||||
CoreUtils.GSON.toJsonTree(
|
CoreAPI.getInstance().getGson().toJsonTree(
|
||||||
new DispatchPlayerCommandEvent(type, uuid, command)
|
new DispatchPlayerCommandEvent(type, uuid, command)
|
||||||
)
|
)
|
||||||
));
|
));
|
||||||
@@ -346,7 +346,7 @@ public abstract class BallAPI {
|
|||||||
null,
|
null,
|
||||||
BallServerType.PROXY,
|
BallServerType.PROXY,
|
||||||
KickPlayerEvent.ACTION,
|
KickPlayerEvent.ACTION,
|
||||||
CoreUtils.GSON.toJsonTree(
|
CoreAPI.getInstance().getGson().toJsonTree(
|
||||||
new KickPlayerEvent(uuid, reason)
|
new KickPlayerEvent(uuid, reason)
|
||||||
)
|
)
|
||||||
));
|
));
|
||||||
@@ -384,7 +384,7 @@ public abstract class BallAPI {
|
|||||||
null,
|
null,
|
||||||
BallServerType.PROXY,
|
BallServerType.PROXY,
|
||||||
SendMessageToPlayerEvent.ACTION,
|
SendMessageToPlayerEvent.ACTION,
|
||||||
CoreUtils.GSON.toJsonTree(
|
CoreAPI.getInstance().getGson().toJsonTree(
|
||||||
new SendMessageToPlayerEvent(Collections.singleton(receiver), message)
|
new SendMessageToPlayerEvent(Collections.singleton(receiver), message)
|
||||||
)
|
)
|
||||||
));
|
));
|
||||||
@@ -423,7 +423,7 @@ public abstract class BallAPI {
|
|||||||
null,
|
null,
|
||||||
BallServerType.PROXY,
|
BallServerType.PROXY,
|
||||||
SendMessageToPlayerEvent.ACTION,
|
SendMessageToPlayerEvent.ACTION,
|
||||||
CoreUtils.GSON.toJsonTree(
|
CoreAPI.getInstance().getGson().toJsonTree(
|
||||||
new SendMessageToPlayerEvent(new HashSet<>(receivers), message)
|
new SendMessageToPlayerEvent(new HashSet<>(receivers), message)
|
||||||
)
|
)
|
||||||
));
|
));
|
||||||
@@ -540,7 +540,7 @@ public abstract class BallAPI {
|
|||||||
* @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出)
|
* @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出)
|
||||||
*/
|
*/
|
||||||
public void sendBallMessage(@NotNull BallMessageInfo messageInfo, boolean block) {
|
public void sendBallMessage(@NotNull BallMessageInfo messageInfo, boolean block) {
|
||||||
String string = CoreUtils.GSON.toJson(messageInfo);
|
String string = CoreAPI.getInstance().getGson().toJson(messageInfo);
|
||||||
RTopic topic = getRedissonClient().getTopic(BallAPI.BALL_CHANNEL, StringCodec.INSTANCE);
|
RTopic topic = getRedissonClient().getTopic(BallAPI.BALL_CHANNEL, StringCodec.INSTANCE);
|
||||||
if (block) {
|
if (block) {
|
||||||
topic.publish(string);
|
topic.publish(string);
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
package cn.hamster3.mc.plugin.ball.common.codec;
|
package cn.hamster3.mc.plugin.ball.common.codec;
|
||||||
|
|
||||||
import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo;
|
import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo;
|
||||||
import cn.hamster3.mc.plugin.core.common.util.CoreUtils;
|
import cn.hamster3.mc.plugin.core.common.api.CoreAPI;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.ByteBufAllocator;
|
import io.netty.buffer.ByteBufAllocator;
|
||||||
import io.netty.util.CharsetUtil;
|
import io.netty.util.CharsetUtil;
|
||||||
@@ -22,7 +22,7 @@ public class BallMessageInfoCodec extends BaseCodec implements JsonCodec<BallMes
|
|||||||
private final Decoder<Object> decoder = (buf, state) -> {
|
private final Decoder<Object> decoder = (buf, state) -> {
|
||||||
String str = buf.toString(CharsetUtil.UTF_8);
|
String str = buf.toString(CharsetUtil.UTF_8);
|
||||||
buf.readerIndex(buf.readableBytes());
|
buf.readerIndex(buf.readableBytes());
|
||||||
return CoreUtils.GSON.fromJson(str, BallMessageInfo.class);
|
return CoreAPI.getInstance().getGson().fromJson(str, BallMessageInfo.class);
|
||||||
};
|
};
|
||||||
|
|
||||||
private BallMessageInfoCodec() {
|
private BallMessageInfoCodec() {
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
package cn.hamster3.mc.plugin.ball.common.data;
|
package cn.hamster3.mc.plugin.ball.common.data;
|
||||||
|
|
||||||
import cn.hamster3.mc.plugin.core.common.util.CoreUtils;
|
import cn.hamster3.mc.plugin.core.common.api.CoreAPI;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -19,11 +19,11 @@ public class BallBlockPos {
|
|||||||
private int z;
|
private int z;
|
||||||
|
|
||||||
public static BallBlockPos fromJson(String json) {
|
public static BallBlockPos fromJson(String json) {
|
||||||
return CoreUtils.GSON.fromJson(json, BallBlockPos.class);
|
return CoreAPI.getInstance().getGson().fromJson(json, BallBlockPos.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public JsonElement toJson() {
|
public JsonElement toJson() {
|
||||||
return CoreUtils.GSON.toJsonTree(this);
|
return CoreAPI.getInstance().getGson().toJsonTree(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
package cn.hamster3.mc.plugin.ball.common.data;
|
package cn.hamster3.mc.plugin.ball.common.data;
|
||||||
|
|
||||||
import cn.hamster3.mc.plugin.core.common.util.CoreUtils;
|
import cn.hamster3.mc.plugin.core.common.api.CoreAPI;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -22,11 +22,11 @@ public class BallLocation {
|
|||||||
private float pitch;
|
private float pitch;
|
||||||
|
|
||||||
public static BallLocation fromJson(String json) {
|
public static BallLocation fromJson(String json) {
|
||||||
return CoreUtils.GSON.fromJson(json, BallLocation.class);
|
return CoreAPI.getInstance().getGson().fromJson(json, BallLocation.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public JsonElement toJson() {
|
public JsonElement toJson() {
|
||||||
return CoreUtils.GSON.toJsonTree(this);
|
return CoreAPI.getInstance().getGson().toJsonTree(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
@@ -2,7 +2,7 @@ package cn.hamster3.mc.plugin.ball.common.data;
|
|||||||
|
|
||||||
import cn.hamster3.mc.plugin.ball.common.api.BallAPI;
|
import cn.hamster3.mc.plugin.ball.common.api.BallAPI;
|
||||||
import cn.hamster3.mc.plugin.ball.common.entity.BallServerType;
|
import cn.hamster3.mc.plugin.ball.common.entity.BallServerType;
|
||||||
import cn.hamster3.mc.plugin.core.common.util.CoreUtils;
|
import cn.hamster3.mc.plugin.core.common.api.CoreAPI;
|
||||||
import com.google.gson.JsonArray;
|
import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
@@ -72,7 +72,7 @@ public class BallMessageInfo {
|
|||||||
this.channel = channel;
|
this.channel = channel;
|
||||||
senderID = BallAPI.getInstance().getLocalServerId();
|
senderID = BallAPI.getInstance().getLocalServerId();
|
||||||
this.action = action;
|
this.action = action;
|
||||||
this.content = CoreUtils.GSON.toJsonTree(content);
|
this.content = CoreAPI.getInstance().getGson().toJsonTree(content);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BallMessageInfo(@NotNull String channel, @NotNull String senderID, @Nullable String receiverID,
|
public BallMessageInfo(@NotNull String channel, @NotNull String senderID, @Nullable String receiverID,
|
||||||
@@ -114,7 +114,7 @@ public class BallMessageInfo {
|
|||||||
* @return Java 对象
|
* @return Java 对象
|
||||||
*/
|
*/
|
||||||
public <T> T getContentAs(@NotNull Class<T> clazz) {
|
public <T> T getContentAs(@NotNull Class<T> clazz) {
|
||||||
return CoreUtils.GSON.fromJson(content, clazz);
|
return CoreAPI.getInstance().getGson().fromJson(content, clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -5,7 +5,7 @@ import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo;
|
|||||||
import cn.hamster3.mc.plugin.ball.common.event.player.*;
|
import cn.hamster3.mc.plugin.ball.common.event.player.*;
|
||||||
import cn.hamster3.mc.plugin.ball.common.event.server.ServerOfflineEvent;
|
import cn.hamster3.mc.plugin.ball.common.event.server.ServerOfflineEvent;
|
||||||
import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent;
|
import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent;
|
||||||
import cn.hamster3.mc.plugin.core.common.util.CoreUtils;
|
import cn.hamster3.mc.plugin.core.common.api.CoreAPI;
|
||||||
import org.redisson.api.listener.MessageListener;
|
import org.redisson.api.listener.MessageListener;
|
||||||
|
|
||||||
public class BallMessageListener implements MessageListener<BallMessageInfo> {
|
public class BallMessageListener implements MessageListener<BallMessageInfo> {
|
||||||
@@ -28,7 +28,7 @@ public class BallMessageListener implements MessageListener<BallMessageInfo> {
|
|||||||
}
|
}
|
||||||
switch (info.getAction()) {
|
switch (info.getAction()) {
|
||||||
case BallPlayerPreLoginEvent.ACTION: {
|
case BallPlayerPreLoginEvent.ACTION: {
|
||||||
BallPlayerPreLoginEvent event = CoreUtils.GSON.fromJson(info.getContent(), BallPlayerPreLoginEvent.class);
|
BallPlayerPreLoginEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPreLoginEvent.class);
|
||||||
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
||||||
try {
|
try {
|
||||||
listener.onBallPlayerPreLogin(event);
|
listener.onBallPlayerPreLogin(event);
|
||||||
@@ -39,7 +39,7 @@ public class BallMessageListener implements MessageListener<BallMessageInfo> {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BallPlayerLoginEvent.ACTION: {
|
case BallPlayerLoginEvent.ACTION: {
|
||||||
BallPlayerLoginEvent event = CoreUtils.GSON.fromJson(info.getContent(), BallPlayerLoginEvent.class);
|
BallPlayerLoginEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerLoginEvent.class);
|
||||||
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
||||||
try {
|
try {
|
||||||
listener.onBallPlayerLogin(event);
|
listener.onBallPlayerLogin(event);
|
||||||
@@ -50,7 +50,7 @@ public class BallMessageListener implements MessageListener<BallMessageInfo> {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BallPlayerPostLoginEvent.ACTION: {
|
case BallPlayerPostLoginEvent.ACTION: {
|
||||||
BallPlayerPostLoginEvent event = CoreUtils.GSON.fromJson(info.getContent(), BallPlayerPostLoginEvent.class);
|
BallPlayerPostLoginEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPostLoginEvent.class);
|
||||||
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
||||||
try {
|
try {
|
||||||
listener.onBallPlayerPostLogin(event);
|
listener.onBallPlayerPostLogin(event);
|
||||||
@@ -61,7 +61,7 @@ public class BallMessageListener implements MessageListener<BallMessageInfo> {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BallPlayerPreConnectServerEvent.ACTION: {
|
case BallPlayerPreConnectServerEvent.ACTION: {
|
||||||
BallPlayerPreConnectServerEvent event = CoreUtils.GSON.fromJson(info.getContent(), BallPlayerPreConnectServerEvent.class);
|
BallPlayerPreConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPreConnectServerEvent.class);
|
||||||
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
||||||
try {
|
try {
|
||||||
listener.onBallPlayerPreConnectServer(event);
|
listener.onBallPlayerPreConnectServer(event);
|
||||||
@@ -72,7 +72,7 @@ public class BallMessageListener implements MessageListener<BallMessageInfo> {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BallPlayerConnectServerEvent.ACTION: {
|
case BallPlayerConnectServerEvent.ACTION: {
|
||||||
BallPlayerConnectServerEvent event = CoreUtils.GSON.fromJson(info.getContent(), BallPlayerConnectServerEvent.class);
|
BallPlayerConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerConnectServerEvent.class);
|
||||||
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
||||||
try {
|
try {
|
||||||
listener.onBallPlayerConnectServer(event);
|
listener.onBallPlayerConnectServer(event);
|
||||||
@@ -83,7 +83,7 @@ public class BallMessageListener implements MessageListener<BallMessageInfo> {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BallPlayerPostConnectServerEvent.ACTION: {
|
case BallPlayerPostConnectServerEvent.ACTION: {
|
||||||
BallPlayerPostConnectServerEvent event = CoreUtils.GSON.fromJson(info.getContent(), BallPlayerPostConnectServerEvent.class);
|
BallPlayerPostConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerPostConnectServerEvent.class);
|
||||||
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
||||||
try {
|
try {
|
||||||
listener.onBallPlayerPostConnectServer(event);
|
listener.onBallPlayerPostConnectServer(event);
|
||||||
@@ -94,7 +94,7 @@ public class BallMessageListener implements MessageListener<BallMessageInfo> {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BallPlayerLogoutEvent.ACTION: {
|
case BallPlayerLogoutEvent.ACTION: {
|
||||||
BallPlayerLogoutEvent event = CoreUtils.GSON.fromJson(info.getContent(), BallPlayerLogoutEvent.class);
|
BallPlayerLogoutEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerLogoutEvent.class);
|
||||||
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
||||||
try {
|
try {
|
||||||
listener.onBallPlayerLogout(event);
|
listener.onBallPlayerLogout(event);
|
||||||
@@ -105,7 +105,7 @@ public class BallMessageListener implements MessageListener<BallMessageInfo> {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BallPlayerInfoUpdateEvent.ACTION: {
|
case BallPlayerInfoUpdateEvent.ACTION: {
|
||||||
BallPlayerInfoUpdateEvent event = CoreUtils.GSON.fromJson(info.getContent(), BallPlayerInfoUpdateEvent.class);
|
BallPlayerInfoUpdateEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), BallPlayerInfoUpdateEvent.class);
|
||||||
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
||||||
try {
|
try {
|
||||||
listener.onBallPlayerInfoUpdate(event);
|
listener.onBallPlayerInfoUpdate(event);
|
||||||
@@ -116,7 +116,7 @@ public class BallMessageListener implements MessageListener<BallMessageInfo> {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ServerOfflineEvent.ACTION: {
|
case ServerOfflineEvent.ACTION: {
|
||||||
ServerOfflineEvent event = CoreUtils.GSON.fromJson(info.getContent(), ServerOfflineEvent.class);
|
ServerOfflineEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), ServerOfflineEvent.class);
|
||||||
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
||||||
try {
|
try {
|
||||||
listener.onServerOffline(event);
|
listener.onServerOffline(event);
|
||||||
@@ -127,7 +127,7 @@ public class BallMessageListener implements MessageListener<BallMessageInfo> {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ServerOnlineEvent.ACTION: {
|
case ServerOnlineEvent.ACTION: {
|
||||||
ServerOnlineEvent event = CoreUtils.GSON.fromJson(info.getContent(), ServerOnlineEvent.class);
|
ServerOnlineEvent event = CoreAPI.getInstance().getGson().fromJson(info.getContent(), ServerOnlineEvent.class);
|
||||||
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
for (BallListener listener : BallAPI.getInstance().getListeners()) {
|
||||||
try {
|
try {
|
||||||
listener.onServerOnline(event);
|
listener.onServerOnline(event);
|
||||||
|
Reference in New Issue
Block a user