Fixed invisible players for joining players by sending custom packets

This commit is contained in:
Elias Müller 2023-11-26 18:19:03 +01:00
parent 440d4f1b48
commit 8b47eb1139
8 changed files with 83 additions and 32 deletions

View File

@ -28,16 +28,23 @@ repositories {
}
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'
//https://jitpack.io/#Minestom/Minestom
implementation 'com.github.waxeria:Minestom:e0427a36f3'
// implementation 'com.github.Minestom:Minestom:c496ee357'
// implementation 'com.github.waxeria:Minestom:e0427a36f3'
// implementation 'dev.hollowcube:minestom-ce:5bcc72b911'
// implementation 'dev.hollowcube:minestom-ce:e146a9393e'
// implementation 'dev.hollowcube:minestom-ce-extensions:1.2.0'
implementation 'dev.hollowcube:minestom-ce:8715f4305d'
implementation 'dev.hollowcube:minestom-ce-extensions:1.2.0'
//Tools

View File

@ -64,7 +64,6 @@ public class Main {
if(globalConfig.node("velocity", "enabled").getBoolean()) {
VelocityProxy.enable(Objects.requireNonNull(globalConfig.node("velocity", "secret").getString()));
}
server.start("0.0.0.0", serverConfig.node("port").getInt(25565));

View File

@ -5,6 +5,7 @@ import eu.mhsl.minenet.minigames.message.Icon;
import eu.mhsl.minenet.minigames.message.type.ActionBarMessage;
import eu.mhsl.minenet.minigames.message.type.ChatMessage;
import eu.mhsl.minenet.minigames.message.type.TitleMessage;
import eu.mhsl.minenet.minigames.util.PacketUtil;
import net.minestom.server.entity.Player;
import java.util.ArrayList;
@ -35,6 +36,8 @@ public class DebugCommand extends PrivilegedCommand {
.appendTranslated("score#thanks")
.send(sender);
PacketUtil.resendPlayerList(((Player) sender));
new ChatMessage(Icon.SCIENCE).appendStatic(((Player) sender).getUuid().toString()).send(sender);
});

View File

@ -1,10 +1,7 @@
package eu.mhsl.minenet.minigames.handler.global;
import eu.mhsl.minenet.minigames.message.type.ActionBarMessage;
import eu.mhsl.minenet.minigames.message.type.ChatMessage;
import eu.mhsl.minenet.minigames.message.Icon;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import eu.mhsl.minenet.minigames.instance.Spawnable;
import eu.mhsl.minenet.minigames.util.PacketUtil;
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Player;
import net.minestom.server.event.EventListener;
@ -25,6 +22,12 @@ public class AddEntityToInstanceEventListener implements EventListener<AddEntity
if(event.getEntity() instanceof Player p) {
MinecraftServer.getSchedulerManager().scheduleNextTick(p::refreshCommands, ExecutionType.ASYNC);
if(event.getInstance() instanceof Spawnable instance) {
p.setRespawnPoint(instance.getSpawn());
}
PacketUtil.resendPlayerList(p);
p.addEffect(new Potion(PotionEffect.BLINDNESS, (byte) 1, 20)); //TODO Uncomment, currently buggy causes disconnect see https://github.com/Minestom/Minestom/discussions/1302
}

View File

@ -2,12 +2,12 @@ package eu.mhsl.minenet.minigames.handler.global;
import eu.mhsl.minenet.minigames.Main;
import eu.mhsl.minenet.minigames.api.QueuedPlayerRooms;
import eu.mhsl.minenet.minigames.instance.MineNetInstance;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.instance.transfer.Transfer;
import eu.mhsl.minenet.minigames.message.Icon;
import eu.mhsl.minenet.minigames.message.type.ChatMessage;
import eu.mhsl.minenet.minigames.skin.SkinCache;
import eu.mhsl.minenet.minigames.util.MoveInstance;
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Player;
import net.minestom.server.event.EventListener;
@ -32,23 +32,25 @@ public class PlayerLoginHandler implements EventListener<PlayerLoginEvent> {
public @NotNull Result run(@NotNull PlayerLoginEvent event) {
Player p = event.getPlayer();
UUID pushQueue = QueuedPlayerRooms.pullQueue(event.getPlayer().getUuid());
if(pushQueue != null) {
Room target = Room.getRoom(pushQueue).orElseThrow();
Transfer transferInstance = new Transfer();
p.setRespawnPoint(transferInstance.getSpawn());
event.setSpawningInstance(transferInstance);
MinecraftServer.getSchedulerManager().scheduleTask(
() -> Room.setRoom(p, target),
TaskSchedule.seconds(1),
TaskSchedule.stop()
);
} else {
p.setRespawnPoint(Hub.INSTANCE.getSpawn());
event.setSpawningInstance(Hub.INSTANCE);
}
Transfer transferInstance = new Transfer();
p.setRespawnPoint(transferInstance.getSpawn());
event.setSpawningInstance(transferInstance);
// SkinCache.applySkin(p);
UUID pushQueue = QueuedPlayerRooms.pullQueue(event.getPlayer().getUuid());
MinecraftServer.getSchedulerManager().scheduleTask(
() -> {
if(pushQueue != null) {
Room.setRoom(p, Room.getRoom(pushQueue).orElseThrow());
} else {
MoveInstance.move(p, Hub.INSTANCE);
}
},
TaskSchedule.seconds(5),
TaskSchedule.stop()
);
SkinCache.applySkin(p);
try {
if(Objects.requireNonNull(Main.globalConfig.node("admins").getList(String.class)).stream().anyMatch(s -> s.equalsIgnoreCase(p.getUsername()))) {

View File

@ -19,12 +19,9 @@ public class ByPlayerNameUuidProvider implements UuidProvider {
return UuidUtil.unTrimm(client);
} catch (NullPointerException e) {
Logger.getGlobal().info("Player " + username + " is an known by Mojang! (Using random UUID)");
Logger.getGlobal().info("Player " + username + " is unknown by Mojang! (Using random UUID)");
} catch (IllegalStateException e) {
Logger.getGlobal().info("Player with the username " + username + " is already online. (Using random UUID)");
Logger.getGlobal().info("Player with the username " + username + " is already online.");
playerConnection.disconnect();
}

View File

@ -15,7 +15,7 @@ public class MoveInstance {
playerList.forEach(player -> move(player, destination));
}
public static void move(Entity p, Spawnable destination) {
p.setInstance((Instance) destination, destination.getSpawn());
if(p.getInstance() != destination) p.setInstance((Instance) destination, destination.getSpawn());
}
public static void forceCloseInstance(InstanceContainer instance) {

View File

@ -0,0 +1,40 @@
package eu.mhsl.minenet.minigames.util;
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.GameMode;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.PlayerSkin;
import net.minestom.server.network.packet.server.play.PlayerInfoUpdatePacket;
import net.minestom.server.network.packet.server.play.SpawnPlayerPacket;
import java.util.List;
public class PacketUtil {
public static void resendPlayerList(Player p) {
MinecraftServer.getConnectionManager().getOnlinePlayers().forEach(player -> {
if(player.getUuid().equals(p.getUuid())) return;
final PlayerSkin skin = player.getSkin();
List<PlayerInfoUpdatePacket.Property> properties =
skin != null ? List.of(new PlayerInfoUpdatePacket.Property("textures", skin.textures(), skin.signature())) : List.of();
p.sendPacket(
new PlayerInfoUpdatePacket(PlayerInfoUpdatePacket.Action.ADD_PLAYER,
new PlayerInfoUpdatePacket.Entry(
player.getUuid(),
player.getUsername(),
properties,
true,
0,
GameMode.SURVIVAL,
null,
null
)
)
);
p.sendPacket(
new SpawnPlayerPacket(player.getEntityId(), player.getUuid(), player.getPosition())
);
});
}
}