Update + fixed animations

This commit is contained in:
Felix Cravic 2020-04-20 23:43:09 +02:00
parent 68d8513e1a
commit f596a8fa84
12 changed files with 121 additions and 18 deletions

View File

@ -103,7 +103,7 @@ public class PlayerInit {
Vector velocity = player.getPosition().clone().getDirection().multiply(4); Vector velocity = player.getPosition().clone().getDirection().multiply(4);
velocity.setY(3.5f); velocity.setY(3.5f);
target.setVelocity(velocity, 150); target.setVelocity(velocity, 150);
target.damage(1); target.damage(5);
player.sendMessage("ATTACK"); player.sendMessage("ATTACK");
} }
}); });
@ -142,7 +142,7 @@ public class PlayerInit {
}); });
player.setEventCallback(PlayerSpawnEvent.class, event -> { player.setEventCallback(PlayerSpawnEvent.class, event -> {
player.setGameMode(GameMode.SURVIVAL); player.setGameMode(GameMode.CREATIVE);
player.teleport(new Position(0, 75, 0)); player.teleport(new Position(0, 75, 0));
/*Random random = new Random(); /*Random random = new Random();

View File

@ -433,7 +433,7 @@ public abstract class Entity implements Viewable, DataContainer {
EntityStatusPacket statusPacket = new EntityStatusPacket(); EntityStatusPacket statusPacket = new EntityStatusPacket();
statusPacket.entityId = getEntityId(); statusPacket.entityId = getEntityId();
statusPacket.status = status; statusPacket.status = status;
sendPacketToViewers(statusPacket); sendPacketToViewersAndSelf(statusPacket);
} }
public void setOnFire(boolean fire) { public void setOnFire(boolean fire) {

View File

@ -96,9 +96,9 @@ public abstract class LivingEntity extends Entity {
} }
public void kill() { public void kill() {
this.isDead = true; // So the entity isn't killed over and over again refreshIsDead(true); // So the entity isn't killed over and over again
setHealth(0);
triggerStatus((byte) 3); // Start death animation status triggerStatus((byte) 3); // Start death animation status
setHealth(0);
DeathEvent deathEvent = new DeathEvent(); DeathEvent deathEvent = new DeathEvent();
callEvent(DeathEvent.class, deathEvent); callEvent(DeathEvent.class, deathEvent);
} }

View File

@ -338,12 +338,6 @@ public class Player extends LivingEntity {
} }
} }
@Override
public void kill() {
super.kill();
refreshIsDead(true);
}
public void sendBlockBreakAnimation(BlockPosition blockPosition, byte destroyStage) { public void sendBlockBreakAnimation(BlockPosition blockPosition, byte destroyStage) {
BlockBreakAnimationPacket breakAnimationPacket = new BlockBreakAnimationPacket(); BlockBreakAnimationPacket breakAnimationPacket = new BlockBreakAnimationPacket();
breakAnimationPacket.entityId = getEntityId() + 1; breakAnimationPacket.entityId = getEntityId() + 1;

View File

@ -0,0 +1,23 @@
package fr.themode.minestom.event;
public class ArmAnimationEvent extends CancellableEvent {
private ArmAnimationType armAnimationType;
public ArmAnimationEvent(ArmAnimationType armAnimationType) {
this.armAnimationType = armAnimationType;
}
public ArmAnimationType getArmAnimationType() {
return armAnimationType;
}
public enum ArmAnimationType {
BOW,
CROSSBOW,
TRIDENT,
SHIELD,
EAT
}
}

View File

@ -53,6 +53,8 @@ public abstract class Instance implements BlockModifier, DataContainer {
// Load only if auto chunk load is enabled // Load only if auto chunk load is enabled
public abstract void loadOptionalChunk(int chunkX, int chunkZ, Consumer<Chunk> callback); public abstract void loadOptionalChunk(int chunkX, int chunkZ, Consumer<Chunk> callback);
public abstract void unloadChunk(int chunkX, int chunkZ);
public abstract Chunk getChunk(int chunkX, int chunkZ); public abstract Chunk getChunk(int chunkX, int chunkZ);
public abstract void saveChunkToFolder(Chunk chunk, Runnable callback); public abstract void saveChunkToFolder(Chunk chunk, Runnable callback);

View File

@ -10,6 +10,7 @@ import fr.themode.minestom.instance.block.rule.BlockPlacementRule;
import fr.themode.minestom.net.PacketWriterUtils; import fr.themode.minestom.net.PacketWriterUtils;
import fr.themode.minestom.net.packet.server.play.BlockChangePacket; import fr.themode.minestom.net.packet.server.play.BlockChangePacket;
import fr.themode.minestom.net.packet.server.play.ParticlePacket; import fr.themode.minestom.net.packet.server.play.ParticlePacket;
import fr.themode.minestom.net.packet.server.play.UnloadChunkPacket;
import fr.themode.minestom.particle.Particle; import fr.themode.minestom.particle.Particle;
import fr.themode.minestom.particle.ParticleCreator; import fr.themode.minestom.particle.ParticleCreator;
import fr.themode.minestom.utils.BlockPosition; import fr.themode.minestom.utils.BlockPosition;
@ -219,6 +220,23 @@ public class InstanceContainer extends Instance {
} }
} }
@Override
public void unloadChunk(int chunkX, int chunkZ) {
Chunk chunk = getChunk(chunkX, chunkZ);
long index = ChunkUtils.getChunkIndex(chunkX, chunkZ);
UnloadChunkPacket unloadChunkPacket = new UnloadChunkPacket();
unloadChunkPacket.chunkX = chunkX;
unloadChunkPacket.chunkZ = chunkZ;
chunk.sendPacketToViewers(unloadChunkPacket);
for (Player viewer : chunk.getViewers()) {
chunk.removeViewer(viewer);
}
this.chunks.remove(index);
}
@Override @Override
public Chunk getChunk(int chunkX, int chunkZ) { public Chunk getChunk(int chunkX, int chunkZ) {
return chunks.get(ChunkUtils.getChunkIndex(chunkX, chunkZ)); return chunks.get(ChunkUtils.getChunkIndex(chunkX, chunkZ));

View File

@ -43,6 +43,11 @@ public class SharedInstance extends Instance {
instanceContainer.loadOptionalChunk(chunkX, chunkZ, callback); instanceContainer.loadOptionalChunk(chunkX, chunkZ, callback);
} }
@Override
public void unloadChunk(int chunkX, int chunkZ) {
instanceContainer.unloadChunk(chunkX, chunkZ);
}
@Override @Override
public Chunk getChunk(int chunkX, int chunkZ) { public Chunk getChunk(int chunkX, int chunkZ) {
return instanceContainer.getChunk(chunkX, chunkZ); return instanceContainer.getChunk(chunkX, chunkZ);

View File

@ -936,7 +936,48 @@ public enum Material {
} }
public boolean isFood() { public boolean isFood() {
return false; // TODO switch (this) {
case APPLE:
case MUSHROOM_STEW:
case BREAD:
case PORKCHOP:
case COOKED_PORKCHOP:
case GOLDEN_APPLE:
case ENCHANTED_GOLDEN_APPLE:
case COD:
case SALMON:
case TROPICAL_FISH:
case PUFFERFISH:
case COOKED_COD:
case COOKED_SALMON:
case CAKE:
case COOKIE:
case MELON_SLICE:
case DRIED_KELP:
case BEEF:
case COOKED_BEEF:
case CHICKEN:
case COOKED_CHICKEN:
case ROTTEN_FLESH:
case SPIDER_EYE:
case CARROT:
case POTATO:
case BAKED_POTATO:
case POISONOUS_POTATO:
case PUMPKIN_PIE:
case RABBIT:
case COOKED_RABBIT:
case RABBIT_STEW:
case MUTTON:
case COOKED_MUTTON:
case BEETROOT:
case BEETROOT_SOUP:
case SWEET_BERRIES:
case HONEY_BOTTLE:
return true;
default:
return false;
}
} }
public short getId() { public short getId() {

View File

@ -75,12 +75,12 @@ public class PlayerDiggingListener {
ItemStack handItem = player.getInventory().getItemInMainHand(); ItemStack handItem = player.getInventory().getItemInMainHand();
handItem.setAmount((byte) (handItem.getAmount() - 1)); handItem.setAmount((byte) (handItem.getAmount() - 1));
handItem = handItem.getAmount() <= 0 ? ItemStack.AIR_ITEM : handItem; handItem = handItem.getAmount() <= 0 ? ItemStack.AIR_ITEM : handItem;
dropItem(player, droppedItemStack2, handItem); dropItem(player, droppedItemStack2, handItem);
break; break;
case UPDATE_ITEM_STATE: case UPDATE_ITEM_STATE:
// TODO check if is updatable item player.refreshActiveHand(false, false, false);
//player.refreshActiveHand(false, false, false); player.sendPacketToViewers(player.getMetadataPacket());
//player.sendPacketToViewers(player.getMetadataPacket());
break; break;
case SWAP_ITEM_HAND: case SWAP_ITEM_HAND:
PlayerInventory playerInventory = player.getInventory(); PlayerInventory playerInventory = player.getInventory();

View File

@ -1,6 +1,7 @@
package fr.themode.minestom.listener; package fr.themode.minestom.listener;
import fr.themode.minestom.entity.Player; import fr.themode.minestom.entity.Player;
import fr.themode.minestom.event.ArmAnimationEvent;
import fr.themode.minestom.event.ArmorEquipEvent; import fr.themode.minestom.event.ArmorEquipEvent;
import fr.themode.minestom.event.PlayerUseItemEvent; import fr.themode.minestom.event.PlayerUseItemEvent;
import fr.themode.minestom.inventory.PlayerInventory; import fr.themode.minestom.inventory.PlayerInventory;
@ -64,8 +65,27 @@ public class UseItemListener {
// TODO check if item in main or off hand is food or item with animation (bow/crossbow/riptide) // TODO check if item in main or off hand is food or item with animation (bow/crossbow/riptide)
// TODO in material enum? // TODO in material enum?
//player.refreshActiveHand(true, false, false); ArmAnimationEvent armAnimationEvent = null;
//player.sendPacketToViewers(player.getMetadataPacket()); boolean offhand = hand == Player.Hand.OFF;
boolean riptideSpinAttack = false;
if (material == Material.BOW) {
armAnimationEvent = new ArmAnimationEvent(ArmAnimationEvent.ArmAnimationType.BOW);
} else if (material == Material.CROSSBOW) {
armAnimationEvent = new ArmAnimationEvent(ArmAnimationEvent.ArmAnimationType.CROSSBOW);
} else if (material == Material.SHIELD) {
armAnimationEvent = new ArmAnimationEvent(ArmAnimationEvent.ArmAnimationType.SHIELD);
} else if (material == Material.TRIDENT) {
armAnimationEvent = new ArmAnimationEvent(ArmAnimationEvent.ArmAnimationType.TRIDENT);
} else if (material.isFood()) {
armAnimationEvent = new ArmAnimationEvent(ArmAnimationEvent.ArmAnimationType.EAT);
}
if (armAnimationEvent != null)
player.callCancellableEvent(ArmAnimationEvent.class, armAnimationEvent, () -> {
player.refreshActiveHand(true, offhand, riptideSpinAttack);
player.sendPacketToViewers(player.getMetadataPacket());
});
} }
} }

View File

@ -43,7 +43,7 @@ public class PacketProcessor {
PlayerConnection playerConnection = connectionPlayerConnectionMap.computeIfAbsent(channel, c -> new PlayerConnection(channel)); PlayerConnection playerConnection = connectionPlayerConnectionMap.computeIfAbsent(channel, c -> new PlayerConnection(channel));
ConnectionState connectionState = playerConnection.getConnectionState(); ConnectionState connectionState = playerConnection.getConnectionState();
//if (!printBlackList.contains(id)) { //if (!printBlackList.contains(id)) {
// System.out.println("RECEIVED ID: 0x" + Integer.toHexString(id) + " State: " + connectionState); //System.out.println("RECEIVED ID: 0x" + Integer.toHexString(id) + " State: " + connectionState);
//} //}
PacketReader packetReader = new PacketReader(buffer, length); PacketReader packetReader = new PacketReader(buffer, length);