9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-30 04:19:27 +00:00

局部修改

This commit is contained in:
XiaoMoMi
2025-06-28 17:20:37 +08:00
parent 225cc7e067
commit 83bd27e774
58 changed files with 255 additions and 341 deletions

View File

@@ -116,7 +116,7 @@ public final class CraftEngineBlocks {
if (success) {
FastNMS.INSTANCE.method$BlockStateBase$onPlace(blockState, worldServer, blockPos, oldBlockState, false);
if (playSound) {
SoundData data = block.sounds().placeSound();
SoundData data = block.settings().sounds().placeSound();
location.getWorld().playSound(location, data.id().toString(), SoundCategory.BLOCKS, data.volume().get(), data.pitch().get());
}
}
@@ -181,7 +181,7 @@ public final class CraftEngineBlocks {
}
}
if (playSound) {
world.playBlockSound(position, state.sounds().breakSound());
world.playBlockSound(position, state.settings().sounds().breakSound());
}
if (sendParticles) {
FastNMS.INSTANCE.method$Level$levelEvent(world.serverWorld(), WorldEvents.BLOCK_BREAK_EFFECT, LocationUtils.toBlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), state.customBlockState().registryId());

View File

@@ -41,7 +41,7 @@ import org.bukkit.inventory.ItemStack;
import java.util.Optional;
public class BlockEventListener implements Listener {
public final class BlockEventListener implements Listener {
private final BukkitCraftEngine plugin;
private final boolean enableNoteBlockCheck;
private final BukkitBlockManager manager;
@@ -175,7 +175,7 @@ public class BlockEventListener implements Listener {
}
// play sound
world.playBlockSound(position, state.sounds().breakSound());
world.playBlockSound(position, state.settings().sounds().breakSound());
}
} else {
// override vanilla block loots
@@ -263,7 +263,7 @@ public class BlockEventListener implements Listener {
if (cancellable.isCancelled()) {
return;
}
player.playSound(location, state.sounds().stepSound().id().toString(), SoundCategory.BLOCKS, state.sounds().stepSound().volume().get(), state.sounds().stepSound().pitch().get());
player.playSound(location, state.settings().sounds().stepSound().id().toString(), SoundCategory.BLOCKS, state.settings().sounds().stepSound().volume().get(), state.settings().sounds().stepSound().pitch().get());
} else if (Config.enableSoundSystem()) {
Object ownerBlock = BlockStateUtils.getBlockOwner(blockState);
if (this.manager.isBlockSoundRemoved(ownerBlock)) {

View File

@@ -25,6 +25,8 @@ import net.momirealms.craftengine.bukkit.util.KeyUtils;
import net.momirealms.craftengine.bukkit.util.RegistryUtils;
import net.momirealms.craftengine.bukkit.util.TagUtils;
import net.momirealms.craftengine.core.block.*;
import net.momirealms.craftengine.core.block.behavior.EmptyBlockBehavior;
import net.momirealms.craftengine.core.block.parser.BlockStateParser;
import net.momirealms.craftengine.core.block.properties.Properties;
import net.momirealms.craftengine.core.block.properties.Property;
import net.momirealms.craftengine.core.loot.LootTable;
@@ -65,7 +67,7 @@ import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
public class BukkitBlockManager extends AbstractBlockManager {
public final class BukkitBlockManager extends AbstractBlockManager {
private static BukkitBlockManager instance;
private final BukkitCraftEngine plugin;
private final BlockParser blockParser;
@@ -75,6 +77,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
// Minecraft objects
// Cached new blocks $ holders
private Map<Key, Integer> internalId2StateId;
private Map<Key, DelegatingBlock> registeredBlocks;
private Map<Integer, Object> stateId2BlockHolder;
// This map is used to change the block states that are not necessarily needed into a certain block state
private Map<Integer, Integer> blockAppearanceMapper;
@@ -93,7 +96,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
private BlockEventListener blockEventListener;
private FallingBlockRemoveListener fallingBlockRemoveListener;
// cached tag packet
protected Object cachedUpdateTagsPacket;
Object cachedUpdateTagsPacket;
private final List<Tuple<Object, Key, Boolean>> blocksToDeceive = new ArrayList<>();
@@ -144,6 +147,12 @@ public class BukkitBlockManager extends AbstractBlockManager {
super.unload();
if (EmptyBlock.STATE != null)
Arrays.fill(this.stateId2ImmutableBlockStates, EmptyBlock.STATE);
for (DelegatingBlock block : this.registeredBlocks.values()) {
block.behaviorDelegate().bindValue(EmptyBlockBehavior.INSTANCE);
block.shapeDelegate().bindValue(BukkitBlockShape.STONE);
DelegatingBlockState state = (DelegatingBlockState) FastNMS.INSTANCE.method$Block$defaultState(block);
state.setBlockState(null);
}
}
@Override
@@ -201,7 +210,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
@Nullable
public Object getMinecraftBlockHolder(int stateId) {
return stateId2BlockHolder.get(stateId);
return this.stateId2BlockHolder.get(stateId);
}
@NotNull
@@ -297,6 +306,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
ImmutableMap.Builder<Key, Integer> builder1 = ImmutableMap.builder();
ImmutableMap.Builder<Integer, Object> builder2 = ImmutableMap.builder();
ImmutableMap.Builder<Key, List<Integer>> builder3 = ImmutableMap.builder();
ImmutableMap.Builder<Key, DelegatingBlock> builder4 = ImmutableMap.builder();
Set<Object> affectedBlockSounds = new HashSet<>();
Map<Object, Pair<SoundData, SoundData>> affectedDoors = new IdentityHashMap<>();
Set<Object> affectedBlocks = new HashSet<>();
@@ -306,7 +316,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
int counter = 0;
for (Map.Entry<Key, Integer> baseBlockAndItsCount : this.registeredRealBlockSlots.entrySet()) {
counter = registerBlockVariants(baseBlockAndItsCount, counter, builder1, builder2, builder3, affectedBlockSounds, order);
counter = registerBlockVariants(baseBlockAndItsCount, counter, builder1, builder2, builder3, builder4, affectedBlockSounds, order);
}
freezeRegistry();
@@ -315,6 +325,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
this.internalId2StateId = builder1.build();
this.stateId2BlockHolder = builder2.build();
this.realBlockArranger = builder3.build();
this.registeredBlocks = builder4.build();
this.blockRegisterOrder = ImmutableList.copyOf(order);
for (Object block : (Iterable<Object>) MBuiltInRegistries.BLOCK) {
@@ -420,7 +431,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
// read states
Map<String, Property<?>> properties;
Map<String, Integer> appearances;
Map<String, VariantState> variants;
Map<String, BlockStateVariant> variants;
Map<String, Object> stateSection = MiscUtils.castToMap(ResourceConfigUtils.requireNonNullOrThrow(ResourceConfigUtils.get(section, "state", "states"), "warning.config.block.missing_state"), true);
boolean singleState = !stateSection.containsKey("properties");
@@ -435,7 +446,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
if (internalBlockRegistryId == -1) {
throw new LocalizedResourceConfigException("warning.config.block.state.invalid_real_id", internalBlockId.toString(), String.valueOf(availableAppearances(vanillaBlock.type()) - 1));
}
variants = Map.of("", new VariantState("", settings, internalBlockRegistryId));
variants = Map.of("", new BlockStateVariant("", settings, internalBlockRegistryId));
} else {
// properties
properties = getProperties(MiscUtils.castToMap(ResourceConfigUtils.requireNonNullOrThrow(stateSection.get("properties"), "warning.config.block.state.missing_properties"), true));
@@ -467,7 +478,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
throw new LocalizedResourceConfigException("warning.config.block.state.invalid_real_id", internalBlockId.toString(), String.valueOf(availableAppearances(baseBlock) - 1));
}
Map<String, Object> anotherSetting = MiscUtils.castToMap(variantSection.get("settings"), true);
variants.put(variantNBT, new VariantState(appearance, anotherSetting == null ? settings : BlockSettings.ofFullCopy(settings, anotherSetting), internalBlockRegistryId));
variants.put(variantNBT, new BlockStateVariant(appearance, anotherSetting == null ? settings : BlockSettings.ofFullCopy(settings, anotherSetting), internalBlockRegistryId));
}
}
}
@@ -544,6 +555,9 @@ public class BukkitBlockManager extends AbstractBlockManager {
return new VanillaBlockState(blockId, propertyNBT, vanillaBlockStateRegistryId);
}
public record VanillaBlockState(Key type, String properties, int registryId) {
}
private JsonObject getVariantModel(Map<String, Object> singleModelMap) {
JsonObject json = new JsonObject();
String modelPath = ResourceConfigUtils.requireNonEmptyStringOrThrow(singleModelMap.get("path"), "warning.config.block.state.model.missing_path");
@@ -763,6 +777,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
ImmutableMap.Builder<Key, Integer> builder1,
ImmutableMap.Builder<Integer, Object> builder2,
ImmutableMap.Builder<Key, List<Integer>> builder3,
ImmutableMap.Builder<Key, DelegatingBlock> builder4,
Set<Object> affectSoundTypes,
List<Key> order) throws Exception {
Key clientSideBlockType = blockWithCount.getKey();
@@ -803,6 +818,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
builder1.put(realBlockKey, stateId);
builder2.put(stateId, blockHolder);
builder4.put(realBlockKey, (DelegatingBlock) newRealBlock);
stateIds.add(stateId);
this.blocksToDeceive.add(Tuple.of(newRealBlock, clientSideBlockType, isNoteBlock));

View File

@@ -1,10 +1,12 @@
package net.momirealms.craftengine.bukkit.block;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBlocks;
import net.momirealms.craftengine.core.block.BlockShape;
import org.jetbrains.annotations.Nullable;
public class BukkitBlockShape implements BlockShape {
public final class BukkitBlockShape implements BlockShape {
public static final BukkitBlockShape STONE = new BukkitBlockShape(MBlocks.STONE$defaultState, null);
private final Object rawBlockState;
private final Object supportBlockState;

View File

@@ -13,6 +13,7 @@ import net.momirealms.craftengine.bukkit.util.SoundUtils;
import net.momirealms.craftengine.core.block.*;
import net.momirealms.craftengine.core.block.behavior.AbstractBlockBehavior;
import net.momirealms.craftengine.core.block.behavior.BlockBehaviors;
import net.momirealms.craftengine.core.block.behavior.EmptyBlockBehavior;
import net.momirealms.craftengine.core.block.properties.Property;
import net.momirealms.craftengine.core.loot.LootTable;
import net.momirealms.craftengine.core.plugin.CraftEngine;
@@ -30,16 +31,16 @@ import org.jetbrains.annotations.Nullable;
import java.util.*;
public class BukkitCustomBlock extends AbstractCustomBlock {
public final class BukkitCustomBlock extends AbstractCustomBlock {
private static final Object ALWAYS_FALSE = FastNMS.INSTANCE.method$StatePredicate$always(false);
private static final Object ALWAYS_TRUE = FastNMS.INSTANCE.method$StatePredicate$always(true);
protected BukkitCustomBlock(
private BukkitCustomBlock(
@NotNull Key id,
@NotNull Holder.Reference<CustomBlock> holder,
@NotNull Map<String, Property<?>> properties,
@NotNull Map<String, Integer> appearances,
@NotNull Map<String, VariantState> variantMapper,
@NotNull Map<String, BlockStateVariant> variantMapper,
@NotNull BlockSettings settings,
@NotNull Map<EventTrigger, List<Function<PlayerOptionalContext>>> events,
@Nullable List<Map<String, Object>> behavior,
@@ -81,8 +82,8 @@ public class BukkitCustomBlock extends AbstractCustomBlock {
CraftEngine.instance().logger().warn("Could not find custom block immutableBlockState for " + immutableBlockState + ". This might cause errors!");
continue;
}
CustomBlockStateHolder nmsState = (CustomBlockStateHolder) immutableBlockState.customBlockState().handle();
nmsState.setCustomBlockState(immutableBlockState);
DelegatingBlockState nmsState = (DelegatingBlockState) immutableBlockState.customBlockState().handle();
nmsState.setBlockState(immutableBlockState);
BlockSettings settings = immutableBlockState.settings();
// set block properties
@@ -108,8 +109,8 @@ public class BukkitCustomBlock extends AbstractCustomBlock {
CoreReflections.field$BlockStateBase$isViewBlocking.set(nmsState, settings.isViewBlocking() == Tristate.UNDEFINED ? settings.isSuffocating().asBoolean() ? ALWAYS_TRUE : ALWAYS_FALSE : (settings.isViewBlocking().asBoolean() ? ALWAYS_TRUE : ALWAYS_FALSE));
// set parent block properties
CraftEngineNMSBlock nmsBlock = (CraftEngineNMSBlock) BlockStateUtils.getBlockOwner(nmsState);
ObjectHolder<BlockShape> shapeHolder = nmsBlock.getShapeHolder();
DelegatingBlock nmsBlock = (DelegatingBlock) BlockStateUtils.getBlockOwner(nmsState);
ObjectHolder<BlockShape> shapeHolder = nmsBlock.shapeDelegate();
shapeHolder.bindValue(new BukkitBlockShape(immutableBlockState.vanillaBlockState().handle(), Optional.ofNullable(immutableBlockState.settings().supportShapeBlockState()).map(it -> {
try {
Object blockState = BlockStateUtils.blockDataToBlockState(Bukkit.createBlockData(it));
@@ -123,7 +124,7 @@ public class BukkitCustomBlock extends AbstractCustomBlock {
}
}).orElse(null)));
// bind behavior
ObjectHolder<BlockBehavior> behaviorHolder = nmsBlock.getBehaviorHolder();
ObjectHolder<BlockBehavior> behaviorHolder = nmsBlock.behaviorDelegate();
behaviorHolder.bindValue(super.behavior);
// set block side properties
CoreReflections.field$BlockBehaviour$explosionResistance.set(nmsBlock, settings.resistance());
@@ -196,7 +197,7 @@ public class BukkitCustomBlock extends AbstractCustomBlock {
protected final Key id;
protected Map<String, Property<?>> properties;
protected Map<String, Integer> appearances;
protected Map<String, VariantState> variantMapper;
protected Map<String, BlockStateVariant> variantMapper;
protected BlockSettings settings;
protected List<Map<String, Object>> behavior;
protected LootTable<?> lootTable;
@@ -243,7 +244,7 @@ public class BukkitCustomBlock extends AbstractCustomBlock {
}
@Override
public Builder variantMapper(Map<String, VariantState> variantMapper) {
public Builder variantMapper(Map<String, BlockStateVariant> variantMapper) {
this.variantMapper = variantMapper;
return this;
}

View File

@@ -17,7 +17,7 @@ import org.bukkit.event.Listener;
import java.util.Optional;
@SuppressWarnings("DuplicatedCode")
public class FallingBlockRemoveListener implements Listener {
public final class FallingBlockRemoveListener implements Listener {
@EventHandler
public void onFallingBlockBreak(org.bukkit.event.entity.EntityRemoveEvent event) {
@@ -41,7 +41,7 @@ public class FallingBlockRemoveListener implements Listener {
Object entityData = CoreReflections.field$Entity$entityData.get(fallingBlockEntity);
boolean isSilent = (boolean) CoreReflections.method$SynchedEntityData$get.invoke(entityData, CoreReflections.instance$Entity$DATA_SILENT);
if (!isSilent) {
world.playBlockSound(position, customState.sounds().destroySound());
world.playBlockSound(position, customState.settings().sounds().destroySound());
}
} catch (ReflectiveOperationException e) {
CraftEngine.instance().logger().warn("Failed to handle EntityRemoveEvent", e);

View File

@@ -34,7 +34,7 @@ public abstract class AbstractCanSurviveBlockBehavior extends BukkitBlockBehavio
if (!customState.isEmpty() && customState.owner().value() == this.customBlock) {
net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level));
WorldPosition position = new WorldPosition(world, Vec3d.atCenterOf(LocationUtils.fromBlockPos(blockPos)));
world.playBlockSound(position, customState.sounds().breakSound());
world.playBlockSound(position, customState.settings().sounds().breakSound());
FastNMS.INSTANCE.method$Level$destroyBlock(level, blockPos, true);
}
});
@@ -74,7 +74,7 @@ public abstract class AbstractCanSurviveBlockBehavior extends BukkitBlockBehavio
ImmutableBlockState customState = optionalCustomState.get();
net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level));
WorldPosition position = new WorldPosition(world, Vec3d.atCenterOf(pos));
world.playBlockSound(position, customState.sounds().breakSound());
world.playBlockSound(position, customState.settings().sounds().breakSound());
FastNMS.INSTANCE.method$Level$levelEvent(level, WorldEvents.BLOCK_BREAK_EFFECT, blockPos, customState.customBlockState().registryId());
return MBlocks.AIR$defaultState;
}

View File

@@ -1,7 +1,7 @@
package net.momirealms.craftengine.bukkit.block.behavior;
import net.momirealms.craftengine.core.block.EmptyBlockBehavior;
import net.momirealms.craftengine.core.block.behavior.BlockBehaviors;
import net.momirealms.craftengine.core.block.behavior.EmptyBlockBehavior;
import net.momirealms.craftengine.core.util.Key;
public class BukkitBlockBehaviors extends BlockBehaviors {

View File

@@ -110,7 +110,7 @@ public class DoorBlockBehavior extends AbstractCanSurviveBlockBehavior {
BlockPos pos = LocationUtils.fromBlockPos(blockPos);
net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level));
WorldPosition position = new WorldPosition(world, Vec3d.atCenterOf(pos));
world.playBlockSound(position, customState.sounds().breakSound());
world.playBlockSound(position, customState.settings().sounds().breakSound());
FastNMS.INSTANCE.method$Level$levelEvent(level, WorldEvents.BLOCK_BREAK_EFFECT, blockPos, customState.customBlockState().registryId());
return MBlocks.AIR$defaultState;
}

View File

@@ -97,7 +97,7 @@ public class FallingBlockBehavior extends BukkitBlockBehavior {
Object entityData = CoreReflections.field$Entity$entityData.get(fallingBlockEntity);
boolean isSilent = (boolean) CoreReflections.method$SynchedEntityData$get.invoke(entityData, CoreReflections.instance$Entity$DATA_SILENT);
if (!isSilent) {
world.playBlockSound(position, customState.sounds().destroySound());
world.playBlockSound(position, customState.settings().sounds().destroySound());
}
}
@@ -114,7 +114,7 @@ public class FallingBlockBehavior extends BukkitBlockBehavior {
if (immutableBlockState == null || immutableBlockState.isEmpty()) return;
if (!isSilent) {
net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level));
world.playBlockSound(Vec3d.atCenterOf(LocationUtils.fromBlockPos(pos)), immutableBlockState.sounds().landSound());
world.playBlockSound(Vec3d.atCenterOf(LocationUtils.fromBlockPos(pos)), immutableBlockState.settings().sounds().landSound());
}
}

View File

@@ -69,7 +69,7 @@ public class PressurePlateBlockBehavior extends BukkitBlockBehavior {
BlockPos pos = LocationUtils.fromBlockPos(blockPos);
net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level));
WorldPosition position = new WorldPosition(world, Vec3d.atCenterOf(pos));
world.playBlockSound(position, customState.sounds().breakSound());
world.playBlockSound(position, customState.settings().sounds().breakSound());
FastNMS.INSTANCE.method$Level$levelEvent(level, WorldEvents.BLOCK_BREAK_EFFECT, blockPos, customState.customBlockState().registryId());
return MBlocks.AIR$defaultState;
}

View File

@@ -163,7 +163,7 @@ public class BlockItemBehavior extends BlockBoundItemBehavior {
block.setPlacedBy(context, blockStateToPlace);
player.swingHand(context.getHand());
context.getLevel().playBlockSound(position, blockStateToPlace.sounds().placeSound());
context.getLevel().playBlockSound(position, blockStateToPlace.settings().sounds().placeSound());
world.sendGameEvent(bukkitPlayer, GameEvent.BLOCK_PLACE, new Vector(pos.x(), pos.y(), pos.z()));
return InteractionResult.SUCCESS;
}

View File

@@ -117,7 +117,7 @@ public class FurnitureItemBehavior extends ItemBehavior {
}
}
if (!BukkitCraftEngine.instance().antiGrief().canPlace(bukkitPlayer, furnitureLocation)) {
if (!BukkitCraftEngine.instance().antiGriefProvider().canPlace(bukkitPlayer, furnitureLocation)) {
return InteractionResult.FAIL;
}

View File

@@ -366,7 +366,7 @@ public class BukkitCraftEngine extends CraftEngine {
);
}
public AntiGriefLib antiGrief() {
public AntiGriefLib antiGriefProvider() {
if (this.antiGrief == null) {
this.antiGrief = AntiGriefLib.builder(this.javaPlugin)
.ignoreOP(true)

View File

@@ -2,8 +2,8 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature;
import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature;
import net.momirealms.craftengine.bukkit.util.BlockStateUtils;
import net.momirealms.craftengine.core.block.BlockStateParser;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
import net.momirealms.craftengine.core.block.parser.BlockStateParser;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager;
import net.momirealms.craftengine.core.plugin.command.FlagKeys;

View File

@@ -2,9 +2,9 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature;
import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks;
import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature;
import net.momirealms.craftengine.core.block.BlockStateParser;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
import net.momirealms.craftengine.core.block.UpdateOption;
import net.momirealms.craftengine.core.block.parser.BlockStateParser;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager;
import org.bukkit.Location;

View File

@@ -18,7 +18,11 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBlocks;
import net.momirealms.craftengine.bukkit.util.NoteBlockChainUpdateUtils;
import net.momirealms.craftengine.core.block.*;
import net.momirealms.craftengine.core.block.BlockBehavior;
import net.momirealms.craftengine.core.block.BlockKeys;
import net.momirealms.craftengine.core.block.BlockShape;
import net.momirealms.craftengine.core.block.DelegatingBlock;
import net.momirealms.craftengine.core.block.behavior.EmptyBlockBehavior;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.util.Key;
@@ -55,14 +59,14 @@ public final class BlockGenerator {
.defineField("isClientSideNoteBlock", boolean.class, Visibility.PUBLIC)
.defineField("isClientSideTripwire", boolean.class, Visibility.PUBLIC)
// should always implement this interface
.implement(DelegatingBlock.class)
.implement(CoreReflections.clazz$Fallable)
.implement(CoreReflections.clazz$BonemealableBlock)
.implement(CoreReflections.clazz$SimpleWaterloggedBlock)
// internal interfaces
.implement(CraftEngineNMSBlock.class)
.method(ElementMatchers.named("getBehaviorHolder"))
.method(ElementMatchers.named("behaviorDelegate"))
.intercept(FieldAccessor.ofField("behaviorHolder"))
.method(ElementMatchers.named("getShapeHolder"))
.method(ElementMatchers.named("shapeDelegate"))
.intercept(FieldAccessor.ofField("shapeHolder"))
.method(ElementMatchers.named("isNoteBlock"))
.intercept(FieldAccessor.ofField("isClientSideNoteBlock"))
@@ -218,8 +222,8 @@ public final class BlockGenerator {
@RuntimeType
public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ChainUpdateBlockIndicator indicator = (ChainUpdateBlockIndicator) thisObj;
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
DelegatingBlock indicator = (DelegatingBlock) thisObj;
// todo chain updater
if (indicator.isNoteBlock()) {
if (CoreReflections.clazz$ServerLevel.isInstance(args[levelIndex])) {
@@ -260,7 +264,7 @@ public final class BlockGenerator {
@RuntimeType
public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) throws Exception {
ObjectHolder<BlockShape> holder = ((ShapeHolder) thisObj).getShapeHolder();
ObjectHolder<BlockShape> holder = ((DelegatingBlock) thisObj).shapeDelegate();
try {
return holder.value().getShape(thisObj, args);
} catch (Exception e) {
@@ -275,7 +279,7 @@ public final class BlockGenerator {
@RuntimeType
public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) throws Exception {
ObjectHolder<BlockShape> holder = ((ShapeHolder) thisObj).getShapeHolder();
ObjectHolder<BlockShape> holder = ((DelegatingBlock) thisObj).shapeDelegate();
try {
return holder.value().getCollisionShape(thisObj, args);
} catch (Exception e) {
@@ -290,7 +294,7 @@ public final class BlockGenerator {
@RuntimeType
public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) throws Exception {
ObjectHolder<BlockShape> holder = ((ShapeHolder) thisObj).getShapeHolder();
ObjectHolder<BlockShape> holder = ((DelegatingBlock) thisObj).shapeDelegate();
try {
return holder.value().getSupportShape(thisObj, args);
} catch (Exception e) {
@@ -305,7 +309,7 @@ public final class BlockGenerator {
@RuntimeType
public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) throws Exception {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
return holder.value().isPathFindable(thisObj, args, superMethod);
} catch (Exception e) {
@@ -320,7 +324,7 @@ public final class BlockGenerator {
@RuntimeType
public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) throws Exception {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
return holder.value().mirror(thisObj, args, superMethod);
} catch (Exception e) {
@@ -335,7 +339,7 @@ public final class BlockGenerator {
@RuntimeType
public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) throws Exception {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
return holder.value().rotate(thisObj, args, superMethod);
} catch (Exception e) {
@@ -350,7 +354,7 @@ public final class BlockGenerator {
@RuntimeType
public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
holder.value().randomTick(thisObj, args, superMethod);
} catch (Exception e) {
@@ -364,7 +368,7 @@ public final class BlockGenerator {
@RuntimeType
public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
holder.value().tick(thisObj, args, superMethod);
} catch (Exception e) {
@@ -378,7 +382,7 @@ public final class BlockGenerator {
@RuntimeType
public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
holder.value().onPlace(thisObj, args, superMethod);
} catch (Exception e) {
@@ -392,7 +396,7 @@ public final class BlockGenerator {
@RuntimeType
public void intercept(@This Object thisObj, @AllArguments Object[] args) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
holder.value().onLand(thisObj, args);
} catch (Exception e) {
@@ -406,7 +410,7 @@ public final class BlockGenerator {
@RuntimeType
public void intercept(@This Object thisObj, @AllArguments Object[] args) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
holder.value().onBrokenAfterFall(thisObj, args);
} catch (Exception e) {
@@ -420,7 +424,7 @@ public final class BlockGenerator {
@RuntimeType
public boolean intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
return holder.value().canSurvive(thisObj, args, superMethod);
} catch (Exception e) {
@@ -435,7 +439,7 @@ public final class BlockGenerator {
@RuntimeType
public boolean intercept(@This Object thisObj, @AllArguments Object[] args) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
return holder.value().isBoneMealSuccess(thisObj, args);
} catch (Exception e) {
@@ -450,7 +454,7 @@ public final class BlockGenerator {
@RuntimeType
public boolean intercept(@This Object thisObj, @AllArguments Object[] args) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
return holder.value().isValidBoneMealTarget(thisObj, args);
} catch (Exception e) {
@@ -465,7 +469,7 @@ public final class BlockGenerator {
@RuntimeType
public void intercept(@This Object thisObj, @AllArguments Object[] args) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
holder.value().performBoneMeal(thisObj, args);
} catch (Exception e) {
@@ -479,7 +483,7 @@ public final class BlockGenerator {
@RuntimeType
public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
holder.value().neighborChanged(thisObj, args, superMethod);
} catch (Exception e) {
@@ -493,7 +497,7 @@ public final class BlockGenerator {
@RuntimeType
public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
holder.value().onExplosionHit(thisObj, args, superMethod);
} catch (Exception e) {
@@ -507,7 +511,7 @@ public final class BlockGenerator {
@RuntimeType
public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
return holder.value().pickupBlock(thisObj, args, () -> CoreReflections.instance$ItemStack$EMPTY);
} catch (Exception e) {
@@ -522,7 +526,7 @@ public final class BlockGenerator {
@RuntimeType
public boolean intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) throws Exception {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
return holder.value().placeLiquid(thisObj, args, superMethod);
} catch (Exception e) {
@@ -537,7 +541,7 @@ public final class BlockGenerator {
@RuntimeType
public boolean intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
return holder.value().canPlaceLiquid(thisObj, args, superMethod);
} catch (Exception e) {
@@ -552,7 +556,7 @@ public final class BlockGenerator {
@RuntimeType
public int intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
return holder.value().getDirectSignal(thisObj, args, superMethod);
} catch (Exception e) {
@@ -567,7 +571,7 @@ public final class BlockGenerator {
@RuntimeType
public int intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
return holder.value().getSignal(thisObj, args, superMethod);
} catch (Exception e) {
@@ -582,7 +586,7 @@ public final class BlockGenerator {
@RuntimeType
public boolean intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
return holder.value().isSignalSource(thisObj, args, superMethod);
} catch (Exception e) {
@@ -597,7 +601,7 @@ public final class BlockGenerator {
@RuntimeType
public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
holder.value().affectNeighborsAfterRemoval(thisObj, args, superMethod);
} catch (Exception e) {
@@ -611,7 +615,7 @@ public final class BlockGenerator {
@RuntimeType
public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
try {
holder.value().entityInside(thisObj, args, superMethod);
} catch (Exception e) {

View File

@@ -21,7 +21,7 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MLootContex
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.bukkit.world.BukkitWorld;
import net.momirealms.craftengine.core.block.BlockSettings;
import net.momirealms.craftengine.core.block.CustomBlockStateHolder;
import net.momirealms.craftengine.core.block.DelegatingBlockState;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.plugin.context.ContextHolder;
@@ -48,10 +48,10 @@ public final class BlockStateGenerator {
.subclass(CoreReflections.clazz$BlockState, ConstructorStrategy.Default.IMITATE_SUPER_CLASS_OPENING)
.name(generatedStateClassName)
.defineField("immutableBlockState", ImmutableBlockState.class, Visibility.PUBLIC)
.implement(CustomBlockStateHolder.class)
.method(ElementMatchers.named("customBlockState"))
.implement(DelegatingBlockState.class)
.method(ElementMatchers.named("blockState"))
.intercept(FieldAccessor.ofField("immutableBlockState"))
.method(ElementMatchers.named("setCustomBlockState"))
.method(ElementMatchers.named("setBlockState"))
.intercept(FieldAccessor.ofField("immutableBlockState"))
.method(ElementMatchers.is(CoreReflections.method$BlockStateBase$getDrops))
.intercept(MethodDelegation.to(GetDropsInterceptor.INSTANCE));
@@ -77,7 +77,7 @@ public final class BlockStateGenerator {
@RuntimeType
public Object intercept(@This Object thisObj, @AllArguments Object[] args) {
ImmutableBlockState state = ((CustomBlockStateHolder) thisObj).customBlockState();
ImmutableBlockState state = ((DelegatingBlockState) thisObj).blockState();
if (state == null) return List.of();
Object builder = args[0];
Object vec3 = FastNMS.INSTANCE.method$LootParams$Builder$getOptionalParameter(builder, MLootContextParams.ORIGIN);

View File

@@ -1551,7 +1551,7 @@ public class PacketConsumers {
if (EventUtils.fireAndCheckCancel(preBreakEvent))
return;
if (!BukkitCraftEngine.instance().antiGrief().canBreak(platformPlayer, location))
if (!BukkitCraftEngine.instance().antiGriefProvider().canBreak(platformPlayer, location))
return;
FurnitureBreakEvent breakEvent = new FurnitureBreakEvent(serverPlayer.platformPlayer(), furniture);

View File

@@ -7,7 +7,7 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBlocks;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInRegistries;
import net.momirealms.craftengine.core.block.BlockSettings;
import net.momirealms.craftengine.core.block.BlockStateWrapper;
import net.momirealms.craftengine.core.block.CustomBlockStateHolder;
import net.momirealms.craftengine.core.block.DelegatingBlockState;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.util.Key;
@@ -117,11 +117,11 @@ public class BlockStateUtils {
}
public static boolean isVanillaBlock(Object state) {
return !(state instanceof CustomBlockStateHolder);
return !(state instanceof DelegatingBlockState);
}
public static boolean isCustomBlock(Object state) {
return state instanceof CustomBlockStateHolder;
return state instanceof DelegatingBlockState;
}
public static boolean isVanillaBlock(int id) {
@@ -133,8 +133,8 @@ public class BlockStateUtils {
}
public static Optional<ImmutableBlockState> getOptionalCustomBlockState(Object state) {
if (state instanceof CustomBlockStateHolder holder) {
return Optional.ofNullable(holder.customBlockState());
if (state instanceof DelegatingBlockState holder) {
return Optional.ofNullable(holder.blockState());
} else {
return Optional.empty();
}