Search in sources :

Example 6 with LanternWorld

use of org.lanternpowered.server.world.LanternWorld in project LanternServer by LanternPowered.

the class LanternPlayer method setPositionAndWorld.

@Override
public boolean setPositionAndWorld(World world, Vector3d position) {
    final LanternWorld oldWorld = this.getWorld();
    final boolean success = super.setPositionAndWorld(world, position);
    if (success && world == oldWorld) {
        this.session.send(new MessagePlayOutPlayerPositionAndLook(position.getX(), position.getY(), position.getZ(), 0, 0, RELATIVE_ROTATION, 0));
    }
    return success;
}
Also used : LanternWorld(org.lanternpowered.server.world.LanternWorld) MessagePlayOutPlayerPositionAndLook(org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayOutPlayerPositionAndLook)

Example 7 with LanternWorld

use of org.lanternpowered.server.world.LanternWorld in project LanternServer by LanternPowered.

the class LanternPlayer method handleRespawn.

public void handleRespawn() {
    Transform<World> transform = getTransform();
    final LanternWorld world = (LanternWorld) transform.getExtent();
    if (isDead()) {
        // TODO: Get the proper spawn location
        final Transform<World> toTransform = new Transform<>(transform.getExtent(), new Vector3d(0, 100, 0));
        // Make the player less dead...
        setDead(false);
        // Reset player settings
        offer(Keys.HEALTH, get(Keys.MAX_HEALTH).get());
        offer(Keys.FOOD_LEVEL, get(LanternKeys.MAX_FOOD_LEVEL).get());
        offer(Keys.ABSORPTION, 0.0);
        offer(Keys.EXHAUSTION, DEFAULT_EXHAUSTION);
        offer(Keys.SATURATION, DEFAULT_SATURATION);
        offer(Keys.POTION_EFFECTS, new ArrayList<>());
        offer(LanternKeys.SCORE, 0);
        final CauseStack causeStack = CauseStack.current();
        try (CauseStack.Frame frame = causeStack.pushCauseFrame()) {
            frame.pushCause(this);
            frame.addContext(EventContextKeys.PLAYER, this);
            final RespawnPlayerEvent event = SpongeEventFactory.createRespawnPlayerEvent(causeStack.getCurrentCause(), transform, toTransform, this, this, false, true);
            Sponge.getEventManager().post(event);
            // Get the to transform, this can be overridden in the event
            transform = event.getToTransform();
        }
    }
    setWorld(world, (LanternWorld) transform.getExtent());
    setPosition(transform.getPosition());
}
Also used : CauseStack(org.lanternpowered.server.event.CauseStack) Vector3d(com.flowpowered.math.vector.Vector3d) LanternWorld(org.lanternpowered.server.world.LanternWorld) RespawnPlayerEvent(org.spongepowered.api.event.entity.living.humanoid.player.RespawnPlayerEvent) World(org.spongepowered.api.world.World) LanternWorld(org.lanternpowered.server.world.LanternWorld) Transform(org.spongepowered.api.entity.Transform)

Example 8 with LanternWorld

use of org.lanternpowered.server.world.LanternWorld in project LanternServer by LanternPowered.

the class LanternEntity method setLocationAndRotation.

@Override
public boolean setLocationAndRotation(Location<World> location, Vector3d rotation, EnumSet<RelativePositions> relativePositions) {
    checkNotNull(location, "location");
    checkNotNull(rotation, "rotation");
    checkNotNull(relativePositions, "relativePositions");
    final World world = location.getExtent();
    final Vector3d pos = location.getPosition();
    double x = pos.getX();
    double y = pos.getY();
    double z = pos.getZ();
    double pitch = rotation.getX();
    double yaw = rotation.getY();
    double roll = rotation.getZ();
    if (relativePositions.contains(RelativePositions.X)) {
        x += this.position.getX();
    }
    if (relativePositions.contains(RelativePositions.Y)) {
        y += this.position.getY();
    }
    if (relativePositions.contains(RelativePositions.Z)) {
        z += this.position.getZ();
    }
    if (relativePositions.contains(RelativePositions.PITCH)) {
        pitch += this.rotation.getX();
    }
    if (relativePositions.contains(RelativePositions.YAW)) {
        yaw += this.rotation.getY();
    }
    // TODO: No relative roll?
    setWorld((LanternWorld) world);
    setRawPosition(new Vector3d(x, y, z));
    setRawRotation(new Vector3d(pitch, yaw, roll));
    // TODO: Events
    return true;
}
Also used : Vector3d(com.flowpowered.math.vector.Vector3d) World(org.spongepowered.api.world.World) LanternWorld(org.lanternpowered.server.world.LanternWorld)

Example 9 with LanternWorld

use of org.lanternpowered.server.world.LanternWorld in project LanternServer by LanternPowered.

the class NetworkSession method initPlayer.

/**
 * Initializes the {@link LanternPlayer} instance
 * and spawns it in a world if permitted to join
 * the server.
 */
public void initPlayer() {
    initKeepAliveTask();
    if (this.gameProfile == null) {
        throw new IllegalStateException("The game profile must first be available!");
    }
    this.player = new LanternPlayer(this.gameProfile, this);
    this.player.setNetworkId(EntityProtocolManager.acquireEntityId());
    this.player.setEntityProtocolType(EntityProtocolTypes.PLAYER);
    LanternWorld world = this.player.getWorld();
    if (world == null) {
        LanternWorldProperties worldProperties = this.player.getUserWorld();
        boolean fixSpawnLocation = false;
        if (worldProperties == null) {
            Lantern.getLogger().warn("The player [{}] attempted to login in a non-existent world, this is not possible " + "so we have moved them to the default's world spawn point.", this.gameProfile.getName().get());
            worldProperties = (LanternWorldProperties) Lantern.getServer().getDefaultWorld().get();
            fixSpawnLocation = true;
        } else if (!worldProperties.isEnabled()) {
            Lantern.getLogger().warn("The player [{}] attempted to login in a unloaded and not-enabled world [{}], this is not possible " + "so we have moved them to the default's world spawn point.", this.gameProfile.getName().get(), worldProperties.getWorldName());
            worldProperties = (LanternWorldProperties) Lantern.getServer().getDefaultWorld().get();
            fixSpawnLocation = true;
        }
        final Optional<World> optWorld = Lantern.getWorldManager().loadWorld(worldProperties);
        // Use the raw method to avoid triggering any network messages
        this.player.setRawWorld((LanternWorld) optWorld.get());
        this.player.setUserWorld(null);
        if (fixSpawnLocation) {
            // TODO: Use a proper spawn position
            this.player.setRawPosition(new Vector3d(0, 100, 0));
            this.player.setRawRotation(new Vector3d(0, 0, 0));
        }
    }
    // The kick reason
    Text kickReason = null;
    final BanService banService = Sponge.getServiceManager().provideUnchecked(BanService.class);
    // Check whether the player is banned and kick if necessary
    Ban ban = banService.getBanFor(this.gameProfile).orElse(null);
    if (ban == null) {
        final SocketAddress address = getChannel().remoteAddress();
        if (address instanceof InetSocketAddress) {
            ban = banService.getBanFor(((InetSocketAddress) address).getAddress()).orElse(null);
        }
    }
    if (ban != null) {
        final Optional<Instant> optExpirationDate = ban.getExpirationDate();
        final Optional<Text> optReason = ban.getReason();
        // Generate the kick message
        Text.Builder builder = Text.builder();
        if (ban instanceof Ban.Profile) {
            builder.append(t("multiplayer.disconnect.ban.banned"));
        } else {
            builder.append(t("multiplayer.disconnect.ban.ip_banned"));
        }
        // There is optionally a reason
        optReason.ifPresent(reason -> builder.append(Text.NEW_LINE).append(t("multiplayer.disconnect.ban.reason", reason)));
        // And a expiration date if present
        optExpirationDate.ifPresent(expirationDate -> {
            final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(tr("multiplayer.disconnect.ban.expiration_date_format").get());
            builder.append(Text.NEW_LINE).append(t("multiplayer.disconnect.ban.expiration", formatter.format(expirationDate)));
        });
        kickReason = builder.build();
    // Check for white-list
    } else if (!isWhitelisted(this.gameProfile)) {
        kickReason = t("multiplayer.disconnect.not_whitelisted");
    // Check whether the server is full
    } else if (Lantern.getServer().getOnlinePlayers().size() >= Lantern.getServer().getMaxPlayers() && !canBypassPlayerLimit(this.gameProfile)) {
        kickReason = t("multiplayer.disconnect.server_full");
    }
    final MessageEvent.MessageFormatter messageFormatter = new MessageEvent.MessageFormatter(kickReason != null ? kickReason : t("multiplayer.disconnect.not_allowed_to_join"));
    final Cause cause = Cause.builder().append(this).build(EventContext.builder().add(EventContextKeys.PLAYER, this.player).build());
    final Transform<World> fromTransform = this.player.getTransform();
    final ClientConnectionEvent.Login loginEvent = SpongeEventFactory.createClientConnectionEventLogin(cause, fromTransform, fromTransform, this, messageFormatter, this.gameProfile, this.player, false);
    if (kickReason != null) {
        loginEvent.setCancelled(true);
    }
    Sponge.getEventManager().post(loginEvent);
    if (loginEvent.isCancelled()) {
        disconnect(loginEvent.isMessageCancelled() ? t("multiplayer.disconnect.generic") : loginEvent.getMessage());
        return;
    }
    Lantern.getLogger().debug("The player {} successfully to joined from {}.", this.gameProfile.getName().get(), this.channel.remoteAddress());
    // Update the first join and last played data
    final Instant lastJoined = Instant.now();
    this.player.offer(Keys.LAST_DATE_PLAYED, lastJoined);
    if (!this.player.get(Keys.FIRST_DATE_PLAYED).isPresent()) {
        this.player.offer(Keys.FIRST_DATE_PLAYED, lastJoined);
    }
    final Transform<World> toTransform = loginEvent.getToTransform();
    world = (LanternWorld) toTransform.getExtent();
    final WorldConfig config = world.getProperties().getConfig();
    // Update the game mode if necessary
    if (config.isGameModeForced() || this.player.get(Keys.GAME_MODE).get().equals(GameModes.NOT_SET)) {
        this.player.offer(Keys.GAME_MODE, config.getGameMode());
    }
    // Reset the raw world
    this.player.setRawWorld(null);
    // Set the transform, this will trigger the initial
    // network messages to be send
    this.player.setTransform(toTransform);
    final MessageChannel messageChannel = this.player.getMessageChannel();
    final Text joinMessage;
    final GameProfile previousProfile = this.channel.attr(PREVIOUS_GAME_PROFILE).getAndSet(null);
    if (previousProfile != null && previousProfile.getName().isPresent() && !previousProfile.getName().get().equals(this.gameProfile.getName().get())) {
        joinMessage = t("multiplayer.player.joined.renamed", this.player.getName(), previousProfile.getName().get());
    } else {
        joinMessage = t("multiplayer.player.joined", this.player.getName());
    }
    final ClientConnectionEvent.Join joinEvent = SpongeEventFactory.createClientConnectionEventJoin(cause, messageChannel, Optional.of(messageChannel), new MessageEvent.MessageFormatter(joinMessage), this.player, false);
    Sponge.getEventManager().post(joinEvent);
    if (!joinEvent.isMessageCancelled()) {
        joinEvent.getChannel().ifPresent(channel -> channel.send(this.player, joinEvent.getMessage()));
    }
    this.server.getDefaultResourcePack().ifPresent(this.player::sendResourcePack);
    this.player.resetIdleTimeoutCounter();
}
Also used : InetSocketAddress(java.net.InetSocketAddress) MessageEvent(org.spongepowered.api.event.message.MessageEvent) WorldConfig(org.lanternpowered.server.config.world.WorldConfig) LanternWorld(org.lanternpowered.server.world.LanternWorld) World(org.spongepowered.api.world.World) LanternWorld(org.lanternpowered.server.world.LanternWorld) GameProfile(org.spongepowered.api.profile.GameProfile) LanternGameProfile(org.lanternpowered.server.profile.LanternGameProfile) Cause(org.spongepowered.api.event.cause.Cause) BanService(org.spongepowered.api.service.ban.BanService) SocketAddress(java.net.SocketAddress) InetSocketAddress(java.net.InetSocketAddress) LanternWorldProperties(org.lanternpowered.server.world.LanternWorldProperties) Instant(java.time.Instant) ClientConnectionEvent(org.spongepowered.api.event.network.ClientConnectionEvent) Text(org.spongepowered.api.text.Text) Ban(org.spongepowered.api.util.ban.Ban) MessageChannel(org.spongepowered.api.text.channel.MessageChannel) Vector3d(com.flowpowered.math.vector.Vector3d) GameProfile(org.spongepowered.api.profile.GameProfile) LanternGameProfile(org.lanternpowered.server.profile.LanternGameProfile) DateTimeFormatter(java.time.format.DateTimeFormatter) LanternPlayer(org.lanternpowered.server.entity.living.player.LanternPlayer)

Example 10 with LanternWorld

use of org.lanternpowered.server.world.LanternWorld in project LanternServer by LanternPowered.

the class LanternChunkTicketManager method getAvailableTickets.

@Override
public int getAvailableTickets(UUID player) {
    checkNotNull(player, "player");
    int count = 0;
    for (World world : Sponge.getServer().getWorlds()) {
        count += ((LanternWorld) world).getChunkManager().getTicketsForPlayer(player);
    }
    return this.getMaxTicketsForPlayer(player) - count;
}
Also used : LanternWorld(org.lanternpowered.server.world.LanternWorld) World(org.spongepowered.api.world.World) LanternWorld(org.lanternpowered.server.world.LanternWorld)

Aggregations

LanternWorld (org.lanternpowered.server.world.LanternWorld)20 World (org.spongepowered.api.world.World)7 Vector3d (com.flowpowered.math.vector.Vector3d)6 MessagePlayOutPlayerPositionAndLook (org.lanternpowered.server.network.vanilla.message.type.play.MessagePlayOutPlayerPositionAndLook)3 Text (org.spongepowered.api.text.Text)3 ArrayList (java.util.ArrayList)2 LanternPlayer (org.lanternpowered.server.entity.living.player.LanternPlayer)2 CauseStack (org.lanternpowered.server.event.CauseStack)2 LanternWorldProperties (org.lanternpowered.server.world.LanternWorldProperties)2 Vector2i (com.flowpowered.math.vector.Vector2i)1 Vector3f (com.flowpowered.math.vector.Vector3f)1 IntArrayList (it.unimi.dsi.fastutil.ints.IntArrayList)1 InetSocketAddress (java.net.InetSocketAddress)1 SocketAddress (java.net.SocketAddress)1 Instant (java.time.Instant)1 DateTimeFormatter (java.time.format.DateTimeFormatter)1 Arrays (java.util.Arrays)1 Collections (java.util.Collections)1 HashSet (java.util.HashSet)1 List (java.util.List)1