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;
}
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());
}
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;
}
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();
}
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;
}
Aggregations