Merge branch 'proto_1.12.2' into event
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -15,3 +15,4 @@ gradlew.*
|
|||||||
|
|
||||||
## PROJECT ##
|
## PROJECT ##
|
||||||
libs/
|
libs/
|
||||||
|
*.log
|
||||||
|
|||||||
56
build.gradle
56
build.gradle
@@ -1,3 +1,25 @@
|
|||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
maven { url "https://plugins.gradle.org/m2/" }
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
classpath (group: 'org.sonarsource.scanner.gradle', name: 'sonarqube-gradle-plugin', version: '2.6.2')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Проверка кода в SonarQube.
|
||||||
|
* Для запуска локальной проверки кода, используются следующий command line:
|
||||||
|
* gradle sonarqube \
|
||||||
|
* -Dsonar.host.url=http://127.0.0.1:9000
|
||||||
|
* -Dsonar.login=<TOKEN>
|
||||||
|
* где
|
||||||
|
* - <TOKEN> - сгенерированный токен учетки "сонара"
|
||||||
|
*/
|
||||||
|
plugins {
|
||||||
|
id "org.sonarqube" version "2.6.2"
|
||||||
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
|
|
||||||
@@ -9,9 +31,7 @@ allprojects {
|
|||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
maven {
|
maven { url 'https://oss.sonatype.org/content/groups/public/' }
|
||||||
url 'https://oss.sonatype.org/content/groups/public/'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,6 +61,8 @@ subprojects {
|
|||||||
/* Lombok */
|
/* Lombok */
|
||||||
annotationProcessor (group: 'org.projectlombok', name: 'lombok', version: lombok_version)
|
annotationProcessor (group: 'org.projectlombok', name: 'lombok', version: lombok_version)
|
||||||
compileOnly (group: 'org.projectlombok', name: 'lombok', version: lombok_version)
|
compileOnly (group: 'org.projectlombok', name: 'lombok', version: lombok_version)
|
||||||
|
testAnnotationProcessor (group: 'org.projectlombok', name: 'lombok', version: lombok_version)
|
||||||
|
testCompileOnly (group: 'org.projectlombok', name: 'lombok', version: lombok_version)
|
||||||
|
|
||||||
/* Testing */
|
/* Testing */
|
||||||
testImplementation (group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: junit_version)
|
testImplementation (group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: junit_version)
|
||||||
@@ -64,22 +86,32 @@ subprojects {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
task runApp(type: JavaExec) {
|
/**
|
||||||
|
* Запуск сервера.
|
||||||
|
* Для указания рабочей папки, указываем JVM параметр
|
||||||
|
* -DworkDir=path\to\workdir
|
||||||
|
* Если используется отдельная папка для имплементации логгера, то указываем
|
||||||
|
* -DlogImplDir=path\to\logimpldir
|
||||||
|
* Если необходимо передать дополнительные JVM параметры серверу, то указываем их с двойной "D", например:
|
||||||
|
* -DDspringConfig=spring.xml
|
||||||
|
* -DDlog4j.configurationFile=log4j2.xml
|
||||||
|
*/
|
||||||
|
task runServer(type: JavaExec) {
|
||||||
main = 'mc.core.Main'
|
main = 'mc.core.Main'
|
||||||
|
|
||||||
workingDir = (project.hasProperty("workDir") ? project.workDir : '.')
|
workingDir = System.getProperty("workDir", ".")
|
||||||
|
|
||||||
subprojects.findAll().each{ prj ->
|
subprojects.findAll().each{ prj ->
|
||||||
classpath += prj.sourceSets.main.runtimeClasspath
|
classpath += prj.sourceSets.main.runtimeClasspath
|
||||||
}
|
}
|
||||||
/* Uncomment, if your Log Implements are folder '{workDir}/log-impl' */
|
|
||||||
//classpath += files(fileTree(dir: new File(workingDir, "log-impl")))
|
|
||||||
|
|
||||||
/* Uncomment, if you used VM args */
|
if (System.getProperty("logImplDir") != null) {
|
||||||
//jvmArgs = [
|
classpath += files(fileTree(dir: new File(System.getProperty("logImplDir"))))
|
||||||
// "-DspringConfig=spring.xml",
|
}
|
||||||
// "-Dlog4j.configurationFile=log4j2.xml"
|
|
||||||
//]
|
System.getProperties().stringPropertyNames().stream()
|
||||||
|
.filter{propName -> propName.startsWith("D")}
|
||||||
|
.forEach{propName -> jvmArgs += "-D" + propName.substring(1) + "=" + System.getProperty(propName)}
|
||||||
|
|
||||||
ignoreExitValue = true
|
ignoreExitValue = true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,10 +24,10 @@ public class CoreEventListener {
|
|||||||
log.trace("(GameLoop) playerMoveEventHandler()");
|
log.trace("(GameLoop) playerMoveEventHandler()");
|
||||||
|
|
||||||
Chunk chunk;
|
Chunk chunk;
|
||||||
chunk = event.getPlayer().getWorld().getChunk(event.getOldLocation()); // Old chunk
|
chunk = event.getPlayer().getWorld().getChunk(event.getOldLocation().toBlockLocation()); // Old chunk
|
||||||
int ccX = chunk.getX();
|
int ccX = chunk.getX();
|
||||||
int ccZ = chunk.getZ();
|
int ccZ = chunk.getZ();
|
||||||
chunk = event.getPlayer().getWorld().getChunk(event.getNewLocation()); // Next chunk
|
chunk = event.getPlayer().getWorld().getChunk(event.getNewLocation().toBlockLocation()); // Next chunk
|
||||||
int ncX = chunk.getX();
|
int ncX = chunk.getX();
|
||||||
int ncZ = chunk.getZ();
|
int ncZ = chunk.getZ();
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package mc.core;
|
|||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
import mc.core.world.block.BlockLocation;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
|
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@@ -32,15 +34,19 @@ public class EntityLocation implements Cloneable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int getBlockX() {
|
public int getBlockX() {
|
||||||
return Double.valueOf(Math.floor(x)).intValue();
|
return (int) Math.floor(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getBlockY() {
|
public int getBlockY() {
|
||||||
return Double.valueOf(Math.floor(y)).intValue();
|
return (int) Math.floor(y);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getBlockZ() {
|
public int getBlockZ() {
|
||||||
return Double.valueOf(Math.floor(z)).intValue();
|
return (int) Math.floor(z);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BlockLocation toBlockLocation() {
|
||||||
|
return new BlockLocation(getBlockX(), getBlockY(), getBlockZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -49,7 +55,7 @@ public class EntityLocation implements Cloneable {
|
|||||||
return (EntityLocation) super.clone();
|
return (EntityLocation) super.clone();
|
||||||
} catch (CloneNotSupportedException e) {
|
} catch (CloneNotSupportedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return null;
|
return ZERO();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
package mc.core.nbt;
|
|
||||||
|
|
||||||
import com.flowpowered.nbt.Tag;
|
|
||||||
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
public interface Taggable {
|
|
||||||
Tag<?> getTag(String name);
|
|
||||||
void setTag(Tag<?> tag);
|
|
||||||
Stream<Tag<?>> tagStream();
|
|
||||||
}
|
|
||||||
@@ -1,22 +1,23 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-07-25
|
|
||||||
*/
|
|
||||||
package mc.core.network;
|
package mc.core.network;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public abstract class NetInputStream {
|
public abstract class NetInputStream extends InputStream {
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
private int dataSize;
|
private int dataSize;
|
||||||
|
|
||||||
public abstract boolean readBoolean();
|
public abstract boolean readBoolean();
|
||||||
public abstract byte readByte();
|
public abstract byte readByte();
|
||||||
public abstract void readBytes(byte[] buffer);
|
public int readBytes(byte[] buffer) {
|
||||||
|
return readBytes(buffer, 0, buffer.length);
|
||||||
|
}
|
||||||
|
public abstract int readBytes(byte[] buffer, int offset, int length);
|
||||||
public abstract int readUnsignedByte();
|
public abstract int readUnsignedByte();
|
||||||
public abstract int readUnsignedShort();
|
public abstract int readUnsignedShort();
|
||||||
public abstract short readShort();
|
public abstract short readShort();
|
||||||
@@ -30,4 +31,25 @@ public abstract class NetInputStream {
|
|||||||
public abstract UUID readUUID();
|
public abstract UUID readUUID();
|
||||||
|
|
||||||
public abstract void skipBytes(int count);
|
public abstract void skipBytes(int count);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read() throws IOException {
|
||||||
|
return readByte();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read(byte[] b) throws IOException {
|
||||||
|
return readBytes(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read(byte[] b, int off, int len) throws IOException {
|
||||||
|
return readBytes(b, off, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long skip(long n) throws IOException {
|
||||||
|
skipBytes((int) n);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,17 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-07-25
|
|
||||||
*/
|
|
||||||
package mc.core.network;
|
package mc.core.network;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public abstract class NetOutputStream {
|
public abstract class NetOutputStream extends OutputStream {
|
||||||
public abstract void writeBoolean(boolean value);
|
public abstract void writeBoolean(boolean value);
|
||||||
public abstract void writeByte(int value);
|
public abstract void writeByte(int value);
|
||||||
public abstract void writeUnsignedByte(int value);
|
public abstract void writeUnsignedByte(int value);
|
||||||
public abstract void writeBytes(byte[] buffer);
|
public void writeBytes(byte[] buffer) {
|
||||||
|
writeBytes(buffer, 0, buffer.length);
|
||||||
|
}
|
||||||
|
public abstract void writeBytes(byte[] buffer, int offset, int lengtn);
|
||||||
public abstract void writeShort(int value);
|
public abstract void writeShort(int value);
|
||||||
public abstract void writeInt(int value);
|
public abstract void writeInt(int value);
|
||||||
public abstract void writeVarInt(int value);
|
public abstract void writeVarInt(int value);
|
||||||
@@ -19,4 +20,19 @@ public abstract class NetOutputStream {
|
|||||||
public abstract void writeDouble(double value);
|
public abstract void writeDouble(double value);
|
||||||
public abstract void writeString(String value);
|
public abstract void writeString(String value);
|
||||||
public abstract void writeUUID(UUID uuid);
|
public abstract void writeUUID(UUID uuid);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(int b) throws IOException {
|
||||||
|
writeByte(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(byte[] b) throws IOException {
|
||||||
|
writeBytes(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(byte[] b, int off, int len) throws IOException {
|
||||||
|
writeBytes(b, off, len);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,34 +1,57 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-04-15
|
|
||||||
*/
|
|
||||||
package mc.core.world;
|
package mc.core.world;
|
||||||
|
|
||||||
import mc.core.EntityLocation;
|
import mc.core.EntityLocation;
|
||||||
|
import mc.core.world.block.Block;
|
||||||
import mc.core.world.block.BlockLocation;
|
import mc.core.world.block.BlockLocation;
|
||||||
import mc.core.world.chunk.Chunk;
|
import mc.core.world.chunk.Chunk;
|
||||||
|
|
||||||
public interface World {
|
public interface World {
|
||||||
String getName();
|
String getName();
|
||||||
WorldType getWorldType();
|
WorldType getType();
|
||||||
|
|
||||||
EntityLocation getSpawn();
|
EntityLocation getSpawn();
|
||||||
|
|
||||||
void setSpawn(EntityLocation location);
|
void setSpawn(EntityLocation location);
|
||||||
|
|
||||||
default void setSpawn(double x, double y, double z, float yaw, float pitch) {
|
default void setSpawn(double x, double y, double z, float yaw, float pitch) {
|
||||||
setSpawn(new EntityLocation(x, y, z, yaw, pitch));
|
setSpawn(new EntityLocation(x, y, z, yaw, pitch));
|
||||||
}
|
}
|
||||||
|
|
||||||
default void setSpawn(double x, double y, double z) {
|
default void setSpawn(double x, double y, double z) {
|
||||||
setSpawn(x, y, z, 0f, 0f);
|
setSpawn(x, y, z, 0f, 0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получить чанк по его координатам
|
||||||
|
* @param x chunk X
|
||||||
|
* @param z chunk Z
|
||||||
|
* @return {@link Chunk}
|
||||||
|
*/
|
||||||
Chunk getChunk(int x, int z);
|
Chunk getChunk(int x, int z);
|
||||||
void setChunk(int x, int z, Chunk chunkSection);
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получить чанк по глобальным координатам блока
|
||||||
|
* @param location {@link BlockLocation}
|
||||||
|
* @return {@link Chunk}
|
||||||
|
*/
|
||||||
default Chunk getChunk(BlockLocation location) {
|
default Chunk getChunk(BlockLocation location) {
|
||||||
return getChunk(location.getX() >> 4, location.getZ() >> 4);
|
return getChunk(location.getX() >> 4, location.getZ() >> 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
default Chunk getChunk(EntityLocation location) {
|
void setChunk(int x, int z, Chunk chunk);
|
||||||
return getChunk(location.getBlockX() >> 4, location.getBlockZ() >> 4);
|
|
||||||
|
/**
|
||||||
|
* Получить блок по его координатам
|
||||||
|
* @param x X
|
||||||
|
* @param y Y
|
||||||
|
* @param z Z
|
||||||
|
* @return {@link Block}
|
||||||
|
*/
|
||||||
|
Block getBlock(int x, int y, int z);
|
||||||
|
|
||||||
|
default Block getBlock(BlockLocation location) {
|
||||||
|
return getBlock(location.getX(), location.getY(), location.getZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setBlock(Block block);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,8 @@
|
|||||||
package mc.core.world.block;
|
package mc.core.world.block;
|
||||||
|
|
||||||
import com.flowpowered.nbt.Tag;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
public abstract class AbstractBlock implements Block {
|
public abstract class AbstractBlock implements Block {
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@@ -15,11 +10,10 @@ public abstract class AbstractBlock implements Block {
|
|||||||
@Getter
|
@Getter
|
||||||
private int light = 0;
|
private int light = 0;
|
||||||
@Getter
|
@Getter
|
||||||
private final BlockType blockType;
|
private final BlockType type;
|
||||||
private final Map<String, Tag<?>> nbtTagsMap = new HashMap<>();
|
|
||||||
|
|
||||||
protected AbstractBlock(BlockType type) {
|
protected AbstractBlock(BlockType type) {
|
||||||
this.blockType = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -28,19 +22,4 @@ public abstract class AbstractBlock implements Block {
|
|||||||
else if (light < 0) this.light = 0;
|
else if (light < 0) this.light = 0;
|
||||||
else this.light = light;
|
else this.light = light;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Tag<?> getTag(String name) {
|
|
||||||
return nbtTagsMap.get(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setTag(Tag<?> tag) {
|
|
||||||
nbtTagsMap.put(tag.getName(), tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Stream<Tag<?>> tagStream() {
|
|
||||||
return nbtTagsMap.values().stream();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
package mc.core.world.block;
|
package mc.core.world.block;
|
||||||
|
|
||||||
import mc.core.nbt.Taggable;
|
public interface Block {
|
||||||
|
|
||||||
public interface Block extends Taggable{
|
|
||||||
int getLight();
|
int getLight();
|
||||||
void setLight(int light);
|
void setLight(int light);
|
||||||
BlockType getBlockType();
|
BlockType getType();
|
||||||
BlockLocation getLocation();
|
BlockLocation getLocation();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ public class BlockLocation implements Cloneable {
|
|||||||
return (BlockLocation) super.clone();
|
return (BlockLocation) super.clone();
|
||||||
} catch (CloneNotSupportedException e) {
|
} catch (CloneNotSupportedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return null;
|
return ZERO();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package mc.core.world.chunk;
|
package mc.core.world.chunk;
|
||||||
|
|
||||||
import mc.core.world.Biome;
|
import mc.core.world.Biome;
|
||||||
|
import mc.core.world.block.Block;
|
||||||
|
|
||||||
public interface Chunk {
|
public interface Chunk {
|
||||||
int getX();
|
int getX();
|
||||||
@@ -9,6 +10,28 @@ public interface Chunk {
|
|||||||
ChunkSection getChunkSection(int height);
|
ChunkSection getChunkSection(int height);
|
||||||
void setChunkSection(int height, ChunkSection chunkSection);
|
void setChunkSection(int height, ChunkSection chunkSection);
|
||||||
|
|
||||||
Biome getBiome(int localX, int localZ);
|
/**
|
||||||
void setBiome(int localX, int localZ, Biome biome);
|
* Получить блок по глобальным координатам секции чанка
|
||||||
|
* @param x global X
|
||||||
|
* @param y global Y
|
||||||
|
* @param z global Z
|
||||||
|
* @return {@link Block}
|
||||||
|
*/
|
||||||
|
Block getBlock(int x, int y, int z);
|
||||||
|
void setBlock(Block block);
|
||||||
|
|
||||||
|
int getSkyLight(int x, int y, int z);
|
||||||
|
void setSkyLight(int x, int y, int z, int lightLevel);
|
||||||
|
|
||||||
|
int getAddition(int x, int y, int z);
|
||||||
|
void setAddition(int x, int y, int z, int value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получить тип биома по глобальным координатам
|
||||||
|
* @param x global X
|
||||||
|
* @param z global Z
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Biome getBiome(int x, int z);
|
||||||
|
void setBiome(int x, int z, Biome biome);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,29 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-04-15
|
|
||||||
*/
|
|
||||||
package mc.core.world.chunk;
|
package mc.core.world.chunk;
|
||||||
|
|
||||||
import mc.core.world.Biome;
|
|
||||||
import mc.core.world.block.Block;
|
import mc.core.world.block.Block;
|
||||||
|
|
||||||
/* 16x16x16 */
|
/**
|
||||||
|
* Секция чанка размером 16x16x16 блоков
|
||||||
|
*/
|
||||||
public interface ChunkSection {
|
public interface ChunkSection {
|
||||||
int getX();
|
Chunk getParent();
|
||||||
|
void setParent(Chunk chunk);
|
||||||
|
|
||||||
int getY();
|
int getY();
|
||||||
int getZ();
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получить блок по локальным координатам секции чанка
|
||||||
|
* @param localX local X (0-15)
|
||||||
|
* @param localY local Y (0-15)
|
||||||
|
* @param localZ local Z (0-15)
|
||||||
|
* @return {@link Block}
|
||||||
|
*/
|
||||||
|
Block getBlock(int localX, int localY, int localZ);
|
||||||
void setBlock(Block block);
|
void setBlock(Block block);
|
||||||
Block getBlock(int x, int y, int z);
|
|
||||||
|
|
||||||
int getSkyLight(int x, int y, int z);
|
int getSkyLight(int localX, int localY, int localZ);
|
||||||
void setSkyLight(int x, int y, int z, int lightLevel);
|
void setSkyLight(int localX, int localY, int localZ, int lightLevel);
|
||||||
|
|
||||||
int getAddition(int x, int y, int z);
|
int getAddition(int localX, int localY, int localZ);
|
||||||
void setAddition(int x, int y, int z, int value);
|
void setAddition(int localX, int localY, int localZ, int value);
|
||||||
|
|
||||||
Biome getBiome(int localX, int localZ);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-06-10
|
|
||||||
*/
|
|
||||||
package mc.core.network.proto_1_12_2;
|
package mc.core.network.proto_1_12_2;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
@@ -25,34 +21,34 @@ public class ByteArrayOutputNetStream extends NetOutputStream_p340 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeBytes(byte[] buffer) {
|
public void writeBytes(byte[] buffer, int offset, int lengtn) {
|
||||||
baos.write(buffer, 0, buffer.length);
|
baos.write(buffer, offset, lengtn);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeShort(int value) {
|
public void writeShort(int value) {
|
||||||
baos.write((byte) value >>> 8);
|
baos.write((byte) (value >>> 8));
|
||||||
baos.write((byte) value);
|
baos.write((byte) value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeInt(int value) {
|
public void writeInt(int value) {
|
||||||
baos.write((byte)((int)(value >>> 24)));
|
baos.write((value >>> 24) & 0xFF);
|
||||||
baos.write((byte)((int)(value >>> 16)));
|
baos.write((value >>> 16) & 0xFF);
|
||||||
baos.write((byte)((int)(value >>> 8)));
|
baos.write((value >>> 8) & 0xFF);
|
||||||
baos.write((byte)((int)(value)));
|
baos.write(value & 0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeLong(long value) {
|
public void writeLong(long value) {
|
||||||
baos.write((byte)((int)(value >>> 56)));
|
baos.write((int) ((value >>> 56) & 0xFF));
|
||||||
baos.write((byte)((int)(value >>> 48)));
|
baos.write((int) ((value >>> 48) & 0xFF));
|
||||||
baos.write((byte)((int)(value >>> 40)));
|
baos.write((int) ((value >>> 40) & 0xFF));
|
||||||
baos.write((byte)((int)(value >>> 32)));
|
baos.write((int) ((value >>> 32) & 0xFF));
|
||||||
baos.write((byte)((int)(value >>> 24)));
|
baos.write((int) ((value >>> 24) & 0xFF));
|
||||||
baos.write((byte)((int)(value >>> 16)));
|
baos.write((int) ((value >>> 16) & 0xFF));
|
||||||
baos.write((byte)((int)(value >>> 8)));
|
baos.write((int) ((value >>> 8) & 0xFF));
|
||||||
baos.write((byte)((int)(value)));
|
baos.write((int) (value & 0xFF));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-06-11
|
|
||||||
*/
|
|
||||||
package mc.core.network.proto_1_12_2;
|
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
|
|
||||||
import java.security.KeyPair;
|
|
||||||
import java.security.KeyPairGenerator;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
public class Crypter {
|
|
||||||
private static final Crypter instance = new Crypter();
|
|
||||||
private KeyPair keyPair;
|
|
||||||
private byte[] verifyToken;
|
|
||||||
|
|
||||||
public static KeyPair getKeyPair() {
|
|
||||||
if (instance.keyPair == null) {
|
|
||||||
try {
|
|
||||||
KeyPairGenerator keypairgenerator = KeyPairGenerator.getInstance("RSA");
|
|
||||||
keypairgenerator.initialize(1024);
|
|
||||||
instance.keyPair = keypairgenerator.generateKeyPair();
|
|
||||||
} catch (NoSuchAlgorithmException e) {
|
|
||||||
log.error("WTF?! Algorithm \"RSA\" not defined?!", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return instance.keyPair;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static byte[] getVerifyToken() {
|
|
||||||
if (instance.verifyToken == null) {
|
|
||||||
instance.verifyToken = new byte[4];
|
|
||||||
Random rand = new Random();
|
|
||||||
rand.nextBytes(instance.verifyToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
return instance.verifyToken;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,3 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-07-25
|
|
||||||
*/
|
|
||||||
package mc.core.network.proto_1_12_2;
|
package mc.core.network.proto_1_12_2;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -22,8 +18,6 @@ public abstract class NetOutputStream_p340 extends NetOutputStream {
|
|||||||
writeByte(value);
|
writeByte(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeString(String value) {
|
public void writeString(String value) {
|
||||||
if (value.length() > Short.MAX_VALUE) {
|
if (value.length() > Short.MAX_VALUE) {
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ public class ChunkDataPacket implements SCPacket {
|
|||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
for (int x = 0; x < 16; x++) {
|
for (int x = 0; x < 16; x++) {
|
||||||
Block block = chunkSection.getBlock(x, y, z);
|
Block block = chunkSection.getBlock(x, y, z);
|
||||||
int blockState = serializeBlockState(block.getBlockType());
|
int blockState = serializeBlockState(block.getType());
|
||||||
|
|
||||||
int currentIndexPaletteBlock;
|
int currentIndexPaletteBlock;
|
||||||
if (!palette.contains(blockState)) {
|
if (!palette.contains(blockState)) {
|
||||||
@@ -207,7 +207,7 @@ public class ChunkDataPacket implements SCPacket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!biomeFinally) {
|
if (!biomeFinally) {
|
||||||
biomes.writeByte(chunkSection.getBiome(x, z).getId());
|
biomes.writeByte(chunk.getBiome(x, z).getId());
|
||||||
if (x == 15 && z == 15) {
|
if (x == 15 && z == 15) {
|
||||||
biomeFinally = true;
|
biomeFinally = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-06-11
|
|
||||||
*/
|
|
||||||
package mc.core.network.proto_1_12_2.packets;
|
package mc.core.network.proto_1_12_2.packets;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
@@ -19,15 +15,10 @@ import mc.core.network.SCPacket;
|
|||||||
public class SpawnPositionPacket implements SCPacket {
|
public class SpawnPositionPacket implements SCPacket {
|
||||||
private EntityLocation location;
|
private EntityLocation location;
|
||||||
|
|
||||||
private int floor_double(double value) {
|
|
||||||
int i = (int)value;
|
|
||||||
return value < (double)i ? i - 1 : i;
|
|
||||||
}
|
|
||||||
|
|
||||||
private long location2long(EntityLocation entityLocation) {
|
private long location2long(EntityLocation entityLocation) {
|
||||||
return ((floor_double(entityLocation.getX()) & 0x3FFFFFF) << 38)
|
return (((long) entityLocation.getBlockX() & 0x3FFFFFF) << 38)
|
||||||
| ((floor_double(entityLocation.getY()) & 0xFFF) << 26)
|
| (((long) entityLocation.getBlockY() & 0x0000FFF) << 26)
|
||||||
| (floor_double(entityLocation.getZ()) & 0x3FFFFFF);
|
| ((long) entityLocation.getBlockZ() & 0x3FFFFFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
package mc.core.network.proto_1_12_2.packets;
|
package mc.core.network.proto_1_12_2;
|
||||||
|
|
||||||
import mc.core.network.proto_1_12_2.NetInputStream_p340;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
public class ByteArrayInputNetStream extends NetInputStream_p340 {
|
public class ByteArrayInputNetStream extends NetInputStream_p340 {
|
||||||
private ByteArrayInputStream bais;
|
private ByteArrayInputStream bais;
|
||||||
|
|
||||||
@@ -13,7 +15,7 @@ public class ByteArrayInputNetStream extends NetInputStream_p340 {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean readBoolean() {
|
public boolean readBoolean() {
|
||||||
return false;
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -22,22 +24,32 @@ public class ByteArrayInputNetStream extends NetInputStream_p340 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void readBytes(byte[] buffer) {
|
public int readBytes(byte[] buffer, int offset, int length) {
|
||||||
|
try {
|
||||||
|
int read = bais.read(buffer, offset, length);
|
||||||
|
if (read < length) {
|
||||||
|
throw new IOException("not enough data");
|
||||||
|
}
|
||||||
|
return read;
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("", e);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int readUnsignedByte() {
|
public int readUnsignedByte() {
|
||||||
return 0;
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int readUnsignedShort() {
|
public int readUnsignedShort() {
|
||||||
return 0;
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public short readShort() {
|
public short readShort() {
|
||||||
return 0;
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -47,12 +59,12 @@ public class ByteArrayInputNetStream extends NetInputStream_p340 {
|
|||||||
int ch3 = bais.read();
|
int ch3 = bais.read();
|
||||||
int ch4 = bais.read();
|
int ch4 = bais.read();
|
||||||
if ((ch1 | ch2 | ch3 | ch4) < 0) return 0;
|
if ((ch1 | ch2 | ch3 | ch4) < 0) return 0;
|
||||||
return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
|
return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long readLong() {
|
public long readLong() {
|
||||||
return 0;
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -62,11 +74,11 @@ public class ByteArrayInputNetStream extends NetInputStream_p340 {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double readDouble() {
|
public double readDouble() {
|
||||||
return 0;
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void skipBytes(int count) {
|
public void skipBytes(int count) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
package mc.core.network.proto_1_12_2;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
class ByteArrayInputNetStreamTest {
|
||||||
|
private Random random;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void before() {
|
||||||
|
random = new Random(System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testReadByte() throws IOException {
|
||||||
|
final byte[] bytes = new byte[1];
|
||||||
|
random.nextBytes(bytes);
|
||||||
|
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeByte(bytes[0]);
|
||||||
|
|
||||||
|
ByteArrayInputNetStream byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray());
|
||||||
|
|
||||||
|
assertEquals(bytes[0], byteArrayInputNetStream.readByte());
|
||||||
|
|
||||||
|
byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray());
|
||||||
|
|
||||||
|
assertEquals(bytes[0], byteArrayInputNetStream.read());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testReadBytes() throws IOException {
|
||||||
|
final byte[] expectedBytes = new byte[10];
|
||||||
|
random.nextBytes(expectedBytes);
|
||||||
|
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeBytes(expectedBytes);
|
||||||
|
|
||||||
|
ByteArrayInputNetStream byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray());
|
||||||
|
byte[] actualBytes = new byte[10];
|
||||||
|
byteArrayInputNetStream.readBytes(actualBytes);
|
||||||
|
|
||||||
|
assertArrayEquals(expectedBytes, actualBytes);
|
||||||
|
|
||||||
|
byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray());
|
||||||
|
actualBytes = new byte[10];
|
||||||
|
int r = byteArrayInputNetStream.read(actualBytes);
|
||||||
|
|
||||||
|
assertArrayEquals(expectedBytes, actualBytes);
|
||||||
|
assertEquals(expectedBytes.length, r);
|
||||||
|
|
||||||
|
byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray());
|
||||||
|
actualBytes = new byte[10];
|
||||||
|
byteArrayInputNetStream.readBytes(actualBytes, 2, 5);
|
||||||
|
byte[] nibbleExpectedBytes = new byte[10];
|
||||||
|
System.arraycopy(expectedBytes, 0, nibbleExpectedBytes, 2, 5);
|
||||||
|
|
||||||
|
assertArrayEquals(nibbleExpectedBytes, actualBytes);
|
||||||
|
|
||||||
|
byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray());
|
||||||
|
actualBytes = new byte[10];
|
||||||
|
r = byteArrayInputNetStream.read(actualBytes, 2, 5);
|
||||||
|
nibbleExpectedBytes = new byte[10];
|
||||||
|
System.arraycopy(expectedBytes, 0, nibbleExpectedBytes, 2, 5);
|
||||||
|
|
||||||
|
assertArrayEquals(nibbleExpectedBytes, actualBytes);
|
||||||
|
assertEquals(5, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testReadInt() {
|
||||||
|
final int integerDig = random.nextInt();
|
||||||
|
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeInt(integerDig);
|
||||||
|
|
||||||
|
ByteArrayInputNetStream byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray());
|
||||||
|
|
||||||
|
assertEquals(integerDig, byteArrayInputNetStream.readInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void readFloat() {
|
||||||
|
final float floatDig = random.nextFloat();
|
||||||
|
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeFloat(floatDig);
|
||||||
|
|
||||||
|
ByteArrayInputNetStream byteArrayInputNetStream = new ByteArrayInputNetStream(byteArrayOutputNetStream.toByteArray());
|
||||||
|
|
||||||
|
assertEquals(floatDig, byteArrayInputNetStream.readFloat());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,259 @@
|
|||||||
|
package mc.core.network.proto_1_12_2;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
|
||||||
|
|
||||||
|
class ByteArrayOutputNetStreamTest {
|
||||||
|
private Random random;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void before() {
|
||||||
|
random = new Random(System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWriteBoolean() {
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeBoolean(true);
|
||||||
|
|
||||||
|
assertArrayEquals(new byte[]{0x01}, byteArrayOutputNetStream.toByteArray());
|
||||||
|
|
||||||
|
byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeBoolean(false);
|
||||||
|
|
||||||
|
assertArrayEquals(new byte[]{0x00}, byteArrayOutputNetStream.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWriteByte() throws IOException {
|
||||||
|
final byte[] bytes = new byte[1];
|
||||||
|
random.nextBytes(bytes);
|
||||||
|
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeByte(bytes[0]);
|
||||||
|
|
||||||
|
assertArrayEquals(bytes, byteArrayOutputNetStream.toByteArray());
|
||||||
|
|
||||||
|
byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.write(bytes[0]);
|
||||||
|
|
||||||
|
assertArrayEquals(bytes, byteArrayOutputNetStream.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWriteUnsignedByte() {
|
||||||
|
final byte[] bytes = new byte[1];
|
||||||
|
random.nextBytes(bytes);
|
||||||
|
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeUnsignedByte(bytes[0]);
|
||||||
|
|
||||||
|
assertArrayEquals(bytes, byteArrayOutputNetStream.toByteArray());
|
||||||
|
|
||||||
|
byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeUnsignedByte(0xFF);
|
||||||
|
|
||||||
|
assertArrayEquals(new byte[]{(byte) 0xFF}, byteArrayOutputNetStream.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWriteBytes() throws IOException {
|
||||||
|
final byte[] expectedBytes = new byte[10];
|
||||||
|
random.nextBytes(expectedBytes);
|
||||||
|
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeBytes(expectedBytes);
|
||||||
|
|
||||||
|
assertArrayEquals(expectedBytes, byteArrayOutputNetStream.toByteArray());
|
||||||
|
|
||||||
|
byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.write(expectedBytes);
|
||||||
|
|
||||||
|
assertArrayEquals(expectedBytes, byteArrayOutputNetStream.toByteArray());
|
||||||
|
|
||||||
|
byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeBytes(expectedBytes, 2, 5);
|
||||||
|
byte[] nibbleExpectedBytes = new byte[5];
|
||||||
|
System.arraycopy(expectedBytes, 2, nibbleExpectedBytes, 0, 5);
|
||||||
|
|
||||||
|
assertArrayEquals(nibbleExpectedBytes, byteArrayOutputNetStream.toByteArray());
|
||||||
|
|
||||||
|
byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.write(expectedBytes, 2, 5);
|
||||||
|
nibbleExpectedBytes = new byte[5];
|
||||||
|
System.arraycopy(expectedBytes, 2, nibbleExpectedBytes, 0, 5);
|
||||||
|
|
||||||
|
assertArrayEquals(nibbleExpectedBytes, byteArrayOutputNetStream.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWriteShort() {
|
||||||
|
int smallInt;
|
||||||
|
do {
|
||||||
|
smallInt = random.nextInt();
|
||||||
|
} while (smallInt > Short.MAX_VALUE || smallInt < Short.MIN_VALUE);
|
||||||
|
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeShort(smallInt);
|
||||||
|
|
||||||
|
assertArrayEquals(new byte[]{ (byte) (smallInt >>> 8),
|
||||||
|
(byte) smallInt },
|
||||||
|
byteArrayOutputNetStream.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWriteInt() {
|
||||||
|
final int integerDig = random.nextInt();
|
||||||
|
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeInt(integerDig);
|
||||||
|
|
||||||
|
assertArrayEquals(new byte[]{ (byte) ((integerDig >>> 24) & 0xFF),
|
||||||
|
(byte) ((integerDig >>> 16) & 0xFF),
|
||||||
|
(byte) ((integerDig >>> 8) & 0xFF),
|
||||||
|
(byte) (integerDig & 0xFF) },
|
||||||
|
byteArrayOutputNetStream.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWriteLong() {
|
||||||
|
final long longDig = random.nextLong();
|
||||||
|
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeLong(longDig);
|
||||||
|
|
||||||
|
assertArrayEquals(new byte[]{ (byte) ((longDig >>> 56) & 0xFF),
|
||||||
|
(byte) ((longDig >>> 48) & 0xFF),
|
||||||
|
(byte) ((longDig >>> 40) & 0xFF),
|
||||||
|
(byte) ((longDig >>> 32) & 0xFF),
|
||||||
|
(byte) ((longDig >>> 24) & 0xFF),
|
||||||
|
(byte) ((longDig >>> 16) & 0xFF),
|
||||||
|
(byte) ((longDig >>> 8) & 0xFF),
|
||||||
|
(byte) (longDig & 0xFF) },
|
||||||
|
byteArrayOutputNetStream.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWriteFloat() {
|
||||||
|
final float floatDig = random.nextFloat();
|
||||||
|
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeFloat(floatDig);
|
||||||
|
final int floatBits = Float.floatToIntBits(floatDig);
|
||||||
|
|
||||||
|
assertArrayEquals(new byte[]{ (byte) ((floatBits >>> 24) & 0xFF),
|
||||||
|
(byte) ((floatBits >>> 16) & 0xFF),
|
||||||
|
(byte) ((floatBits >>> 8) & 0xFF),
|
||||||
|
(byte) (floatBits & 0xFF) },
|
||||||
|
byteArrayOutputNetStream.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWriteDouble() {
|
||||||
|
final double doubleDig = random.nextDouble();
|
||||||
|
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeDouble(doubleDig);
|
||||||
|
final long doubleBits = Double.doubleToLongBits(doubleDig);
|
||||||
|
|
||||||
|
assertArrayEquals(new byte[]{ (byte) ((doubleBits >>> 56) & 0xFF),
|
||||||
|
(byte) ((doubleBits >>> 48) & 0xFF),
|
||||||
|
(byte) ((doubleBits >>> 40) & 0xFF),
|
||||||
|
(byte) ((doubleBits >>> 32) & 0xFF),
|
||||||
|
(byte) ((doubleBits >>> 24) & 0xFF),
|
||||||
|
(byte) ((doubleBits >>> 16) & 0xFF),
|
||||||
|
(byte) ((doubleBits >>> 8) & 0xFF),
|
||||||
|
(byte) (doubleBits & 0xFF) },
|
||||||
|
byteArrayOutputNetStream.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWriteVarInt() {
|
||||||
|
final int b1Int = 120;
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeVarInt(b1Int);
|
||||||
|
|
||||||
|
assertArrayEquals(new byte[]{ 0x78 },
|
||||||
|
byteArrayOutputNetStream.toByteArray());
|
||||||
|
|
||||||
|
final int b2Int = 12000;
|
||||||
|
byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeVarInt(b2Int);
|
||||||
|
|
||||||
|
assertArrayEquals(new byte[]{ (byte) 0xE0, 0x5D },
|
||||||
|
byteArrayOutputNetStream.toByteArray());
|
||||||
|
|
||||||
|
final int b3Int = 120000;
|
||||||
|
byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeVarInt(b3Int);
|
||||||
|
|
||||||
|
assertArrayEquals(new byte[]{ (byte) 0xC0, (byte) 0xA9, 0x07 },
|
||||||
|
byteArrayOutputNetStream.toByteArray());
|
||||||
|
|
||||||
|
final int b4Int = 120000000;
|
||||||
|
byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeVarInt(b4Int);
|
||||||
|
|
||||||
|
assertArrayEquals(new byte[]{ (byte) 0x80, (byte) 0x9C, (byte) 0x9C, (byte) 0x39 },
|
||||||
|
byteArrayOutputNetStream.toByteArray());
|
||||||
|
|
||||||
|
final int b5Int = 1200000000;
|
||||||
|
byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeVarInt(b5Int);
|
||||||
|
|
||||||
|
assertArrayEquals(new byte[]{ (byte) 0x80, (byte) 0x98, (byte) 0x9A, (byte) 0xBC, 0x04 },
|
||||||
|
byteArrayOutputNetStream.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWriteString() {
|
||||||
|
final String string = "Hello? Есть тут кто?";
|
||||||
|
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeString(string);
|
||||||
|
|
||||||
|
final byte[] strBytes = string.getBytes(StandardCharsets.UTF_8);
|
||||||
|
final byte[] bytes = new byte[strBytes.length + 1];
|
||||||
|
bytes[0] = (byte) string.length(); // здесь считается, что размер поместится в один байт
|
||||||
|
System.arraycopy(strBytes, 0, bytes, 1, strBytes.length);
|
||||||
|
|
||||||
|
assertArrayEquals(bytes, byteArrayOutputNetStream.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testWriteUUID() {
|
||||||
|
final UUID uuid = UUID.randomUUID();
|
||||||
|
|
||||||
|
ByteArrayOutputNetStream byteArrayOutputNetStream = new ByteArrayOutputNetStream();
|
||||||
|
byteArrayOutputNetStream.writeUUID(uuid);
|
||||||
|
|
||||||
|
final long mostSignificantBits = uuid.getMostSignificantBits();
|
||||||
|
final long leastSignificantBits = uuid.getLeastSignificantBits();
|
||||||
|
|
||||||
|
assertArrayEquals(new byte[]{ (byte) ((mostSignificantBits >>> 56) & 0xFF),
|
||||||
|
(byte) ((mostSignificantBits >>> 48) & 0xFF),
|
||||||
|
(byte) ((mostSignificantBits >>> 40) & 0xFF),
|
||||||
|
(byte) ((mostSignificantBits >>> 32) & 0xFF),
|
||||||
|
(byte) ((mostSignificantBits >>> 24) & 0xFF),
|
||||||
|
(byte) ((mostSignificantBits >>> 16) & 0xFF),
|
||||||
|
(byte) ((mostSignificantBits >>> 8) & 0xFF),
|
||||||
|
(byte) (mostSignificantBits & 0xFF),
|
||||||
|
|
||||||
|
(byte) ((leastSignificantBits >>> 56) & 0xFF),
|
||||||
|
(byte) ((leastSignificantBits >>> 48) & 0xFF),
|
||||||
|
(byte) ((leastSignificantBits >>> 40) & 0xFF),
|
||||||
|
(byte) ((leastSignificantBits >>> 32) & 0xFF),
|
||||||
|
(byte) ((leastSignificantBits >>> 24) & 0xFF),
|
||||||
|
(byte) ((leastSignificantBits >>> 16) & 0xFF),
|
||||||
|
(byte) ((leastSignificantBits >>> 8) & 0xFF),
|
||||||
|
(byte) (leastSignificantBits & 0xFF) },
|
||||||
|
byteArrayOutputNetStream.toByteArray());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
package mc.core.network.proto_1_12_2.packets;
|
|
||||||
|
|
||||||
import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
||||||
|
|
||||||
class ByteArrayInputNetStreamTest {
|
|
||||||
private Random rnd = new Random();
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void readByte() {
|
|
||||||
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
|
|
||||||
void readInt() {
|
|
||||||
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
|
|
||||||
void readFloat() {
|
|
||||||
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.00001f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -41,7 +41,6 @@ class ChunkdataPacketTest {
|
|||||||
if (y <= 3) return 0;
|
if (y <= 3) return 0;
|
||||||
else return 15;
|
else return 15;
|
||||||
});
|
});
|
||||||
when(chunkSection.getBiome(anyInt(), anyInt())).thenReturn(Biome.PLAINS);
|
|
||||||
when(chunkSection.getBlock(anyInt(), anyInt(), anyInt())).thenAnswer(invocation -> {
|
when(chunkSection.getBlock(anyInt(), anyInt(), anyInt())).thenAnswer(invocation -> {
|
||||||
Object[] args = invocation.getArguments();
|
Object[] args = invocation.getArguments();
|
||||||
int x = (int) args[0];
|
int x = (int) args[0];
|
||||||
@@ -57,7 +56,7 @@ class ChunkdataPacketTest {
|
|||||||
});
|
});
|
||||||
|
|
||||||
world = mock(World.class);
|
world = mock(World.class);
|
||||||
when(world.getWorldType()).thenReturn(WorldType.FLAT);
|
when(world.getType()).thenReturn(WorldType.FLAT);
|
||||||
when(world.getChunk(anyInt(), anyInt())).thenAnswer(invocation -> {
|
when(world.getChunk(anyInt(), anyInt())).thenAnswer(invocation -> {
|
||||||
Object[] args = invocation.getArguments();
|
Object[] args = invocation.getArguments();
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package mc.core.network.proto_1_12_2.packets;
|
package mc.core.network.proto_1_12_2.packets;
|
||||||
|
|
||||||
|
import mc.core.network.proto_1_12_2.ByteArrayInputNetStream;
|
||||||
import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream;
|
import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand
|
|||||||
pkt1.setMode(PlayerMode.CREATIVE); //TODO перенести в Config
|
pkt1.setMode(PlayerMode.CREATIVE); //TODO перенести в Config
|
||||||
pkt1.setDimension(0/*Overworld*/); //TODO перенести в World
|
pkt1.setDimension(0/*Overworld*/); //TODO перенести в World
|
||||||
pkt1.setDifficulty(0/*Peaceful*/); //TODO перенести в Config
|
pkt1.setDifficulty(0/*Peaceful*/); //TODO перенести в Config
|
||||||
pkt1.setLevelType(world.getWorldType().getName());
|
pkt1.setLevelType(world.getType().getName());
|
||||||
channel.write(pkt1);
|
channel.write(pkt1);
|
||||||
|
|
||||||
// Spawn Position
|
// Spawn Position
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-07-25
|
|
||||||
*/
|
|
||||||
package mc.core.network.proto_1_12_2.netty.wrappers;
|
package mc.core.network.proto_1_12_2.netty.wrappers;
|
||||||
|
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
@@ -25,8 +21,9 @@ public class WrapperNetInputStream extends NetInputStream_p340 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void readBytes(byte[] buffer) {
|
public int readBytes(byte[] buffer, int offset, int length) {
|
||||||
byteBuf.readBytes(buffer);
|
byteBuf.readBytes(buffer, offset, length);
|
||||||
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
/*
|
|
||||||
* DmitriyMX <dimon550@gmail.com>
|
|
||||||
* 2018-07-25
|
|
||||||
*/
|
|
||||||
package mc.core.network.proto_1_12_2.netty.wrappers;
|
package mc.core.network.proto_1_12_2.netty.wrappers;
|
||||||
|
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
@@ -30,8 +26,8 @@ public class WrapperNetOutputStream extends NetOutputStream_p340 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeBytes(byte[] buffer) {
|
public void writeBytes(byte[] buffer, int offset, int lengtn) {
|
||||||
byteBuf.writeBytes(buffer);
|
byteBuf.writeBytes(buffer, offset, lengtn);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import lombok.Getter;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import mc.core.world.Biome;
|
import mc.core.world.Biome;
|
||||||
|
import mc.core.world.block.Block;
|
||||||
import mc.core.world.chunk.Chunk;
|
import mc.core.world.chunk.Chunk;
|
||||||
import mc.core.world.chunk.ChunkSection;
|
import mc.core.world.chunk.ChunkSection;
|
||||||
|
|
||||||
@@ -13,7 +14,6 @@ public class SimpleChunk implements Chunk {
|
|||||||
@Getter
|
@Getter
|
||||||
private final int x, z;
|
private final int x, z;
|
||||||
private ChunkSection chunkSection;
|
private ChunkSection chunkSection;
|
||||||
private final Biome biome = Biome.PLAINS;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ChunkSection getChunkSection(int height) {
|
public ChunkSection getChunkSection(int height) {
|
||||||
@@ -23,15 +23,58 @@ public class SimpleChunk implements Chunk {
|
|||||||
@Override
|
@Override
|
||||||
public void setChunkSection(int height, ChunkSection chunkSection) {
|
public void setChunkSection(int height, ChunkSection chunkSection) {
|
||||||
this.chunkSection = chunkSection;
|
this.chunkSection = chunkSection;
|
||||||
|
this.chunkSection.setParent(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Biome getBiome(int localX, int localZ) {
|
public Block getBlock(int x, int y, int z) {
|
||||||
return biome;
|
return chunkSection.getBlock(
|
||||||
|
x - (x >> 4) << 4,
|
||||||
|
y - (y >> 4) << 4,
|
||||||
|
z - (z >> 4) << 4
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBiome(int localX, int localZ, Biome biome) {
|
public void setBlock(Block block) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSkyLight(int x, int y, int z) {
|
||||||
|
return chunkSection.getSkyLight(
|
||||||
|
x - (x >> 4) << 4,
|
||||||
|
y - (y >> 4) << 4,
|
||||||
|
z - (z >> 4) << 4
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSkyLight(int x, int y, int z, int lightLevel) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAddition(int x, int y, int z) {
|
||||||
|
return chunkSection.getAddition(
|
||||||
|
x - (x >> 4) << 4,
|
||||||
|
y - (y >> 4) << 4,
|
||||||
|
z - (z >> 4) << 4
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAddition(int x, int y, int z, int value) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Biome getBiome(int x, int z) {
|
||||||
|
return Biome.PLAINS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBiome(int x, int z, Biome biome) {
|
||||||
// ignore
|
// ignore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,19 @@
|
|||||||
package mc.world.simple;
|
package mc.world.simple;
|
||||||
|
|
||||||
import mc.core.world.Biome;
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
import mc.core.world.block.Block;
|
import mc.core.world.block.Block;
|
||||||
import mc.core.world.block.BlockFactory;
|
import mc.core.world.block.BlockFactory;
|
||||||
import mc.core.world.block.BlockType;
|
import mc.core.world.block.BlockType;
|
||||||
|
import mc.core.world.chunk.Chunk;
|
||||||
import mc.core.world.chunk.ChunkSection;
|
import mc.core.world.chunk.ChunkSection;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class SimpleChunkSection implements ChunkSection {
|
public class SimpleChunkSection implements ChunkSection {
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private Chunk parent;
|
||||||
private final BlockFactory blockFactory = new BlockFactory();
|
private final BlockFactory blockFactory = new BlockFactory();
|
||||||
private final List<BlockType> layersBlock;
|
private final List<BlockType> layersBlock;
|
||||||
|
|
||||||
@@ -17,32 +22,22 @@ public class SimpleChunkSection implements ChunkSection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSkyLight(int x, int y, int z) {
|
public int getSkyLight(int localX, int localY, int localZ) {
|
||||||
if (y <= 3) return 0;
|
if (localY <= 3) return 0;
|
||||||
else return 15;
|
else return 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setSkyLight(int x, int y, int z, int lightLevel) {
|
public void setSkyLight(int localX, int localY, int localZ, int lightLevel) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getAddition(int x, int y, int z) {
|
public int getAddition(int localX, int localY, int localZ) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setAddition(int x, int y, int z, int value) {
|
public void setAddition(int localX, int localY, int localZ, int value) {
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Biome getBiome(int localX, int localZ) {
|
|
||||||
return Biome.PLAINS;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getX() {
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -50,31 +45,26 @@ public class SimpleChunkSection implements ChunkSection {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getZ() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBlock(Block block) {
|
public void setBlock(Block block) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Block getBlock(int x, int y, int z) {
|
public Block getBlock(int localX, int localY, int localZ) {
|
||||||
if (x < 0) x = 0;
|
if (localX < 0) localX = 0;
|
||||||
else if (x > 15) x = 15;
|
else if (localX > 15) localX = 15;
|
||||||
if (y < 0) y = 0;
|
if (localY < 0) localY = 0;
|
||||||
else if (y > 15) y = 15;
|
else if (localY > 15) localY = 15;
|
||||||
if (z < 0) z = 0;
|
if (localZ < 0) localZ = 0;
|
||||||
else if (z > 15) z = 15;
|
else if (localZ > 15) localZ = 15;
|
||||||
|
|
||||||
if (y >= layersBlock.size()) {
|
if (localY >= layersBlock.size()) {
|
||||||
return blockFactory.create(BlockType.AIR, x, y, z);
|
return blockFactory.create(BlockType.AIR, localX, localY, localZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockType blockType = layersBlock.get(y);
|
BlockType blockType = layersBlock.get(localY);
|
||||||
if (blockType == null) return blockFactory.create(BlockType.AIR, x, y, z);
|
if (blockType == null) return blockFactory.create(BlockType.AIR, localX, localY, localZ);
|
||||||
|
|
||||||
return blockFactory.create(blockType, x, y, z);
|
return blockFactory.create(blockType, localX, localY, localZ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import mc.core.EntityLocation;
|
import mc.core.EntityLocation;
|
||||||
import mc.core.world.World;
|
import mc.core.world.World;
|
||||||
import mc.core.world.WorldType;
|
import mc.core.world.WorldType;
|
||||||
|
import mc.core.world.block.Block;
|
||||||
import mc.core.world.chunk.Chunk;
|
import mc.core.world.chunk.Chunk;
|
||||||
import mc.core.world.chunk.ChunkProvider;
|
import mc.core.world.chunk.ChunkProvider;
|
||||||
import org.springframework.beans.factory.BeanNameAware;
|
import org.springframework.beans.factory.BeanNameAware;
|
||||||
@@ -19,7 +20,7 @@ public class SimpleWorld implements World, BeanNameAware {
|
|||||||
@Getter
|
@Getter
|
||||||
private String name;
|
private String name;
|
||||||
@Getter
|
@Getter
|
||||||
private final WorldType worldType = WorldType.FLAT;
|
private final WorldType type = WorldType.FLAT;
|
||||||
private EntityLocation spawn;
|
private EntityLocation spawn;
|
||||||
@Setter
|
@Setter
|
||||||
private ChunkProvider chunkProvider;
|
private ChunkProvider chunkProvider;
|
||||||
@@ -49,6 +50,16 @@ public class SimpleWorld implements World, BeanNameAware {
|
|||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Block getBlock(int x, int y, int z) {
|
||||||
|
return chunkProvider.getChunk(x >> 4, z >> 4).getBlock(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBlock(Block block) {
|
||||||
|
// nope...
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBeanName(@Nonnull String name) {
|
public void setBeanName(@Nonnull String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
|||||||
@@ -33,9 +33,9 @@ class SimpleChunkSectionTest {
|
|||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
Block block = chunkSection.getBlock(x, y, z);
|
Block block = chunkSection.getBlock(x, y, z);
|
||||||
if (y > layersBlock.size()-1) {
|
if (y > layersBlock.size()-1) {
|
||||||
assertEquals(block.getBlockType(), BlockType.AIR);
|
assertEquals(block.getType(), BlockType.AIR);
|
||||||
} else {
|
} else {
|
||||||
assertEquals(block.getBlockType(), layersBlock.get(y));
|
assertEquals(block.getType(), layersBlock.get(y));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user