diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java index b0e54c54d..e6737e719 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java @@ -99,7 +99,7 @@ public class ShulkerHitBox extends AbstractHitBox { ), true); packets.accept(FastNMS.INSTANCE.constructor$ClientboundSetEntityDataPacket(entityIds[2], List.copyOf(cachedInteractionValues)), true); // second interaction - float distance = shulkerHeight - scale; + double distance = shulkerHeight - scale; packets.accept(FastNMS.INSTANCE.constructor$ClientboundAddEntityPacket( entityIds[3], UUID.randomUUID(), x + offset.x + shulkerDirection.stepX() * distance, y + offset.y - 0.005f, z - offset.z + shulkerDirection.stepZ() * distance, 0, yaw, Reflections.instance$EntityType$INTERACTION, 0, Reflections.instance$Vec3$Zero, 0 diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 6dc8a2af8..c731ced75 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -23,6 +23,7 @@ import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.font.FontManager; import net.momirealms.craftengine.core.font.IllegalCharacterProcessResult; +import net.momirealms.craftengine.core.item.CustomItem; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.context.UseOnContext; @@ -1633,23 +1634,26 @@ public class PacketConsumers { if (hitBox == null) return; Item itemInHand = serverPlayer.getItemInHand(InteractionHand.MAIN_HAND); if (itemInHand == null) return; - itemInHand.getCustomItem().ifPresent(customItem -> { - Location eyeLocation = player.getEyeLocation(); - Vector direction = eyeLocation.getDirection(); - Location endLocation = eyeLocation.clone(); - endLocation.add(direction.multiply(serverPlayer.getCachedInteractionRange())); - Optional result = hitBox.clip(LocationUtils.toVec3d(eyeLocation), LocationUtils.toVec3d(endLocation)); - if (result.isPresent()) { - EntityHitResult hitResult = result.get(); - Vec3d vec3d = hitResult.position(); - for (ItemBehavior behavior : customItem.behaviors()) { - if (behavior instanceof FurnitureItemBehavior) { - behavior.useOnBlock(new UseOnContext(serverPlayer, InteractionHand.MAIN_HAND, new BlockHitResult(vec3d, hitResult.direction(), BlockPos.fromVec3d(vec3d), false))); - return; - } + Optional> optionalCustomitem = itemInHand.getCustomItem(); + Location eyeLocation = player.getEyeLocation(); + Vector direction = eyeLocation.getDirection(); + Location endLocation = eyeLocation.clone(); + endLocation.add(direction.multiply(serverPlayer.getCachedInteractionRange())); + Optional result = hitBox.clip(LocationUtils.toVec3d(eyeLocation), LocationUtils.toVec3d(endLocation)); + if (result.isEmpty()) { + return; + } + EntityHitResult hitResult = result.get(); + if (optionalCustomitem.isPresent() && !optionalCustomitem.get().behaviors().isEmpty()) { + for (ItemBehavior behavior : optionalCustomitem.get().behaviors()) { + if (behavior instanceof FurnitureItemBehavior) { + behavior.useOnBlock(new UseOnContext(serverPlayer, InteractionHand.MAIN_HAND, new BlockHitResult(hitResult.hitLocation(), hitResult.direction(), BlockPos.fromVec3d(hitResult.hitLocation()), false))); + return; } } - }); + } + // now simulate vanilla item behavior + FastNMS.INSTANCE.simulateInteraction(serverPlayer.serverPlayer(), DirectionUtils.toNMSDirection(hitResult.direction()), hitResult.hitLocation().x, hitResult.hitLocation().y, hitResult.hitLocation().z, LocationUtils.toBlockPos(hitResult.blockPos())); } else { furniture.findFirstAvailableSeat(entityId).ifPresent(seatPos -> { if (furniture.tryOccupySeat(seatPos)) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index 828bd2da0..1b767469c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -489,7 +489,7 @@ public abstract class AbstractPackManager implements PackManager { // firstly merge existing folders try { List folders = new ArrayList<>(); - folders.addAll(loadedPacks().stream().map(Pack::resourcePackFolder).toList()); + folders.addAll(loadedPacks().stream().filter(Pack::enabled).map(Pack::resourcePackFolder).toList()); folders.addAll(Config.foldersToMerge().stream().map(it -> plugin.dataFolderPath().getParent().resolve(it)).filter(Files::exists).toList()); List>> duplicated = mergeFolder(folders, generatedPackPath); diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/EntityHitResult.java b/core/src/main/java/net/momirealms/craftengine/core/world/EntityHitResult.java index ca8e433f1..36c0f2e96 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/EntityHitResult.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/EntityHitResult.java @@ -1,21 +1,48 @@ package net.momirealms.craftengine.core.world; import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.MCUtils; public class EntityHitResult { private final Direction direction; private final Vec3d position; + private final BlockPos blockPos; public EntityHitResult(Direction direction, Vec3d position) { this.direction = direction; this.position = position; + this.blockPos = getBlockPos(); } public Direction direction() { return direction; } - public Vec3d position() { + public Vec3d hitLocation() { return position; } + + private BlockPos getBlockPos() { + int x = MCUtils.fastFloor(this.position.x); + int y = MCUtils.fastFloor(this.position.y); + int z = MCUtils.fastFloor(this.position.z); + if (this.direction == Direction.UP) { + if (this.position.y % 1 == 0) { + y--; + } + } else if (this.direction == Direction.SOUTH) { + if (this.position.z % 1 == 0) { + z--; + } + } else if (this.direction == Direction.EAST) { + if (this.position.x % 1 == 0) { + x--; + } + } + return new BlockPos(x, y, z); + } + + public BlockPos blockPos() { + return blockPos; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/collision/MultiAABB.java b/core/src/main/java/net/momirealms/craftengine/core/world/collision/MultiAABB.java new file mode 100644 index 000000000..134b0be63 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/collision/MultiAABB.java @@ -0,0 +1,4 @@ +package net.momirealms.craftengine.core.world.collision; + +public class MultiAABB { +} diff --git a/gradle.properties b/gradle.properties index b1e4b0865..70408b833 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.49-beta.4 +project_version=0.0.49-beta.5 config_version=29 lang_version=6 project_group=net.momirealms @@ -51,7 +51,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.15 -nms_helper_version=0.59.8 +nms_helper_version=0.60.5 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23 amazon_awssdk_eventstream_version=1.0.1 diff --git a/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java b/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java index 6cb356a90..1595c9ccd 100644 --- a/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java +++ b/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.mod; +import net.minecraft.server.level.ServerLevel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.objectweb.asm.tree.ClassNode;