9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-28 19:39:11 +00:00

feat(client-mod): 修复一些兼容性问题

This commit is contained in:
jhqwqmc
2025-03-24 11:20:05 +08:00
parent 400cd53c18
commit 1963f19039
12 changed files with 158 additions and 12 deletions

View File

@@ -26,6 +26,7 @@ import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRegisterChannelEvent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -158,6 +159,15 @@ public class BukkitNetworkManager implements NetworkManager, Listener {
this.onlineUsers.remove(player.getUniqueId());
}
@EventHandler
public void onPlayerRegisterChannel(PlayerRegisterChannelEvent event) {
Player player = event.getPlayer();
NetWorkUser user = getUser(player);
if (user != null) {
user.setUsingClientMod(true);
}
}
@Override
public Collection<BukkitServerPlayer> onlineUsers() {
return onlineUsers.values();

View File

@@ -55,7 +55,8 @@ public class PacketConsumers {
BIOME_LIST = new IntIdentityList(RegistryUtils.currentBiomeRegistrySize());
}
public static int remap(int stateId) {
public static int remap(int stateId, NetWorkUser user) {
if (user.usingClientMod() && !BlockStateUtils.isVanillaBlock(stateId)) return stateId;
return mappings[stateId];
}
@@ -74,11 +75,11 @@ public class PacketConsumers {
PalettedContainer<Integer> container = mcSection.blockStateContainer();
Palette<Integer> palette = container.data().palette();
if (palette.canRemap()) {
palette.remap(PacketConsumers::remap);
palette.remap(stateId -> remap(stateId, user));
} else {
for (int j = 0; j < 4096; j ++) {
int state = container.get(j);
int newState = remap(state);
int newState = remap(state, user);
if (newState != state) {
container.set(j, newState);
}
@@ -105,7 +106,7 @@ public class PacketConsumers {
for (int i = 0; i < blocks; i++) {
long k = buf.readVarLong();
positions[i] = (short) ((int) (k & 4095L));
states[i] = remap((int) (k >>> 12));
states[i] = remap((int) (k >>> 12), user);
}
buf.clear();
buf.writeVarInt(event.packetID());
@@ -125,7 +126,7 @@ public class PacketConsumers {
FriendlyByteBuf buf = event.getBuffer();
BlockPos pos = buf.readBlockPos(buf);
int before = buf.readVarInt();
int state = remap(before);
int state = remap(before, user);
if (state == before) {
return;
}
@@ -147,7 +148,7 @@ public class PacketConsumers {
BlockPos blockPos = buf.readBlockPos(buf);
int state = buf.readInt();
boolean global = buf.readBoolean();
int newState = remap(state);
int newState = remap(state, user);
if (newState == state) {
return;
}
@@ -181,7 +182,7 @@ public class PacketConsumers {
if (!Reflections.clazz$BlockParticleOption.isInstance(option)) return;
Object blockState = Reflections.field$BlockParticleOption$blockState.get(option);
int id = BlockStateUtils.blockStateToId(blockState);
int remapped = remap(id);
int remapped = remap(id, user);
if (remapped == id) return;
Reflections.field$BlockParticleOption$blockState.set(option, BlockStateUtils.idToBlockState(remapped));
event.setChanged(true);
@@ -523,7 +524,7 @@ public class PacketConsumers {
// Falling blocks
if (entityType == Reflections.instance$EntityType$FALLING_BLOCK) {
int data = Reflections.field$ClientboundAddEntityPacket$data.getInt(packet);
int remapped = remap(data);
int remapped = remap(data, user);
if (remapped != data) {
Reflections.field$ClientboundAddEntityPacket$data.set(packet, remapped);
}

View File

@@ -63,6 +63,8 @@ public class BukkitServerPlayer extends Player {
private Key lastUsedRecipe = null;
private boolean usingClientMod = false;
private Map<Integer, List<Integer>> furnitureView = new ConcurrentHashMap<>();
public BukkitServerPlayer(BukkitCraftEngine plugin, Channel channel) {
@@ -616,4 +618,12 @@ public class BukkitServerPlayer extends Player {
public void setLastUsedRecipe(Key lastUsedRecipe) {
this.lastUsedRecipe = lastUsedRecipe;
}
public boolean usingClientMod() {
return this.usingClientMod;
}
public void setUsingClientMod(boolean usingClientMod) {
this.usingClientMod = usingClientMod;
}
}