use of net.minecraft.network.protocol.game.ServerboundClientInformationPacket in project SpongeCommon by SpongePowered.
the class ServerPlayerMixin method impl$handleClientSettings.
@SuppressWarnings({ "ConstantConditions", "UnstableApiUsage" })
@Inject(method = "updateOptions", at = @At("HEAD"))
private void impl$handleClientSettings(final ServerboundClientInformationPacket packet, final CallbackInfo ci) {
if (!ShouldFire.PLAYER_CHANGE_CLIENT_SETTINGS_EVENT) {
return;
}
final ServerboundClientInformationPacketAccessor $packet = (ServerboundClientInformationPacketAccessor) packet;
final Locale newLocale = LocaleCache.getLocale($packet.accessor$language());
final ImmutableSet<SkinPart> skinParts = Sponge.game().registry(RegistryTypes.SKIN_PART).stream().map(part -> (SpongeSkinPart) part).filter(part -> part.test(packet.getModelCustomisation())).collect(ImmutableSet.toImmutableSet());
final int viewDistance = $packet.accessor$viewDistance();
// Post before the player values are updated
try (final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame()) {
final ChatVisibility visibility = (ChatVisibility) (Object) packet.getChatVisibility();
final PlayerChangeClientSettingsEvent event = SpongeEventFactory.createPlayerChangeClientSettingsEvent(frame.currentCause(), visibility, skinParts, newLocale, (ServerPlayer) this, packet.getChatColors(), viewDistance);
SpongeCommon.post(event);
}
}
use of net.minecraft.network.protocol.game.ServerboundClientInformationPacket in project SpongeCommon by SpongePowered.
the class PacketPhaseUtil method onProcessPacket.
@SuppressWarnings({ "rawtypes", "unchecked", "deprecation" })
public static void onProcessPacket(final Packet packetIn, final PacketListener netHandler) {
if (netHandler instanceof ServerGamePacketListenerImpl) {
net.minecraft.server.level.ServerPlayer packetPlayer = ((ServerGamePacketListenerImpl) netHandler).player;
// Only process the CustomPayload & Respawn packets from players if they are dead.
if (!packetPlayer.isAlive() && (!(packetIn instanceof ServerboundCustomPayloadPacket) && (!(packetIn instanceof ServerboundClientCommandPacket) || ((ServerboundClientCommandPacket) packetIn).getAction() != ServerboundClientCommandPacket.Action.PERFORM_RESPAWN))) {
return;
}
try (final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame()) {
frame.pushCause(packetPlayer);
// Don't process movement capture logic if player hasn't moved
boolean ignoreMovementCapture;
if (packetIn instanceof ServerboundMovePlayerPacket) {
final ServerboundMovePlayerPacket movingPacket = ((ServerboundMovePlayerPacket) packetIn);
if (movingPacket instanceof ServerboundMovePlayerPacket.Rot) {
ignoreMovementCapture = true;
} else if (packetPlayer.getX() == ((ServerboundMovePlayerPacketAccessor) movingPacket).accessor$x() && packetPlayer.getY() == ((ServerboundMovePlayerPacketAccessor) movingPacket).accessor$y() && packetPlayer.getZ() == ((ServerboundMovePlayerPacketAccessor) movingPacket).accessor$z()) {
ignoreMovementCapture = true;
} else {
ignoreMovementCapture = false;
}
// we cannot ignore movement capture
if (ignoreMovementCapture) {
// Basically, we need to sanity check the nearby blocks because if they have
// any positional logic, we need to run captures
final AABB boundingBox = packetPlayer.getBoundingBox();
final BlockPos min = new BlockPos(boundingBox.minX + 0.001D, boundingBox.minY + 0.001D, boundingBox.minZ + 0.001D);
final BlockPos max = new BlockPos(boundingBox.maxX - 0.001D, boundingBox.maxY - 0.001D, boundingBox.maxZ - 0.001D);
final BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos();
if (packetPlayer.level.hasChunksAt(min, max)) {
for (int x = min.getX(); x <= max.getX(); ++x) {
for (int y = min.getY(); y <= max.getY(); ++y) {
for (int z = min.getZ(); z <= max.getZ(); ++z) {
pos.set(x, y, z);
final Block block = packetPlayer.level.getBlockState(pos).getBlock();
if (((TrackableBlockBridge) block).bridge$hasEntityInsideLogic()) {
ignoreMovementCapture = false;
}
}
}
}
}
}
} else {
ignoreMovementCapture = false;
}
if (ignoreMovementCapture || (packetIn instanceof ServerboundClientInformationPacket)) {
packetIn.handle(netHandler);
} else {
final IPhaseState<? extends PacketContext<?>> packetState = PacketPhase.getInstance().getStateForPacket(packetIn);
// At the very least make an unknown packet state case.
final PacketContext<?> context = packetState.createPhaseContext(PhaseTracker.SERVER);
context.source(packetPlayer).packetPlayer(packetPlayer).packet(packetIn);
if (!PacketPhase.getInstance().isPacketInvalid(packetIn, packetPlayer, packetState)) {
PacketPhase.getInstance().populateContext(packetIn, packetPlayer, packetState, context);
context.creator(((ServerPlayer) packetPlayer).uniqueId());
context.notifier(((ServerPlayer) packetPlayer).uniqueId());
}
try (final PhaseContext<?> packetContext = context) {
packetContext.buildAndSwitch();
packetIn.handle(netHandler);
}
}
}
} else {
// client
packetIn.handle(netHandler);
}
}
Aggregations