Archived
0

Merge branch 'proto_1.12.2' into world-loader-anvil

This commit is contained in:
2018-12-25 18:23:33 +03:00
29 changed files with 944 additions and 293 deletions

View File

@@ -24,11 +24,11 @@ public class CoreEventListener {
log.trace("(GameLoop) playerMoveEventHandler()");
Chunk chunk;
chunk = event.getPlayer().getWorld().getChunk(event.getOldLocation()); // Old chunk
chunk = event.getPlayer().getWorld().getChunk(event.getOldLocation().toBlockLocation()); // Old chunk
if (chunk == null) return;
int ccX = chunk.getX();
int ccZ = chunk.getZ();
chunk = event.getPlayer().getWorld().getChunk(event.getNewLocation()); // Next chunk
chunk = event.getPlayer().getWorld().getChunk(event.getNewLocation().toBlockLocation()); // Next chunk
if (chunk == null) return;
int ncX = chunk.getX();
int ncZ = chunk.getZ();

View File

@@ -3,7 +3,7 @@ package mc.core;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.lang.Nullable;
import mc.core.world.block.BlockLocation;
@NoArgsConstructor
@AllArgsConstructor
@@ -44,6 +44,10 @@ public class EntityLocation implements Cloneable {
return (int) Math.floor(z);
}
public BlockLocation toBlockLocation() {
return new BlockLocation(getBlockX(), getBlockY(), getBlockZ());
}
@Override
public EntityLocation clone() {
try {

View File

@@ -1,36 +1,42 @@
package mc.core.world;
import mc.core.EntityLocation;
import mc.core.world.block.Block;
import mc.core.world.block.BlockLocation;
import mc.core.world.chunk.Chunk;
public interface World {
String getName();
WorldType getWorldType();
WorldType getType();
EntityLocation getSpawn();
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);
}
/**
* Получить чанк по координатам
* @param x глобальный X
* @param z глобальный Z
* Получить чанк по его координатам
* @param x chunk X
* @param z chunk Z
* @return {@link mc.core.world.chunk.Chunk}
*/
Chunk getChunk(int x, int z);
/**
* Получить чанк по глобальным координатам блока
* @param location {@link BlockLocation}
* @return {@link Chunk}
*/
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);
}
/**
* Установить чанк по координатам
@@ -39,4 +45,19 @@ public interface World {
* @param chunk {@link mc.core.world.chunk.Chunk}
*/
void setChunk(int x, int z, Chunk chunk);
/**
* Получить блок по его координатам
* @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);
}

View File

@@ -3,17 +3,15 @@ package mc.core.world.block;
import lombok.Getter;
import lombok.Setter;
@Getter
public abstract class AbstractBlock implements Block {
@Getter
@Setter
private BlockLocation location;
@Getter
private int light = 0;
@Getter
private final BlockType blockType;
private final BlockType type;
protected AbstractBlock(BlockType type) {
this.blockType = type;
this.type = type;
}
@Override

View File

@@ -5,7 +5,7 @@ import com.flowpowered.nbt.CompoundTag;
public interface Block {
int getLight();
void setLight(int light);
BlockType getBlockType();
BlockType getType();
BlockLocation getLocation();
default CompoundTag getNBTData() {

View File

@@ -3,7 +3,6 @@ package mc.core.world.block;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import mc.core.world.chunk.ChunkSection;
@NoArgsConstructor
@AllArgsConstructor
@@ -21,22 +20,6 @@ public class BlockLocation implements Cloneable {
this.z = z;
}
public BlockLocation toGlobal(ChunkSection chunkSection) {
return new BlockLocation(
(chunkSection.getX() << 4) + x,
(chunkSection.getY() << 4) + y,
(chunkSection.getZ() << 4) + z
);
}
public BlockLocation toLocal() {
return new BlockLocation(
x - (x >> 4 << 4),
y - (y >> 4 << 4),
z - (z >> 4 << 4)
);
}
@Override
public BlockLocation clone() {
try {

View File

@@ -1,6 +1,7 @@
package mc.core.world.chunk;
import mc.core.world.Biome;
import mc.core.world.block.Block;
/* 16x256x16 */
public interface Chunk {
@@ -31,38 +32,34 @@ public interface Chunk {
void setChunkSection(int height, ChunkSection chunkSection);
/**
* Получиь данные по биому
* @param x глобальный X
* @param z глобальный Z
* @return
* Получить блок по глобальным координатам секции чанка
* @param x global X
* @param y global Y
* @param z global Z
* @return {@link Block}
*/
default Biome getBiome(int x, int z) {
return getBiomeLocal(x >> 4, z >> 4);
}
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 локальный X (0-15)
* @param z локальный Z (0-15)
* @return
* Получить тип биома по глобальным координатам
* @param x global X
* @param z global Z
* @return {@link mc.core.world.Biome}
*/
Biome getBiomeLocal(int x, int z);
Biome getBiome(int x, int z);
/**
* Указать данные по биому
* @param x глобальный X
* @param z глобальный Z
* @param x global X
* @param z global Z
* @param biome {@link mc.core.world.Biome}
*/
default void setBiome(int x, int z, Biome biome) {
setBiomeLocal(x >> 4, z >> 4, biome);
}
/**
* Указать данные по биому
* @param x локальный X (0-15)
* @param z локальный Z (0-15)
* @param biome {@link mc.core.world.Biome}
*/
void setBiomeLocal(int x, int z, Biome biome);
void setBiome(int x, int z, Biome biome);
}

View File

@@ -1,15 +1,13 @@
package mc.core.world.chunk;
import mc.core.world.Biome;
import mc.core.world.block.Block;
/* 16x16x16 */
/**
* Секция чанка размером 16x16x16 блоков
*/
public interface ChunkSection {
/**
* Глобальная координата X
* @return
*/
int getX();
Chunk getParent();
void setParent(Chunk chunk);
/**
* Высота
@@ -18,30 +16,13 @@ public interface ChunkSection {
int getY();
/**
* Глобальная координата Z
* @return
* Получить блок по локальным координатам секции чанка
* @param localX local X (0-15)
* @param localY local Y (0-15)
* @param localZ local Z (0-15)
* @return {@link Block}
*/
int getZ();
/**
* Получить блок
* @param x глобальный X
* @param y глобальный Y
* @param z глобальный Z
* @return {@link mc.core.world.block.Block}
*/
default Block getBlock(int x, int y, int z) {
return getBlockLocal(x >> 4, y >> 4, z >> 4);
}
/**
* Получить блок
* @param x локальный X (0-15)
* @param y локальный Y (0-15)
* @param z локальный Z (0-15)
* @return {@link mc.core.world.block.Block}
*/
Block getBlockLocal(int x, int y, int z);
Block getBlock(int localX, int localY, int localZ);
/**
* Установить блок
@@ -51,44 +32,22 @@ public interface ChunkSection {
/**
* Получить данные о естественной подсветке
* @param x глобальный X
* @param y глобальный Y
* @param z глобальный Z
* @param localX локальный X (0-15)
* @param localY локальный Y (0-15)
* @param localZ локальный Z (0-15)
* @return integer значение 0-15, где 0 - это света нет, а 15 - получает прямой солнечный свет
*/
default int getSkyLight(int x, int y, int z) {
return getSkyLightLocal(x >> 4, y >> 4, z >> 4);
}
/**
* Получить данные о естественной подсветке
* @param x локальный X (0-15)
* @param y локальный Y (0-15)
* @param z локальный Z (0-15)
* @return integer значение 0-15, где 0 - это света нет, а 15 - получает прямой солнечный свет
*/
int getSkyLightLocal(int x, int y, int z);
int getSkyLight(int localX, int localY, int localZ);
/**
* Указать данные о естественной подсветке
* @param x глобальный X
* @param y глобальный Y
* @param z глобальный Z
* @param localX локальный X (0-15)
* @param localY локальный Y (0-15)
* @param localZ локальный Z (0-15)
* @param lightLevel значение 0-15, где 0 - это света нет, а 15 - получает прямой солнечный свет
*/
default void setSkyLight(int x, int y, int z, int lightLevel) {
setSkyLightLocal(x >> 4, y >> 4, z >> 4, lightLevel);
}
void setSkyLight(int localX, int localY, int localZ, int lightLevel);
/**
* Указать данные о естественной подсветке
* @param x локальный X (0-15)
* @param y локальный Y (0-15)
* @param z локальный Z (0-15)
* @param lightLevel значение 0-15, где 0 - это света нет, а 15 - получает прямой солнечный свет
*/
void setSkyLightLocal(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);
int getAddition(int localX, int localY, int localZ);
void setAddition(int localX, int localY, int localZ, int value);
}