From 21450a64d2048ccb6d200bf1827edb15792c820b Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 16 Aug 2018 11:46:06 +0300 Subject: [PATCH 01/71] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B0?= =?UTF-8?q?=D0=BA=D0=B5=D1=82=D0=B0:=20mc.core.events=20->=20mc.core.event?= =?UTF-8?q?bus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/GameLoop.java | 7 +++---- .../mc/core/{events => eventbus}/CS_PlayerMoveEvent.java | 2 +- core/src/main/java/mc/core/{events => eventbus}/Event.java | 2 +- .../main/java/mc/core/{events => eventbus}/EventBase.java | 2 +- .../java/mc/core/{events => eventbus}/EventBusGetter.java | 2 +- .../main/java/mc/core/{events => eventbus}/LoginEvent.java | 2 +- .../java/mc/core/{events => eventbus}/PlayerLookEvent.java | 2 +- .../mc/core/{events => eventbus}/SC_ChunkLoadEvent.java | 2 +- .../mc/core/{events => eventbus}/SC_PlayerMoveEvent.java | 2 +- .../java/mc/core/{events => eventbus}/ServerPingEvent.java | 2 +- .../mc/core/network/proto_1_12_2/netty/NettyServer.java | 2 +- .../network/proto_1_12_2/netty/PlayerEventListener.java | 5 ++--- .../network/proto_1_12_2/netty/handlers/LoginHandler.java | 4 ++-- .../network/proto_1_12_2/netty/handlers/PlayHandler.java | 4 ++-- 14 files changed, 19 insertions(+), 21 deletions(-) rename core/src/main/java/mc/core/{events => eventbus}/CS_PlayerMoveEvent.java (96%) rename core/src/main/java/mc/core/{events => eventbus}/Event.java (89%) rename core/src/main/java/mc/core/{events => eventbus}/EventBase.java (89%) rename core/src/main/java/mc/core/{events => eventbus}/EventBusGetter.java (90%) rename core/src/main/java/mc/core/{events => eventbus}/LoginEvent.java (93%) rename core/src/main/java/mc/core/{events => eventbus}/PlayerLookEvent.java (93%) rename core/src/main/java/mc/core/{events => eventbus}/SC_ChunkLoadEvent.java (92%) rename core/src/main/java/mc/core/{events => eventbus}/SC_PlayerMoveEvent.java (92%) rename core/src/main/java/mc/core/{events => eventbus}/ServerPingEvent.java (93%) diff --git a/core/src/main/java/mc/core/GameLoop.java b/core/src/main/java/mc/core/GameLoop.java index da9cc1c..4dff4fc 100644 --- a/core/src/main/java/mc/core/GameLoop.java +++ b/core/src/main/java/mc/core/GameLoop.java @@ -7,13 +7,12 @@ package mc.core; import com.google.common.eventbus.Subscribe; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import mc.core.events.CS_PlayerMoveEvent; -import mc.core.events.EventBusGetter; -import mc.core.events.SC_ChunkLoadEvent; +import mc.core.eventbus.CS_PlayerMoveEvent; +import mc.core.eventbus.EventBusGetter; +import mc.core.eventbus.SC_ChunkLoadEvent; import mc.core.player.PlayerManager; import mc.core.time.TimeProcessor; import mc.core.utils.CompactedCoords; -import mc.core.world.World; import mc.core.world.chunk.Chunk; import org.springframework.beans.factory.annotation.Autowired; diff --git a/core/src/main/java/mc/core/events/CS_PlayerMoveEvent.java b/core/src/main/java/mc/core/eventbus/CS_PlayerMoveEvent.java similarity index 96% rename from core/src/main/java/mc/core/events/CS_PlayerMoveEvent.java rename to core/src/main/java/mc/core/eventbus/CS_PlayerMoveEvent.java index d44f7b1..3e20d87 100644 --- a/core/src/main/java/mc/core/events/CS_PlayerMoveEvent.java +++ b/core/src/main/java/mc/core/eventbus/CS_PlayerMoveEvent.java @@ -2,7 +2,7 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.events; +package mc.core.eventbus; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/core/src/main/java/mc/core/events/Event.java b/core/src/main/java/mc/core/eventbus/Event.java similarity index 89% rename from core/src/main/java/mc/core/events/Event.java rename to core/src/main/java/mc/core/eventbus/Event.java index 066e7c8..08aa0ec 100644 --- a/core/src/main/java/mc/core/events/Event.java +++ b/core/src/main/java/mc/core/eventbus/Event.java @@ -2,7 +2,7 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.events; +package mc.core.eventbus; public interface Event { void setCanceled(boolean value); diff --git a/core/src/main/java/mc/core/events/EventBase.java b/core/src/main/java/mc/core/eventbus/EventBase.java similarity index 89% rename from core/src/main/java/mc/core/events/EventBase.java rename to core/src/main/java/mc/core/eventbus/EventBase.java index 8c4f030..7756cce 100644 --- a/core/src/main/java/mc/core/events/EventBase.java +++ b/core/src/main/java/mc/core/eventbus/EventBase.java @@ -2,7 +2,7 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.events; +package mc.core.eventbus; import lombok.Getter; import lombok.Setter; diff --git a/core/src/main/java/mc/core/events/EventBusGetter.java b/core/src/main/java/mc/core/eventbus/EventBusGetter.java similarity index 90% rename from core/src/main/java/mc/core/events/EventBusGetter.java rename to core/src/main/java/mc/core/eventbus/EventBusGetter.java index d2e5aa3..82d3d42 100644 --- a/core/src/main/java/mc/core/events/EventBusGetter.java +++ b/core/src/main/java/mc/core/eventbus/EventBusGetter.java @@ -2,7 +2,7 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.events; +package mc.core.eventbus; import com.google.common.eventbus.EventBus; diff --git a/core/src/main/java/mc/core/events/LoginEvent.java b/core/src/main/java/mc/core/eventbus/LoginEvent.java similarity index 93% rename from core/src/main/java/mc/core/events/LoginEvent.java rename to core/src/main/java/mc/core/eventbus/LoginEvent.java index 63e123f..e264521 100644 --- a/core/src/main/java/mc/core/events/LoginEvent.java +++ b/core/src/main/java/mc/core/eventbus/LoginEvent.java @@ -2,7 +2,7 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.events; +package mc.core.eventbus; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/core/src/main/java/mc/core/events/PlayerLookEvent.java b/core/src/main/java/mc/core/eventbus/PlayerLookEvent.java similarity index 93% rename from core/src/main/java/mc/core/events/PlayerLookEvent.java rename to core/src/main/java/mc/core/eventbus/PlayerLookEvent.java index 7506530..80f03e4 100644 --- a/core/src/main/java/mc/core/events/PlayerLookEvent.java +++ b/core/src/main/java/mc/core/eventbus/PlayerLookEvent.java @@ -2,7 +2,7 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.events; +package mc.core.eventbus; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/core/src/main/java/mc/core/events/SC_ChunkLoadEvent.java b/core/src/main/java/mc/core/eventbus/SC_ChunkLoadEvent.java similarity index 92% rename from core/src/main/java/mc/core/events/SC_ChunkLoadEvent.java rename to core/src/main/java/mc/core/eventbus/SC_ChunkLoadEvent.java index 62d35c6..85ee1f5 100644 --- a/core/src/main/java/mc/core/events/SC_ChunkLoadEvent.java +++ b/core/src/main/java/mc/core/eventbus/SC_ChunkLoadEvent.java @@ -1,4 +1,4 @@ -package mc.core.events; +package mc.core.eventbus; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/core/src/main/java/mc/core/events/SC_PlayerMoveEvent.java b/core/src/main/java/mc/core/eventbus/SC_PlayerMoveEvent.java similarity index 92% rename from core/src/main/java/mc/core/events/SC_PlayerMoveEvent.java rename to core/src/main/java/mc/core/eventbus/SC_PlayerMoveEvent.java index d64350b..c0fce73 100644 --- a/core/src/main/java/mc/core/events/SC_PlayerMoveEvent.java +++ b/core/src/main/java/mc/core/eventbus/SC_PlayerMoveEvent.java @@ -1,4 +1,4 @@ -package mc.core.events; +package mc.core.eventbus; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/core/src/main/java/mc/core/events/ServerPingEvent.java b/core/src/main/java/mc/core/eventbus/ServerPingEvent.java similarity index 93% rename from core/src/main/java/mc/core/events/ServerPingEvent.java rename to core/src/main/java/mc/core/eventbus/ServerPingEvent.java index 3bbafce..58159ef 100644 --- a/core/src/main/java/mc/core/events/ServerPingEvent.java +++ b/core/src/main/java/mc/core/eventbus/ServerPingEvent.java @@ -2,7 +2,7 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.events; +package mc.core.eventbus; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java index 79be3f9..51318cb 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java @@ -14,7 +14,7 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.util.AttributeKey; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import mc.core.events.EventBusGetter; +import mc.core.eventbus.EventBusGetter; import mc.core.network.Server; import mc.core.network.StartServerException; import mc.core.network.proto_1_12_2.State; diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java index 63415cd..43e08c2 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java @@ -2,14 +2,13 @@ package mc.core.network.proto_1_12_2.netty; import com.google.common.eventbus.Subscribe; import lombok.extern.slf4j.Slf4j; -import mc.core.events.SC_ChunkLoadEvent; -import mc.core.events.SC_PlayerMoveEvent; +import mc.core.eventbus.SC_ChunkLoadEvent; +import mc.core.eventbus.SC_PlayerMoveEvent; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.packets.ChunkDataPacket; import mc.core.network.proto_1_12_2.packets.PlayerPositionAndLookPacket; import mc.core.utils.CompactedCoords; import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; @Slf4j class PlayerEventListener { diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java index 15cf04b..d5502a8 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java @@ -6,8 +6,8 @@ package mc.core.network.proto_1_12_2.netty.handlers; import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; -import mc.core.events.CS_PlayerMoveEvent; -import mc.core.events.EventBusGetter; +import mc.core.eventbus.CS_PlayerMoveEvent; +import mc.core.eventbus.EventBusGetter; import mc.core.network.proto_1_12_2.State; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.netty.wrappers.WrapperNetChannel; diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java index e4162c5..2c448b4 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java @@ -8,8 +8,8 @@ import io.netty.channel.Channel; import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; import mc.core.chat.ChatProcessor; -import mc.core.events.CS_PlayerMoveEvent; -import mc.core.events.EventBusGetter; +import mc.core.eventbus.CS_PlayerMoveEvent; +import mc.core.eventbus.EventBusGetter; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.packets.*; import mc.core.player.Player; From 480a117269504ab4ccd99ecf5ddcfb80aca54051 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 16 Aug 2018 11:47:17 +0300 Subject: [PATCH 02/71] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=20=D1=8D=D0=B2=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D0=B2=20?= =?UTF-8?q?=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BA=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/GameLoop.java | 4 ++-- .../mc/core/eventbus/{ => events}/CS_PlayerMoveEvent.java | 3 ++- .../main/java/mc/core/eventbus/{ => events}/LoginEvent.java | 3 ++- .../java/mc/core/eventbus/{ => events}/PlayerLookEvent.java | 3 ++- .../java/mc/core/eventbus/{ => events}/SC_ChunkLoadEvent.java | 3 ++- .../mc/core/eventbus/{ => events}/SC_PlayerMoveEvent.java | 3 ++- .../java/mc/core/eventbus/{ => events}/ServerPingEvent.java | 3 ++- .../core/network/proto_1_12_2/netty/PlayerEventListener.java | 4 ++-- .../network/proto_1_12_2/netty/handlers/LoginHandler.java | 2 +- .../core/network/proto_1_12_2/netty/handlers/PlayHandler.java | 2 +- 10 files changed, 18 insertions(+), 12 deletions(-) rename core/src/main/java/mc/core/eventbus/{ => events}/CS_PlayerMoveEvent.java (90%) rename core/src/main/java/mc/core/eventbus/{ => events}/LoginEvent.java (85%) rename core/src/main/java/mc/core/eventbus/{ => events}/PlayerLookEvent.java (84%) rename core/src/main/java/mc/core/eventbus/{ => events}/SC_ChunkLoadEvent.java (83%) rename core/src/main/java/mc/core/eventbus/{ => events}/SC_PlayerMoveEvent.java (82%) rename core/src/main/java/mc/core/eventbus/{ => events}/ServerPingEvent.java (85%) diff --git a/core/src/main/java/mc/core/GameLoop.java b/core/src/main/java/mc/core/GameLoop.java index 4dff4fc..d04f929 100644 --- a/core/src/main/java/mc/core/GameLoop.java +++ b/core/src/main/java/mc/core/GameLoop.java @@ -7,9 +7,9 @@ package mc.core; import com.google.common.eventbus.Subscribe; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import mc.core.eventbus.CS_PlayerMoveEvent; +import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.eventbus.EventBusGetter; -import mc.core.eventbus.SC_ChunkLoadEvent; +import mc.core.eventbus.events.SC_ChunkLoadEvent; import mc.core.player.PlayerManager; import mc.core.time.TimeProcessor; import mc.core.utils.CompactedCoords; diff --git a/core/src/main/java/mc/core/eventbus/CS_PlayerMoveEvent.java b/core/src/main/java/mc/core/eventbus/events/CS_PlayerMoveEvent.java similarity index 90% rename from core/src/main/java/mc/core/eventbus/CS_PlayerMoveEvent.java rename to core/src/main/java/mc/core/eventbus/events/CS_PlayerMoveEvent.java index 3e20d87..ae60200 100644 --- a/core/src/main/java/mc/core/eventbus/CS_PlayerMoveEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/CS_PlayerMoveEvent.java @@ -2,12 +2,13 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.eventbus; +package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import mc.core.EntityLocation; +import mc.core.eventbus.EventBase; import mc.core.player.Player; @RequiredArgsConstructor diff --git a/core/src/main/java/mc/core/eventbus/LoginEvent.java b/core/src/main/java/mc/core/eventbus/events/LoginEvent.java similarity index 85% rename from core/src/main/java/mc/core/eventbus/LoginEvent.java rename to core/src/main/java/mc/core/eventbus/events/LoginEvent.java index e264521..dc51dc3 100644 --- a/core/src/main/java/mc/core/eventbus/LoginEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/LoginEvent.java @@ -2,11 +2,12 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.eventbus; +package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; +import mc.core.eventbus.EventBase; import java.net.SocketAddress; diff --git a/core/src/main/java/mc/core/eventbus/PlayerLookEvent.java b/core/src/main/java/mc/core/eventbus/events/PlayerLookEvent.java similarity index 84% rename from core/src/main/java/mc/core/eventbus/PlayerLookEvent.java rename to core/src/main/java/mc/core/eventbus/events/PlayerLookEvent.java index 80f03e4..b20287b 100644 --- a/core/src/main/java/mc/core/eventbus/PlayerLookEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/PlayerLookEvent.java @@ -2,12 +2,13 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.eventbus; +package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import mc.core.EntityLocation; +import mc.core.eventbus.EventBase; import mc.core.player.Player; @RequiredArgsConstructor diff --git a/core/src/main/java/mc/core/eventbus/SC_ChunkLoadEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_ChunkLoadEvent.java similarity index 83% rename from core/src/main/java/mc/core/eventbus/SC_ChunkLoadEvent.java rename to core/src/main/java/mc/core/eventbus/events/SC_ChunkLoadEvent.java index 85ee1f5..ea55a7a 100644 --- a/core/src/main/java/mc/core/eventbus/SC_ChunkLoadEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/SC_ChunkLoadEvent.java @@ -1,7 +1,8 @@ -package mc.core.eventbus; +package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; +import mc.core.eventbus.EventBase; import mc.core.player.Player; import java.util.ArrayList; diff --git a/core/src/main/java/mc/core/eventbus/SC_PlayerMoveEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_PlayerMoveEvent.java similarity index 82% rename from core/src/main/java/mc/core/eventbus/SC_PlayerMoveEvent.java rename to core/src/main/java/mc/core/eventbus/events/SC_PlayerMoveEvent.java index c0fce73..d0634a7 100644 --- a/core/src/main/java/mc/core/eventbus/SC_PlayerMoveEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/SC_PlayerMoveEvent.java @@ -1,9 +1,10 @@ -package mc.core.eventbus; +package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import mc.core.EntityLocation; +import mc.core.eventbus.EventBase; import mc.core.player.Player; @RequiredArgsConstructor diff --git a/core/src/main/java/mc/core/eventbus/ServerPingEvent.java b/core/src/main/java/mc/core/eventbus/events/ServerPingEvent.java similarity index 85% rename from core/src/main/java/mc/core/eventbus/ServerPingEvent.java rename to core/src/main/java/mc/core/eventbus/events/ServerPingEvent.java index 58159ef..7f55f67 100644 --- a/core/src/main/java/mc/core/eventbus/ServerPingEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/ServerPingEvent.java @@ -2,11 +2,12 @@ * DmitriyMX * 2018-05-02 */ -package mc.core.eventbus; +package mc.core.eventbus.events; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; +import mc.core.eventbus.EventBase; import java.net.SocketAddress; diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java index 43e08c2..13975ba 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java @@ -2,8 +2,8 @@ package mc.core.network.proto_1_12_2.netty; import com.google.common.eventbus.Subscribe; import lombok.extern.slf4j.Slf4j; -import mc.core.eventbus.SC_ChunkLoadEvent; -import mc.core.eventbus.SC_PlayerMoveEvent; +import mc.core.eventbus.events.SC_ChunkLoadEvent; +import mc.core.eventbus.events.SC_PlayerMoveEvent; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.packets.ChunkDataPacket; import mc.core.network.proto_1_12_2.packets.PlayerPositionAndLookPacket; diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java index d5502a8..9fea76a 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java @@ -6,7 +6,7 @@ package mc.core.network.proto_1_12_2.netty.handlers; import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; -import mc.core.eventbus.CS_PlayerMoveEvent; +import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.eventbus.EventBusGetter; import mc.core.network.proto_1_12_2.State; import mc.core.network.proto_1_12_2.TeleportManager; diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java index 2c448b4..a0cf347 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java @@ -8,7 +8,7 @@ import io.netty.channel.Channel; import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; import mc.core.chat.ChatProcessor; -import mc.core.eventbus.CS_PlayerMoveEvent; +import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.eventbus.EventBusGetter; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.packets.*; From aafe91a896a44609111e75b187989c320f50eeb5 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 17 Aug 2018 11:05:25 +0300 Subject: [PATCH 03/71] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=81=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B5=D1=80=D0=BD=D1=8B=D1=85=20=D1=81=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eventbus/events/{LoginEvent.java => SC_LoginEvent.java} | 2 +- .../events/{PlayerLookEvent.java => SC_PlayerLookEvent.java} | 2 +- .../events/{ServerPingEvent.java => SC_ServerPingEvent.java} | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename core/src/main/java/mc/core/eventbus/events/{LoginEvent.java => SC_LoginEvent.java} (89%) rename core/src/main/java/mc/core/eventbus/events/{PlayerLookEvent.java => SC_PlayerLookEvent.java} (87%) rename core/src/main/java/mc/core/eventbus/events/{ServerPingEvent.java => SC_ServerPingEvent.java} (88%) diff --git a/core/src/main/java/mc/core/eventbus/events/LoginEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_LoginEvent.java similarity index 89% rename from core/src/main/java/mc/core/eventbus/events/LoginEvent.java rename to core/src/main/java/mc/core/eventbus/events/SC_LoginEvent.java index dc51dc3..95765f3 100644 --- a/core/src/main/java/mc/core/eventbus/events/LoginEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/SC_LoginEvent.java @@ -14,7 +14,7 @@ import java.net.SocketAddress; @RequiredArgsConstructor @Getter @Setter -public class LoginEvent extends EventBase { +public class SC_LoginEvent extends EventBase { private String playerName; private final SocketAddress remoteAddress; private boolean deny; diff --git a/core/src/main/java/mc/core/eventbus/events/PlayerLookEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_PlayerLookEvent.java similarity index 87% rename from core/src/main/java/mc/core/eventbus/events/PlayerLookEvent.java rename to core/src/main/java/mc/core/eventbus/events/SC_PlayerLookEvent.java index b20287b..90e5379 100644 --- a/core/src/main/java/mc/core/eventbus/events/PlayerLookEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/SC_PlayerLookEvent.java @@ -14,7 +14,7 @@ import mc.core.player.Player; @RequiredArgsConstructor @Getter @Setter -public class PlayerLookEvent extends EventBase { +public class SC_PlayerLookEvent extends EventBase { private final Player player; private EntityLocation newLook; } diff --git a/core/src/main/java/mc/core/eventbus/events/ServerPingEvent.java b/core/src/main/java/mc/core/eventbus/events/SC_ServerPingEvent.java similarity index 88% rename from core/src/main/java/mc/core/eventbus/events/ServerPingEvent.java rename to core/src/main/java/mc/core/eventbus/events/SC_ServerPingEvent.java index 7f55f67..877df70 100644 --- a/core/src/main/java/mc/core/eventbus/events/ServerPingEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/SC_ServerPingEvent.java @@ -14,7 +14,7 @@ import java.net.SocketAddress; @RequiredArgsConstructor @Getter @Setter -public class ServerPingEvent extends EventBase { +public class SC_ServerPingEvent extends EventBase { private final SocketAddress remoteAddress; private String description; private int online; From a3b40b750aab6278eeb1491f71b871f5378ac82c Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 17 Aug 2018 11:08:13 +0300 Subject: [PATCH 04/71] =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?INSTANCE=20=D0=BD=D0=B0=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20getI?= =?UTF-8?q?nstance()=20=D0=B2=20EventBusGetter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/GameLoop.java | 4 ++-- core/src/main/java/mc/core/eventbus/EventBusGetter.java | 4 +++- .../java/mc/core/network/proto_1_12_2/netty/NettyServer.java | 2 +- .../network/proto_1_12_2/netty/handlers/LoginHandler.java | 2 +- .../core/network/proto_1_12_2/netty/handlers/PlayHandler.java | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/mc/core/GameLoop.java b/core/src/main/java/mc/core/GameLoop.java index d04f929..93a0a6a 100644 --- a/core/src/main/java/mc/core/GameLoop.java +++ b/core/src/main/java/mc/core/GameLoop.java @@ -76,7 +76,7 @@ public class GameLoop extends Thread { } if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) { - EventBusGetter.INSTANCE.post(eventChunkLoad); + EventBusGetter.getInstance().post(eventChunkLoad); } } @@ -90,7 +90,7 @@ public class GameLoop extends Thread { public void run() { TPS_WATCHER.startWatch(); - EventBusGetter.INSTANCE.register(this); + EventBusGetter.getInstance().register(this); while (!isInterrupted()) { TPS_WATCHER.check(); diff --git a/core/src/main/java/mc/core/eventbus/EventBusGetter.java b/core/src/main/java/mc/core/eventbus/EventBusGetter.java index 82d3d42..37e952b 100644 --- a/core/src/main/java/mc/core/eventbus/EventBusGetter.java +++ b/core/src/main/java/mc/core/eventbus/EventBusGetter.java @@ -5,9 +5,11 @@ package mc.core.eventbus; import com.google.common.eventbus.EventBus; +import lombok.Getter; public final class EventBusGetter { - public static final EventBus INSTANCE = new EventBus(); + @Getter + private static final EventBus instance = new EventBus(); private EventBusGetter() { } diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java index 51318cb..057a425 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java @@ -64,7 +64,7 @@ public class NettyServer implements Server { public void start() throws StartServerException { log.info("Use protocol {}", StatusResponsePacket.NAME); - EventBusGetter.INSTANCE.register(new PlayerEventListener()); + EventBusGetter.getInstance().register(new PlayerEventListener()); bossGroup = new NioEventLoopGroup(1); workerGroup = new NioEventLoopGroup(workerGroupCount); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java index 9fea76a..771b1c3 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java @@ -140,7 +140,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand CS_PlayerMoveEvent event = new CS_PlayerMoveEvent(player, player.getLocation()); event.setNewLocation(player.getLocation()); event.setRecalcChunk(true); - EventBusGetter.INSTANCE.post(event); + EventBusGetter.getInstance().post(event); } } } diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java index a0cf347..d7636e3 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java @@ -85,7 +85,7 @@ public class PlayHandler extends AbstractStateHandler implements PlayStateHandle player.getLocation().getPitch(), player.getLocation().getWorld() )); - EventBusGetter.INSTANCE.post(event); + EventBusGetter.getInstance().post(event); } @Handler From ab08a723171053a86010c47d74da71377b7cf815 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 17 Aug 2018 11:44:22 +0300 Subject: [PATCH 05/71] =?UTF-8?q?core:=20=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D1=87=D0=B8=D0=BA=D0=BE=D0=B2=20=D1=81=D0=BE=D0=B1=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D0=B9=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/core/CoreEventListener.java | 60 +++++++++++++++++++ core/src/main/java/mc/core/GameLoop.java | 50 +--------------- 2 files changed, 61 insertions(+), 49 deletions(-) create mode 100644 core/src/main/java/mc/core/CoreEventListener.java diff --git a/core/src/main/java/mc/core/CoreEventListener.java b/core/src/main/java/mc/core/CoreEventListener.java new file mode 100644 index 0000000..46c8f49 --- /dev/null +++ b/core/src/main/java/mc/core/CoreEventListener.java @@ -0,0 +1,60 @@ +package mc.core; + +import com.google.common.eventbus.Subscribe; +import lombok.extern.slf4j.Slf4j; +import mc.core.eventbus.EventBusGetter; +import mc.core.eventbus.events.CS_PlayerMoveEvent; +import mc.core.eventbus.events.SC_ChunkLoadEvent; +import mc.core.utils.CompactedCoords; +import mc.core.world.chunk.Chunk; + +import javax.annotation.PostConstruct; + +@Slf4j +public class CoreEventListener { + @PostConstruct + public void registerEventHandlers() { + EventBusGetter.getInstance().register(this); + } + + @Subscribe + public void handlerPlayerMoveEvent(CS_PlayerMoveEvent event) { + event.getPlayer().getLocation().setXYZ(event.getNewLocation()); + + Chunk chunk = event.getNewLocation().getChunk(); // Next chunk + int ncX = chunk.getX(); + int ncZ = chunk.getZ(); + chunk = event.getPlayer().getLocation().getChunk(); // Current chunk + int ccX = chunk.getX(); + int ccZ = chunk.getZ(); + + if (event.isRecalcChunk() || (ncX != ccX && ncZ != ccZ)) { + final int viewDistance = event.getPlayer().getSettings().getViewDistance(); + int cMinX = chunk.getX() - viewDistance; + int cMaxX = chunk.getX() + viewDistance; + int cMinZ = chunk.getZ() - viewDistance; + int cMaxZ = chunk.getZ() + viewDistance; + + SC_ChunkLoadEvent eventChunkLoad = new SC_ChunkLoadEvent(event.getPlayer()); + for (int cZ = cMinZ; cZ <= cMaxZ; cZ++) { + for (int cX = cMinX; cX <= cMaxX; cX++) { + int compressXZ = CompactedCoords.compressXZ(cX, cZ); + if (!event.getPlayer().getLoadedChunks().contains(compressXZ)) { + if (!event.getPlayer().getLoadedChunks().contains(compressXZ)) { + eventChunkLoad.getNeedLoadChunks().add(compressXZ); + } + } + } + } + + if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) { + EventBusGetter.getInstance().post(eventChunkLoad); + } + } + + // TODO отсылать клиенту только(!) для корректировки позиции + // SC_PlayerMoveEvent nextEvent = new SC_PlayerMoveEvent(event.getPlayer()); + // nextEvent.setNewLocation(event.getNewLocation()); + // EventBusGetter.INSTANCE.post(nextEvent); + } +} diff --git a/core/src/main/java/mc/core/GameLoop.java b/core/src/main/java/mc/core/GameLoop.java index 93a0a6a..a51e42a 100644 --- a/core/src/main/java/mc/core/GameLoop.java +++ b/core/src/main/java/mc/core/GameLoop.java @@ -4,16 +4,11 @@ */ package mc.core; -import com.google.common.eventbus.Subscribe; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.eventbus.EventBusGetter; -import mc.core.eventbus.events.SC_ChunkLoadEvent; import mc.core.player.PlayerManager; import mc.core.time.TimeProcessor; -import mc.core.utils.CompactedCoords; -import mc.core.world.chunk.Chunk; import org.springframework.beans.factory.annotation.Autowired; @Slf4j @@ -44,59 +39,16 @@ public class GameLoop extends Thread { TPS_WATCHER.setTraceTPS(value); } - @Subscribe - public void playerMoveEventHandler(CS_PlayerMoveEvent event) { - log.trace("(GameLoop) playerMoveEventHandler()"); - event.getPlayer().getLocation().setXYZ(event.getNewLocation()); - - Chunk chunk = event.getNewLocation().getChunk(); // Next chunk - int ncX = chunk.getX(); - int ncZ = chunk.getZ(); - chunk = event.getPlayer().getLocation().getChunk(); // Current chunk - int ccX = chunk.getX(); - int ccZ = chunk.getZ(); - - if (event.isRecalcChunk() || (ncX != ccX && ncZ != ccZ)) { - final int viewDistance = event.getPlayer().getSettings().getViewDistance(); - int cMinX = chunk.getX() - viewDistance; - int cMaxX = chunk.getX() + viewDistance; - int cMinZ = chunk.getZ() - viewDistance; - int cMaxZ = chunk.getZ() + viewDistance; - - SC_ChunkLoadEvent eventChunkLoad = new SC_ChunkLoadEvent(event.getPlayer()); - for (int cZ = cMinZ; cZ <= cMaxZ; cZ++) { - for (int cX = cMinX; cX <= cMaxX; cX++) { - int compressXZ = CompactedCoords.compressXZ(cX, cZ); - if (!event.getPlayer().getLoadedChunks().contains(compressXZ)) { - if (!event.getPlayer().getLoadedChunks().contains(compressXZ)) { - eventChunkLoad.getNeedLoadChunks().add(compressXZ); - } - } - } - } - - if (!eventChunkLoad.getNeedLoadChunks().isEmpty()) { - EventBusGetter.getInstance().post(eventChunkLoad); - } - } - - // TODO отсылать клиенту только(!) для корректировки позиции -// SC_PlayerMoveEvent nextEvent = new SC_PlayerMoveEvent(event.getPlayer()); -// nextEvent.setNewLocation(event.getNewLocation()); -// EventBusGetter.INSTANCE.post(nextEvent); - } - @Override public void run() { TPS_WATCHER.startWatch(); - EventBusGetter.getInstance().register(this); - while (!isInterrupted()) { TPS_WATCHER.check(); /* --- --- --- */ + /* TODO нужно перенести этот функционал на Network */ playerManager.getBroadcastChannel().sendTimeUpdate( gameTimer.getGameTime(), gameTimer.getWorldAge() From d02499e3b74f7b823dc3d6de8e9c5a4e2cde4fef Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 17 Aug 2018 13:49:00 +0300 Subject: [PATCH 06/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?Location?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/Location.java | 10 +- core/src/test/java/mc/core/TestLocation.java | 173 +++++++++++++++++++ 2 files changed, 178 insertions(+), 5 deletions(-) create mode 100644 core/src/test/java/mc/core/TestLocation.java diff --git a/core/src/main/java/mc/core/Location.java b/core/src/main/java/mc/core/Location.java index afb3582..4a4c1b4 100644 --- a/core/src/main/java/mc/core/Location.java +++ b/core/src/main/java/mc/core/Location.java @@ -50,15 +50,15 @@ public class Location implements Cloneable { } public int getBlockX() { - return (int) x; + return Double.valueOf(Math.floor(x)).intValue(); } public int getBlockY() { - return (int) y; + return Double.valueOf(Math.floor(y)).intValue(); } public int getBlockZ() { - return (int) z; + return Double.valueOf(Math.floor(z)).intValue(); } public Chunk getChunk() { @@ -66,7 +66,7 @@ public class Location implements Cloneable { if (world == null) { return null; } else { - return world.getChunk((int)(x / 16), (int)(z / 16)); + return world.getChunk(getBlockX() >> 4, getBlockZ() >> 4); } } @@ -75,7 +75,7 @@ public class Location implements Cloneable { if (chunk == null) { return null; } else { - return chunk.getChunkSection((int)(y / 16)); + return chunk.getChunkSection(getBlockY() >> 4); } } diff --git a/core/src/test/java/mc/core/TestLocation.java b/core/src/test/java/mc/core/TestLocation.java new file mode 100644 index 0000000..9b9cf61 --- /dev/null +++ b/core/src/test/java/mc/core/TestLocation.java @@ -0,0 +1,173 @@ +package mc.core; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import mc.core.world.Biome; +import mc.core.world.World; +import mc.core.world.WorldType; +import mc.core.world.chunk.Chunk; +import mc.core.world.chunk.ChunkSection; +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class TestLocation { + private class DummyWorld implements World { + @RequiredArgsConstructor + private class DummyChunk implements Chunk { + @Getter + private final int x, z; + + @Override + public ChunkSection getChunkSection(int height) { + return null; + } + + @Override + public void setChunkSection(int height, ChunkSection chunkSection) { + } + + @Override + public Biome getBiome(int localX, int localZ) { + return null; + } + + @Override + public void setBiome(int localX, int localZ, Biome biome) { + } + + @Override + public World getWorld() { + return null; + } + + @Override + public void setWorld(World world) { + } + } + + @Override + public WorldType getWorldType() { + return null; + } + + @Override + public EntityLocation getSpawn() { + return null; + } + + @Override + public void setSpawn(EntityLocation location) { + } + + @Override + public Chunk getChunk(int x, int z) { + return new DummyChunk(x, z); + } + + @Override + public void setChunk(int x, int z, Chunk chunkSection) { + + } + } + + @Test + public void testGetBlockXZ() { + World world = new DummyWorld(); + Location location; + + location = new Location(0d, 0, 0d, world); + assertEquals(0, location.getBlockX()); + assertEquals(0, location.getBlockZ()); + + location.setXYZ(0.1d, 0, 0.1d); + assertEquals(0, location.getBlockX()); + assertEquals(0, location.getBlockZ()); + + location.setXYZ(0.5d, 0, 0.5d); + assertEquals(0, location.getBlockX()); + assertEquals(0, location.getBlockZ()); + + location.setXYZ(0.9d, 0, 0.9d); + assertEquals(0, location.getBlockX()); + assertEquals(0, location.getBlockZ()); + + location.setXYZ(1d, 0, 1d); + assertEquals(1, location.getBlockX()); + assertEquals(1, location.getBlockZ()); + + location.setXYZ(-0.1d, 0, -0.1d); + assertEquals(-1, location.getBlockX()); + assertEquals(-1, location.getBlockZ()); + + location.setXYZ(-0.5d, 0, -0.5d); + assertEquals(-1, location.getBlockX()); + assertEquals(-1, location.getBlockZ()); + + location.setXYZ(-0.9d, 0, -0.9d); + assertEquals(-1, location.getBlockX()); + assertEquals(-1, location.getBlockZ()); + + location.setXYZ(-1d, 0, -1d); + assertEquals(-1, location.getBlockX()); + assertEquals(-1, location.getBlockZ()); + + location.setXYZ(-1.1d, 0, -1.1d); + assertEquals(-2, location.getBlockX()); + assertEquals(-2, location.getBlockZ()); + } + + @Test + public void testGetChunk() { + World world = new DummyWorld(); + Location location; + Chunk chunk; + + location = new Location(0d, 0, 0d, world); + chunk = location.getChunk(); + assertEquals(0, chunk.getX()); + assertEquals(0, chunk.getZ()); + + location.setXYZ(1d, 0, 1d); + chunk = location.getChunk(); + assertEquals(0, chunk.getX()); + assertEquals(0, chunk.getZ()); + + location.setXYZ(15d, 0, 15d); + chunk = location.getChunk(); + assertEquals(0, chunk.getX()); + assertEquals(0, chunk.getZ()); + + location.setXYZ(16d, 0, 16d); + chunk = location.getChunk(); + assertEquals(1, chunk.getX()); + assertEquals(1, chunk.getZ()); + + location.setXYZ(-0.1d, 0, -0.1d); + chunk = location.getChunk(); + assertEquals(-1, chunk.getX()); + assertEquals(-1, chunk.getZ()); + + location.setXYZ(-1d, 0, -1d); + chunk = location.getChunk(); + assertEquals(-1, chunk.getX()); + assertEquals(-1, chunk.getZ()); + + location.setXYZ(-15d, 0, -15d); + chunk = location.getChunk(); + assertEquals(-1, chunk.getX()); + assertEquals(-1, chunk.getZ()); + + //TODO на практике, таких точных значений не встретиться, но тем не менее данный тест не проходит + //location.setXYZ(-16.0d, 0, -16.0d); + //chunk = location.getChunk(); + //assertEquals(-2, chunk.getX()); + //assertEquals(-2, chunk.getZ()); + + location.setXYZ(-16.001d, 0, -16.001d); + chunk = location.getChunk(); + assertEquals(-2, chunk.getX()); + assertEquals(-2, chunk.getZ()); + } +} From f4243633995bf61cf09788e6a2872918a4dacd50 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 17 Aug 2018 14:27:54 +0300 Subject: [PATCH 07/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20UnloadChunkPack?= =?UTF-8?q?et?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/mc/core/network/proto_1_12_2/State.java | 1 + .../proto_1_12_2/packets/UnloadChunkPacket.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/UnloadChunkPacket.java diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java index d963a59..8d52cf5 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java @@ -87,6 +87,7 @@ public enum State { .put(BossBarPacket.class, 0x0C) .put(ChatMessageServerPacket.class, 0x0F) .put(PluginMessagePacket.class, 0x18) + .put(UnloadChunkPacket.class, 0x1D) .put(ChangeGameState.class, 0x1E) .put(KeepAlivePacket.class, 0x1F) .put(ChunkDataPacket.class, 0x20) diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/UnloadChunkPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/UnloadChunkPacket.java new file mode 100644 index 0000000..5bcfe15 --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/UnloadChunkPacket.java @@ -0,0 +1,16 @@ +package mc.core.network.proto_1_12_2.packets; + +import lombok.Setter; +import mc.core.network.NetOutputStream; +import mc.core.network.SCPacket; + +public class UnloadChunkPacket implements SCPacket { + @Setter + private int x, z; + + @Override + public void writeSelf(NetOutputStream netStream) { + netStream.writeInt(x); + netStream.writeInt(z); + } +} From cb3df8f6fb267632e82784db80ead394f21f3692 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 17 Aug 2018 14:28:45 +0300 Subject: [PATCH 08/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B5=D1=85=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B7=D0=BC=D0=B0=20=D0=B2=D1=8B=D0=B3=D1=80=D1=83=D0=B7=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=87=D0=B0=D0=BD=D0=BA=D0=BE=D0=B2,=20=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B0=D0=BA=20=D0=B6=D0=B5=20=D0=BF=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=85=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=20=D0=B8=D1=85=20=D0=B7=D0=B0=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=B7=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/GameLoop.java | 35 +++++++++++++++---- .../mc/core/events/SC_ChunkUnloadEvent.java | 16 +++++++++ .../netty/PlayerEventListener.java | 19 ++++++++-- 3 files changed, 61 insertions(+), 9 deletions(-) create mode 100644 core/src/main/java/mc/core/events/SC_ChunkUnloadEvent.java diff --git a/core/src/main/java/mc/core/GameLoop.java b/core/src/main/java/mc/core/GameLoop.java index da9cc1c..06fc0a1 100644 --- a/core/src/main/java/mc/core/GameLoop.java +++ b/core/src/main/java/mc/core/GameLoop.java @@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j; import mc.core.events.CS_PlayerMoveEvent; import mc.core.events.EventBusGetter; import mc.core.events.SC_ChunkLoadEvent; +import mc.core.events.SC_ChunkUnloadEvent; import mc.core.player.PlayerManager; import mc.core.time.TimeProcessor; import mc.core.utils.CompactedCoords; @@ -17,6 +18,8 @@ import mc.core.world.World; import mc.core.world.chunk.Chunk; import org.springframework.beans.factory.annotation.Autowired; +import java.util.Iterator; + @Slf4j public class GameLoop extends Thread { private final TpsWatcher TPS_WATCHER = TpsWatcher.getInstance(); @@ -48,22 +51,37 @@ public class GameLoop extends Thread { @Subscribe public void playerMoveEventHandler(CS_PlayerMoveEvent event) { log.trace("(GameLoop) playerMoveEventHandler()"); - event.getPlayer().getLocation().setXYZ(event.getNewLocation()); - Chunk chunk = event.getNewLocation().getChunk(); // Next chunk - int ncX = chunk.getX(); - int ncZ = chunk.getZ(); - chunk = event.getPlayer().getLocation().getChunk(); // Current chunk + Chunk chunk; + chunk = event.getOldLocation().getChunk(); // Old chunk int ccX = chunk.getX(); int ccZ = chunk.getZ(); + chunk = event.getNewLocation().getChunk(); // Next chunk + int ncX = chunk.getX(); + int ncZ = chunk.getZ(); - if (event.isRecalcChunk() || (ncX != ccX && ncZ != ccZ)) { - final int viewDistance = event.getPlayer().getSettings().getViewDistance(); + if (event.isRecalcChunk() || (ncX != ccX || ncZ != ccZ)) { + final int viewDistance = event.getPlayer().getSettings().getViewDistance() + 1; int cMinX = chunk.getX() - viewDistance; int cMaxX = chunk.getX() + viewDistance; int cMinZ = chunk.getZ() - viewDistance; int cMaxZ = chunk.getZ() + viewDistance; + SC_ChunkUnloadEvent eventChunkUnload = new SC_ChunkUnloadEvent(event.getPlayer()); + Iterator itr = event.getPlayer().getLoadedChunks().iterator(); + while(itr.hasNext()) { + int compressXZ = itr.next(); + int[] xz = CompactedCoords.uncompressXZ(compressXZ); + if (xz[0] > cMaxX || xz[0] < cMinX || xz[1] > cMaxZ || xz[1] < cMinZ) { + eventChunkUnload.getNeedUnloadChunks().add(compressXZ); + itr.remove(); + } + } + + if (!eventChunkUnload.getNeedUnloadChunks().isEmpty()) { + EventBusGetter.INSTANCE.post(eventChunkUnload); + } + SC_ChunkLoadEvent eventChunkLoad = new SC_ChunkLoadEvent(event.getPlayer()); for (int cZ = cMinZ; cZ <= cMaxZ; cZ++) { for (int cX = cMinX; cX <= cMaxX; cX++) { @@ -71,6 +89,7 @@ public class GameLoop extends Thread { if (!event.getPlayer().getLoadedChunks().contains(compressXZ)) { if (!event.getPlayer().getLoadedChunks().contains(compressXZ)) { eventChunkLoad.getNeedLoadChunks().add(compressXZ); + event.getPlayer().getLoadedChunks().add(compressXZ); } } } @@ -81,6 +100,8 @@ public class GameLoop extends Thread { } } + event.getPlayer().getLocation().setXYZ(event.getNewLocation()); + // TODO отсылать клиенту только(!) для корректировки позиции // SC_PlayerMoveEvent nextEvent = new SC_PlayerMoveEvent(event.getPlayer()); // nextEvent.setNewLocation(event.getNewLocation()); diff --git a/core/src/main/java/mc/core/events/SC_ChunkUnloadEvent.java b/core/src/main/java/mc/core/events/SC_ChunkUnloadEvent.java new file mode 100644 index 0000000..397cbac --- /dev/null +++ b/core/src/main/java/mc/core/events/SC_ChunkUnloadEvent.java @@ -0,0 +1,16 @@ +package mc.core.events; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import mc.core.player.Player; + +import java.util.ArrayList; +import java.util.List; + +@RequiredArgsConstructor +public class SC_ChunkUnloadEvent extends EventBase { + @Getter + private final Player player; + @Getter + private List needUnloadChunks = new ArrayList<>(); +} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java index 63415cd..75a0978 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java @@ -3,10 +3,12 @@ package mc.core.network.proto_1_12_2.netty; import com.google.common.eventbus.Subscribe; import lombok.extern.slf4j.Slf4j; import mc.core.events.SC_ChunkLoadEvent; +import mc.core.events.SC_ChunkUnloadEvent; import mc.core.events.SC_PlayerMoveEvent; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.packets.ChunkDataPacket; import mc.core.network.proto_1_12_2.packets.PlayerPositionAndLookPacket; +import mc.core.network.proto_1_12_2.packets.UnloadChunkPacket; import mc.core.utils.CompactedCoords; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkSection; @@ -26,8 +28,6 @@ class PlayerEventListener { @Subscribe public void playerChunkLoadHandler(SC_ChunkLoadEvent event) { - log.debug("(SC) playerChunkLoadHandler()"); - for(Integer compressXZ : event.getNeedLoadChunks()) { int[] xz = CompactedCoords.uncompressXZ(compressXZ); Chunk chunk = event.getPlayer().getLocation().getWorld().getChunk(xz[0], xz[1]); @@ -43,4 +43,19 @@ class PlayerEventListener { event.getPlayer().getChannel().flush(); } + + @Subscribe + public void playerChunkUnloadHandler(SC_ChunkUnloadEvent event) { + for(Integer compressXZ : event.getNeedUnloadChunks()) { + int[] xz = CompactedCoords.uncompressXZ(compressXZ); + + UnloadChunkPacket packet = new UnloadChunkPacket(); + packet.setX(xz[0]); + packet.setZ(xz[1]); + + event.getPlayer().getChannel().write(packet); + } + + event.getPlayer().getChannel().flush(); + } } From b66cd18e1426c22534d72449be767989ad4828e1 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 17 Aug 2018 14:34:34 +0300 Subject: [PATCH 09/71] =?UTF-8?q?(un)load=20chunks:=20=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=85=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B7=D0=BC=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Они теперь не копятся (write(), flush()), а отправляются сразу (writeAndFlush()) --- .../network/proto_1_12_2/netty/PlayerEventListener.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java index 75a0978..66d46ec 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java @@ -38,10 +38,8 @@ class PlayerEventListener { packet.setInitChunk(true); packet.setChunk(chunk); - event.getPlayer().getChannel().write(packet); + event.getPlayer().getChannel().writeAndFlush(packet); } - - event.getPlayer().getChannel().flush(); } @Subscribe @@ -53,9 +51,7 @@ class PlayerEventListener { packet.setX(xz[0]); packet.setZ(xz[1]); - event.getPlayer().getChannel().write(packet); + event.getPlayer().getChannel().writeAndFlush(packet); } - - event.getPlayer().getChannel().flush(); } } From c2aa48f14ff188a86f8020208db8d252ac769bb5 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 18 Aug 2018 22:08:43 +0300 Subject: [PATCH 10/71] =?UTF-8?q?fix:=20=D0=B1=D0=BE=D0=BB=D0=B5=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=BE=D0=B5=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network/proto_1_12_2/netty/PacketDecoder.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java index dc1090b..57b1832 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java @@ -51,13 +51,19 @@ public class PacketDecoder extends ByteToMessageDecoder { Class packetClass = state.getClientSidePacket(packetId); if (packetClass == null) { log.warn("Unknown packet: {}:0x{}", state.name(), hexPacketId); - in.skipBytes(packetSize - rb); + in.skipBytes(in.readableBytes()); } else { netStream.setDataSize(packetSize - rb); CSPacket packet = packetClass.newInstance(); - packet.readSelf(netStream); - log.debug("Known packet: {}:{}", state.name(), packet.toString()); - out.add(packet); + try { + packet.readSelf(netStream); + log.debug("Known packet: {}:{}", state.name(), packet.toString()); + out.add(packet); + } catch (Exception e) { + log.warn("Known packet: {}:{}. But throw exception. See debug log.", state.name(), packet.getClass().getSimpleName()); + log.debug("Read packet", e); + in.skipBytes(in.readableBytes()); + } } } } From fcefba29acf1ad4ad7293288c866a34a73984723 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 18 Aug 2018 22:22:20 +0300 Subject: [PATCH 11/71] =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BA=D0=B5=D1=82:=20EntityActionPacket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/core/network/proto_1_12_2/State.java | 1 + .../packets/EntityActionPacket.java | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/EntityActionPacket.java diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java index 8d52cf5..9ff4d79 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java @@ -80,6 +80,7 @@ public enum State { .put(0x0D, PlayerPositionPacket.class) .put(0x0E, PlayerPositionAndLookPacket.class) .put(0x0F, PlayerLookPacket.class) + .put(0x15, EntityActionPacket.class) .put(0x1A, HeldItemChangePacket.class) .put(0x1D, AnimationPacket.class) .build(), diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/EntityActionPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/EntityActionPacket.java new file mode 100644 index 0000000..0e02a01 --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/EntityActionPacket.java @@ -0,0 +1,45 @@ +package mc.core.network.proto_1_12_2.packets; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import mc.core.network.CSPacket; +import mc.core.network.NetInputStream; + +import java.util.Arrays; + +@Getter +public class EntityActionPacket implements CSPacket { + @RequiredArgsConstructor + public enum Action { + START_SNEAKING(0), + STOP_SNEAKING(1), + LEAVE_BED(2), // Leave bed is only sent when the “Leave Bed” button is clicked on the sleep GUI, not when waking up due today time. + START_SPRINTING(3), + STOP_SPRINTING(4), + START_JUMP_WITH_HORSE(5), + STOP_JUMP_WITH_HORSE(6), + OPEN_HORSE_INVENTORY(7), // Open horse inventory is only sent when pressing the inventory key (default: E) while on a horse — all other methods of opening a horse's inventory (involving right-clicking or shift-right-clicking it) do not use this packet. + START_FLYING_WITH_ELYTRA(8); + + public static Action getById(final int id) { + return Arrays.stream(Action.values()) + .filter(action -> action.id == id) + .findFirst() + .orElse(null); + } + + @Getter + private final int id; + } + + private int entityId; + private Action action; + private int jumpBoost; // Only used by the “start jump with horse” action, in which case it ranges from 0 to 100. In all other cases it is 0. + + @Override + public void readSelf(NetInputStream netStream) { + entityId = netStream.readVarInt(); + action = Action.getById(netStream.readVarInt()); + jumpBoost = netStream.readVarInt(); + } +} From 993f398a62e067f4165221dc73d59e31450835f5 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 18 Aug 2018 22:31:03 +0300 Subject: [PATCH 12/71] =?UTF-8?q?=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=B0?= =?UTF-8?q?=20PlayerAbilitiesPacket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/core/network/proto_1_12_2/State.java | 1 + .../packets/PlayerAbilitiesPacket.java | 20 ++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java index 9ff4d79..0fdce4d 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java @@ -80,6 +80,7 @@ public enum State { .put(0x0D, PlayerPositionPacket.class) .put(0x0E, PlayerPositionAndLookPacket.class) .put(0x0F, PlayerLookPacket.class) + .put(0x13, PlayerAbilitiesPacket.class) .put(0x15, EntityActionPacket.class) .put(0x1A, HeldItemChangePacket.class) .put(0x1D, AnimationPacket.class) diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java index d0397c5..b3a8312 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java @@ -4,22 +4,27 @@ */ package mc.core.network.proto_1_12_2.packets; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +import mc.core.network.CSPacket; +import mc.core.network.NetInputStream; import mc.core.network.NetOutputStream; import mc.core.network.SCPacket; @NoArgsConstructor +@Getter @Setter @ToString -public class PlayerAbilitiesPacket implements SCPacket { +public class PlayerAbilitiesPacket implements SCPacket, CSPacket { private boolean godMode = false; private boolean flying = false; private boolean canFly = false; private boolean instantDestroyBlocks = false; private float flyingSpeed = 0.05f; private float fieldOfView = flyingSpeed; + private float walkingSpeed; @Override public void writeSelf(NetOutputStream netStream) { @@ -33,4 +38,17 @@ public class PlayerAbilitiesPacket implements SCPacket { netStream.writeFloat(flyingSpeed); netStream.writeFloat(fieldOfView); } + + @Override + public void readSelf(NetInputStream netStream) { + byte flag = netStream.readByte(); + //FIXME треубет проверки + godMode = (flag == 0x08); + canFly = (flag == 0x04); + flying = (flag == 0x02); + instantDestroyBlocks = (flag == 0x01); + + flyingSpeed = netStream.readFloat(); + walkingSpeed = netStream.readFloat(); + } } From 683d62bfdeae0aae72f15eb1651b593a2693208a Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 18 Aug 2018 23:09:19 +0300 Subject: [PATCH 13/71] =?UTF-8?q?core:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20SimpleLog=20=D0=B4=D0=BB=D1=8F=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/build.gradle b/core/build.gradle index 77e3054..d6d32d2 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -12,4 +12,7 @@ dependencies { compile (group: 'com.google.guava', name: 'guava', version: '24.1-jre') /* Named Binary Tags */ compile (group: 'com.flowpowered', name: 'flow-nbt', version: '1.0.0') + + /* Simple log */ + testCompile (group: 'org.slf4j', name: 'slf4j-simple', version: slf4j_version) } From b6120736f32349879f964f3b2b162fa4c328322b Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 18 Aug 2018 23:09:54 +0300 Subject: [PATCH 14/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20(?= =?UTF-8?q?=D0=B4=D0=B5)=D0=BA=D0=BE=D0=BC=D0=BF=D0=B5=D1=80=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F=20XYZ=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BE=D1=80=D0=B4=D0=B8=D0=BD=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/mc/core/utils/CompactedCoords.java | 19 ++++++++++++++++++ .../mc/core/utils/TestCompactedCoords.java | 20 +++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/mc/core/utils/CompactedCoords.java b/core/src/main/java/mc/core/utils/CompactedCoords.java index 8a33b41..43daef0 100644 --- a/core/src/main/java/mc/core/utils/CompactedCoords.java +++ b/core/src/main/java/mc/core/utils/CompactedCoords.java @@ -20,4 +20,23 @@ public class CompactedCoords { (int)(short) (compactValue | 0xFFFF0000) }; } + + private static int floor_double(double value) { + int i = (int)value; + return value < (double)i ? i - 1 : i; + } + + public static long compressXYZ(double x, double y, double z) { + return ((floor_double(x) & 0x3FFFFFF) << 38) + | ((floor_double(y) & 0xFFF) << 26) + | (floor_double(z) & 0x3FFFFFF); + } + + public static double[] uncompressXYZ(long compactValue) { + return new double[]{ + compactValue >> 38, + (compactValue >> 26) & 0x0FFF, + compactValue << 38 >> 38 // is normal? + }; + } } diff --git a/core/src/test/java/mc/core/utils/TestCompactedCoords.java b/core/src/test/java/mc/core/utils/TestCompactedCoords.java index 4150c53..4d3da4e 100644 --- a/core/src/test/java/mc/core/utils/TestCompactedCoords.java +++ b/core/src/test/java/mc/core/utils/TestCompactedCoords.java @@ -8,7 +8,7 @@ import java.util.Random; public class TestCompactedCoords { @Test - public void testSimple() { + public void testXZSimple() { for (int z = -100; z <= 100; z++) { for (int x = -100; x <= 100; x++) { int compressXZ = CompactedCoords.compressXZ(x, z); @@ -21,7 +21,7 @@ public class TestCompactedCoords { } @Test - public void testRandom() { + public void testXZRandom() { Random random = new Random(); int x,z; @@ -42,4 +42,20 @@ public class TestCompactedCoords { Assert.assertEquals(z, xz[1]); } } + +// @Test + public void testXYZSimple() { + for (int z = -100; z <= 100; z++) { + for (int x = -100; x <= 100; x++) { + for (int y = -100; y <= 100; y++) { + long compressXYZ = CompactedCoords.compressXYZ(x, y, z); + double[] xyz = CompactedCoords.uncompressXYZ(compressXYZ); + + Assert.assertEquals(x, xyz[0], 0.001d); + Assert.assertEquals(y, xyz[1], 0.001d); + Assert.assertEquals(z, xyz[2], 0.001d); + } + } + } + } } From 02e348d8ce523df0be9ed8903deee9f3d83a3fac Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 18 Aug 2018 23:11:08 +0300 Subject: [PATCH 15/71] =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BA=D0=B5=D1=82=20PlayerDiggingPacket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/core/network/proto_1_12_2/State.java | 1 + .../packets/PlayerDiggingPacket.java | 75 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java index 0fdce4d..daf2000 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java @@ -81,6 +81,7 @@ public enum State { .put(0x0E, PlayerPositionAndLookPacket.class) .put(0x0F, PlayerLookPacket.class) .put(0x13, PlayerAbilitiesPacket.class) + .put(0x14, PlayerDiggingPacket.class) .put(0x15, EntityActionPacket.class) .put(0x1A, HeldItemChangePacket.class) .put(0x1D, AnimationPacket.class) diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java new file mode 100644 index 0000000..eca5aac --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java @@ -0,0 +1,75 @@ +package mc.core.network.proto_1_12_2.packets; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.ToString; +import mc.core.Location; +import mc.core.network.CSPacket; +import mc.core.network.NetInputStream; +import mc.core.utils.CompactedCoords; + +import java.util.Arrays; + +@Getter +@ToString +public class PlayerDiggingPacket implements CSPacket { + @RequiredArgsConstructor + public enum Status { + STARTED_DIGGING(0), + CANCELLED_DIGGING(1), + FINISHED_DIGGING(2), + DROP_ITEM_STACK(3), + DROP_ITEM(4), + /* Indicates that the currently held item should have its + * state updated such as eating food, pulling back bows, + * using buckets, etc. Location is always set to 0/0/0, + * Face is always set to -Y. + */ + SHOOT_ARROW(5), + FINISH_EATING(5), + SWAP_ITEM_IN_HAND(6); + + public static Status getById(final int id) { + return Arrays.stream(Status.values()) + .filter(status -> status.id == id) + .findFirst() + .orElse(null); + } + + @Getter + private final int id; + } + + @RequiredArgsConstructor + public enum Face { + BOTTOM(0), // -Y + TOP(1), // +Y + NORTH(2), // -Z + SOUTH(3), // +Z + WEST(4), // -X + EAST(5); // +X + + public static Face getById(final int id) { + return Arrays.stream(Face.values()) + .filter(status -> status.id == id) + .findFirst() + .orElse(null); + } + + @Getter + private final int id; + } + + private Status status; + private Location location; + private Face face; + + @Override + public void readSelf(NetInputStream netStream) { + status = Status.getById(netStream.readVarInt()); + long compactCoord = netStream.readLong(); + double[] xyz = CompactedCoords.uncompressXYZ(compactCoord); + location = new Location(xyz[0], xyz[1], xyz[2], null); + face = Face.getById(netStream.readByte()); + } +} From 2c756b59898e5ba563782fa52708630935386b1f Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 18 Aug 2018 23:57:55 +0300 Subject: [PATCH 16/71] =?UTF-8?q?=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20Face=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= =?UTF-8?q?=20Direction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/network/proto_1_12_2/Direction.java | 26 +++++++++++++++++++ .../packets/PlayerBlockPlacementPacket.java | 4 +++ .../packets/PlayerDiggingPacket.java | 25 +++--------------- 3 files changed, 33 insertions(+), 22 deletions(-) create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/Direction.java create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/Direction.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/Direction.java new file mode 100644 index 0000000..8deb848 --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/Direction.java @@ -0,0 +1,26 @@ +package mc.core.network.proto_1_12_2; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Arrays; + +@RequiredArgsConstructor +public enum Direction { + BOTTOM(0), // -Y + TOP(1), // +Y + NORTH(2), // -Z + SOUTH(3), // +Z + WEST(4), // -X + EAST(5); // +X + + public static Direction getById(final int id) { + return Arrays.stream(Direction.values()) + .filter(direction -> direction.id == id) + .findFirst() + .orElse(null); + } + + @Getter + private final int id; +} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java new file mode 100644 index 0000000..ab9f327 --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java @@ -0,0 +1,4 @@ +package mc.core.network.proto_1_12_2.packets; + +public class PlayerBlockPlacementPacket { +} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java index eca5aac..e60d409 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java @@ -6,6 +6,7 @@ import lombok.ToString; import mc.core.Location; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; +import mc.core.network.proto_1_12_2.Direction; import mc.core.utils.CompactedCoords; import java.util.Arrays; @@ -40,29 +41,9 @@ public class PlayerDiggingPacket implements CSPacket { private final int id; } - @RequiredArgsConstructor - public enum Face { - BOTTOM(0), // -Y - TOP(1), // +Y - NORTH(2), // -Z - SOUTH(3), // +Z - WEST(4), // -X - EAST(5); // +X - - public static Face getById(final int id) { - return Arrays.stream(Face.values()) - .filter(status -> status.id == id) - .findFirst() - .orElse(null); - } - - @Getter - private final int id; - } - private Status status; private Location location; - private Face face; + private Direction face; @Override public void readSelf(NetInputStream netStream) { @@ -70,6 +51,6 @@ public class PlayerDiggingPacket implements CSPacket { long compactCoord = netStream.readLong(); double[] xyz = CompactedCoords.uncompressXYZ(compactCoord); location = new Location(xyz[0], xyz[1], xyz[2], null); - face = Face.getById(netStream.readByte()); + face = Direction.getById(netStream.readByte()); } } From adbb006ec7f0ffd7de9788da0591446d7ef226bf Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 18 Aug 2018 23:58:21 +0300 Subject: [PATCH 17/71] =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BA=D0=B5=D1=82=20PlayerBlockPlacementPacket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/core/network/proto_1_12_2/State.java | 1 + .../packets/PlayerBlockPlacementPacket.java | 29 ++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java index daf2000..a548a3d 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java @@ -85,6 +85,7 @@ public enum State { .put(0x15, EntityActionPacket.class) .put(0x1A, HeldItemChangePacket.class) .put(0x1D, AnimationPacket.class) + .put(0x1F, PlayerBlockPlacementPacket.class) .build(), ImmutableMap., Integer>builder() .put(BossBarPacket.class, 0x0C) diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java index ab9f327..742370e 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java @@ -1,4 +1,31 @@ package mc.core.network.proto_1_12_2.packets; -public class PlayerBlockPlacementPacket { +import lombok.Getter; +import lombok.ToString; +import mc.core.Location; +import mc.core.network.CSPacket; +import mc.core.network.NetInputStream; +import mc.core.network.proto_1_12_2.Direction; +import mc.core.utils.CompactedCoords; + +@Getter +@ToString +public class PlayerBlockPlacementPacket implements CSPacket { + private Location location; + private Direction face; + /** true - main hand; false - off hand */ + private boolean hand; + private float cursorX, cursorY, cursorZ; + + @Override + public void readSelf(NetInputStream netStream) { + long compactedCoords = netStream.readLong(); + double[] xyz = CompactedCoords.uncompressXYZ(compactedCoords); + location = new Location(xyz[0], xyz[1], xyz[2], null); + face = Direction.getById(netStream.readVarInt()); + hand = (netStream.readVarInt() == 1); + cursorX = netStream.readFloat(); + cursorY = netStream.readFloat(); + cursorZ = netStream.readFloat(); + } } From 1941291a5b11d93e9d5d2116ebd494f09323f385 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 25 Aug 2018 18:24:46 +0300 Subject: [PATCH 18/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20ChunkProvider?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/world/chunk/ChunkProvider.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 core/src/main/java/mc/core/world/chunk/ChunkProvider.java diff --git a/core/src/main/java/mc/core/world/chunk/ChunkProvider.java b/core/src/main/java/mc/core/world/chunk/ChunkProvider.java new file mode 100644 index 0000000..4726b63 --- /dev/null +++ b/core/src/main/java/mc/core/world/chunk/ChunkProvider.java @@ -0,0 +1,8 @@ +package mc.core.world.chunk; + +public interface ChunkProvider { + Chunk getChunk(int x , int z); + + void saveChunk(Chunk chunk); + void saveChunk(Chunk... chunks); +} From 3b98a2b5a9bafdcd777ee379aa0c4bbbae6283cc Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 25 Aug 2018 18:28:15 +0300 Subject: [PATCH 19/71] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D1=83=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- settings.gradle | 2 +- {flat_world => simple_world}/README.MD | 8 ++++---- {flat_world => simple_world}/build.gradle | 0 .../src/main/java/mc/world/simple}/SimpleChunk.java | 2 +- .../main/java/mc/world/simple}/SimpleChunkSection.java | 2 +- .../src/main/java/mc/world/simple/SimpleWorld.java | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) rename {flat_world => simple_world}/README.MD (86%) rename {flat_world => simple_world}/build.gradle (100%) rename {flat_world/src/main/java/mc/world/flat => simple_world/src/main/java/mc/world/simple}/SimpleChunk.java (98%) rename {flat_world/src/main/java/mc/world/flat => simple_world/src/main/java/mc/world/simple}/SimpleChunkSection.java (98%) rename flat_world/src/main/java/mc/world/flat/FlatWorld.java => simple_world/src/main/java/mc/world/simple/SimpleWorld.java (96%) diff --git a/settings.gradle b/settings.gradle index 52ad5e4..c7f27f4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,7 @@ rootProject.name = 'mc-server' include('core') // Core -include('flat_world') +include('simple_world') include('vanilla_commands') include('proto_1.12.2') // Protocol 1.12.2 include('proto_1.12.2_netty') // Protocol 1.12.2 (Netty impl.) diff --git a/flat_world/README.MD b/simple_world/README.MD similarity index 86% rename from flat_world/README.MD rename to simple_world/README.MD index ca1899e..02871ed 100644 --- a/flat_world/README.MD +++ b/simple_world/README.MD @@ -1,11 +1,11 @@ -# Flat world +# Simple world -Плоский мир +Простая реализация мира ## Spring bean ```xml - + @@ -31,7 +31,7 @@ `spawn` - точка спавна. При указании точки спавна, указывать шестой параметр `World` не имеет смысла, -т.к. `FlatWorld` всё равно перезапишет этот параметр. +т.к. `SimpleWorld` всё равно перезапишет этот параметр. `layersBlock` - слои блоков. diff --git a/flat_world/build.gradle b/simple_world/build.gradle similarity index 100% rename from flat_world/build.gradle rename to simple_world/build.gradle diff --git a/flat_world/src/main/java/mc/world/flat/SimpleChunk.java b/simple_world/src/main/java/mc/world/simple/SimpleChunk.java similarity index 98% rename from flat_world/src/main/java/mc/world/flat/SimpleChunk.java rename to simple_world/src/main/java/mc/world/simple/SimpleChunk.java index 13d81f6..0cd0abf 100644 --- a/flat_world/src/main/java/mc/world/flat/SimpleChunk.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunk.java @@ -1,4 +1,4 @@ -package mc.world.flat; +package mc.world.simple; import lombok.Getter; import lombok.extern.slf4j.Slf4j; diff --git a/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java similarity index 98% rename from flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java rename to simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java index 7b3265e..3fdf5ae 100644 --- a/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java @@ -2,7 +2,7 @@ * DmitriyMX * 2018-04-28 */ -package mc.world.flat; +package mc.world.simple; import mc.core.exception.ResourceUnloadedException; import mc.core.world.Biome; diff --git a/flat_world/src/main/java/mc/world/flat/FlatWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java similarity index 96% rename from flat_world/src/main/java/mc/world/flat/FlatWorld.java rename to simple_world/src/main/java/mc/world/simple/SimpleWorld.java index f687e85..aa28baa 100644 --- a/flat_world/src/main/java/mc/world/flat/FlatWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -2,7 +2,7 @@ * DmitriyMX * 2018-04-28 */ -package mc.world.flat; +package mc.world.simple; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -17,7 +17,7 @@ import java.util.ArrayList; import java.util.List; @Slf4j -public class FlatWorld implements World { +public class SimpleWorld implements World { @Getter private final WorldType worldType = WorldType.FLAT; private EntityLocation spawn; From bf8d820848a407692393ffb4275590597e01ef01 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 26 Aug 2018 00:24:59 +0300 Subject: [PATCH 20/71] Hello, Mockito! --- build.gradle | 8 +- core/build.gradle | 3 - .../test/java/mc/core/TestEntityLocation.java | 32 +--- core/src/test/java/mc/core/TestLocation.java | 76 ++-------- .../proto_1_12_2/packets/DummyWorld.java | 138 ------------------ .../packets/TestChunkdataPacket.java | 58 +++++++- 6 files changed, 79 insertions(+), 236 deletions(-) delete mode 100644 proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/DummyWorld.java diff --git a/build.gradle b/build.gradle index 8735a6b..380447c 100644 --- a/build.gradle +++ b/build.gradle @@ -36,8 +36,12 @@ subprojects { /* Components */ compile (group: 'org.projectlombok', name: 'lombok', version: '1.16.16') - /* Test */ + /* JUnit */ testCompile (group: 'junit', name: 'junit', version: '4.12') + /* Simple log */ + testCompile (group: 'org.slf4j', name: 'slf4j-simple', version: slf4j_version) + /* Mockito */ + testCompile (group: 'org.mockito', name: 'mockito-core', version: '1.9.5') } task copyDep(type: Copy) { @@ -63,7 +67,7 @@ task runApp(type: JavaExec) { /* Uncomment, if you used VM args */ //jvmArgs = [ - // "-DspringConfig=spring-flat.xml", + // "-DspringConfig=spring.xml", // "-Dlog4j.configurationFile=log4j2.xml" //] diff --git a/core/build.gradle b/core/build.gradle index d6d32d2..77e3054 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -12,7 +12,4 @@ dependencies { compile (group: 'com.google.guava', name: 'guava', version: '24.1-jre') /* Named Binary Tags */ compile (group: 'com.flowpowered', name: 'flow-nbt', version: '1.0.0') - - /* Simple log */ - testCompile (group: 'org.slf4j', name: 'slf4j-simple', version: slf4j_version) } diff --git a/core/src/test/java/mc/core/TestEntityLocation.java b/core/src/test/java/mc/core/TestEntityLocation.java index 344991d..d1dddf6 100644 --- a/core/src/test/java/mc/core/TestEntityLocation.java +++ b/core/src/test/java/mc/core/TestEntityLocation.java @@ -1,40 +1,16 @@ package mc.core; import mc.core.world.World; -import mc.core.world.WorldType; -import mc.core.world.chunk.Chunk; import org.junit.Assert; import org.junit.Test; +import org.mockito.Mockito; + +import static org.mockito.Mockito.mock; public class TestEntityLocation { @Test public void cloneTest() { - World dummyWorld = new World() { - @Override - public WorldType getWorldType() { - return null; - } - - @Override - public EntityLocation getSpawn() { - return null; - } - - @Override - public void setSpawn(EntityLocation location) { - - } - - @Override - public Chunk getChunk(int x, int z) { - return null; - } - - @Override - public void setChunk(int x, int z, Chunk chunk) { - - } - }; + World dummyWorld = mock(World.class); EntityLocation firstLocation = new EntityLocation(10, 20, 30, 40, 50, dummyWorld); Assert.assertSame("Lost world reference before cloning", dummyWorld, firstLocation.getWorld()); diff --git a/core/src/test/java/mc/core/TestLocation.java b/core/src/test/java/mc/core/TestLocation.java index 9b9cf61..239c2c4 100644 --- a/core/src/test/java/mc/core/TestLocation.java +++ b/core/src/test/java/mc/core/TestLocation.java @@ -1,80 +1,33 @@ package mc.core; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import mc.core.world.Biome; import mc.core.world.World; -import mc.core.world.WorldType; import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; -import org.junit.Assert; +import org.junit.Before; import org.junit.Test; +import org.mockito.stubbing.Answer; import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.*; public class TestLocation { - private class DummyWorld implements World { - @RequiredArgsConstructor - private class DummyChunk implements Chunk { - @Getter - private final int x, z; + private World world; - @Override - public ChunkSection getChunkSection(int height) { - return null; - } + @Before + public void prepareWorld() { + this.world = mock(World.class); + when(world.getChunk(anyInt(), anyInt())).thenAnswer(invocation -> { + Object[] args = invocation.getArguments(); - @Override - public void setChunkSection(int height, ChunkSection chunkSection) { - } + Chunk chunk = mock(Chunk.class); + when(chunk.getX()).thenReturn((int) args[0]); + when(chunk.getZ()).thenReturn((int) args[1]); - @Override - public Biome getBiome(int localX, int localZ) { - return null; - } - - @Override - public void setBiome(int localX, int localZ, Biome biome) { - } - - @Override - public World getWorld() { - return null; - } - - @Override - public void setWorld(World world) { - } - } - - @Override - public WorldType getWorldType() { - return null; - } - - @Override - public EntityLocation getSpawn() { - return null; - } - - @Override - public void setSpawn(EntityLocation location) { - } - - @Override - public Chunk getChunk(int x, int z) { - return new DummyChunk(x, z); - } - - @Override - public void setChunk(int x, int z, Chunk chunkSection) { - - } + return chunk; + }); } @Test public void testGetBlockXZ() { - World world = new DummyWorld(); Location location; location = new Location(0d, 0, 0d, world); @@ -120,7 +73,6 @@ public class TestLocation { @Test public void testGetChunk() { - World world = new DummyWorld(); Location location; Chunk chunk; diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/DummyWorld.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/DummyWorld.java deleted file mode 100644 index 52e8a88..0000000 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/DummyWorld.java +++ /dev/null @@ -1,138 +0,0 @@ -package mc.core.network.proto_1_12_2.packets; - -import mc.core.EntityLocation; -import mc.core.world.Biome; -import mc.core.world.World; -import mc.core.world.WorldType; -import mc.core.world.block.Block; -import mc.core.world.block.BlockFactory; -import mc.core.world.block.BlockType; -import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; - -public class DummyWorld implements World { - private class DummyChunkSection implements ChunkSection { - @Override - public int getSkyLight(int x, int y, int z) { - if (y <= 3) return 0; - else return 15; - } - - @Override - public void setSkyLight(int x, int y, int z, int lightLevel) { - } - - @Override - public int getAddition(int x, int y, int z) { - return 0; - } - - @Override - public void setAddition(int x, int y, int z, int value) { - } - - @Override - public Biome getBiome(int localX, int localZ) { - return Biome.PLAINS; - } - - @Override - public int getX() { - return 0; - } - - @Override - public int getY() { - return 0; - } - - @Override - public int getZ() { - return 0; - } - - @Override - public void setBlock(Block block) { - } - - @Override - public Block getBlock(int x, int y, int z) { - BlockFactory blockFactory = new BlockFactory(); - - if (y == 0) return blockFactory.create(BlockType.BEDROCK, x, y, z, getWorld()); - else if (y >= 1 && y <= 2) return blockFactory.create(BlockType.DIRT, x, y, z, getWorld()); - else if (y == 3) return blockFactory.create(BlockType.GRASS, x, y, z, getWorld()); - else return blockFactory.create(BlockType.AIR, x, y, z, getWorld()); - } - - @Override - public World getWorld() { - return DummyWorld.this; - } - } - - private class DummyChunk implements Chunk { - @Override - public World getWorld() { - return DummyWorld.this; - } - - @Override - public void setWorld(World world) { - } - - @Override - public ChunkSection getChunkSection(int height) { - if (height < 1) return new DummyChunkSection(); - else return null; - } - - @Override - public void setChunkSection(int height, ChunkSection chunkSection) { - } - - @Override - public Biome getBiome(int localX, int localZ) { - return Biome.PLAINS; - } - - @Override - public void setBiome(int localX, int localZ, Biome biome) { - } - - @Override - public int getX() { - return 0; - } - - @Override - public int getZ() { - return 0; - } - } - - private final Chunk chunk = new DummyChunk(); - - @Override - public WorldType getWorldType() { - return WorldType.FLAT; - } - - @Override - public EntityLocation getSpawn() { - return null; - } - - @Override - public void setSpawn(EntityLocation location) { - } - - @Override - public Chunk getChunk(int x, int z) { - return chunk; - } - - @Override - public void setChunk(int x, int z, Chunk chunk) { - } -} diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java index 05f8528..d4febe9 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java @@ -2,15 +2,27 @@ package mc.core.network.proto_1_12_2.packets; import com.google.common.io.ByteStreams; import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; +import mc.core.world.Biome; import mc.core.world.World; +import mc.core.world.WorldType; +import mc.core.world.block.BlockFactory; +import mc.core.world.block.BlockType; +import mc.core.world.chunk.Chunk; +import mc.core.world.chunk.ChunkSection; import org.junit.Assert; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import java.io.*; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + public class TestChunkdataPacket { private static byte[] expectedPacketData; + private World world; @BeforeClass public static void beforeClassTest() throws IOException { @@ -18,8 +30,48 @@ public class TestChunkdataPacket { expectedPacketData = ByteStreams.toByteArray(inputStream); } - private World createDummyWorld() { - return new DummyWorld(); + @Before + public void prepareWorld() { + final ChunkSection chunkSection = mock(ChunkSection.class); + when(chunkSection.getSkyLight(anyInt(), anyInt(), anyInt())).thenAnswer(invocation -> { + int y = (int)invocation.getArguments()[1]; + + if (y <= 3) return 0; + else return 15; + }); + when(chunkSection.getBiome(anyInt(), anyInt())).thenReturn(Biome.PLAINS); + when(chunkSection.getBlock(anyInt(), anyInt(), anyInt())).thenAnswer(invocation -> { + Object[] args = invocation.getArguments(); + int x = (int) args[0]; + int y = (int) args[1]; + int z = (int) args[2]; + + BlockFactory blockFactory = new BlockFactory(); + + if (y == 0) return blockFactory.create(BlockType.BEDROCK, x, y, z, null); + else if (y >= 1 && y <= 2) return blockFactory.create(BlockType.DIRT, x, y, z, null); + else if (y == 3) return blockFactory.create(BlockType.GRASS, x, y, z, null); + else return blockFactory.create(BlockType.AIR, x, y, z, null); + }); + + world = mock(World.class); + when(world.getWorldType()).thenReturn(WorldType.FLAT); + when(world.getChunk(anyInt(), anyInt())).thenAnswer(invocation -> { + Object[] args = invocation.getArguments(); + + Chunk chunk = mock(Chunk.class); + when(chunk.getX()).thenReturn((int) args[0]); + when(chunk.getZ()).thenReturn((int) args[1]); + when(chunk.getBiome(anyInt(), anyInt())).thenReturn(Biome.PLAINS); + when(chunk.getChunkSection(anyInt())).thenAnswer(invocation1 -> { + int height = (int)invocation1.getArguments()[0]; + + if (height < 1) return chunkSection; + else return null; + }); + + return chunk; + }); } @Test @@ -27,7 +79,7 @@ public class TestChunkdataPacket { ChunkDataPacket packet = new ChunkDataPacket(); packet.setX(0); packet.setZ(0); - packet.setChunk(createDummyWorld().getChunk(0, 0)); + packet.setChunk(world.getChunk(0, 0)); packet.setInitChunk(true); ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); From 5b542913b90b98da3b26133a93f61d67f74200e2 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 26 Aug 2018 00:27:19 +0300 Subject: [PATCH 21/71] optimize imports --- .../test/java/mc/core/TestEntityLocation.java | 18 +++++++++--------- core/src/test/java/mc/core/TestLocation.java | 1 - .../mc/core/utils/TestCompactedCoords.java | 17 +++++++++-------- .../packets/TestChunkdataPacket.java | 10 ++++++---- 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/core/src/test/java/mc/core/TestEntityLocation.java b/core/src/test/java/mc/core/TestEntityLocation.java index d1dddf6..06fbfa7 100644 --- a/core/src/test/java/mc/core/TestEntityLocation.java +++ b/core/src/test/java/mc/core/TestEntityLocation.java @@ -1,10 +1,10 @@ package mc.core; import mc.core.world.World; -import org.junit.Assert; import org.junit.Test; -import org.mockito.Mockito; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; import static org.mockito.Mockito.mock; public class TestEntityLocation { @@ -13,14 +13,14 @@ public class TestEntityLocation { World dummyWorld = mock(World.class); EntityLocation firstLocation = new EntityLocation(10, 20, 30, 40, 50, dummyWorld); - Assert.assertSame("Lost world reference before cloning", dummyWorld, firstLocation.getWorld()); + assertSame("Lost world reference before cloning", dummyWorld, firstLocation.getWorld()); EntityLocation locationClone = firstLocation.clone(); - Assert.assertEquals("X mismatch", firstLocation.getX(), locationClone.getX(), 0); - Assert.assertEquals("Y mismatch", firstLocation.getY(), locationClone.getY(), 0); - Assert.assertEquals("Z mismatch", firstLocation.getZ(), locationClone.getZ(), 0); - Assert.assertEquals("Pitch mismatch", firstLocation.getPitch(), locationClone.getPitch(), 0); - Assert.assertEquals("Yaw mismatch", firstLocation.getYaw(), locationClone.getYaw(), 0); - Assert.assertSame("World mismatch (accidental clone of the World object?)", firstLocation.getWorld(), locationClone.getWorld()); + assertEquals("X mismatch", firstLocation.getX(), locationClone.getX(), 0); + assertEquals("Y mismatch", firstLocation.getY(), locationClone.getY(), 0); + assertEquals("Z mismatch", firstLocation.getZ(), locationClone.getZ(), 0); + assertEquals("Pitch mismatch", firstLocation.getPitch(), locationClone.getPitch(), 0); + assertEquals("Yaw mismatch", firstLocation.getYaw(), locationClone.getYaw(), 0); + assertSame("World mismatch (accidental clone of the World object?)", firstLocation.getWorld(), locationClone.getWorld()); } } diff --git a/core/src/test/java/mc/core/TestLocation.java b/core/src/test/java/mc/core/TestLocation.java index 239c2c4..3d6715e 100644 --- a/core/src/test/java/mc/core/TestLocation.java +++ b/core/src/test/java/mc/core/TestLocation.java @@ -4,7 +4,6 @@ import mc.core.world.World; import mc.core.world.chunk.Chunk; import org.junit.Before; import org.junit.Test; -import org.mockito.stubbing.Answer; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; diff --git a/core/src/test/java/mc/core/utils/TestCompactedCoords.java b/core/src/test/java/mc/core/utils/TestCompactedCoords.java index 4d3da4e..0aef3da 100644 --- a/core/src/test/java/mc/core/utils/TestCompactedCoords.java +++ b/core/src/test/java/mc/core/utils/TestCompactedCoords.java @@ -1,10 +1,11 @@ package mc.core.utils; -import org.junit.Assert; import org.junit.Test; import java.util.Random; +import static org.junit.Assert.assertEquals; + public class TestCompactedCoords { @Test @@ -14,8 +15,8 @@ public class TestCompactedCoords { int compressXZ = CompactedCoords.compressXZ(x, z); int[] xz = CompactedCoords.uncompressXZ(compressXZ); - Assert.assertEquals(x, xz[0]); - Assert.assertEquals(z, xz[1]); + assertEquals(x, xz[0]); + assertEquals(z, xz[1]); } } } @@ -38,8 +39,8 @@ public class TestCompactedCoords { int compressXZ = CompactedCoords.compressXZ(x, z); int[] xz = CompactedCoords.uncompressXZ(compressXZ); - Assert.assertEquals(x, xz[0]); - Assert.assertEquals(z, xz[1]); + assertEquals(x, xz[0]); + assertEquals(z, xz[1]); } } @@ -51,9 +52,9 @@ public class TestCompactedCoords { long compressXYZ = CompactedCoords.compressXYZ(x, y, z); double[] xyz = CompactedCoords.uncompressXYZ(compressXYZ); - Assert.assertEquals(x, xyz[0], 0.001d); - Assert.assertEquals(y, xyz[1], 0.001d); - Assert.assertEquals(z, xyz[2], 0.001d); + assertEquals(x, xyz[0], 0.001d); + assertEquals(y, xyz[1], 0.001d); + assertEquals(z, xyz[2], 0.001d); } } } diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java index d4febe9..ba9147a 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java @@ -9,13 +9,15 @@ import mc.core.world.block.BlockFactory; import mc.core.world.block.BlockType; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkSection; -import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import java.io.*; +import java.io.IOException; +import java.io.InputStream; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -86,7 +88,7 @@ public class TestChunkdataPacket { packet.writeSelf(netStream); byte[] actualPacketData = netStream.toByteArray(); - Assert.assertEquals(expectedPacketData.length, actualPacketData.length); - Assert.assertArrayEquals(expectedPacketData, actualPacketData); + assertEquals(expectedPacketData.length, actualPacketData.length); + assertArrayEquals(expectedPacketData, actualPacketData); } } From 15ba4aeda9d65897851ede1dfd5a56c0c5ff63b7 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 26 Aug 2018 00:34:02 +0300 Subject: [PATCH 22/71] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BC=D0=B5=D1=85=D0=B0=D0=BD=D0=B8=D0=B7=D0=BC=20?= =?UTF-8?q?=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8=20=D1=81?= =?UTF-8?q?=D0=BF=D0=B0=D0=B2=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/world/World.java | 5 ++++- simple_world/src/main/java/mc/world/simple/SimpleWorld.java | 5 ++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/mc/core/world/World.java b/core/src/main/java/mc/core/world/World.java index 20bf437..a6cbf9d 100644 --- a/core/src/main/java/mc/core/world/World.java +++ b/core/src/main/java/mc/core/world/World.java @@ -11,7 +11,10 @@ public interface World { WorldType getWorldType(); EntityLocation getSpawn(); - void setSpawn(EntityLocation location); + void setSpawn(double x, double y, double z, float yaw, float pitch); + default void setSpawn(double x, double y, double z) { + setSpawn(x, y, z, 0f, 0f); + } Chunk getChunk(int x, int z); void setChunk(int x, int z, Chunk chunkSection); diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index aa28baa..179e9f0 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -34,9 +34,8 @@ public class SimpleWorld implements World { } @Override - public void setSpawn(EntityLocation location) { - this.spawn = location; - this.spawn.setWorld(this); + public void setSpawn(double x, double y, double z, float yaw, float pitch) { + this.spawn = new EntityLocation(x, y, z, yaw, pitch, this); } @Override From 06835aa5a2be9e0dca20a90faac4b31297e81c13 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 26 Aug 2018 00:48:33 +0300 Subject: [PATCH 23/71] =?UTF-8?q?=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D0=BE=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D1=81=D1=82=D1=8C=20=D1=81=20Gradle=205?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 380447c..fc4d863 100644 --- a/build.gradle +++ b/build.gradle @@ -33,8 +33,9 @@ subprojects { exclude group: 'commons-logging' } - /* Components */ - compile (group: 'org.projectlombok', name: 'lombok', version: '1.16.16') + /* Lombok */ + annotationProcessor (group: 'org.projectlombok', name: 'lombok', version: '1.16.16') + compileOnly (group: 'org.projectlombok', name: 'lombok', version: '1.16.16') /* JUnit */ testCompile (group: 'junit', name: 'junit', version: '4.12') From 2147c18f81930cd2d202388ed3b1867d055f7a58 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 26 Aug 2018 00:51:55 +0300 Subject: [PATCH 24/71] =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=20World=20=D0=B8=D0=B7=20=D0=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=81=D0=B0=20Chunk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/core/world/chunk/Chunk.java | 4 --- .../java/mc/world/simple/SimpleChunk.java | 30 ++----------------- .../java/mc/world/simple/SimpleWorld.java | 2 +- 3 files changed, 4 insertions(+), 32 deletions(-) diff --git a/core/src/main/java/mc/core/world/chunk/Chunk.java b/core/src/main/java/mc/core/world/chunk/Chunk.java index 9436ccf..0ee2e28 100644 --- a/core/src/main/java/mc/core/world/chunk/Chunk.java +++ b/core/src/main/java/mc/core/world/chunk/Chunk.java @@ -1,7 +1,6 @@ package mc.core.world.chunk; import mc.core.world.Biome; -import mc.core.world.World; public interface Chunk { int getX(); @@ -12,7 +11,4 @@ public interface Chunk { Biome getBiome(int localX, int localZ); void setBiome(int localX, int localZ, Biome biome); - - World getWorld(); - void setWorld(World world); } diff --git a/simple_world/src/main/java/mc/world/simple/SimpleChunk.java b/simple_world/src/main/java/mc/world/simple/SimpleChunk.java index 0cd0abf..aadf810 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleChunk.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunk.java @@ -1,30 +1,20 @@ package mc.world.simple; import lombok.Getter; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import mc.core.exception.ResourceUnloadedException; import mc.core.world.Biome; -import mc.core.world.World; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkSection; -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; - @Slf4j +@RequiredArgsConstructor public class SimpleChunk implements Chunk { @Getter - private int x, z; - private Reference refWorld; + private final int x, z; private ChunkSection chunkSection; private final Biome biome = Biome.PLAINS; - public SimpleChunk(int x, int z, World world) { - this.x = x; - this.z = z; - setWorld(world); - } - @Override public ChunkSection getChunkSection(int height) { return chunkSection; @@ -44,18 +34,4 @@ public class SimpleChunk implements Chunk { public void setBiome(int localX, int localZ, Biome biome) { // ignore } - - @Override - public World getWorld() { - if (refWorld.get() == null) { - throw new ResourceUnloadedException("World unloaded"); - } else { - return refWorld.get(); - } - } - - @Override - public void setWorld(World world) { - this.refWorld = new WeakReference<>(world); - } } diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index 179e9f0..c1b1b19 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -40,7 +40,7 @@ public class SimpleWorld implements World { @Override public Chunk getChunk(int x, int z) { - Chunk chunk = new SimpleChunk(x, z, this); + Chunk chunk = new SimpleChunk(x, z); chunk.setChunkSection(0, chunkSection); return chunk; } From 464a2e7be681be84cb4db34a8ef7a7d8a65db842 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 26 Aug 2018 01:13:21 +0300 Subject: [PATCH 25/71] =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=20World=20=D0=B2=20Location=20=D0=B8=20ChunkSectio?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/mc/core/EntityLocation.java | 42 +++++++++- core/src/main/java/mc/core/Location.java | 43 +--------- .../mc/core/world/block/BlockFactory.java | 8 +- .../mc/core/world/chunk/ChunkSection.java | 2 - .../test/java/mc/core/TestEntityLocation.java | 78 ++++++++++++++++++- core/src/test/java/mc/core/TestLocation.java | 74 +----------------- .../packets/PlayerBlockPlacementPacket.java | 2 +- .../packets/PlayerDiggingPacket.java | 2 +- .../packets/TabCompletePacket.java | 2 +- .../packets/TestChunkdataPacket.java | 8 +- .../mc/world/simple/SimpleChunkSection.java | 24 +----- .../java/mc/world/simple/SimpleWorld.java | 2 +- 12 files changed, 133 insertions(+), 154 deletions(-) diff --git a/core/src/main/java/mc/core/EntityLocation.java b/core/src/main/java/mc/core/EntityLocation.java index 0eec9d2..960fd08 100644 --- a/core/src/main/java/mc/core/EntityLocation.java +++ b/core/src/main/java/mc/core/EntityLocation.java @@ -6,16 +6,24 @@ package mc.core; import lombok.Getter; import lombok.Setter; +import mc.core.exception.ResourceUnloadedException; import mc.core.world.World; +import mc.core.world.chunk.Chunk; +import mc.core.world.chunk.ChunkSection; + +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; public class EntityLocation extends Location implements Cloneable { @Getter @Setter private float yaw, pitch; + private Reference refWorld; public EntityLocation(double x, double y, double z, float yaw, float pitch, World world) { - super(x, y, z, world); + super(x, y, z); setYawPitch(yaw, pitch); + setWorld(world); } public void setYawPitch(float yaw, float pitch) { @@ -27,6 +35,38 @@ public class EntityLocation extends Location implements Cloneable { setYawPitch(entityLocation.yaw, entityLocation.pitch); } + public World getWorld() { + if (refWorld == null) { + return null; + } else if (refWorld.get() == null) { + throw new ResourceUnloadedException("World unloaded"); + } else { + return refWorld.get(); + } + } + + public void setWorld (World world) { + this.refWorld = new WeakReference<>(world); + } + + public Chunk getChunk() { + World world = getWorld(); + if (world == null) { + return null; + } else { + return world.getChunk(getBlockX() >> 4, getBlockZ() >> 4); + } + } + + public ChunkSection getChunkSection() { + Chunk chunk = getChunk(); + if (chunk == null) { + return null; + } else { + return chunk.getChunkSection(getBlockY() >> 4); + } + } + @Override public EntityLocation clone() { return (EntityLocation) super.clone(); diff --git a/core/src/main/java/mc/core/Location.java b/core/src/main/java/mc/core/Location.java index 5d87626..62ca57d 100644 --- a/core/src/main/java/mc/core/Location.java +++ b/core/src/main/java/mc/core/Location.java @@ -6,23 +6,14 @@ package mc.core; import lombok.Getter; import lombok.Setter; -import mc.core.exception.ResourceUnloadedException; -import mc.core.world.World; -import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; - -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; public class Location implements Cloneable { @Getter @Setter private double x, y, z; - private Reference refWorld; - public Location (double x, double y, double z, World world) { + public Location (double x, double y, double z) { setXYZ(x, y, z); - setWorld(world); } public void setXYZ(double x, double y, double z) { @@ -35,20 +26,6 @@ public class Location implements Cloneable { setXYZ(location.x, location.y, location.z); } - public World getWorld() { - if (refWorld == null) { - return null; - } else if (refWorld.get() == null) { - throw new ResourceUnloadedException("World unloaded"); - } else { - return refWorld.get(); - } - } - - public void setWorld (World world) { - this.refWorld = new WeakReference<>(world); - } - public int getBlockX() { return Double.valueOf(Math.floor(x)).intValue(); } @@ -61,24 +38,6 @@ public class Location implements Cloneable { return Double.valueOf(Math.floor(z)).intValue(); } - public Chunk getChunk() { - World world = getWorld(); - if (world == null) { - return null; - } else { - return world.getChunk(getBlockX() >> 4, getBlockZ() >> 4); - } - } - - public ChunkSection getChunkSection() { - Chunk chunk = getChunk(); - if (chunk == null) { - return null; - } else { - return chunk.getChunkSection(getBlockY() >> 4); - } - } - @Override public Location clone() { try { diff --git a/core/src/main/java/mc/core/world/block/BlockFactory.java b/core/src/main/java/mc/core/world/block/BlockFactory.java index caceb58..095e312 100644 --- a/core/src/main/java/mc/core/world/block/BlockFactory.java +++ b/core/src/main/java/mc/core/world/block/BlockFactory.java @@ -5,15 +5,15 @@ import mc.core.world.World; public class BlockFactory { - public Block create(BlockType blockType, int x, int y, int z, World world) { - return new EmbeddedBlock(blockType, x, y, z, world); + public Block create(BlockType blockType, int x, int y, int z) { + return new EmbeddedBlock(blockType, x, y, z); } /** For first-time generation */ private class EmbeddedBlock extends AbstractBlock { - EmbeddedBlock(BlockType type, int x, int y, int z, World world) { + EmbeddedBlock(BlockType type, int x, int y, int z) { super(type); - setLocation(new Location(x,y,z, world)); + setLocation(new Location(x, y, z)); } } } diff --git a/core/src/main/java/mc/core/world/chunk/ChunkSection.java b/core/src/main/java/mc/core/world/chunk/ChunkSection.java index 3c10125..a829963 100644 --- a/core/src/main/java/mc/core/world/chunk/ChunkSection.java +++ b/core/src/main/java/mc/core/world/chunk/ChunkSection.java @@ -24,6 +24,4 @@ public interface ChunkSection { void setAddition(int x, int y, int z, int value); Biome getBiome(int localX, int localZ); - - World getWorld(); } diff --git a/core/src/test/java/mc/core/TestEntityLocation.java b/core/src/test/java/mc/core/TestEntityLocation.java index 06fbfa7..1b8e5fb 100644 --- a/core/src/test/java/mc/core/TestEntityLocation.java +++ b/core/src/test/java/mc/core/TestEntityLocation.java @@ -1,19 +1,37 @@ package mc.core; import mc.core.world.World; +import mc.core.world.chunk.Chunk; +import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; +import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class TestEntityLocation { + private World world; + + @Before + public void prepareWorld() { + this.world = mock(World.class); + when(world.getChunk(anyInt(), anyInt())).thenAnswer(invocation -> { + Object[] args = invocation.getArguments(); + + Chunk chunk = mock(Chunk.class); + when(chunk.getX()).thenReturn((int) args[0]); + when(chunk.getZ()).thenReturn((int) args[1]); + + return chunk; + }); + } + @Test public void cloneTest() { - World dummyWorld = mock(World.class); - - EntityLocation firstLocation = new EntityLocation(10, 20, 30, 40, 50, dummyWorld); - assertSame("Lost world reference before cloning", dummyWorld, firstLocation.getWorld()); + EntityLocation firstLocation = new EntityLocation(10, 20, 30, 40, 50, world); + assertSame("Lost world reference before cloning", world, firstLocation.getWorld()); EntityLocation locationClone = firstLocation.clone(); assertEquals("X mismatch", firstLocation.getX(), locationClone.getX(), 0); @@ -23,4 +41,56 @@ public class TestEntityLocation { assertEquals("Yaw mismatch", firstLocation.getYaw(), locationClone.getYaw(), 0); assertSame("World mismatch (accidental clone of the World object?)", firstLocation.getWorld(), locationClone.getWorld()); } + + @Test + public void testGetChunk() { + EntityLocation location; + Chunk chunk; + + location = new EntityLocation(0d, 0, 0d, 0f, 0f, world); + chunk = location.getChunk(); + assertEquals(0, chunk.getX()); + assertEquals(0, chunk.getZ()); + + location.setXYZ(1d, 0, 1d); + chunk = location.getChunk(); + assertEquals(0, chunk.getX()); + assertEquals(0, chunk.getZ()); + + location.setXYZ(15d, 0, 15d); + chunk = location.getChunk(); + assertEquals(0, chunk.getX()); + assertEquals(0, chunk.getZ()); + + location.setXYZ(16d, 0, 16d); + chunk = location.getChunk(); + assertEquals(1, chunk.getX()); + assertEquals(1, chunk.getZ()); + + location.setXYZ(-0.1d, 0, -0.1d); + chunk = location.getChunk(); + assertEquals(-1, chunk.getX()); + assertEquals(-1, chunk.getZ()); + + location.setXYZ(-1d, 0, -1d); + chunk = location.getChunk(); + assertEquals(-1, chunk.getX()); + assertEquals(-1, chunk.getZ()); + + location.setXYZ(-15d, 0, -15d); + chunk = location.getChunk(); + assertEquals(-1, chunk.getX()); + assertEquals(-1, chunk.getZ()); + + //TODO на практике, таких точных значений не встретиться, но тем не менее данный тест не проходит + //location.setXYZ(-16.0d, 0, -16.0d); + //chunk = location.getChunk(); + //assertEquals(-2, chunk.getX()); + //assertEquals(-2, chunk.getZ()); + + location.setXYZ(-16.001d, 0, -16.001d); + chunk = location.getChunk(); + assertEquals(-2, chunk.getX()); + assertEquals(-2, chunk.getZ()); + } } diff --git a/core/src/test/java/mc/core/TestLocation.java b/core/src/test/java/mc/core/TestLocation.java index 3d6715e..4faef07 100644 --- a/core/src/test/java/mc/core/TestLocation.java +++ b/core/src/test/java/mc/core/TestLocation.java @@ -1,35 +1,15 @@ package mc.core; -import mc.core.world.World; -import mc.core.world.chunk.Chunk; -import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.*; public class TestLocation { - private World world; - - @Before - public void prepareWorld() { - this.world = mock(World.class); - when(world.getChunk(anyInt(), anyInt())).thenAnswer(invocation -> { - Object[] args = invocation.getArguments(); - - Chunk chunk = mock(Chunk.class); - when(chunk.getX()).thenReturn((int) args[0]); - when(chunk.getZ()).thenReturn((int) args[1]); - - return chunk; - }); - } - @Test public void testGetBlockXZ() { Location location; - location = new Location(0d, 0, 0d, world); + location = new Location(0d, 0, 0d); assertEquals(0, location.getBlockX()); assertEquals(0, location.getBlockZ()); @@ -69,56 +49,4 @@ public class TestLocation { assertEquals(-2, location.getBlockX()); assertEquals(-2, location.getBlockZ()); } - - @Test - public void testGetChunk() { - Location location; - Chunk chunk; - - location = new Location(0d, 0, 0d, world); - chunk = location.getChunk(); - assertEquals(0, chunk.getX()); - assertEquals(0, chunk.getZ()); - - location.setXYZ(1d, 0, 1d); - chunk = location.getChunk(); - assertEquals(0, chunk.getX()); - assertEquals(0, chunk.getZ()); - - location.setXYZ(15d, 0, 15d); - chunk = location.getChunk(); - assertEquals(0, chunk.getX()); - assertEquals(0, chunk.getZ()); - - location.setXYZ(16d, 0, 16d); - chunk = location.getChunk(); - assertEquals(1, chunk.getX()); - assertEquals(1, chunk.getZ()); - - location.setXYZ(-0.1d, 0, -0.1d); - chunk = location.getChunk(); - assertEquals(-1, chunk.getX()); - assertEquals(-1, chunk.getZ()); - - location.setXYZ(-1d, 0, -1d); - chunk = location.getChunk(); - assertEquals(-1, chunk.getX()); - assertEquals(-1, chunk.getZ()); - - location.setXYZ(-15d, 0, -15d); - chunk = location.getChunk(); - assertEquals(-1, chunk.getX()); - assertEquals(-1, chunk.getZ()); - - //TODO на практике, таких точных значений не встретиться, но тем не менее данный тест не проходит - //location.setXYZ(-16.0d, 0, -16.0d); - //chunk = location.getChunk(); - //assertEquals(-2, chunk.getX()); - //assertEquals(-2, chunk.getZ()); - - location.setXYZ(-16.001d, 0, -16.001d); - chunk = location.getChunk(); - assertEquals(-2, chunk.getX()); - assertEquals(-2, chunk.getZ()); - } } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java index 742370e..1a1ac1d 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java @@ -21,7 +21,7 @@ public class PlayerBlockPlacementPacket implements CSPacket { public void readSelf(NetInputStream netStream) { long compactedCoords = netStream.readLong(); double[] xyz = CompactedCoords.uncompressXYZ(compactedCoords); - location = new Location(xyz[0], xyz[1], xyz[2], null); + location = new Location(xyz[0], xyz[1], xyz[2]); face = Direction.getById(netStream.readVarInt()); hand = (netStream.readVarInt() == 1); cursorX = netStream.readFloat(); diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java index e60d409..a2bde1e 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java @@ -50,7 +50,7 @@ public class PlayerDiggingPacket implements CSPacket { status = Status.getById(netStream.readVarInt()); long compactCoord = netStream.readLong(); double[] xyz = CompactedCoords.uncompressXYZ(compactCoord); - location = new Location(xyz[0], xyz[1], xyz[2], null); + location = new Location(xyz[0], xyz[1], xyz[2]); face = Direction.getById(netStream.readByte()); } } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java index ffbfe50..09f686d 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java @@ -27,7 +27,7 @@ public class TabCompletePacket implements CSPacket { double y = (compactValue >> 26) & 0xFFF; double z = compactValue << 38 >> 38; // is normal? - this.location = new Location(x, y, z, null); + this.location = new Location(x, y, z); } } } diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java index ba9147a..449a672 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java @@ -50,10 +50,10 @@ public class TestChunkdataPacket { BlockFactory blockFactory = new BlockFactory(); - if (y == 0) return blockFactory.create(BlockType.BEDROCK, x, y, z, null); - else if (y >= 1 && y <= 2) return blockFactory.create(BlockType.DIRT, x, y, z, null); - else if (y == 3) return blockFactory.create(BlockType.GRASS, x, y, z, null); - else return blockFactory.create(BlockType.AIR, x, y, z, null); + if (y == 0) return blockFactory.create(BlockType.BEDROCK, x, y, z); + else if (y >= 1 && y <= 2) return blockFactory.create(BlockType.DIRT, x, y, z); + else if (y == 3) return blockFactory.create(BlockType.GRASS, x, y, z); + else return blockFactory.create(BlockType.AIR, x, y, z); }); world = mock(World.class); diff --git a/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java index 3fdf5ae..a0c8cc6 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java @@ -4,26 +4,20 @@ */ package mc.world.simple; -import mc.core.exception.ResourceUnloadedException; import mc.core.world.Biome; -import mc.core.world.World; import mc.core.world.block.Block; import mc.core.world.block.BlockFactory; import mc.core.world.block.BlockType; import mc.core.world.chunk.ChunkSection; -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; import java.util.List; public class SimpleChunkSection implements ChunkSection { private final BlockFactory blockFactory = new BlockFactory(); private final List layersBlock; - private Reference refWorld; - public SimpleChunkSection(List layersBlock, World world) { + public SimpleChunkSection(List layersBlock) { this.layersBlock = layersBlock; - this.refWorld = new WeakReference<>(world); } @Override @@ -72,22 +66,12 @@ public class SimpleChunkSection implements ChunkSection { @Override public Block getBlock(int x, int y, int z) { if (y >= layersBlock.size()) { - return blockFactory.create(BlockType.AIR, x, y, z, getWorld()); + return blockFactory.create(BlockType.AIR, x, y, z); } BlockType blockType = layersBlock.get(y); - if (blockType == null) return blockFactory.create(BlockType.AIR, x, y, z, getWorld()); + if (blockType == null) return blockFactory.create(BlockType.AIR, x, y, z); - return blockFactory.create(blockType, x, y, z, getWorld()); - } - - @Override - public World getWorld() { - World world = refWorld.get(); - if (world == null) { - throw new ResourceUnloadedException("World unloaded"); - } - - return world; + return blockFactory.create(blockType, x, y, z); } } diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index c1b1b19..76d3217 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -68,6 +68,6 @@ public class SimpleWorld implements World { } } - this.chunkSection = new SimpleChunkSection(layoutsBlock, this); + this.chunkSection = new SimpleChunkSection(layoutsBlock); } } From 24376c391e00e17c2fa27a5bda7de8ff1975d0fe Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 26 Aug 2018 01:20:09 +0300 Subject: [PATCH 26/71] =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20FlatChunkProvider?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/world/simple/FlatChunkProvider.java | 51 +++++++++++++++++++ .../java/mc/world/simple/SimpleWorld.java | 35 +++++-------- 2 files changed, 64 insertions(+), 22 deletions(-) create mode 100644 simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java diff --git a/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java b/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java new file mode 100644 index 0000000..af13eb8 --- /dev/null +++ b/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java @@ -0,0 +1,51 @@ +package mc.world.simple; + +import mc.core.world.block.BlockType; +import mc.core.world.chunk.Chunk; +import mc.core.world.chunk.ChunkProvider; +import mc.core.world.chunk.ChunkSection; + +import java.util.ArrayList; +import java.util.List; + +public class FlatChunkProvider implements ChunkProvider { + private ChunkSection chunkSection; + + public void setLayersBlock(List listOfLayers) { + List layoutsBlock = new ArrayList<>(); + + for (String value : listOfLayers) { + String[] splitValue = value.split(";"); + + BlockType blockType; + try { + blockType = BlockType.valueOf(splitValue[1]); + } catch (IllegalArgumentException e) { + continue; + } + + for (int i = 0; i < Integer.parseInt(splitValue[0]); i++) { + layoutsBlock.add(blockType); + } + } + + this.chunkSection = new SimpleChunkSection(layoutsBlock); + } + + @Override + public Chunk getChunk(int x, int z) { + Chunk chunk = new SimpleChunk(x, z); + chunk.setChunkSection(0, chunkSection); + return chunk; + } + + @Override + public void saveChunk(Chunk chunk) { + //TODO ignore + } + + @Override + public void saveChunk(Chunk... chunks) { + //TODO ignore + } +} diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index 76d3217..4346820 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -5,12 +5,14 @@ package mc.world.simple; import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; import mc.core.world.World; import mc.core.world.WorldType; import mc.core.world.block.BlockType; import mc.core.world.chunk.Chunk; +import mc.core.world.chunk.ChunkProvider; import mc.core.world.chunk.ChunkSection; import java.util.ArrayList; @@ -21,13 +23,14 @@ public class SimpleWorld implements World { @Getter private final WorldType worldType = WorldType.FLAT; private EntityLocation spawn; - private ChunkSection chunkSection; + @Setter + private ChunkProvider chunkProvider; @Override public EntityLocation getSpawn() { if (this.spawn == null) { log.warn("Spawn is not defined! Set spawn [0, 6, 0]"); - this.spawn = new EntityLocation(0d, 6d, 0d, 0f, 0f, this); + setSpawn(0d, 6d, 0d); } return this.spawn; @@ -40,9 +43,7 @@ public class SimpleWorld implements World { @Override public Chunk getChunk(int x, int z) { - Chunk chunk = new SimpleChunk(x, z); - chunk.setChunkSection(0, chunkSection); - return chunk; + return chunkProvider.getChunk(x, z); } @Override @@ -50,24 +51,14 @@ public class SimpleWorld implements World { throw new UnsupportedOperationException(); } + @Deprecated public void setLayersBlock(List listOfLayers) { - List layoutsBlock = new ArrayList<>(); - - for (String value : listOfLayers) { - String[] splitValue = value.split(";"); - - BlockType blockType; - try { - blockType = BlockType.valueOf(splitValue[1]); - } catch (IllegalArgumentException e) { - continue; - } - - for (int i = 0; i < Integer.parseInt(splitValue[0]); i++) { - layoutsBlock.add(blockType); - } + if (chunkProvider == null) { + FlatChunkProvider chunkProvider = new FlatChunkProvider(); + chunkProvider.setLayersBlock(listOfLayers); + this.chunkProvider = chunkProvider; + } else if (this.chunkProvider instanceof FlatChunkProvider) { + ((FlatChunkProvider)chunkProvider).setLayersBlock(listOfLayers); } - - this.chunkSection = new SimpleChunkSection(layoutsBlock); } } From bd37bc86159fa9cd9100cb313a614cdf2d97e778 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 5 Sep 2018 20:23:47 +0300 Subject: [PATCH 27/71] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20gradle=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8?= =?UTF-8?q?=D0=B3=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ core/build.gradle | 1 - flat_world/build.gradle | 1 - proto_1.12.2/build.gradle | 1 - proto_1.12.2_netty/build.gradle | 1 - vanilla_commands/build.gradle | 1 - 6 files changed, 2 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 380447c..af58978 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,8 @@ allprojects { } subprojects { + group 'mc' + ext { slf4j_version = '1.7.21' spring_version = '4.2.5.RELEASE' diff --git a/core/build.gradle b/core/build.gradle index 77e3054..06a5cd9 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1,4 +1,3 @@ -group 'mc' version '1.0-SNAPSHOT' apply plugin: 'maven' diff --git a/flat_world/build.gradle b/flat_world/build.gradle index a9ac8b6..6d1bcee 100644 --- a/flat_world/build.gradle +++ b/flat_world/build.gradle @@ -1,4 +1,3 @@ -group 'mc' version '1.0-SNAPSHOT' dependencies { diff --git a/proto_1.12.2/build.gradle b/proto_1.12.2/build.gradle index 463d1fb..957bc9f 100644 --- a/proto_1.12.2/build.gradle +++ b/proto_1.12.2/build.gradle @@ -1,4 +1,3 @@ -group 'mc' version '1.0-SNAPSHOT' dependencies { diff --git a/proto_1.12.2_netty/build.gradle b/proto_1.12.2_netty/build.gradle index 9704176..0e9cbf0 100644 --- a/proto_1.12.2_netty/build.gradle +++ b/proto_1.12.2_netty/build.gradle @@ -1,4 +1,3 @@ -group 'mc' version '1.0-SNAPSHOT' ext { diff --git a/vanilla_commands/build.gradle b/vanilla_commands/build.gradle index a9ac8b6..6d1bcee 100644 --- a/vanilla_commands/build.gradle +++ b/vanilla_commands/build.gradle @@ -1,4 +1,3 @@ -group 'mc' version '1.0-SNAPSHOT' dependencies { From bd72950db59215dfcc468045daecab59d65b6bbf Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 6 Sep 2018 12:42:16 +0300 Subject: [PATCH 28/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20H2db?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- h2_playermanager/build.gradle | 16 ++++++++ .../java/mc/core/h2db/TestH2Database.java | 38 +++++++++++++++++++ .../src/test/resources/springTest.xml | 21 ++++++++++ .../src/test/resources/sqls/create_tables.sql | 11 ++++++ settings.gradle | 1 + 5 files changed, 87 insertions(+) create mode 100644 h2_playermanager/build.gradle create mode 100644 h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java create mode 100644 h2_playermanager/src/test/resources/springTest.xml create mode 100644 h2_playermanager/src/test/resources/sqls/create_tables.sql diff --git a/h2_playermanager/build.gradle b/h2_playermanager/build.gradle new file mode 100644 index 0000000..727fc10 --- /dev/null +++ b/h2_playermanager/build.gradle @@ -0,0 +1,16 @@ +version '1.0-SNAPSHOT' + +dependencies { + /* Core */ + compile_excludeCopy project(':core') + + /* Spring */ + compile (group: 'org.springframework', name: 'spring-jdbc', version: spring_version) { + exclude group: 'commons-logging' + } + + /* Database */ + compile (group: 'com.h2database', name: 'h2', version: '1.4.196') + + testCompile (group: 'org.springframework', name: 'spring-test', version: spring_version) +} \ No newline at end of file diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java b/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java new file mode 100644 index 0000000..69b6b12 --- /dev/null +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java @@ -0,0 +1,38 @@ +package mc.core.h2db; + +import org.apache.commons.io.IOUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import javax.annotation.PostConstruct; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = {"classpath:springTest.xml"}) +public class TestH2Database { + @Autowired + private JdbcTemplate jdbcTemplate; + + @PostConstruct + public void init() throws IOException { + jdbcTemplate.execute(IOUtils.resourceToString("/sqls/create_tables.sql", StandardCharsets.UTF_8)); + } + + @Test + public void testConnect() { + final String sql = "SELECT 1"; + jdbcTemplate.execute(sql); + } + + @Test + public void testExistsTable() { + jdbcTemplate.execute("SELECT COUNT(*) FROM players"); + } + + +} diff --git a/h2_playermanager/src/test/resources/springTest.xml b/h2_playermanager/src/test/resources/springTest.xml new file mode 100644 index 0000000..8cebaaf --- /dev/null +++ b/h2_playermanager/src/test/resources/springTest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/h2_playermanager/src/test/resources/sqls/create_tables.sql b/h2_playermanager/src/test/resources/sqls/create_tables.sql new file mode 100644 index 0000000..a7d2209 --- /dev/null +++ b/h2_playermanager/src/test/resources/sqls/create_tables.sql @@ -0,0 +1,11 @@ +CREATE TABLE IF NOT EXISTS players ( + id INT AUTO_INCREMENT, + uuid VARCHAR(36) NOT NULL, + name VARCHAR(16) NOT NULL, + location_x DOUBLE NOT NULL, + location_y DOUBLE NOT NULL, + location_z DOUBLE NOT NULL, + location_yaw FLOAT NOT NULL, + location_pitch FLOAT NOT NULL, + location_world varchar(64) NOT NULL +); \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 52ad5e4..f9dbb2c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,6 +2,7 @@ rootProject.name = 'mc-server' include('core') // Core include('flat_world') +include('h2_playermanager') include('vanilla_commands') include('proto_1.12.2') // Protocol 1.12.2 include('proto_1.12.2_netty') // Protocol 1.12.2 (Netty impl.) From 56bcd7a7304f1764a56a32804c40550d46b1f6f0 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 6 Sep 2018 13:20:59 +0300 Subject: [PATCH 29/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20H2Player?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/player/Player.java | 2 +- .../java/mc/core/player/SimplePlayer.java | 2 +- .../src/main/java/mc/core/h2db/H2Player.java | 23 +++++++++++++++++++ .../netty/handlers/LoginHandler.java | 4 ++-- 4 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 h2_playermanager/src/main/java/mc/core/h2db/H2Player.java diff --git a/core/src/main/java/mc/core/player/Player.java b/core/src/main/java/mc/core/player/Player.java index 11c41a3..ad8e8ad 100644 --- a/core/src/main/java/mc/core/player/Player.java +++ b/core/src/main/java/mc/core/player/Player.java @@ -12,7 +12,7 @@ import java.util.UUID; public interface Player { int getId(); - UUID getUUID(); + UUID getUuid(); String getName(); boolean isOnline(); diff --git a/core/src/main/java/mc/core/player/SimplePlayer.java b/core/src/main/java/mc/core/player/SimplePlayer.java index 2472758..e88ae77 100644 --- a/core/src/main/java/mc/core/player/SimplePlayer.java +++ b/core/src/main/java/mc/core/player/SimplePlayer.java @@ -30,7 +30,7 @@ public class SimplePlayer implements Player { } @Override - public UUID getUUID() { + public UUID getUuid() { return uuid; } diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2Player.java b/h2_playermanager/src/main/java/mc/core/h2db/H2Player.java new file mode 100644 index 0000000..c02aa15 --- /dev/null +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2Player.java @@ -0,0 +1,23 @@ +package mc.core.h2db; + +import lombok.Data; +import mc.core.EntityLocation; +import mc.core.network.NetChannel; +import mc.core.player.Player; +import mc.core.player.PlayerSettings; + +import java.util.List; +import java.util.UUID; + +@Data +public class H2Player implements Player { + private int id; + private UUID uuid; + private String name; + private boolean online = false; + private List loadedChunks; + private NetChannel channel; + private EntityLocation location; + private boolean flying = false; + private PlayerSettings settings; +} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java index 771b1c3..0444e64 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java @@ -53,7 +53,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand world.getSpawn())); channel.writeAndFlush(new LoginSuccessPacket( - player.getUUID(), + player.getUuid(), packet.getPlayerName())); channel.attr(ATTR_PLAYER).set(player); channel.attr(ATTR_STATE).set(State.PLAY); @@ -102,7 +102,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand PlayerListItemPacket pkt5 = new PlayerListItemPacket(); pkt5.setAction(PlayerListItemPacket.Action.ADD_PLAYER); PlayerListItemPacket.PlayerData playerData = new PlayerListItemPacket.PlayerData(); - playerData.setUuid(player.getUUID()); + playerData.setUuid(player.getUuid()); playerData.setName(player.getName()); playerData.setGameMode(PlayerMode.CREATIVE); playerData.setPing(0); From e23e530d1e5d0af4980e7d005fa7eeb6239793af Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 6 Sep 2018 13:21:29 +0300 Subject: [PATCH 30/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=B8=D0=BC=D1=8F=20=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=B0=20(World.getName())?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/world/World.java | 1 + flat_world/src/main/java/mc/world/flat/FlatWorld.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/core/src/main/java/mc/core/world/World.java b/core/src/main/java/mc/core/world/World.java index 20bf437..9bb676b 100644 --- a/core/src/main/java/mc/core/world/World.java +++ b/core/src/main/java/mc/core/world/World.java @@ -8,6 +8,7 @@ import mc.core.EntityLocation; import mc.core.world.chunk.Chunk; public interface World { + String getName(); WorldType getWorldType(); EntityLocation getSpawn(); diff --git a/flat_world/src/main/java/mc/world/flat/FlatWorld.java b/flat_world/src/main/java/mc/world/flat/FlatWorld.java index 6ec745f..e080400 100644 --- a/flat_world/src/main/java/mc/world/flat/FlatWorld.java +++ b/flat_world/src/main/java/mc/world/flat/FlatWorld.java @@ -14,6 +14,8 @@ import mc.core.world.chunk.ChunkSection; @Slf4j public class FlatWorld implements World { + @Getter + private final String name = "flat"; @Getter private final WorldType worldType = WorldType.FLAT; private EntityLocation spawn; From a6f4c42b4ef998cb865cb467cc966c0498c997c3 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 6 Sep 2018 13:27:26 +0300 Subject: [PATCH 31/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/mc/core/h2db/H2PlayerSerializer.java | 39 ++++++++++++++++++ .../java/mc/core/h2db/TestH2Database.java | 41 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 h2_playermanager/src/main/java/mc/core/h2db/H2PlayerSerializer.java diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerSerializer.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerSerializer.java new file mode 100644 index 0000000..80102cd --- /dev/null +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerSerializer.java @@ -0,0 +1,39 @@ +package mc.core.h2db; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; + +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; + +public class H2PlayerSerializer { + private static final String SQL_INSERT = "INSERT INTO players " + + "(uuid, name, location_x, location_y, location_z, location_yaw, location_pitch, location_world) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; + + public static void serialize(final H2Player player, final JdbcTemplate jdbcTemplate) throws SQLException { + KeyHolder keyHolder = new GeneratedKeyHolder(); + int affectedRows = jdbcTemplate.update(connection -> { + PreparedStatement stmt = connection.prepareStatement(SQL_INSERT, Statement.RETURN_GENERATED_KEYS); + + stmt.setString(1, player.getUuid().toString()); + stmt.setString(2, player.getName()); + stmt.setDouble(3, player.getLocation().getX()); + stmt.setDouble(4, player.getLocation().getY()); + stmt.setDouble(5, player.getLocation().getZ()); + stmt.setFloat(6, player.getLocation().getYaw()); + stmt.setFloat(7, player.getLocation().getPitch()); + stmt.setString(8, player.getLocation().getWorld().getName()); + + return stmt; + }, keyHolder); + + if (affectedRows == 0) { + throw new SQLException("Serialize player failed, no rows affected."); + } + + player.setId(keyHolder.getKey().intValue()); + } +} diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java b/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java index 69b6b12..1636884 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java @@ -1,5 +1,7 @@ package mc.core.h2db; +import mc.core.EntityLocation; +import mc.core.world.World; import org.apache.commons.io.IOUtils; import org.junit.Test; import org.junit.runner.RunWith; @@ -11,16 +13,37 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.PostConstruct; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.sql.SQLException; +import java.util.UUID; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:springTest.xml"}) public class TestH2Database { @Autowired private JdbcTemplate jdbcTemplate; + private World mockWorld; + + private void createMockWorld() { + mockWorld = mock(World.class); + when(mockWorld.getName()).thenReturn("mock_world"); + } @PostConstruct public void init() throws IOException { jdbcTemplate.execute(IOUtils.resourceToString("/sqls/create_tables.sql", StandardCharsets.UTF_8)); + createMockWorld(); + } + + private H2Player buildPlayer(final String name, final EntityLocation location) { + H2Player player = new H2Player(); + player.setUuid(UUID.randomUUID()); + player.setName(name); + player.setLocation(location.clone()); + return player; } @Test @@ -34,5 +57,23 @@ public class TestH2Database { jdbcTemplate.execute("SELECT COUNT(*) FROM players"); } + @Test + public void testSerialize() throws SQLException { + final H2Player player = buildPlayer("player1", new EntityLocation(1.5d, 6.8d, 0.01d, 0f, 36.9f, mockWorld)); + H2PlayerSerializer.serialize(player, jdbcTemplate); + assertEquals(1, player.getId()); + + final String sql = "SELECT * FROM players WHERE id = ?"; + jdbcTemplate.query(sql, new Object[]{player.getId()}, (resultSet) -> { + assertEquals(player.getId(), resultSet.getInt("id")); + assertEquals(player.getName(), resultSet.getString("name")); + assertEquals(player.getLocation().getX(), resultSet.getDouble("location_x"), 0.01d); + assertEquals(player.getLocation().getY(), resultSet.getDouble("location_y"), 0.01d); + assertEquals(player.getLocation().getZ(), resultSet.getDouble("location_z"), 0.01d); + assertEquals(player.getLocation().getYaw(), resultSet.getFloat("location_yaw"), 0.01f); + assertEquals(player.getLocation().getPitch(), resultSet.getFloat("location_pitch"), 0.01f); + assertEquals(player.getLocation().getWorld().getName(), resultSet.getString("location_world")); + }); + } } From ef7bde7138571e730e3eed46a1b0f2bba17455ed Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 7 Sep 2018 20:50:20 +0300 Subject: [PATCH 32/71] =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20xml=20=D0=BD=D0=B0=20class?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/mc/core/h2db/SpringConfig.java | 38 +++++++++++++++++++ .../java/mc/core/h2db/TestH2Database.java | 11 +----- .../src/test/resources/springTest.xml | 21 ---------- 3 files changed, 40 insertions(+), 30 deletions(-) create mode 100644 h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java delete mode 100644 h2_playermanager/src/test/resources/springTest.xml diff --git a/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java b/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java new file mode 100644 index 0000000..4e18747 --- /dev/null +++ b/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java @@ -0,0 +1,38 @@ +package mc.core.h2db; + +import mc.core.world.World; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DriverManagerDataSource; + +import javax.sql.DataSource; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@Configuration +public class SpringConfig { + @Bean + public World mockWorld() { + World mockWorld = mock(World.class); + when(mockWorld.getName()).thenReturn("mock_world"); + return mockWorld; + } + + @Bean + public DataSource dataSource() { + DriverManagerDataSource dmds = new DriverManagerDataSource(); + dmds.setDriverClassName("org.h2.Driver"); + dmds.setUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"); + dmds.setUsername("sa"); + return dmds; + } + + @Bean + public JdbcTemplate jdbcTemplate(DataSource dataSource) { + JdbcTemplate jdbcTemplate = new JdbcTemplate(); + jdbcTemplate.setDataSource(dataSource); + return jdbcTemplate; + } +} diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java b/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java index 1636884..77a2292 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java @@ -17,25 +17,18 @@ import java.sql.SQLException; import java.util.UUID; import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = {"classpath:springTest.xml"}) +@ContextConfiguration(classes = {SpringConfig.class}) public class TestH2Database { @Autowired private JdbcTemplate jdbcTemplate; + @Autowired private World mockWorld; - private void createMockWorld() { - mockWorld = mock(World.class); - when(mockWorld.getName()).thenReturn("mock_world"); - } - @PostConstruct public void init() throws IOException { jdbcTemplate.execute(IOUtils.resourceToString("/sqls/create_tables.sql", StandardCharsets.UTF_8)); - createMockWorld(); } private H2Player buildPlayer(final String name, final EntityLocation location) { diff --git a/h2_playermanager/src/test/resources/springTest.xml b/h2_playermanager/src/test/resources/springTest.xml deleted file mode 100644 index 8cebaaf..0000000 --- a/h2_playermanager/src/test/resources/springTest.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file From ea1e159c871524a3557ccd384f246bdadebd86d1 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 7 Sep 2018 22:18:29 +0300 Subject: [PATCH 33/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=81=D1=80=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20Locati?= =?UTF-8?q?on's?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/mc/core/EntityLocation.java | 17 ++++++++ core/src/main/java/mc/core/Location.java | 17 ++++++++ .../test/java/mc/core/TestEntityLocation.java | 40 +++++++++++++++++-- core/src/test/java/mc/core/TestLocation.java | 19 +++++++++ 4 files changed, 89 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/mc/core/EntityLocation.java b/core/src/main/java/mc/core/EntityLocation.java index 0eec9d2..56b4605 100644 --- a/core/src/main/java/mc/core/EntityLocation.java +++ b/core/src/main/java/mc/core/EntityLocation.java @@ -8,6 +8,8 @@ import lombok.Getter; import lombok.Setter; import mc.core.world.World; +import java.util.Objects; + public class EntityLocation extends Location implements Cloneable { @Getter @Setter @@ -31,4 +33,19 @@ public class EntityLocation extends Location implements Cloneable { public EntityLocation clone() { return (EntityLocation) super.clone(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + EntityLocation that = (EntityLocation) o; + return Float.compare(that.yaw, yaw) == 0 && + Float.compare(that.pitch, pitch) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), yaw, pitch); + } } diff --git a/core/src/main/java/mc/core/Location.java b/core/src/main/java/mc/core/Location.java index 4a4c1b4..60afc2b 100644 --- a/core/src/main/java/mc/core/Location.java +++ b/core/src/main/java/mc/core/Location.java @@ -13,6 +13,7 @@ import mc.core.world.chunk.ChunkSection; import java.lang.ref.Reference; import java.lang.ref.WeakReference; +import java.util.Objects; public class Location implements Cloneable { @Getter @@ -88,4 +89,20 @@ public class Location implements Cloneable { return null; } } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Location location = (Location) obj; + return Double.compare(location.x, x) == 0 && + Double.compare(location.y, y) == 0 && + Double.compare(location.z, z) == 0 && + Objects.equals(refWorld.get(), location.refWorld.get()); + } + + @Override + public int hashCode() { + return Objects.hash(x, y, z, refWorld.get()); + } } diff --git a/core/src/test/java/mc/core/TestEntityLocation.java b/core/src/test/java/mc/core/TestEntityLocation.java index 06fbfa7..25ac1d7 100644 --- a/core/src/test/java/mc/core/TestEntityLocation.java +++ b/core/src/test/java/mc/core/TestEntityLocation.java @@ -1,19 +1,30 @@ package mc.core; import mc.core.world.World; +import org.junit.Before; import org.junit.Test; +import java.util.concurrent.ThreadLocalRandom; + import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertSame; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class TestEntityLocation { + private World mockWorld; + + @Before + public void before() { + mockWorld = mock(World.class); + when(mockWorld.getName()).thenReturn("mock_world"); + } + @Test public void cloneTest() { - World dummyWorld = mock(World.class); - - EntityLocation firstLocation = new EntityLocation(10, 20, 30, 40, 50, dummyWorld); - assertSame("Lost world reference before cloning", dummyWorld, firstLocation.getWorld()); + EntityLocation firstLocation = new EntityLocation(10, 20, 30, 40, 50, mockWorld); + assertSame("Lost world reference before cloning", mockWorld, firstLocation.getWorld()); EntityLocation locationClone = firstLocation.clone(); assertEquals("X mismatch", firstLocation.getX(), locationClone.getX(), 0); @@ -23,4 +34,25 @@ public class TestEntityLocation { assertEquals("Yaw mismatch", firstLocation.getYaw(), locationClone.getYaw(), 0); assertSame("World mismatch (accidental clone of the World object?)", firstLocation.getWorld(), locationClone.getWorld()); } + + @Test + public void testEquals() { + final ThreadLocalRandom rnd = ThreadLocalRandom.current(); + final double minD = 0.0d, maxD = 10.0d; + final float minF = 0.0f, maxF = 359.9f; + final double x = rnd.nextDouble(minD, maxD); + final double y = rnd.nextDouble(minD, maxD); + final double z = rnd.nextDouble(minD, maxD); + final float yaw = rnd.nextFloat() * (maxF - minF) + minF; + final float pitch = rnd.nextFloat() * (maxF - minF) + minF; + + EntityLocation loc1 = new EntityLocation(x, y, z, yaw, pitch, mockWorld); + EntityLocation loc2 = new EntityLocation(x, y, z, yaw, pitch, mockWorld); + assertEquals(loc1, loc2); + + loc2 = new EntityLocation(x+3, y+1, z+2, yaw, pitch, mockWorld); + assertNotEquals(loc1, loc2); + loc2 = new EntityLocation(x, y, z, yaw+5, pitch-1, mockWorld); + assertNotEquals(loc1, loc2); + } } diff --git a/core/src/test/java/mc/core/TestLocation.java b/core/src/test/java/mc/core/TestLocation.java index 3d6715e..18d537e 100644 --- a/core/src/test/java/mc/core/TestLocation.java +++ b/core/src/test/java/mc/core/TestLocation.java @@ -5,7 +5,10 @@ import mc.core.world.chunk.Chunk; import org.junit.Before; import org.junit.Test; +import java.util.concurrent.ThreadLocalRandom; + import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.mockito.Mockito.*; public class TestLocation { @@ -121,4 +124,20 @@ public class TestLocation { assertEquals(-2, chunk.getX()); assertEquals(-2, chunk.getZ()); } + + @Test + public void testEquals() { + final ThreadLocalRandom rnd = ThreadLocalRandom.current(); + final double minD = 0.0d, maxD = 10.0d; + final double x = rnd.nextDouble(minD, maxD); + final double y = rnd.nextDouble(minD, maxD); + final double z = rnd.nextDouble(minD, maxD); + + Location loc1 = new Location(x, y, z, world); + Location loc2 = new Location(x, y, z, world); + assertEquals(loc1, loc2); + + loc2 = new Location(x+3, y+1, z+2, world); + assertNotEquals(loc1, loc2); + } } From ab5dcc64c2581ebe12d8a3ee1faa89f2b74d0b9e Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 7 Sep 2018 22:34:31 +0300 Subject: [PATCH 34/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=B5=D1=81=D0=B5=D1=80=D0=B8=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20(+=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/mc/core/h2db/H2PlayerSerializer.java | 77 ++++++++++++++++++- .../test/java/mc/core/h2db/SpringConfig.java | 2 + .../java/mc/core/h2db/TestH2Database.java | 64 +++++++++++++-- 3 files changed, 135 insertions(+), 8 deletions(-) diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerSerializer.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerSerializer.java index 80102cd..af5d4c8 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerSerializer.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerSerializer.java @@ -1,19 +1,33 @@ package mc.core.h2db; +import lombok.extern.slf4j.Slf4j; +import mc.core.EntityLocation; +import mc.core.world.World; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Component; import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.util.UUID; +@Slf4j +@Component public class H2PlayerSerializer { + @Autowired + private World world; + @Autowired + private JdbcTemplate jdbcTemplate; + private static final String SQL_INSERT = "INSERT INTO players " + "(uuid, name, location_x, location_y, location_z, location_yaw, location_pitch, location_world) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; - public static void serialize(final H2Player player, final JdbcTemplate jdbcTemplate) throws SQLException { + public void serialize(final H2Player player) throws SQLException { KeyHolder keyHolder = new GeneratedKeyHolder(); int affectedRows = jdbcTemplate.update(connection -> { PreparedStatement stmt = connection.prepareStatement(SQL_INSERT, Statement.RETURN_GENERATED_KEYS); @@ -36,4 +50,65 @@ public class H2PlayerSerializer { player.setId(keyHolder.getKey().intValue()); } + + public void deserialize(H2Player player) { + if (player.getId() > 0) { + selectById(player); + } else if (player.getUuid() != null) { + selectByUuid(player); + } else if (player.getName() != null && !player.getName().isEmpty()) { + selectByName(player); + } + } + + + private void selectById(final H2Player player) { + final String sql = "SELECT * FROM players WHERE id = ? LIMIT 1;"; + jdbcTemplate.query(sql, + ps -> ps.setInt(1, player.getId()), + rs -> { + player.setUuid(UUID.fromString(rs.getString("uuid"))); + player.setName(rs.getString("name")); + deserializeLocation(player, rs); + }); + } + + private void selectByUuid(H2Player player) { + final String sql = "SELECT * FROM players WHERE uuid LIKE ? LIMIT 1;"; + jdbcTemplate.query(sql, + ps -> ps.setString(1, player.getUuid().toString()), + rs -> { + player.setId(rs.getInt("id")); + player.setName(rs.getString("name")); + deserializeLocation(player, rs); + }); + } + + private void selectByName(H2Player player) { + final String sql = "SELECT * FROM players WHERE name LIKE ? LIMIT 1;"; + jdbcTemplate.query(sql, + ps -> ps.setString(1, player.getName()), + rs -> { + player.setId(rs.getInt("id")); + player.setUuid(UUID.fromString(rs.getString("uuid"))); + deserializeLocation(player, rs); + }); + } + + private void deserializeLocation(H2Player player, ResultSet resultSet) throws SQLException { + if (!world.getName().equals(resultSet.getString("location_world"))) { + log.warn("Unknown world \"{}\"", resultSet.getString("location_world")); + log.warn("Using default (spawn) location for user \"{}\"", player.getName()); + player.setLocation(world.getSpawn().clone()); + } else { + player.setLocation(new EntityLocation( + resultSet.getDouble("location_x"), + resultSet.getDouble("location_y"), + resultSet.getDouble("location_z"), + resultSet.getFloat("location_yaw"), + resultSet.getFloat("location_pitch"), + world + )); + } + } } diff --git a/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java b/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java index 4e18747..e4417e3 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java @@ -2,6 +2,7 @@ package mc.core.h2db; import mc.core.world.World; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DriverManagerDataSource; @@ -12,6 +13,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @Configuration +@ComponentScan("mc.core.h2db") public class SpringConfig { @Bean public World mockWorld() { diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java b/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java index 77a2292..f194431 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java @@ -15,6 +15,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; import static org.junit.Assert.assertEquals; @@ -25,18 +26,32 @@ public class TestH2Database { private JdbcTemplate jdbcTemplate; @Autowired private World mockWorld; + @Autowired + private H2PlayerSerializer h2PlayerSerializer; + private H2Player player; @PostConstruct public void init() throws IOException { jdbcTemplate.execute(IOUtils.resourceToString("/sqls/create_tables.sql", StandardCharsets.UTF_8)); } - private H2Player buildPlayer(final String name, final EntityLocation location) { - H2Player player = new H2Player(); + private void createPlayer() { + final ThreadLocalRandom rnd = ThreadLocalRandom.current(); + final double minD = 0.0d, maxD = 10.0d; + final float minF = 0.0f, maxF = 359.9f; + final int minI = 1000, maxI = 9999; + + player = new H2Player(); player.setUuid(UUID.randomUUID()); - player.setName(name); - player.setLocation(location.clone()); - return player; + player.setName("player" + rnd.nextInt(minI, maxI)); + player.setLocation(new EntityLocation( + rnd.nextDouble(minD, maxD), + rnd.nextDouble(minD, maxD), + rnd.nextDouble(minD, maxD), + rnd.nextFloat() * (maxF - minF) + minF, + rnd.nextFloat() * (maxF - minF) + minF, + mockWorld + )); } @Test @@ -52,8 +67,8 @@ public class TestH2Database { @Test public void testSerialize() throws SQLException { - final H2Player player = buildPlayer("player1", new EntityLocation(1.5d, 6.8d, 0.01d, 0f, 36.9f, mockWorld)); - H2PlayerSerializer.serialize(player, jdbcTemplate); + createPlayer(); + h2PlayerSerializer.serialize(player); assertEquals(1, player.getId()); @@ -69,4 +84,39 @@ public class TestH2Database { assertEquals(player.getLocation().getWorld().getName(), resultSet.getString("location_world")); }); } + + @Test + public void testDeserialize() { + createPlayer(); + player.setId(2); + + final String sql = "INSERT INTO players VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);"; + int affectedRows = jdbcTemplate.update(sql, ps -> { + ps.setInt(1, player.getId()); + ps.setString(2, player.getUuid().toString()); + ps.setString(3, player.getName()); + ps.setDouble(4, player.getLocation().getX()); + ps.setDouble(5, player.getLocation().getY()); + ps.setDouble(6, player.getLocation().getZ()); + ps.setFloat(7, player.getLocation().getYaw()); + ps.setFloat(8, player.getLocation().getPitch()); + ps.setString(9, player.getLocation().getWorld().getName()); + }); + assertEquals(1, affectedRows); + + H2Player queryPlayer = new H2Player(); + queryPlayer.setId(2); + h2PlayerSerializer.deserialize(queryPlayer); + assertEquals("Search by id", this.player, queryPlayer); + + queryPlayer = new H2Player(); + queryPlayer.setUuid(player.getUuid()); + h2PlayerSerializer.deserialize(queryPlayer); + assertEquals("Search by UUID", this.player, queryPlayer); + + queryPlayer = new H2Player(); + queryPlayer.setName(player.getName()); + h2PlayerSerializer.deserialize(queryPlayer); + assertEquals("Search by name", this.player, queryPlayer); + } } From 1a2ebcfa0ace7e4d48cbfdb3b34197d8fbeace3d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 8 Sep 2018 02:11:54 +0300 Subject: [PATCH 35/71] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20Location'?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 7 ++-- core/src/test/java/mc/core/SpringConfig.java | 34 +++++++++++++++++++ .../test/java/mc/core/TestEntityLocation.java | 17 +++++++--- core/src/test/java/mc/core/TestLocation.java | 23 +++++-------- 4 files changed, 59 insertions(+), 22 deletions(-) create mode 100644 core/src/test/java/mc/core/SpringConfig.java diff --git a/build.gradle b/build.gradle index af58978..7f5349d 100644 --- a/build.gradle +++ b/build.gradle @@ -35,15 +35,14 @@ subprojects { exclude group: 'commons-logging' } - /* Components */ + /* Lombok */ compile (group: 'org.projectlombok', name: 'lombok', version: '1.16.16') - /* JUnit */ + /* Testing */ testCompile (group: 'junit', name: 'junit', version: '4.12') - /* Simple log */ testCompile (group: 'org.slf4j', name: 'slf4j-simple', version: slf4j_version) - /* Mockito */ testCompile (group: 'org.mockito', name: 'mockito-core', version: '1.9.5') + testCompile (group: 'org.springframework', name: 'spring-test', version: spring_version) } task copyDep(type: Copy) { diff --git a/core/src/test/java/mc/core/SpringConfig.java b/core/src/test/java/mc/core/SpringConfig.java new file mode 100644 index 0000000..9484ce9 --- /dev/null +++ b/core/src/test/java/mc/core/SpringConfig.java @@ -0,0 +1,34 @@ +package mc.core; + +import mc.core.world.World; +import mc.core.world.chunk.Chunk; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@Configuration +public class SpringConfig { + @Bean() + public World simpleMockWorld() { + return mock(World.class); + } + + @Bean + public World chunkedMockWorld() { + World world = mock(World.class); + when(world.getChunk(anyInt(), anyInt())).thenAnswer(invocation -> { + Object[] args = invocation.getArguments(); + + Chunk chunk = mock(Chunk.class); + when(chunk.getX()).thenReturn((int) args[0]); + when(chunk.getZ()).thenReturn((int) args[1]); + + return chunk; + }); + + return world; + } +} diff --git a/core/src/test/java/mc/core/TestEntityLocation.java b/core/src/test/java/mc/core/TestEntityLocation.java index 06fbfa7..5a09623 100644 --- a/core/src/test/java/mc/core/TestEntityLocation.java +++ b/core/src/test/java/mc/core/TestEntityLocation.java @@ -2,18 +2,27 @@ package mc.core; import mc.core.world.World; import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.mockito.Mockito.mock; +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = SpringConfig.class) public class TestEntityLocation { + @Autowired + @Qualifier("simpleMockWorld") + private World mockWorld; + @Test public void cloneTest() { - World dummyWorld = mock(World.class); - - EntityLocation firstLocation = new EntityLocation(10, 20, 30, 40, 50, dummyWorld); - assertSame("Lost world reference before cloning", dummyWorld, firstLocation.getWorld()); + EntityLocation firstLocation = new EntityLocation(10, 20, 30, 40, 50, mockWorld); + assertSame("Lost world reference before cloning", mockWorld, firstLocation.getWorld()); EntityLocation locationClone = firstLocation.clone(); assertEquals("X mismatch", firstLocation.getX(), locationClone.getX(), 0); diff --git a/core/src/test/java/mc/core/TestLocation.java b/core/src/test/java/mc/core/TestLocation.java index 3d6715e..eafd792 100644 --- a/core/src/test/java/mc/core/TestLocation.java +++ b/core/src/test/java/mc/core/TestLocation.java @@ -4,27 +4,22 @@ import mc.core.world.World; import mc.core.world.chunk.Chunk; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = SpringConfig.class) public class TestLocation { + @Autowired + @Qualifier("chunkedMockWorld") private World world; - @Before - public void prepareWorld() { - this.world = mock(World.class); - when(world.getChunk(anyInt(), anyInt())).thenAnswer(invocation -> { - Object[] args = invocation.getArguments(); - - Chunk chunk = mock(Chunk.class); - when(chunk.getX()).thenReturn((int) args[0]); - when(chunk.getZ()).thenReturn((int) args[1]); - - return chunk; - }); - } - @Test public void testGetBlockXZ() { Location location; From 6808ae34f90273f879da8f7994d6100ae933c0a5 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 8 Sep 2018 02:17:27 +0300 Subject: [PATCH 36/71] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20CompactedCoords?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/core/utils/TestCompactedCoords.java | 31 ++++--------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/core/src/test/java/mc/core/utils/TestCompactedCoords.java b/core/src/test/java/mc/core/utils/TestCompactedCoords.java index 0aef3da..bced6f2 100644 --- a/core/src/test/java/mc/core/utils/TestCompactedCoords.java +++ b/core/src/test/java/mc/core/utils/TestCompactedCoords.java @@ -3,40 +3,21 @@ package mc.core.utils; import org.junit.Test; import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; import static org.junit.Assert.assertEquals; public class TestCompactedCoords { @Test - public void testXZSimple() { - for (int z = -100; z <= 100; z++) { - for (int x = -100; x <= 100; x++) { - int compressXZ = CompactedCoords.compressXZ(x, z); - int[] xz = CompactedCoords.uncompressXZ(compressXZ); - - assertEquals(x, xz[0]); - assertEquals(z, xz[1]); - } - } - } - - @Test - public void testXZRandom() { - Random random = new Random(); - int x,z; + public void testXZ() { + ThreadLocalRandom random = ThreadLocalRandom.current(); for (int i = 0; i < 100; i++) { - do { - x = random.nextInt(); - } while (x < Short.MIN_VALUE || x > Short.MAX_VALUE); + final int x = random.nextInt(Short.MIN_VALUE, Short.MAX_VALUE); + final int z = random.nextInt(Short.MIN_VALUE, Short.MAX_VALUE); - do { - z = random.nextInt(); - } while (z < Short.MIN_VALUE || z > Short.MAX_VALUE); - - - int compressXZ = CompactedCoords.compressXZ(x, z); + final int compressXZ = CompactedCoords.compressXZ(x, z); int[] xz = CompactedCoords.uncompressXZ(compressXZ); assertEquals(x, xz[0]); From 09c7626c2dd9b37fbebeb991c9d51318134c4117 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 8 Sep 2018 05:25:24 +0300 Subject: [PATCH 37/71] refactory Location's --- .../main/java/mc/core/CoreEventListener.java | 10 +- .../src/main/java/mc/core/EntityLocation.java | 53 +++++--- core/src/main/java/mc/core/Location.java | 91 -------------- .../mc/core/embedded/FakePlayerManager.java | 5 +- .../mc/core/player/InMemoryPlayerManager.java | 8 +- core/src/main/java/mc/core/player/Player.java | 4 +- .../java/mc/core/player/PlayerManager.java | 3 +- .../java/mc/core/player/SimplePlayer.java | 28 ++++- core/src/main/java/mc/core/world/World.java | 9 ++ .../mc/core/world/block/AbstractBlock.java | 3 +- .../main/java/mc/core/world/block/Block.java | 3 +- .../mc/core/world/block/BlockFactory.java | 11 +- .../mc/core/world/block/BlockLocation.java | 26 ++++ .../test/java/mc/core/TestBlockLocation.java | 40 ++++++ .../test/java/mc/core/TestEntityLocation.java | 102 +++++++++++---- core/src/test/java/mc/core/TestLocation.java | 119 ------------------ .../main/java/mc/world/flat/FlatWorld.java | 10 +- .../mc/world/flat/SimpleChunkSection.java | 12 +- .../network/proto_1_12_2/TeleportManager.java | 3 +- .../packets/PlayerBlockPlacementPacket.java | 6 +- .../packets/PlayerDiggingPacket.java | 6 +- .../packets/PlayerPositionAndLookPacket.java | 3 +- .../packets/TabCompletePacket.java | 6 +- .../packets/TestChunkdataPacket.java | 8 +- .../netty/PlayerEventListener.java | 2 +- .../netty/handlers/LoginHandler.java | 11 +- .../netty/handlers/PlayHandler.java | 6 +- 27 files changed, 269 insertions(+), 319 deletions(-) delete mode 100644 core/src/main/java/mc/core/Location.java create mode 100644 core/src/main/java/mc/core/world/block/BlockLocation.java create mode 100644 core/src/test/java/mc/core/TestBlockLocation.java delete mode 100644 core/src/test/java/mc/core/TestLocation.java diff --git a/core/src/main/java/mc/core/CoreEventListener.java b/core/src/main/java/mc/core/CoreEventListener.java index 070ae5b..201b60e 100644 --- a/core/src/main/java/mc/core/CoreEventListener.java +++ b/core/src/main/java/mc/core/CoreEventListener.java @@ -24,10 +24,10 @@ public class CoreEventListener { log.trace("(GameLoop) playerMoveEventHandler()"); Chunk chunk; - chunk = event.getOldLocation().getChunk(); // Old chunk + chunk = event.getPlayer().getWorld().getChunk(event.getOldLocation()); // Old chunk int ccX = chunk.getX(); int ccZ = chunk.getZ(); - chunk = event.getNewLocation().getChunk(); // Next chunk + chunk = event.getPlayer().getWorld().getChunk(event.getNewLocation()); // Next chunk int ncX = chunk.getX(); int ncZ = chunk.getZ(); @@ -71,7 +71,11 @@ public class CoreEventListener { } } - event.getPlayer().getLocation().setXYZ(event.getNewLocation()); + event.getPlayer().getLocation().setXYZ( + event.getNewLocation().getX(), + event.getNewLocation().getY(), + event.getNewLocation().getZ() + ); // TODO отсылать клиенту только(!) для корректировки позиции // SC_PlayerMoveEvent nextEvent = new SC_PlayerMoveEvent(event.getPlayer()); diff --git a/core/src/main/java/mc/core/EntityLocation.java b/core/src/main/java/mc/core/EntityLocation.java index 0eec9d2..0b4e237 100644 --- a/core/src/main/java/mc/core/EntityLocation.java +++ b/core/src/main/java/mc/core/EntityLocation.java @@ -1,21 +1,29 @@ -/* - * DmitriyMX - * 2018-08-08 - */ package mc.core; -import lombok.Getter; -import lombok.Setter; -import mc.core.world.World; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; -public class EntityLocation extends Location implements Cloneable { - @Getter - @Setter +@NoArgsConstructor +@AllArgsConstructor +@Data +public class EntityLocation implements Cloneable { + private double x, y, z; private float yaw, pitch; - public EntityLocation(double x, double y, double z, float yaw, float pitch, World world) { - super(x, y, z, world); - setYawPitch(yaw, pitch); + public static EntityLocation ZERO() { + return new EntityLocation(0d,0d,0d,0f,0f); + } + + public void set(EntityLocation location) { + setXYZ(location.x, location.y, location.z); + setYawPitch(location.yaw, location.pitch); + } + + public void setXYZ(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; } public void setYawPitch(float yaw, float pitch) { @@ -23,12 +31,25 @@ public class EntityLocation extends Location implements Cloneable { this.pitch = pitch; } - public void setYawPitch(EntityLocation entityLocation) { - setYawPitch(entityLocation.yaw, entityLocation.pitch); + public int getBlockX() { + return Double.valueOf(Math.floor(x)).intValue(); + } + + public int getBlockY() { + return Double.valueOf(Math.floor(y)).intValue(); + } + + public int getBlockZ() { + return Double.valueOf(Math.floor(z)).intValue(); } @Override public EntityLocation clone() { - return (EntityLocation) super.clone(); + try { + return (EntityLocation) super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + return null; + } } } diff --git a/core/src/main/java/mc/core/Location.java b/core/src/main/java/mc/core/Location.java deleted file mode 100644 index 4a4c1b4..0000000 --- a/core/src/main/java/mc/core/Location.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * DmitriyMX - * 2018-08-08 - */ -package mc.core; - -import lombok.Getter; -import lombok.Setter; -import mc.core.exception.ResourceUnloadedException; -import mc.core.world.World; -import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; - -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; - -public class Location implements Cloneable { - @Getter - @Setter - private double x, y, z; - private Reference refWorld; - - public Location (double x, double y, double z, World world) { - setXYZ(x, y, z); - setWorld(world); - } - - public void setXYZ(double x, double y, double z) { - this.x = x; - this.y = y; - this.z = z; - } - - public void setXYZ(Location location) { - setXYZ(location.x, location.y, location.z); - } - - public World getWorld() { - if (refWorld == null) { - return null; - } else if (refWorld.get() == null) { - throw new ResourceUnloadedException("You're trying to get unloaded world"); - } else { - return refWorld.get(); - } - } - - public void setWorld (World world) { - this.refWorld = new WeakReference<>(world); - } - - public int getBlockX() { - return Double.valueOf(Math.floor(x)).intValue(); - } - - public int getBlockY() { - return Double.valueOf(Math.floor(y)).intValue(); - } - - public int getBlockZ() { - return Double.valueOf(Math.floor(z)).intValue(); - } - - public Chunk getChunk() { - World world = getWorld(); - if (world == null) { - return null; - } else { - return world.getChunk(getBlockX() >> 4, getBlockZ() >> 4); - } - } - - public ChunkSection getChunkSection() { - Chunk chunk = getChunk(); - if (chunk == null) { - return null; - } else { - return chunk.getChunkSection(getBlockY() >> 4); - } - } - - @Override - public Location clone() { - try { - return (Location) super.clone(); - } catch (CloneNotSupportedException e) { // такое в нашем случае вообще возможно? - e.printStackTrace(); - return null; - } - } -} diff --git a/core/src/main/java/mc/core/embedded/FakePlayerManager.java b/core/src/main/java/mc/core/embedded/FakePlayerManager.java index 612de62..a1932e3 100644 --- a/core/src/main/java/mc/core/embedded/FakePlayerManager.java +++ b/core/src/main/java/mc/core/embedded/FakePlayerManager.java @@ -12,8 +12,7 @@ import mc.core.player.Player; import mc.core.player.PlayerManager; import mc.core.text.Text; import mc.core.text.Title; -import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; +import mc.core.world.World; import java.util.Collections; import java.util.List; @@ -53,7 +52,7 @@ public class FakePlayerManager implements PlayerManager { private static final NetChannel FAKE_NET_CHANNEL = new FakeNetChannet(); @Override - public Player createPlayer(String name, EntityLocation defaultLocation) { + public Player createPlayer(String name, EntityLocation location, World world) { return null; } diff --git a/core/src/main/java/mc/core/player/InMemoryPlayerManager.java b/core/src/main/java/mc/core/player/InMemoryPlayerManager.java index d373c59..765201e 100644 --- a/core/src/main/java/mc/core/player/InMemoryPlayerManager.java +++ b/core/src/main/java/mc/core/player/InMemoryPlayerManager.java @@ -10,6 +10,7 @@ import mc.core.Config; import mc.core.EntityLocation; import mc.core.network.BroadcastNetChannel; import mc.core.network.NetChannel; +import mc.core.world.World; import org.springframework.beans.factory.annotation.Autowired; import java.util.*; @@ -31,14 +32,13 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable { } @Override - public Player createPlayer(String name, EntityLocation defaultLocation) { + public Player createPlayer(String name, EntityLocation location, World world) { SimplePlayer player = new SimplePlayer(); player.setId(rand.nextInt(10000)); player.setUUID(UUID.nameUUIDFromBytes(name.getBytes())); player.setName(name); - player.getLocation().setXYZ(defaultLocation); - player.getLocation().setYawPitch(defaultLocation); - player.getLocation().setWorld(defaultLocation.getWorld()); + player.getLocation().set(location); + player.setWorld(world); player.setSettings(new PlayerSettings()); synchronized (lock) { diff --git a/core/src/main/java/mc/core/player/Player.java b/core/src/main/java/mc/core/player/Player.java index 11c41a3..175b0cf 100644 --- a/core/src/main/java/mc/core/player/Player.java +++ b/core/src/main/java/mc/core/player/Player.java @@ -6,6 +6,7 @@ package mc.core.player; import mc.core.EntityLocation; import mc.core.network.NetChannel; +import mc.core.world.World; import java.util.List; import java.util.UUID; @@ -23,7 +24,8 @@ public interface Player { void setChannel(NetChannel channel); EntityLocation getLocation(); - //TODO надо определиться - нужно ли здесь setLocation() или нет + World getWorld(); + void setWorld(World world); boolean isFlying(); void setFlying(boolean value); diff --git a/core/src/main/java/mc/core/player/PlayerManager.java b/core/src/main/java/mc/core/player/PlayerManager.java index 8e07d6e..1ac8543 100644 --- a/core/src/main/java/mc/core/player/PlayerManager.java +++ b/core/src/main/java/mc/core/player/PlayerManager.java @@ -6,12 +6,13 @@ package mc.core.player; import mc.core.EntityLocation; import mc.core.network.NetChannel; +import mc.core.world.World; import java.util.List; import java.util.Optional; public interface PlayerManager { - Player createPlayer(String name, EntityLocation defaultLocation); + Player createPlayer(String name, EntityLocation location, World world); void joinServer(Player player); void leftServer(Player player); Optional getPlayer(String name); diff --git a/core/src/main/java/mc/core/player/SimplePlayer.java b/core/src/main/java/mc/core/player/SimplePlayer.java index 2472758..8fb40b6 100644 --- a/core/src/main/java/mc/core/player/SimplePlayer.java +++ b/core/src/main/java/mc/core/player/SimplePlayer.java @@ -6,8 +6,12 @@ package mc.core.player; import lombok.Data; import mc.core.EntityLocation; +import mc.core.exception.ResourceUnloadedException; import mc.core.network.NetChannel; +import mc.core.world.World; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -19,21 +23,33 @@ public class SimplePlayer implements Player { private String name; private boolean online = false; private NetChannel channel; - private EntityLocation location = new EntityLocation(0d, 0d, 0d, 0f, 0f, null); + private EntityLocation location = EntityLocation.ZERO(); + private Reference $refWorld; private boolean flying = false; private PlayerSettings settings; private List loadedChunks = new ArrayList<>(); - public void setLocation(EntityLocation location) { - this.location.setXYZ(location); - this.location.setYawPitch(location); - } - @Override public UUID getUUID() { return uuid; } + @Override + public World getWorld() { + if ($refWorld == null) { + return null; + } else if ($refWorld.get() == null) { + throw new ResourceUnloadedException("You're trying to get unloaded world"); + } else { + return $refWorld.get(); + } + } + + @Override + public void setWorld(World world) { + this.$refWorld = new WeakReference<>(world); + } + public void setUUID(UUID uuid) { this.uuid = uuid; } diff --git a/core/src/main/java/mc/core/world/World.java b/core/src/main/java/mc/core/world/World.java index 20bf437..85f79cb 100644 --- a/core/src/main/java/mc/core/world/World.java +++ b/core/src/main/java/mc/core/world/World.java @@ -5,6 +5,7 @@ package mc.core.world; import mc.core.EntityLocation; +import mc.core.world.block.BlockLocation; import mc.core.world.chunk.Chunk; public interface World { @@ -15,4 +16,12 @@ public interface World { Chunk getChunk(int x, int z); void setChunk(int x, int z, Chunk chunkSection); + + default Chunk getChunk(BlockLocation location) { + return getChunk(location.getX() >> 4, location.getZ() >> 4); + } + + default Chunk getChunk(EntityLocation location) { + return getChunk(location.getBlockX() >> 4, location.getBlockZ() >> 4); + } } diff --git a/core/src/main/java/mc/core/world/block/AbstractBlock.java b/core/src/main/java/mc/core/world/block/AbstractBlock.java index 0c6d90b..b00b8af 100644 --- a/core/src/main/java/mc/core/world/block/AbstractBlock.java +++ b/core/src/main/java/mc/core/world/block/AbstractBlock.java @@ -3,7 +3,6 @@ package mc.core.world.block; import com.flowpowered.nbt.Tag; import lombok.Getter; import lombok.Setter; -import mc.core.Location; import java.util.HashMap; import java.util.Map; @@ -12,7 +11,7 @@ import java.util.stream.Stream; public abstract class AbstractBlock implements Block { @Getter @Setter - private Location location; + private BlockLocation location; @Getter private int light = 0; @Getter diff --git a/core/src/main/java/mc/core/world/block/Block.java b/core/src/main/java/mc/core/world/block/Block.java index d1a392f..b54a7d0 100644 --- a/core/src/main/java/mc/core/world/block/Block.java +++ b/core/src/main/java/mc/core/world/block/Block.java @@ -1,11 +1,10 @@ package mc.core.world.block; -import mc.core.Location; import mc.core.nbt.Taggable; public interface Block extends Taggable{ int getLight(); void setLight(int light); BlockType getBlockType(); - Location getLocation(); + BlockLocation getLocation(); } diff --git a/core/src/main/java/mc/core/world/block/BlockFactory.java b/core/src/main/java/mc/core/world/block/BlockFactory.java index caceb58..04d039f 100644 --- a/core/src/main/java/mc/core/world/block/BlockFactory.java +++ b/core/src/main/java/mc/core/world/block/BlockFactory.java @@ -1,19 +1,16 @@ package mc.core.world.block; -import mc.core.Location; -import mc.core.world.World; - public class BlockFactory { - public Block create(BlockType blockType, int x, int y, int z, World world) { - return new EmbeddedBlock(blockType, x, y, z, world); + public Block create(BlockType blockType, int x, int y, int z) { + return new EmbeddedBlock(blockType, x, y, z); } /** For first-time generation */ private class EmbeddedBlock extends AbstractBlock { - EmbeddedBlock(BlockType type, int x, int y, int z, World world) { + EmbeddedBlock(BlockType type, int x, int y, int z) { super(type); - setLocation(new Location(x,y,z, world)); + setLocation(new BlockLocation(x, y, z)); } } } diff --git a/core/src/main/java/mc/core/world/block/BlockLocation.java b/core/src/main/java/mc/core/world/block/BlockLocation.java new file mode 100644 index 0000000..cabccaa --- /dev/null +++ b/core/src/main/java/mc/core/world/block/BlockLocation.java @@ -0,0 +1,26 @@ +package mc.core.world.block; + +import lombok.*; + +@NoArgsConstructor +@AllArgsConstructor +@Data +public class BlockLocation implements Cloneable { + private int x, y, z; + + public void setXYZ(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public BlockLocation clone() { + try { + return (BlockLocation) super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/core/src/test/java/mc/core/TestBlockLocation.java b/core/src/test/java/mc/core/TestBlockLocation.java new file mode 100644 index 0000000..620919f --- /dev/null +++ b/core/src/test/java/mc/core/TestBlockLocation.java @@ -0,0 +1,40 @@ +package mc.core; + +import mc.core.world.block.BlockLocation; +import org.junit.Before; +import org.junit.Test; + +import java.util.concurrent.ThreadLocalRandom; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +public class TestBlockLocation { + private static final ThreadLocalRandom rnd = ThreadLocalRandom.current(); + private static final int minI = 0, maxI = 10; + private int x, y, z; + + @Before + public void before() { + x = rnd.nextInt(minI, maxI); + y = rnd.nextInt(minI, maxI); + z = rnd.nextInt(minI, maxI); + } + + @Test + public void testEquals() { + BlockLocation loc1 = new BlockLocation(x, y, z); + BlockLocation loc2 = new BlockLocation(x, y, z); + assertEquals(loc1, loc2); + + loc2 = new BlockLocation(x+1, y+2, z-3); + assertNotEquals(loc1, loc2); + } + + @Test + public void testClone() { + BlockLocation locOrig = new BlockLocation(x, y, z); + BlockLocation locClone = locOrig.clone(); + assertEquals(locOrig, locClone); + } +} diff --git a/core/src/test/java/mc/core/TestEntityLocation.java b/core/src/test/java/mc/core/TestEntityLocation.java index 5a09623..c6b1c62 100644 --- a/core/src/test/java/mc/core/TestEntityLocation.java +++ b/core/src/test/java/mc/core/TestEntityLocation.java @@ -1,35 +1,91 @@ package mc.core; -import mc.core.world.World; +import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.util.concurrent.ThreadLocalRandom; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertSame; -import static org.mockito.Mockito.mock; +import static org.junit.Assert.assertNotEquals; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = SpringConfig.class) public class TestEntityLocation { - @Autowired - @Qualifier("simpleMockWorld") - private World mockWorld; + private static final ThreadLocalRandom rnd = ThreadLocalRandom.current(); + private static final double minD = 0.0d, maxD = 10.0d; + private static final float minF = 0.0f, maxF = 359.9f; + private double x, y, z; + private float yaw, pitch; + + @Before + public void before() { + x = rnd.nextDouble(minD, maxD); + y = rnd.nextDouble(minD, maxD); + z = rnd.nextDouble(minD, maxD); + yaw = rnd.nextFloat() * (maxF - minF) + minF; + pitch = rnd.nextFloat() * (maxF - minF) + minF; + } @Test - public void cloneTest() { - EntityLocation firstLocation = new EntityLocation(10, 20, 30, 40, 50, mockWorld); - assertSame("Lost world reference before cloning", mockWorld, firstLocation.getWorld()); - EntityLocation locationClone = firstLocation.clone(); + public void testEquals() { + EntityLocation loc1 = new EntityLocation(x, y, z, yaw, pitch); + EntityLocation loc2 = new EntityLocation(x, y, z, yaw, pitch); + assertEquals(loc1, loc2); - assertEquals("X mismatch", firstLocation.getX(), locationClone.getX(), 0); - assertEquals("Y mismatch", firstLocation.getY(), locationClone.getY(), 0); - assertEquals("Z mismatch", firstLocation.getZ(), locationClone.getZ(), 0); - assertEquals("Pitch mismatch", firstLocation.getPitch(), locationClone.getPitch(), 0); - assertEquals("Yaw mismatch", firstLocation.getYaw(), locationClone.getYaw(), 0); - assertSame("World mismatch (accidental clone of the World object?)", firstLocation.getWorld(), locationClone.getWorld()); + loc2 = new EntityLocation(x+1, y+2, z-3, yaw, pitch); + assertNotEquals(loc1, loc2); + + loc2 = new EntityLocation(x, y, z, yaw-1, pitch+2); + assertNotEquals(loc1, loc2); + } + + @Test + public void testClone() { + EntityLocation locOrig = new EntityLocation(x, y, z, yaw, pitch); + EntityLocation locClone = locOrig.clone(); + assertEquals(locOrig, locClone); + } + + @Test + public void testGetBlockXZ() { + EntityLocation location; + + location = new EntityLocation(0d, 0, 0d, 0f, 0f); + assertEquals(0, location.getBlockX()); + assertEquals(0, location.getBlockZ()); + + location.setXYZ(0.1d, 0, 0.1d); + assertEquals(0, location.getBlockX()); + assertEquals(0, location.getBlockZ()); + + location.setXYZ(0.5d, 0, 0.5d); + assertEquals(0, location.getBlockX()); + assertEquals(0, location.getBlockZ()); + + location.setXYZ(0.9d, 0, 0.9d); + assertEquals(0, location.getBlockX()); + assertEquals(0, location.getBlockZ()); + + location.setXYZ(1d, 0, 1d); + assertEquals(1, location.getBlockX()); + assertEquals(1, location.getBlockZ()); + + location.setXYZ(-0.1d, 0, -0.1d); + assertEquals(-1, location.getBlockX()); + assertEquals(-1, location.getBlockZ()); + + location.setXYZ(-0.5d, 0, -0.5d); + assertEquals(-1, location.getBlockX()); + assertEquals(-1, location.getBlockZ()); + + location.setXYZ(-0.9d, 0, -0.9d); + assertEquals(-1, location.getBlockX()); + assertEquals(-1, location.getBlockZ()); + + location.setXYZ(-1d, 0, -1d); + assertEquals(-1, location.getBlockX()); + assertEquals(-1, location.getBlockZ()); + + location.setXYZ(-1.1d, 0, -1.1d); + assertEquals(-2, location.getBlockX()); + assertEquals(-2, location.getBlockZ()); } } diff --git a/core/src/test/java/mc/core/TestLocation.java b/core/src/test/java/mc/core/TestLocation.java deleted file mode 100644 index eafd792..0000000 --- a/core/src/test/java/mc/core/TestLocation.java +++ /dev/null @@ -1,119 +0,0 @@ -package mc.core; - -import mc.core.world.World; -import mc.core.world.chunk.Chunk; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.*; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = SpringConfig.class) -public class TestLocation { - @Autowired - @Qualifier("chunkedMockWorld") - private World world; - - @Test - public void testGetBlockXZ() { - Location location; - - location = new Location(0d, 0, 0d, world); - assertEquals(0, location.getBlockX()); - assertEquals(0, location.getBlockZ()); - - location.setXYZ(0.1d, 0, 0.1d); - assertEquals(0, location.getBlockX()); - assertEquals(0, location.getBlockZ()); - - location.setXYZ(0.5d, 0, 0.5d); - assertEquals(0, location.getBlockX()); - assertEquals(0, location.getBlockZ()); - - location.setXYZ(0.9d, 0, 0.9d); - assertEquals(0, location.getBlockX()); - assertEquals(0, location.getBlockZ()); - - location.setXYZ(1d, 0, 1d); - assertEquals(1, location.getBlockX()); - assertEquals(1, location.getBlockZ()); - - location.setXYZ(-0.1d, 0, -0.1d); - assertEquals(-1, location.getBlockX()); - assertEquals(-1, location.getBlockZ()); - - location.setXYZ(-0.5d, 0, -0.5d); - assertEquals(-1, location.getBlockX()); - assertEquals(-1, location.getBlockZ()); - - location.setXYZ(-0.9d, 0, -0.9d); - assertEquals(-1, location.getBlockX()); - assertEquals(-1, location.getBlockZ()); - - location.setXYZ(-1d, 0, -1d); - assertEquals(-1, location.getBlockX()); - assertEquals(-1, location.getBlockZ()); - - location.setXYZ(-1.1d, 0, -1.1d); - assertEquals(-2, location.getBlockX()); - assertEquals(-2, location.getBlockZ()); - } - - @Test - public void testGetChunk() { - Location location; - Chunk chunk; - - location = new Location(0d, 0, 0d, world); - chunk = location.getChunk(); - assertEquals(0, chunk.getX()); - assertEquals(0, chunk.getZ()); - - location.setXYZ(1d, 0, 1d); - chunk = location.getChunk(); - assertEquals(0, chunk.getX()); - assertEquals(0, chunk.getZ()); - - location.setXYZ(15d, 0, 15d); - chunk = location.getChunk(); - assertEquals(0, chunk.getX()); - assertEquals(0, chunk.getZ()); - - location.setXYZ(16d, 0, 16d); - chunk = location.getChunk(); - assertEquals(1, chunk.getX()); - assertEquals(1, chunk.getZ()); - - location.setXYZ(-0.1d, 0, -0.1d); - chunk = location.getChunk(); - assertEquals(-1, chunk.getX()); - assertEquals(-1, chunk.getZ()); - - location.setXYZ(-1d, 0, -1d); - chunk = location.getChunk(); - assertEquals(-1, chunk.getX()); - assertEquals(-1, chunk.getZ()); - - location.setXYZ(-15d, 0, -15d); - chunk = location.getChunk(); - assertEquals(-1, chunk.getX()); - assertEquals(-1, chunk.getZ()); - - //TODO на практике, таких точных значений не встретиться, но тем не менее данный тест не проходит - //location.setXYZ(-16.0d, 0, -16.0d); - //chunk = location.getChunk(); - //assertEquals(-2, chunk.getX()); - //assertEquals(-2, chunk.getZ()); - - location.setXYZ(-16.001d, 0, -16.001d); - chunk = location.getChunk(); - assertEquals(-2, chunk.getX()); - assertEquals(-2, chunk.getZ()); - } -} diff --git a/flat_world/src/main/java/mc/world/flat/FlatWorld.java b/flat_world/src/main/java/mc/world/flat/FlatWorld.java index 6ec745f..ca5d1db 100644 --- a/flat_world/src/main/java/mc/world/flat/FlatWorld.java +++ b/flat_world/src/main/java/mc/world/flat/FlatWorld.java @@ -5,6 +5,7 @@ package mc.world.flat; import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; import mc.core.world.World; @@ -16,6 +17,7 @@ import mc.core.world.chunk.ChunkSection; public class FlatWorld implements World { @Getter private final WorldType worldType = WorldType.FLAT; + @Setter private EntityLocation spawn; private ChunkSection chunkSection = new SimpleChunkSection(); @@ -23,18 +25,12 @@ public class FlatWorld implements World { public EntityLocation getSpawn() { if (this.spawn == null) { log.warn("Spawn is not defined! Set spawn [0, 6, 0]"); - this.spawn = new EntityLocation(0d, 6d, 0d, 0f, 0f, this); + this.spawn = new EntityLocation(0d, 6d, 0d, 0f, 0f); } return this.spawn; } - @Override - public void setSpawn(EntityLocation location) { - this.spawn = location; - this.spawn.setWorld(this); - } - @Override public Chunk getChunk(int x, int z) { Chunk chunk = new SimpleChunk(x, z, this); diff --git a/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java b/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java index 414cbb4..4c5b8a8 100644 --- a/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java +++ b/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java @@ -9,12 +9,8 @@ import mc.core.world.World; import mc.core.world.block.Block; import mc.core.world.block.BlockFactory; import mc.core.world.block.BlockType; -import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkSection; -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; - public class SimpleChunkSection implements ChunkSection { @Override public int getSkyLight(int x, int y, int z) { @@ -63,10 +59,10 @@ public class SimpleChunkSection implements ChunkSection { public Block getBlock(int x, int y, int z) { BlockFactory blockFactory = new BlockFactory(); - if (y == 0) return blockFactory.create(BlockType.BEDROCK, x, y, z, getWorld()); - else if (y >= 1 && y <= 2) return blockFactory.create(BlockType.DIRT, x, y, z, getWorld()); - else if (y == 3) return blockFactory.create(BlockType.GRASS, x, y, z, getWorld()); - else return blockFactory.create(BlockType.AIR, x, y, z, getWorld()); + if (y == 0) return blockFactory.create(BlockType.BEDROCK, x, y, z); + else if (y >= 1 && y <= 2) return blockFactory.create(BlockType.DIRT, x, y, z); + else if (y == 3) return blockFactory.create(BlockType.GRASS, x, y, z); + else return blockFactory.create(BlockType.AIR, x, y, z); } @Override diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TeleportManager.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TeleportManager.java index 951f098..ba9cd07 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TeleportManager.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TeleportManager.java @@ -45,8 +45,7 @@ public class TeleportManager { public void apply(int teleportId) { if (teleportMap.containsKey(teleportId)) { TpData data = teleportMap.remove(teleportId); - data.player.getLocation().setXYZ(data.newLocation); - data.player.getLocation().setYawPitch(data.newLocation); + data.player.getLocation().set(data.newLocation); } } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java index 742370e..3586c01 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java @@ -2,7 +2,7 @@ package mc.core.network.proto_1_12_2.packets; import lombok.Getter; import lombok.ToString; -import mc.core.Location; +import mc.core.world.block.BlockLocation; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; import mc.core.network.proto_1_12_2.Direction; @@ -11,7 +11,7 @@ import mc.core.utils.CompactedCoords; @Getter @ToString public class PlayerBlockPlacementPacket implements CSPacket { - private Location location; + private BlockLocation location; private Direction face; /** true - main hand; false - off hand */ private boolean hand; @@ -21,7 +21,7 @@ public class PlayerBlockPlacementPacket implements CSPacket { public void readSelf(NetInputStream netStream) { long compactedCoords = netStream.readLong(); double[] xyz = CompactedCoords.uncompressXYZ(compactedCoords); - location = new Location(xyz[0], xyz[1], xyz[2], null); + location = new BlockLocation((int)xyz[0], (int)xyz[1], (int)xyz[2]); //FIXME face = Direction.getById(netStream.readVarInt()); hand = (netStream.readVarInt() == 1); cursorX = netStream.readFloat(); diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java index e60d409..2081e7c 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java @@ -3,7 +3,7 @@ package mc.core.network.proto_1_12_2.packets; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; -import mc.core.Location; +import mc.core.world.block.BlockLocation; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; import mc.core.network.proto_1_12_2.Direction; @@ -42,7 +42,7 @@ public class PlayerDiggingPacket implements CSPacket { } private Status status; - private Location location; + private BlockLocation location; private Direction face; @Override @@ -50,7 +50,7 @@ public class PlayerDiggingPacket implements CSPacket { status = Status.getById(netStream.readVarInt()); long compactCoord = netStream.readLong(); double[] xyz = CompactedCoords.uncompressXYZ(compactCoord); - location = new Location(xyz[0], xyz[1], xyz[2], null); + location = new BlockLocation((int)xyz[0], (int)xyz[1], (int)xyz[2]); //FIXME face = Direction.getById(netStream.readByte()); } } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java index 985d8df..3c783a7 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java @@ -48,8 +48,7 @@ public class PlayerPositionAndLookPacket implements SCPacket, CSPacket { netStream.readDouble(), netStream.readDouble(), netStream.readFloat(), - netStream.readFloat(), - null + netStream.readFloat() ); this.onGround = netStream.readBoolean(); diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java index ffbfe50..558e8dc 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java @@ -4,7 +4,7 @@ */ package mc.core.network.proto_1_12_2.packets; -import mc.core.Location; +import mc.core.world.block.BlockLocation; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; @@ -12,7 +12,7 @@ public class TabCompletePacket implements CSPacket { private String text; private boolean assumeCommand; private boolean hasPosition; - private Location location; + private BlockLocation location; @Override public void readSelf(NetInputStream netStream) { @@ -27,7 +27,7 @@ public class TabCompletePacket implements CSPacket { double y = (compactValue >> 26) & 0xFFF; double z = compactValue << 38 >> 38; // is normal? - this.location = new Location(x, y, z, null); + this.location = new BlockLocation((int)x, (int)y, (int)z); //FIXME } } } diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java index ba9147a..449a672 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java @@ -50,10 +50,10 @@ public class TestChunkdataPacket { BlockFactory blockFactory = new BlockFactory(); - if (y == 0) return blockFactory.create(BlockType.BEDROCK, x, y, z, null); - else if (y >= 1 && y <= 2) return blockFactory.create(BlockType.DIRT, x, y, z, null); - else if (y == 3) return blockFactory.create(BlockType.GRASS, x, y, z, null); - else return blockFactory.create(BlockType.AIR, x, y, z, null); + if (y == 0) return blockFactory.create(BlockType.BEDROCK, x, y, z); + else if (y >= 1 && y <= 2) return blockFactory.create(BlockType.DIRT, x, y, z); + else if (y == 3) return blockFactory.create(BlockType.GRASS, x, y, z); + else return blockFactory.create(BlockType.AIR, x, y, z); }); world = mock(World.class); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java index bcfe393..4c7e533 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java @@ -29,7 +29,7 @@ class PlayerEventListener { public void playerChunkLoadHandler(SC_ChunkLoadEvent event) { for(Integer compressXZ : event.getNeedLoadChunks()) { int[] xz = CompactedCoords.uncompressXZ(compressXZ); - Chunk chunk = event.getPlayer().getLocation().getWorld().getChunk(xz[0], xz[1]); + Chunk chunk = event.getPlayer().getWorld().getChunk(xz[0], xz[1]); ChunkDataPacket packet = new ChunkDataPacket(); packet.setX(xz[0]); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java index 771b1c3..d38af9c 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java @@ -20,6 +20,7 @@ import mc.core.text.TextColor; import mc.core.text.TextStyle; import mc.core.utils.CompactedCoords; import mc.core.world.World; +import mc.core.world.chunk.Chunk; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -50,7 +51,8 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand Player player = playerManager.getPlayer(packet.getPlayerName()) .orElseGet(() -> playerManager.createPlayer( packet.getPlayerName(), - world.getSpawn())); + world.getSpawn(), + world)); channel.writeAndFlush(new LoginSuccessPacket( player.getUUID(), @@ -83,9 +85,10 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand // First Chunk ChunkDataPacket pkt8 = new ChunkDataPacket(); - pkt8.setX(player.getLocation().getChunk().getX()); - pkt8.setZ(player.getLocation().getChunk().getZ()); - pkt8.setChunk(player.getLocation().getChunk()); + Chunk chunk = player.getWorld().getChunk(player.getLocation()); + pkt8.setX(chunk.getX()); + pkt8.setZ(chunk.getZ()); + pkt8.setChunk(chunk); pkt8.setInitChunk(true); channel.writeAndFlush(pkt8); player.getLoadedChunks().add(CompactedCoords.compressXZ(0, 0)); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java index d7636e3..d132486 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java @@ -55,8 +55,7 @@ public class PlayHandler extends AbstractStateHandler implements PlayStateHandle @Handler public void onPositionAndLook(Channel channel, PlayerPositionAndLookPacket packet) { Player player = channel.attr(ATTR_PLAYER).get(); - player.getLocation().setXYZ(packet.getLocation()); - player.getLocation().setYawPitch(packet.getLocation()); + player.getLocation().set(packet.getLocation()); } @Handler @@ -82,8 +81,7 @@ public class PlayHandler extends AbstractStateHandler implements PlayStateHandle event.setNewLocation(new EntityLocation( packet.getX(), packet.getY(), packet.getZ(), player.getLocation().getYaw(), - player.getLocation().getPitch(), - player.getLocation().getWorld() + player.getLocation().getPitch() )); EventBusGetter.getInstance().post(event); } From 27c40e86e60fc3f3cec09e697c3946a8ff1c2993 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 8 Sep 2018 14:26:05 +0300 Subject: [PATCH 38/71] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=81=D0=B5=D1=80=D0=B8=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=B0=D0=BA=D0=B5?= =?UTF-8?q?=D1=82=D0=B0=20PlayerAbilities=20(+=D1=82=D0=B5=D1=81=D1=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../packets/PlayerAbilitiesPacket.java | 22 +++--- .../packets/ByteArrayInputNetStream.java | 73 +++++++++++++++++++ .../packets/TestByteArrayInputNetStream.java | 49 +++++++++++++ .../packets/TestPlayerAbilitiesPacket.java | 40 ++++++++++ 4 files changed, 175 insertions(+), 9 deletions(-) create mode 100644 proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java create mode 100644 proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java create mode 100644 proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestPlayerAbilitiesPacket.java diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java index b3a8312..6258bc5 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java @@ -18,6 +18,11 @@ import mc.core.network.SCPacket; @Setter @ToString public class PlayerAbilitiesPacket implements SCPacket, CSPacket { + private static final byte $GOD_MODE_MASK = 0x01, + $FLYING_MASK = 0x02, + $CAN_FLY_MASK = 0x04, + $IDB_MASK = 0x08; + private boolean godMode = false; private boolean flying = false; private boolean canFly = false; @@ -29,10 +34,10 @@ public class PlayerAbilitiesPacket implements SCPacket, CSPacket { @Override public void writeSelf(NetOutputStream netStream) { byte flag = 0; - if (godMode) flag = (byte)(flag | 0x01); - if (flying) flag = (byte)(flag | 0x02); - if (canFly) flag = (byte)(flag | 0x04); - if (instantDestroyBlocks) flag = (byte)(flag | 0x08); + if (godMode) flag = (byte)(flag | $GOD_MODE_MASK); + if (flying) flag = (byte)(flag | $FLYING_MASK); + if (canFly) flag = (byte)(flag | $CAN_FLY_MASK); + if (instantDestroyBlocks) flag = (byte)(flag | $IDB_MASK); netStream.writeByte(flag); netStream.writeFloat(flyingSpeed); @@ -42,11 +47,10 @@ public class PlayerAbilitiesPacket implements SCPacket, CSPacket { @Override public void readSelf(NetInputStream netStream) { byte flag = netStream.readByte(); - //FIXME треубет проверки - godMode = (flag == 0x08); - canFly = (flag == 0x04); - flying = (flag == 0x02); - instantDestroyBlocks = (flag == 0x01); + godMode = (flag & $GOD_MODE_MASK) > 0; + canFly = (flag & $CAN_FLY_MASK) > 0; + flying = (flag & $FLYING_MASK) > 0; + instantDestroyBlocks = (flag & $IDB_MASK) > 0; flyingSpeed = netStream.readFloat(); walkingSpeed = netStream.readFloat(); diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java new file mode 100644 index 0000000..2c17c19 --- /dev/null +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java @@ -0,0 +1,73 @@ +package mc.core.network.proto_1_12_2.packets; + +import mc.core.network.proto_1_12_2.NetInputStream_p340; + +import java.io.ByteArrayInputStream; +import java.io.EOFException; + +public class ByteArrayInputNetStream extends NetInputStream_p340 { + private ByteArrayInputStream bais; + + public ByteArrayInputNetStream(byte[] buff) { + bais = new ByteArrayInputStream(buff); + } + + @Override + public boolean readBoolean() { + return false; + } + + @Override + public byte readByte() { + return (byte) bais.read(); + } + + @Override + public void readBytes(byte[] buffer) { + } + + @Override + public int readUnsignedByte() { + return 0; + } + + @Override + public int readUnsignedShort() { + return 0; + } + + @Override + public short readShort() { + return 0; + } + + @Override + public int readInt() { + int ch1 = bais.read(); + int ch2 = bais.read(); + int ch3 = bais.read(); + int ch4 = bais.read(); + if ((ch1 | ch2 | ch3 | ch4) < 0) return 0; + return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); + } + + @Override + public long readLong() { + return 0; + } + + @Override + public float readFloat() { + return Float.intBitsToFloat(readInt()); + } + + @Override + public double readDouble() { + return 0; + } + + @Override + public void skipBytes(int count) { + + } +} diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java new file mode 100644 index 0000000..85bfc7c --- /dev/null +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java @@ -0,0 +1,49 @@ +package mc.core.network.proto_1_12_2.packets; + +import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.util.Random; + +import static org.junit.Assert.*; + +public class TestByteArrayInputNetStream { + private Random rnd = new Random(); + + @Test + public void testReadByte() { + final byte b0 = (byte) rnd.nextInt(); + ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); + netStream.writeByte(b0); + byte[] buffer = netStream.toByteArray(); + + ByteArrayInputNetStream netInputStream = new ByteArrayInputNetStream(buffer); + byte b1 = netInputStream.readByte(); + assertEquals(b0, b1); + } + + @Test + public void testReadInt() { + final int i0 = rnd.nextInt(); + ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); + netStream.writeInt(i0); + byte[] buffer = netStream.toByteArray(); + + ByteArrayInputNetStream netInputStream = new ByteArrayInputNetStream(buffer); + int i1 = netInputStream.readInt(); + assertEquals(i0, i1); + } + + @Test + public void testReadFloat() { + final float f0 = rnd.nextFloat(); + ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); + netStream.writeFloat(f0); + byte[] buffer = netStream.toByteArray(); + + ByteArrayInputNetStream netInputStream = new ByteArrayInputNetStream(buffer); + float f1 = netInputStream.readFloat(); + assertEquals(f0, f1, 0.0f); + } +} \ No newline at end of file diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestPlayerAbilitiesPacket.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestPlayerAbilitiesPacket.java new file mode 100644 index 0000000..ec9b150 --- /dev/null +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestPlayerAbilitiesPacket.java @@ -0,0 +1,40 @@ +package mc.core.network.proto_1_12_2.packets; + +import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; +import org.junit.Before; +import org.junit.Test; + +import java.util.Random; + +import static org.junit.Assert.assertEquals; + +public class TestPlayerAbilitiesPacket { + private Random rnd = new Random(); + private PlayerAbilitiesPacket packet; + + @Before + public void before() { + packet = new PlayerAbilitiesPacket(); + packet.setGodMode(rnd.nextBoolean()); + packet.setFlying(rnd.nextBoolean()); + packet.setCanFly(rnd.nextBoolean()); + packet.setInstantDestroyBlocks(rnd.nextBoolean()); + packet.setFlyingSpeed(rnd.nextFloat()); + } + + @Test + public void test() { + ByteArrayOutputNetStream netOutputStream = new ByteArrayOutputNetStream(); + packet.writeSelf(netOutputStream); + + ByteArrayInputNetStream netInputStream = new ByteArrayInputNetStream(netOutputStream.toByteArray()); + PlayerAbilitiesPacket outPkt = new PlayerAbilitiesPacket(); + outPkt.readSelf(netInputStream); + + assertEquals("god mode", packet.isGodMode(), outPkt.isGodMode()); + assertEquals("flying", packet.isFlying(), outPkt.isFlying()); + assertEquals("can fly", packet.isCanFly(), outPkt.isCanFly()); + assertEquals("instant destroy block", packet.isInstantDestroyBlocks(), outPkt.isInstantDestroyBlocks()); + assertEquals("flying speed", packet.getFlyingSpeed(), outPkt.getFlyingSpeed(), 0.0f); + } +} From ad31a904555c0226517c2fdbd8ade950beb8d7cb Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 8 Sep 2018 14:54:29 +0300 Subject: [PATCH 39/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20ImmutableEntityLocation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/mc/core/ImmutableEntityLocation.java | 57 +++++++++++++++++++ .../eventbus/events/CS_PlayerMoveEvent.java | 11 ++-- .../mc/core/TestImmutableEntityLocation.java | 35 ++++++++++++ 3 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 core/src/main/java/mc/core/ImmutableEntityLocation.java create mode 100644 core/src/test/java/mc/core/TestImmutableEntityLocation.java diff --git a/core/src/main/java/mc/core/ImmutableEntityLocation.java b/core/src/main/java/mc/core/ImmutableEntityLocation.java new file mode 100644 index 0000000..f71c1e3 --- /dev/null +++ b/core/src/main/java/mc/core/ImmutableEntityLocation.java @@ -0,0 +1,57 @@ +package mc.core; + +public class ImmutableEntityLocation extends EntityLocation { + public ImmutableEntityLocation(double x, double y, double z, float yaw, float pitch) { + super(x, y, z, yaw, pitch); + } + + public ImmutableEntityLocation(EntityLocation location) { + this( + location.getX(), + location.getY(), + location.getZ(), + location.getYaw(), + location.getPitch() + ); + } + + @Override + public void setX(double x) { + throw new UnsupportedOperationException(); + } + + @Override + public void setY(double y) { + throw new UnsupportedOperationException(); + } + + @Override + public void setZ(double z) { + throw new UnsupportedOperationException(); + } + + @Override + public void setYaw(float yaw) { + throw new UnsupportedOperationException(); + } + + @Override + public void setPitch(float pitch) { + throw new UnsupportedOperationException(); + } + + @Override + public void set(EntityLocation location) { + throw new UnsupportedOperationException(); + } + + @Override + public void setXYZ(double x, double y, double z) { + throw new UnsupportedOperationException(); + } + + @Override + public void setYawPitch(float yaw, float pitch) { + throw new UnsupportedOperationException(); + } +} diff --git a/core/src/main/java/mc/core/eventbus/events/CS_PlayerMoveEvent.java b/core/src/main/java/mc/core/eventbus/events/CS_PlayerMoveEvent.java index ae60200..4d759ab 100644 --- a/core/src/main/java/mc/core/eventbus/events/CS_PlayerMoveEvent.java +++ b/core/src/main/java/mc/core/eventbus/events/CS_PlayerMoveEvent.java @@ -5,20 +5,23 @@ package mc.core.eventbus.events; import lombok.Getter; -import lombok.RequiredArgsConstructor; import lombok.Setter; import mc.core.EntityLocation; +import mc.core.ImmutableEntityLocation; import mc.core.eventbus.EventBase; import mc.core.player.Player; -@RequiredArgsConstructor @Getter public class CS_PlayerMoveEvent extends EventBase { private final Player player; - private final EntityLocation oldLocation; // TODO сомнительное решение - // вообще нужно будет создать реализацию "иммутабл локейшен" для подобных ситуаций + private final ImmutableEntityLocation oldLocation; @Setter private EntityLocation newLocation; @Setter private boolean recalcChunk = false; + + public CS_PlayerMoveEvent(Player player, EntityLocation oldLocation) { + this.player = player; + this.oldLocation = new ImmutableEntityLocation(oldLocation); + } } diff --git a/core/src/test/java/mc/core/TestImmutableEntityLocation.java b/core/src/test/java/mc/core/TestImmutableEntityLocation.java new file mode 100644 index 0000000..2f6a958 --- /dev/null +++ b/core/src/test/java/mc/core/TestImmutableEntityLocation.java @@ -0,0 +1,35 @@ +package mc.core; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import static org.junit.Assert.assertEquals; + +public class TestImmutableEntityLocation { + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void testSetValue() { + EntityLocation location = new ImmutableEntityLocation(1d, 2d, 3d, 4f, 5f); + + thrown.expect(UnsupportedOperationException.class); + location.setX(1); + location.setY(1); + location.setZ(1); + location.setYaw(1); + location.setPitch(1); + location.setXYZ(1, 2, 3); + location.setYawPitch(1, 2); + location.set(EntityLocation.ZERO()); + } + + @Test + public void testClone() { + EntityLocation locOrig = new ImmutableEntityLocation(1d, 2d, 3d, 4f, 5f); + EntityLocation locClone = locOrig.clone(); + + assertEquals(locOrig, locClone); + } +} \ No newline at end of file From debb75a0802ea0e3f8df3eba43a9a46af3aacf2f Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 8 Sep 2018 17:04:58 +0300 Subject: [PATCH 40/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20BlockLocationSerializer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/core/world/block/BlockLocation.java | 4 ++ .../serializers/BlockLocationSerializer.java | 63 +++++++++++++++++++ .../TestBlockLocationSerializer.java | 32 ++++++++++ 3 files changed, 99 insertions(+) create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializer.java create mode 100644 proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/TestBlockLocationSerializer.java diff --git a/core/src/main/java/mc/core/world/block/BlockLocation.java b/core/src/main/java/mc/core/world/block/BlockLocation.java index cabccaa..7c9ca85 100644 --- a/core/src/main/java/mc/core/world/block/BlockLocation.java +++ b/core/src/main/java/mc/core/world/block/BlockLocation.java @@ -8,6 +8,10 @@ import lombok.*; public class BlockLocation implements Cloneable { private int x, y, z; + public static BlockLocation ZERO() { + return new BlockLocation(0,0,0); + } + public void setXYZ(int x, int y, int z) { this.x = x; this.y = y; diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializer.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializer.java new file mode 100644 index 0000000..9aea2f5 --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializer.java @@ -0,0 +1,63 @@ +package mc.core.network.proto_1_12_2.serializers; + +import mc.core.world.block.BlockLocation; + +import static com.google.common.math.IntMath.isPowerOfTwo; + +public class BlockLocationSerializer { + private static final int[] MULTIPLY_DE_BRUIJN_BIT_POSITION = new int[] {0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9}; + private static final int NUM_X_BITS = 1 + log2(smallestEncompassingPowerOfTwo(30000000)); + private static final int NUM_Z_BITS = NUM_X_BITS; + private static final int NUM_Y_BITS = 64 - NUM_X_BITS - NUM_Z_BITS; + private static final int Y_SHIFT = NUM_Z_BITS; + private static final int X_SHIFT = Y_SHIFT + NUM_Y_BITS; + private static final long X_MASK = (1L << NUM_X_BITS) - 1L; + private static final long Y_MASK = (1L << NUM_Y_BITS) - 1L; + private static final long Z_MASK = (1L << NUM_Z_BITS) - 1L; + + /* + * net.minecraft.util.math.MathHelper#log2(int) + */ + private static int log2(int value) { + return log2DeBruijn(value) - (isPowerOfTwo(value) ? 0 : 1); + } + + /* + * net.minecraft.util.math.MathHelper#log2DeBruijn(int) + */ + private static int log2DeBruijn(int value) { + value = isPowerOfTwo(value) ? value : smallestEncompassingPowerOfTwo(value); + return MULTIPLY_DE_BRUIJN_BIT_POSITION[(int)((long)value * 125613361L >> 27) & 31]; + } + + /* + * net.minecraft.util.math.MathHelper#smallestEncompassingPowerOfTwo(int) + */ + private static int smallestEncompassingPowerOfTwo(int value) { + int i = value - 1; + i = i | i >> 1; + i = i | i >> 2; + i = i | i >> 4; + i = i | i >> 8; + i = i | i >> 16; + return i + 1; + } + + public static long toLong(BlockLocation location) { + return ((long)location.getX() & X_MASK) << X_SHIFT | + ((long)location.getY() & Y_MASK) << Y_SHIFT | + ((long)location.getZ() & Z_MASK); + } + + public static BlockLocation fromLong(long value) { + BlockLocation location = BlockLocation.ZERO(); + fromLong(value, location); + return location; + } + + public static void fromLong(long value, BlockLocation location) { + location.setX((int)(value << 64 - X_SHIFT - NUM_X_BITS >> 64 - NUM_X_BITS)); + location.setY((int)(value << 64 - Y_SHIFT - NUM_Y_BITS >> 64 - NUM_Y_BITS)); + location.setZ((int)(value << 64 - NUM_Z_BITS >> 64 - NUM_Z_BITS)); + } +} diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/TestBlockLocationSerializer.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/TestBlockLocationSerializer.java new file mode 100644 index 0000000..28db9ea --- /dev/null +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/TestBlockLocationSerializer.java @@ -0,0 +1,32 @@ +package mc.core.network.proto_1_12_2.serializers; + +import mc.core.world.block.BlockLocation; +import org.junit.Before; +import org.junit.Test; + +import java.util.concurrent.ThreadLocalRandom; + +import static org.junit.Assert.*; + +public class TestBlockLocationSerializer { + private static final ThreadLocalRandom rnd = ThreadLocalRandom.current(); + private static final int minI = 0, maxI = 10; + private int x, y, z; + + @Before + public void before() { + x = rnd.nextInt(minI, maxI); + y = rnd.nextInt(minI, maxI); + z = rnd.nextInt(minI, maxI); + } + + @Test + public void test() { + BlockLocation location = new BlockLocation(x, y, z); + final long serializedCoords = BlockLocationSerializer.toLong(location); + + BlockLocation deserLoc = BlockLocationSerializer.fromLong(serializedCoords); + + assertEquals(location, deserLoc); + } +} \ No newline at end of file From fb6ced9c9bc6470790545e902d6274d91b4e7853 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 8 Sep 2018 17:05:26 +0300 Subject: [PATCH 41/71] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=20=D0=BD=D0=B0=20BlockLocationSerializer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/mc/core/utils/CompactedCoords.java | 14 -------------- .../java/mc/core/utils/TestCompactedCoords.java | 17 ----------------- .../packets/PlayerBlockPlacementPacket.java | 4 ++-- .../packets/PlayerDiggingPacket.java | 4 ++-- 4 files changed, 4 insertions(+), 35 deletions(-) diff --git a/core/src/main/java/mc/core/utils/CompactedCoords.java b/core/src/main/java/mc/core/utils/CompactedCoords.java index 43daef0..cac3db6 100644 --- a/core/src/main/java/mc/core/utils/CompactedCoords.java +++ b/core/src/main/java/mc/core/utils/CompactedCoords.java @@ -25,18 +25,4 @@ public class CompactedCoords { int i = (int)value; return value < (double)i ? i - 1 : i; } - - public static long compressXYZ(double x, double y, double z) { - return ((floor_double(x) & 0x3FFFFFF) << 38) - | ((floor_double(y) & 0xFFF) << 26) - | (floor_double(z) & 0x3FFFFFF); - } - - public static double[] uncompressXYZ(long compactValue) { - return new double[]{ - compactValue >> 38, - (compactValue >> 26) & 0x0FFF, - compactValue << 38 >> 38 // is normal? - }; - } } diff --git a/core/src/test/java/mc/core/utils/TestCompactedCoords.java b/core/src/test/java/mc/core/utils/TestCompactedCoords.java index bced6f2..b357cef 100644 --- a/core/src/test/java/mc/core/utils/TestCompactedCoords.java +++ b/core/src/test/java/mc/core/utils/TestCompactedCoords.java @@ -2,7 +2,6 @@ package mc.core.utils; import org.junit.Test; -import java.util.Random; import java.util.concurrent.ThreadLocalRandom; import static org.junit.Assert.assertEquals; @@ -24,20 +23,4 @@ public class TestCompactedCoords { assertEquals(z, xz[1]); } } - -// @Test - public void testXYZSimple() { - for (int z = -100; z <= 100; z++) { - for (int x = -100; x <= 100; x++) { - for (int y = -100; y <= 100; y++) { - long compressXYZ = CompactedCoords.compressXYZ(x, y, z); - double[] xyz = CompactedCoords.uncompressXYZ(compressXYZ); - - assertEquals(x, xyz[0], 0.001d); - assertEquals(y, xyz[1], 0.001d); - assertEquals(z, xyz[2], 0.001d); - } - } - } - } } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java index 3586c01..c40fffd 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java @@ -2,6 +2,7 @@ package mc.core.network.proto_1_12_2.packets; import lombok.Getter; import lombok.ToString; +import mc.core.network.proto_1_12_2.serializers.BlockLocationSerializer; import mc.core.world.block.BlockLocation; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; @@ -20,8 +21,7 @@ public class PlayerBlockPlacementPacket implements CSPacket { @Override public void readSelf(NetInputStream netStream) { long compactedCoords = netStream.readLong(); - double[] xyz = CompactedCoords.uncompressXYZ(compactedCoords); - location = new BlockLocation((int)xyz[0], (int)xyz[1], (int)xyz[2]); //FIXME + location = BlockLocationSerializer.fromLong(compactedCoords); face = Direction.getById(netStream.readVarInt()); hand = (netStream.readVarInt() == 1); cursorX = netStream.readFloat(); diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java index 2081e7c..9ce0dc9 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java @@ -3,6 +3,7 @@ package mc.core.network.proto_1_12_2.packets; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; +import mc.core.network.proto_1_12_2.serializers.BlockLocationSerializer; import mc.core.world.block.BlockLocation; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; @@ -49,8 +50,7 @@ public class PlayerDiggingPacket implements CSPacket { public void readSelf(NetInputStream netStream) { status = Status.getById(netStream.readVarInt()); long compactCoord = netStream.readLong(); - double[] xyz = CompactedCoords.uncompressXYZ(compactCoord); - location = new BlockLocation((int)xyz[0], (int)xyz[1], (int)xyz[2]); //FIXME + location = BlockLocationSerializer.fromLong(compactCoord); face = Direction.getById(netStream.readByte()); } } From fc542c05efe1d540067fbf737ae01959ef35482a Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 8 Sep 2018 17:26:33 +0300 Subject: [PATCH 42/71] optimize imports --- .../mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java | 2 -- .../proto_1_12_2/packets/PlayerBlockPlacementPacket.java | 1 - .../core/network/proto_1_12_2/packets/PlayerDiggingPacket.java | 1 - .../network/proto_1_12_2/packets/ByteArrayInputNetStream.java | 1 - .../proto_1_12_2/packets/TestByteArrayInputNetStream.java | 1 - 5 files changed, 6 deletions(-) diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java index b3d6cd7..ae0ab8d 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java @@ -4,7 +4,6 @@ */ package mc.core.network.proto_1_12_2.packets; -import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -17,7 +16,6 @@ import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkSection; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java index c40fffd..ebcf00d 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java @@ -7,7 +7,6 @@ import mc.core.world.block.BlockLocation; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; import mc.core.network.proto_1_12_2.Direction; -import mc.core.utils.CompactedCoords; @Getter @ToString diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java index 9ce0dc9..355cc57 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java @@ -8,7 +8,6 @@ import mc.core.world.block.BlockLocation; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; import mc.core.network.proto_1_12_2.Direction; -import mc.core.utils.CompactedCoords; import java.util.Arrays; diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java index 2c17c19..c51beaf 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStream.java @@ -3,7 +3,6 @@ package mc.core.network.proto_1_12_2.packets; import mc.core.network.proto_1_12_2.NetInputStream_p340; import java.io.ByteArrayInputStream; -import java.io.EOFException; public class ByteArrayInputNetStream extends NetInputStream_p340 { private ByteArrayInputStream bais; diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java index 85bfc7c..72d1574 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java @@ -3,7 +3,6 @@ package mc.core.network.proto_1_12_2.packets; import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; import org.junit.Test; -import java.io.ByteArrayInputStream; import java.util.Random; import static org.junit.Assert.*; From 24499bb0b183e711a4892dcba68f532411a18364 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 9 Sep 2018 12:32:25 +0300 Subject: [PATCH 43/71] =?UTF-8?q?=D1=81=D1=80=D0=B0=D0=B2=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20H2Player=20=D0=BF=D0=BE=20id=20=D0=B8=20uu?= =?UTF-8?q?id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/mc/core/h2db/H2Player.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2Player.java b/h2_playermanager/src/main/java/mc/core/h2db/H2Player.java index b3e7bdc..a33b94a 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2Player.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2Player.java @@ -11,6 +11,7 @@ import mc.core.world.World; import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.util.List; +import java.util.Objects; import java.util.UUID; @Data @@ -41,4 +42,18 @@ public class H2Player implements Player { public void setWorld(World world) { this.$refWorld = new WeakReference<>(world); } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + H2Player player = (H2Player) obj; + return id == player.id && + Objects.equals(uuid, player.uuid); + } + + @Override + public int hashCode() { + return Objects.hash(id, uuid); + } } From 295a7685e8e9bbe3bee9b068fe85443afcb55f44 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 13 Sep 2018 14:00:43 +0300 Subject: [PATCH 44/71] H2PlayerSerializer -> H2PlayerDAO --- .../main/java/mc/core/h2db/H2PlayerDAO.java | 153 ++++++++++++++++++ .../java/mc/core/h2db/H2PlayerSerializer.java | 114 ------------- .../resources/sqls/create_tables.sql | 0 .../src/main/resources/sqls/delete_player.sql | 1 + .../src/main/resources/sqls/insert_player.sql | 2 + .../resources/sqls/select_player_byName.sql | 3 + .../src/main/resources/sqls/update_player.sql | 10 ++ .../resources/sqls/update_player_location.sql | 8 + .../src/test/java/mc/core/h2db/TestDAO.java | 152 +++++++++++++++++ .../java/mc/core/h2db/TestH2Database.java | 122 -------------- 10 files changed, 329 insertions(+), 236 deletions(-) create mode 100644 h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java delete mode 100644 h2_playermanager/src/main/java/mc/core/h2db/H2PlayerSerializer.java rename h2_playermanager/src/{test => main}/resources/sqls/create_tables.sql (100%) create mode 100644 h2_playermanager/src/main/resources/sqls/delete_player.sql create mode 100644 h2_playermanager/src/main/resources/sqls/insert_player.sql create mode 100644 h2_playermanager/src/main/resources/sqls/select_player_byName.sql create mode 100644 h2_playermanager/src/main/resources/sqls/update_player.sql create mode 100644 h2_playermanager/src/main/resources/sqls/update_player_location.sql create mode 100644 h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java delete mode 100644 h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java new file mode 100644 index 0000000..8bd94b0 --- /dev/null +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java @@ -0,0 +1,153 @@ +package mc.core.h2db; + +import lombok.extern.slf4j.Slf4j; +import mc.core.EntityLocation; +import mc.core.world.World; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.UUID; + +@Slf4j +@Component +public class H2PlayerDAO { + private static String INSERT_SQL, SELECT_SQL, UPDATE_SQL, UPDATE_LOCATION_SQL, DELETE_SQL; + + @Autowired + private JdbcTemplate jdbcTemplate; + @Autowired + private World world; + + public void insert(H2Player player) throws SQLException { + KeyHolder keyHolder = new GeneratedKeyHolder(); + + int affectedRows = jdbcTemplate.update(psc -> { + PreparedStatement stmt = psc.prepareStatement(INSERT_SQL, Statement.RETURN_GENERATED_KEYS); + + stmt.setString(1, player.getUuid().toString()); + stmt.setString(2, player.getName()); + stmt.setDouble(3, player.getLocation().getX()); + stmt.setDouble(4, player.getLocation().getY()); + stmt.setDouble(5, player.getLocation().getZ()); + stmt.setFloat(6, player.getLocation().getYaw()); + stmt.setFloat(7, player.getLocation().getPitch()); + stmt.setString(8, player.getWorld().getName()); + + return stmt; + }, keyHolder); + + if (affectedRows == 0) { + throw new SQLException("Serialize player failed: no rows affected."); + } + + player.setId(keyHolder.getKey().intValue()); + } + + public void getByName(H2Player playerBuffer) throws SQLException { + if (playerBuffer.getName() == null || playerBuffer.getName().isEmpty()) { + throw new SQLException("Argument 'name' is " + (playerBuffer.getName() == null ? "null" : "empty")); + } + + jdbcTemplate.query(SELECT_SQL, + ps -> ps.setString(1, playerBuffer.getName()), + rs -> { + playerBuffer.setId(rs.getInt("id")); + playerBuffer.setUuid(UUID.fromString(rs.getString("uuid"))); + if (!world.getName().equals(rs.getString("location_world"))) { + log.warn("Unknown world \"{}\"", rs.getString("location_world")); + log.warn("Using default (spawn) location for user \"{}\"", playerBuffer.getName()); + playerBuffer.setLocation(world.getSpawn().clone()); + } else { + playerBuffer.setLocation(new EntityLocation( + rs.getDouble("location_x"), + rs.getDouble("location_y"), + rs.getDouble("location_z"), + rs.getFloat("location_yaw"), + rs.getFloat("location_pitch") + )); + playerBuffer.setWorld(world); + } + }); + } + + public void update(H2Player player) throws SQLException { + if (player.getId() == 0) { + throw new SQLException("Argument 'id' is zero"); + } + + int affectedRows = jdbcTemplate.update(UPDATE_SQL, pss -> { + pss.setInt(9, player.getId()); + pss.setString(1, player.getUuid().toString()); + pss.setString(2, player.getName()); + pss.setDouble(3, player.getLocation().getX()); + pss.setDouble(4, player.getLocation().getY()); + pss.setDouble(5, player.getLocation().getZ()); + pss.setFloat(6, player.getLocation().getYaw()); + pss.setFloat(7, player.getLocation().getPitch()); + pss.setString(8, player.getWorld().getName()); + }); + + if (affectedRows == 0) { + throw new SQLException("Serialize player failed, no rows affected."); + } + } + + public void updateLocation(H2Player player) throws SQLException { + if (player.getId() == 0) { + throw new SQLException("Argument 'id' is zero"); + } + + int affectedRows = jdbcTemplate.update(connection -> { + PreparedStatement stmt = connection.prepareStatement(UPDATE_LOCATION_SQL); + + stmt.setInt(7, player.getId()); + stmt.setDouble(1, player.getLocation().getX()); + stmt.setDouble(2, player.getLocation().getY()); + stmt.setDouble(3, player.getLocation().getZ()); + stmt.setFloat(4, player.getLocation().getYaw()); + stmt.setFloat(5, player.getLocation().getPitch()); + stmt.setString(6, player.getWorld().getName()); + + return stmt; + }); + + if (affectedRows == 0) { + throw new SQLException("Serialize player failed, no rows affected."); + } + } + + public void remove(H2Player player) throws SQLException { + if (player.getId() == 0) { + throw new SQLException("Argument 'id' is zero"); + } + + int affectedRows = jdbcTemplate.update(DELETE_SQL, pss -> pss.setInt(1, player.getId())); + + if (affectedRows == 0) { + throw new SQLException("Serialize player failed, no rows affected."); + } + + player.setId(0); + } + + static { + try { + INSERT_SQL = IOUtils.resourceToString("/sqls/insert_player.sql", StandardCharsets.UTF_8); + SELECT_SQL = IOUtils.resourceToString("/sqls/select_player_byName.sql", StandardCharsets.UTF_8); + UPDATE_SQL = IOUtils.resourceToString("/sqls/update_player.sql", StandardCharsets.UTF_8); + UPDATE_LOCATION_SQL = IOUtils.resourceToString("/sqls/update_player_location.sql", StandardCharsets.UTF_8); + DELETE_SQL = IOUtils.resourceToString("/sqls/delete_player.sql", StandardCharsets.UTF_8); + } catch (IOException e) { + log.error("Load sql templates", e); + } + } +} diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerSerializer.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerSerializer.java deleted file mode 100644 index dcd9a07..0000000 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerSerializer.java +++ /dev/null @@ -1,114 +0,0 @@ -package mc.core.h2db; - -import lombok.extern.slf4j.Slf4j; -import mc.core.EntityLocation; -import mc.core.world.World; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Component; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.UUID; - -@Slf4j -@Component -public class H2PlayerSerializer { - @Autowired - private World world; - @Autowired - private JdbcTemplate jdbcTemplate; - - private static final String SQL_INSERT = "INSERT INTO players " + - "(uuid, name, location_x, location_y, location_z, location_yaw, location_pitch, location_world) " + - "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; - - public void serialize(final H2Player player) throws SQLException { - KeyHolder keyHolder = new GeneratedKeyHolder(); - int affectedRows = jdbcTemplate.update(connection -> { - PreparedStatement stmt = connection.prepareStatement(SQL_INSERT, Statement.RETURN_GENERATED_KEYS); - - stmt.setString(1, player.getUuid().toString()); - stmt.setString(2, player.getName()); - stmt.setDouble(3, player.getLocation().getX()); - stmt.setDouble(4, player.getLocation().getY()); - stmt.setDouble(5, player.getLocation().getZ()); - stmt.setFloat(6, player.getLocation().getYaw()); - stmt.setFloat(7, player.getLocation().getPitch()); - stmt.setString(8, player.getWorld().getName()); - - return stmt; - }, keyHolder); - - if (affectedRows == 0) { - throw new SQLException("Serialize player failed, no rows affected."); - } - - player.setId(keyHolder.getKey().intValue()); - } - - public void deserialize(H2Player player) { - if (player.getId() > 0) { - selectById(player); - } else if (player.getUuid() != null) { - selectByUuid(player); - } else if (player.getName() != null && !player.getName().isEmpty()) { - selectByName(player); - } - } - - - private void selectById(final H2Player player) { - final String sql = "SELECT * FROM players WHERE id = ? LIMIT 1;"; - jdbcTemplate.query(sql, - ps -> ps.setInt(1, player.getId()), - rs -> { - player.setUuid(UUID.fromString(rs.getString("uuid"))); - player.setName(rs.getString("name")); - deserializeLocation(player, rs); - }); - } - - private void selectByUuid(H2Player player) { - final String sql = "SELECT * FROM players WHERE uuid LIKE ? LIMIT 1;"; - jdbcTemplate.query(sql, - ps -> ps.setString(1, player.getUuid().toString()), - rs -> { - player.setId(rs.getInt("id")); - player.setName(rs.getString("name")); - deserializeLocation(player, rs); - }); - } - - private void selectByName(H2Player player) { - final String sql = "SELECT * FROM players WHERE name LIKE ? LIMIT 1;"; - jdbcTemplate.query(sql, - ps -> ps.setString(1, player.getName()), - rs -> { - player.setId(rs.getInt("id")); - player.setUuid(UUID.fromString(rs.getString("uuid"))); - deserializeLocation(player, rs); - }); - } - - private void deserializeLocation(H2Player player, ResultSet resultSet) throws SQLException { - if (!world.getName().equals(resultSet.getString("location_world"))) { - log.warn("Unknown world \"{}\"", resultSet.getString("location_world")); - log.warn("Using default (spawn) location for user \"{}\"", player.getName()); - player.setLocation(world.getSpawn().clone()); - } else { - player.setLocation(new EntityLocation( - resultSet.getDouble("location_x"), - resultSet.getDouble("location_y"), - resultSet.getDouble("location_z"), - resultSet.getFloat("location_yaw"), - resultSet.getFloat("location_pitch") - )); - player.setWorld(world); - } - } -} diff --git a/h2_playermanager/src/test/resources/sqls/create_tables.sql b/h2_playermanager/src/main/resources/sqls/create_tables.sql similarity index 100% rename from h2_playermanager/src/test/resources/sqls/create_tables.sql rename to h2_playermanager/src/main/resources/sqls/create_tables.sql diff --git a/h2_playermanager/src/main/resources/sqls/delete_player.sql b/h2_playermanager/src/main/resources/sqls/delete_player.sql new file mode 100644 index 0000000..d16f13d --- /dev/null +++ b/h2_playermanager/src/main/resources/sqls/delete_player.sql @@ -0,0 +1 @@ +DELETE FROM players WHERE id = ?; \ No newline at end of file diff --git a/h2_playermanager/src/main/resources/sqls/insert_player.sql b/h2_playermanager/src/main/resources/sqls/insert_player.sql new file mode 100644 index 0000000..ab9bdff --- /dev/null +++ b/h2_playermanager/src/main/resources/sqls/insert_player.sql @@ -0,0 +1,2 @@ +INSERT INTO players (uuid, name, location_x, location_y, location_z, location_yaw, location_pitch, location_world) + VALUES (?, ?, ?, ?, ?, ?, ?, ?); \ No newline at end of file diff --git a/h2_playermanager/src/main/resources/sqls/select_player_byName.sql b/h2_playermanager/src/main/resources/sqls/select_player_byName.sql new file mode 100644 index 0000000..1a8f47a --- /dev/null +++ b/h2_playermanager/src/main/resources/sqls/select_player_byName.sql @@ -0,0 +1,3 @@ +SELECT id, uuid, name, location_x, location_y, location_z, location_yaw, location_pitch, location_world +FROM players WHERE name LIKE ? +LIMIT 1; \ No newline at end of file diff --git a/h2_playermanager/src/main/resources/sqls/update_player.sql b/h2_playermanager/src/main/resources/sqls/update_player.sql new file mode 100644 index 0000000..0e7bb2d --- /dev/null +++ b/h2_playermanager/src/main/resources/sqls/update_player.sql @@ -0,0 +1,10 @@ +UPDATE players +SET uuid = ?, + name = ?, + location_x = ?, + location_y = ?, + location_z = ?, + location_yaw = ?, + location_pitch = ?, + location_world = ? +WHERE id = ?; \ No newline at end of file diff --git a/h2_playermanager/src/main/resources/sqls/update_player_location.sql b/h2_playermanager/src/main/resources/sqls/update_player_location.sql new file mode 100644 index 0000000..30b2d29 --- /dev/null +++ b/h2_playermanager/src/main/resources/sqls/update_player_location.sql @@ -0,0 +1,8 @@ +UPDATE players +SET location_x = ?, + location_y = ?, + location_z = ?, + location_yaw = ?, + location_pitch = ?, + location_world = ? +WHERE id = ?; \ No newline at end of file diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java b/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java new file mode 100644 index 0000000..709ed52 --- /dev/null +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java @@ -0,0 +1,152 @@ +package mc.core.h2db; + +import mc.core.EntityLocation; +import mc.core.world.World; +import org.apache.commons.io.IOUtils; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.sql.SQLException; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +import static org.junit.Assert.*; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = {SpringConfig.class}) +public class TestDAO { + @Autowired + private JdbcTemplate jdbcTemplate; + @Autowired + private World mockWorld; + @Autowired + private H2PlayerDAO playerDAO; + private H2Player player; + + private void createPlayer() { + final ThreadLocalRandom rnd = ThreadLocalRandom.current(); + final double minD = 0.0d, maxD = 10.0d; + final float minF = 0.0f, maxF = 359.9f; + final int minI = 1000, maxI = 9999; + + player = new H2Player(); + player.setUuid(UUID.randomUUID()); + player.setName("player" + rnd.nextInt(minI, maxI)); + player.setLocation(new EntityLocation( + rnd.nextDouble(minD, maxD), + rnd.nextDouble(minD, maxD), + rnd.nextDouble(minD, maxD), + rnd.nextFloat() * (maxF - minF) + minF, + rnd.nextFloat() * (maxF - minF) + minF + )); + player.setWorld(mockWorld); + } + + private void assertPlayer(H2Player actualPlayer) { + final String sql = "SELECT * FROM players WHERE id = ?"; + jdbcTemplate.query(sql, + ps -> ps.setInt(1, player.getId()), + rs -> { + assertEquals(actualPlayer.getId(), rs.getInt("id")); + assertEquals(actualPlayer.getName(), rs.getString("name")); + assertEquals(actualPlayer.getLocation().getX(), rs.getDouble("location_x"), 0.01d); + assertEquals(actualPlayer.getLocation().getY(), rs.getDouble("location_y"), 0.01d); + assertEquals(actualPlayer.getLocation().getZ(), rs.getDouble("location_z"), 0.01d); + assertEquals(actualPlayer.getLocation().getYaw(), rs.getFloat("location_yaw"), 0.01f); + assertEquals(actualPlayer.getLocation().getPitch(), rs.getFloat("location_pitch"), 0.01f); + assertEquals(actualPlayer.getWorld().getName(), rs.getString("location_world")); + }); + } + + @Before + public void init() throws IOException { + jdbcTemplate.execute("DROP TABLE IF EXISTS players;"); + jdbcTemplate.execute(IOUtils.resourceToString("/sqls/create_tables.sql", StandardCharsets.UTF_8)); + createPlayer(); + assertEquals(0, player.getId()); + } + + @Test + public void testInsert() throws SQLException { + playerDAO.insert(player); + assertNotEquals(0, player.getId()); + + assertPlayer(player); + } + + @Test + public void testGetByName() throws SQLException { + playerDAO.insert(this.player); + assertNotEquals(0, player.getId()); + + H2Player player = new H2Player(); + player.setName(this.player.getName()); + + assertNotNull(player.getName()); + assertFalse(player.getName().isEmpty()); + assertEquals(this.player.getName(), player.getName()); + + playerDAO.getByName(player); + + assertEquals(player, this.player); + } + + @Test + public void testUpdate() throws SQLException { + playerDAO.insert(player); + assertNotEquals(0, player.getId()); + + player.setName("UNKNOWN_PLAYER"); + playerDAO.update(player); + + assertPlayer(player); + } + + @Test + public void testUpdateLocation() throws SQLException { + playerDAO.insert(player); + assertNotEquals(0, player.getId()); + + final String origName = player.getName(); + player.setName("UNKNOWN_PLAYER"); + player.getLocation().setX(33.1d); + player.getLocation().setZ(28.99d); + playerDAO.updateLocation(player); + + final String sql = "SELECT * FROM players WHERE id = ?"; + jdbcTemplate.query(sql, + ps -> ps.setInt(1, player.getId()), + rs -> { + assertEquals(player.getId(), rs.getInt("id")); + assertEquals(origName, rs.getString("name")); + assertEquals(player.getLocation().getX(), rs.getDouble("location_x"), 0.01d); + assertEquals(player.getLocation().getY(), rs.getDouble("location_y"), 0.01d); + assertEquals(player.getLocation().getZ(), rs.getDouble("location_z"), 0.01d); + assertEquals(player.getLocation().getYaw(), rs.getFloat("location_yaw"), 0.01f); + assertEquals(player.getLocation().getPitch(), rs.getFloat("location_pitch"), 0.01f); + assertEquals(player.getWorld().getName(), rs.getString("location_world")); + }); + } + + @Test + public void testRemove() throws SQLException { + playerDAO.insert(player); + assertNotEquals(0, player.getId()); + + final int origId = player.getId(); + playerDAO.remove(player); + assertEquals(0, player.getId()); + + final String sql = "SELECT COUNT(*) FROM players WHERE id = ?"; + jdbcTemplate.query(sql, + ps -> ps.setInt(1, origId), + rs -> {assertEquals(0, rs.getInt(1));}); + } +} diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java b/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java deleted file mode 100644 index 377d8b8..0000000 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestH2Database.java +++ /dev/null @@ -1,122 +0,0 @@ -package mc.core.h2db; - -import mc.core.EntityLocation; -import mc.core.world.World; -import org.apache.commons.io.IOUtils; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import javax.annotation.PostConstruct; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.sql.SQLException; -import java.util.UUID; -import java.util.concurrent.ThreadLocalRandom; - -import static org.junit.Assert.assertEquals; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = {SpringConfig.class}) -public class TestH2Database { - @Autowired - private JdbcTemplate jdbcTemplate; - @Autowired - private World mockWorld; - @Autowired - private H2PlayerSerializer h2PlayerSerializer; - private H2Player player; - - @PostConstruct - public void init() throws IOException { - jdbcTemplate.execute(IOUtils.resourceToString("/sqls/create_tables.sql", StandardCharsets.UTF_8)); - } - - private void createPlayer() { - final ThreadLocalRandom rnd = ThreadLocalRandom.current(); - final double minD = 0.0d, maxD = 10.0d; - final float minF = 0.0f, maxF = 359.9f; - final int minI = 1000, maxI = 9999; - - player = new H2Player(); - player.setUuid(UUID.randomUUID()); - player.setName("player" + rnd.nextInt(minI, maxI)); - player.setLocation(new EntityLocation( - rnd.nextDouble(minD, maxD), - rnd.nextDouble(minD, maxD), - rnd.nextDouble(minD, maxD), - rnd.nextFloat() * (maxF - minF) + minF, - rnd.nextFloat() * (maxF - minF) + minF - )); - player.setWorld(mockWorld); - } - - @Test - public void testConnect() { - final String sql = "SELECT 1"; - jdbcTemplate.execute(sql); - } - - @Test - public void testExistsTable() { - jdbcTemplate.execute("SELECT COUNT(*) FROM players"); - } - - @Test - public void testSerialize() throws SQLException { - createPlayer(); - h2PlayerSerializer.serialize(player); - - assertEquals(1, player.getId()); - - final String sql = "SELECT * FROM players WHERE id = ?"; - jdbcTemplate.query(sql, new Object[]{player.getId()}, (resultSet) -> { - assertEquals(player.getId(), resultSet.getInt("id")); - assertEquals(player.getName(), resultSet.getString("name")); - assertEquals(player.getLocation().getX(), resultSet.getDouble("location_x"), 0.01d); - assertEquals(player.getLocation().getY(), resultSet.getDouble("location_y"), 0.01d); - assertEquals(player.getLocation().getZ(), resultSet.getDouble("location_z"), 0.01d); - assertEquals(player.getLocation().getYaw(), resultSet.getFloat("location_yaw"), 0.01f); - assertEquals(player.getLocation().getPitch(), resultSet.getFloat("location_pitch"), 0.01f); - assertEquals(player.getWorld().getName(), resultSet.getString("location_world")); - }); - } - - @Test - public void testDeserialize() { - createPlayer(); - player.setId(2); - - final String sql = "INSERT INTO players VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);"; - int affectedRows = jdbcTemplate.update(sql, ps -> { - ps.setInt(1, player.getId()); - ps.setString(2, player.getUuid().toString()); - ps.setString(3, player.getName()); - ps.setDouble(4, player.getLocation().getX()); - ps.setDouble(5, player.getLocation().getY()); - ps.setDouble(6, player.getLocation().getZ()); - ps.setFloat(7, player.getLocation().getYaw()); - ps.setFloat(8, player.getLocation().getPitch()); - ps.setString(9, player.getWorld().getName()); - }); - assertEquals(1, affectedRows); - - H2Player queryPlayer = new H2Player(); - queryPlayer.setId(2); - h2PlayerSerializer.deserialize(queryPlayer); - assertEquals("Search by id", this.player, queryPlayer); - - queryPlayer = new H2Player(); - queryPlayer.setUuid(player.getUuid()); - h2PlayerSerializer.deserialize(queryPlayer); - assertEquals("Search by UUID", this.player, queryPlayer); - - queryPlayer = new H2Player(); - queryPlayer.setName(player.getName()); - h2PlayerSerializer.deserialize(queryPlayer); - assertEquals("Search by name", this.player, queryPlayer); - } -} From 6a4855f5a91b998164c37d4f82b96518b5db88bf Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 13 Sep 2018 22:53:47 +0300 Subject: [PATCH 45/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20H2Player=20equals?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/mc/core/h2db/TestH2Player.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 h2_playermanager/src/test/java/mc/core/h2db/TestH2Player.java diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestH2Player.java b/h2_playermanager/src/test/java/mc/core/h2db/TestH2Player.java new file mode 100644 index 0000000..4149c22 --- /dev/null +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestH2Player.java @@ -0,0 +1,36 @@ +package mc.core.h2db; + +import org.junit.Test; + +import java.util.UUID; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +public class TestH2Player { + @Test + public void testEquals() { + UUID uuid = UUID.randomUUID(); + + H2Player player1 = new H2Player(); + player1.setId(1); + player1.setUuid(uuid); + player1.setName("Player1"); + + H2Player player2 = new H2Player(); + player2.setId(1); + player2.setUuid(uuid); + player2.setName("Player2"); + + assertEquals(player1, player2); + + player2.setId(2); + + assertNotEquals(player1, player2); + + player2.setId(1); + player2.setUuid(UUID.randomUUID()); + + assertNotEquals(player1, player2); + } +} From df3ceba78966c6e9ebf6285660cb5855a2646973 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 14 Sep 2018 01:15:25 +0300 Subject: [PATCH 46/71] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=20H2PlayerDAO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/mc/core/h2db/H2Player.java | 6 +- .../main/java/mc/core/h2db/H2PlayerDAO.java | 81 +++++++++++- .../resources/sqls/insert_player_withId.sql | 2 + .../src/test/java/mc/core/h2db/TestDAO.java | 117 ++++++++++++++++++ 4 files changed, 199 insertions(+), 7 deletions(-) create mode 100644 h2_playermanager/src/main/resources/sqls/insert_player_withId.sql diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2Player.java b/h2_playermanager/src/main/java/mc/core/h2db/H2Player.java index a33b94a..8880503 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2Player.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2Player.java @@ -40,7 +40,11 @@ public class H2Player implements Player { @Override public void setWorld(World world) { - this.$refWorld = new WeakReference<>(world); + if (world == null) { + this.$refWorld = null; + } else { + this.$refWorld = new WeakReference<>(world); + } } @Override diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java index 8bd94b0..aa9135b 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java @@ -20,14 +20,32 @@ import java.util.UUID; @Slf4j @Component public class H2PlayerDAO { - private static String INSERT_SQL, SELECT_SQL, UPDATE_SQL, UPDATE_LOCATION_SQL, DELETE_SQL; + private static String INSERT_SQL, INSERT2_SQL, SELECT_SQL, UPDATE_SQL, UPDATE_LOCATION_SQL, DELETE_SQL; @Autowired private JdbcTemplate jdbcTemplate; @Autowired private World world; - public void insert(H2Player player) throws SQLException { + private void checkPlayer(H2Player player) throws SQLException { + if (player.getName() == null || player.getName().isEmpty()) { + throw new SQLException("Field 'name' is " + (player.getName() == null ? "null" : "empty")); + } + + if (player.getUuid() == null) { + throw new SQLException("Field 'uuid' is null"); + } + + if (player.getLocation() == null) { + throw new SQLException("Fields 'location_*' is null"); + } + + if (player.getWorld() == null) { + throw new SQLException("Field 'location_world' is null"); + } + } + + private void insertWithoutId(H2Player player) throws SQLException { KeyHolder keyHolder = new GeneratedKeyHolder(); int affectedRows = jdbcTemplate.update(psc -> { @@ -52,9 +70,41 @@ public class H2PlayerDAO { player.setId(keyHolder.getKey().intValue()); } + private void insertWithId(H2Player player) throws SQLException { + int affectedRows = jdbcTemplate.update(psc -> { + PreparedStatement stmt = psc.prepareStatement(INSERT2_SQL); + + stmt.setString(1, player.getUuid().toString()); + stmt.setString(2, player.getName()); + stmt.setDouble(3, player.getLocation().getX()); + stmt.setDouble(4, player.getLocation().getY()); + stmt.setDouble(5, player.getLocation().getZ()); + stmt.setFloat(6, player.getLocation().getYaw()); + stmt.setFloat(7, player.getLocation().getPitch()); + stmt.setString(8, player.getWorld().getName()); + stmt.setInt(9, player.getId()); + + return stmt; + }); + + if (affectedRows == 0) { + throw new SQLException("Serialize player failed: no rows affected."); + } + } + + public void insert(H2Player player) throws SQLException { + checkPlayer(player); + + if (player.getId() > 0) { + insertWithId(player); + } else { + insertWithoutId(player); + } + } + public void getByName(H2Player playerBuffer) throws SQLException { if (playerBuffer.getName() == null || playerBuffer.getName().isEmpty()) { - throw new SQLException("Argument 'name' is " + (playerBuffer.getName() == null ? "null" : "empty")); + throw new SQLException("Field 'name' is " + (playerBuffer.getName() == null ? "null" : "empty")); } jdbcTemplate.query(SELECT_SQL, @@ -81,9 +131,11 @@ public class H2PlayerDAO { public void update(H2Player player) throws SQLException { if (player.getId() == 0) { - throw new SQLException("Argument 'id' is zero"); + throw new SQLException("Field 'id' is zero"); } + checkPlayer(player); + int affectedRows = jdbcTemplate.update(UPDATE_SQL, pss -> { pss.setInt(9, player.getId()); pss.setString(1, player.getUuid().toString()); @@ -103,7 +155,23 @@ public class H2PlayerDAO { public void updateLocation(H2Player player) throws SQLException { if (player.getId() == 0) { - throw new SQLException("Argument 'id' is zero"); + throw new SQLException("Field 'id' is zero"); + } + + if (player.getLocation() == null) { + throw new SQLException("Fields 'location_*' is null"); + } + + if (player.getWorld() == null) { + throw new SQLException("Field 'location_world' is null"); + } + + if (player.getLocation() == null) { + throw new SQLException("Fields 'location_*' is null"); + } + + if (player.getWorld() == null) { + throw new SQLException("Field 'location_world' is null"); } int affectedRows = jdbcTemplate.update(connection -> { @@ -127,7 +195,7 @@ public class H2PlayerDAO { public void remove(H2Player player) throws SQLException { if (player.getId() == 0) { - throw new SQLException("Argument 'id' is zero"); + throw new SQLException("Field 'id' is zero"); } int affectedRows = jdbcTemplate.update(DELETE_SQL, pss -> pss.setInt(1, player.getId())); @@ -142,6 +210,7 @@ public class H2PlayerDAO { static { try { INSERT_SQL = IOUtils.resourceToString("/sqls/insert_player.sql", StandardCharsets.UTF_8); + INSERT2_SQL = IOUtils.resourceToString("/sqls/insert_player_withId.sql", StandardCharsets.UTF_8); SELECT_SQL = IOUtils.resourceToString("/sqls/select_player_byName.sql", StandardCharsets.UTF_8); UPDATE_SQL = IOUtils.resourceToString("/sqls/update_player.sql", StandardCharsets.UTF_8); UPDATE_LOCATION_SQL = IOUtils.resourceToString("/sqls/update_player_location.sql", StandardCharsets.UTF_8); diff --git a/h2_playermanager/src/main/resources/sqls/insert_player_withId.sql b/h2_playermanager/src/main/resources/sqls/insert_player_withId.sql new file mode 100644 index 0000000..c0119bc --- /dev/null +++ b/h2_playermanager/src/main/resources/sqls/insert_player_withId.sql @@ -0,0 +1,2 @@ +INSERT INTO players (uuid, name, location_x, location_y, location_z, location_yaw, location_pitch, location_world, id) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?); \ No newline at end of file diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java b/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java index 709ed52..a51e105 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java @@ -7,6 +7,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -81,6 +82,44 @@ public class TestDAO { assertPlayer(player); } + @Test(expected = DuplicateKeyException.class) + public void testInsertDuplicateKey() throws SQLException { + playerDAO.insert(player); + assertNotEquals(0, player.getId()); + + playerDAO.insert(player); + } + + @Test(expected = SQLException.class) + public void testInsertEmptyName() throws SQLException { + player.setName(""); + playerDAO.insert(player); + } + + @Test(expected = SQLException.class) + public void testInsertNullName() throws SQLException { + player.setName(null); + playerDAO.insert(player); + } + + @Test(expected = SQLException.class) + public void testInsertNullUuid() throws SQLException { + player.setUuid(null); + playerDAO.insert(player); + } + + @Test(expected = SQLException.class) + public void testInsertNullLocation() throws SQLException { + player.setLocation(null); + playerDAO.insert(player); + } + + @Test(expected = SQLException.class) + public void testInsertNullWorld() throws SQLException { + player.setWorld(null); + playerDAO.insert(player); + } + @Test public void testGetByName() throws SQLException { playerDAO.insert(this.player); @@ -98,6 +137,21 @@ public class TestDAO { assertEquals(player, this.player); } + @Test + public void testGetByNonExistsName() throws SQLException { + playerDAO.insert(this.player); + assertNotEquals(0, player.getId()); + + H2Player player = new H2Player(); + player.setName("NON_EXISTS_NAME"); + + assertNotNull(player.getName()); + assertFalse(player.getName().isEmpty()); + + playerDAO.getByName(player); + assertEquals(0, player.getId()); + } + @Test public void testUpdate() throws SQLException { playerDAO.insert(player); @@ -109,6 +163,51 @@ public class TestDAO { assertPlayer(player); } + @Test(expected = SQLException.class) + public void testUpdateEmptyName() throws SQLException { + playerDAO.insert(player); + assertNotEquals(0, player.getId()); + + player.setName(""); + playerDAO.update(player); + } + + @Test(expected = SQLException.class) + public void testUpdateNullName() throws SQLException { + playerDAO.insert(player); + assertNotEquals(0, player.getId()); + + player.setName(null); + playerDAO.update(player); + } + + @Test(expected = SQLException.class) + public void testUpdateNullUuid() throws SQLException { + playerDAO.insert(player); + assertNotEquals(0, player.getId()); + + player.setUuid(null); + playerDAO.update(player); + } + + @Test(expected = SQLException.class) + public void testUpdateNullLocation() throws SQLException { + playerDAO.insert(player); + assertNotEquals(0, player.getId()); + + player.setLocation(null); + playerDAO.update(player); + } + + @Test(expected = SQLException.class) + public void testUpdateNullWorld() throws SQLException { + playerDAO.insert(player); + assertNotEquals(0, player.getId()); + + player.setWorld(null); + playerDAO.update(player); + } + @Test public void testUpdateLocation() throws SQLException { playerDAO.insert(player); @@ -135,6 +234,15 @@ public class TestDAO { }); } + @Test(expected = SQLException.class) + public void testUpdateLocationNull() throws SQLException { + playerDAO.insert(player); + assertNotEquals(0, player.getId()); + + player.setLocation(null); + playerDAO.updateLocation(player); + } + @Test public void testRemove() throws SQLException { playerDAO.insert(player); @@ -149,4 +257,13 @@ public class TestDAO { ps -> ps.setInt(1, origId), rs -> {assertEquals(0, rs.getInt(1));}); } + + @Test(expected = SQLException.class) + public void testRemoveNonExistsId() throws SQLException { + playerDAO.insert(player); + assertNotEquals(0, player.getId()); + + player.setId(999); + playerDAO.remove(player); + } } From 3e6d0687ab115d7f77b6fb16ad85f87ac6447af6 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 14 Sep 2018 01:16:55 +0300 Subject: [PATCH 47/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=B8=D0=BD=D0=B4=D0=B5=D0=BA=D1=81=D1=8B?= =?UTF-8?q?=20=D0=B2=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/sqls/create_tables.sql | 9 ++++++--- h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java | 2 ++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/h2_playermanager/src/main/resources/sqls/create_tables.sql b/h2_playermanager/src/main/resources/sqls/create_tables.sql index a7d2209..f302295 100644 --- a/h2_playermanager/src/main/resources/sqls/create_tables.sql +++ b/h2_playermanager/src/main/resources/sqls/create_tables.sql @@ -1,6 +1,6 @@ CREATE TABLE IF NOT EXISTS players ( - id INT AUTO_INCREMENT, - uuid VARCHAR(36) NOT NULL, + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + uuid VARCHAR(36) NOT NULL UNIQUE, name VARCHAR(16) NOT NULL, location_x DOUBLE NOT NULL, location_y DOUBLE NOT NULL, @@ -8,4 +8,7 @@ CREATE TABLE IF NOT EXISTS players ( location_yaw FLOAT NOT NULL, location_pitch FLOAT NOT NULL, location_world varchar(64) NOT NULL -); \ No newline at end of file +); + +CREATE INDEX idx_players_uuid ON players(uuid); +CREATE INDEX idx_players_name ON players(name); \ No newline at end of file diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java b/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java index a51e105..355cfe8 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java @@ -68,6 +68,8 @@ public class TestDAO { @Before public void init() throws IOException { + jdbcTemplate.execute("DROP INDEX IF EXISTS idx_players_uuid;"); + jdbcTemplate.execute("DROP INDEX IF EXISTS idx_players_name;"); jdbcTemplate.execute("DROP TABLE IF EXISTS players;"); jdbcTemplate.execute(IOUtils.resourceToString("/sqls/create_tables.sql", StandardCharsets.UTF_8)); createPlayer(); From 5a0b29c2ba8c088c6ae131133da263508a559d37 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 16 Sep 2018 00:06:28 +0300 Subject: [PATCH 48/71] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20PlayerManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/core/embedded/FakePlayerManager.java | 20 +++--- .../mc/core/player/InMemoryPlayerManager.java | 21 ++++--- .../java/mc/core/player/PlayerManager.java | 13 ++-- .../netty/handlers/LoginHandler.java | 62 ++++++++----------- .../netty/handlers/StatusHandler.java | 2 +- .../main/java/mc/commands/ListCommand.java | 2 +- 6 files changed, 53 insertions(+), 67 deletions(-) diff --git a/core/src/main/java/mc/core/embedded/FakePlayerManager.java b/core/src/main/java/mc/core/embedded/FakePlayerManager.java index a1932e3..5743632 100644 --- a/core/src/main/java/mc/core/embedded/FakePlayerManager.java +++ b/core/src/main/java/mc/core/embedded/FakePlayerManager.java @@ -1,7 +1,3 @@ -/* - * DmitriyMX - * 2018-06-29 - */ package mc.core.embedded; import mc.core.EntityLocation; @@ -65,13 +61,8 @@ public class FakePlayerManager implements PlayerManager { } @Override - public Optional getPlayer(String name) { - return Optional.empty(); - } - - @Override - public Optional getPlayerById(int id) { - return Optional.empty(); + public Player getPlayer(String name) { + return null; } @Override @@ -80,7 +71,7 @@ public class FakePlayerManager implements PlayerManager { } @Override - public int getCountOnlinePlayers() { + public int getCountPlayers() { return 0; } @@ -88,4 +79,9 @@ public class FakePlayerManager implements PlayerManager { public NetChannel getBroadcastChannel() { return FAKE_NET_CHANNEL; } + + @Override + public Player getOfflinePlayer(String name) { + return null; + } } diff --git a/core/src/main/java/mc/core/player/InMemoryPlayerManager.java b/core/src/main/java/mc/core/player/InMemoryPlayerManager.java index 765201e..5bf7785 100644 --- a/core/src/main/java/mc/core/player/InMemoryPlayerManager.java +++ b/core/src/main/java/mc/core/player/InMemoryPlayerManager.java @@ -59,17 +59,10 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable { } @Override - public Optional getPlayer(final String name) { + public Player getPlayer(final String name) { return players.stream() .filter(player -> player.getName().equalsIgnoreCase(name)) - .findFirst(); - } - - @Override - public Optional getPlayerById(final int id) { - return players.stream() - .filter(player -> player.getId() == id) - .findFirst(); + .findFirst().get(); } @Override @@ -78,7 +71,7 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable { } @Override - public int getCountOnlinePlayers() { + public int getCountPlayers() { return (int) players.stream().filter(Player::isOnline).count(); } @@ -87,6 +80,14 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable { return new BroadcastNetChannel(players.stream().filter(Player::isOnline)); } + @Override + public Player getOfflinePlayer(String name) { + return players.stream() + .filter(player -> player.getName().equals(name)) + .filter(player -> !player.isOnline()) + .findFirst().orElse(null); + } + @Override public void run() { while (!Thread.currentThread().isInterrupted()) { diff --git a/core/src/main/java/mc/core/player/PlayerManager.java b/core/src/main/java/mc/core/player/PlayerManager.java index 1ac8543..4fe5485 100644 --- a/core/src/main/java/mc/core/player/PlayerManager.java +++ b/core/src/main/java/mc/core/player/PlayerManager.java @@ -1,7 +1,3 @@ -/* - * DmitriyMX - * 2018-04-15 - */ package mc.core.player; import mc.core.EntityLocation; @@ -9,15 +5,16 @@ import mc.core.network.NetChannel; import mc.core.world.World; import java.util.List; -import java.util.Optional; public interface PlayerManager { Player createPlayer(String name, EntityLocation location, World world); void joinServer(Player player); void leftServer(Player player); - Optional getPlayer(String name); - Optional getPlayerById(int id); + + Player getPlayer(String name); List getPlayers(); - int getCountOnlinePlayers(); + int getCountPlayers(); NetChannel getBroadcastChannel(); + + Player getOfflinePlayer(String name); } diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java index 5be9458..084d7f7 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java @@ -24,9 +24,6 @@ import mc.core.world.chunk.Chunk; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.Optional; -import java.util.UUID; - import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_PLAYER; import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_STATE; @@ -39,8 +36,8 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand @Handler public void onLoginStart(Channel channel, LoginStartPacket packet) { - Optional optPlayer = playerManager.getPlayer(packet.getPlayerName()); - if (optPlayer.isPresent() && optPlayer.get().isOnline()) { + Player player = playerManager.getPlayer(packet.getPlayerName()); + if (player != null) { channel.writeAndFlush(new DisconnectPacket( Text.builder("Player \"") .append(Text.of(packet.getPlayerName(), TextColor.YELLOW)) @@ -48,11 +45,22 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand .build())) .addListener(ChannelFutureListener.CLOSE); } else { - Player player = playerManager.getPlayer(packet.getPlayerName()) - .orElseGet(() -> playerManager.createPlayer( - packet.getPlayerName(), - world.getSpawn(), - world)); + player = playerManager.getOfflinePlayer(packet.getPlayerName()); + + if (player == null) { + player = playerManager.createPlayer( + packet.getPlayerName(), + world.getSpawn(), + world + ); + + if (player == null) { + channel.writeAndFlush(new DisconnectPacket( + Text.of("Internal server error: can't create new player")) + ).addListener(ChannelFutureListener.CLOSE); + return; + } + } channel.writeAndFlush(new LoginSuccessPacket( player.getUuid(), @@ -62,10 +70,10 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand // Join Game JoinGamePacket pkt1 = new JoinGamePacket(); - pkt1.setEntityId(player.getId()); - pkt1.setMode(PlayerMode.CREATIVE); - pkt1.setDimension(0/*Overworld*/); - pkt1.setDifficulty(0/*Peaceful*/); + pkt1.setEntityId(player.getId()); //TODO отделить системный ID от EntityID + pkt1.setMode(PlayerMode.CREATIVE); //TODO перенести в Config + pkt1.setDimension(0/*Overworld*/); //TODO перенести в World + pkt1.setDifficulty(0/*Peaceful*/); //TODO перенести в Config pkt1.setLevelType(world.getWorldType().getName()); channel.write(pkt1); @@ -75,15 +83,17 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand channel.write(pkt2); // Player Abilities - PlayerAbilitiesPacket pkt3 = new PlayerAbilitiesPacket(); + PlayerAbilitiesPacket pkt3 = new PlayerAbilitiesPacket(); //TODO перенести в Player pkt3.setCanFly(true); pkt3.setFlying(true); pkt3.setGodMode(true); pkt3.setInstantDestroyBlocks(true); channel.write(pkt3); + channel.flush(); // First Chunk + //TODO необходимо отправлять больше начальных чанков ChunkDataPacket pkt8 = new ChunkDataPacket(); Chunk chunk = player.getWorld().getChunk(player.getLocation()); pkt8.setX(chunk.getX()); @@ -91,6 +101,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand pkt8.setChunk(chunk); pkt8.setInitChunk(true); channel.writeAndFlush(pkt8); + player.getLoadedChunks().add(CompactedCoords.compressXZ(0, 0)); // Player Position And Look @@ -102,6 +113,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand player.setChannel(new WrapperNetChannel(channel)); // Send items + //TODO обновление должно приходить всем игрокам на сервере PlayerListItemPacket pkt5 = new PlayerListItemPacket(); pkt5.setAction(PlayerListItemPacket.Action.ADD_PLAYER); PlayerListItemPacket.PlayerData playerData = new PlayerListItemPacket.PlayerData(); @@ -118,26 +130,6 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand pkt5.getListPlayers().add(playerData); channel.writeAndFlush(pkt5); - // Send header/footer list - PlayerListHeaderAndFooterPacket pkt6 = new PlayerListHeaderAndFooterPacket(); - Text text = Text.of(TextColor.GOLD, "============================="); - pkt6.setHeader(text); - pkt6.setFooter(text); - channel.writeAndFlush(pkt6); - - // Send Boss bar - BossBarPacket pkt7 = new BossBarPacket(); - BossBarPacket.BarData barData = new BossBarPacket.BarData(); - barData.setTitle(Text.of(TextColor.GREEN, TextStyle.BOLD, "FORWOLK")); - barData.setColor(BossBarPacket.Color.WHITE); - barData.setDivision(BossBarPacket.Division._12); - barData.setHealth(1.0f); - barData.setFlags(BossBarPacket.Flag.NO); - pkt7.setUuid(UUID.randomUUID()); - pkt7.setAction(BossBarPacket.Action.ADD); - pkt7.setBarData(barData); - channel.writeAndFlush(pkt7); - playerManager.joinServer(player); CS_PlayerMoveEvent event = new CS_PlayerMoveEvent(player, player.getLocation()); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StatusHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StatusHandler.java index 1216cce..10c48fc 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StatusHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/StatusHandler.java @@ -26,7 +26,7 @@ public class StatusHandler extends AbstractStateHandler implements StatusStateHa responsePacket.setMaxOnline(config.getMaxPlayers()); responsePacket.setDescription(config.getDescriptionServer()); responsePacket.setFaviconBase64(config.getFaviconBase64()); - responsePacket.setOnline(playerManager.getCountOnlinePlayers()); + responsePacket.setOnline(playerManager.getCountPlayers()); channel.writeAndFlush(responsePacket); } diff --git a/vanilla_commands/src/main/java/mc/commands/ListCommand.java b/vanilla_commands/src/main/java/mc/commands/ListCommand.java index a899c0e..82411a6 100644 --- a/vanilla_commands/src/main/java/mc/commands/ListCommand.java +++ b/vanilla_commands/src/main/java/mc/commands/ListCommand.java @@ -53,7 +53,7 @@ public class ListCommand implements CommandExecutor { playerManager.getPlayers().forEach(pl -> sj.add(pl.getName())); Text message = messageFormat.apply( - "count", playerManager.getCountOnlinePlayers(), + "count", playerManager.getCountPlayers(), "players", sj.toString()); sender.getChannel().sendChatMessage(message, MessageType.SYSTEM_MESSAGE); } From 6316e14544b2c8e5f3e2da06675151832df8a917 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 16 Sep 2018 00:24:51 +0300 Subject: [PATCH 49/71] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20H2PlayerDAO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/core/h2db/H2PlayerDAO.java | 73 +++++++++++++------ .../src/main/resources/sqls/create_tables.sql | 2 +- .../resources/sqls/select_player_byId.sql | 3 + .../resources/sqls/select_player_byName.sql | 2 +- .../src/test/java/mc/core/h2db/TestDAO.java | 49 ++++++++----- .../resources/sqls/drop_table_players.sql | 3 + 6 files changed, 92 insertions(+), 40 deletions(-) create mode 100644 h2_playermanager/src/main/resources/sqls/select_player_byId.sql create mode 100644 h2_playermanager/src/test/resources/sqls/drop_table_players.sql diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java index aa9135b..279c3d6 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java @@ -13,6 +13,7 @@ import org.springframework.stereotype.Component; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.UUID; @@ -20,7 +21,10 @@ import java.util.UUID; @Slf4j @Component public class H2PlayerDAO { - private static String INSERT_SQL, INSERT2_SQL, SELECT_SQL, UPDATE_SQL, UPDATE_LOCATION_SQL, DELETE_SQL; + private static String INSERT_SQL, INSERT2_SQL, + SELECT_BYNAME_SQL, SELECT_BYID_SQL, + UPDATE_SQL, UPDATE_LOCATION_SQL, + DELETE_SQL; @Autowired private JdbcTemplate jdbcTemplate; @@ -102,31 +106,57 @@ public class H2PlayerDAO { } } - public void getByName(H2Player playerBuffer) throws SQLException { + private void locationDeserialize(H2Player playerBuffer, ResultSet resultSet) throws SQLException { + if (!world.getName().equals(resultSet.getString("location_world"))) { + log.warn("Unknown world \"{}\"", resultSet.getString("location_world")); + log.warn("Using default (spawn) location for user \"{}\"", playerBuffer.getName()); + playerBuffer.setLocation(world.getSpawn().clone()); + } else { + playerBuffer.setLocation(new EntityLocation( + resultSet.getDouble("location_x"), + resultSet.getDouble("location_y"), + resultSet.getDouble("location_z"), + resultSet.getFloat("location_yaw"), + resultSet.getFloat("location_pitch") + )); + playerBuffer.setWorld(world); + } + } + + public boolean getByName(H2Player playerBuffer) throws SQLException { if (playerBuffer.getName() == null || playerBuffer.getName().isEmpty()) { throw new SQLException("Field 'name' is " + (playerBuffer.getName() == null ? "null" : "empty")); } - jdbcTemplate.query(SELECT_SQL, + final boolean[] result = new boolean[]{false}; + jdbcTemplate.query(SELECT_BYNAME_SQL, ps -> ps.setString(1, playerBuffer.getName()), rs -> { playerBuffer.setId(rs.getInt("id")); playerBuffer.setUuid(UUID.fromString(rs.getString("uuid"))); - if (!world.getName().equals(rs.getString("location_world"))) { - log.warn("Unknown world \"{}\"", rs.getString("location_world")); - log.warn("Using default (spawn) location for user \"{}\"", playerBuffer.getName()); - playerBuffer.setLocation(world.getSpawn().clone()); - } else { - playerBuffer.setLocation(new EntityLocation( - rs.getDouble("location_x"), - rs.getDouble("location_y"), - rs.getDouble("location_z"), - rs.getFloat("location_yaw"), - rs.getFloat("location_pitch") - )); - playerBuffer.setWorld(world); - } + locationDeserialize(playerBuffer, rs); + result[0] = true; }); + + return result[0]; + } + + public boolean getById(H2Player playerBuffer) throws SQLException { + if (playerBuffer.getId() == 0) { + throw new SQLException("Field 'id' is zero"); + } + + final boolean[] result = new boolean[]{false}; + jdbcTemplate.query(SELECT_BYID_SQL, + ps -> ps.setInt(1, playerBuffer.getId()), + rs -> { + playerBuffer.setUuid(UUID.fromString(rs.getString("uuid"))); + playerBuffer.setName(rs.getString("name")); + locationDeserialize(playerBuffer, rs); + result[0] = true; + }); + + return result[0]; } public void update(H2Player player) throws SQLException { @@ -149,7 +179,7 @@ public class H2PlayerDAO { }); if (affectedRows == 0) { - throw new SQLException("Serialize player failed, no rows affected."); + throw new SQLException("Update player failed, no rows affected."); } } @@ -189,7 +219,7 @@ public class H2PlayerDAO { }); if (affectedRows == 0) { - throw new SQLException("Serialize player failed, no rows affected."); + throw new SQLException("Update player failed, no rows affected."); } } @@ -201,7 +231,7 @@ public class H2PlayerDAO { int affectedRows = jdbcTemplate.update(DELETE_SQL, pss -> pss.setInt(1, player.getId())); if (affectedRows == 0) { - throw new SQLException("Serialize player failed, no rows affected."); + throw new SQLException("Remove player failed, no rows affected."); } player.setId(0); @@ -211,7 +241,8 @@ public class H2PlayerDAO { try { INSERT_SQL = IOUtils.resourceToString("/sqls/insert_player.sql", StandardCharsets.UTF_8); INSERT2_SQL = IOUtils.resourceToString("/sqls/insert_player_withId.sql", StandardCharsets.UTF_8); - SELECT_SQL = IOUtils.resourceToString("/sqls/select_player_byName.sql", StandardCharsets.UTF_8); + SELECT_BYNAME_SQL = IOUtils.resourceToString("/sqls/select_player_byName.sql", StandardCharsets.UTF_8); + SELECT_BYID_SQL = IOUtils.resourceToString("/sqls/select_player_byId.sql", StandardCharsets.UTF_8); UPDATE_SQL = IOUtils.resourceToString("/sqls/update_player.sql", StandardCharsets.UTF_8); UPDATE_LOCATION_SQL = IOUtils.resourceToString("/sqls/update_player_location.sql", StandardCharsets.UTF_8); DELETE_SQL = IOUtils.resourceToString("/sqls/delete_player.sql", StandardCharsets.UTF_8); diff --git a/h2_playermanager/src/main/resources/sqls/create_tables.sql b/h2_playermanager/src/main/resources/sqls/create_tables.sql index f302295..a53b23d 100644 --- a/h2_playermanager/src/main/resources/sqls/create_tables.sql +++ b/h2_playermanager/src/main/resources/sqls/create_tables.sql @@ -7,7 +7,7 @@ CREATE TABLE IF NOT EXISTS players ( location_z DOUBLE NOT NULL, location_yaw FLOAT NOT NULL, location_pitch FLOAT NOT NULL, - location_world varchar(64) NOT NULL + location_world VARCHAR(64) NOT NULL ); CREATE INDEX idx_players_uuid ON players(uuid); diff --git a/h2_playermanager/src/main/resources/sqls/select_player_byId.sql b/h2_playermanager/src/main/resources/sqls/select_player_byId.sql new file mode 100644 index 0000000..0267ce6 --- /dev/null +++ b/h2_playermanager/src/main/resources/sqls/select_player_byId.sql @@ -0,0 +1,3 @@ +SELECT uuid, name, location_x, location_y, location_z, location_yaw, location_pitch, location_world +FROM players WHERE id = ? +LIMIT 1; \ No newline at end of file diff --git a/h2_playermanager/src/main/resources/sqls/select_player_byName.sql b/h2_playermanager/src/main/resources/sqls/select_player_byName.sql index 1a8f47a..36a9b3d 100644 --- a/h2_playermanager/src/main/resources/sqls/select_player_byName.sql +++ b/h2_playermanager/src/main/resources/sqls/select_player_byName.sql @@ -1,3 +1,3 @@ -SELECT id, uuid, name, location_x, location_y, location_z, location_yaw, location_pitch, location_world +SELECT id, uuid, location_x, location_y, location_z, location_yaw, location_pitch, location_world FROM players WHERE name LIKE ? LIMIT 1; \ No newline at end of file diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java b/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java index 355cfe8..4c9c094 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java @@ -67,10 +67,8 @@ public class TestDAO { } @Before - public void init() throws IOException { - jdbcTemplate.execute("DROP INDEX IF EXISTS idx_players_uuid;"); - jdbcTemplate.execute("DROP INDEX IF EXISTS idx_players_name;"); - jdbcTemplate.execute("DROP TABLE IF EXISTS players;"); + public void before() throws IOException { + jdbcTemplate.execute(IOUtils.resourceToString("/sqls/drop_table_players.sql", StandardCharsets.UTF_8)); jdbcTemplate.execute(IOUtils.resourceToString("/sqls/create_tables.sql", StandardCharsets.UTF_8)); createPlayer(); assertEquals(0, player.getId()); @@ -125,33 +123,50 @@ public class TestDAO { @Test public void testGetByName() throws SQLException { playerDAO.insert(this.player); - assertNotEquals(0, player.getId()); - H2Player player = new H2Player(); - player.setName(this.player.getName()); + H2Player queryPlayer = new H2Player(); + queryPlayer.setName(player.getName()); - assertNotNull(player.getName()); - assertFalse(player.getName().isEmpty()); - assertEquals(this.player.getName(), player.getName()); + boolean result = playerDAO.getByName(queryPlayer); - playerDAO.getByName(player); + assertTrue(result); + assertEquals(player, queryPlayer); + } - assertEquals(player, this.player); + @Test + public void testGetById() throws SQLException { + playerDAO.insert(this.player); + + H2Player queryPlayer = new H2Player(); + queryPlayer.setId(player.getId()); + + boolean result = playerDAO.getById(queryPlayer); + + assertTrue(result); + assertEquals(player, queryPlayer); } @Test public void testGetByNonExistsName() throws SQLException { playerDAO.insert(this.player); - assertNotEquals(0, player.getId()); H2Player player = new H2Player(); player.setName("NON_EXISTS_NAME"); - assertNotNull(player.getName()); - assertFalse(player.getName().isEmpty()); + boolean result = playerDAO.getByName(player); + assertFalse(result); + } - playerDAO.getByName(player); - assertEquals(0, player.getId()); + @Test + public void testGetByNonExistsId() throws SQLException { + playerDAO.insert(player); + assertEquals(1, player.getId()); + + H2Player queryPlayer = new H2Player(); + queryPlayer.setId(999); + + boolean result = playerDAO.getById(queryPlayer); + assertFalse(result); } @Test diff --git a/h2_playermanager/src/test/resources/sqls/drop_table_players.sql b/h2_playermanager/src/test/resources/sqls/drop_table_players.sql new file mode 100644 index 0000000..dd4ab91 --- /dev/null +++ b/h2_playermanager/src/test/resources/sqls/drop_table_players.sql @@ -0,0 +1,3 @@ +DROP INDEX IF EXISTS idx_players_uuid; +DROP INDEX IF EXISTS idx_players_name; +DROP TABLE IF EXISTS players; \ No newline at end of file From 41c2e4933db04680ae530bb4f71295b79a773e8d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 16 Sep 2018 00:26:13 +0300 Subject: [PATCH 50/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20H2PlayerManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/mc/core/h2db/H2PlayerManager.java | 135 +++++++++++++ .../test/java/mc/core/h2db/SpringConfig.java | 9 + .../mc/core/h2db/TestH2PlayerManager.java | 181 ++++++++++++++++++ 3 files changed, 325 insertions(+) create mode 100644 h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java create mode 100644 h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java new file mode 100644 index 0000000..fdd4b11 --- /dev/null +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java @@ -0,0 +1,135 @@ +package mc.core.h2db; + +import com.google.common.collect.ImmutableList; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import mc.core.EntityLocation; +import mc.core.network.BroadcastNetChannel; +import mc.core.network.NetChannel; +import mc.core.player.Player; +import mc.core.player.PlayerManager; +import mc.core.world.World; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static org.slf4j.helpers.MessageFormatter.format; + +@Slf4j +@Component +public class H2PlayerManager implements PlayerManager { + @Setter + @Autowired + private H2PlayerDAO h2playerDao; + private List playerList = new ArrayList<>(); + + @Override + public Player createPlayer(String name, EntityLocation location, World world) { + //TODO в дальнейшем следует в этом методе только имплементацию Player + H2Player h2Player = new H2Player(); + h2Player.setName(name); + h2Player.setUuid(UUID.randomUUID()); + h2Player.setLocation(location.clone()); + h2Player.setLoadedChunks(new ArrayList<>()); + h2Player.setWorld(world); + + try { + h2playerDao.insert(h2Player); + } catch (SQLException e) { + log.error(format("Insert player '{}'", h2Player.getName()).getMessage(), e); + return null; + } + + return h2Player; + } + + @Override + public void joinServer(Player player) { + //TODO в дальнейшем следует именно этому методу передать функции инсерта в БД + H2Player h2Player = (H2Player) player; + playerList.add(h2Player); + h2Player.setOnline(true); + } + + @Override + public void leftServer(Player player) { + H2Player h2Player = (H2Player) player; + try { + h2playerDao.update(h2Player); + } catch (SQLException e) { + log.error(format("Update player '{}'", h2Player.getName()).getMessage(), e); + playerList.remove(h2Player); + } finally { + h2Player.setId(0); + h2Player.setOnline(false); + h2Player.setWorld(null); + h2Player.getLoadedChunks().clear(); + h2Player.setSettings(null); + } + } + + @Override + public Player getPlayer(String name) { + return playerList.stream() + .filter(player -> player.getName().equals(name)) + .filter(H2Player::isOnline) + .findFirst().orElse(null); + } + + @Override + public List getPlayers() { + return playerList.stream() + .filter(H2Player::isOnline) + .collect(ImmutableList.toImmutableList()); + } + + @Override + public int getCountPlayers() { + return (int) playerList.stream() + .filter(H2Player::isOnline) + .count(); + } + + @Override + public NetChannel getBroadcastChannel() { + return new BroadcastNetChannel( + playerList.stream() + .filter(H2Player::isOnline) + .map(player -> (Player)player) + ); + } + + @Override + public Player getOfflinePlayer(String name) { + H2Player h2Player = playerList.stream() + .filter(player -> player.getName().equals(name)) + .filter(player -> !player.isOnline()) + .findFirst().orElse(null); + + if (h2Player == null) { + h2Player = playerList.stream() + .filter(player -> !player.isOnline()) + .findAny().orElse(new H2Player()); + h2Player.setName(name); + + try { + h2playerDao.getByName(h2Player); + } catch (SQLException e) { + log.error(format("getByName player '{}'", h2Player.getName()).getMessage(), e); + return null; + } + + if (h2Player.getId() == 0) { + return null; + } else { + return h2Player; + } + } else { + return h2Player; + } + } +} diff --git a/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java b/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java index e4417e3..58eb283 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java @@ -4,6 +4,7 @@ import mc.core.world.World; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DriverManagerDataSource; @@ -37,4 +38,12 @@ public class SpringConfig { jdbcTemplate.setDataSource(dataSource); return jdbcTemplate; } + + @Bean + @Scope(value = "prototype") + public H2PlayerManager h2PlayerManager(H2PlayerDAO h2PlayerDAO) { + H2PlayerManager playerManager = new H2PlayerManager(); + playerManager.setH2playerDao(h2PlayerDAO); + return playerManager; + } } diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java b/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java new file mode 100644 index 0000000..163f72c --- /dev/null +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java @@ -0,0 +1,181 @@ +package mc.core.h2db; + +import mc.core.EntityLocation; +import mc.core.player.Player; +import mc.core.world.World; +import org.apache.commons.io.IOUtils; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.sql.SQLException; +import java.util.List; + +import static org.junit.Assert.*; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = {SpringConfig.class}) +public class TestH2PlayerManager { + @Autowired + private ApplicationContext context; + @Autowired + private JdbcTemplate jdbcTemplate; + @Autowired + private H2PlayerDAO h2PlayerDAO; + @Autowired + private World mockWorld; + private H2PlayerManager playerManager; + + @Before + public void before() throws IOException { + playerManager = context.getBean(H2PlayerManager.class); + + jdbcTemplate.execute(IOUtils.resourceToString("/sqls/drop_table_players.sql", StandardCharsets.UTF_8)); + jdbcTemplate.execute(IOUtils.resourceToString("/sqls/create_tables.sql", StandardCharsets.UTF_8)); + } + + @Test + public void testCreatePlayer() throws SQLException { + final String playerName = "NEW_PLAYER"; + final Player newPlayer = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); + + assertNotNull(newPlayer); + assertEquals(H2Player.class, newPlayer.getClass()); + assertTrue(newPlayer.getId() > 0); + + final H2Player queryPlayer = new H2Player(); + queryPlayer.setName(playerName); + h2PlayerDAO.getByName(queryPlayer); + assertTrue(queryPlayer.getId() > 0); + + assertEquals(newPlayer, queryPlayer); + assertEquals(newPlayer.getName(), queryPlayer.getName()); + assertEquals(newPlayer.getLocation(), queryPlayer.getLocation()); + assertEquals(newPlayer.getWorld(), queryPlayer.getWorld()); + } + + @Test + public void testJoinServer() { + assertEquals(0, playerManager.getCountPlayers()); + + final String playerName = "NEW_PLAYER"; + final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); + playerManager.joinServer(player); + + assertEquals(1, playerManager.getCountPlayers()); + assertTrue(player.isOnline()); + } + + @Test + public void testLeftServer() throws SQLException { + assertEquals(0, playerManager.getCountPlayers()); + + final String playerName = "NEW_PLAYER"; + final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); + playerManager.joinServer(player); + + assertEquals(1, playerManager.getCountPlayers()); + assertTrue(player.isOnline()); + + final int playerId = player.getId(); + + final String anotherName = "ANOTHER_NAME"; + ((H2Player)player).setName(anotherName); + + playerManager.leftServer(player); + + assertEquals(0, playerManager.getCountPlayers()); + + assertFalse(player.isOnline()); + assertEquals(0, player.getId()); + assertNull(player.getWorld()); + assertTrue(player.getLoadedChunks().isEmpty()); + assertNull(player.getSettings()); + + H2Player queryPlayer = new H2Player(); + queryPlayer.setId(playerId); + boolean result = h2PlayerDAO.getById(queryPlayer); + + assertTrue(result); + ((H2Player)player).setId(playerId); + assertEquals(player, queryPlayer); + } + + @Test + public void testGetPlayer() { + assertEquals(0, playerManager.getCountPlayers()); + + final String playerName = "NEW_PLAYER"; + final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); + assertNotNull(player); + + playerManager.joinServer(player); + + assertEquals(1, playerManager.getCountPlayers()); + + Player queryPlayer = playerManager.getPlayer(playerName); + + assertEquals(player, queryPlayer); + } + + @Test + public void testGetPlayers() { + assertEquals(0, playerManager.getCountPlayers()); + + final String playerName = "NEW_PLAYER"; + final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); + assertNotNull(player); + + playerManager.joinServer(player); + + assertEquals(1, playerManager.getCountPlayers()); + + List players = playerManager.getPlayers(); + assertEquals(1, players.size()); + try { + players.add(new H2Player()); + fail(); + } catch (Exception e) { + assertTrue(true); + } + + assertEquals(player, players.get(0)); + } + + @Test + public void testGetCountPlayers() { + assertEquals(0, playerManager.getCountPlayers()); + + final String playerName = "NEW_PLAYER"; + final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); + assertNotNull(player); + + playerManager.joinServer(player); + + assertEquals(1, playerManager.getCountPlayers()); + + playerManager.leftServer(player); + + assertEquals(0, playerManager.getCountPlayers()); + } + + @Test + public void testGetOfflinePlayer() { + final String playerName = "NEW_PLAYER"; + final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); + playerManager.joinServer(player); + playerManager.leftServer(player); + + assertEquals(0, playerManager.getCountPlayers()); + + Player offlinePlayer = playerManager.getOfflinePlayer(playerName); + assertEquals(player, offlinePlayer); + } +} From 384ae13ecf640c2b8686a2af5996aa8e005618f2 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 16 Sep 2018 18:14:22 +0300 Subject: [PATCH 51/71] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=20In?= =?UTF-8?q?MemoryPlayerManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/core/player/InMemoryPlayerManager.java | 113 ------------------ .../java/mc/core/player/SimplePlayer.java | 56 --------- 2 files changed, 169 deletions(-) delete mode 100644 core/src/main/java/mc/core/player/InMemoryPlayerManager.java delete mode 100644 core/src/main/java/mc/core/player/SimplePlayer.java diff --git a/core/src/main/java/mc/core/player/InMemoryPlayerManager.java b/core/src/main/java/mc/core/player/InMemoryPlayerManager.java deleted file mode 100644 index 5bf7785..0000000 --- a/core/src/main/java/mc/core/player/InMemoryPlayerManager.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * DmitriyMX - * 2018-04-15 - */ -package mc.core.player; - -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import mc.core.Config; -import mc.core.EntityLocation; -import mc.core.network.BroadcastNetChannel; -import mc.core.network.NetChannel; -import mc.core.world.World; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.*; -import java.util.stream.Collectors; - -@Slf4j -public class InMemoryPlayerManager implements PlayerManager, Runnable { - private static final Random rand = new Random(); - private List players; - private final Object lock = new Object(); - @Setter - private int keepAliveInterval = 1; - - @Autowired - public InMemoryPlayerManager(Config config) { - final int c = config.getMaxPlayers() > 50 ? 50 : config.getMaxPlayers(); - players = Collections.synchronizedList(new ArrayList<>(c)); - (new Thread(this, "KeepAlive")).start(); - } - - @Override - public Player createPlayer(String name, EntityLocation location, World world) { - SimplePlayer player = new SimplePlayer(); - player.setId(rand.nextInt(10000)); - player.setUUID(UUID.nameUUIDFromBytes(name.getBytes())); - player.setName(name); - player.getLocation().set(location); - player.setWorld(world); - player.setSettings(new PlayerSettings()); - - synchronized (lock) { - players.add(player); - lock.notify(); - } - return player; - } - - @Override - public void joinServer(Player player) { - ((SimplePlayer) player).setOnline(true); - } - - @Override - public void leftServer(Player player) { - ((SimplePlayer) player).setOnline(false); - } - - @Override - public Player getPlayer(final String name) { - return players.stream() - .filter(player -> player.getName().equalsIgnoreCase(name)) - .findFirst().get(); - } - - @Override - public List getPlayers() { - return players.stream().filter(Player::isOnline).collect(Collectors.toList()); - } - - @Override - public int getCountPlayers() { - return (int) players.stream().filter(Player::isOnline).count(); - } - - @Override - public NetChannel getBroadcastChannel() { - return new BroadcastNetChannel(players.stream().filter(Player::isOnline)); - } - - @Override - public Player getOfflinePlayer(String name) { - return players.stream() - .filter(player -> player.getName().equals(name)) - .filter(player -> !player.isOnline()) - .findFirst().orElse(null); - } - - @Override - public void run() { - while (!Thread.currentThread().isInterrupted()) { - synchronized (lock) { - while (players.size() == 0) { - try { - lock.wait(); - } catch (InterruptedException e) { - return; - } - } - } - - getBroadcastChannel().sendKeepAlive(); - - try { - Thread.sleep(keepAliveInterval); - } catch (InterruptedException e) { - return; - } - } - } -} diff --git a/core/src/main/java/mc/core/player/SimplePlayer.java b/core/src/main/java/mc/core/player/SimplePlayer.java deleted file mode 100644 index cfb002b..0000000 --- a/core/src/main/java/mc/core/player/SimplePlayer.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * DmitriyMX - * 2018-04-23 - */ -package mc.core.player; - -import lombok.Data; -import mc.core.EntityLocation; -import mc.core.exception.ResourceUnloadedException; -import mc.core.network.NetChannel; -import mc.core.world.World; - -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -@Data -public class SimplePlayer implements Player { - private int id; - private UUID uuid; - private String name; - private boolean online = false; - private NetChannel channel; - private EntityLocation location = EntityLocation.ZERO(); - private Reference $refWorld; - private boolean flying = false; - private PlayerSettings settings; - private List loadedChunks = new ArrayList<>(); - - @Override - public UUID getUuid() { - return uuid; - } - - @Override - public World getWorld() { - if ($refWorld == null) { - return null; - } else if ($refWorld.get() == null) { - throw new ResourceUnloadedException("You're trying to get unloaded world"); - } else { - return $refWorld.get(); - } - } - - @Override - public void setWorld(World world) { - this.$refWorld = new WeakReference<>(world); - } - - public void setUUID(UUID uuid) { - this.uuid = uuid; - } -} From 86f1e1c3d2a4c3759598009d076f06a64b98864e Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 16 Sep 2018 18:15:11 +0300 Subject: [PATCH 52/71] =?UTF-8?q?fix:=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/mc/core/h2db/H2PlayerDAO.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java index 279c3d6..7004ba8 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java @@ -10,6 +10,7 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.sql.PreparedStatement; @@ -31,6 +32,11 @@ public class H2PlayerDAO { @Autowired private World world; + @PostConstruct + public void init() throws IOException { + jdbcTemplate.execute(IOUtils.resourceToString("/sqls/create_tables.sql", StandardCharsets.UTF_8)); + } + private void checkPlayer(H2Player player) throws SQLException { if (player.getName() == null || player.getName().isEmpty()) { throw new SQLException("Field 'name' is " + (player.getName() == null ? "null" : "empty")); From e57cfb6d45827351924c876d9da35b8f547b64e7 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 16 Sep 2018 18:15:44 +0300 Subject: [PATCH 53/71] =?UTF-8?q?fix:=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BD=D0=B4=D0=B5=D0=BA=D1=81=D0=BE?= =?UTF-8?q?=D0=B2,=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=BE=D0=BD=D0=B8=20?= =?UTF-8?q?=D0=BE=D1=82=D1=81=D1=83=D1=82=D1=81=D1=82=D0=B2=D1=83=D1=8E?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- h2_playermanager/src/main/resources/sqls/create_tables.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/h2_playermanager/src/main/resources/sqls/create_tables.sql b/h2_playermanager/src/main/resources/sqls/create_tables.sql index a53b23d..c436f80 100644 --- a/h2_playermanager/src/main/resources/sqls/create_tables.sql +++ b/h2_playermanager/src/main/resources/sqls/create_tables.sql @@ -10,5 +10,5 @@ CREATE TABLE IF NOT EXISTS players ( location_world VARCHAR(64) NOT NULL ); -CREATE INDEX idx_players_uuid ON players(uuid); -CREATE INDEX idx_players_name ON players(name); \ No newline at end of file +CREATE INDEX IF NOT EXISTS idx_players_uuid ON players(uuid); +CREATE INDEX IF NOT EXISTS idx_players_name ON players(name); \ No newline at end of file From f6eeb8b545eacec09b887a9c34b000b308312116 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 16 Sep 2018 18:16:34 +0300 Subject: [PATCH 54/71] =?UTF-8?q?fix:=20=D0=BC=D0=BD=D0=BE=D0=B6=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=BE=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=BF=D0=BE=20H2PlayerManager?= =?UTF-8?q?=20(=D0=B1=D0=B5=D0=B7=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/mc/core/h2db/H2PlayerManager.java | 64 ++++++++++++++++--- 1 file changed, 54 insertions(+), 10 deletions(-) diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java index fdd4b11..636460b 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java @@ -8,12 +8,15 @@ import mc.core.network.BroadcastNetChannel; import mc.core.network.NetChannel; import mc.core.player.Player; import mc.core.player.PlayerManager; +import mc.core.player.PlayerSettings; import mc.core.world.World; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.UUID; @@ -21,11 +24,21 @@ import static org.slf4j.helpers.MessageFormatter.format; @Slf4j @Component -public class H2PlayerManager implements PlayerManager { +public class H2PlayerManager implements PlayerManager, Runnable { @Setter @Autowired private H2PlayerDAO h2playerDao; - private List playerList = new ArrayList<>(); + private List playerList = Collections.synchronizedList(new ArrayList<>()); + private final Object lock = new Object(); + @Setter + private int keepAliveInterval = 1; + @Autowired + private World world; + + @PostConstruct + public void init() { + (new Thread(this, "KeepAlive")).start(); + } @Override public Player createPlayer(String name, EntityLocation location, World world) { @@ -36,6 +49,7 @@ public class H2PlayerManager implements PlayerManager { h2Player.setLocation(location.clone()); h2Player.setLoadedChunks(new ArrayList<>()); h2Player.setWorld(world); + h2Player.setSettings(new PlayerSettings()); try { h2playerDao.insert(h2Player); @@ -51,8 +65,11 @@ public class H2PlayerManager implements PlayerManager { public void joinServer(Player player) { //TODO в дальнейшем следует именно этому методу передать функции инсерта в БД H2Player h2Player = (H2Player) player; - playerList.add(h2Player); - h2Player.setOnline(true); + synchronized (lock) { + playerList.add(h2Player); + h2Player.setOnline(true); + lock.notify(); + } } @Override @@ -62,13 +79,14 @@ public class H2PlayerManager implements PlayerManager { h2playerDao.update(h2Player); } catch (SQLException e) { log.error(format("Update player '{}'", h2Player.getName()).getMessage(), e); - playerList.remove(h2Player); + synchronized (lock) { + playerList.remove(h2Player); + } } finally { h2Player.setId(0); h2Player.setOnline(false); h2Player.setWorld(null); h2Player.getLoadedChunks().clear(); - h2Player.setSettings(null); } } @@ -116,20 +134,46 @@ public class H2PlayerManager implements PlayerManager { .findAny().orElse(new H2Player()); h2Player.setName(name); + boolean result; try { - h2playerDao.getByName(h2Player); + result = h2playerDao.getByName(h2Player); } catch (SQLException e) { log.error(format("getByName player '{}'", h2Player.getName()).getMessage(), e); return null; } - if (h2Player.getId() == 0) { - return null; - } else { + if (result) { + h2Player.setWorld(world); return h2Player; + } else { + return null; } } else { + h2Player.setWorld(world); return h2Player; } } + + @Override + public void run() { + while (!Thread.currentThread().isInterrupted()) { + while(getCountPlayers() == 0) { + synchronized (lock) { + try { + lock.wait(); + } catch (InterruptedException e) { + return; + } + } + } + + getBroadcastChannel().sendKeepAlive(); + + try { + Thread.sleep(keepAliveInterval); + } catch (InterruptedException e) { + return; + } + } + } } From cb8566ae0286d7f148a70b3665745b61e1ca72af Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 16 Sep 2018 20:45:21 +0300 Subject: [PATCH 55/71] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D0=BE=20?= =?UTF-8?q?=D1=83=D0=BF=D0=BE=D0=BC=D0=B8=D0=BD=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BE=D0=B1=20InMemoryPlayerManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/README.MD | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/core/README.MD b/core/README.MD index 6176db3..cd77165 100644 --- a/core/README.MD +++ b/core/README.MD @@ -18,20 +18,6 @@ Bean: ``` -### InMemoryPlayerManager - -Implements: `mc.core.PlayerManager` - -Bean: - -```xml - - - -``` - -`keepAliveInterval` - как часто (в ms) отправлять клиентам пакет `KeepAlive` - ### IdleTime Implements: `mc.core.time.TimeProcessor` From 3ee1b16c92a71f873a02de0c2ad9062beb0adb88 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 16 Sep 2018 20:47:37 +0300 Subject: [PATCH 56/71] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D0=BD=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB=20keep=20alive=20=D0=BD=D0=B0=20=D1=81=D0=B5?= =?UTF-8?q?=D1=82=D0=B5=D0=B2=D0=BE=D0=B9=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB?= =?UTF-8?q?=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/core/embedded/FakePlayerManager.java | 3 -- .../mc/core/network/BroadcastNetChannel.java | 5 -- .../main/java/mc/core/network/NetChannel.java | 1 - .../java/mc/core/h2db/H2PlayerManager.java | 46 ++--------------- .../proto_1_12_2/netty/KeepAliveThread.java | 49 +++++++++++++++++++ .../proto_1_12_2/netty/NettyServer.java | 18 ++++--- .../netty/handlers/LoginHandler.java | 8 +-- .../netty/wrappers/WrapperNetChannel.java | 6 --- 8 files changed, 68 insertions(+), 68 deletions(-) create mode 100644 proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/KeepAliveThread.java diff --git a/core/src/main/java/mc/core/embedded/FakePlayerManager.java b/core/src/main/java/mc/core/embedded/FakePlayerManager.java index 5743632..f90255b 100644 --- a/core/src/main/java/mc/core/embedded/FakePlayerManager.java +++ b/core/src/main/java/mc/core/embedded/FakePlayerManager.java @@ -16,9 +16,6 @@ import java.util.Optional; public class FakePlayerManager implements PlayerManager { public static class FakeNetChannet implements NetChannel { - @Override - public void sendKeepAlive() { - } @Override public void sendTimeUpdate(long time, long age) { diff --git a/core/src/main/java/mc/core/network/BroadcastNetChannel.java b/core/src/main/java/mc/core/network/BroadcastNetChannel.java index 3f5e7bb..ed15fab 100644 --- a/core/src/main/java/mc/core/network/BroadcastNetChannel.java +++ b/core/src/main/java/mc/core/network/BroadcastNetChannel.java @@ -16,11 +16,6 @@ import java.util.stream.Stream; public class BroadcastNetChannel implements NetChannel { private final Stream playerStream; - @Override - public void sendKeepAlive() { - playerStream.forEach(player -> player.getChannel().sendKeepAlive()); - } - @Override public void sendTimeUpdate(final long time, final long age) { playerStream.forEach(player -> player.getChannel().sendTimeUpdate(time, age)); diff --git a/core/src/main/java/mc/core/network/NetChannel.java b/core/src/main/java/mc/core/network/NetChannel.java index 69c05c7..bfd6899 100644 --- a/core/src/main/java/mc/core/network/NetChannel.java +++ b/core/src/main/java/mc/core/network/NetChannel.java @@ -9,7 +9,6 @@ import mc.core.text.Text; import mc.core.text.Title; public interface NetChannel { - void sendKeepAlive(); void sendTimeUpdate(long time, long age); default void sendChatMessage(Text text) { sendChatMessage(text, MessageType.CHAT_MESSAGE); diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java index 636460b..2f4780d 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java @@ -24,22 +24,14 @@ import static org.slf4j.helpers.MessageFormatter.format; @Slf4j @Component -public class H2PlayerManager implements PlayerManager, Runnable { +public class H2PlayerManager implements PlayerManager { @Setter @Autowired private H2PlayerDAO h2playerDao; private List playerList = Collections.synchronizedList(new ArrayList<>()); - private final Object lock = new Object(); - @Setter - private int keepAliveInterval = 1; @Autowired private World world; - @PostConstruct - public void init() { - (new Thread(this, "KeepAlive")).start(); - } - @Override public Player createPlayer(String name, EntityLocation location, World world) { //TODO в дальнейшем следует в этом методе только имплементацию Player @@ -65,11 +57,8 @@ public class H2PlayerManager implements PlayerManager, Runnable { public void joinServer(Player player) { //TODO в дальнейшем следует именно этому методу передать функции инсерта в БД H2Player h2Player = (H2Player) player; - synchronized (lock) { - playerList.add(h2Player); - h2Player.setOnline(true); - lock.notify(); - } + playerList.add(h2Player); + h2Player.setOnline(true); } @Override @@ -79,13 +68,9 @@ public class H2PlayerManager implements PlayerManager, Runnable { h2playerDao.update(h2Player); } catch (SQLException e) { log.error(format("Update player '{}'", h2Player.getName()).getMessage(), e); - synchronized (lock) { - playerList.remove(h2Player); - } + playerList.remove(h2Player); } finally { - h2Player.setId(0); h2Player.setOnline(false); - h2Player.setWorld(null); h2Player.getLoadedChunks().clear(); } } @@ -153,27 +138,4 @@ public class H2PlayerManager implements PlayerManager, Runnable { return h2Player; } } - - @Override - public void run() { - while (!Thread.currentThread().isInterrupted()) { - while(getCountPlayers() == 0) { - synchronized (lock) { - try { - lock.wait(); - } catch (InterruptedException e) { - return; - } - } - } - - getBroadcastChannel().sendKeepAlive(); - - try { - Thread.sleep(keepAliveInterval); - } catch (InterruptedException e) { - return; - } - } - } } diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/KeepAliveThread.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/KeepAliveThread.java new file mode 100644 index 0000000..afa4607 --- /dev/null +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/KeepAliveThread.java @@ -0,0 +1,49 @@ +package mc.core.network.proto_1_12_2.netty; + +import lombok.Getter; +import lombok.Setter; +import mc.core.network.proto_1_12_2.packets.KeepAlivePacket; +import mc.core.player.PlayerManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Random; + +@Component +public class KeepAliveThread extends Thread { + private static final Random RAND = new Random(); + private final Object lock = new Object(); + @Autowired + private PlayerManager playerManager; + @Setter + private int interval = 10; + + public void notifyLock() { + synchronized (lock) { + lock.notify(); + } + } + + @Override + public void run() { + while (!Thread.currentThread().isInterrupted()) { + while(playerManager.getCountPlayers() == 0) { + synchronized (lock) { + try { + lock.wait(); + } catch (InterruptedException e) { + return; + } + } + } + + playerManager.getBroadcastChannel().writeAndFlush(new KeepAlivePacket(RAND.nextLong())); + + try { + Thread.sleep(interval); + } catch (InterruptedException e) { + return; + } + } + } +} diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java index 057a425..7df1c3f 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/NettyServer.java @@ -1,10 +1,7 @@ -/* - * DmitriyMX - * 2018-06-10 - */ package mc.core.network.proto_1_12_2.netty; import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelInitializer; import io.netty.channel.EventLoopGroup; @@ -22,16 +19,20 @@ import mc.core.network.proto_1_12_2.packets.StatusResponsePacket; import mc.core.player.Player; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; import java.util.Map; @Slf4j +@Component public class NettyServer implements Server { public static final AttributeKey ATTR_STATE = AttributeKey.newInstance("ATTR_STATE"); public static final AttributeKey ATTR_PLAYER = AttributeKey.newInstance("ATTR_PLAYER"); @Autowired - private ApplicationContext applicationContext; + private ApplicationContext context; + @Autowired + private KeepAliveThread keepAliveThread; @Setter private String host; @Setter @@ -44,7 +45,7 @@ public class NettyServer implements Server { return new ChannelInitializer() { @Override protected void initChannel(SocketChannel socketChannel) { - Map beans = applicationContext.getBeansOfType(ChannelHandler.class); + Map beans = context.getBeansOfType(ChannelHandler.class); beans.forEach(socketChannel.pipeline()::addLast); } }; @@ -73,7 +74,9 @@ public class NettyServer implements Server { log.info("Start server: {}:{}", host, port); try { - serverBootstrap.bind(host, port).sync().channel().closeFuture().sync(); + ChannelFuture channelFuture = serverBootstrap.bind(host, port).sync(); + keepAliveThread.start(); + channelFuture.channel().closeFuture().sync(); } catch (InterruptedException e) { throw new StartServerException(e); } @@ -82,6 +85,7 @@ public class NettyServer implements Server { @Override public void stop() { log.info("Server shutdown"); + keepAliveThread.interrupt(); workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java index 084d7f7..829392f 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java @@ -1,7 +1,3 @@ -/* - * DmitriyMX - * 2018-06-23 - */ package mc.core.network.proto_1_12_2.netty.handlers; import io.netty.channel.Channel; @@ -10,6 +6,7 @@ import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.eventbus.EventBusGetter; import mc.core.network.proto_1_12_2.State; import mc.core.network.proto_1_12_2.TeleportManager; +import mc.core.network.proto_1_12_2.netty.KeepAliveThread; import mc.core.network.proto_1_12_2.netty.wrappers.WrapperNetChannel; import mc.core.network.proto_1_12_2.packets.*; import mc.core.player.Player; @@ -32,6 +29,8 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand @Autowired private PlayerManager playerManager; @Autowired + private KeepAliveThread keepAliveThread; + @Autowired private World world; @Handler @@ -131,6 +130,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand channel.writeAndFlush(pkt5); playerManager.joinServer(player); + keepAliveThread.notifyLock(); CS_PlayerMoveEvent event = new CS_PlayerMoveEvent(player, player.getLocation()); event.setNewLocation(player.getLocation()); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetChannel.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetChannel.java index 192edd6..fd53188 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetChannel.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetChannel.java @@ -20,14 +20,8 @@ import java.util.Random; @RequiredArgsConstructor public class WrapperNetChannel implements NetChannel { - private static final Random RAND = new Random(); private final Channel channel; - @Override - public void sendKeepAlive() { - writeAndFlush(new KeepAlivePacket(RAND.nextLong())); - } - @Override public void sendTimeUpdate(long time, long age) { writeAndFlush(new TimeUpdatePacket(time, age)); From 30d15cfa0f55f5f301488c3d87a2faec10962611 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 16 Sep 2018 22:18:36 +0300 Subject: [PATCH 57/71] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D0=BA=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D1=8B=D0=BB=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=BE=D1=82=D0=B2=D1=80=D0=B0=D1=89=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20"=D1=80=D0=B2=D0=B0=D0=BD=D1=8B=D1=85"=20=D0=BF=D0=B0?= =?UTF-8?q?=D0=BA=D0=B5=D1=82=D0=BE=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Пакеты иногда могут приходить не полностью, а кусками. Раньше из-за этого возникали ошибки декода пакетов, у которых данные обрывались. --- .../java/mc/core/network/NetInputStream.java | 1 + .../proto_1_12_2/NetInputStream_p340.java | 16 +++++++++---- .../proto_1_12_2/netty/PacketDecoder.java | 24 ++++++++----------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/mc/core/network/NetInputStream.java b/core/src/main/java/mc/core/network/NetInputStream.java index a2e7b54..9ae1049 100644 --- a/core/src/main/java/mc/core/network/NetInputStream.java +++ b/core/src/main/java/mc/core/network/NetInputStream.java @@ -22,6 +22,7 @@ public abstract class NetInputStream { public abstract short readShort(); public abstract int readInt(); public abstract int readVarInt(); + public abstract int readVarInt(int[] countReadBytes); public abstract long readLong(); public abstract float readFloat(); public abstract double readDouble(); diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/NetInputStream_p340.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/NetInputStream_p340.java index 418f9aa..84bbd08 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/NetInputStream_p340.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/NetInputStream_p340.java @@ -13,25 +13,31 @@ import java.util.UUID; @Slf4j public abstract class NetInputStream_p340 extends NetInputStream { @Override - public int readVarInt() { + public int readVarInt(int[] countReadBytes) { int numRead = 0; int result = 0; byte read; do { + if ((numRead+1) > 5) { + log.warn("VarInt is too big"); + break; + } read = readByte(); int value = (read & 0b01111111); result |= (value << (7 * numRead)); numRead++; - if (numRead > 5) { - log.warn("VarInt is too big"); - break; - } } while ((read & 0b10000000) != 0); + if (countReadBytes != null && countReadBytes.length == 1) countReadBytes[0] = numRead; return result; } + @Override + public int readVarInt() { + return readVarInt(null); + } + @Override public String readString() { int size = readVarInt(); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java index 57b1832..6115ced 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java @@ -1,12 +1,8 @@ -/* - * DmitriyMX - * 2018-06-10 - */ package mc.core.network.proto_1_12_2.netty; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; +import io.netty.handler.codec.ReplayingDecoder; import lombok.extern.slf4j.Slf4j; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; @@ -18,7 +14,9 @@ import java.util.List; import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_STATE; @Slf4j -public class PacketDecoder extends ByteToMessageDecoder { +public class PacketDecoder extends ReplayingDecoder { + private int[] countReadBytes = new int[]{0}; + @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { ctx.channel().attr(ATTR_STATE).set(State.HANDSHAKE); @@ -33,27 +31,25 @@ public class PacketDecoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { - log.debug("ByteBuf readableBytes: {}", in.readableBytes()); - State state = ctx.channel().attr(ATTR_STATE).get(); NetInputStream netStream = new WrapperNetInputStream(in); int packetSize = netStream.readVarInt(); log.debug("Packet size: {}", packetSize); - int rb = in.readableBytes(); + int leftDataPacket = packetSize; - int packetId = netStream.readVarInt(); + int packetId = netStream.readVarInt(countReadBytes); String hexPacketId = Integer.toHexString(packetId).toUpperCase(); if (hexPacketId.length() == 1) hexPacketId = "0" + hexPacketId; log.debug("Packet id: 0x{}", hexPacketId); - rb = rb - in.readableBytes(); + leftDataPacket = leftDataPacket - countReadBytes[0]; Class packetClass = state.getClientSidePacket(packetId); if (packetClass == null) { log.warn("Unknown packet: {}:0x{}", state.name(), hexPacketId); - in.skipBytes(in.readableBytes()); + in.skipBytes(leftDataPacket); } else { - netStream.setDataSize(packetSize - rb); + netStream.setDataSize(leftDataPacket); CSPacket packet = packetClass.newInstance(); try { packet.readSelf(netStream); @@ -62,7 +58,7 @@ public class PacketDecoder extends ByteToMessageDecoder { } catch (Exception e) { log.warn("Known packet: {}:{}. But throw exception. See debug log.", state.name(), packet.getClass().getSimpleName()); log.debug("Read packet", e); - in.skipBytes(in.readableBytes()); + in.skipBytes(leftDataPacket); } } } From 80a7e7aaa8cc85b843bdd6e3afce53b322ac6b29 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 18 Sep 2018 01:41:21 +0300 Subject: [PATCH 58/71] =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BA=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/test/java/mc/core/h2db/TestH2PlayerManager.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java b/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java index 163f72c..f2780a4 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java @@ -94,10 +94,7 @@ public class TestH2PlayerManager { assertEquals(0, playerManager.getCountPlayers()); assertFalse(player.isOnline()); - assertEquals(0, player.getId()); - assertNull(player.getWorld()); assertTrue(player.getLoadedChunks().isEmpty()); - assertNull(player.getSettings()); H2Player queryPlayer = new H2Player(); queryPlayer.setId(playerId); From 969503cc453da7c1a0b9904cfb90f43dc30b3ba6 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 22 Sep 2018 20:24:10 +0300 Subject: [PATCH 59/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20Text?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/text/Text.java | 58 +++++++++----- core/src/test/java/mc/core/text/TestText.java | 76 +++++++++++++++++++ 2 files changed, 113 insertions(+), 21 deletions(-) create mode 100644 core/src/test/java/mc/core/text/TestText.java diff --git a/core/src/main/java/mc/core/text/Text.java b/core/src/main/java/mc/core/text/Text.java index 14957f7..4d470fe 100644 --- a/core/src/main/java/mc/core/text/Text.java +++ b/core/src/main/java/mc/core/text/Text.java @@ -1,20 +1,11 @@ -/* - * DmitriyMX - * 2018-06-11 - */ package mc.core.text; import com.google.common.collect.ImmutableList; -import lombok.EqualsAndHashCode; import lombok.Getter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.StringJoiner; +import java.util.*; @Getter -@EqualsAndHashCode public class Text { private static final Text EMPTY = new Text(); private static final Text NEW_LINE = new Text("\n", null, null, null); @@ -39,7 +30,7 @@ public class Text { } public boolean isEmpty() { - boolean result = content.isEmpty(); + boolean result = (content == null || content.isEmpty()); if (children != null && !children.isEmpty()) { for (Text child : children) { @@ -60,6 +51,19 @@ public class Text { } } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Text text = (Text) o; + return Objects.equals(toPlain(), text.toPlain()); + } + + @Override + public int hashCode() { + return Objects.hash(toPlain()); + } + public static class Builder { @Getter private String content; @@ -81,6 +85,8 @@ public class Text { } public Builder(Object... objects) { + this.children = new ArrayList<>(); + for(Object obj : objects) { if (obj instanceof String) { if (this.content == null) { @@ -96,10 +102,10 @@ public class Text { } } else if (obj instanceof TextColor) { this.color = (TextColor) obj; + } else if (obj instanceof Text) { + children.add((Text) obj); } } - - this.children = new ArrayList<>(); } public List getChildren() { @@ -133,8 +139,14 @@ public class Text { return this; } + public Builder append(String string) { + return append(Text.of(string)); + } + public Builder append(Text child) { - this.children.add(child); + if (child != null) { + this.children.add(child); + } return this; } @@ -144,16 +156,20 @@ public class Text { } public Text build() { - if (children.isEmpty()) { + if (children.isEmpty() && (content == null || content.isEmpty())) { return Text.EMPTY; } - return new Text( - content, - color, - style, - ImmutableList.copyOf(children) - ); + if (children.size() == 1 && children.get(0) != null) { + return children.get(0); + } else { + return new Text( + content, + color, + style, + ImmutableList.copyOf(children) + ); + } } } diff --git a/core/src/test/java/mc/core/text/TestText.java b/core/src/test/java/mc/core/text/TestText.java new file mode 100644 index 0000000..78370a1 --- /dev/null +++ b/core/src/test/java/mc/core/text/TestText.java @@ -0,0 +1,76 @@ +package mc.core.text; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class TestText { + @Test + public void testToPlain() { + final String m1 = "mes"; + final String m2 = "sage"; + final String message = m1 + m2; + + assertEquals(message, Text.of(message).toPlain()); + assertEquals(message, Text.builder(message).build().toPlain()); + assertEquals(message, Text.builder(Text.of(message)).build().toPlain()); + assertEquals(message, Text.builder().append(message).build().toPlain()); + assertEquals(message, Text.builder().append(Text.of(message)).build().toPlain()); + + assertEquals(message, Text.builder(m1, m2).build().toPlain()); + assertEquals(message, Text.builder(Text.of(m1), Text.of(m2)).build().toPlain()); + assertEquals(message, Text.builder().append(Text.of(m1), Text.of(m2)).build().toPlain()); + assertEquals(message, Text.builder().append(Text.of(m1)).append(Text.of(m2)).build().toPlain()); + + + } + + @Test + public void testEquals() { + assertEquals(Text.of(), Text.of("")); + assertEquals(Text.of(), Text.builder().build()); + assertEquals(Text.of(), Text.builder("").build()); + assertEquals(Text.of(), Text.builder().append().build()); + assertEquals(Text.of(), Text.builder().append("").build()); + + assertNotEquals(Text.of(), Text.of("??")); + assertNotEquals(Text.of(), Text.builder("??").build()); + assertNotEquals(Text.of(), Text.builder().append("??").build()); + + assertEquals(Text.of("message"), Text.builder("message").build()); + assertEquals(Text.of("message"), Text.builder(Text.of("message")).build()); + assertEquals(Text.of("message"), Text.builder().append("message").build()); + assertEquals(Text.of("message"), Text.builder().append(Text.of("message")).build()); + } + + @Test + public void testEmpty() { + assertTrue(Text.of().isEmpty()); + assertTrue(Text.of((String) null).isEmpty()); + assertTrue(Text.of((Text) null).isEmpty()); + assertTrue(Text.of("").isEmpty()); + assertTrue(Text.of("", "").isEmpty()); + + assertTrue(Text.builder().build().isEmpty()); + assertTrue(Text.builder((String) null).build().isEmpty()); + assertTrue(Text.builder((Text) null).build().isEmpty()); + assertTrue(Text.builder("").build().isEmpty()); + assertTrue(Text.builder("", "").build().isEmpty()); + assertTrue(Text.builder(Text.of()).build().isEmpty()); + assertTrue(Text.builder(Text.of(), Text.of()).build().isEmpty()); + + assertTrue(Text.builder().append().build().isEmpty()); + assertTrue(Text.builder().append((String) null).build().isEmpty()); + assertTrue(Text.builder().append((Text) null).build().isEmpty()); + assertTrue(Text.builder().append("").build().isEmpty()); + assertTrue(Text.builder().append(Text.of()).build().isEmpty()); + assertTrue(Text.builder().append(Text.of(), Text.of()).build().isEmpty()); + assertTrue(Text.builder().append(Text.of()).append(Text.of()).build().isEmpty()); + + assertFalse(Text.of("??").isEmpty()); + assertFalse(Text.builder("??").build().isEmpty()); + assertFalse(Text.builder(Text.of("??")).build().isEmpty()); + assertFalse(Text.builder().append("??").build().isEmpty()); + assertFalse(Text.builder().append(Text.of("??")).build().isEmpty()); + } +} From f9f722ef79f7631a36a2ba301f3c03dea5fe1138 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 6 Oct 2018 15:50:44 +0300 Subject: [PATCH 60/71] gradle: update dependencies version --- build.gradle | 17 ++++++++++------- core/build.gradle | 4 ++-- h2_playermanager/build.gradle | 8 ++------ proto_1.12.2/build.gradle | 3 +-- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/build.gradle b/build.gradle index 7f5349d..0daec8e 100644 --- a/build.gradle +++ b/build.gradle @@ -9,6 +9,9 @@ allprojects { repositories { mavenCentral() + maven { + url 'https://oss.sonatype.org/content/groups/public/' + } } } @@ -16,8 +19,9 @@ subprojects { group 'mc' ext { - slf4j_version = '1.7.21' - spring_version = '4.2.5.RELEASE' + slf4j_version = '1.7.25' + spring_version = '5.1.0.RELEASE' + lombok_version = '1.18.2' } configurations { @@ -31,17 +35,16 @@ subprojects { compile (group: 'org.slf4j', name: 'jcl-over-slf4j', version: slf4j_version) /* Spring */ - compile (group: 'org.springframework', name: 'spring-context', version: spring_version) { - exclude group: 'commons-logging' - } + compile (group: 'org.springframework', name: 'spring-context', version: spring_version) /* Lombok */ - compile (group: 'org.projectlombok', name: 'lombok', version: '1.16.16') + annotationProcessor (group: 'org.projectlombok', name: 'lombok', version: lombok_version) + compileOnly (group: 'org.projectlombok', name: 'lombok', version: lombok_version) /* Testing */ testCompile (group: 'junit', name: 'junit', version: '4.12') testCompile (group: 'org.slf4j', name: 'slf4j-simple', version: slf4j_version) - testCompile (group: 'org.mockito', name: 'mockito-core', version: '1.9.5') + testCompile (group: 'org.mockito', name: 'mockito-core', version: '1.10.19') testCompile (group: 'org.springframework', name: 'spring-test', version: spring_version) } diff --git a/core/build.gradle b/core/build.gradle index 06a5cd9..1b923c1 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -8,7 +8,7 @@ mainClassName = "mc.core.Main" dependencies { /* Components */ compile (group: 'commons-io', name: 'commons-io', version: '2.6') - compile (group: 'com.google.guava', name: 'guava', version: '24.1-jre') + compile (group: 'com.google.guava', name: 'guava', version: '26.0-jre') /* Named Binary Tags */ - compile (group: 'com.flowpowered', name: 'flow-nbt', version: '1.0.0') + compile (group: 'com.flowpowered', name: 'flow-nbt', version: '1.0.1-SNAPSHOT') } diff --git a/h2_playermanager/build.gradle b/h2_playermanager/build.gradle index 727fc10..876f47b 100644 --- a/h2_playermanager/build.gradle +++ b/h2_playermanager/build.gradle @@ -5,12 +5,8 @@ dependencies { compile_excludeCopy project(':core') /* Spring */ - compile (group: 'org.springframework', name: 'spring-jdbc', version: spring_version) { - exclude group: 'commons-logging' - } + compile (group: 'org.springframework', name: 'spring-jdbc', version: spring_version) /* Database */ - compile (group: 'com.h2database', name: 'h2', version: '1.4.196') - - testCompile (group: 'org.springframework', name: 'spring-test', version: spring_version) + compile (group: 'com.h2database', name: 'h2', version: '1.4.197') } \ No newline at end of file diff --git a/proto_1.12.2/build.gradle b/proto_1.12.2/build.gradle index 957bc9f..8e3a7e2 100644 --- a/proto_1.12.2/build.gradle +++ b/proto_1.12.2/build.gradle @@ -5,6 +5,5 @@ dependencies { compile_excludeCopy project(':core') /* Components */ - compile (group: 'com.google.guava', name: 'guava', version: '24.1-jre') - compile (group: 'com.google.code.gson', name: 'gson', version: '2.8.2') + compile (group: 'com.google.code.gson', name: 'gson', version: '2.8.5') } From 48b8d0377ca8055319b00974dc777996790f6661 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 6 Oct 2018 17:07:34 +0300 Subject: [PATCH 61/71] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=20DAO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/test/java/mc/core/h2db/TestDAO.java | 34 ++++++------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java b/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java index 4c9c094..9abc262 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java @@ -85,8 +85,6 @@ public class TestDAO { @Test(expected = DuplicateKeyException.class) public void testInsertDuplicateKey() throws SQLException { playerDAO.insert(player); - assertNotEquals(0, player.getId()); - playerDAO.insert(player); } @@ -133,6 +131,17 @@ public class TestDAO { assertEquals(player, queryPlayer); } + @Test + public void testGetByNonExistsName() throws SQLException { + playerDAO.insert(this.player); + + H2Player player = new H2Player(); + player.setName("NON_EXISTS_NAME"); + + boolean result = playerDAO.getByName(player); + assertFalse(result); + } + @Test public void testGetById() throws SQLException { playerDAO.insert(this.player); @@ -146,17 +155,6 @@ public class TestDAO { assertEquals(player, queryPlayer); } - @Test - public void testGetByNonExistsName() throws SQLException { - playerDAO.insert(this.player); - - H2Player player = new H2Player(); - player.setName("NON_EXISTS_NAME"); - - boolean result = playerDAO.getByName(player); - assertFalse(result); - } - @Test public void testGetByNonExistsId() throws SQLException { playerDAO.insert(player); @@ -172,7 +170,6 @@ public class TestDAO { @Test public void testUpdate() throws SQLException { playerDAO.insert(player); - assertNotEquals(0, player.getId()); player.setName("UNKNOWN_PLAYER"); playerDAO.update(player); @@ -183,7 +180,6 @@ public class TestDAO { @Test(expected = SQLException.class) public void testUpdateEmptyName() throws SQLException { playerDAO.insert(player); - assertNotEquals(0, player.getId()); player.setName(""); playerDAO.update(player); @@ -192,7 +188,6 @@ public class TestDAO { @Test(expected = SQLException.class) public void testUpdateNullName() throws SQLException { playerDAO.insert(player); - assertNotEquals(0, player.getId()); player.setName(null); playerDAO.update(player); @@ -201,7 +196,6 @@ public class TestDAO { @Test(expected = SQLException.class) public void testUpdateNullUuid() throws SQLException { playerDAO.insert(player); - assertNotEquals(0, player.getId()); player.setUuid(null); playerDAO.update(player); @@ -210,7 +204,6 @@ public class TestDAO { @Test(expected = SQLException.class) public void testUpdateNullLocation() throws SQLException { playerDAO.insert(player); - assertNotEquals(0, player.getId()); player.setLocation(null); playerDAO.update(player); @@ -219,7 +212,6 @@ public class TestDAO { @Test(expected = SQLException.class) public void testUpdateNullWorld() throws SQLException { playerDAO.insert(player); - assertNotEquals(0, player.getId()); player.setWorld(null); playerDAO.update(player); @@ -228,7 +220,6 @@ public class TestDAO { @Test public void testUpdateLocation() throws SQLException { playerDAO.insert(player); - assertNotEquals(0, player.getId()); final String origName = player.getName(); player.setName("UNKNOWN_PLAYER"); @@ -254,7 +245,6 @@ public class TestDAO { @Test(expected = SQLException.class) public void testUpdateLocationNull() throws SQLException { playerDAO.insert(player); - assertNotEquals(0, player.getId()); player.setLocation(null); playerDAO.updateLocation(player); @@ -263,7 +253,6 @@ public class TestDAO { @Test public void testRemove() throws SQLException { playerDAO.insert(player); - assertNotEquals(0, player.getId()); final int origId = player.getId(); playerDAO.remove(player); @@ -278,7 +267,6 @@ public class TestDAO { @Test(expected = SQLException.class) public void testRemoveNonExistsId() throws SQLException { playerDAO.insert(player); - assertNotEquals(0, player.getId()); player.setId(999); playerDAO.remove(player); From f9553794e953ea44c2c166692276685802e9d467 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 7 Oct 2018 19:05:19 +0300 Subject: [PATCH 62/71] JDBC -> JPA --- h2_playermanager/build.gradle | 7 +- .../main/java/mc/core/h2db/H2PlayerDAO.java | 259 ----------------- .../java/mc/core/h2db/H2PlayerManager.java | 50 +--- .../mc/core/h2db/entity/H2PlayerEntity.java | 104 +++++++ .../repository/H2PlayerEntityRepository.java | 12 + .../mc/core/h2db/service/H2PlayerService.java | 11 + .../h2db/service/H2PlayerServiceImpl.java | 41 +++ .../src/main/resources/sqls/create_tables.sql | 14 - .../src/main/resources/sqls/delete_player.sql | 1 - .../src/main/resources/sqls/insert_player.sql | 2 - .../resources/sqls/insert_player_withId.sql | 2 - .../resources/sqls/select_player_byId.sql | 3 - .../resources/sqls/select_player_byName.sql | 3 - .../src/main/resources/sqls/update_player.sql | 10 - .../resources/sqls/update_player_location.sql | 8 - .../test/java/mc/core/h2db/SpringConfig.java | 49 ---- .../src/test/java/mc/core/h2db/TestDAO.java | 274 ------------------ .../mc/core/h2db/TestH2PlayerManager.java | 41 +-- .../java/mc/core/h2db/TestSpringConfig.java | 90 ++++++ .../h2db/service/H2PlayerServiceTest.java | 133 +++++++++ .../resources/sqls/drop_table_players.sql | 3 - 21 files changed, 420 insertions(+), 697 deletions(-) delete mode 100644 h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java create mode 100644 h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java create mode 100644 h2_playermanager/src/main/java/mc/core/h2db/repository/H2PlayerEntityRepository.java create mode 100644 h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerService.java create mode 100644 h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java delete mode 100644 h2_playermanager/src/main/resources/sqls/create_tables.sql delete mode 100644 h2_playermanager/src/main/resources/sqls/delete_player.sql delete mode 100644 h2_playermanager/src/main/resources/sqls/insert_player.sql delete mode 100644 h2_playermanager/src/main/resources/sqls/insert_player_withId.sql delete mode 100644 h2_playermanager/src/main/resources/sqls/select_player_byId.sql delete mode 100644 h2_playermanager/src/main/resources/sqls/select_player_byName.sql delete mode 100644 h2_playermanager/src/main/resources/sqls/update_player.sql delete mode 100644 h2_playermanager/src/main/resources/sqls/update_player_location.sql delete mode 100644 h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java delete mode 100644 h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java create mode 100644 h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java create mode 100644 h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java delete mode 100644 h2_playermanager/src/test/resources/sqls/drop_table_players.sql diff --git a/h2_playermanager/build.gradle b/h2_playermanager/build.gradle index 876f47b..acdbf0c 100644 --- a/h2_playermanager/build.gradle +++ b/h2_playermanager/build.gradle @@ -1,12 +1,17 @@ version '1.0-SNAPSHOT' +ext { + spring_data_version = '2.1.0.RELEASE' +} + dependencies { /* Core */ compile_excludeCopy project(':core') /* Spring */ - compile (group: 'org.springframework', name: 'spring-jdbc', version: spring_version) + compile (group: 'org.springframework.data', name: 'spring-data-jpa', version: spring_data_version) /* Database */ + compile (group: 'org.hibernate', name: 'hibernate-entitymanager', version: '5.3.6.Final') compile (group: 'com.h2database', name: 'h2', version: '1.4.197') } \ No newline at end of file diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java deleted file mode 100644 index 7004ba8..0000000 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerDAO.java +++ /dev/null @@ -1,259 +0,0 @@ -package mc.core.h2db; - -import lombok.extern.slf4j.Slf4j; -import mc.core.EntityLocation; -import mc.core.world.World; -import org.apache.commons.io.IOUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.UUID; - -@Slf4j -@Component -public class H2PlayerDAO { - private static String INSERT_SQL, INSERT2_SQL, - SELECT_BYNAME_SQL, SELECT_BYID_SQL, - UPDATE_SQL, UPDATE_LOCATION_SQL, - DELETE_SQL; - - @Autowired - private JdbcTemplate jdbcTemplate; - @Autowired - private World world; - - @PostConstruct - public void init() throws IOException { - jdbcTemplate.execute(IOUtils.resourceToString("/sqls/create_tables.sql", StandardCharsets.UTF_8)); - } - - private void checkPlayer(H2Player player) throws SQLException { - if (player.getName() == null || player.getName().isEmpty()) { - throw new SQLException("Field 'name' is " + (player.getName() == null ? "null" : "empty")); - } - - if (player.getUuid() == null) { - throw new SQLException("Field 'uuid' is null"); - } - - if (player.getLocation() == null) { - throw new SQLException("Fields 'location_*' is null"); - } - - if (player.getWorld() == null) { - throw new SQLException("Field 'location_world' is null"); - } - } - - private void insertWithoutId(H2Player player) throws SQLException { - KeyHolder keyHolder = new GeneratedKeyHolder(); - - int affectedRows = jdbcTemplate.update(psc -> { - PreparedStatement stmt = psc.prepareStatement(INSERT_SQL, Statement.RETURN_GENERATED_KEYS); - - stmt.setString(1, player.getUuid().toString()); - stmt.setString(2, player.getName()); - stmt.setDouble(3, player.getLocation().getX()); - stmt.setDouble(4, player.getLocation().getY()); - stmt.setDouble(5, player.getLocation().getZ()); - stmt.setFloat(6, player.getLocation().getYaw()); - stmt.setFloat(7, player.getLocation().getPitch()); - stmt.setString(8, player.getWorld().getName()); - - return stmt; - }, keyHolder); - - if (affectedRows == 0) { - throw new SQLException("Serialize player failed: no rows affected."); - } - - player.setId(keyHolder.getKey().intValue()); - } - - private void insertWithId(H2Player player) throws SQLException { - int affectedRows = jdbcTemplate.update(psc -> { - PreparedStatement stmt = psc.prepareStatement(INSERT2_SQL); - - stmt.setString(1, player.getUuid().toString()); - stmt.setString(2, player.getName()); - stmt.setDouble(3, player.getLocation().getX()); - stmt.setDouble(4, player.getLocation().getY()); - stmt.setDouble(5, player.getLocation().getZ()); - stmt.setFloat(6, player.getLocation().getYaw()); - stmt.setFloat(7, player.getLocation().getPitch()); - stmt.setString(8, player.getWorld().getName()); - stmt.setInt(9, player.getId()); - - return stmt; - }); - - if (affectedRows == 0) { - throw new SQLException("Serialize player failed: no rows affected."); - } - } - - public void insert(H2Player player) throws SQLException { - checkPlayer(player); - - if (player.getId() > 0) { - insertWithId(player); - } else { - insertWithoutId(player); - } - } - - private void locationDeserialize(H2Player playerBuffer, ResultSet resultSet) throws SQLException { - if (!world.getName().equals(resultSet.getString("location_world"))) { - log.warn("Unknown world \"{}\"", resultSet.getString("location_world")); - log.warn("Using default (spawn) location for user \"{}\"", playerBuffer.getName()); - playerBuffer.setLocation(world.getSpawn().clone()); - } else { - playerBuffer.setLocation(new EntityLocation( - resultSet.getDouble("location_x"), - resultSet.getDouble("location_y"), - resultSet.getDouble("location_z"), - resultSet.getFloat("location_yaw"), - resultSet.getFloat("location_pitch") - )); - playerBuffer.setWorld(world); - } - } - - public boolean getByName(H2Player playerBuffer) throws SQLException { - if (playerBuffer.getName() == null || playerBuffer.getName().isEmpty()) { - throw new SQLException("Field 'name' is " + (playerBuffer.getName() == null ? "null" : "empty")); - } - - final boolean[] result = new boolean[]{false}; - jdbcTemplate.query(SELECT_BYNAME_SQL, - ps -> ps.setString(1, playerBuffer.getName()), - rs -> { - playerBuffer.setId(rs.getInt("id")); - playerBuffer.setUuid(UUID.fromString(rs.getString("uuid"))); - locationDeserialize(playerBuffer, rs); - result[0] = true; - }); - - return result[0]; - } - - public boolean getById(H2Player playerBuffer) throws SQLException { - if (playerBuffer.getId() == 0) { - throw new SQLException("Field 'id' is zero"); - } - - final boolean[] result = new boolean[]{false}; - jdbcTemplate.query(SELECT_BYID_SQL, - ps -> ps.setInt(1, playerBuffer.getId()), - rs -> { - playerBuffer.setUuid(UUID.fromString(rs.getString("uuid"))); - playerBuffer.setName(rs.getString("name")); - locationDeserialize(playerBuffer, rs); - result[0] = true; - }); - - return result[0]; - } - - public void update(H2Player player) throws SQLException { - if (player.getId() == 0) { - throw new SQLException("Field 'id' is zero"); - } - - checkPlayer(player); - - int affectedRows = jdbcTemplate.update(UPDATE_SQL, pss -> { - pss.setInt(9, player.getId()); - pss.setString(1, player.getUuid().toString()); - pss.setString(2, player.getName()); - pss.setDouble(3, player.getLocation().getX()); - pss.setDouble(4, player.getLocation().getY()); - pss.setDouble(5, player.getLocation().getZ()); - pss.setFloat(6, player.getLocation().getYaw()); - pss.setFloat(7, player.getLocation().getPitch()); - pss.setString(8, player.getWorld().getName()); - }); - - if (affectedRows == 0) { - throw new SQLException("Update player failed, no rows affected."); - } - } - - public void updateLocation(H2Player player) throws SQLException { - if (player.getId() == 0) { - throw new SQLException("Field 'id' is zero"); - } - - if (player.getLocation() == null) { - throw new SQLException("Fields 'location_*' is null"); - } - - if (player.getWorld() == null) { - throw new SQLException("Field 'location_world' is null"); - } - - if (player.getLocation() == null) { - throw new SQLException("Fields 'location_*' is null"); - } - - if (player.getWorld() == null) { - throw new SQLException("Field 'location_world' is null"); - } - - int affectedRows = jdbcTemplate.update(connection -> { - PreparedStatement stmt = connection.prepareStatement(UPDATE_LOCATION_SQL); - - stmt.setInt(7, player.getId()); - stmt.setDouble(1, player.getLocation().getX()); - stmt.setDouble(2, player.getLocation().getY()); - stmt.setDouble(3, player.getLocation().getZ()); - stmt.setFloat(4, player.getLocation().getYaw()); - stmt.setFloat(5, player.getLocation().getPitch()); - stmt.setString(6, player.getWorld().getName()); - - return stmt; - }); - - if (affectedRows == 0) { - throw new SQLException("Update player failed, no rows affected."); - } - } - - public void remove(H2Player player) throws SQLException { - if (player.getId() == 0) { - throw new SQLException("Field 'id' is zero"); - } - - int affectedRows = jdbcTemplate.update(DELETE_SQL, pss -> pss.setInt(1, player.getId())); - - if (affectedRows == 0) { - throw new SQLException("Remove player failed, no rows affected."); - } - - player.setId(0); - } - - static { - try { - INSERT_SQL = IOUtils.resourceToString("/sqls/insert_player.sql", StandardCharsets.UTF_8); - INSERT2_SQL = IOUtils.resourceToString("/sqls/insert_player_withId.sql", StandardCharsets.UTF_8); - SELECT_BYNAME_SQL = IOUtils.resourceToString("/sqls/select_player_byName.sql", StandardCharsets.UTF_8); - SELECT_BYID_SQL = IOUtils.resourceToString("/sqls/select_player_byId.sql", StandardCharsets.UTF_8); - UPDATE_SQL = IOUtils.resourceToString("/sqls/update_player.sql", StandardCharsets.UTF_8); - UPDATE_LOCATION_SQL = IOUtils.resourceToString("/sqls/update_player_location.sql", StandardCharsets.UTF_8); - DELETE_SQL = IOUtils.resourceToString("/sqls/delete_player.sql", StandardCharsets.UTF_8); - } catch (IOException e) { - log.error("Load sql templates", e); - } - } -} diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java index 2f4780d..9741d30 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableList; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; +import mc.core.h2db.service.H2PlayerService; import mc.core.network.BroadcastNetChannel; import mc.core.network.NetChannel; import mc.core.player.Player; @@ -13,28 +14,23 @@ import mc.core.world.World; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import javax.annotation.PostConstruct; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; -import static org.slf4j.helpers.MessageFormatter.format; - @Slf4j @Component public class H2PlayerManager implements PlayerManager { @Setter @Autowired - private H2PlayerDAO h2playerDao; + private H2PlayerService h2PlayerService; private List playerList = Collections.synchronizedList(new ArrayList<>()); @Autowired - private World world; + private World world; //FIXME @Override public Player createPlayer(String name, EntityLocation location, World world) { - //TODO в дальнейшем следует в этом методе только имплементацию Player H2Player h2Player = new H2Player(); h2Player.setName(name); h2Player.setUuid(UUID.randomUUID()); @@ -43,14 +39,7 @@ public class H2PlayerManager implements PlayerManager { h2Player.setWorld(world); h2Player.setSettings(new PlayerSettings()); - try { - h2playerDao.insert(h2Player); - } catch (SQLException e) { - log.error(format("Insert player '{}'", h2Player.getName()).getMessage(), e); - return null; - } - - return h2Player; + return h2PlayerService.save(h2Player); } @Override @@ -64,15 +53,9 @@ public class H2PlayerManager implements PlayerManager { @Override public void leftServer(Player player) { H2Player h2Player = (H2Player) player; - try { - h2playerDao.update(h2Player); - } catch (SQLException e) { - log.error(format("Update player '{}'", h2Player.getName()).getMessage(), e); - playerList.remove(h2Player); - } finally { - h2Player.setOnline(false); - h2Player.getLoadedChunks().clear(); - } + h2PlayerService.save(h2Player); + h2Player.setOnline(false); + h2Player.getLoadedChunks().clear(); } @Override @@ -108,26 +91,17 @@ public class H2PlayerManager implements PlayerManager { @Override public Player getOfflinePlayer(String name) { + //TODO похоже в попытке где-то оптимизировать/сэконопить я сам себя ******[обманул] + //необходимо этот участок кода переписать + //потому как похоже на экономию на спичках H2Player h2Player = playerList.stream() .filter(player -> player.getName().equals(name)) .filter(player -> !player.isOnline()) .findFirst().orElse(null); if (h2Player == null) { - h2Player = playerList.stream() - .filter(player -> !player.isOnline()) - .findAny().orElse(new H2Player()); - h2Player.setName(name); - - boolean result; - try { - result = h2playerDao.getByName(h2Player); - } catch (SQLException e) { - log.error(format("getByName player '{}'", h2Player.getName()).getMessage(), e); - return null; - } - - if (result) { + h2Player = h2PlayerService.getByName(name); + if (h2Player != null) { h2Player.setWorld(world); return h2Player; } else { diff --git a/h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java b/h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java new file mode 100644 index 0000000..1edc5f4 --- /dev/null +++ b/h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java @@ -0,0 +1,104 @@ +package mc.core.h2db.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; +import mc.core.EntityLocation; +import mc.core.h2db.H2Player; +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.util.UUID; + +@Entity +@Table(name = "players", + indexes = {@Index(name = "idx_players_uuid", columnList = "uuid", unique = true), + @Index(name = "idx_players_name", columnList = "name")}) +@NoArgsConstructor +@Data +public class H2PlayerEntity { + @Id + @GeneratedValue(generator = "increment") + @GenericGenerator(name= "increment", strategy= "increment") + @Column(nullable = false) + private Long id; + + @Column(length = 36, nullable = false) + private String uuid; + + @Column(length = 16, nullable = false) + private String name; + + @Column(name = "location_x", nullable = false) + private Double locationX; + + @Column(name = "location_y", nullable = false) + private Double locationY; + + @Column(name = "location_z", nullable = false) + private Double locationZ; + + @Column(name = "location_yaw", nullable = false) + private Float locationYaw; + + @Column(name = "location_pitch", nullable = false) + private Float locationPitch; + + @Column(name = "location_world", length = 64, nullable = false) + private String locationWorld; + + public H2PlayerEntity(H2Player player) { + this.id = (long) player.getId(); + setUuid(player.getUuid().toString()); + setName(this.name = player.getName()); + this.locationX = player.getLocation().getX(); + this.locationY = player.getLocation().getY(); + this.locationZ = player.getLocation().getZ(); + this.locationYaw = player.getLocation().getYaw(); + this.locationPitch = player.getLocation().getPitch(); + if (player.getWorld() != null) { //FIXME + this.locationWorld = player.getWorld().getName(); + } else { + this.locationWorld = "null_world"; + } + } + + public void setUuid(String uuid) { + if (uuid == null || uuid.trim().isEmpty()) { + this.uuid = null; + } else { + this.uuid = uuid; + } + } + + public void setName(String name) { + if (name == null || name.trim().isEmpty()) { + this.name = null; + } else { + this.name = name; + } + } + + public H2Player toPlayer() { + H2Player player = new H2Player(); + return toPlayer(player); + } + + public H2Player toPlayer(H2Player player) { + player.setId(this.id.intValue()); + player.setUuid(UUID.fromString(this.uuid)); + player.setName(this.name); + if (player.getLocation() == null) { + player.setLocation(new EntityLocation( + this.locationX, this.locationY, this.locationZ, + this.locationYaw, this.locationPitch + )); + } else { + player.getLocation().setXYZ(this.locationX, this.locationY, this.locationZ); + player.getLocation().setYawPitch(this.locationYaw, this.locationPitch); + } + + player.setWorld(null); //FIXME + + return player; + } +} diff --git a/h2_playermanager/src/main/java/mc/core/h2db/repository/H2PlayerEntityRepository.java b/h2_playermanager/src/main/java/mc/core/h2db/repository/H2PlayerEntityRepository.java new file mode 100644 index 0000000..47b4f45 --- /dev/null +++ b/h2_playermanager/src/main/java/mc/core/h2db/repository/H2PlayerEntityRepository.java @@ -0,0 +1,12 @@ +package mc.core.h2db.repository; + +import mc.core.h2db.entity.H2PlayerEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface H2PlayerEntityRepository extends JpaRepository { + Optional findByName(String name); +} diff --git a/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerService.java b/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerService.java new file mode 100644 index 0000000..a20fb7b --- /dev/null +++ b/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerService.java @@ -0,0 +1,11 @@ +package mc.core.h2db.service; + +import mc.core.h2db.H2Player; + +public interface H2PlayerService { + H2Player save(H2Player player); + void remove(H2Player player); + + H2Player getByName(String name); + H2Player getById(int id); +} diff --git a/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java b/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java new file mode 100644 index 0000000..d716444 --- /dev/null +++ b/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java @@ -0,0 +1,41 @@ +package mc.core.h2db.service; + +import mc.core.h2db.H2Player; +import mc.core.h2db.entity.H2PlayerEntity; +import mc.core.h2db.repository.H2PlayerEntityRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class H2PlayerServiceImpl implements H2PlayerService { + @Autowired + private H2PlayerEntityRepository h2PlayerEntityRepository; + + @Override + public H2Player save(H2Player player) { + H2PlayerEntity entity = new H2PlayerEntity(player); + //TODO возможно имеет смысл здесь оптимизация + //вместо toPlayer() сделать toPlayer(H2Player) который в существующий + //будет дописывать/обновлять данные + return h2PlayerEntityRepository.saveAndFlush(entity).toPlayer(player); + } + + @Override + public void remove(H2Player player) { + h2PlayerEntityRepository.deleteById((long) player.getId()); + } + + @Override + public H2Player getByName(String name) { + Optional optEntity = h2PlayerEntityRepository.findByName(name); + return optEntity.map(H2PlayerEntity::toPlayer).orElse(null); + } + + @Override + public H2Player getById(int id) { + Optional optEntity = h2PlayerEntityRepository.findById((long) id); + return optEntity.map(H2PlayerEntity::toPlayer).orElse(null); + } +} diff --git a/h2_playermanager/src/main/resources/sqls/create_tables.sql b/h2_playermanager/src/main/resources/sqls/create_tables.sql deleted file mode 100644 index c436f80..0000000 --- a/h2_playermanager/src/main/resources/sqls/create_tables.sql +++ /dev/null @@ -1,14 +0,0 @@ -CREATE TABLE IF NOT EXISTS players ( - id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, - uuid VARCHAR(36) NOT NULL UNIQUE, - name VARCHAR(16) NOT NULL, - location_x DOUBLE NOT NULL, - location_y DOUBLE NOT NULL, - location_z DOUBLE NOT NULL, - location_yaw FLOAT NOT NULL, - location_pitch FLOAT NOT NULL, - location_world VARCHAR(64) NOT NULL -); - -CREATE INDEX IF NOT EXISTS idx_players_uuid ON players(uuid); -CREATE INDEX IF NOT EXISTS idx_players_name ON players(name); \ No newline at end of file diff --git a/h2_playermanager/src/main/resources/sqls/delete_player.sql b/h2_playermanager/src/main/resources/sqls/delete_player.sql deleted file mode 100644 index d16f13d..0000000 --- a/h2_playermanager/src/main/resources/sqls/delete_player.sql +++ /dev/null @@ -1 +0,0 @@ -DELETE FROM players WHERE id = ?; \ No newline at end of file diff --git a/h2_playermanager/src/main/resources/sqls/insert_player.sql b/h2_playermanager/src/main/resources/sqls/insert_player.sql deleted file mode 100644 index ab9bdff..0000000 --- a/h2_playermanager/src/main/resources/sqls/insert_player.sql +++ /dev/null @@ -1,2 +0,0 @@ -INSERT INTO players (uuid, name, location_x, location_y, location_z, location_yaw, location_pitch, location_world) - VALUES (?, ?, ?, ?, ?, ?, ?, ?); \ No newline at end of file diff --git a/h2_playermanager/src/main/resources/sqls/insert_player_withId.sql b/h2_playermanager/src/main/resources/sqls/insert_player_withId.sql deleted file mode 100644 index c0119bc..0000000 --- a/h2_playermanager/src/main/resources/sqls/insert_player_withId.sql +++ /dev/null @@ -1,2 +0,0 @@ -INSERT INTO players (uuid, name, location_x, location_y, location_z, location_yaw, location_pitch, location_world, id) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?); \ No newline at end of file diff --git a/h2_playermanager/src/main/resources/sqls/select_player_byId.sql b/h2_playermanager/src/main/resources/sqls/select_player_byId.sql deleted file mode 100644 index 0267ce6..0000000 --- a/h2_playermanager/src/main/resources/sqls/select_player_byId.sql +++ /dev/null @@ -1,3 +0,0 @@ -SELECT uuid, name, location_x, location_y, location_z, location_yaw, location_pitch, location_world -FROM players WHERE id = ? -LIMIT 1; \ No newline at end of file diff --git a/h2_playermanager/src/main/resources/sqls/select_player_byName.sql b/h2_playermanager/src/main/resources/sqls/select_player_byName.sql deleted file mode 100644 index 36a9b3d..0000000 --- a/h2_playermanager/src/main/resources/sqls/select_player_byName.sql +++ /dev/null @@ -1,3 +0,0 @@ -SELECT id, uuid, location_x, location_y, location_z, location_yaw, location_pitch, location_world -FROM players WHERE name LIKE ? -LIMIT 1; \ No newline at end of file diff --git a/h2_playermanager/src/main/resources/sqls/update_player.sql b/h2_playermanager/src/main/resources/sqls/update_player.sql deleted file mode 100644 index 0e7bb2d..0000000 --- a/h2_playermanager/src/main/resources/sqls/update_player.sql +++ /dev/null @@ -1,10 +0,0 @@ -UPDATE players -SET uuid = ?, - name = ?, - location_x = ?, - location_y = ?, - location_z = ?, - location_yaw = ?, - location_pitch = ?, - location_world = ? -WHERE id = ?; \ No newline at end of file diff --git a/h2_playermanager/src/main/resources/sqls/update_player_location.sql b/h2_playermanager/src/main/resources/sqls/update_player_location.sql deleted file mode 100644 index 30b2d29..0000000 --- a/h2_playermanager/src/main/resources/sqls/update_player_location.sql +++ /dev/null @@ -1,8 +0,0 @@ -UPDATE players -SET location_x = ?, - location_y = ?, - location_z = ?, - location_yaw = ?, - location_pitch = ?, - location_world = ? -WHERE id = ?; \ No newline at end of file diff --git a/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java b/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java deleted file mode 100644 index 58eb283..0000000 --- a/h2_playermanager/src/test/java/mc/core/h2db/SpringConfig.java +++ /dev/null @@ -1,49 +0,0 @@ -package mc.core.h2db; - -import mc.core.world.World; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.DriverManagerDataSource; - -import javax.sql.DataSource; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -@Configuration -@ComponentScan("mc.core.h2db") -public class SpringConfig { - @Bean - public World mockWorld() { - World mockWorld = mock(World.class); - when(mockWorld.getName()).thenReturn("mock_world"); - return mockWorld; - } - - @Bean - public DataSource dataSource() { - DriverManagerDataSource dmds = new DriverManagerDataSource(); - dmds.setDriverClassName("org.h2.Driver"); - dmds.setUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"); - dmds.setUsername("sa"); - return dmds; - } - - @Bean - public JdbcTemplate jdbcTemplate(DataSource dataSource) { - JdbcTemplate jdbcTemplate = new JdbcTemplate(); - jdbcTemplate.setDataSource(dataSource); - return jdbcTemplate; - } - - @Bean - @Scope(value = "prototype") - public H2PlayerManager h2PlayerManager(H2PlayerDAO h2PlayerDAO) { - H2PlayerManager playerManager = new H2PlayerManager(); - playerManager.setH2playerDao(h2PlayerDAO); - return playerManager; - } -} diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java b/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java deleted file mode 100644 index 9abc262..0000000 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestDAO.java +++ /dev/null @@ -1,274 +0,0 @@ -package mc.core.h2db; - -import mc.core.EntityLocation; -import mc.core.world.World; -import org.apache.commons.io.IOUtils; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.DuplicateKeyException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.sql.SQLException; -import java.util.UUID; -import java.util.concurrent.ThreadLocalRandom; - -import static org.junit.Assert.*; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = {SpringConfig.class}) -public class TestDAO { - @Autowired - private JdbcTemplate jdbcTemplate; - @Autowired - private World mockWorld; - @Autowired - private H2PlayerDAO playerDAO; - private H2Player player; - - private void createPlayer() { - final ThreadLocalRandom rnd = ThreadLocalRandom.current(); - final double minD = 0.0d, maxD = 10.0d; - final float minF = 0.0f, maxF = 359.9f; - final int minI = 1000, maxI = 9999; - - player = new H2Player(); - player.setUuid(UUID.randomUUID()); - player.setName("player" + rnd.nextInt(minI, maxI)); - player.setLocation(new EntityLocation( - rnd.nextDouble(minD, maxD), - rnd.nextDouble(minD, maxD), - rnd.nextDouble(minD, maxD), - rnd.nextFloat() * (maxF - minF) + minF, - rnd.nextFloat() * (maxF - minF) + minF - )); - player.setWorld(mockWorld); - } - - private void assertPlayer(H2Player actualPlayer) { - final String sql = "SELECT * FROM players WHERE id = ?"; - jdbcTemplate.query(sql, - ps -> ps.setInt(1, player.getId()), - rs -> { - assertEquals(actualPlayer.getId(), rs.getInt("id")); - assertEquals(actualPlayer.getName(), rs.getString("name")); - assertEquals(actualPlayer.getLocation().getX(), rs.getDouble("location_x"), 0.01d); - assertEquals(actualPlayer.getLocation().getY(), rs.getDouble("location_y"), 0.01d); - assertEquals(actualPlayer.getLocation().getZ(), rs.getDouble("location_z"), 0.01d); - assertEquals(actualPlayer.getLocation().getYaw(), rs.getFloat("location_yaw"), 0.01f); - assertEquals(actualPlayer.getLocation().getPitch(), rs.getFloat("location_pitch"), 0.01f); - assertEquals(actualPlayer.getWorld().getName(), rs.getString("location_world")); - }); - } - - @Before - public void before() throws IOException { - jdbcTemplate.execute(IOUtils.resourceToString("/sqls/drop_table_players.sql", StandardCharsets.UTF_8)); - jdbcTemplate.execute(IOUtils.resourceToString("/sqls/create_tables.sql", StandardCharsets.UTF_8)); - createPlayer(); - assertEquals(0, player.getId()); - } - - @Test - public void testInsert() throws SQLException { - playerDAO.insert(player); - assertNotEquals(0, player.getId()); - - assertPlayer(player); - } - - @Test(expected = DuplicateKeyException.class) - public void testInsertDuplicateKey() throws SQLException { - playerDAO.insert(player); - playerDAO.insert(player); - } - - @Test(expected = SQLException.class) - public void testInsertEmptyName() throws SQLException { - player.setName(""); - playerDAO.insert(player); - } - - @Test(expected = SQLException.class) - public void testInsertNullName() throws SQLException { - player.setName(null); - playerDAO.insert(player); - } - - @Test(expected = SQLException.class) - public void testInsertNullUuid() throws SQLException { - player.setUuid(null); - playerDAO.insert(player); - } - - @Test(expected = SQLException.class) - public void testInsertNullLocation() throws SQLException { - player.setLocation(null); - playerDAO.insert(player); - } - - @Test(expected = SQLException.class) - public void testInsertNullWorld() throws SQLException { - player.setWorld(null); - playerDAO.insert(player); - } - - @Test - public void testGetByName() throws SQLException { - playerDAO.insert(this.player); - - H2Player queryPlayer = new H2Player(); - queryPlayer.setName(player.getName()); - - boolean result = playerDAO.getByName(queryPlayer); - - assertTrue(result); - assertEquals(player, queryPlayer); - } - - @Test - public void testGetByNonExistsName() throws SQLException { - playerDAO.insert(this.player); - - H2Player player = new H2Player(); - player.setName("NON_EXISTS_NAME"); - - boolean result = playerDAO.getByName(player); - assertFalse(result); - } - - @Test - public void testGetById() throws SQLException { - playerDAO.insert(this.player); - - H2Player queryPlayer = new H2Player(); - queryPlayer.setId(player.getId()); - - boolean result = playerDAO.getById(queryPlayer); - - assertTrue(result); - assertEquals(player, queryPlayer); - } - - @Test - public void testGetByNonExistsId() throws SQLException { - playerDAO.insert(player); - assertEquals(1, player.getId()); - - H2Player queryPlayer = new H2Player(); - queryPlayer.setId(999); - - boolean result = playerDAO.getById(queryPlayer); - assertFalse(result); - } - - @Test - public void testUpdate() throws SQLException { - playerDAO.insert(player); - - player.setName("UNKNOWN_PLAYER"); - playerDAO.update(player); - - assertPlayer(player); - } - - @Test(expected = SQLException.class) - public void testUpdateEmptyName() throws SQLException { - playerDAO.insert(player); - - player.setName(""); - playerDAO.update(player); - } - - @Test(expected = SQLException.class) - public void testUpdateNullName() throws SQLException { - playerDAO.insert(player); - - player.setName(null); - playerDAO.update(player); - } - - @Test(expected = SQLException.class) - public void testUpdateNullUuid() throws SQLException { - playerDAO.insert(player); - - player.setUuid(null); - playerDAO.update(player); - } - - @Test(expected = SQLException.class) - public void testUpdateNullLocation() throws SQLException { - playerDAO.insert(player); - - player.setLocation(null); - playerDAO.update(player); - } - - @Test(expected = SQLException.class) - public void testUpdateNullWorld() throws SQLException { - playerDAO.insert(player); - - player.setWorld(null); - playerDAO.update(player); - } - - @Test - public void testUpdateLocation() throws SQLException { - playerDAO.insert(player); - - final String origName = player.getName(); - player.setName("UNKNOWN_PLAYER"); - player.getLocation().setX(33.1d); - player.getLocation().setZ(28.99d); - playerDAO.updateLocation(player); - - final String sql = "SELECT * FROM players WHERE id = ?"; - jdbcTemplate.query(sql, - ps -> ps.setInt(1, player.getId()), - rs -> { - assertEquals(player.getId(), rs.getInt("id")); - assertEquals(origName, rs.getString("name")); - assertEquals(player.getLocation().getX(), rs.getDouble("location_x"), 0.01d); - assertEquals(player.getLocation().getY(), rs.getDouble("location_y"), 0.01d); - assertEquals(player.getLocation().getZ(), rs.getDouble("location_z"), 0.01d); - assertEquals(player.getLocation().getYaw(), rs.getFloat("location_yaw"), 0.01f); - assertEquals(player.getLocation().getPitch(), rs.getFloat("location_pitch"), 0.01f); - assertEquals(player.getWorld().getName(), rs.getString("location_world")); - }); - } - - @Test(expected = SQLException.class) - public void testUpdateLocationNull() throws SQLException { - playerDAO.insert(player); - - player.setLocation(null); - playerDAO.updateLocation(player); - } - - @Test - public void testRemove() throws SQLException { - playerDAO.insert(player); - - final int origId = player.getId(); - playerDAO.remove(player); - assertEquals(0, player.getId()); - - final String sql = "SELECT COUNT(*) FROM players WHERE id = ?"; - jdbcTemplate.query(sql, - ps -> ps.setInt(1, origId), - rs -> {assertEquals(0, rs.getInt(1));}); - } - - @Test(expected = SQLException.class) - public void testRemoveNonExistsId() throws SQLException { - playerDAO.insert(player); - - player.setId(999); - playerDAO.remove(player); - } -} diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java b/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java index f2780a4..7a83b65 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java @@ -1,48 +1,33 @@ package mc.core.h2db; import mc.core.EntityLocation; +import mc.core.h2db.service.H2PlayerService; import mc.core.player.Player; import mc.core.world.World; -import org.apache.commons.io.IOUtils; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.sql.SQLException; import java.util.List; import static org.junit.Assert.*; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = {SpringConfig.class}) +@ContextConfiguration(classes = {TestSpringConfig.class}) +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) public class TestH2PlayerManager { @Autowired - private ApplicationContext context; - @Autowired - private JdbcTemplate jdbcTemplate; - @Autowired - private H2PlayerDAO h2PlayerDAO; + private H2PlayerService h2PlayerService; @Autowired private World mockWorld; + @Autowired private H2PlayerManager playerManager; - @Before - public void before() throws IOException { - playerManager = context.getBean(H2PlayerManager.class); - - jdbcTemplate.execute(IOUtils.resourceToString("/sqls/drop_table_players.sql", StandardCharsets.UTF_8)); - jdbcTemplate.execute(IOUtils.resourceToString("/sqls/create_tables.sql", StandardCharsets.UTF_8)); - } - @Test - public void testCreatePlayer() throws SQLException { + public void testCreatePlayer() { final String playerName = "NEW_PLAYER"; final Player newPlayer = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); @@ -50,9 +35,7 @@ public class TestH2PlayerManager { assertEquals(H2Player.class, newPlayer.getClass()); assertTrue(newPlayer.getId() > 0); - final H2Player queryPlayer = new H2Player(); - queryPlayer.setName(playerName); - h2PlayerDAO.getByName(queryPlayer); + final H2Player queryPlayer = h2PlayerService.getByName(playerName); assertTrue(queryPlayer.getId() > 0); assertEquals(newPlayer, queryPlayer); @@ -74,7 +57,7 @@ public class TestH2PlayerManager { } @Test - public void testLeftServer() throws SQLException { + public void testLeftServer() { assertEquals(0, playerManager.getCountPlayers()); final String playerName = "NEW_PLAYER"; @@ -96,11 +79,9 @@ public class TestH2PlayerManager { assertFalse(player.isOnline()); assertTrue(player.getLoadedChunks().isEmpty()); - H2Player queryPlayer = new H2Player(); - queryPlayer.setId(playerId); - boolean result = h2PlayerDAO.getById(queryPlayer); + final H2Player queryPlayer = h2PlayerService.getById(playerId); - assertTrue(result); + assertNotNull(queryPlayer); ((H2Player)player).setId(playerId); assertEquals(player, queryPlayer); } diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java b/h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java new file mode 100644 index 0000000..5ff647b --- /dev/null +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java @@ -0,0 +1,90 @@ +package mc.core.h2db; + +import mc.core.h2db.service.H2PlayerService; +import mc.core.world.World; +import org.hibernate.jpa.HibernatePersistenceProvider; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; +import java.util.Properties; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@Configuration +@EnableJpaRepositories +@EnableTransactionManagement +@ComponentScan("mc.core.h2db") +public class TestSpringConfig { + private static final String DATABASE_DRIVER = "org.h2.Driver"; + private static final String DATABASE_URL = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"; + private static final String DATABASE_USERNAME = "sa"; + private static final String DATABASE_PASSWORD = "s3cReT"; + + static { + System.setProperty("org.jboss.logging.provider", "slf4j"); + } + + private Properties hibernateProp() { + Properties properties = new Properties(); + properties.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); + properties.put("hibernate.show_sql", "true"); + properties.put("hibernate.format_sql", "true"); + properties.put("hibernate.use_sql_comments", "true"); + properties.put("hibernate.hbm2ddl.auto", "create"); + + return properties; + } + + @Bean + public World mockWorld() { + World mockWorld = mock(World.class); + when(mockWorld.getName()).thenReturn("mock_world"); + return mockWorld; + } + + @Bean + public DataSource dataSource() { + DriverManagerDataSource dmds = new DriverManagerDataSource(); + dmds.setDriverClassName(DATABASE_DRIVER); + dmds.setUrl(DATABASE_URL); + dmds.setUsername(DATABASE_USERNAME); + dmds.setPassword(DATABASE_PASSWORD); + + return dmds; + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { + LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); + entityManagerFactoryBean.setDataSource(dataSource); + entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); + entityManagerFactoryBean.setPackagesToScan("mc.core.h2db.entity"); + entityManagerFactoryBean.setJpaProperties(hibernateProp()); + + return entityManagerFactoryBean; + } + + @Bean + public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { + JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(entityManagerFactory); + + return transactionManager; + } + + @Bean + public H2PlayerManager h2PlayerManager(H2PlayerService h2PlayerService) { + H2PlayerManager playerManager = new H2PlayerManager(); + playerManager.setH2PlayerService(h2PlayerService); + return playerManager; + } +} diff --git a/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java b/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java new file mode 100644 index 0000000..6b2ff03 --- /dev/null +++ b/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java @@ -0,0 +1,133 @@ +package mc.core.h2db.service; + +import mc.core.EntityLocation; +import mc.core.h2db.H2Player; +import mc.core.h2db.TestSpringConfig; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = {TestSpringConfig.class}) +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +public class H2PlayerServiceTest { + @Autowired + private H2PlayerService h2PlayerService; + + private H2Player buildPlayer() { + final ThreadLocalRandom rnd = ThreadLocalRandom.current(); + final double minD = 0.0d, maxD = 10.0d; + final float minF = 0.0f, maxF = 359.9f; + final int minI = 1000, maxI = 9999; + + final H2Player player = new H2Player(); + player.setUuid(UUID.randomUUID()); + player.setName("player" + rnd.nextInt(minI, maxI)); + player.setLocation(new EntityLocation( + rnd.nextDouble(minD, maxD), + rnd.nextDouble(minD, maxD), + rnd.nextDouble(minD, maxD), + rnd.nextFloat() * (maxF - minF) + minF, + rnd.nextFloat() * (maxF - minF) + minF + )); + player.setWorld(null); //FIXME + + return player; + } + + @Test + public void save() { + H2Player player = buildPlayer(); + H2Player savedPlayer = h2PlayerService.save(player); + + player.setId(savedPlayer.getId()); //FIXME костыль, однако + Assert.assertEquals(player, savedPlayer); + } + + @Test(expected = Exception.class) + public void save_NameEmpty() { + H2Player player = buildPlayer(); + player.setName(""); + h2PlayerService.save(player); + } + + @Test(expected = Exception.class) + public void save_NameNull() { + H2Player player = buildPlayer(); + player.setName(null); + h2PlayerService.save(player); + } + + @Test(expected = Exception.class) + public void save_UuidNull() { + H2Player player = buildPlayer(); + player.setUuid(null); + h2PlayerService.save(player); + } + + @Test(expected = Exception.class) + public void save_LocationNull() { + H2Player player = buildPlayer(); + player.setLocation(null); + h2PlayerService.save(player); + } + + @Test + public void remove() { + H2Player player = h2PlayerService.save(buildPlayer()); + h2PlayerService.remove(player); + + H2Player player2 = h2PlayerService.getById(player.getId()); + Assert.assertNull(player2); + } + + @Test(expected = Exception.class) + public void remove_NotExists() { + H2Player player = h2PlayerService.save(buildPlayer()); + h2PlayerService.remove(player); + h2PlayerService.remove(player); + } + + @Test + public void getByName() { + H2Player player = h2PlayerService.save(buildPlayer()); + + H2Player player2 = h2PlayerService.getByName(player.getName()); + Assert.assertEquals(player, player2); + } + + @Test + public void getByName_NotExists() { + Assert.assertNull(h2PlayerService.getByName("UNKNOW_PLAYER")); + } + + @Test + public void getByName_Empty() { + Assert.assertNull(h2PlayerService.getByName("")); + } + + @Test + public void getByName_Null() { + Assert.assertNull(h2PlayerService.getByName(null)); + } + + @Test + public void getById() { + H2Player player = h2PlayerService.save(buildPlayer()); + + H2Player player2 = h2PlayerService.getById(player.getId()); + Assert.assertEquals(player, player2); + } + + @Test + public void getById_NotExists() { + Assert.assertNull(h2PlayerService.getById(9999)); + } +} diff --git a/h2_playermanager/src/test/resources/sqls/drop_table_players.sql b/h2_playermanager/src/test/resources/sqls/drop_table_players.sql deleted file mode 100644 index dd4ab91..0000000 --- a/h2_playermanager/src/test/resources/sqls/drop_table_players.sql +++ /dev/null @@ -1,3 +0,0 @@ -DROP INDEX IF EXISTS idx_players_uuid; -DROP INDEX IF EXISTS idx_players_name; -DROP TABLE IF EXISTS players; \ No newline at end of file From 7225efced992c5b9f3a70e650e29dbe2140cab20 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 7 Oct 2018 21:31:00 +0300 Subject: [PATCH 63/71] JUnit4 -> JUnit5 --- build.gradle | 8 +- .../test/java/mc/core/TestBlockLocation.java | 18 +-- .../test/java/mc/core/TestEntityLocation.java | 20 +-- .../mc/core/TestImmutableEntityLocation.java | 34 +++-- core/src/test/java/mc/core/text/TestText.java | 12 +- .../mc/core/utils/TestCompactedCoords.java | 9 +- .../test/java/mc/core/h2db/TestH2Player.java | 10 +- .../mc/core/h2db/TestH2PlayerManager.java | 26 ++-- .../h2db/service/H2PlayerServiceTest.java | 125 ++++++++++-------- .../packets/TestByteArrayInputNetStream.java | 14 +- .../packets/TestChunkdataPacket.java | 22 +-- .../packets/TestPlayerAbilitiesPacket.java | 24 ++-- .../TestBlockLocationSerializer.java | 14 +- 13 files changed, 175 insertions(+), 161 deletions(-) diff --git a/build.gradle b/build.gradle index 0daec8e..0eeddb5 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,7 @@ subprojects { slf4j_version = '1.7.25' spring_version = '5.1.0.RELEASE' lombok_version = '1.18.2' + junit_version = '5.3.1' } configurations { @@ -42,12 +43,17 @@ subprojects { compileOnly (group: 'org.projectlombok', name: 'lombok', version: lombok_version) /* Testing */ - testCompile (group: 'junit', name: 'junit', version: '4.12') + testImplementation (group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: junit_version) + testRuntimeOnly(group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: junit_version) testCompile (group: 'org.slf4j', name: 'slf4j-simple', version: slf4j_version) testCompile (group: 'org.mockito', name: 'mockito-core', version: '1.10.19') testCompile (group: 'org.springframework', name: 'spring-test', version: spring_version) } + test { + useJUnitPlatform() + } + task copyDep(type: Copy) { into 'libs' from configurations.compile + configurations.runtime - configurations.compile_excludeCopy diff --git a/core/src/test/java/mc/core/TestBlockLocation.java b/core/src/test/java/mc/core/TestBlockLocation.java index 620919f..559d434 100644 --- a/core/src/test/java/mc/core/TestBlockLocation.java +++ b/core/src/test/java/mc/core/TestBlockLocation.java @@ -1,28 +1,28 @@ package mc.core; import mc.core.world.block.BlockLocation; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.concurrent.ThreadLocalRandom; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; -public class TestBlockLocation { +class TestBlockLocation { private static final ThreadLocalRandom rnd = ThreadLocalRandom.current(); private static final int minI = 0, maxI = 10; private int x, y, z; - @Before - public void before() { + @BeforeEach + void before() { x = rnd.nextInt(minI, maxI); y = rnd.nextInt(minI, maxI); z = rnd.nextInt(minI, maxI); } @Test - public void testEquals() { + void testEquals() { BlockLocation loc1 = new BlockLocation(x, y, z); BlockLocation loc2 = new BlockLocation(x, y, z); assertEquals(loc1, loc2); @@ -32,7 +32,7 @@ public class TestBlockLocation { } @Test - public void testClone() { + void testClone() { BlockLocation locOrig = new BlockLocation(x, y, z); BlockLocation locClone = locOrig.clone(); assertEquals(locOrig, locClone); diff --git a/core/src/test/java/mc/core/TestEntityLocation.java b/core/src/test/java/mc/core/TestEntityLocation.java index c6b1c62..9a45675 100644 --- a/core/src/test/java/mc/core/TestEntityLocation.java +++ b/core/src/test/java/mc/core/TestEntityLocation.java @@ -1,22 +1,22 @@ package mc.core; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.concurrent.ThreadLocalRandom; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; -public class TestEntityLocation { +class TestEntityLocation { private static final ThreadLocalRandom rnd = ThreadLocalRandom.current(); private static final double minD = 0.0d, maxD = 10.0d; private static final float minF = 0.0f, maxF = 359.9f; private double x, y, z; private float yaw, pitch; - @Before - public void before() { + @BeforeEach + void before() { x = rnd.nextDouble(minD, maxD); y = rnd.nextDouble(minD, maxD); z = rnd.nextDouble(minD, maxD); @@ -25,7 +25,7 @@ public class TestEntityLocation { } @Test - public void testEquals() { + void testEquals() { EntityLocation loc1 = new EntityLocation(x, y, z, yaw, pitch); EntityLocation loc2 = new EntityLocation(x, y, z, yaw, pitch); assertEquals(loc1, loc2); @@ -38,14 +38,14 @@ public class TestEntityLocation { } @Test - public void testClone() { + void testClone() { EntityLocation locOrig = new EntityLocation(x, y, z, yaw, pitch); EntityLocation locClone = locOrig.clone(); assertEquals(locOrig, locClone); } @Test - public void testGetBlockXZ() { + void testGetBlockXZ() { EntityLocation location; location = new EntityLocation(0d, 0, 0d, 0f, 0f); diff --git a/core/src/test/java/mc/core/TestImmutableEntityLocation.java b/core/src/test/java/mc/core/TestImmutableEntityLocation.java index 2f6a958..85cf4a9 100644 --- a/core/src/test/java/mc/core/TestImmutableEntityLocation.java +++ b/core/src/test/java/mc/core/TestImmutableEntityLocation.java @@ -1,32 +1,30 @@ package mc.core; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; -public class TestImmutableEntityLocation { - @Rule - public ExpectedException thrown = ExpectedException.none(); +class TestImmutableEntityLocation { @Test - public void testSetValue() { + void testSetValue() { EntityLocation location = new ImmutableEntityLocation(1d, 2d, 3d, 4f, 5f); - thrown.expect(UnsupportedOperationException.class); - location.setX(1); - location.setY(1); - location.setZ(1); - location.setYaw(1); - location.setPitch(1); - location.setXYZ(1, 2, 3); - location.setYawPitch(1, 2); - location.set(EntityLocation.ZERO()); + assertThrows(UnsupportedOperationException.class, () -> { + location.setX(1); + location.setY(1); + location.setZ(1); + location.setYaw(1); + location.setPitch(1); + location.setXYZ(1, 2, 3); + location.setYawPitch(1, 2); + location.set(EntityLocation.ZERO()); + }); } @Test - public void testClone() { + void testClone() { EntityLocation locOrig = new ImmutableEntityLocation(1d, 2d, 3d, 4f, 5f); EntityLocation locClone = locOrig.clone(); diff --git a/core/src/test/java/mc/core/text/TestText.java b/core/src/test/java/mc/core/text/TestText.java index 78370a1..4b90e29 100644 --- a/core/src/test/java/mc/core/text/TestText.java +++ b/core/src/test/java/mc/core/text/TestText.java @@ -1,12 +1,12 @@ package mc.core.text; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; -public class TestText { +class TestText { @Test - public void testToPlain() { + void testToPlain() { final String m1 = "mes"; final String m2 = "sage"; final String message = m1 + m2; @@ -26,7 +26,7 @@ public class TestText { } @Test - public void testEquals() { + void testEquals() { assertEquals(Text.of(), Text.of("")); assertEquals(Text.of(), Text.builder().build()); assertEquals(Text.of(), Text.builder("").build()); @@ -44,7 +44,7 @@ public class TestText { } @Test - public void testEmpty() { + void testEmpty() { assertTrue(Text.of().isEmpty()); assertTrue(Text.of((String) null).isEmpty()); assertTrue(Text.of((Text) null).isEmpty()); diff --git a/core/src/test/java/mc/core/utils/TestCompactedCoords.java b/core/src/test/java/mc/core/utils/TestCompactedCoords.java index b357cef..7c82efb 100644 --- a/core/src/test/java/mc/core/utils/TestCompactedCoords.java +++ b/core/src/test/java/mc/core/utils/TestCompactedCoords.java @@ -1,15 +1,14 @@ package mc.core.utils; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.concurrent.ThreadLocalRandom; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; - -public class TestCompactedCoords { +class TestCompactedCoords { @Test - public void testXZ() { + void testXZ() { ThreadLocalRandom random = ThreadLocalRandom.current(); for (int i = 0; i < 100; i++) { diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestH2Player.java b/h2_playermanager/src/test/java/mc/core/h2db/TestH2Player.java index 4149c22..5f60bdb 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestH2Player.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestH2Player.java @@ -1,15 +1,15 @@ package mc.core.h2db; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.UUID; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; -public class TestH2Player { +class TestH2Player { @Test - public void testEquals() { + void testEquals() { UUID uuid = UUID.randomUUID(); H2Player player1 = new H2Player(); diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java b/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java index 7a83b65..c8fdf48 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java @@ -4,21 +4,21 @@ import mc.core.EntityLocation; import mc.core.h2db.service.H2PlayerService; import mc.core.player.Player; import mc.core.world.World; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.List; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; -@RunWith(SpringJUnit4ClassRunner.class) +@ExtendWith(SpringExtension.class) @ContextConfiguration(classes = {TestSpringConfig.class}) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) -public class TestH2PlayerManager { +class TestH2PlayerManager { @Autowired private H2PlayerService h2PlayerService; @Autowired @@ -27,7 +27,7 @@ public class TestH2PlayerManager { private H2PlayerManager playerManager; @Test - public void testCreatePlayer() { + void testCreatePlayer() { final String playerName = "NEW_PLAYER"; final Player newPlayer = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); @@ -45,7 +45,7 @@ public class TestH2PlayerManager { } @Test - public void testJoinServer() { + void testJoinServer() { assertEquals(0, playerManager.getCountPlayers()); final String playerName = "NEW_PLAYER"; @@ -57,7 +57,7 @@ public class TestH2PlayerManager { } @Test - public void testLeftServer() { + void testLeftServer() { assertEquals(0, playerManager.getCountPlayers()); final String playerName = "NEW_PLAYER"; @@ -87,7 +87,7 @@ public class TestH2PlayerManager { } @Test - public void testGetPlayer() { + void testGetPlayer() { assertEquals(0, playerManager.getCountPlayers()); final String playerName = "NEW_PLAYER"; @@ -104,7 +104,7 @@ public class TestH2PlayerManager { } @Test - public void testGetPlayers() { + void testGetPlayers() { assertEquals(0, playerManager.getCountPlayers()); final String playerName = "NEW_PLAYER"; @@ -128,7 +128,7 @@ public class TestH2PlayerManager { } @Test - public void testGetCountPlayers() { + void testGetCountPlayers() { assertEquals(0, playerManager.getCountPlayers()); final String playerName = "NEW_PLAYER"; @@ -145,7 +145,7 @@ public class TestH2PlayerManager { } @Test - public void testGetOfflinePlayer() { + void testGetOfflinePlayer() { final String playerName = "NEW_PLAYER"; final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); playerManager.joinServer(player); diff --git a/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java b/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java index 6b2ff03..6440b3e 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java @@ -3,21 +3,22 @@ package mc.core.h2db.service; import mc.core.EntityLocation; import mc.core.h2db.H2Player; import mc.core.h2db.TestSpringConfig; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; -@RunWith(SpringJUnit4ClassRunner.class) +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(SpringExtension.class) @ContextConfiguration(classes = {TestSpringConfig.class}) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) -public class H2PlayerServiceTest { +class H2PlayerServiceTest { @Autowired private H2PlayerService h2PlayerService; @@ -43,91 +44,101 @@ public class H2PlayerServiceTest { } @Test - public void save() { + void save() { H2Player player = buildPlayer(); H2Player savedPlayer = h2PlayerService.save(player); player.setId(savedPlayer.getId()); //FIXME костыль, однако - Assert.assertEquals(player, savedPlayer); - } - - @Test(expected = Exception.class) - public void save_NameEmpty() { - H2Player player = buildPlayer(); - player.setName(""); - h2PlayerService.save(player); - } - - @Test(expected = Exception.class) - public void save_NameNull() { - H2Player player = buildPlayer(); - player.setName(null); - h2PlayerService.save(player); - } - - @Test(expected = Exception.class) - public void save_UuidNull() { - H2Player player = buildPlayer(); - player.setUuid(null); - h2PlayerService.save(player); - } - - @Test(expected = Exception.class) - public void save_LocationNull() { - H2Player player = buildPlayer(); - player.setLocation(null); - h2PlayerService.save(player); + assertEquals(player, savedPlayer); } @Test - public void remove() { + void save_NameEmpty() { + assertThrows(Exception.class, () -> { + H2Player player = buildPlayer(); + player.setName(""); + h2PlayerService.save(player); + }); + } + + @Test + void save_NameNull() { + assertThrows(Exception.class, () -> { + H2Player player = buildPlayer(); + player.setName(null); + h2PlayerService.save(player); + }); + } + + @Test + void save_UuidNull() { + assertThrows(Exception.class, () -> { + H2Player player = buildPlayer(); + player.setUuid(null); + h2PlayerService.save(player); + }); + } + + @Test + void save_LocationNull() { + assertThrows(Exception.class, () -> { + H2Player player = buildPlayer(); + player.setLocation(null); + h2PlayerService.save(player); + }); + } + + @Test + void remove() { H2Player player = h2PlayerService.save(buildPlayer()); h2PlayerService.remove(player); H2Player player2 = h2PlayerService.getById(player.getId()); - Assert.assertNull(player2); - } - - @Test(expected = Exception.class) - public void remove_NotExists() { - H2Player player = h2PlayerService.save(buildPlayer()); - h2PlayerService.remove(player); - h2PlayerService.remove(player); + assertNull(player2); } @Test - public void getByName() { + void remove_NotExists() { + assertThrows(Exception.class, () -> { + H2Player player = h2PlayerService.save(buildPlayer()); + h2PlayerService.remove(player); + h2PlayerService.remove(player); + }); + } + + @Test + void getByName() { H2Player player = h2PlayerService.save(buildPlayer()); H2Player player2 = h2PlayerService.getByName(player.getName()); - Assert.assertEquals(player, player2); + assertEquals(player, player2); } @Test - public void getByName_NotExists() { - Assert.assertNull(h2PlayerService.getByName("UNKNOW_PLAYER")); + void getByName_NotExists() { + assertNull(h2PlayerService.getByName("UNKNOW_PLAYER")); } @Test - public void getByName_Empty() { - Assert.assertNull(h2PlayerService.getByName("")); + void getByName_Empty() { + assertNull(h2PlayerService.getByName("")); } @Test - public void getByName_Null() { - Assert.assertNull(h2PlayerService.getByName(null)); + void getByName_Null() { + assertNull(h2PlayerService.getByName(null)); } @Test - public void getById() { + void getById() { H2Player player = h2PlayerService.save(buildPlayer()); H2Player player2 = h2PlayerService.getById(player.getId()); - Assert.assertEquals(player, player2); + assertEquals(player, player2); } @Test - public void getById_NotExists() { - Assert.assertNull(h2PlayerService.getById(9999)); + void getById_NotExists() { + assertNull(h2PlayerService.getById(9999)); } } diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java index 72d1574..b73500d 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java @@ -1,17 +1,17 @@ package mc.core.network.proto_1_12_2.packets; import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.Random; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertEquals; -public class TestByteArrayInputNetStream { +class TestByteArrayInputNetStream { private Random rnd = new Random(); @Test - public void testReadByte() { + void testReadByte() { final byte b0 = (byte) rnd.nextInt(); ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); netStream.writeByte(b0); @@ -23,7 +23,7 @@ public class TestByteArrayInputNetStream { } @Test - public void testReadInt() { + void testReadInt() { final int i0 = rnd.nextInt(); ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); netStream.writeInt(i0); @@ -35,7 +35,7 @@ public class TestByteArrayInputNetStream { } @Test - public void testReadFloat() { + void testReadFloat() { final float f0 = rnd.nextFloat(); ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); netStream.writeFloat(f0); @@ -43,6 +43,6 @@ public class TestByteArrayInputNetStream { ByteArrayInputNetStream netInputStream = new ByteArrayInputNetStream(buffer); float f1 = netInputStream.readFloat(); - assertEquals(f0, f1, 0.0f); + assertEquals(f0, f1, 0.00001f); } } \ No newline at end of file diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java index 449a672..cabb163 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java @@ -9,31 +9,31 @@ import mc.core.world.block.BlockFactory; import mc.core.world.block.BlockType; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkSection; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class TestChunkdataPacket { +class TestChunkdataPacket { private static byte[] expectedPacketData; private World world; - @BeforeClass - public static void beforeClassTest() throws IOException { + @BeforeAll + static void beforeClassTest() throws IOException { InputStream inputStream = TestChunkdataPacket.class.getResourceAsStream("ChunkDataPacket.bin"); expectedPacketData = ByteStreams.toByteArray(inputStream); } - @Before - public void prepareWorld() { + @BeforeEach + void prepareWorld() { final ChunkSection chunkSection = mock(ChunkSection.class); when(chunkSection.getSkyLight(anyInt(), anyInt(), anyInt())).thenAnswer(invocation -> { int y = (int)invocation.getArguments()[1]; @@ -77,7 +77,7 @@ public class TestChunkdataPacket { } @Test - public void test() { + void test() { ChunkDataPacket packet = new ChunkDataPacket(); packet.setX(0); packet.setZ(0); diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestPlayerAbilitiesPacket.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestPlayerAbilitiesPacket.java index ec9b150..cf4344c 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestPlayerAbilitiesPacket.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestPlayerAbilitiesPacket.java @@ -1,19 +1,19 @@ package mc.core.network.proto_1_12_2.packets; import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.Random; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; -public class TestPlayerAbilitiesPacket { +class TestPlayerAbilitiesPacket { private Random rnd = new Random(); private PlayerAbilitiesPacket packet; - @Before - public void before() { + @BeforeEach + void before() { packet = new PlayerAbilitiesPacket(); packet.setGodMode(rnd.nextBoolean()); packet.setFlying(rnd.nextBoolean()); @@ -23,7 +23,7 @@ public class TestPlayerAbilitiesPacket { } @Test - public void test() { + void test() { ByteArrayOutputNetStream netOutputStream = new ByteArrayOutputNetStream(); packet.writeSelf(netOutputStream); @@ -31,10 +31,10 @@ public class TestPlayerAbilitiesPacket { PlayerAbilitiesPacket outPkt = new PlayerAbilitiesPacket(); outPkt.readSelf(netInputStream); - assertEquals("god mode", packet.isGodMode(), outPkt.isGodMode()); - assertEquals("flying", packet.isFlying(), outPkt.isFlying()); - assertEquals("can fly", packet.isCanFly(), outPkt.isCanFly()); - assertEquals("instant destroy block", packet.isInstantDestroyBlocks(), outPkt.isInstantDestroyBlocks()); - assertEquals("flying speed", packet.getFlyingSpeed(), outPkt.getFlyingSpeed(), 0.0f); + assertEquals(packet.isGodMode(), outPkt.isGodMode(), "god mode"); + assertEquals(packet.isFlying(), outPkt.isFlying(), "flying"); + assertEquals(packet.isCanFly(), outPkt.isCanFly(), "can fly"); + assertEquals(packet.isInstantDestroyBlocks(), outPkt.isInstantDestroyBlocks(), "instant destroy block"); + assertEquals(packet.getFlyingSpeed(), outPkt.getFlyingSpeed(), 0.00001f, "flying speed"); } } diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/TestBlockLocationSerializer.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/TestBlockLocationSerializer.java index 28db9ea..51d6498 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/TestBlockLocationSerializer.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/TestBlockLocationSerializer.java @@ -1,27 +1,27 @@ package mc.core.network.proto_1_12_2.serializers; import mc.core.world.block.BlockLocation; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.concurrent.ThreadLocalRandom; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertEquals; -public class TestBlockLocationSerializer { +class TestBlockLocationSerializer { private static final ThreadLocalRandom rnd = ThreadLocalRandom.current(); private static final int minI = 0, maxI = 10; private int x, y, z; - @Before - public void before() { + @BeforeEach + void before() { x = rnd.nextInt(minI, maxI); y = rnd.nextInt(minI, maxI); z = rnd.nextInt(minI, maxI); } @Test - public void test() { + void test() { BlockLocation location = new BlockLocation(x, y, z); final long serializedCoords = BlockLocationSerializer.toLong(location); From f5c8d93657803bd5482a3c56f84037e1c1bccdfc Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 7 Oct 2018 22:24:13 +0300 Subject: [PATCH 64/71] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...tityLocation.java => EntityLocationTest.java} | 8 ++++---- ...ion.java => ImmutableEntityLocationTest.java} | 6 +++--- .../{SpringConfig.java => TestSpringConfig.java} | 2 +- .../core/text/{TestText.java => TextTest.java} | 8 ++++---- ...actedCoords.java => CompactedCoordsTest.java} | 4 ++-- .../block/BlockLocationTest.java} | 9 ++++----- ...ayerManager.java => H2PlayerManagerTest.java} | 16 ++++++++-------- .../{TestH2Player.java => H2PlayerTest.java} | 4 ++-- ...eam.java => ByteArrayInputNetStreamTest.java} | 8 ++++---- ...kdataPacket.java => ChunkdataPacketTest.java} | 6 +++--- ...acket.java => PlayerAbilitiesPacketTest.java} | 4 ++-- ...zer.java => BlockLocationSerializerTest.java} | 4 ++-- 12 files changed, 39 insertions(+), 40 deletions(-) rename core/src/test/java/mc/core/{TestEntityLocation.java => EntityLocationTest.java} (96%) rename core/src/test/java/mc/core/{TestImmutableEntityLocation.java => ImmutableEntityLocationTest.java} (90%) rename core/src/test/java/mc/core/{SpringConfig.java => TestSpringConfig.java} (96%) rename core/src/test/java/mc/core/text/{TestText.java => TextTest.java} (97%) rename core/src/test/java/mc/core/utils/{TestCompactedCoords.java => CompactedCoordsTest.java} (92%) rename core/src/test/java/mc/core/{TestBlockLocation.java => world/block/BlockLocationTest.java} (88%) rename h2_playermanager/src/test/java/mc/core/h2db/{TestH2PlayerManager.java => H2PlayerManagerTest.java} (95%) rename h2_playermanager/src/test/java/mc/core/h2db/{TestH2Player.java => H2PlayerTest.java} (94%) rename proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/{TestByteArrayInputNetStream.java => ByteArrayInputNetStreamTest.java} (92%) rename proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/{TestChunkdataPacket.java => ChunkdataPacketTest.java} (96%) rename proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/{TestPlayerAbilitiesPacket.java => PlayerAbilitiesPacketTest.java} (96%) rename proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/{TestBlockLocationSerializer.java => BlockLocationSerializerTest.java} (93%) diff --git a/core/src/test/java/mc/core/TestEntityLocation.java b/core/src/test/java/mc/core/EntityLocationTest.java similarity index 96% rename from core/src/test/java/mc/core/TestEntityLocation.java rename to core/src/test/java/mc/core/EntityLocationTest.java index 9a45675..052e8a6 100644 --- a/core/src/test/java/mc/core/TestEntityLocation.java +++ b/core/src/test/java/mc/core/EntityLocationTest.java @@ -8,7 +8,7 @@ import java.util.concurrent.ThreadLocalRandom; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; -class TestEntityLocation { +class EntityLocationTest { private static final ThreadLocalRandom rnd = ThreadLocalRandom.current(); private static final double minD = 0.0d, maxD = 10.0d; private static final float minF = 0.0f, maxF = 359.9f; @@ -25,7 +25,7 @@ class TestEntityLocation { } @Test - void testEquals() { + void equals_() { EntityLocation loc1 = new EntityLocation(x, y, z, yaw, pitch); EntityLocation loc2 = new EntityLocation(x, y, z, yaw, pitch); assertEquals(loc1, loc2); @@ -38,14 +38,14 @@ class TestEntityLocation { } @Test - void testClone() { + void clone_() { EntityLocation locOrig = new EntityLocation(x, y, z, yaw, pitch); EntityLocation locClone = locOrig.clone(); assertEquals(locOrig, locClone); } @Test - void testGetBlockXZ() { + void getBlockXZ() { EntityLocation location; location = new EntityLocation(0d, 0, 0d, 0f, 0f); diff --git a/core/src/test/java/mc/core/TestImmutableEntityLocation.java b/core/src/test/java/mc/core/ImmutableEntityLocationTest.java similarity index 90% rename from core/src/test/java/mc/core/TestImmutableEntityLocation.java rename to core/src/test/java/mc/core/ImmutableEntityLocationTest.java index 85cf4a9..0335538 100644 --- a/core/src/test/java/mc/core/TestImmutableEntityLocation.java +++ b/core/src/test/java/mc/core/ImmutableEntityLocationTest.java @@ -5,10 +5,10 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -class TestImmutableEntityLocation { +class ImmutableEntityLocationTest { @Test - void testSetValue() { + void setValue() { EntityLocation location = new ImmutableEntityLocation(1d, 2d, 3d, 4f, 5f); assertThrows(UnsupportedOperationException.class, () -> { @@ -24,7 +24,7 @@ class TestImmutableEntityLocation { } @Test - void testClone() { + void clone_() { EntityLocation locOrig = new ImmutableEntityLocation(1d, 2d, 3d, 4f, 5f); EntityLocation locClone = locOrig.clone(); diff --git a/core/src/test/java/mc/core/SpringConfig.java b/core/src/test/java/mc/core/TestSpringConfig.java similarity index 96% rename from core/src/test/java/mc/core/SpringConfig.java rename to core/src/test/java/mc/core/TestSpringConfig.java index 9484ce9..34dc1de 100644 --- a/core/src/test/java/mc/core/SpringConfig.java +++ b/core/src/test/java/mc/core/TestSpringConfig.java @@ -10,7 +10,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @Configuration -public class SpringConfig { +public class TestSpringConfig { @Bean() public World simpleMockWorld() { return mock(World.class); diff --git a/core/src/test/java/mc/core/text/TestText.java b/core/src/test/java/mc/core/text/TextTest.java similarity index 97% rename from core/src/test/java/mc/core/text/TestText.java rename to core/src/test/java/mc/core/text/TextTest.java index 4b90e29..fbb417b 100644 --- a/core/src/test/java/mc/core/text/TestText.java +++ b/core/src/test/java/mc/core/text/TextTest.java @@ -4,9 +4,9 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; -class TestText { +class TextTest { @Test - void testToPlain() { + void toPlain() { final String m1 = "mes"; final String m2 = "sage"; final String message = m1 + m2; @@ -26,7 +26,7 @@ class TestText { } @Test - void testEquals() { + void equals_() { assertEquals(Text.of(), Text.of("")); assertEquals(Text.of(), Text.builder().build()); assertEquals(Text.of(), Text.builder("").build()); @@ -44,7 +44,7 @@ class TestText { } @Test - void testEmpty() { + void isEmpty() { assertTrue(Text.of().isEmpty()); assertTrue(Text.of((String) null).isEmpty()); assertTrue(Text.of((Text) null).isEmpty()); diff --git a/core/src/test/java/mc/core/utils/TestCompactedCoords.java b/core/src/test/java/mc/core/utils/CompactedCoordsTest.java similarity index 92% rename from core/src/test/java/mc/core/utils/TestCompactedCoords.java rename to core/src/test/java/mc/core/utils/CompactedCoordsTest.java index 7c82efb..f88443e 100644 --- a/core/src/test/java/mc/core/utils/TestCompactedCoords.java +++ b/core/src/test/java/mc/core/utils/CompactedCoordsTest.java @@ -6,9 +6,9 @@ import java.util.concurrent.ThreadLocalRandom; import static org.junit.jupiter.api.Assertions.assertEquals; -class TestCompactedCoords { +class CompactedCoordsTest { @Test - void testXZ() { + void compressXZ() { ThreadLocalRandom random = ThreadLocalRandom.current(); for (int i = 0; i < 100; i++) { diff --git a/core/src/test/java/mc/core/TestBlockLocation.java b/core/src/test/java/mc/core/world/block/BlockLocationTest.java similarity index 88% rename from core/src/test/java/mc/core/TestBlockLocation.java rename to core/src/test/java/mc/core/world/block/BlockLocationTest.java index 559d434..d716995 100644 --- a/core/src/test/java/mc/core/TestBlockLocation.java +++ b/core/src/test/java/mc/core/world/block/BlockLocationTest.java @@ -1,6 +1,5 @@ -package mc.core; +package mc.core.world.block; -import mc.core.world.block.BlockLocation; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -9,7 +8,7 @@ import java.util.concurrent.ThreadLocalRandom; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; -class TestBlockLocation { +class BlockLocationTest { private static final ThreadLocalRandom rnd = ThreadLocalRandom.current(); private static final int minI = 0, maxI = 10; private int x, y, z; @@ -22,7 +21,7 @@ class TestBlockLocation { } @Test - void testEquals() { + void equals_() { BlockLocation loc1 = new BlockLocation(x, y, z); BlockLocation loc2 = new BlockLocation(x, y, z); assertEquals(loc1, loc2); @@ -32,7 +31,7 @@ class TestBlockLocation { } @Test - void testClone() { + void clone_() { BlockLocation locOrig = new BlockLocation(x, y, z); BlockLocation locClone = locOrig.clone(); assertEquals(locOrig, locClone); diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java b/h2_playermanager/src/test/java/mc/core/h2db/H2PlayerManagerTest.java similarity index 95% rename from h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java rename to h2_playermanager/src/test/java/mc/core/h2db/H2PlayerManagerTest.java index c8fdf48..dd25625 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestH2PlayerManager.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/H2PlayerManagerTest.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.*; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = {TestSpringConfig.class}) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) -class TestH2PlayerManager { +class H2PlayerManagerTest { @Autowired private H2PlayerService h2PlayerService; @Autowired @@ -27,7 +27,7 @@ class TestH2PlayerManager { private H2PlayerManager playerManager; @Test - void testCreatePlayer() { + void createPlayer() { final String playerName = "NEW_PLAYER"; final Player newPlayer = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); @@ -45,7 +45,7 @@ class TestH2PlayerManager { } @Test - void testJoinServer() { + void joinServer() { assertEquals(0, playerManager.getCountPlayers()); final String playerName = "NEW_PLAYER"; @@ -57,7 +57,7 @@ class TestH2PlayerManager { } @Test - void testLeftServer() { + void leftServer() { assertEquals(0, playerManager.getCountPlayers()); final String playerName = "NEW_PLAYER"; @@ -87,7 +87,7 @@ class TestH2PlayerManager { } @Test - void testGetPlayer() { + void getPlayer() { assertEquals(0, playerManager.getCountPlayers()); final String playerName = "NEW_PLAYER"; @@ -104,7 +104,7 @@ class TestH2PlayerManager { } @Test - void testGetPlayers() { + void getPlayers() { assertEquals(0, playerManager.getCountPlayers()); final String playerName = "NEW_PLAYER"; @@ -128,7 +128,7 @@ class TestH2PlayerManager { } @Test - void testGetCountPlayers() { + void getCountPlayers() { assertEquals(0, playerManager.getCountPlayers()); final String playerName = "NEW_PLAYER"; @@ -145,7 +145,7 @@ class TestH2PlayerManager { } @Test - void testGetOfflinePlayer() { + void getOfflinePlayer() { final String playerName = "NEW_PLAYER"; final Player player = playerManager.createPlayer(playerName, EntityLocation.ZERO(), mockWorld); playerManager.joinServer(player); diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestH2Player.java b/h2_playermanager/src/test/java/mc/core/h2db/H2PlayerTest.java similarity index 94% rename from h2_playermanager/src/test/java/mc/core/h2db/TestH2Player.java rename to h2_playermanager/src/test/java/mc/core/h2db/H2PlayerTest.java index 5f60bdb..271fae7 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestH2Player.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/H2PlayerTest.java @@ -7,9 +7,9 @@ import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; -class TestH2Player { +class H2PlayerTest { @Test - void testEquals() { + void equals_() { UUID uuid = UUID.randomUUID(); H2Player player1 = new H2Player(); diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStreamTest.java similarity index 92% rename from proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java rename to proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStreamTest.java index b73500d..4964a77 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestByteArrayInputNetStream.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ByteArrayInputNetStreamTest.java @@ -7,11 +7,11 @@ import java.util.Random; import static org.junit.jupiter.api.Assertions.assertEquals; -class TestByteArrayInputNetStream { +class ByteArrayInputNetStreamTest { private Random rnd = new Random(); @Test - void testReadByte() { + void readByte() { final byte b0 = (byte) rnd.nextInt(); ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); netStream.writeByte(b0); @@ -23,7 +23,7 @@ class TestByteArrayInputNetStream { } @Test - void testReadInt() { + void readInt() { final int i0 = rnd.nextInt(); ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); netStream.writeInt(i0); @@ -35,7 +35,7 @@ class TestByteArrayInputNetStream { } @Test - void testReadFloat() { + void readFloat() { final float f0 = rnd.nextFloat(); ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); netStream.writeFloat(f0); diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ChunkdataPacketTest.java similarity index 96% rename from proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java rename to proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ChunkdataPacketTest.java index cabb163..5060676 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/ChunkdataPacketTest.java @@ -22,13 +22,13 @@ import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -class TestChunkdataPacket { +class ChunkdataPacketTest { private static byte[] expectedPacketData; private World world; @BeforeAll static void beforeClassTest() throws IOException { - InputStream inputStream = TestChunkdataPacket.class.getResourceAsStream("ChunkDataPacket.bin"); + InputStream inputStream = ChunkdataPacketTest.class.getResourceAsStream("ChunkDataPacket.bin"); expectedPacketData = ByteStreams.toByteArray(inputStream); } @@ -77,7 +77,7 @@ class TestChunkdataPacket { } @Test - void test() { + void writePacket() { ChunkDataPacket packet = new ChunkDataPacket(); packet.setX(0); packet.setZ(0); diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestPlayerAbilitiesPacket.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacketTest.java similarity index 96% rename from proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestPlayerAbilitiesPacket.java rename to proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacketTest.java index cf4344c..229a15a 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestPlayerAbilitiesPacket.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacketTest.java @@ -8,7 +8,7 @@ import java.util.Random; import static org.junit.jupiter.api.Assertions.assertEquals; -class TestPlayerAbilitiesPacket { +class PlayerAbilitiesPacketTest { private Random rnd = new Random(); private PlayerAbilitiesPacket packet; @@ -23,7 +23,7 @@ class TestPlayerAbilitiesPacket { } @Test - void test() { + void writePacket() { ByteArrayOutputNetStream netOutputStream = new ByteArrayOutputNetStream(); packet.writeSelf(netOutputStream); diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/TestBlockLocationSerializer.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializerTest.java similarity index 93% rename from proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/TestBlockLocationSerializer.java rename to proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializerTest.java index 51d6498..dda7500 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/TestBlockLocationSerializer.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/serializers/BlockLocationSerializerTest.java @@ -8,7 +8,7 @@ import java.util.concurrent.ThreadLocalRandom; import static org.junit.jupiter.api.Assertions.assertEquals; -class TestBlockLocationSerializer { +class BlockLocationSerializerTest { private static final ThreadLocalRandom rnd = ThreadLocalRandom.current(); private static final int minI = 0, maxI = 10; private int x, y, z; @@ -21,7 +21,7 @@ class TestBlockLocationSerializer { } @Test - void test() { + void serialize() { BlockLocation location = new BlockLocation(x, y, z); final long serializedCoords = BlockLocationSerializer.toLong(location); From 72017a86bb683901b6fae67527adf8a1f5b33eaa Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 8 Oct 2018 13:40:55 +0300 Subject: [PATCH 65/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8=20=D1=81=D0=BF=D0=B0?= =?UTF-8?q?=D0=B2=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/world/World.java | 5 ++++- simple_world/src/main/java/mc/world/simple/SimpleWorld.java | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/mc/core/world/World.java b/core/src/main/java/mc/core/world/World.java index 0c29708..37d35e0 100644 --- a/core/src/main/java/mc/core/world/World.java +++ b/core/src/main/java/mc/core/world/World.java @@ -13,7 +13,10 @@ public interface World { WorldType getWorldType(); EntityLocation getSpawn(); - void setSpawn(double x, double y, double z, float yaw, float pitch); + void setSpawn(EntityLocation location); + default void setSpawn(double x, double y, double z, float yaw, float pitch) { + setSpawn(new EntityLocation(x, y, z, yaw, pitch)); + } default void setSpawn(double x, double y, double z) { setSpawn(x, y, z, 0f, 0f); } diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index ef2981d..10001e2 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -39,8 +39,8 @@ public class SimpleWorld implements World { } @Override - public void setSpawn(double x, double y, double z, float yaw, float pitch) { - this.spawn = new EntityLocation(x, y, z, yaw, pitch); + public void setSpawn(EntityLocation location) { + this.spawn = location; } @Override From bddda59b78e93270291a9c3e4bacc02d81eda361 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 8 Oct 2018 14:04:14 +0300 Subject: [PATCH 66/71] optimize import --- simple_world/src/main/java/mc/world/simple/SimpleWorld.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index 10001e2..b91581c 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -10,12 +10,9 @@ import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; import mc.core.world.World; import mc.core.world.WorldType; -import mc.core.world.block.BlockType; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkProvider; -import mc.core.world.chunk.ChunkSection; -import java.util.ArrayList; import java.util.List; @Slf4j From 52e5c46f8bb23ea13ab91161170c71fa8980eca4 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 8 Oct 2018 14:05:55 +0300 Subject: [PATCH 67/71] optimize imports --- core/src/main/java/mc/core/embedded/FakePlayerManager.java | 1 - core/src/main/java/mc/core/world/block/BlockLocation.java | 4 +++- .../mc/core/network/proto_1_12_2/packets/BossBarPacket.java | 5 ++++- .../proto_1_12_2/packets/PlayerBlockPlacementPacket.java | 4 ++-- .../network/proto_1_12_2/packets/PlayerDiggingPacket.java | 4 ++-- .../core/network/proto_1_12_2/packets/TabCompletePacket.java | 2 +- .../mc/core/network/proto_1_12_2/netty/KeepAliveThread.java | 1 - .../network/proto_1_12_2/netty/handlers/LoginHandler.java | 2 +- .../network/proto_1_12_2/netty/handlers/PlayHandler.java | 2 +- .../proto_1_12_2/netty/wrappers/WrapperNetChannel.java | 3 --- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/mc/core/embedded/FakePlayerManager.java b/core/src/main/java/mc/core/embedded/FakePlayerManager.java index f90255b..a167573 100644 --- a/core/src/main/java/mc/core/embedded/FakePlayerManager.java +++ b/core/src/main/java/mc/core/embedded/FakePlayerManager.java @@ -12,7 +12,6 @@ import mc.core.world.World; import java.util.Collections; import java.util.List; -import java.util.Optional; public class FakePlayerManager implements PlayerManager { public static class FakeNetChannet implements NetChannel { diff --git a/core/src/main/java/mc/core/world/block/BlockLocation.java b/core/src/main/java/mc/core/world/block/BlockLocation.java index 7c9ca85..9ac33f0 100644 --- a/core/src/main/java/mc/core/world/block/BlockLocation.java +++ b/core/src/main/java/mc/core/world/block/BlockLocation.java @@ -1,6 +1,8 @@ package mc.core.world.block; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/BossBarPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/BossBarPacket.java index 523904d..7339c11 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/BossBarPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/BossBarPacket.java @@ -4,7 +4,10 @@ */ package mc.core.network.proto_1_12_2.packets; -import lombok.*; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.ToString; import mc.core.network.NetOutputStream; import mc.core.network.SCPacket; import mc.core.network.proto_1_12_2.serializers.TextMapper; diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java index ebcf00d..b9c2a2e 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java @@ -2,11 +2,11 @@ package mc.core.network.proto_1_12_2.packets; import lombok.Getter; import lombok.ToString; -import mc.core.network.proto_1_12_2.serializers.BlockLocationSerializer; -import mc.core.world.block.BlockLocation; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; import mc.core.network.proto_1_12_2.Direction; +import mc.core.network.proto_1_12_2.serializers.BlockLocationSerializer; +import mc.core.world.block.BlockLocation; @Getter @ToString diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java index 355cc57..341ca67 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java @@ -3,11 +3,11 @@ package mc.core.network.proto_1_12_2.packets; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; -import mc.core.network.proto_1_12_2.serializers.BlockLocationSerializer; -import mc.core.world.block.BlockLocation; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; import mc.core.network.proto_1_12_2.Direction; +import mc.core.network.proto_1_12_2.serializers.BlockLocationSerializer; +import mc.core.world.block.BlockLocation; import java.util.Arrays; diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java index 558e8dc..4e1082e 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java @@ -4,9 +4,9 @@ */ package mc.core.network.proto_1_12_2.packets; -import mc.core.world.block.BlockLocation; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; +import mc.core.world.block.BlockLocation; public class TabCompletePacket implements CSPacket { private String text; diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/KeepAliveThread.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/KeepAliveThread.java index afa4607..e747d82 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/KeepAliveThread.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/KeepAliveThread.java @@ -1,6 +1,5 @@ package mc.core.network.proto_1_12_2.netty; -import lombok.Getter; import lombok.Setter; import mc.core.network.proto_1_12_2.packets.KeepAlivePacket; import mc.core.player.PlayerManager; diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java index 829392f..d0c0d95 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java @@ -2,8 +2,8 @@ package mc.core.network.proto_1_12_2.netty.handlers; import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; -import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.eventbus.EventBusGetter; +import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.network.proto_1_12_2.State; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.netty.KeepAliveThread; diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java index d132486..83b1a7e 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java @@ -8,8 +8,8 @@ import io.netty.channel.Channel; import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; import mc.core.chat.ChatProcessor; -import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.eventbus.EventBusGetter; +import mc.core.eventbus.events.CS_PlayerMoveEvent; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.packets.*; import mc.core.player.Player; diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetChannel.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetChannel.java index fd53188..3d03a82 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetChannel.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetChannel.java @@ -10,14 +10,11 @@ import mc.core.chat.MessageType; import mc.core.network.NetChannel; import mc.core.network.SCPacket; import mc.core.network.proto_1_12_2.packets.ChatMessageServerPacket; -import mc.core.network.proto_1_12_2.packets.KeepAlivePacket; import mc.core.network.proto_1_12_2.packets.TimeUpdatePacket; import mc.core.network.proto_1_12_2.packets.TitlePacket; import mc.core.text.Text; import mc.core.text.Title; -import java.util.Random; - @RequiredArgsConstructor public class WrapperNetChannel implements NetChannel { private final Channel channel; From 686d44490645e54641c76d4c12edbc009aff09c8 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 8 Oct 2018 14:07:19 +0300 Subject: [PATCH 68/71] optimize imports --- core/src/main/java/mc/core/world/chunk/ChunkSection.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/mc/core/world/chunk/ChunkSection.java b/core/src/main/java/mc/core/world/chunk/ChunkSection.java index a829963..ae65a8b 100644 --- a/core/src/main/java/mc/core/world/chunk/ChunkSection.java +++ b/core/src/main/java/mc/core/world/chunk/ChunkSection.java @@ -5,7 +5,6 @@ package mc.core.world.chunk; import mc.core.world.Biome; -import mc.core.world.World; import mc.core.world.block.Block; /* 16x16x16 */ From 1ffbead1f6699a05f5c16df9d0606a1223762121 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 8 Oct 2018 14:38:01 +0300 Subject: [PATCH 69/71] =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20World=20=D0=BF=D0=BE=20=D0=B5=D0=B3=D0=BE?= =?UTF-8?q?=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Суть в том, что ID бина - это и есть World.name --- .../java/mc/core/h2db/H2PlayerManager.java | 23 +++---------------- .../mc/core/h2db/entity/H2PlayerEntity.java | 16 ++++++------- .../h2db/service/H2PlayerServiceImpl.java | 9 +++++--- .../java/mc/core/h2db/TestSpringConfig.java | 4 ++-- .../h2db/service/H2PlayerServiceTest.java | 19 +++++++++++---- .../java/mc/world/simple/SimpleWorld.java | 15 +++++++----- 6 files changed, 42 insertions(+), 44 deletions(-) diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java index 9741d30..7db2b42 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java @@ -12,6 +12,7 @@ import mc.core.player.PlayerManager; import mc.core.player.PlayerSettings; import mc.core.world.World; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import java.util.ArrayList; @@ -26,8 +27,6 @@ public class H2PlayerManager implements PlayerManager { @Autowired private H2PlayerService h2PlayerService; private List playerList = Collections.synchronizedList(new ArrayList<>()); - @Autowired - private World world; //FIXME @Override public Player createPlayer(String name, EntityLocation location, World world) { @@ -91,25 +90,9 @@ public class H2PlayerManager implements PlayerManager { @Override public Player getOfflinePlayer(String name) { - //TODO похоже в попытке где-то оптимизировать/сэконопить я сам себя ******[обманул] - //необходимо этот участок кода переписать - //потому как похоже на экономию на спичках - H2Player h2Player = playerList.stream() + return playerList.stream() .filter(player -> player.getName().equals(name)) .filter(player -> !player.isOnline()) - .findFirst().orElse(null); - - if (h2Player == null) { - h2Player = h2PlayerService.getByName(name); - if (h2Player != null) { - h2Player.setWorld(world); - return h2Player; - } else { - return null; - } - } else { - h2Player.setWorld(world); - return h2Player; - } + .findFirst().orElseGet(() -> h2PlayerService.getByName(name)); } } diff --git a/h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java b/h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java index 1edc5f4..86e9cda 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java @@ -4,7 +4,9 @@ import lombok.Data; import lombok.NoArgsConstructor; import mc.core.EntityLocation; import mc.core.h2db.H2Player; +import mc.core.world.World; import org.hibernate.annotations.GenericGenerator; +import org.springframework.context.ApplicationContext; import javax.persistence.*; import java.util.UUID; @@ -55,11 +57,7 @@ public class H2PlayerEntity { this.locationZ = player.getLocation().getZ(); this.locationYaw = player.getLocation().getYaw(); this.locationPitch = player.getLocation().getPitch(); - if (player.getWorld() != null) { //FIXME - this.locationWorld = player.getWorld().getName(); - } else { - this.locationWorld = "null_world"; - } + this.locationWorld = player.getWorld().getName(); } public void setUuid(String uuid) { @@ -78,12 +76,12 @@ public class H2PlayerEntity { } } - public H2Player toPlayer() { + public H2Player toPlayer(ApplicationContext context) { H2Player player = new H2Player(); - return toPlayer(player); + return toPlayer(player, context); } - public H2Player toPlayer(H2Player player) { + public H2Player toPlayer(H2Player player, ApplicationContext context) { player.setId(this.id.intValue()); player.setUuid(UUID.fromString(this.uuid)); player.setName(this.name); @@ -97,7 +95,7 @@ public class H2PlayerEntity { player.getLocation().setYawPitch(this.locationYaw, this.locationPitch); } - player.setWorld(null); //FIXME + player.setWorld(context.getBean(this.locationWorld, World.class)); return player; } diff --git a/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java b/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java index d716444..b920fbf 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java @@ -4,12 +4,15 @@ import mc.core.h2db.H2Player; import mc.core.h2db.entity.H2PlayerEntity; import mc.core.h2db.repository.H2PlayerEntityRepository; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import java.util.Optional; @Service public class H2PlayerServiceImpl implements H2PlayerService { + @Autowired + private ApplicationContext context; @Autowired private H2PlayerEntityRepository h2PlayerEntityRepository; @@ -19,7 +22,7 @@ public class H2PlayerServiceImpl implements H2PlayerService { //TODO возможно имеет смысл здесь оптимизация //вместо toPlayer() сделать toPlayer(H2Player) который в существующий //будет дописывать/обновлять данные - return h2PlayerEntityRepository.saveAndFlush(entity).toPlayer(player); + return h2PlayerEntityRepository.saveAndFlush(entity).toPlayer(player, context); } @Override @@ -30,12 +33,12 @@ public class H2PlayerServiceImpl implements H2PlayerService { @Override public H2Player getByName(String name) { Optional optEntity = h2PlayerEntityRepository.findByName(name); - return optEntity.map(H2PlayerEntity::toPlayer).orElse(null); + return optEntity.map(entiry -> entiry.toPlayer(context)).orElse(null); } @Override public H2Player getById(int id) { Optional optEntity = h2PlayerEntityRepository.findById((long) id); - return optEntity.map(H2PlayerEntity::toPlayer).orElse(null); + return optEntity.map(entiry -> entiry.toPlayer(context)).orElse(null); } } diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java b/h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java index 5ff647b..8dd5f80 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java @@ -44,10 +44,10 @@ public class TestSpringConfig { return properties; } - @Bean + @Bean("mockWorld") public World mockWorld() { World mockWorld = mock(World.class); - when(mockWorld.getName()).thenReturn("mock_world"); + when(mockWorld.getName()).thenReturn("mockWorld"); return mockWorld; } diff --git a/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java b/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java index 6440b3e..464e0e4 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java @@ -3,6 +3,7 @@ package mc.core.h2db.service; import mc.core.EntityLocation; import mc.core.h2db.H2Player; import mc.core.h2db.TestSpringConfig; +import mc.core.world.World; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -21,6 +22,8 @@ import static org.junit.jupiter.api.Assertions.*; class H2PlayerServiceTest { @Autowired private H2PlayerService h2PlayerService; + @Autowired + private World world; private H2Player buildPlayer() { final ThreadLocalRandom rnd = ThreadLocalRandom.current(); @@ -38,18 +41,26 @@ class H2PlayerServiceTest { rnd.nextFloat() * (maxF - minF) + minF, rnd.nextFloat() * (maxF - minF) + minF )); - player.setWorld(null); //FIXME + player.setWorld(world); return player; } + private void assertPlayers(H2Player expected, H2Player actual) { + assertEquals(expected, actual); + assertEquals(expected.getName(), actual.getName()); + assertEquals(expected.getLocation(), actual.getLocation()); + assertNotNull(actual.getWorld()); + assertEquals(expected.getWorld(), actual.getWorld()); + } + @Test void save() { H2Player player = buildPlayer(); H2Player savedPlayer = h2PlayerService.save(player); player.setId(savedPlayer.getId()); //FIXME костыль, однако - assertEquals(player, savedPlayer); + assertPlayers(player, savedPlayer); } @Test @@ -111,7 +122,7 @@ class H2PlayerServiceTest { H2Player player = h2PlayerService.save(buildPlayer()); H2Player player2 = h2PlayerService.getByName(player.getName()); - assertEquals(player, player2); + assertPlayers(player, player2); } @Test @@ -134,7 +145,7 @@ class H2PlayerServiceTest { H2Player player = h2PlayerService.save(buildPlayer()); H2Player player2 = h2PlayerService.getById(player.getId()); - assertEquals(player, player2); + assertPlayers(player, player2); } @Test diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index b91581c..112f8b2 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -1,7 +1,3 @@ -/* - * DmitriyMX - * 2018-04-28 - */ package mc.world.simple; import lombok.Getter; @@ -12,13 +8,15 @@ import mc.core.world.World; import mc.core.world.WorldType; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkProvider; +import org.springframework.beans.factory.BeanNameAware; +import javax.annotation.Nonnull; import java.util.List; @Slf4j -public class SimpleWorld implements World { +public class SimpleWorld implements World, BeanNameAware { @Getter - private final String name = "flat"; + private String name; @Getter private final WorldType worldType = WorldType.FLAT; private EntityLocation spawn; @@ -60,4 +58,9 @@ public class SimpleWorld implements World { ((FlatChunkProvider)chunkProvider).setLayersBlock(listOfLayers); } } + + @Override + public void setBeanName(@Nonnull String name) { + this.name = name; + } } From e1c3919c733100a02919f795ab934ea0bb56ecc4 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 9 Oct 2018 01:12:12 +0300 Subject: [PATCH 70/71] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20SimpleWorld?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/mc/core/EntityLocationTest.java | 4 +- .../mc/world/simple/FlatChunkProvider.java | 10 +++-- .../mc/world/simple/SimpleChunkSection.java | 11 +++-- .../java/mc/world/simple/SimpleWorld.java | 14 +----- .../world/simple/SimpleChunkSectionTest.java | 44 +++++++++++++++++++ .../java/mc/world/simple/SimpleWorldTest.java | 37 ++++++++++++++++ .../mc/world/simple/TestSpringConfig.java | 38 ++++++++++++++++ 7 files changed, 137 insertions(+), 21 deletions(-) create mode 100644 simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java create mode 100644 simple_world/src/test/java/mc/world/simple/SimpleWorldTest.java create mode 100644 simple_world/src/test/java/mc/world/simple/TestSpringConfig.java diff --git a/core/src/test/java/mc/core/EntityLocationTest.java b/core/src/test/java/mc/core/EntityLocationTest.java index 052e8a6..0e31fdc 100644 --- a/core/src/test/java/mc/core/EntityLocationTest.java +++ b/core/src/test/java/mc/core/EntityLocationTest.java @@ -5,8 +5,7 @@ import org.junit.jupiter.api.Test; import java.util.concurrent.ThreadLocalRandom; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.*; class EntityLocationTest { private static final ThreadLocalRandom rnd = ThreadLocalRandom.current(); @@ -42,6 +41,7 @@ class EntityLocationTest { EntityLocation locOrig = new EntityLocation(x, y, z, yaw, pitch); EntityLocation locClone = locOrig.clone(); assertEquals(locOrig, locClone); + assertNotSame(locOrig, locClone); } @Test diff --git a/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java b/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java index af13eb8..45a3cd0 100644 --- a/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java +++ b/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java @@ -11,7 +11,7 @@ import java.util.List; public class FlatChunkProvider implements ChunkProvider { private ChunkSection chunkSection; - public void setLayersBlock(List listOfLayers) { + public void setLayersBlockAsString(List listOfLayers) { List layoutsBlock = new ArrayList<>(); for (String value : listOfLayers) { @@ -29,6 +29,10 @@ public class FlatChunkProvider implements ChunkProvider { } } + setLayersBlock(layoutsBlock); + } + + public void setLayersBlock(List layoutsBlock) { this.chunkSection = new SimpleChunkSection(layoutsBlock); } @@ -41,11 +45,11 @@ public class FlatChunkProvider implements ChunkProvider { @Override public void saveChunk(Chunk chunk) { - //TODO ignore + //FIXME nope... } @Override public void saveChunk(Chunk... chunks) { - //TODO ignore + //FIXME nope... } } diff --git a/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java index a0c8cc6..4674ac7 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java @@ -1,7 +1,3 @@ -/* - * DmitriyMX - * 2018-04-28 - */ package mc.world.simple; import mc.core.world.Biome; @@ -65,6 +61,13 @@ public class SimpleChunkSection implements ChunkSection { @Override public Block getBlock(int x, int y, int z) { + if (x < 0) x = 0; + else if (x > 15) x = 15; + if (y < 0) y = 0; + else if (y > 15) y = 15; + if (z < 0) z = 0; + else if (z > 15) z = 15; + if (y >= layersBlock.size()) { return blockFactory.create(BlockType.AIR, x, y, z); } diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index 112f8b2..b4ac9e4 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -9,11 +9,12 @@ import mc.core.world.WorldType; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkProvider; import org.springframework.beans.factory.BeanNameAware; +import org.springframework.stereotype.Component; import javax.annotation.Nonnull; -import java.util.List; @Slf4j +@Component public class SimpleWorld implements World, BeanNameAware { @Getter private String name; @@ -48,17 +49,6 @@ public class SimpleWorld implements World, BeanNameAware { throw new UnsupportedOperationException(); } - @Deprecated - public void setLayersBlock(List listOfLayers) { - if (chunkProvider == null) { - FlatChunkProvider chunkProvider = new FlatChunkProvider(); - chunkProvider.setLayersBlock(listOfLayers); - this.chunkProvider = chunkProvider; - } else if (this.chunkProvider instanceof FlatChunkProvider) { - ((FlatChunkProvider)chunkProvider).setLayersBlock(listOfLayers); - } - } - @Override public void setBeanName(@Nonnull String name) { this.name = name; diff --git a/simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java b/simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java new file mode 100644 index 0000000..4804190 --- /dev/null +++ b/simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java @@ -0,0 +1,44 @@ +package mc.world.simple; + +import com.google.common.collect.Lists; +import mc.core.world.block.Block; +import mc.core.world.block.BlockType; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class SimpleChunkSectionTest { + private SimpleChunkSection chunkSection; + private List layersBlock; + + @BeforeEach + void before() { + layersBlock = Lists.newArrayList( + BlockType.BEDROCK, + BlockType.DIRT, + BlockType.DIRT, + BlockType.GRASS + ); + + chunkSection = new SimpleChunkSection(layersBlock); + } + + @Test + void getBlock() { + for (int y = 15; y >= 0; y--) { + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + Block block = chunkSection.getBlock(x, y, z); + if (y > layersBlock.size()-1) { + assertEquals(block.getBlockType(), BlockType.AIR); + } else { + assertEquals(block.getBlockType(), layersBlock.get(y)); + } + } + } + } + } +} \ No newline at end of file diff --git a/simple_world/src/test/java/mc/world/simple/SimpleWorldTest.java b/simple_world/src/test/java/mc/world/simple/SimpleWorldTest.java new file mode 100644 index 0000000..110a830 --- /dev/null +++ b/simple_world/src/test/java/mc/world/simple/SimpleWorldTest.java @@ -0,0 +1,37 @@ +package mc.world.simple; + +import mc.core.EntityLocation; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = {TestSpringConfig.class}) +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +class SimpleWorldTest { + @Autowired + private SimpleWorld world; + + @Test + void spawn() { + final EntityLocation location = new EntityLocation(1d, 2d, 3d,4f, 5f); + + world.setSpawn(location); + assertEquals(location, world.getSpawn()); + assertSame(location, world.getSpawn()); + + world.setSpawn(1d, 2d, 3d, 4f, 5f); + assertEquals(location, world.getSpawn()); + assertNotSame(location, world.getSpawn()); + + location.setYawPitch(0, 0); + world.setSpawn(1d, 2d, 3d); + assertEquals(location, world.getSpawn()); + assertNotSame(location, world.getSpawn()); + } +} \ No newline at end of file diff --git a/simple_world/src/test/java/mc/world/simple/TestSpringConfig.java b/simple_world/src/test/java/mc/world/simple/TestSpringConfig.java new file mode 100644 index 0000000..865fdd9 --- /dev/null +++ b/simple_world/src/test/java/mc/world/simple/TestSpringConfig.java @@ -0,0 +1,38 @@ +package mc.world.simple; + +import com.google.common.collect.Lists; +import mc.core.world.block.BlockType; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Configuration +@ComponentScan("mc.world.simple") +public class TestSpringConfig { + @Bean + public List layersBlock() { + return Lists.newArrayList( + BlockType.BEDROCK, + BlockType.DIRT, + BlockType.DIRT, + BlockType.GRASS + ); + } + + @Bean + public SimpleChunkSection chunkSection(List layersBlock) { + return new SimpleChunkSection(layersBlock); + } + + @Bean + public SimpleWorld simpleWorld(List layersBlock) { + FlatChunkProvider chunkProvider = new FlatChunkProvider(); + chunkProvider.setLayersBlock(layersBlock); + + SimpleWorld world = new SimpleWorld(); + world.setChunkProvider(chunkProvider); + return world; + } +} From 78b5be88e7ee64234fd6bb6c11724bb475bbaded Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 10 Oct 2018 22:28:11 +0300 Subject: [PATCH 71/71] =?UTF-8?q?fix:=20=D0=BD=D0=B5=20=D0=B7=D0=B0=D0=B3?= =?UTF-8?q?=D1=80=D1=83=D0=B6=D0=B0=D0=BB=D1=81=D1=8F=20=D1=87=D0=B0=D0=BD?= =?UTF-8?q?=D0=BA=20[0;0]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit если игрок находился не в этом чанке, то при заходе в игру чанк не загружался --- .../proto_1_12_2/netty/handlers/LoginHandler.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java index d0c0d95..0f8332c 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java @@ -91,18 +91,6 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand channel.flush(); - // First Chunk - //TODO необходимо отправлять больше начальных чанков - ChunkDataPacket pkt8 = new ChunkDataPacket(); - Chunk chunk = player.getWorld().getChunk(player.getLocation()); - pkt8.setX(chunk.getX()); - pkt8.setZ(chunk.getZ()); - pkt8.setChunk(chunk); - pkt8.setInitChunk(true); - channel.writeAndFlush(pkt8); - - player.getLoadedChunks().add(CompactedCoords.compressXZ(0, 0)); - // Player Position And Look PlayerPositionAndLookPacket pkt4 = new PlayerPositionAndLookPacket(); pkt4.setLocation(player.getLocation());