use of org.spongepowered.common.accessor.server.level.ServerPlayerAccessor in project SpongeCommon by SpongePowered.
the class EntityUtil method performPostChangePlayerWorldLogic.
public static void performPostChangePlayerWorldLogic(final ServerPlayer player, final ServerLevel fromWorld, final ServerLevel originalToWorld, final ServerLevel toWorld, final boolean isPortal) {
// Sponge Start - Send any platform dimension data
((ServerPlayerBridge) player).bridge$sendDimensionData(player.connection.connection, toWorld.dimensionType(), toWorld.dimension());
// Sponge End
final LevelData worldinfo = toWorld.getLevelData();
// We send dimension change for portals before loading chunks
if (!isPortal) {
// Sponge Start - Allow the platform to handle how dimension changes are sent down
((ServerPlayerBridge) player).bridge$sendChangeDimension(toWorld.dimensionType(), toWorld.dimension(), BiomeManager.obfuscateSeed(toWorld.getSeed()), player.gameMode.getGameModeForPlayer(), player.gameMode.getPreviousGameModeForPlayer(), toWorld.isDebug(), toWorld.isFlat(), true);
}
// Sponge End
player.connection.send(new ClientboundChangeDifficultyPacket(worldinfo.getDifficulty(), worldinfo.isDifficultyLocked()));
final PlayerList playerlist = player.getServer().getPlayerList();
playerlist.sendPlayerPermissionLevel(player);
// Sponge Start - Have the platform handle removing the entity from the world. Move this to after the event call so
// that we do not remove the player from the world unless we really have teleported..
((PlatformServerLevelBridge) fromWorld).bridge$removeEntity(player, true);
((PlatformEntityBridge) player).bridge$revive();
// Sponge End
player.setLevel(toWorld);
toWorld.addDuringPortalTeleport(player);
if (isPortal) {
((ServerPlayerAccessor) player).invoker$triggerDimensionChangeTriggers(toWorld);
}
player.gameMode.setLevel(toWorld);
player.connection.send(new ClientboundPlayerAbilitiesPacket(player.abilities));
playerlist.sendLevelInfo(player, toWorld);
playerlist.sendAllPlayerInfo(player);
for (final MobEffectInstance effectinstance : player.getActiveEffects()) {
player.connection.send(new ClientboundUpdateMobEffectPacket(player.getId(), effectinstance));
}
if (isPortal) {
player.connection.send(new ClientboundLevelEventPacket(1032, BlockPos.ZERO, 0, false));
}
((ServerLevelBridge) fromWorld).bridge$getBossBarManager().onPlayerDisconnect(player);
((ServerLevelBridge) toWorld).bridge$getBossBarManager().onPlayerDisconnect(player);
((ServerPlayerAccessor) player).accessor$lastSentExp(-1);
((ServerPlayerAccessor) player).accessor$lastSentHealth(-1.0f);
((ServerPlayerAccessor) player).accessor$lastSentFood(-1);
if (!isPortal) {
player.connection.teleport(player.getX(), player.getY(), player.getZ(), player.yRot, player.xRot);
player.connection.resetPosition();
}
if (player.containerMenu != player.inventoryMenu) {
player.closeContainer();
}
// Sponge Start - Call event
Sponge.eventManager().post(SpongeEventFactory.createChangeEntityWorldEventPost(PhaseTracker.getCauseStackManager().currentCause(), (org.spongepowered.api.entity.Entity) player, (ServerWorld) fromWorld, (ServerWorld) originalToWorld, (ServerWorld) toWorld));
// Sponge End
}
use of org.spongepowered.common.accessor.server.level.ServerPlayerAccessor in project SpongeCommon by SpongePowered.
the class ServerPlayerData method register.
// @formatter:off
public static void register(final DataProviderRegistrator registrator) {
registrator.asMutable(ServerPlayer.class).create(Keys.GAME_MODE).get(h -> (GameMode) (Object) h.gameMode.getGameModeForPlayer()).set((h, v) -> h.setGameMode((GameType) (Object) v)).create(Keys.SKIN_PROFILE_PROPERTY).get(h -> {
final Collection<Property> properties = h.getGameProfile().getProperties().get(ProfileProperty.TEXTURES);
if (properties.isEmpty()) {
return null;
}
return new SpongeProfileProperty(properties.iterator().next());
}).create(Keys.SPECTATOR_TARGET).get(h -> (Entity) h.getCamera()).set((h, v) -> h.setCamera((net.minecraft.world.entity.Entity) v)).delete(h -> h.setCamera(null)).create(Keys.STATISTICS).get(h -> ((StatsCounterBridge) h.getStats()).bridge$getStatsData().entrySet().stream().collect(Collectors.toMap(e -> (Statistic) e.getKey(), e -> e.getValue().longValue()))).set((h, v) -> v.forEach((ik, iv) -> h.getStats().setValue(h, (Stat<?>) ik, iv.intValue()))).create(Keys.CHAT_VISIBILITY).get(h -> {
final ChatVisibility visibility = (ChatVisibility) (Object) h.getChatVisibility();
if (visibility == null) {
return ChatVisibilities.FULL.get();
}
return visibility;
}).asMutable(ServerPlayerAccessor.class).create(Keys.HAS_VIEWED_CREDITS).get(ServerPlayerAccessor::accessor$seenCredits).set(ServerPlayerAccessor::accessor$seenCredits).create(Keys.CHAT_COLORS_ENABLED).get(ServerPlayerAccessor::accessor$canChatColor).asMutable(ServerPlayerBridge.class).create(Keys.LOCALE).get(ServerPlayerBridge::bridge$getLanguage).create(Keys.HEALTH_SCALE).get(ServerPlayerEntityHealthScaleBridge::bridge$getHealthScale).setAnd((h, v) -> {
if (v < 1f || v > Float.MAX_VALUE) {
return false;
}
h.bridge$setHealthScale(v);
return true;
}).delete(b -> b.bridge$setHealthScale(null)).create(Keys.VIEW_DISTANCE).get(ServerPlayerBridge::bridge$getViewDistance).create(Keys.SKIN_PARTS).get(ServerPlayerBridge::bridge$getSkinParts).create(Keys.IS_SLEEPING_IGNORED).get(ServerPlayerBridge::bridge$sleepingIgnored).set(ServerPlayerBridge::bridge$setSleepingIgnored);
registrator.spongeDataStore(Keys.HEALTH_SCALE.key(), ServerPlayerEntityHealthScaleBridge.class, Keys.HEALTH_SCALE);
SpongeDataManager.INSTANCE.registerLegacySpongeData(Constants.Sponge.Entity.Player.HEALTH_SCALE, Keys.HEALTH_SCALE.key(), Keys.HEALTH_SCALE);
}
Aggregations