Archived
0

Merge branch 'proto_1.12.2' into h2-playermanager

# Conflicts:
#	core/src/main/java/mc/core/EntityLocation.java
#	core/src/main/java/mc/core/Location.java
#	core/src/test/java/mc/core/TestEntityLocation.java
#	core/src/test/java/mc/core/TestLocation.java
This commit is contained in:
2018-09-08 17:18:20 +03:00
43 changed files with 703 additions and 470 deletions

View File

@@ -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());

View File

@@ -1,23 +1,29 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 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;
import java.util.Objects;
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) {
@@ -25,27 +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();
}
@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);
try {
return (EntityLocation) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
}

View File

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

View File

@@ -1,108 +0,0 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 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;
import java.util.Objects;
public class Location implements Cloneable {
@Getter
@Setter
private double x, y, z;
private Reference<World> 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;
}
}
@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());
}
}

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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<Player> getPlayer(String name);

View File

@@ -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<World> $refWorld;
private boolean flying = false;
private PlayerSettings settings;
private List<Integer> 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;
}

View File

@@ -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?
};
}
}

View File

@@ -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 {
@@ -16,4 +17,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);
}
}

View File

@@ -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

View File

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

View File

@@ -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));
}
}
}

View File

@@ -0,0 +1,30 @@
package mc.core.world.block;
import lombok.*;
@NoArgsConstructor
@AllArgsConstructor
@Data
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;
this.z = z;
}
@Override
public BlockLocation clone() {
try {
return (BlockLocation) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
}