diff --git a/README.md b/README.md index c0a3dff..719bb27 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,5 @@ BlockServer [![Build Status](https://travis-ci.org/BlockServerProject/BlockServer.svg?branch=master)](https://travis-ci.org/BlockServerProject/BlockServer) =========== +BlockServer is an open source platform for Minecraft server software. It is very extensible and open source. This repository contains the core which is needed to run and load the extra modules which allow players to connect to the server. + +The BlockServer Project develops modules to support both PC and PE connections. Currently PC is lower priority as our goal is to support PE first. diff --git a/src/main/java/org/blockserver/core/event/MessageEventListener.java b/src/main/java/org/blockserver/core/event/MessageEventListener.java index b585dfe..478ac36 100644 --- a/src/main/java/org/blockserver/core/event/MessageEventListener.java +++ b/src/main/java/org/blockserver/core/event/MessageEventListener.java @@ -18,7 +18,7 @@ import org.blockserver.core.Server; import org.blockserver.core.events.MessageHandleEvent; -import org.blockserver.core.message.Message; +import org.blockserver.core.modules.message.Message; /** * Written by Exerosis! diff --git a/src/main/java/org/blockserver/core/event/ServerEventListener.java b/src/main/java/org/blockserver/core/event/ServerEventListener.java new file mode 100644 index 0000000..fd6f7f9 --- /dev/null +++ b/src/main/java/org/blockserver/core/event/ServerEventListener.java @@ -0,0 +1,38 @@ +/* + * This file is part of BlockServer. + * + * BlockServer is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * BlockServer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with BlockServer. If not, see . + */ +package org.blockserver.core.event; + +import org.blockserver.core.Server; + +/** + * Written by Exerosis! + */ +public class ServerEventListener extends EventListener { + public void register(Class listenerType, Server server) { + register(listenerType, server.getEventManager()); + } + + public ServerEventListener post() { + super.post(); + return this; + } + + public ServerEventListener priority(Priority priority) { + super.priority(priority); + return this; + } +} \ No newline at end of file diff --git a/src/main/java/org/blockserver/core/events/MessageHandleEvent.java b/src/main/java/org/blockserver/core/events/MessageHandleEvent.java index 28ea16c..fea482e 100644 --- a/src/main/java/org/blockserver/core/events/MessageHandleEvent.java +++ b/src/main/java/org/blockserver/core/events/MessageHandleEvent.java @@ -19,7 +19,7 @@ import lombok.Getter; import lombok.Setter; import org.blockserver.core.event.CancellableImplementation; -import org.blockserver.core.message.Message; +import org.blockserver.core.modules.message.Message; /** * Written by Exerosis! diff --git a/src/main/java/org/blockserver/core/exceptions/BlockServerException.java b/src/main/java/org/blockserver/core/exceptions/BlockServerException.java index 16da0da..3eb49aa 100644 --- a/src/main/java/org/blockserver/core/exceptions/BlockServerException.java +++ b/src/main/java/org/blockserver/core/exceptions/BlockServerException.java @@ -1,3 +1,19 @@ +/* + * This file is part of BlockServer. + * + * BlockServer is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * BlockServer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with BlockServer. If not, see . + */ package org.blockserver.core.exceptions; import org.blockserver.core.exceptions.node.ExceptionBuilder; diff --git a/src/main/java/org/blockserver/core/exceptions/node/ExceptionBuilder.java b/src/main/java/org/blockserver/core/exceptions/node/ExceptionBuilder.java index d94d1ba..8a6797f 100644 --- a/src/main/java/org/blockserver/core/exceptions/node/ExceptionBuilder.java +++ b/src/main/java/org/blockserver/core/exceptions/node/ExceptionBuilder.java @@ -1,3 +1,19 @@ +/* + * This file is part of BlockServer. + * + * BlockServer is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * BlockServer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with BlockServer. If not, see . + */ package org.blockserver.core.exceptions.node; public class ExceptionBuilder { diff --git a/src/main/java/org/blockserver/core/exceptions/node/ExceptionNode.java b/src/main/java/org/blockserver/core/exceptions/node/ExceptionNode.java index 323497c..ae0a924 100644 --- a/src/main/java/org/blockserver/core/exceptions/node/ExceptionNode.java +++ b/src/main/java/org/blockserver/core/exceptions/node/ExceptionNode.java @@ -1,3 +1,19 @@ +/* + * This file is part of BlockServer. + * + * BlockServer is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * BlockServer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with BlockServer. If not, see . + */ package org.blockserver.core.exceptions.node; public class ExceptionNode { diff --git a/src/main/java/org/blockserver/core/message/MessageModule.java b/src/main/java/org/blockserver/core/message/MessageModule.java deleted file mode 100644 index ea73908..0000000 --- a/src/main/java/org/blockserver/core/message/MessageModule.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This file is part of BlockServer. - * - * BlockServer is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BlockServer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BlockServer. If not, see . - */ -package org.blockserver.core.message; - -import org.blockserver.core.Server; -import org.blockserver.core.events.MessageHandleEvent; -import org.blockserver.core.events.RawPacketHandleEvent; -import org.blockserver.core.modules.network.NetworkConverter; -import org.blockserver.core.modules.network.NetworkModule; -import org.blockserver.core.modules.network.NetworkProvider; -import org.blockserver.core.modules.scheduler.SchedulerModule; - -/** - * Written by Exerosis! - */ -public class MessageModule extends NetworkModule { - private final NetworkConverter networkConverter; - - public MessageModule(Server server, SchedulerModule schedulerModule, NetworkConverter networkConverter) { - super(server, schedulerModule); - this.networkConverter = networkConverter; - task = () -> { - for (NetworkProvider provider : getProviders()) { - provider.receiveInboundPackets().forEach(packet -> { - getServer().getEventManager().fire(new RawPacketHandleEvent(packet), event -> { - if (!event.isCancelled()) - getServer().getEventManager().fire(new MessageHandleEvent<>(networkConverter.toMessage(event.getPacket()))); - }); - }); - } - }; - } - - - public void sendMessage(Message message) { - for (NetworkProvider provider : getProviders()) { - provider.queueOutboundPackets(networkConverter.toPacket(message)); - } - } -} diff --git a/src/main/java/org/blockserver/core/module/Enableable.java b/src/main/java/org/blockserver/core/module/Enableable.java index 0f0df91..e36ae74 100644 --- a/src/main/java/org/blockserver/core/module/Enableable.java +++ b/src/main/java/org/blockserver/core/module/Enableable.java @@ -18,6 +18,8 @@ /** * Written by Exerosis! + * + * @author BlockServer Team */ public interface Enableable { void onEnable(); diff --git a/src/main/java/org/blockserver/core/module/EnableableImplementation.java b/src/main/java/org/blockserver/core/module/EnableableImplementation.java index 1d5c9e8..ada3d8a 100644 --- a/src/main/java/org/blockserver/core/module/EnableableImplementation.java +++ b/src/main/java/org/blockserver/core/module/EnableableImplementation.java @@ -19,6 +19,10 @@ import java.util.Map; import java.util.WeakHashMap; +/** + * @author BlockServer Team + * @see org.blockserver.core.module.Enableable + */ public interface EnableableImplementation extends Enableable { Map instances = new WeakHashMap<>(); diff --git a/src/main/java/org/blockserver/core/module/Module.java b/src/main/java/org/blockserver/core/module/Module.java index ec6a7e0..15d0f6a 100644 --- a/src/main/java/org/blockserver/core/module/Module.java +++ b/src/main/java/org/blockserver/core/module/Module.java @@ -20,9 +20,11 @@ import org.blockserver.core.Server; /** - * Base class for all modules. + * Base class for all modules. New modules should implement this class. * * @author BlockServer Team + * @see org.blockserver.core.modules + * @see org.blockserver.core.module.EnableableImplementation */ public class Module implements EnableableImplementation { @Getter private final Server server; diff --git a/src/main/java/org/blockserver/core/module/ModuleLoader.java b/src/main/java/org/blockserver/core/module/ModuleLoader.java index 9abd781..d9fad96 100644 --- a/src/main/java/org/blockserver/core/module/ModuleLoader.java +++ b/src/main/java/org/blockserver/core/module/ModuleLoader.java @@ -20,6 +20,10 @@ import java.util.Collection; +/** + * @author BlockServer Team + * @see org.blockserver.core.module.loaders + */ public interface ModuleLoader { Collection setModules(Collection currentModules, Server server); } \ No newline at end of file diff --git a/src/main/java/org/blockserver/core/module/loaders/CoreModuleLoader.java b/src/main/java/org/blockserver/core/module/loaders/CoreModuleLoader.java index 3e3a8c2..b7ff540 100644 --- a/src/main/java/org/blockserver/core/module/loaders/CoreModuleLoader.java +++ b/src/main/java/org/blockserver/core/module/loaders/CoreModuleLoader.java @@ -26,6 +26,10 @@ import java.util.Collection; +/** + * @author BlockServer Team + * @see org.blockserver.core.module.ModuleLoader + */ public class CoreModuleLoader implements ModuleLoader { @Override diff --git a/src/main/java/org/blockserver/core/module/loaders/JarModuleLoader.java b/src/main/java/org/blockserver/core/module/loaders/JarModuleLoader.java index e884ea7..7ae140f 100644 --- a/src/main/java/org/blockserver/core/module/loaders/JarModuleLoader.java +++ b/src/main/java/org/blockserver/core/module/loaders/JarModuleLoader.java @@ -33,6 +33,9 @@ /** * Module Loader that can load modules from JARs + * + * @author BlockServer Team + * @see org.blockserver.core.module.ModuleLoader */ public class JarModuleLoader implements ModuleLoader { @Override diff --git a/src/main/java/org/blockserver/core/modules/entity/Entity.java b/src/main/java/org/blockserver/core/modules/entity/Entity.java new file mode 100644 index 0000000..78eadd0 --- /dev/null +++ b/src/main/java/org/blockserver/core/modules/entity/Entity.java @@ -0,0 +1,44 @@ +/* + * This file is part of BlockServer. + * + * BlockServer is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * BlockServer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with BlockServer. If not, see . + */ +package org.blockserver.core.modules.entity; + +import org.blockserver.core.modules.world.positions.Location; + +/** + * Written by Exerosis! + * + * @author BlockServer Team + */ +public class Entity { + private float x; + private float y; + private float z; + + public Entity(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + } + + public Entity(Location location) { + this(location.getX(), location.getY(), location.getZ()); + } + + public Location getLocation() { + return new Location(x, y, z); + } +} diff --git a/src/main/java/org/blockserver/core/modules/logging/LoggingModule.java b/src/main/java/org/blockserver/core/modules/logging/LoggingModule.java index 7f771f9..cfe58be 100644 --- a/src/main/java/org/blockserver/core/modules/logging/LoggingModule.java +++ b/src/main/java/org/blockserver/core/modules/logging/LoggingModule.java @@ -20,9 +20,11 @@ import org.blockserver.core.module.Module; /** + * Logging Module with different log levels. (debug, info, warn, error) * TODO: Implement SLF4j and/or log4j2 * * @author BlockServer Team + * @see org.blockserver.core.module.Module */ public class LoggingModule extends Module { diff --git a/src/main/java/org/blockserver/core/message/Message.java b/src/main/java/org/blockserver/core/modules/message/Message.java similarity index 81% rename from src/main/java/org/blockserver/core/message/Message.java rename to src/main/java/org/blockserver/core/modules/message/Message.java index 5e5809b..4a86642 100644 --- a/src/main/java/org/blockserver/core/message/Message.java +++ b/src/main/java/org/blockserver/core/modules/message/Message.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with BlockServer. If not, see . */ -package org.blockserver.core.message; +package org.blockserver.core.modules.message; import lombok.Getter; import lombok.Setter; @@ -24,9 +24,16 @@ * Written by Exerosis! */ public class Message { + @Getter final private boolean async; @Getter @Setter private Player player; public Message(Player player) { this.player = player; + async = false; + } + + public Message(Player player, boolean async) { + this.player = player; + this.async = async; } } \ No newline at end of file diff --git a/src/main/java/org/blockserver/core/modules/message/PlayerLoginMessage.java b/src/main/java/org/blockserver/core/modules/message/PlayerLoginMessage.java new file mode 100644 index 0000000..8b22a52 --- /dev/null +++ b/src/main/java/org/blockserver/core/modules/message/PlayerLoginMessage.java @@ -0,0 +1,36 @@ +/* + * This file is part of BlockServer. + * + * BlockServer is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * BlockServer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with BlockServer. If not, see . + */ +package org.blockserver.core.modules.message; + +import org.blockserver.core.modules.player.Player; +import org.blockserver.core.utilities.Skin; + +import java.util.UUID; + +/** + * Written by Exerosis! + */ +public class PlayerLoginMessage extends Message { + public long clientID; + public String username; + public UUID uuid; + public Skin skin; + + public PlayerLoginMessage(Player player) { + super(player); + } +} \ No newline at end of file diff --git a/src/main/java/org/blockserver/core/message/block/MessageOutBlockChange.java b/src/main/java/org/blockserver/core/modules/message/block/MessageOutBlockChange.java similarity index 90% rename from src/main/java/org/blockserver/core/message/block/MessageOutBlockChange.java rename to src/main/java/org/blockserver/core/modules/message/block/MessageOutBlockChange.java index e01e23e..4bf64d3 100644 --- a/src/main/java/org/blockserver/core/message/block/MessageOutBlockChange.java +++ b/src/main/java/org/blockserver/core/modules/message/block/MessageOutBlockChange.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU Lesser General Public License * along with BlockServer. If not, see . */ -package org.blockserver.core.message.block; +package org.blockserver.core.modules.message.block; -import org.blockserver.core.message.Message; +import org.blockserver.core.modules.message.Message; import org.blockserver.core.modules.player.Player; import org.blockserver.core.modules.world.Block; diff --git a/src/main/java/org/blockserver/core/modules/network/NetworkConverter.java b/src/main/java/org/blockserver/core/modules/network/NetworkConverter.java index 8ba580c..786b0a7 100644 --- a/src/main/java/org/blockserver/core/modules/network/NetworkConverter.java +++ b/src/main/java/org/blockserver/core/modules/network/NetworkConverter.java @@ -1,29 +1,30 @@ -/* - * This file is part of BlockServer. - * - * BlockServer is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BlockServer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BlockServer. If not, see . - */ package org.blockserver.core.modules.network; - -import org.blockserver.core.message.Message; +import org.blockserver.core.modules.message.Message; /** - * Written by Exerosis! + * A NetworkConverter converts {@linkplain RawPacket}s to {@linkplain Message}s and + * in reverse. + * + * @author BlockServer Team + * @see RawPacket + * @see Message */ public interface NetworkConverter { - RawPacket toPacket(Message message); - Message toMessage(RawPacket packet); -} \ No newline at end of file + /** + * Converts a {@linkplain Message} to a {@linkplain RawPacket} + * + * @param packet The {@linkplain RawPacket} to be converted. + * @return The converted {@linkplain Message}, if converted, null if not. + */ + Message convertPacket(RawPacket packet); + + /** + * Converts a {@linkplain RawPacket} to a {@linkplain Message} + * + * @param message The {@linkplain Message} to be converted. + * @return The converted {@linkplain RawPacket}, if converted, null if not. + */ + RawPacket convertMessage(Message message); +} diff --git a/src/main/java/org/blockserver/core/modules/network/NetworkModule.java b/src/main/java/org/blockserver/core/modules/network/NetworkModule.java index 6a8b1d9..c19f9d7 100644 --- a/src/main/java/org/blockserver/core/modules/network/NetworkModule.java +++ b/src/main/java/org/blockserver/core/modules/network/NetworkModule.java @@ -16,57 +16,72 @@ */ package org.blockserver.core.modules.network; -import lombok.Getter; import org.blockserver.core.Server; import org.blockserver.core.events.RawPacketHandleEvent; import org.blockserver.core.module.Module; +import org.blockserver.core.modules.message.Message; +import org.blockserver.core.modules.player.Player; +import org.blockserver.core.modules.player.PlayerModule; import org.blockserver.core.modules.scheduler.SchedulerModule; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** - * Written by Exerosis! + * The NetworkModule manages the various {@linkplain NetworkProvider}s and + * handles the conversions of packets to messages. It also handles sending packets. + * + * @author BlockServer Team + * @see NetworkProvider */ -public class NetworkModule extends Module { - private final SchedulerModule schedulerModule; - private final Set providers = Collections.synchronizedSet(new HashSet<>()); - @Getter protected Runnable task; +public class NetworkModule extends Module{ + private SchedulerModule scheduler; + private Thread processorThread; + //private ExecutorService networkOperationsPool = Executors.newFixedThreadPool(4); //TODO: set in config + private List registeredProviders = new ArrayList<>(); - public NetworkModule(Server server, SchedulerModule schedulerModule) { + public NetworkModule(Server server, SchedulerModule scheduler) { super(server); - this.schedulerModule = schedulerModule; - task = () -> { - for (NetworkProvider provider : providers) { - provider.receiveInboundPackets().forEach(p -> getServer().getEventManager().fire(new RawPacketHandleEvent(p))); - } - }; - } + this.scheduler = scheduler; - public void sendPackets(RawPacket... packets) { - for (NetworkProvider provider : providers) { - provider.queueOutboundPackets(packets); - } + processorThread = new Thread(() -> { + Thread.currentThread().setName("NetworkProcessor"); + registeredProviders.forEach(provider -> { + RawPacket packet; + int max = 250; + while(((packet = provider.getNextPacket()) != null) && max-- > 0) { //while the provider has packets in the queue AND number of packets processed is less than 250 + getServer().getEventManager().fire(new RawPacketHandleEvent(packet)); //TODO: not sure what I'm doing here - jython234 + } + }); + }); + processorThread.start(); } - public void registerProvider(NetworkProvider provider) { - providers.add(provider); - } + /** + * Sends the specified {@linkplain RawPacket}s through the specified provider. + * @param provider The {@linkplain NetworkProvider} to send the packets. + * @param packets The {@linkplain RawPacket}s to be sent. + */ + public void sendPackets(NetworkProvider provider, RawPacket... packets) { - @Override - public void onEnable() { - schedulerModule.registerTask(task, 1.0, Integer.MAX_VALUE); - super.onEnable(); } - @Override - public void onDisable() { - schedulerModule.cancelTask(task); - super.onDisable(); + /** + * Sends the specified {@linkplain Message}s through the specified provider. + * @param provider The {@linkplain NetworkProvider} to send the packets. + * @param messages The {@linkplain Message}s to be sent. + */ + public void sendMessages(NetworkProvider provider, Message... messages) { + } - public Set getProviders() { - return Collections.unmodifiableSet(providers); + public void registerProvider(NetworkProvider provider) { + if(!registeredProviders.contains(provider)) { + registeredProviders.add(provider); + return; + } + throw new IllegalArgumentException("NetworkProvider is already registered!"); } -} \ No newline at end of file +} diff --git a/src/main/java/org/blockserver/core/modules/network/NetworkProvider.java b/src/main/java/org/blockserver/core/modules/network/NetworkProvider.java index 18dec0a..912c928 100644 --- a/src/main/java/org/blockserver/core/modules/network/NetworkProvider.java +++ b/src/main/java/org/blockserver/core/modules/network/NetworkProvider.java @@ -16,53 +16,66 @@ */ package org.blockserver.core.modules.network; +import lombok.Getter; import org.blockserver.core.Server; -import org.blockserver.core.module.Module; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; /** - * Written by Exerosis! + * A Network Provider is an interface capable of sending and receiving packets. + * Each Protocol has it's own NetworkProvider. + * + * @author BlockServer Team + * @see NetworkModule */ -public class NetworkProvider extends Module { - private final BlockingQueue packetOutQueue = new LinkedBlockingQueue<>(); - private final BlockingQueue packetInQueue = new LinkedBlockingQueue<>(); - - public NetworkProvider(Server server) { - super(server); - } +public abstract class NetworkProvider { - public void queueOutboundPackets(RawPacket... packets) { - packetOutQueue.addAll(packets.length > 1 ? Arrays.asList(packets) : Collections.singletonList(packets[0])); - } + @Getter private Server server; + @Getter private NetworkConverter converter; - public void queueInboundPackets(RawPacket... packets) { - if (packets.length > 0) - getServer().getExecutorService().execute(() -> Collections.addAll(packetInQueue, packets)); - } + private Queue inQueue = new ConcurrentLinkedQueue<>(); + private Queue outQueue = new ConcurrentLinkedQueue<>(); - public Collection receiveInboundPackets() { - Collection messages = new HashSet<>(); - packetInQueue.drainTo(messages); - return messages; + public NetworkProvider(Server server, NetworkConverter converter) { + this.server = server; + this.converter = converter; } - public Collection receiveOutboundPackets() { - Collection packets = new HashSet<>(); - packetOutQueue.drainTo(packets); - return packets; - } + /** + * This method is used by the {@linkplain NetworkProvider} superclass to send a packet + * through the underlying layer. + * + * @param packet The packet to be sent. + * @return If the packet has been sent successfully. + */ + protected abstract boolean _sendPacket(RawPacket packet); - public Collection getPacketInQueue() { - return new HashSet<>(packetInQueue); + /** + * Sends a {@linkplain RawPacket}. This places it in the packet out queue. + * If isImmediate, the packet will skip the packet out queue. + * + * @param packet The packet to be sent. + * @param isImmediate If the packet should be sent immediately, thus skipping queues. + * @return If the packet was sent successfully. + */ + public final boolean sendPacket(RawPacket packet, boolean isImmediate) { + if(isImmediate) { + if(!_sendPacket(packet)) { + return false; + } + } else outQueue.add(packet); + return true; } - public Collection getPacketOutQueue() { - return new HashSet<>(packetOutQueue); + /** + * Used by the NetworkModule to get the latest packet received. + * If no packet is in the queue, returns null. + * + * @return The latest packet received, null if the queue is empty. + */ + protected RawPacket getNextPacket() { + if(inQueue.isEmpty()) return null; + return inQueue.remove(); } -} \ No newline at end of file +} diff --git a/src/main/java/org/blockserver/core/modules/player/Player.java b/src/main/java/org/blockserver/core/modules/player/Player.java index 7a64bc7..6194156 100644 --- a/src/main/java/org/blockserver/core/modules/player/Player.java +++ b/src/main/java/org/blockserver/core/modules/player/Player.java @@ -17,6 +17,15 @@ package org.blockserver.core.modules.player; import lombok.Getter; +import org.blockserver.core.Server; +import org.blockserver.core.event.MessageEventListener; +import org.blockserver.core.events.MessageHandleEvent; +import org.blockserver.core.modules.message.Message; +import org.blockserver.core.modules.message.PlayerLoginMessage; +import org.blockserver.core.modules.network.NetworkModule; +import org.blockserver.core.modules.network.NetworkProvider; +import org.blockserver.core.modules.world.positions.Location; +import org.blockserver.core.utilities.Skin; import java.net.InetSocketAddress; import java.util.UUID; @@ -25,15 +34,50 @@ * Represents a Player on the server. * * @author BlockServer Team + * @see PlayerModule */ public class Player { + @Getter private final Server server; @Getter private final InetSocketAddress address; + @Getter private final NetworkProvider provider; + @Getter private final String name; @Getter private final UUID UUID; + @Getter private Skin skin; - public Player(InetSocketAddress address, String name, UUID UUID) { + public Player(Server server, InetSocketAddress address, String name, UUID UUID, NetworkProvider provider) { + this.server = server; this.address = address; this.name = name; this.UUID = UUID; + this.provider = provider; + + new MessageEventListener(){ + @Override + public void onEvent(MessageHandleEvent event) { + handleLogin(event.getMessage()); + } + }.register(PlayerLoginMessage.class, server); + } + + public Location getLocation() { + return new Location(0, 64, 0); + } + + public void sendMessage(Message message) { + server.getModule(NetworkModule.class).sendMessages(provider, message); + } + + public void handleLogin(PlayerLoginMessage message) { + if(server.getModule(PlayerModule.class).getPlayer(message.username) != null) { + disconnect("blockserver.player.disconnect.username", true); + } + if(server.getModule(PlayerModule.class).getPlayer(message.uuid) != null) { + disconnect("blockserver.player.disconnect.uuid", true); + } + } + + public void disconnect(String message, boolean notify) { + } } \ No newline at end of file diff --git a/src/main/java/org/blockserver/core/modules/player/PlayerModule.java b/src/main/java/org/blockserver/core/modules/player/PlayerModule.java index 85fcd4e..ff9535d 100644 --- a/src/main/java/org/blockserver/core/modules/player/PlayerModule.java +++ b/src/main/java/org/blockserver/core/modules/player/PlayerModule.java @@ -19,6 +19,7 @@ import org.blockserver.core.Server; import org.blockserver.core.module.Module; import org.blockserver.core.modules.logging.LoggingModule; +import org.blockserver.core.modules.network.NetworkProvider; import java.net.InetSocketAddress; import java.util.Collections; @@ -28,6 +29,9 @@ /** * Module that handles players. + * + * @author BlockServer Team + * @see org.blockserver.core.module.Module */ public class PlayerModule extends Module { private final Set players = Collections.synchronizedSet(new HashSet<>()); @@ -101,9 +105,11 @@ public Player getPlayer(InetSocketAddress address) { * @param address ({@linkplain InetSocketAddress}): The new {@linkplain Player}'s {@linkplain InetSocketAddress}. * @param name ({@linkplain String}): The new {@linkplain Player}'s {@linkplain String}. * @param UUID ({@linkplain UUID}): The new {@linkplain Player}'s {@linkplain UUID}. + * @param provider {{@linkplain NetworkProvider}}: The {@linkplain Player}'s {@linkplain NetworkProvider} that is used + * to communicate with the client. */ - public void internalOpenSession(InetSocketAddress address, String name, UUID UUID) { - players.add(new Player(address, name, UUID)); + public void internalOpenSession(InetSocketAddress address, String name, UUID UUID, NetworkProvider provider) { + players.add(new Player(getServer(), address, name, UUID, provider)); getServer().getModule(LoggingModule.class).debug("New session from " + address.getHostString() + ":" + address.getPort()); } diff --git a/src/main/java/org/blockserver/core/modules/scheduler/SchedulerModule.java b/src/main/java/org/blockserver/core/modules/scheduler/SchedulerModule.java index 9618082..6604800 100644 --- a/src/main/java/org/blockserver/core/modules/scheduler/SchedulerModule.java +++ b/src/main/java/org/blockserver/core/modules/scheduler/SchedulerModule.java @@ -25,6 +25,9 @@ /** * Written by Exerosis! + * + * @author BlockServer Team + * @see org.blockserver.core.module.Module */ public class SchedulerModule extends Module { @Getter private final Map tasks = new HashMap<>(); diff --git a/src/main/java/org/blockserver/core/modules/scheduler/TaskData.java b/src/main/java/org/blockserver/core/modules/scheduler/TaskData.java index 64cb663..55e20ff 100644 --- a/src/main/java/org/blockserver/core/modules/scheduler/TaskData.java +++ b/src/main/java/org/blockserver/core/modules/scheduler/TaskData.java @@ -21,6 +21,9 @@ /** * Written by Exerosis! + * + * @author BlockServer Team + * @see SchedulerModule */ public class TaskData { @Getter @Setter protected long lastTickTime; diff --git a/src/main/java/org/blockserver/core/modules/serverlist/ServerListModule.java b/src/main/java/org/blockserver/core/modules/serverlist/ServerListModule.java deleted file mode 100644 index 42faf2b..0000000 --- a/src/main/java/org/blockserver/core/modules/serverlist/ServerListModule.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This file is part of BlockServer. - * - * BlockServer is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BlockServer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BlockServer. If not, see . - */ -package org.blockserver.core.modules.serverlist; - -import lombok.Getter; -import org.blockserver.core.Server; -import org.blockserver.core.event.EventListener; -import org.blockserver.core.events.RawPacketHandleEvent; -import org.blockserver.core.module.Module; -import org.blockserver.core.modules.network.NetworkModule; -import org.blockserver.core.modules.scheduler.SchedulerModule; - -/** - * Written by Exerosis! - */ -public class ServerListModule extends Module { - private final SchedulerModule schedulerModule; - private final NetworkModule networkModule; - @Getter private final Runnable task; - - public ServerListModule(Server server, SchedulerModule schedulerModule, NetworkModule networkModule) { - super(server); - this.schedulerModule = schedulerModule; - this.networkModule = networkModule; - task = () -> { - //networkModule.sendPackets(); - //send things - }; - new EventListener() { - @Override - public void onEvent(RawPacketHandleEvent event) { - //receive pings - //send pongs - } - }.register(RawPacketHandleEvent.class, getServer().getEventManager()); - } - - @Override - public void onEnable() { - schedulerModule.registerTask(task, 1.0, Integer.MAX_VALUE); - super.onEnable(); - } - - @Override - public void onDisable() { - schedulerModule.cancelTask(task); - super.onDisable(); - } -} diff --git a/src/main/java/org/blockserver/core/modules/world/Block.java b/src/main/java/org/blockserver/core/modules/world/Block.java index 4f41a25..6d5d2d6 100644 --- a/src/main/java/org/blockserver/core/modules/world/Block.java +++ b/src/main/java/org/blockserver/core/modules/world/Block.java @@ -17,12 +17,15 @@ package org.blockserver.core.modules.world; import lombok.Getter; -import org.blockserver.core.message.block.MessageOutBlockChange; +import org.blockserver.core.modules.message.block.MessageOutBlockChange; import org.blockserver.core.modules.player.Player; import org.blockserver.core.modules.world.positions.Vector; /** * Written by Exerosis! + * + * @author BlockServer Team + * @see WorldModule */ public class Block { @Getter private World world; @@ -30,10 +33,21 @@ public class Block { @Getter private byte lightLevel; @Getter private Vector vector; + /** + * Sets lightlevel between 0 and 15. + * + * @param lightLevel block lightlevel + */ public void setLightLevel(byte lightLevel) { this.lightLevel = lightLevel; } + /** + * Sets block material. + * + * @param material block material + * @see Material + */ public void setMaterial(Material material) { this.material = material; for (Player player : world.getPlayers()) { diff --git a/src/main/java/org/blockserver/core/modules/world/Chunk.java b/src/main/java/org/blockserver/core/modules/world/Chunk.java index 8158eb2..b2d1043 100644 --- a/src/main/java/org/blockserver/core/modules/world/Chunk.java +++ b/src/main/java/org/blockserver/core/modules/world/Chunk.java @@ -18,7 +18,12 @@ /** * Written by Exerosis! + * + * @author BlockServer Team + * @see WorldModule */ -public interface Chunk { - Block getBlockAt(int x, int y, int z); +public class Chunk { + public Block getBlockAt(int x, int y, int z) { + return null; + } } \ No newline at end of file diff --git a/src/main/java/org/blockserver/core/modules/world/ChunkProvider.java b/src/main/java/org/blockserver/core/modules/world/ChunkProvider.java index cf427c3..80f8cc3 100644 --- a/src/main/java/org/blockserver/core/modules/world/ChunkProvider.java +++ b/src/main/java/org/blockserver/core/modules/world/ChunkProvider.java @@ -18,7 +18,18 @@ /** * Written by Exerosis! + * + * @author BlockServer Team + * @see WorldModule */ public interface ChunkProvider { - Chunk getChunkAt(int x, int y); + Chunk loadChunkAt(int x, int y); + + void unloadChunkAt(int x, int y); + + void unloadChunk(Chunk chunk); + + Chunk getOrLoadChunkAt(int x, int y); + + boolean isChunkLoaded(int x, int y); } \ No newline at end of file diff --git a/src/main/java/org/blockserver/core/modules/world/Material.java b/src/main/java/org/blockserver/core/modules/world/Material.java index e6b7a93..86138bf 100644 --- a/src/main/java/org/blockserver/core/modules/world/Material.java +++ b/src/main/java/org/blockserver/core/modules/world/Material.java @@ -18,6 +18,9 @@ /** * Written by Exerosis! + * + * @author BlockServer Team + * @see WorldModule */ public enum Material { } diff --git a/src/main/java/org/blockserver/core/modules/world/World.java b/src/main/java/org/blockserver/core/modules/world/World.java index da5aa36..a9935d4 100644 --- a/src/main/java/org/blockserver/core/modules/world/World.java +++ b/src/main/java/org/blockserver/core/modules/world/World.java @@ -25,14 +25,16 @@ /** * Written by Exerosis! + * + * @author BlockServer Team + * @see WorldModule */ public class World { @Getter private Server server; @Getter private Set players = new HashSet<>(); + @Getter private Set loadedChunks = new HashSet<>(); public World(Server server) { this.server = server; } - - } diff --git a/src/main/java/org/blockserver/core/modules/world/WorldModule.java b/src/main/java/org/blockserver/core/modules/world/WorldModule.java index c1c9a7d..c2ca445 100644 --- a/src/main/java/org/blockserver/core/modules/world/WorldModule.java +++ b/src/main/java/org/blockserver/core/modules/world/WorldModule.java @@ -21,9 +21,24 @@ /** * Written by Exerosis! + * + * @author BlockServer Team + * @see org.blockserver.core.module.Module */ public class WorldModule extends Module { public WorldModule(Server server) { super(server); } + + /** + * Setter method for block material. + * + * @param block Block which's material will be set. + * @param material material of the block + */ + public void setBlockMaterial(Block block, Material material) { + block.setMaterial(material); + } + + } \ No newline at end of file diff --git a/src/main/java/org/blockserver/core/modules/world/positions/Location.java b/src/main/java/org/blockserver/core/modules/world/positions/Location.java index 009222e..42a8551 100644 --- a/src/main/java/org/blockserver/core/modules/world/positions/Location.java +++ b/src/main/java/org/blockserver/core/modules/world/positions/Location.java @@ -20,6 +20,10 @@ /** * Written by Exerosis! + * + * @author BlockServer Team + * @see org.blockserver.core.modules.world.positions.Vector + * @see org.blockserver.core.modules.world.WorldModule */ public class Location extends Vector { @Getter long yaw; diff --git a/src/main/java/org/blockserver/core/modules/world/positions/Vector.java b/src/main/java/org/blockserver/core/modules/world/positions/Vector.java index 93819cc..d668fad 100644 --- a/src/main/java/org/blockserver/core/modules/world/positions/Vector.java +++ b/src/main/java/org/blockserver/core/modules/world/positions/Vector.java @@ -20,6 +20,9 @@ /** * Written by Exerosis! + * + * @author BlockServer Team + * @see org.blockserver.core.modules.world.WorldModule */ public class Vector { @Getter float x; diff --git a/src/main/java/org/blockserver/core/message/MessageInPlayerLogin.java b/src/main/java/org/blockserver/core/utilities/Skin.java similarity index 74% rename from src/main/java/org/blockserver/core/message/MessageInPlayerLogin.java rename to src/main/java/org/blockserver/core/utilities/Skin.java index ff885a4..fb443b7 100644 --- a/src/main/java/org/blockserver/core/message/MessageInPlayerLogin.java +++ b/src/main/java/org/blockserver/core/utilities/Skin.java @@ -14,15 +14,12 @@ * You should have received a copy of the GNU Lesser General Public License * along with BlockServer. If not, see . */ -package org.blockserver.core.message; - -import org.blockserver.core.modules.player.Player; +package org.blockserver.core.utilities; /** - * Written by Exerosis! + * Utility class that represents a Skin. */ -public class MessageInPlayerLogin extends Message { - public MessageInPlayerLogin(Player player) { - super(player); - } -} \ No newline at end of file +public class Skin { + public byte[] bytes; + public String skinName; +}