9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 09:59:20 +00:00

Merge pull request #370 from jhqwqmc/dev

feat(block): 添加台灯
This commit is contained in:
XiaoMoMi
2025-09-12 20:36:58 +08:00
committed by GitHub
9 changed files with 149 additions and 67 deletions

View File

@@ -1,15 +1,18 @@
package net.momirealms.craftengine.bukkit.block.behavior;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections;
import net.momirealms.craftengine.bukkit.util.LocationUtils;
import net.momirealms.craftengine.core.block.BlockBehavior;
import net.momirealms.craftengine.core.block.CustomBlock;
import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory;
import net.momirealms.craftengine.core.block.behavior.special.TriggerOnceBlockBehavior;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.craftengine.core.world.Vec3d;
import org.bukkit.entity.Entity;
import java.util.Map;
import java.util.concurrent.Callable;
@@ -31,9 +34,9 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior implements Trigge
public void fallOn(Object thisBlock, Object[] args, Callable<Object> superMethod) {
if (this.fallDamageMultiplier <= 0.0) return;
Object entity = args[3];
Object finalFallDistance = VersionHelper.isOrAbove1_21_5() ? (double) args[4] * this.fallDamageMultiplier : (float) args[4] * this.fallDamageMultiplier;
Number fallDistance = (Number) args[4];
FastNMS.INSTANCE.method$Entity$causeFallDamage(
entity, finalFallDistance, 1.0F,
entity, fallDistance.doubleValue() * this.fallDamageMultiplier, 1.0F,
FastNMS.INSTANCE.method$DamageSources$fall(FastNMS.INSTANCE.method$Entity$damageSources(entity))
);
}
@@ -55,9 +58,21 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior implements Trigge
double y = -deltaMovement.y * this.bounceHeight * d;
FastNMS.INSTANCE.method$Entity$setDeltaMovement(entity, deltaMovement.x, y, deltaMovement.z);
if (CoreReflections.clazz$Player.isInstance(entity) && this.syncPlayerPosition
&& /* 防抖 -> */ y > 0.032 /* <- 防抖 */
&& /* 防抖 -> */ y > 0.035 /* <- 防抖 */
) {
FastNMS.INSTANCE.field$Entity$hurtMarked(entity, true);
// 这里一定要延迟 1t 不然就会出问题
if (VersionHelper.isFolia()) {
Entity bukkitEntity = FastNMS.INSTANCE.method$Entity$getBukkitEntity(entity);
bukkitEntity.getScheduler().runDelayed(BukkitCraftEngine.instance().javaPlugin(),
r -> FastNMS.INSTANCE.field$Entity$hurtMarked(entity, true),
null, 1L
);
} else {
CraftEngine.instance().scheduler().sync().runLater(
() -> FastNMS.INSTANCE.field$Entity$hurtMarked(entity, true),
1L
);
}
}
}
}

View File

@@ -337,6 +337,7 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager {
plugin.scheduler().sync().runDelayed(() -> tryLeavingSeat(player, entity), player.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4);
}
@SuppressWarnings("DuplicatedCode")
protected void tryLeavingSeat(@NotNull Player player, @NotNull Entity vehicle) {
Integer baseFurniture = vehicle.getPersistentDataContainer().get(FURNITURE_SEAT_BASE_ENTITY_KEY, PersistentDataType.INTEGER);
if (baseFurniture == null) return;
@@ -375,6 +376,7 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager {
return (entity instanceof ArmorStand || entity instanceof ItemDisplay);
}
@SuppressWarnings("DuplicatedCode")
private boolean isSafeLocation(Location location) {
World world = location.getWorld();
if (world == null) return false;
@@ -386,6 +388,7 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager {
return world.getBlockAt(x, y + 1, z).isPassable();
}
@SuppressWarnings("DuplicatedCode")
@Nullable
private Location findSafeLocationNearby(Location center) {
World world = center.getWorld();

View File

@@ -28,8 +28,8 @@ lang:
block_name:default:copper_coil: Copper Coil
block_name:default:chessboard_block: Chessboard Block
block_name:default:safe_block: Safe Block
block_name:default:sleeper_sofa: Sofa
block_name:default:sofa: Sofa
block_name:default:connectable_sofa: Sofa
zh_cn:
block_name:default:chinese_lantern: 灯笼
block_name:default:netherite_anvil: 下界合金砧
@@ -56,5 +56,5 @@ lang:
block_name:default:copper_coil: 铜线圈
block_name:default:chessboard_block: 棋盘方块
block_name:default:safe_block: 保险柜
block_name:default:sofa: 沙发
block_name:default:connectable_sofa: 沙发
block_name:default:sleeper_sofa: 沙发
block_name:default:sofa: 沙发

View File

@@ -69,7 +69,6 @@ items#misc:
overrides:
tags:
- minecraft:mineable/pickaxe
- minecraft:anvil
sounds:
break: minecraft:block.anvil.break
step: minecraft:block.anvil.step
@@ -587,10 +586,10 @@ items#misc:
step: minecraft:block.wood.step
tags:
- minecraft:mineable/axe
behavior:
type: bouncing_block
bounce-height: 0.66
sync-player-position: false
behaviors:
- type: bouncing_block
bounce-height: 0.66
sync-player-position: false
state:
id: 0
state: white_bed[facing=west,occupied=false,part=foot]
@@ -739,6 +738,116 @@ items#misc:
facing=west,shape=straight:
appearance: facing=west,shape=straight
id: 11
default:table_lamp:
material: nether_brick
custom-model-data: 3011
data:
item-name: <!i><i18n:item.table_lamp>
model:
type: minecraft:model
path: minecraft:item/custom/table_lamp
behavior:
type: block_item
block:
loot:
template: default:loot_table/self
settings:
template:
- default:sound/metal
overrides:
hardness: 1
resistance: 1
replaceable: false
is-redstone-conductor: false
is-suffocating: false
behaviors:
- type: toggleable_lamp_block
can-open-with-hand: true
- type: sturdy_base_block
direction: down
support-types:
- full
- center
states:
properties:
lit:
type: boolean
default: false
facing:
type: 4-direction
default: north
appearances:
east_off:
state: barrier
entity-renderer:
item: default:table_lamp
north_off:
state: barrier
entity-renderer:
item: default:table_lamp
yaw: -90
south_off:
state: barrier
entity-renderer:
item: default:table_lamp
yaw: 90
west_off:
state: barrier
entity-renderer:
item: default:table_lamp
yaw: 180
east_on:
state: barrier
entity-renderer:
item: default:table_lamp
north_on:
state: barrier
entity-renderer:
item: default:table_lamp
yaw: -90
south_on:
state: barrier
entity-renderer:
item: default:table_lamp
yaw: 90
west_on:
state: barrier
entity-renderer:
item: default:table_lamp
yaw: 180
variants:
facing=east,lit=false:
appearance: east_off
id: 12
facing=north,lit=false:
appearance: north_off
id: 13
facing=south,lit=false:
appearance: south_off
id: 14
facing=west,lit=false:
appearance: west_off
id: 15
facing=east,lit=true:
appearance: east_on
id: 16
settings:
luminance: 15
facing=north,lit=true:
appearance: north_on
id: 17
settings:
luminance: 15
facing=south,lit=true:
appearance: south_on
id: 18
settings:
luminance: 15
facing=west,lit=true:
appearance: west_on
id: 19
settings:
luminance: 15
recipes#misc:
default:chinese_lantern:
type: shaped

View File

@@ -52,10 +52,9 @@ categories:
default:furniture:
name: <!i><#FFD700><i18n:category.furniture></#FFD700>
hidden: true
icon: default:table_lamp
icon: default:flower_basket
list:
- default:bench
- default:table_lamp
- default:wooden_chair
- default:flower_basket
default:misc:
@@ -83,4 +82,5 @@ categories:
- default:sleeper_sofa
- minecraft:air
- minecraft:air
- default:sofa
- default:sofa
- default:table_lamp

View File

@@ -42,57 +42,6 @@ items:
template: default:loot_table/furniture
arguments:
item: default:bench
default:table_lamp:
material: nether_brick
custom-model-data: 2001
data:
item-name: <!i><i18n:item.table_lamp>
model:
type: minecraft:model
path: minecraft:item/custom/table_lamp
behavior:
type: furniture_item
furniture:
settings:
item: default:table_lamp
sounds:
break: minecraft:block.lantern.break
place: minecraft:block.lantern.place
placement:
ground:
loot-spawn-offset: 0,0.2,0
rules:
rotation: ANY
alignment: QUARTER
elements:
- item: default:table_lamp
display-transform: NONE
billboard: FIXED
translation: 0,0.5,0
rotation: 90
hitboxes:
- position: 0,0,0
type: interaction
blocks-building: true
width: 0.7
height: 0.1
interactive: true
- position: 0,0.1,-0.1
type: interaction
blocks-building: true
width: 0.1
height: 0.6
interactive: true
- position: 0,0.6,0.15
type: interaction
blocks-building: true
width: 0.4
height: 0.4
interactive: true
loot:
template: default:loot_table/furniture
arguments:
item: default:table_lamp
default:wooden_chair:
material: nether_brick
custom-model-data: 2002

View File

@@ -18,4 +18,9 @@ public interface EntityBlockBehavior {
default <T extends BlockEntity> BlockEntityTicker<T> createBlockEntityTicker(CEWorld level, ImmutableBlockState state, BlockEntityType<T> blockEntityType) {
return null;
}
@SuppressWarnings("unchecked")
static <E extends BlockEntity> BlockEntityTicker<E> createTickerHelper(BlockEntityTicker<? super E> ticker) {
return (BlockEntityTicker<E>) ticker;
}
}

View File

@@ -7,4 +7,5 @@ public final class BlockEntityTypeKeys {
public static final Key UNSAFE_COMPOSITE = Key.of("craftengine:unsafe_composite");
public static final Key SIMPLE_STORAGE = Key.of("craftengine:simple_storage");
public static final Key SEAT = Key.of("craftengine:seat");
}

View File

@@ -50,7 +50,7 @@ byte_buddy_version=1.17.5
ahocorasick_version=0.6.3
snake_yaml_version=2.5
anti_grief_version=0.20
nms_helper_version=1.0.82
nms_helper_version=1.0.83
evalex_version=3.5.0
reactive_streams_version=1.0.4
amazon_awssdk_version=2.33.1