feat: player respawn support for 1.19

This commit is contained in:
ineanto 2023-05-17 13:23:21 +02:00
parent ac9af73fb6
commit 3ad3da9179
3 changed files with 39 additions and 44 deletions

30
pom.xml
View file

@ -39,12 +39,12 @@
</repositories> </repositories>
<dependencies> <dependencies>
<dependency> <!-- ProtocolLib -->
<groupId>com.comphenix.protocol</groupId> <dependency>
<artifactId>ProtocolLib</artifactId> <groupId>com.comphenix.protocol</groupId>
<version>5.0.0-SNAPSHOT</version> <artifactId>ProtocolLib</artifactId>
</dependency> <version>5.0.0-SNAPSHOT</version>
<!-- And so on --> </dependency>
<!-- PlaceHolder API --> <!-- PlaceHolder API -->
<dependency> <dependency>
<groupId>me.clip</groupId> <groupId>me.clip</groupId>
@ -52,13 +52,6 @@
<version>2.11.2</version> <version>2.11.2</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- Spigot API -->
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.19.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!-- Inventory Lib --> <!-- Inventory Lib -->
<dependency> <dependency>
<groupId>xyz.xenondevs.invui</groupId> <groupId>xyz.xenondevs.invui</groupId>
@ -97,15 +90,22 @@
<artifactId>yamlconfig</artifactId> <artifactId>yamlconfig</artifactId>
<version>1.1.2</version> <version>1.1.2</version>
</dependency> </dependency>
<!-- Jackson Core -->
<dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId> <groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId> <artifactId>jackson-core</artifactId>
<version>2.13.3</version> <version>2.14.2</version>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.19.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId> <groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId> <artifactId>jackson-dataformat-yaml</artifactId>
<version>2.13.3</version> <version>2.14.2</version>
</dependency> </dependency>
<!-- Redis --> <!-- Redis -->
<dependency> <dependency>

View file

@ -102,12 +102,14 @@ public class AppearanceManager {
final WrappedGameProfile gameProfile = WrappedGameProfile.fromPlayer(player).withName(displayName); final WrappedGameProfile gameProfile = WrappedGameProfile.fromPlayer(player).withName(displayName);
final ActionResult<Void> result = updateGameProfileSkin(gameProfile, skinChange); final ActionResult<Void> result = updateGameProfileSkin(gameProfile, skinChange);
if (!result.isError()) { if (!result.isError()) {
updateMetadata();
updateTabList(gameProfile, displayName); updateTabList(gameProfile, displayName);
respawnPlayer(); respawnPlayer();
} }
return new ActionResult<>(); return new ActionResult<>();
} }
private ActionResult<Void> updateGameProfileSkin(WrappedGameProfile gameProfile, boolean skinChange) { private ActionResult<Void> updateGameProfileSkin(WrappedGameProfile gameProfile, boolean skinChange) {
final boolean changeOnlyName = profile.getSkin() != null && !profile.getSkin().equalsIgnoreCase(player.getName()); final boolean changeOnlyName = profile.getSkin() != null && !profile.getSkin().equalsIgnoreCase(player.getName());
@ -135,6 +137,11 @@ public class AppearanceManager {
return new ActionResult<>(); return new ActionResult<>();
} }
private void updateMetadata() {
final WrappedDataWatcher entityWatcher = WrappedDataWatcher.getEntityWatcher(player);
entityWatcher.setObject(17, (byte) 0x7f, true);
}
private void respawnPlayer() { private void respawnPlayer() {
final World world = player.getWorld(); final World world = player.getWorld();
final WrapperPlayServerRespawn respawn = new WrapperPlayServerRespawn(); final WrapperPlayServerRespawn respawn = new WrapperPlayServerRespawn();
@ -145,7 +152,7 @@ public class AppearanceManager {
respawn.setDifficulty(world.getDifficulty()); respawn.setDifficulty(world.getDifficulty());
respawn.setCopyMetadata(false); respawn.setCopyMetadata(false);
respawn.getHandle().getBooleans().write(0, false); // is debug respawn.getHandle().getBooleans().write(0, false); // is debug
respawn.getHandle().getBooleans().write(1, false); // is flat respawn.getHandle().getBooleans().write(0, false); // is flat
respawn.sendPacket(player); respawn.sendPacket(player);
} }
@ -155,17 +162,22 @@ public class AppearanceManager {
final WrapperPlayerServerPlayerInfo update = new WrapperPlayerServerPlayerInfo(); final WrapperPlayerServerPlayerInfo update = new WrapperPlayerServerPlayerInfo();
update.setActions(EnumSet.of(EnumWrappers.PlayerInfoAction.ADD_PLAYER, update.setActions(EnumSet.of(EnumWrappers.PlayerInfoAction.ADD_PLAYER,
EnumWrappers.PlayerInfoAction.INITIALIZE_CHAT,
EnumWrappers.PlayerInfoAction.UPDATE_LISTED, EnumWrappers.PlayerInfoAction.UPDATE_LISTED,
EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME, EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME,
EnumWrappers.PlayerInfoAction.UPDATE_GAME_MODE, EnumWrappers.PlayerInfoAction.UPDATE_GAME_MODE,
EnumWrappers.PlayerInfoAction.UPDATE_LATENCY)); EnumWrappers.PlayerInfoAction.UPDATE_LATENCY));
update.setData(ImmutableList.of(new PlayerInfoData( update.setData(ImmutableList.of(new PlayerInfoData(
gameProfile, player.getUniqueId(),
player.getPing(), player.getPing(),
true,
EnumWrappers.NativeGameMode.fromBukkit(player.getGameMode()), EnumWrappers.NativeGameMode.fromBukkit(player.getGameMode()),
WrappedChatComponent.fromText(displayName) gameProfile,
WrappedChatComponent.fromText(displayName),
new WrappedRemoteChatSessionData(UUID.randomUUID(),
WrappedProfilePublicKey.ofPlayer(player).getKeyData())
))); )));
remove.sendPacket(player); remove.sendPacket(player);
update.sendPacket(player); update.sendPacket(player);
} }
} }

View file

@ -1,20 +1,18 @@
package net.artelnatif.nicko.wrapper; package net.artelnatif.nicko.wrapper;
import com.comphenix.protocol.PacketType; import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.InternalStructure;
import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.utility.MinecraftReflection; import com.comphenix.protocol.utility.MinecraftReflection;
import com.comphenix.protocol.utility.MinecraftVersion; import com.comphenix.protocol.utility.MinecraftVersion;
import com.comphenix.protocol.wrappers.BlockPosition;
import com.comphenix.protocol.wrappers.BukkitConverters; import com.comphenix.protocol.wrappers.BukkitConverters;
import com.comphenix.protocol.wrappers.EnumWrappers; import com.comphenix.protocol.wrappers.EnumWrappers;
import com.comphenix.protocol.wrappers.MinecraftKey;
import com.google.common.hash.Hashing; import com.google.common.hash.Hashing;
import org.bukkit.Difficulty; import org.bukkit.Difficulty;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import java.util.Optional;
/** /**
* Up-to-date version of the Wrapper class * Up-to-date version of the Wrapper class
* for the PacketPlayServerRespawn. * for the PacketPlayServerRespawn.
@ -50,7 +48,12 @@ public class WrapperPlayServerRespawn extends AbstractPacket {
public void setDimension(World value) { public void setDimension(World value) {
if (MinecraftVersion.WILD_UPDATE.atOrAbove()) { if (MinecraftVersion.WILD_UPDATE.atOrAbove()) {
// 1.19 and above // 1.19 to 1.19.4
// Thank you lukalt!
final InternalStructure dimensionType = handle.getStructures().read(0);
dimensionType.getMinecraftKeys().write(0, new MinecraftKey("minecraft", "dimension_type"));
dimensionType.getMinecraftKeys().write(1, new MinecraftKey("minecraft", "overworld"));
handle.getStructures().write(0, dimensionType);
handle.getWorldKeys().write(0, value); handle.getWorldKeys().write(0, value);
} else if (MinecraftVersion.CAVES_CLIFFS_2.atOrAbove()) { } else if (MinecraftVersion.CAVES_CLIFFS_2.atOrAbove()) {
// 1.18 // 1.18
@ -100,26 +103,6 @@ public class WrapperPlayServerRespawn extends AbstractPacket {
handle.getBytes().write(0, ((byte) (value ? 0x01 : 0x00))); handle.getBytes().write(0, ((byte) (value ? 0x01 : 0x00)));
} }
//.............
// Last death location Field
// Added in 1.19.
//.............
public Optional<BlockPosition> getLastDeathLocation() {
if (MinecraftVersion.WILD_UPDATE.atOrAbove()) {
return handle.getOptionals(BlockPosition.getConverter()).read(0);
}
return Optional.empty();
}
public void setLastDeathLocation(Location value) {
if (MinecraftVersion.WILD_UPDATE.atOrAbove()) {
final BlockPosition locationToBlockPosition = BlockPosition.getConverter().getSpecific(value);
final Optional<BlockPosition> blockPosition = Optional.ofNullable(locationToBlockPosition);
handle.getOptionals(BlockPosition.getConverter()).write(0, blockPosition);
}
}
//............. //.............
// Seed Field // Seed Field
// Added in 1.15. // Added in 1.15.