diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index 3f0da67b9..4c2938cb0 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -297,4 +297,5 @@ warning.config.conflict_matcher.all_of.missing_terms: "Issue found in co warning.config.conflict_matcher.any_of.missing_terms: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - Missing required 'terms' argument for 'any_of' matcher." warning.config.conflict_resolution.missing_type: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - Missing required 'type' argument for one of the resolutions." warning.config.conflict_resolution.invalid_type: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - One of the resolutions is using the invalid type ''." -warning.config.function.command.missing_command: "Issue found in file - The config '' is missing the required 'command' argument for 'command' function." \ No newline at end of file +warning.config.function.command.missing_command: "Issue found in file - The config '' is missing the required 'command' argument for 'command' function." +warning.config.event.invalid_trigger: "Issue found in file - The config '' is using an invalid event trigger ''." \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java index 8bd60c4c7..af14fc4d1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java @@ -26,6 +26,10 @@ import net.momirealms.craftengine.core.pack.model.generation.ModelGeneration; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.ConfigParser; +import net.momirealms.craftengine.core.plugin.context.PlayerBlockActionContext; +import net.momirealms.craftengine.core.plugin.context.function.Function; +import net.momirealms.craftengine.core.plugin.event.BlockEventFunctions; +import net.momirealms.craftengine.core.plugin.event.EventTrigger; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.registry.BuiltInRegistries; @@ -421,6 +425,37 @@ public class BukkitBlockManager extends AbstractBlockManager { } } + Object eventsObj = ResourceConfigUtils.get(section, "events"); + EnumMap>> events = new EnumMap<>(EventTrigger.class); + if (eventsObj instanceof Map eventsSection) { + Map eventsSectionMap = MiscUtils.castToMap(eventsSection, false); + for (Map.Entry eventEntry : eventsSectionMap.entrySet()) { + try { + EventTrigger eventTrigger = EventTrigger.valueOf(eventEntry.getKey().toUpperCase(Locale.ENGLISH)); + if (eventEntry.getValue() instanceof List list) { + if (list.size() == 1) { + events.put(eventTrigger, List.of(BlockEventFunctions.fromMap(MiscUtils.castToMap(list.get(0), false)))); + } else if (list.size() == 2) { + events.put(eventTrigger, List.of( + BlockEventFunctions.fromMap(MiscUtils.castToMap(list.get(0), false)), + BlockEventFunctions.fromMap(MiscUtils.castToMap(list.get(1), false)) + )); + } else { + List> eventsList = new ArrayList<>(); + for (Object event : list) { + eventsList.add(BlockEventFunctions.fromMap(MiscUtils.castToMap(event, false))); + } + events.put(eventTrigger, eventsList); + } + } else if (eventEntry.getValue() instanceof Map eventSection) { + events.put(eventTrigger, List.of(BlockEventFunctions.fromMap(MiscUtils.castToMap(eventSection, false)))); + } + } catch (IllegalArgumentException e) { + throw new LocalizedResourceConfigException("warning.config.event.invalid_trigger", eventEntry.getKey()); + } + } + } + Map behaviors = MiscUtils.castToMap(section.getOrDefault("behavior", Map.of()), false); CustomBlock block = BukkitCustomBlock.builder(id) .appearances(appearances) @@ -429,6 +464,7 @@ public class BukkitBlockManager extends AbstractBlockManager { .properties(properties) .settings(settings) .behavior(behaviors) + .events(events) .build(); // bind appearance and real state diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java index 209e34662..e0c550bdf 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java @@ -9,6 +9,9 @@ import net.momirealms.craftengine.core.block.*; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.context.PlayerBlockActionContext; +import net.momirealms.craftengine.core.plugin.context.function.Function; +import net.momirealms.craftengine.core.plugin.event.EventTrigger; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.WritableRegistry; @@ -19,12 +22,11 @@ import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.shared.ObjectHolder; import net.momirealms.craftengine.shared.block.BlockBehavior; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.lang.reflect.Field; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; public class BukkitCustomBlock extends CustomBlock { @@ -35,10 +37,11 @@ public class BukkitCustomBlock extends CustomBlock { Map appearances, Map variantMapper, BlockSettings settings, - Map behavior, + @NotNull EnumMap>> events, + @Nullable Map behavior, @Nullable LootTable lootTable ) { - super(id, holder, properties, appearances, variantMapper, settings, behavior, lootTable); + super(id, holder, properties, appearances, variantMapper, settings, events, behavior, lootTable); } @SuppressWarnings("unchecked") @@ -158,7 +161,7 @@ public class BukkitCustomBlock extends CustomBlock { // create or get block holder Holder.Reference holder = BuiltInRegistries.BLOCK.get(id).orElseGet(() -> ((WritableRegistry) BuiltInRegistries.BLOCK).registerForHolder(new ResourceKey<>(BuiltInRegistries.BLOCK.key().location(), id))); - return new BukkitCustomBlock(id, holder, properties, appearances, variantMapper, settings, behavior, lootTable); + return new BukkitCustomBlock(id, holder, properties, appearances, variantMapper, settings, events, behavior, lootTable); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java b/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java index ced0f7f7e..b30236ae6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java @@ -6,6 +6,9 @@ import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.context.PlayerBlockActionContext; +import net.momirealms.craftengine.core.plugin.context.function.Function; +import net.momirealms.craftengine.core.plugin.event.EventTrigger; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; @@ -15,10 +18,7 @@ import net.momirealms.sparrow.nbt.Tag; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.BiFunction; public abstract class CustomBlock { @@ -29,6 +29,7 @@ public abstract class CustomBlock { protected final BlockBehavior behavior; protected final List> placements; protected final ImmutableBlockState defaultState; + protected final EnumMap>> events; @Nullable protected final LootTable lootTable; @@ -39,6 +40,7 @@ public abstract class CustomBlock { @NotNull Map appearances, @NotNull Map variantMapper, @NotNull BlockSettings settings, + @NotNull EnumMap>> events, @Nullable Map behavior, @Nullable LootTable lootTable ) { @@ -48,6 +50,7 @@ public abstract class CustomBlock { this.lootTable = lootTable; this.properties = properties; this.placements = new ArrayList<>(); + this.events = events; this.variantProvider = new BlockStateVariantProvider(holder, ImmutableBlockState::new, properties); this.defaultState = this.variantProvider.getDefaultState(); this.behavior = BlockBehaviors.fromMap(this, behavior); @@ -168,11 +171,17 @@ public abstract class CustomBlock { protected BlockSettings settings; protected Map behavior; protected LootTable lootTable; + protected EnumMap>> events; protected Builder(Key id) { this.id = id; } + public Builder events(EnumMap>> events) { + this.events = events; + return this; + } + public Builder appearances(Map appearances) { this.appearances = appearances; return this; diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/EmptyBlock.java b/core/src/main/java/net/momirealms/craftengine/core/block/EmptyBlock.java index 4f827823b..4e5cca009 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/EmptyBlock.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/EmptyBlock.java @@ -1,8 +1,10 @@ package net.momirealms.craftengine.core.block; +import net.momirealms.craftengine.core.plugin.event.EventTrigger; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; +import java.util.EnumMap; import java.util.Map; public class EmptyBlock extends CustomBlock { @@ -10,7 +12,7 @@ public class EmptyBlock extends CustomBlock { public static ImmutableBlockState STATE; public EmptyBlock(Key id, Holder.Reference holder) { - super(id, holder, Map.of(), Map.of(), Map.of(), BlockSettings.of(), null, null); + super(id, holder, Map.of(), Map.of(), Map.of(), BlockSettings.of(), new EnumMap<>(EventTrigger.class), null, null); INSTANCE = this; STATE = defaultState(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/InactiveCustomBlock.java b/core/src/main/java/net/momirealms/craftengine/core/block/InactiveCustomBlock.java index db164c62e..a733f2bfd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/InactiveCustomBlock.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/InactiveCustomBlock.java @@ -1,10 +1,12 @@ package net.momirealms.craftengine.core.block; import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; +import net.momirealms.craftengine.core.plugin.event.EventTrigger; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; import net.momirealms.sparrow.nbt.CompoundTag; +import java.util.EnumMap; import java.util.HashMap; import java.util.Map; @@ -12,7 +14,7 @@ public class InactiveCustomBlock extends CustomBlock { private final Map cachedData = new HashMap<>(); public InactiveCustomBlock(Key id, Holder.Reference holder) { - super(id, holder, Map.of(), Map.of(), Map.of(), BlockSettings.of(), null, null); + super(id, holder, Map.of(), Map.of(), Map.of(), BlockSettings.of(), new EnumMap<>(EventTrigger.class), null, null); } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java index af0524d2a..09d5eadc1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java @@ -28,7 +28,7 @@ public class ItemBehaviors { Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); ItemBehaviorFactory factory = BuiltInRegistries.ITEM_BEHAVIOR_FACTORY.getValue(key); if (factory == null) { - throw new LocalizedResourceConfigException("warning.config.item.behavior.invalid_type", type.toString()); + throw new LocalizedResourceConfigException("warning.config.item.behavior.invalid_type", type); } return factory.create(pack, path, id, map); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/EventTrigger.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/EventTrigger.java index 2ea3421eb..5d26f6c1f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/EventTrigger.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/EventTrigger.java @@ -4,5 +4,5 @@ public enum EventTrigger { USE_ITEM, USE_ITEM_ON, CONSUME, - + BREAK } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MCUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/MCUtils.java index ed472a652..869229f26 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/MCUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MCUtils.java @@ -185,17 +185,12 @@ public class MCUtils { return next; } - public static int floor(float value) { - int i = (int) value; - return value < (float)i ? i - 1 : i; - } - public static byte packDegrees(float degrees) { - return (byte)floor(degrees * 256.0F / 360.0F); + return (byte) fastFloor(degrees * 256.0F / 360.0F); } public static float unpackDegrees(byte degrees) { - return (float)(degrees * 360) / 256.0F; + return (float) (degrees * 360) / 256.0F; } public static int clamp(int value, int min, int max) {