mirror of
https://github.com/Minestom/Minestom.git
synced 2024-09-27 06:03:01 +02:00
Update
This commit is contained in:
parent
35b77e4e8c
commit
289ee48816
@ -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.
|
||||
|
@ -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'
|
||||
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -23,7 +23,7 @@ public class UpdatableBlockDemo extends CustomBlock {
|
||||
|
||||
@Override
|
||||
public void onPlace(Instance instance, BlockPosition blockPosition, Data data) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -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) {
|
||||
|
@ -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};
|
||||
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
package fr.themode.minestom.inventory.rule;
|
||||
package fr.themode.minestom.inventory.condition;
|
||||
|
||||
import fr.themode.minestom.entity.Player;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package fr.themode.minestom.inventory.rule;
|
||||
package fr.themode.minestom.inventory.condition;
|
||||
|
||||
import fr.themode.minestom.item.ItemStack;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
89
src/main/java/fr/themode/minestom/ping/ResponseData.java
Normal file
89
src/main/java/fr/themode/minestom/ping/ResponseData.java
Normal 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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user