Skip to content

Update Minestom to 1.21.5 #57

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 5 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.minestom.vanilla;

import net.minestom.server.utils.NamespaceID;

import net.kyori.adventure.key.Key;
import net.minestom.vanilla.blockupdatesystem.BlockUpdateManager;
import net.minestom.vanilla.logging.Loading;
import net.minestom.vanilla.randomticksystem.RandomTickManager;
Expand All @@ -19,7 +20,7 @@ public void hook(@NotNull HookContext context) {
}

@Override
public @NotNull NamespaceID namespaceId() {
return NamespaceID.from("vri:blockupdate");
public @NotNull Key key() {
return Key.key("vri:blockupdate");
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package net.minestom.vanilla.blocks;

import net.kyori.adventure.key.Key;
import net.minestom.server.coordinate.Point;
import net.minestom.server.entity.Player;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.block.BlockHandler;
import net.minestom.server.utils.NamespaceID;
import org.jetbrains.annotations.NotNull;

import java.util.Objects;
Expand All @@ -17,12 +17,12 @@ public abstract class VanillaBlockBehaviour implements BlockHandler {

protected final @NotNull VanillaBlocks.BlockContext context;
protected final short baseBlock;
protected final @NotNull NamespaceID namespaceID;
protected final @NotNull Key key;

protected VanillaBlockBehaviour(@NotNull VanillaBlocks.BlockContext context) {
this.context = context;
this.baseBlock = context.stateId();
this.namespaceID = Objects.requireNonNull(Block.fromStateId(context.stateId())).namespace();
this.key = Objects.requireNonNull(Block.fromStateId(context.stateId())).key();
}

/**
Expand All @@ -38,8 +38,8 @@ public void onPlace(@NotNull VanillaPlacement placement) {
}

@Override
public @NotNull NamespaceID getNamespaceId() {
return namespaceID;
public @NotNull Key getKey() {
return key;
}

public interface VanillaPlacement {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Random;
import java.util.function.Consumer;
import java.util.random.RandomGenerator;

Expand All @@ -27,15 +30,15 @@ private record LootEntry(@Nullable List<LootFunction> functions, List<ItemStack>
}

public void spawnLoot(@NotNull PlayerBlockBreakEvent event) {
String blockName = event.getBlock().namespace().value();
String blockName = event.getBlock().key().value();
datapack.namespacedData().forEach((namespace, data) -> {
FileSystem<LootTable> blocks = data.loot_tables().folder("blocks");
var lootTable = blocks.file(blockName + ".json");
if (lootTable == null) return;

Block blockState = event.getBlock();
Point origin = event.getBlockPosition();
ItemStack tool = event.getPlayer().getInventory().getItemInMainHand();
ItemStack tool = event.getPlayer().getItemInMainHand();
Player entity = event.getPlayer();
Block blockEntity = blockState.registry().blockEntity() == null ? null : blockState;
Random random = vri.random(entity);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import net.minestom.vanilla.blocks.behaviours.*;
import net.minestom.vanilla.blocks.behaviours.oxidisable.OxidatableBlockBehaviour;
import net.minestom.vanilla.blocks.behaviours.oxidisable.WaxedBlockBehaviour;
import net.minestom.vanilla.blocks.behaviours.recipe.CampfireBehaviour;
import net.minestom.vanilla.blocks.behaviours.recipe.*;
import net.minestom.vanilla.blockupdatesystem.BlockUpdatable;
import net.minestom.vanilla.blockupdatesystem.BlockUpdateManager;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package net.minestom.vanilla.blocks;

import net.kyori.adventure.key.Key;
import net.minestom.server.coordinate.Point;
import net.minestom.server.event.player.PlayerBlockPlaceEvent;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.block.Block;
import net.minestom.server.utils.NamespaceID;
import net.minestom.vanilla.BlockUpdateFeature;
import net.minestom.vanilla.VanillaReimplementation;
import net.minestom.vanilla.datapack.DatapackLoadingFeature;
Expand Down Expand Up @@ -60,8 +60,8 @@ public void blockToPlace(@NotNull Block newBlock) {
}

@Override
public @NotNull NamespaceID namespaceId() {
return NamespaceID.from("vri:blocks");
public @NotNull Key key() {
return Key.key("vri:blocks");
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import net.minestom.server.MinecraftServer;
import net.minestom.server.coordinate.Point;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.EntityPose;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.metadata.PlayerMeta;
import net.minestom.server.instance.Instance;
Expand Down Expand Up @@ -50,21 +50,25 @@ public void onPlace(@NotNull VanillaPlacement placement) {
Block blockAtPotentialBedHead = instance.getBlock(bedHeadPosition);

if (isReplaceable(blockAtPotentialBedHead)) {
placeBed(instance, bedBlock, pos, bedHeadPosition, playerDirection);
Block foot = placeBed(instance, bedBlock, bedHeadPosition, playerDirection);
placement.blockToPlace(foot);
} else {
placement.blockToPlace(placement.instance().getBlock(placement.position()));
}

}

private boolean isReplaceable(Block blockAtPosition) {
return blockAtPosition.isAir() || blockAtPosition.isLiquid();
}

private void placeBed(Instance instance, Block bedBlock, Point footPosition, Point headPosition, Direction facing) {
private Block placeBed(Instance instance, Block bedBlock, Point headPosition, Direction facing) {
Block correctFacing = bedBlock.withProperty("facing", facing.name().toLowerCase());

Block footBlock = correctFacing.withProperty("part", "foot");
Block headBlock = correctFacing.withProperty("part", "head");
instance.setBlock(footPosition, footBlock);
Block headBlock = correctFacing.withProperty("part", "head").withHandler(new BedBlockBehaviour(this.context));
instance.setBlock(headPosition, headBlock);
return footBlock;
}

@Override
Expand All @@ -89,7 +93,7 @@ public boolean onInteract(@NotNull Interaction interaction) {
// Make player sleep
PlayerMeta meta = player.getPlayerMeta();
meta.setBedInWhichSleepingPosition(pos);
meta.setPose(Entity.Pose.SLEEPING);
meta.setPose(EntityPose.SLEEPING);

// Schedule player getting out of bed
MinecraftServer.getSchedulerManager().buildTask(() -> {
Expand All @@ -98,7 +102,7 @@ public boolean onInteract(@NotNull Interaction interaction) {
}

meta.setBedInWhichSleepingPosition(null);
meta.setPose(Entity.Pose.STANDING);
meta.setPose(EntityPose.STANDING);
})
.delay(101, TimeUnit.SERVER_TICK)
.schedule();
Expand All @@ -118,16 +122,14 @@ public void onDestroy(@NotNull Destroy destroy) {
Block block = destroy.getBlock();
Point pos = destroy.getBlockPosition();

System.out.println(block.name());

boolean isFoot = "foot".equals(block.getProperty("part"));
boolean isHead = "head".equals(block.getProperty("part"));
Direction facing = Direction.valueOf(block.getProperty("facing").toUpperCase());

if (isFoot) {
if (isHead) {
facing = facing.opposite();
}

Point otherPartPosition = pos.add(facing.normalX(), facing.normalY(), facing.normalZ()); // TODO: Investigate why direction is wrong
Point otherPartPosition = pos.add(facing.normalX(), facing.normalY(), facing.normalZ());
instance.setBlock(pos, Block.AIR);
instance.setBlock(otherPartPosition, Block.AIR);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import net.minestom.server.entity.damage.DamageType;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.block.Block;
import net.minestom.server.utils.time.TimeUnit;
import net.minestom.vanilla.blocks.VanillaBlockBehaviour;
import net.minestom.vanilla.blocks.VanillaBlocks;
import net.minestom.vanilla.system.NetherPortal;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
package net.minestom.vanilla.blocks.behaviours;

import net.minestom.server.MinecraftServer;
import net.minestom.server.component.DataComponents;
import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.coordinate.Vec;
import net.minestom.server.effects.Effects;
import net.minestom.server.entity.ItemEntity;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.PlayerHand;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.block.jukebox.JukeboxSong;
import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material;
import net.minestom.server.registry.DynamicRegistry;
import net.minestom.server.tag.Tag;
import net.minestom.server.worldevent.WorldEvent;
import net.minestom.vanilla.blocks.VanillaBlockBehaviour;
import net.minestom.vanilla.blocks.VanillaBlocks;
import net.minestom.vanilla.inventory.InventoryManipulation;
Expand All @@ -28,14 +31,15 @@
*/
public class JukeboxBlockBehaviour extends VanillaBlockBehaviour {

public static final Tag<ItemStack> DISC_KEY = Tag.ItemStack("minestom:jokebox_disc");
public static final Tag<ItemStack> DISC_KEY = Tag.ItemStack("minestom:jukebox_disc");

public JukeboxBlockBehaviour(@NotNull VanillaBlocks.BlockContext context) {
super(context);
}

@Override
public void onDestroy(@NotNull Destroy destroy) {
if (!(destroy instanceof PlayerDestroy)) return;
stopPlayback(destroy.getInstance(), destroy.getBlockPosition(), destroy.getBlock());
}

Expand All @@ -44,40 +48,34 @@ public void onDestroy(@NotNull Destroy destroy) {
}

public @NotNull Block withDisc(Block block, @NotNull ItemStack disc) {
if (isNotMusicDisc(disc.material())) {
if (isNotMusicDisc(disc)) {
throw new IllegalArgumentException("disc passed to JukeboxBlockHandle#withDisc was not a music disc.");
}
return block.withTag(DISC_KEY, disc);
}

private boolean isNotMusicDisc(ItemStack itemStack) {
return isNotMusicDisc(itemStack.material());
}

private boolean isNotMusicDisc(Material material) {
return !material.name().startsWith("minecraft:music_disc"); // TODO: better recognition than based on the name?
return !itemStack.has(DataComponents.JUKEBOX_PLAYABLE);
}

@Override
public boolean onInteract(@NotNull Interaction interaction) {
Player player = interaction.getPlayer();
Player.Hand hand = interaction.getHand();
PlayerHand hand = interaction.getHand();
Instance instance = interaction.getInstance();
Block block = interaction.getBlock();
Point pos = interaction.getBlockPosition();
ItemStack heldItem = player.getInventory().getItemInMainHand();
ItemStack heldItem = player.getItemInMainHand();

ItemStack stack = this.getDisc(block);

if (stack != null) {
if (stack != null && !stack.isAir()) {
stopPlayback(instance, pos, block);
block = block.withTag(DISC_KEY, ItemStack.AIR);
instance.setBlock(pos, block.withProperty("has_record", "false"));
// TODO: Drop disc
return true;
}


if (isNotMusicDisc(heldItem)) {
return true;
}
Expand All @@ -86,17 +84,21 @@ public boolean onInteract(@NotNull Interaction interaction) {

InventoryManipulation.consumeItemIfNotCreative(player, heldItem, hand);

JukeboxSong song = heldItem.get(DataComponents.JUKEBOX_PLAYABLE).holder().resolve(MinecraftServer.getJukeboxSongRegistry());
DynamicRegistry.Key<JukeboxSong> songKey = MinecraftServer.getJukeboxSongRegistry().getKey(song);
int songId = MinecraftServer.getJukeboxSongRegistry().getId(songKey);

// TODO: Group packet?
instance.getPlayers()
.stream()
.filter(player1 -> player1.getDistance(pos) < 64)
.forEach(player1 ->
player1.playEffect(
Effects.PLAY_RECORD,
WorldEvent.SOUND_PLAY_JUKEBOX_SONG,
pos.blockX(),
pos.blockY(),
pos.blockZ(),
heldItem.material().id(),
songId,
false
)
);
Expand Down Expand Up @@ -169,7 +171,7 @@ private void stopPlayback(Instance instance, Point pos, Block block) {
instance.getPlayers().forEach(playerInInstance -> {
// stop playback
playerInInstance.playEffect(
Effects.PLAY_RECORD,
WorldEvent.SOUND_STOP_JUKEBOX_SONG,
pos.blockX(),
pos.blockY(),
pos.blockZ(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
import net.minestom.vanilla.blockupdatesystem.BlockUpdatable;
import net.minestom.vanilla.blockupdatesystem.BlockUpdateInfo;
import net.minestom.vanilla.dimensions.VanillaDimensionTypes;
import net.minestom.vanilla.system.NetherPortal;
import net.minestom.vanilla.system.nether.EntityEnterNetherPortalEvent;
import net.minestom.vanilla.system.nether.NetherPortalTeleportEvent;
import net.minestom.vanilla.system.nether.NetherPortalUpdateEvent;
import net.minestom.vanilla.system.NetherPortal;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.PlayerHand;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.block.Block;
import net.minestom.server.inventory.PlayerInventory;
import net.minestom.server.item.Material;
import net.minestom.vanilla.VanillaRegistry;
import net.minestom.vanilla.blocks.VanillaBlockBehaviour;
Expand All @@ -35,10 +35,9 @@ public TNTBlockBehaviour(@NotNull VanillaBlocks.BlockContext context) {
public boolean onInteract(@NotNull Interaction interaction) {
Point blockPosition = interaction.getBlockPosition();
Player player = interaction.getPlayer();
Player.Hand hand = interaction.getHand();
PlayerInventory inventory = player.getInventory();
PlayerHand hand = interaction.getHand();

if (inventory.getItemInHand(hand).material() != Material.FLINT_AND_STEEL) {
if (player.getItemInHand(hand).material() != Material.FLINT_AND_STEEL) {
return true;
}

Expand Down
Loading