This commit is contained in:
Felix Cravic 2020-04-08 10:10:05 +02:00
parent 35b77e4e8c
commit 289ee48816
18 changed files with 162 additions and 42 deletions

View File

@ -18,7 +18,10 @@ Being able to create instances directly on the go is a must-have, according to u
Instances also come with performance benefits, unlike some others which will be fully single-threaded or maybe using one thread per world we are using a set number of threads (pool) to manage all chunks independently from instances, meaning using more of CPU power.
## Blocks
Minestom by default does not know what is stone block, not even a chest, you will have to tell him that it opens an inventory. Every "special blocks" (which aren't only visual) have to be registered, then they can be placed anywhere simply.
Minestom by default does not know what is a chest, you will have to tell him that it opens an inventory.
Every "special blocks" (which aren't only visual) have to be registered, then they can be placed anywhere simply.
However, all blocks are visually there, they just won't have interaction by default.
## Entities
The terms "passive" or "aggressive" monsters do not exist, nobody forbid you from making a flying chicken rushing into any players coming too close, doing so with NMS is a real mess because of obfuscation and the large inheritance.

View File

@ -29,13 +29,13 @@ dependencies {
// https://mvnrepository.com/artifact/it.unimi.dsi/fastutil
implementation group: 'it.unimi.dsi', name: 'fastutil', version: '8.3.0'
compile 'com.github.Querz:NBT:4.1'
implementation 'com.github.Querz:NBT:4.1'
implementation 'com.github.luben:zstd-jni:1.4.3-1'
implementation 'com.esotericsoftware:reflectasm:1.11.9'
implementation 'com.github.LynnOwens:starlite:9971b899f7'
// https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
implementation 'com.github.TheMode:CommandBuilder:611d16a487'
compile 'com.github.TheMode:CommandBuilder:611d16a487'
}

View File

@ -12,6 +12,7 @@ import fr.themode.minestom.instance.InstanceContainer;
import fr.themode.minestom.inventory.Inventory;
import fr.themode.minestom.inventory.InventoryType;
import fr.themode.minestom.item.ItemStack;
import fr.themode.minestom.net.ConnectionManager;
import fr.themode.minestom.utils.Position;
import fr.themode.minestom.utils.Vector;
@ -36,7 +37,18 @@ public class PlayerInit {
}
public static void init() {
MinecraftServer.getConnectionManager().setPlayerInitialization(player -> {
ConnectionManager connectionManager = MinecraftServer.getConnectionManager();
connectionManager.setResponseDataConsumer(responseData -> {
responseData.setName("1.15.2");
responseData.setProtocol(578);
responseData.setMaxPlayer(100);
responseData.setOnline(0);
responseData.setDescription("test");
responseData.setFavicon("data:image/png;base64,<data>");
});
connectionManager.setPlayerInitialization(player -> {
player.setEventCallback(AttackEvent.class, event -> {
Entity entity = event.getTarget();
if (entity instanceof EntityCreature) {

View File

@ -23,7 +23,7 @@ public class UpdatableBlockDemo extends CustomBlock {
@Override
public void onPlace(Instance instance, BlockPosition blockPosition, Data data) {
}
@Override

View File

@ -42,7 +42,7 @@ public class HealthCommand extends Command<Player> {
}
private void modeCallback(Player player, String value, int error) {
System.out.println("SYNTAX ERROR: '" + value + "' should be replaced by 'set' or 'add'");
player.sendMessage("SYNTAX ERROR: '" + value + "' should be replaced by 'set' or 'add'");
}
private void valueCallback(Player player, String value, int error) {

View File

@ -94,7 +94,6 @@ public class CommandManager {
packetWriter.writeVarInt(0);
};
int argOffset = nodes.size();
rootChildren.add(argOffset);
nodes.add(argNode);
argNode.children = new int[]{argOffset};

View File

@ -214,9 +214,14 @@ public abstract class Entity implements Viewable, DataContainer {
sendPacketToViewersAndSelf(getVelocityPacket());
} else {
final float tps = MinecraftServer.TICK_PER_SECOND;
refreshPosition(position.getX() + velocity.getX() / tps, position.getY() + velocity.getY() / tps, position.getZ() + velocity.getZ() / tps);
float newX = position.getX() + velocity.getX() / tps;
float newY = position.getY() + velocity.getY() / tps;
float newZ = position.getZ() + velocity.getZ() / tps;
refreshPosition(newX, newY, newZ);
if (this instanceof ObjectEntity) {
sendPacketToViewers(getVelocityPacket());
// FIXME velocity/gravity
//sendPacketToViewers(getVelocityPacket());
teleport(getPosition());
} else if (this instanceof EntityCreature) {
teleport(getPosition());
}

View File

@ -23,7 +23,7 @@ public abstract class LivingEntity extends Entity {
private float health;
// Bounding box used for items' pickup (see LivingEntity#setBoundingBox)
private BoundingBox expandedBoundingBox = getBoundingBox();
private BoundingBox expandedBoundingBox;
private float[] attributeValues = new float[Attribute.values().length];
@ -41,17 +41,9 @@ public abstract class LivingEntity extends Entity {
this(entityType, new Position());
}
public void kill() {
System.out.println("KILL");
this.isDead = true; // So the entity isn't killed over and over again
setHealth(0);
triggerStatus((byte) 3); // Start death animation status
DeathEvent deathEvent = new DeathEvent();
callEvent(DeathEvent.class, deathEvent);
}
@Override
public void update() {
// Items picking
if (canPickupItem) {
Chunk chunk = instance.getChunkAt(getPosition()); // TODO check surrounding chunks
Set<Entity> entities = instance.getChunkEntities(chunk);
@ -103,6 +95,14 @@ public abstract class LivingEntity extends Entity {
};
}
public void kill() {
this.isDead = true; // So the entity isn't killed over and over again
setHealth(0);
triggerStatus((byte) 3); // Start death animation status
DeathEvent deathEvent = new DeathEvent();
callEvent(DeathEvent.class, deathEvent);
}
public void damage(float value) {
EntityAnimationPacket entityAnimationPacket = new EntityAnimationPacket();
entityAnimationPacket.entityId = getEntityId();

View File

@ -4,8 +4,8 @@ import fr.themode.minestom.Viewable;
import fr.themode.minestom.entity.Player;
import fr.themode.minestom.inventory.click.InventoryClickProcessor;
import fr.themode.minestom.inventory.click.InventoryClickResult;
import fr.themode.minestom.inventory.rule.InventoryCondition;
import fr.themode.minestom.inventory.rule.InventoryConditionResult;
import fr.themode.minestom.inventory.condition.InventoryCondition;
import fr.themode.minestom.inventory.condition.InventoryConditionResult;
import fr.themode.minestom.item.ItemStack;
import fr.themode.minestom.item.StackingRule;
import fr.themode.minestom.net.packet.server.play.SetSlotPacket;
@ -85,11 +85,6 @@ public class Inventory implements InventoryModifier, InventoryClickHandler, View
return Arrays.copyOf(itemStacks, itemStacks.length);
}
@Override
public void setInventoryRule() {
}
@Override
public InventoryCondition getInventoryCondition() {
return inventoryCondition;

View File

@ -1,6 +1,6 @@
package fr.themode.minestom.inventory;
import fr.themode.minestom.inventory.rule.InventoryCondition;
import fr.themode.minestom.inventory.condition.InventoryCondition;
import fr.themode.minestom.item.ItemStack;
public interface InventoryModifier {
@ -13,8 +13,6 @@ public interface InventoryModifier {
ItemStack[] getItemStacks();
void setInventoryRule();
InventoryCondition getInventoryCondition();
void setInventoryCondition(InventoryCondition inventoryCondition);

View File

@ -3,8 +3,8 @@ package fr.themode.minestom.inventory;
import fr.themode.minestom.entity.Player;
import fr.themode.minestom.inventory.click.InventoryClickProcessor;
import fr.themode.minestom.inventory.click.InventoryClickResult;
import fr.themode.minestom.inventory.rule.InventoryCondition;
import fr.themode.minestom.inventory.rule.InventoryConditionResult;
import fr.themode.minestom.inventory.condition.InventoryCondition;
import fr.themode.minestom.inventory.condition.InventoryConditionResult;
import fr.themode.minestom.item.ItemStack;
import fr.themode.minestom.item.StackingRule;
import fr.themode.minestom.net.packet.server.play.EntityEquipmentPacket;
@ -43,11 +43,6 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler
return Arrays.copyOf(items, items.length);
}
@Override
public void setInventoryRule() {
}
@Override
public InventoryCondition getInventoryCondition() {
return inventoryCondition;
@ -335,7 +330,7 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler
int index = i < 9 ? i + 9 : i - 9;
ItemStack item = items[index];
StackingRule itemRule = item.getStackingRule();
if (item.isSimilar(clicked)) {
if (itemRule.canBeStacked(item, clicked)) {
int amount = item.getAmount();
if (!clickedRule.canApply(clicked, amount + 1))
continue;

View File

@ -1,8 +1,8 @@
package fr.themode.minestom.inventory.click;
import fr.themode.minestom.entity.Player;
import fr.themode.minestom.inventory.rule.InventoryCondition;
import fr.themode.minestom.inventory.rule.InventoryConditionResult;
import fr.themode.minestom.inventory.condition.InventoryCondition;
import fr.themode.minestom.inventory.condition.InventoryConditionResult;
import fr.themode.minestom.item.ItemStack;
import fr.themode.minestom.item.StackingRule;

View File

@ -1,4 +1,4 @@
package fr.themode.minestom.inventory.rule;
package fr.themode.minestom.inventory.condition;
import fr.themode.minestom.entity.Player;

View File

@ -1,4 +1,4 @@
package fr.themode.minestom.inventory.rule;
package fr.themode.minestom.inventory.condition;
import fr.themode.minestom.item.ItemStack;

View File

@ -2,6 +2,7 @@ package fr.themode.minestom.net;
import fr.themode.minestom.entity.Player;
import fr.themode.minestom.net.player.PlayerConnection;
import fr.themode.minestom.ping.ResponseData;
import java.util.*;
import java.util.concurrent.CopyOnWriteArraySet;
@ -13,6 +14,7 @@ public class ConnectionManager {
private Set<Player> players = new CopyOnWriteArraySet<>();
private Map<PlayerConnection, Player> connectionPlayerMap = Collections.synchronizedMap(new HashMap<>());
private Consumer<ResponseData> responseDataConsumer;
private Consumer<Player> playerInitialization;
public Player getPlayer(PlayerConnection connection) {
@ -47,6 +49,14 @@ public class ConnectionManager {
broadcastMessage(message, null);
}
public Consumer<ResponseData> getResponseDataConsumer() {
return responseDataConsumer;
}
public void setResponseDataConsumer(Consumer<ResponseData> responseDataConsumer) {
this.responseDataConsumer = responseDataConsumer;
}
public Consumer<Player> getPlayerInitialization() {
return playerInitialization;
}

View File

@ -1,16 +1,28 @@
package fr.themode.minestom.net.packet.client.status;
import fr.themode.minestom.MinecraftServer;
import fr.themode.minestom.net.ConnectionManager;
import fr.themode.minestom.net.packet.PacketReader;
import fr.themode.minestom.net.packet.client.ClientPreplayPacket;
import fr.themode.minestom.net.packet.server.handshake.ResponsePacket;
import fr.themode.minestom.net.player.PlayerConnection;
import fr.themode.minestom.ping.ResponseData;
import java.util.function.Consumer;
public class StatusRequestPacket implements ClientPreplayPacket {
@Override
public void process(PlayerConnection connection, ConnectionManager connectionManager) {
Consumer<ResponseData> consumer = MinecraftServer.getConnectionManager().getResponseDataConsumer();
ResponseData responseData = new ResponseData();
if (responseData == null)
throw new NullPointerException("You need to register a ResponseDataConsumer");
consumer.accept(responseData);
ResponsePacket responsePacket = new ResponsePacket();
responsePacket.jsonResponse = responseData.build().toString();
connection.sendPacket(responsePacket);
}

View File

@ -26,9 +26,11 @@ public class ResponsePacket implements ServerPacket {
" \"favicon\": \"data:image/png;base64,<data>\"\n" +
"}";
public String jsonResponse;
@Override
public void write(PacketWriter writer) {
writer.writeSizedString(JSON_EXAMPLE);
writer.writeSizedString(jsonResponse);
}
@Override

View File

@ -0,0 +1,89 @@
package fr.themode.minestom.ping;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class ResponseData {
private JsonObject jsonObject = new JsonObject();
private JsonObject versionObject = new JsonObject();
private JsonObject playersObject = new JsonObject();
private JsonArray sampleArray = new JsonArray();
private JsonObject descriptionObject = new JsonObject();
private String name;
private int protocol;
private int maxPlayer;
private int online;
private List<PingPlayer> pingPlayers = new ArrayList<>();
private String description;
private String favicon;
public void setName(String name) {
this.name = name;
}
public void setProtocol(int protocol) {
this.protocol = protocol;
}
public void setMaxPlayer(int maxPlayer) {
this.maxPlayer = maxPlayer;
}
public void setOnline(int online) {
this.online = online;
}
public void addPlayer(String name, UUID uuid) {
PingPlayer pingPlayer = new PingPlayer();
pingPlayer.name = name;
pingPlayer.uuid = uuid;
this.pingPlayers.add(pingPlayer);
}
public void setDescription(String description) {
this.description = description;
}
public void setFavicon(String favicon) {
this.favicon = favicon;
}
public JsonObject build() {
versionObject.addProperty("name", name);
versionObject.addProperty("protocol", protocol);
playersObject.addProperty("max", maxPlayer);
playersObject.addProperty("online", online);
for (PingPlayer pingPlayer : pingPlayers) {
JsonObject pingPlayerObject = new JsonObject();
pingPlayerObject.addProperty("name", pingPlayer.name);
pingPlayerObject.addProperty("id", pingPlayer.uuid.toString());
sampleArray.add(pingPlayerObject);
}
playersObject.add("sample", sampleArray);
descriptionObject.addProperty("text", description);
jsonObject.add("version", versionObject);
jsonObject.add("players", playersObject);
jsonObject.add("description", descriptionObject);
jsonObject.addProperty("favicon", favicon);
return jsonObject;
}
private static class PingPlayer {
private String name;
private UUID uuid;
}
}