From 79c441c0e06afda83f8574568798fd48c7ecb22f Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 6 May 2025 02:34:03 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84context=20again?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/util/LegacyAttributeUtils.java | 7 ++ .../src/main/resources/translations/en.yml | 3 +- .../bukkit/api/CraftEngineBlocks.java | 5 +- .../bukkit/api/CraftEngineFurniture.java | 5 +- .../bukkit/block/BlockEventListener.java | 18 ++--- .../block/FallingBlockRemoveListener.java | 2 +- .../block/behavior/BushBlockBehavior.java | 2 +- .../block/behavior/CropBlockBehavior.java | 16 ++-- .../block/behavior/FallingBlockBehavior.java | 2 +- .../block/behavior/LeavesBlockBehavior.java | 2 +- .../behavior/SugarCaneBlockBehavior.java | 2 +- .../bukkit/entity/BukkitEntity.java | 7 ++ .../bukkit/loot/BukkitVanillaLootManager.java | 10 +-- .../bukkit/plugin/BukkitCraftEngine.java | 1 + .../bukkit/plugin/BukkitPlatform.java | 12 +++ .../plugin/user/BukkitServerPlayer.java | 16 ++++ .../core/block/ImmutableBlockState.java | 10 ++- .../craftengine/core/entity/Entity.java | 8 ++ .../core/entity/player/Player.java | 10 +++ .../recipe/CustomSmithingTransformRecipe.java | 12 +-- .../loot/{condition => }/LootConditions.java | 25 +++--- .../craftengine/core/loot/LootContext.java | 23 ++++-- .../craftengine/core/loot/LootPool.java | 1 - .../craftengine/core/loot/LootTable.java | 8 +- .../entry/AlternativesLootEntryContainer.java | 2 +- .../loot/entry/ExpLootEntryContainer.java | 2 +- .../entry/SingleItemLootEntryContainer.java | 2 +- ...ount.java => ApplyBonusCountFunction.java} | 12 +-- ...ctionDropExp.java => DropExpFunction.java} | 8 +- ...Decay.java => ExplosionDecayFunction.java} | 8 +- .../core/loot/function/LootFunctions.java | 8 +- ...ionSetCount.java => SetCountFunction.java} | 8 +- .../conflict/matcher/PathMatcherContains.java | 4 +- .../conflict/matcher/PathMatcherExact.java | 4 +- .../conflict/matcher/PathMatcherFilename.java | 4 +- .../matcher/PathMatcherParentPrefix.java | 4 +- .../matcher/PathMatcherParentSuffix.java | 4 +- .../pack/conflict/matcher/PathMatchers.java | 27 ++++--- .../conflict/matcher/PathPatternMatcher.java | 4 +- .../craftengine/core/plugin/CraftEngine.java | 6 ++ .../craftengine/core/plugin/Platform.java | 6 ++ .../craftengine/core/plugin/Plugin.java | 2 + .../plugin/context/AbstractCommonContext.java | 14 ++-- .../core/plugin/context/Context.java | 2 - .../core/plugin/context/ContextHolder.java | 2 +- .../context/PlayerFurnitureActionContext.java | 20 +++++ .../plugin/context/PlayerOptionalContext.java | 4 +- .../plugin/context/RelationalContext.java | 12 +++ .../core/plugin/context/SimpleContext.java | 12 +++ .../core/plugin/context/ViewerContext.java | 67 ++++++++++++++++ .../context/condition/AllOfCondition.java | 3 +- .../context/condition/AnyOfCondition.java | 3 +- .../context/condition/CommonConditions.java | 1 + .../context/condition/ConditionFactory.java | 11 +++ .../context/condition/DistanceCondition.java | 65 ++++++++++++++++ .../context/condition/EmptyCondition.java | 3 +- .../condition/EnchantmentCondition.java | 7 +- .../condition/FallingBlockCondition.java | 3 +- .../context/condition/InvertedCondition.java | 3 +- .../MatchBlockPropertyCondition.java | 7 +- .../context/condition/MatchItemCondition.java | 7 +- .../context/condition/RandomCondition.java | 23 ++++-- .../condition/SurvivesExplosionCondition.java | 3 +- .../condition/TableBonusCondition.java | 7 +- .../function/AbstractConditionalFunction.java | 55 +++++++++++++ .../context/function/CommandFunction.java | 78 +++++++++++++++++++ .../context/function/CommonFunctions.java | 8 ++ .../plugin/context/function/Function.java | 11 +++ .../context/parameter/CommonParameters.java | 2 - .../parameter/PlayerParameterProvider.java | 4 + .../context/parameter/PlayerParameters.java | 5 ++ .../context/selector/AllPlayerSelector.java | 58 ++++++++++++++ .../context/selector/PlayerSelector.java | 14 ++++ .../context/selector/PlayerSelectors.java | 21 +++++ .../context/selector/SelfPlayerSelector.java | 21 +++++ .../context/text/PlainTextProvider.java | 26 +++++++ .../plugin/context/text/TagTextProvider.java | 29 +++++++ .../plugin/context/text/TextProvider.java | 11 +++ .../plugin/context/text/TextProviders.java | 15 ++++ .../plugin/event/BlockEventConditions.java | 33 ++++++++ .../plugin/event/BlockEventFunctions.java | 40 ++++++++++ .../core/plugin/event/EventTrigger.java | 8 ++ .../core/plugin/event/Trigger.java | 15 ---- .../core/plugin/event/Triggers.java | 21 ----- .../core/plugin/network/NetworkManager.java | 2 +- .../text/minimessage/ExpressionTag.java | 59 ++++++++++++++ .../core/plugin/text/minimessage/I18NTag.java | 4 +- .../plugin/text/minimessage/ImageTag.java | 4 +- .../text/minimessage/IndexedArgumentTag.java | 5 +- .../text/minimessage/NamedArgumentTag.java | 5 +- .../text/minimessage/PlaceholderTag.java | 2 +- .../plugin/text/minimessage/ShiftTag.java | 2 +- .../minimessage/ViewerNamedArgumentTag.java | 16 ++++ .../minimessage/ViewerPlaceholderTag.java | 17 ++++ .../core/registry/BuiltInRegistries.java | 19 +++-- .../craftengine/core/registry/Registries.java | 15 ++-- .../momirealms/craftengine/core/util/Key.java | 8 +- gradle.properties | 4 +- 98 files changed, 1022 insertions(+), 216 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java rename core/src/main/java/net/momirealms/craftengine/core/loot/{condition => }/LootConditions.java (76%) rename core/src/main/java/net/momirealms/craftengine/core/loot/function/{LootFunctionApplyBonusCount.java => ApplyBonusCountFunction.java} (93%) rename core/src/main/java/net/momirealms/craftengine/core/loot/function/{LootFunctionDropExp.java => DropExpFunction.java} (84%) rename core/src/main/java/net/momirealms/craftengine/core/loot/function/{LootFunctionExplosionDecay.java => ExplosionDecayFunction.java} (85%) rename core/src/main/java/net/momirealms/craftengine/core/loot/function/{LootFunctionSetCount.java => SetCountFunction.java} (83%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerFurnitureActionContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/RelationalContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/SimpleContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/ViewerContext.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/ConditionFactory.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/DistanceCondition.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/AbstractConditionalFunction.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/Function.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/AllPlayerSelector.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelector.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelectors.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/SelfPlayerSelector.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/PlainTextProvider.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TagTextProvider.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProvider.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProviders.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventConditions.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventFunctions.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/event/EventTrigger.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/event/Trigger.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/event/Triggers.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ExpressionTag.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerNamedArgumentTag.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerPlaceholderTag.java diff --git a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAttributeUtils.java b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAttributeUtils.java index 46552b43f..639c83553 100644 --- a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAttributeUtils.java +++ b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAttributeUtils.java @@ -1,13 +1,20 @@ package net.momirealms.craftengine.bukkit.util; import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Player; import java.util.Objects; +import java.util.Optional; public class LegacyAttributeUtils { public static void setMaxHealth(ArmorStand entity) { Objects.requireNonNull(entity.getAttribute(Attribute.GENERIC_MAX_HEALTH)).setBaseValue(0.01); } + + public static double getLuck(Player player) { + return Optional.ofNullable(player.getAttribute(Attribute.GENERIC_LUCK)).map(AttributeInstance::getValue).orElse(1d); + } } diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index 6011167dd..5e545aeb3 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -291,4 +291,5 @@ warning.config.conflict_matcher.inverted.missing_term: "Issue found in c warning.config.conflict_matcher.all_of.missing_terms: "Issue found in config.yml at 'resource-pack.duplicated-files-handler' - Missing required 'terms' argument for 'all_of' matcher." 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 ''." \ No newline at end of file +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 diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java index 49a12d9ca..17a8d21b4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java @@ -10,7 +10,6 @@ import net.momirealms.craftengine.bukkit.world.BukkitWorld; import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.UpdateOption; -import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; @@ -176,9 +175,9 @@ public final class CraftEngineBlocks { BukkitServerPlayer serverPlayer = BukkitCraftEngine.instance().adapt(player); if (player != null) { builder.withParameter(CommonParameters.PLAYER, serverPlayer); - builder.withOptionalParameter(CommonParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); + //mark item builder.withOptionalParameter(CommonParameters.MAIN_HAND_ITEM, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); } - for (Item item : state.getDrops(builder, world)) { + for (Item item : state.getDrops(builder, world, serverPlayer)) { world.dropItemNaturally(vec3d, item); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java index 96b537084..134fda9a6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java @@ -9,7 +9,6 @@ import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.bukkit.world.BukkitWorld; import net.momirealms.craftengine.core.entity.furniture.AnchorType; import net.momirealms.craftengine.core.entity.furniture.CustomFurniture; -import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.plugin.context.ContextHolder; @@ -275,9 +274,9 @@ public final class CraftEngineFurniture { builder.withParameter(CommonParameters.WORLD, world); if (player != null) { builder.withParameter(CommonParameters.PLAYER, player); - builder.withOptionalParameter(CommonParameters.TOOL, player.getItemInHand(InteractionHand.MAIN_HAND)); + //mark item builder.withOptionalParameter(CommonParameters.MAIN_HAND_ITEM, player.getItemInHand(InteractionHand.MAIN_HAND)); } - List> items = lootTable.getRandomItems(builder.build(), world); + List> items = lootTable.getRandomItems(builder.build(), world, player); for (Item item : items) { world.dropItemNaturally(vec3d, item); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java index edb48354b..a31e0023a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -153,9 +153,9 @@ public class BlockEventListener implements Listener { ContextHolder.Builder builder = ContextHolder.builder() .withParameter(CommonParameters.WORLD, world) .withParameter(CommonParameters.LOCATION, vec3d) - .withParameter(CommonParameters.PLAYER, serverPlayer) - .withOptionalParameter(CommonParameters.TOOL, itemInHand); - for (Item item : state.getDrops(builder, world)) { + .withParameter(CommonParameters.PLAYER, serverPlayer); + //mark item .withOptionalParameter(CommonParameters.MAIN_HAND_ITEM, itemInHand); + for (Item item : state.getDrops(builder, world, serverPlayer)) { world.dropItemNaturally(vec3d, item); } } @@ -174,11 +174,11 @@ public class BlockEventListener implements Listener { ContextHolder.Builder builder = ContextHolder.builder() .withParameter(CommonParameters.WORLD, world) .withParameter(CommonParameters.LOCATION, vec3d) - .withParameter(CommonParameters.PLAYER, serverPlayer) - .withOptionalParameter(CommonParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); + .withParameter(CommonParameters.PLAYER, serverPlayer); + //mark item .withOptionalParameter(CommonParameters.MAIN_HAND_ITEM, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); ContextHolder contextHolder = builder.build(); for (LootTable lootTable : it.lootTables()) { - for (Item item : lootTable.getRandomItems(contextHolder, world)) { + for (Item item : lootTable.getRandomItems(contextHolder, world, serverPlayer)) { world.dropItemNaturally(vec3d, item); } } @@ -216,7 +216,7 @@ public class BlockEventListener implements Listener { ContextHolder.Builder builder = ContextHolder.builder() .withParameter(CommonParameters.WORLD, world) .withParameter(CommonParameters.LOCATION, vec3d); - for (Item item : immutableBlockState.getDrops(builder, world)) { + for (Item item : immutableBlockState.getDrops(builder, world, null)) { world.dropItemNaturally(vec3d, item); } } @@ -236,7 +236,7 @@ public class BlockEventListener implements Listener { builder.withParameter(CommonParameters.LOCATION, vec3d); ContextHolder contextHolder = builder.build(); for (LootTable lootTable : it.lootTables()) { - for (Item item : lootTable.getRandomItems(contextHolder, world)) { + for (Item item : lootTable.getRandomItems(contextHolder, world, null)) { world.dropItemNaturally(vec3d, item); } } @@ -334,7 +334,7 @@ public class BlockEventListener implements Listener { if (yield < 1f) { builder.withParameter(CommonParameters.EXPLOSION_RADIUS, 1.0f / yield); } - for (Item item : state.getDrops(builder, world)) { + for (Item item : state.getDrops(builder, world, null)) { world.dropItemNaturally(vec3d, item); } world.playBlockSound(vec3d, state.sounds().breakSound()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java index 1023e23c6..20e17db9d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java @@ -40,7 +40,7 @@ public class FallingBlockRemoveListener implements Listener { net.momirealms.craftengine.core.world.World world = new BukkitWorld(fallingBlock.getWorld()); builder.withParameter(CommonParameters.LOCATION, vec3d); builder.withParameter(CommonParameters.WORLD, world); - for (Item item : immutableBlockState.getDrops(builder, world)) { + for (Item item : immutableBlockState.getDrops(builder, world, null)) { world.dropItemNaturally(vec3d, item); } Object entityData = Reflections.field$Entity$entityData.get(fallingBlockEntity); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java index beb24c5d2..06b6bac69 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java @@ -73,7 +73,7 @@ public class BushBlockBehavior extends BukkitBlockBehavior { net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); builder.withParameter(CommonParameters.LOCATION, vec3d); builder.withParameter(CommonParameters.WORLD, world); - for (Item item : previousState.getDrops(builder, world)) { + for (Item item : previousState.getDrops(builder, world, null)) { world.dropItemNaturally(vec3d, item); } world.playBlockSound(vec3d, previousState.sounds().breakSound()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java index 0c13c3867..f74239a2d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/CropBlockBehavior.java @@ -12,8 +12,8 @@ import net.momirealms.craftengine.core.block.UpdateOption; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.IntegerProperty; import net.momirealms.craftengine.core.block.properties.Property; -import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.SimpleContext; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; @@ -145,12 +145,14 @@ public class CropBlockBehavior extends BushBlockBehavior { int x = FastNMS.INSTANCE.field$Vec3i$x(pos); int y = FastNMS.INSTANCE.field$Vec3i$y(pos); int z = FastNMS.INSTANCE.field$Vec3i$z(pos); - - net.momirealms.craftengine.core.world.World wrappedWorld = new BukkitWorld(world); - int i = this.getAge(immutableBlockState) + this.boneMealBonus.getInt(new LootContext(wrappedWorld, 1, ContextHolder.builder() - .withParameter(CommonParameters.WORLD, wrappedWorld) - .withParameter(CommonParameters.LOCATION, Vec3d.atCenterOf(new Vec3i(x, y, z))) - .build())); + int i = this.getAge(immutableBlockState) + this.boneMealBonus.getInt( + SimpleContext.of( + ContextHolder.builder() + .withParameter(CommonParameters.WORLD, new BukkitWorld(world)) + .withParameter(CommonParameters.LOCATION, Vec3d.atCenterOf(new Vec3i(x, y, z))) + .build() + ) + ); int maxAge = this.ageProperty.max; if (i > maxAge) { i = maxAge; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java index e7d04e967..f90956c5f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java @@ -99,7 +99,7 @@ public class FallingBlockBehavior extends BukkitBlockBehavior { net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); builder.withParameter(CommonParameters.LOCATION, vec3d); builder.withParameter(CommonParameters.WORLD, world); - for (Item item : immutableBlockState.getDrops(builder, world)) { + for (Item item : immutableBlockState.getDrops(builder, world, null)) { world.dropItemNaturally(vec3d, item); } Object entityData = Reflections.field$Entity$entityData.get(fallingBlockEntity); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java index 572ebf985..cf88d726f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java @@ -127,7 +127,7 @@ public class LeavesBlockBehavior extends WaterLoggedBlockBehavior { ContextHolder.Builder builder = ContextHolder.builder() .withParameter(CommonParameters.LOCATION, vec3d) .withParameter(CommonParameters.WORLD, world); - for (Item item : immutableBlockState.getDrops(builder, world)) { + for (Item item : immutableBlockState.getDrops(builder, world, null)) { world.dropItemNaturally(vec3d, item); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java index dc31b1b67..1deb5712f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java @@ -63,7 +63,7 @@ public class SugarCaneBlockBehavior extends BushBlockBehavior { ContextHolder.Builder builder = ContextHolder.builder() .withParameter(CommonParameters.LOCATION, vec3d) .withParameter(CommonParameters.WORLD, world); - for (Item item : currentState.getDrops(builder, world)) { + for (Item item : currentState.getDrops(builder, world, null)) { world.dropItemNaturally(vec3d, item); } world.playBlockSound(vec3d, currentState.sounds().breakSound()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java index 0c719082d..d8bc859de 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java @@ -1,8 +1,10 @@ package net.momirealms.craftengine.bukkit.entity; +import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.bukkit.world.BukkitWorld; import net.momirealms.craftengine.core.entity.Entity; import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.World; import java.lang.ref.WeakReference; @@ -62,4 +64,9 @@ public class BukkitEntity extends Entity { public org.bukkit.entity.Entity literalObject() { return this.entity.get(); } + + @Override + public Key type() { + return KeyUtils.namespacedKey2Key(literalObject().getType().getKey()); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java index 665e1fd2f..f994c121b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java @@ -6,7 +6,6 @@ import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.bukkit.world.BukkitWorld; -import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.AbstractVanillaLootManager; import net.momirealms.craftengine.core.loot.LootTable; @@ -70,16 +69,17 @@ public class BukkitVanillaLootManager extends AbstractVanillaLootManager impleme ContextHolder.Builder builder = ContextHolder.builder(); builder.withParameter(CommonParameters.WORLD, world); builder.withParameter(CommonParameters.LOCATION, vec3d); + BukkitServerPlayer optionalPlayer = null; if (VersionHelper.isOrAbove1_20_5()) { if (event.getDamageSource().getCausingEntity() instanceof Player player) { - BukkitServerPlayer serverPlayer = this.plugin.adapt(player); - builder.withParameter(CommonParameters.PLAYER, serverPlayer); - builder.withOptionalParameter(CommonParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); + optionalPlayer = this.plugin.adapt(player); + builder.withParameter(CommonParameters.PLAYER, optionalPlayer); + //mark item builder.withOptionalParameter(CommonParameters.MAIN_HAND_ITEM, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); } } ContextHolder contextHolder = builder.build(); for (LootTable lootTable : loot.lootTables()) { - for (Item item : lootTable.getRandomItems(contextHolder, world)) { + for (Item item : lootTable.getRandomItems(contextHolder, world, optionalPlayer)) { world.dropItemNaturally(vec3d, item); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java index d6741da96..fe7f48e8f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -75,6 +75,7 @@ public class BukkitCraftEngine extends CraftEngine { super.classPathAppender = new ReflectionClassPathAppender(this); super.scheduler = new BukkitSchedulerAdapter(this); super.logger = new JavaPluginLogger(bootstrap.getLogger()); + super.platform = new BukkitPlatform(); // find mod class if present Class modClass = ReflectionUtils.getClazz(MOD_CLASS); if (modClass != null) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java new file mode 100644 index 000000000..2b3647fa1 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitPlatform.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.bukkit.plugin; + +import net.momirealms.craftengine.core.plugin.Platform; +import org.bukkit.Bukkit; + +public class BukkitPlatform implements Platform { + + @Override + public void dispatchCommand(String command) { + Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), command); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index c5c54386d..c3352106c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -26,6 +26,8 @@ import net.momirealms.craftengine.core.world.BlockPos; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.WorldEvents; import org.bukkit.*; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; import org.bukkit.block.Block; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; @@ -800,4 +802,18 @@ public class BukkitServerPlayer extends Player { this.resourcePackUUID.clear(); } } + + @Override + public void performCommand(String command) { + platformPlayer().performCommand(command); + } + + @Override + public double luck() { + if (VersionHelper.isOrAbove1_21_3()) { + return Optional.ofNullable(platformPlayer().getAttribute(Attribute.LUCK)).map(AttributeInstance::getValue).orElse(1d); + } else { + return LegacyAttributeUtils.getLuck(platformPlayer()); + } + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java b/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java index dad93e792..7e53699aa 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.block; import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.plugin.context.ContextHolder; @@ -12,6 +13,7 @@ import net.momirealms.craftengine.shared.block.BlockBehavior; import net.momirealms.sparrow.nbt.CompoundTag; import net.momirealms.sparrow.nbt.NBT; import net.momirealms.sparrow.nbt.Tag; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.List; @@ -138,12 +140,16 @@ public class ImmutableBlockState extends BlockStateHolder { return state.with(property, (T) value); } + public List> getDrops(@NotNull ContextHolder.Builder builder, @NotNull World world) { + return this.getDrops(builder, world, null); + } + @SuppressWarnings("unchecked") - public List> getDrops(ContextHolder.Builder builder, World world) { + public List> getDrops(@NotNull ContextHolder.Builder builder, @NotNull World world, @Nullable Player player) { CustomBlock block = owner.value(); if (block == null) return List.of(); LootTable lootTable = (LootTable) block.lootTable(); if (lootTable == null) return List.of(); - return lootTable.getRandomItems(builder.withParameter(CommonParameters.BLOCK_STATE, this).build(), world); + return lootTable.getRandomItems(builder.withParameter(CommonParameters.BLOCK_STATE, this).build(), world, player); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java index 4df160563..24efd4208 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java @@ -1,16 +1,24 @@ package net.momirealms.craftengine.core.entity; import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.World; public abstract class Entity { + public abstract Key type(); + public abstract double x(); public abstract double y(); public abstract double z(); + public Vec3d position() { + return new Vec3d(x(), y(), z()); + } + public abstract void tick(); public abstract int entityID(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java index 0af8d0e34..48d6b6185 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java @@ -11,6 +11,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; public abstract class Player extends Entity implements NetWorkUser { + private static final Key TYPE = Key.of("minecraft:player"); public abstract boolean isSecondaryUseActive(); @@ -84,4 +85,13 @@ public abstract class Player extends Entity implements NetWorkUser { public abstract void clearView(); public abstract void unloadCurrentResourcePack(); + + public abstract void performCommand(String command); + + public abstract double luck(); + + @Override + public Key type() { + return TYPE; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java index 5d83f7df0..b4698e00b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmithingTransformRecipe.java @@ -185,15 +185,15 @@ public class CustomSmithingTransformRecipe implements Recipe { throw new LocalizedResourceConfigException("warning.config.recipe.smithing_transform.post_processor.missing_type"); } Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); - ItemDataProcessor.Factory factory = BuiltInRegistries.SMITHING_RESULT_PROCESSOR_FACTORY.getValue(key); + ItemDataProcessor.ProcessorFactory factory = BuiltInRegistries.SMITHING_RESULT_PROCESSOR_FACTORY.getValue(key); if (factory == null) { throw new LocalizedResourceConfigException("warning.config.recipe.smithing_transform.post_processor.invalid_type", type); } return factory.create(map); } - public static void register(Key key, ItemDataProcessor.Factory factory) { - Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SMITHING_RESULT_PROCESSOR_FACTORY) + public static void register(Key key, ItemDataProcessor.ProcessorFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SMITHING_RESULT_PROCESSOR_FACTORY) .registerForHolder(new ResourceKey<>(Registries.SMITHING_RESULT_PROCESSOR_FACTORY.location(), key)); holder.bindValue(factory); } @@ -203,7 +203,7 @@ public class CustomSmithingTransformRecipe implements Recipe { Key type(); - interface Factory { + interface ProcessorFactory { ItemDataProcessor create(Map arguments); } } @@ -231,7 +231,7 @@ public class CustomSmithingTransformRecipe implements Recipe { return ItemDataProcessors.KEEP_COMPONENTS; } - public static class Factory implements ItemDataProcessor.Factory { + public static class Factory implements ProcessorFactory { @Override public ItemDataProcessor create(Map arguments) { @@ -268,7 +268,7 @@ public class CustomSmithingTransformRecipe implements Recipe { return ItemDataProcessors.KEEP_TAGS; } - public static class Factory implements ItemDataProcessor.Factory { + public static class Factory implements ProcessorFactory { @Override public ItemDataProcessor create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootConditions.java similarity index 76% rename from core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/LootConditions.java index f3ce5cd7d..0dc4c9a32 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootConditions.java @@ -1,6 +1,5 @@ -package net.momirealms.craftengine.core.loot.condition; +package net.momirealms.craftengine.core.loot; -import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.condition.*; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; @@ -8,7 +7,6 @@ import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; @@ -31,10 +29,11 @@ public class LootConditions { register(CommonConditions.INVERTED, new InvertedCondition.FactoryImpl<>(LootConditions::fromMap)); register(CommonConditions.FALLING_BLOCK, new FallingBlockCondition.FactoryImpl<>()); register(CommonConditions.RANDOM, new RandomCondition.FactoryImpl<>()); + register(CommonConditions.DISTANCE, new DistanceCondition.FactoryImpl<>()); } - public static void register(Key key, Factory> factory) { - Holder.Reference>> holder = ((WritableRegistry>>) BuiltInRegistries.LOOT_CONDITION_FACTORY) + public static void register(Key key, ConditionFactory factory) { + Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.LOOT_CONDITION_FACTORY) .registerForHolder(new ResourceKey<>(Registries.LOOT_CONDITION_FACTORY.location(), key)); holder.bindValue(factory); } @@ -85,10 +84,18 @@ public class LootConditions { public static Condition fromMap(Map map) { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.loot_table.condition.missing_type"); Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); - Factory> factory = BuiltInRegistries.LOOT_CONDITION_FACTORY.getValue(key); - if (factory == null) { - throw new LocalizedResourceConfigException("warning.config.loot_table.condition.invalid_type", type); + if (key.value().charAt(0) == '!') { + ConditionFactory factory = BuiltInRegistries.LOOT_CONDITION_FACTORY.getValue(new Key(key.namespace(), key.value().substring(1))); + if (factory == null) { + throw new LocalizedResourceConfigException("warning.config.loot_table.condition.invalid_type", type); + } + return new InvertedCondition<>(factory.create(map)); + } else { + ConditionFactory factory = BuiltInRegistries.LOOT_CONDITION_FACTORY.getValue(key); + if (factory == null) { + throw new LocalizedResourceConfigException("warning.config.loot_table.condition.invalid_type", type); + } + return factory.create(map); } - return factory.create(map); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java index c67948fdc..c7251cd9e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java @@ -1,25 +1,38 @@ package net.momirealms.craftengine.core.loot; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; -import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.world.World; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; public class LootContext extends PlayerOptionalContext { private final World world; private final float luck; + private Item tempLoot; - public LootContext(World world, float luck, ContextHolder contexts) { - super(contexts.getOptional(CommonParameters.PLAYER).orElse(null), contexts); + public LootContext(@NotNull World world, @Nullable Player player, float luck, @NotNull ContextHolder contexts) { + super(player, contexts); this.world = world; this.luck = luck; } public float luck() { - return luck; + return this.luck; } public World world() { - return world; + return this.world; + } + + public Item tempLoot() { + return this.tempLoot; + } + + public void setTempLoot(Item tempLoot) { + this.tempLoot = tempLoot; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java index 1bc846899..41694006f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.loot; import com.google.common.collect.Lists; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.loot.entry.LootEntry; import net.momirealms.craftengine.core.loot.entry.LootEntryContainer; import net.momirealms.craftengine.core.loot.function.LootFunction; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java index 8804ac429..3ea626c53 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.loot; import com.google.common.collect.Lists; +import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.loot.entry.LootEntryContainer; import net.momirealms.craftengine.core.loot.entry.LootEntryContainers; import net.momirealms.craftengine.core.loot.function.LootFunction; @@ -79,7 +79,11 @@ public class LootTable { } public ArrayList> getRandomItems(ContextHolder parameters, World world) { - return this.getRandomItems(new LootContext(world, 1, parameters)); + return this.getRandomItems(parameters, world, null); + } + + public ArrayList> getRandomItems(ContextHolder parameters, World world, @Nullable Player player) { + return this.getRandomItems(new LootContext(world, player, player == null ? 1f : (float) player.luck(), parameters)); } private ArrayList> getRandomItems(LootContext context) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java index 9b22cbf89..9ed2f42e4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.core.loot.entry; +import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.util.Key; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java index 4c03b9873..eaf7a96ac 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.core.loot.entry; +import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java index a17fecb5b..4b5c300f2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.loot.entry; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.loot.function.LootFunction; import net.momirealms.craftengine.core.loot.function.LootFunctions; import net.momirealms.craftengine.core.plugin.CraftEngine; diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java similarity index 93% rename from core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java index 988839a5b..ea6f98583 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionApplyBonusCount.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java @@ -2,10 +2,10 @@ package net.momirealms.craftengine.core.loot.function; import net.momirealms.craftengine.core.item.Enchantment; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.plugin.context.Condition; -import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.plugin.context.parameter.PlayerParameters; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; @@ -18,12 +18,12 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class LootFunctionApplyBonusCount extends AbstractLootConditionalFunction { +public class ApplyBonusCountFunction extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); private final Key enchantment; private final Formula formula; - public LootFunctionApplyBonusCount(List> predicates, Key enchantment, Formula formula) { + public ApplyBonusCountFunction(List> predicates, Key enchantment, Formula formula) { super(predicates); this.enchantment = enchantment; this.formula = formula; @@ -31,7 +31,7 @@ public class LootFunctionApplyBonusCount extends AbstractLootConditionalFunct @Override protected Item applyInternal(Item item, LootContext context) { - Optional> itemInHand = context.getOptionalParameter(CommonParameters.TOOL); + Optional> itemInHand = context.getOptionalParameter(PlayerParameters.MAIN_HAND_ITEM); int level = itemInHand.map(value -> value.getEnchantment(this.enchantment).map(Enchantment::level).orElse(0)).orElse(0); int newCount = this.formula.apply(item.count(), level); item.count(newCount); @@ -56,7 +56,7 @@ public class LootFunctionApplyBonusCount extends AbstractLootConditionalFunct List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); - return new LootFunctionApplyBonusCount<>(conditions, Key.from(enchantment), Formulas.fromMap(formulaMap)); + return new ApplyBonusCountFunction<>(conditions, Key.from(enchantment), Formulas.fromMap(formulaMap)); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionDropExp.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java similarity index 84% rename from core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionDropExp.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java index 0a1d791b3..88e9664dc 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionDropExp.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.loot.function; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; @@ -15,11 +15,11 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class LootFunctionDropExp extends AbstractLootConditionalFunction { +public class DropExpFunction extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); private final NumberProvider value; - public LootFunctionDropExp(NumberProvider value, List> predicates) { + public DropExpFunction(NumberProvider value, List> predicates) { super(predicates); this.value = value; } @@ -44,7 +44,7 @@ public class LootFunctionDropExp extends AbstractLootConditionalFunction { List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); - return new LootFunctionDropExp<>(NumberProviders.fromObject(value), conditions); + return new DropExpFunction<>(NumberProviders.fromObject(value), conditions); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java similarity index 85% rename from core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java index 8e042ff08..0ab1b6f5e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionExplosionDecay.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.loot.function; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.Key; @@ -13,10 +13,10 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class LootFunctionExplosionDecay extends AbstractLootConditionalFunction { +public class ExplosionDecayFunction extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); - public LootFunctionExplosionDecay(List> predicates) { + public ExplosionDecayFunction(List> predicates) { super(predicates); } @@ -49,7 +49,7 @@ public class LootFunctionExplosionDecay extends AbstractLootConditionalFuncti List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); - return new LootFunctionExplosionDecay<>(conditions); + return new ExplosionDecayFunction<>(conditions); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java index 04fcf0709..e380bf022 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java @@ -23,10 +23,10 @@ public class LootFunctions { public static final Key DROP_EXP = Key.from("craftengine:drop_exp"); static { - register(SET_COUNT, LootFunctionSetCount.FACTORY); - register(EXPLOSION_DECAY, LootFunctionExplosionDecay.FACTORY); - register(APPLY_BONUS, LootFunctionApplyBonusCount.FACTORY); - register(DROP_EXP, LootFunctionDropExp.FACTORY); + register(SET_COUNT, SetCountFunction.FACTORY); + register(EXPLOSION_DECAY, ExplosionDecayFunction.FACTORY); + register(APPLY_BONUS, ApplyBonusCountFunction.FACTORY); + register(DROP_EXP, DropExpFunction.FACTORY); } public static void register(Key key, LootFunctionFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionSetCount.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java similarity index 83% rename from core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionSetCount.java rename to core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java index d0c8e92db..02cfdaa73 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionSetCount.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java @@ -1,8 +1,8 @@ package net.momirealms.craftengine.core.loot.function; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootConditions; import net.momirealms.craftengine.core.loot.LootContext; -import net.momirealms.craftengine.core.loot.condition.LootConditions; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; @@ -14,13 +14,13 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class LootFunctionSetCount extends AbstractLootConditionalFunction { +public class SetCountFunction extends AbstractLootConditionalFunction { public static final Factory FACTORY = new Factory<>(); private final NumberProvider value; private final boolean add; - public LootFunctionSetCount(List> conditions, NumberProvider value, boolean add) { + public SetCountFunction(List> conditions, NumberProvider value, boolean add) { super(conditions); this.value = value; this.add = add; @@ -47,7 +47,7 @@ public class LootFunctionSetCount extends AbstractLootConditionalFunction List> conditions = Optional.ofNullable(arguments.get("conditions")) .map(it -> LootConditions.fromMapList((List>) it)) .orElse(Collections.emptyList()); - return new LootFunctionSetCount<>(conditions, NumberProviders.fromObject(value), add); + return new SetCountFunction<>(conditions, NumberProviders.fromObject(value), add); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java index fba21b9e2..3c17607ca 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherContains.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -27,7 +27,7 @@ public class PathMatcherContains implements Condition { return PathMatchers.CONTAINS; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java index e632d562a..bebd9c61a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherExact.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -27,7 +27,7 @@ public class PathMatcherExact implements Condition { return PathMatchers.EXACT; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java index a2e861d56..b7b7f2f26 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFilename.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -27,7 +27,7 @@ public class PathMatcherFilename implements Condition { return PathMatchers.FILENAME; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java index df4b639c6..212ff4c39 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentPrefix.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -30,7 +30,7 @@ public class PathMatcherParentPrefix implements Condition { return PathMatchers.PARENT_PATH_PREFIX; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java index c53ca69b6..77c061228 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherParentSuffix.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -30,7 +30,7 @@ public class PathMatcherParentSuffix implements Condition { return PathMatchers.PARENT_PATH_SUFFIX; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java index a80c9bdde..7bffb8178 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java @@ -2,16 +2,12 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.context.Condition; -import net.momirealms.craftengine.core.plugin.context.condition.AllOfCondition; -import net.momirealms.craftengine.core.plugin.context.condition.AnyOfCondition; -import net.momirealms.craftengine.core.plugin.context.condition.InvertedCondition; -import net.momirealms.craftengine.core.plugin.context.condition.CommonConditions; +import net.momirealms.craftengine.core.plugin.context.condition.*; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.WritableRegistry; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; @@ -40,8 +36,9 @@ public class PathMatchers { register(CONTAINS, new PathMatcherContains.FactoryImpl()); } - public static void register(Key key, Factory> factory) { - Holder.Reference>> holder = ((WritableRegistry>>) BuiltInRegistries.PATH_MATCHER_FACTORY).registerForHolder(new ResourceKey<>(Registries.PATH_MATCHER_FACTORY.location(), key)); + public static void register(Key key, ConditionFactory factory) { + Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.PATH_MATCHER_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.PATH_MATCHER_FACTORY.location(), key)); holder.bindValue(factory); } @@ -56,10 +53,18 @@ public class PathMatchers { public static Condition fromMap(Map map) { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), () -> new LocalizedException("warning.config.conflict_matcher.missing_type")); Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); - Factory> factory = BuiltInRegistries.PATH_MATCHER_FACTORY.getValue(key); - if (factory == null) { - throw new LocalizedException("warning.config.conflict_matcher.invalid_type", type); + if (key.value().charAt(0) == '!') { + ConditionFactory factory = BuiltInRegistries.PATH_MATCHER_FACTORY.getValue(new Key(key.namespace(), key.value().substring(1))); + if (factory == null) { + throw new LocalizedException("warning.config.conflict_matcher.invalid_type", type); + } + return new InvertedCondition<>(factory.create(map)); + } else { + ConditionFactory factory = BuiltInRegistries.PATH_MATCHER_FACTORY.getValue(key); + if (factory == null) { + throw new LocalizedException("warning.config.conflict_matcher.invalid_type", type); + } + return factory.create(map); } - return factory.create(map); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java index 9261bffc2..6826a42aa 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java @@ -2,8 +2,8 @@ package net.momirealms.craftengine.core.pack.conflict.matcher; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; import net.momirealms.craftengine.core.plugin.locale.LocalizedException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -36,7 +36,7 @@ public class PathPatternMatcher implements Condition { return pattern; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index 83feda34f..64fa38f73 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -46,6 +46,7 @@ public abstract class CraftEngine implements Plugin { protected PluginLogger logger; protected Consumer> debugger = (s) -> {}; protected Config config; + protected Platform platform; protected ClassPathAppender classPathAppender; protected DependencyManager dependencyManager; protected SchedulerAdapter scheduler; @@ -428,4 +429,9 @@ public abstract class CraftEngine implements Plugin { public CompatibilityManager compatibilityManager() { return compatibilityManager; } + + @Override + public Platform platform() { + return platform; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java new file mode 100644 index 000000000..3c48cfb5e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Platform.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.plugin; + +public interface Platform { + + void dispatchCommand(String command); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java index d7d693264..37ef07865 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java @@ -90,4 +90,6 @@ public interface Plugin { void debug(Supplier message); CompatibilityManager compatibilityManager(); + + Platform platform(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java index 9e07b9423..4717ae0e0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/AbstractCommonContext.java @@ -23,7 +23,8 @@ public abstract class AbstractCommonContext implements Context { @NotNull public TagResolver[] tagResolvers() { if (this.tagResolvers == null) { - this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new I18NTag(this), new NamedArgumentTag(this), new PlaceholderTag(null)}; + this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new I18NTag(this), new NamedArgumentTag(this), + new PlaceholderTag(null), new ExpressionTag(this)}; } return this.tagResolvers; } @@ -38,9 +39,10 @@ public abstract class AbstractCommonContext implements Context { return this.contexts.getOrThrow(parameter); } - @Override - public AbstractCommonContext withParameter(ContextKey parameter, T value) { - this.contexts.withParameter(parameter, value); - return this; - } + // It's not designed as mutable +// @Override +// public AbstractCommonContext withParameter(ContextKey parameter, T value) { +// this.contexts.withParameter(parameter, value); +// return this; +// } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/Context.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/Context.java index ac3e5d3fe..989def892 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/Context.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/Context.java @@ -13,6 +13,4 @@ public interface Context { Optional getOptionalParameter(ContextKey parameter); T getParameterOrThrow(ContextKey parameter); - - Context withParameter(ContextKey parameter, T value); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java index e01c447e2..d184c694e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ContextHolder.java @@ -96,7 +96,7 @@ public class ContextHolder { public T getParameterOrThrow(ContextKey parameter) { Supplier object = (Supplier) this.params.get(parameter); if (object == null) { - throw new NoSuchElementException(parameter.id().toString()); + throw new NoSuchElementException(parameter.id()); } else { return object.get(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerFurnitureActionContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerFurnitureActionContext.java new file mode 100644 index 000000000..4066c0405 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerFurnitureActionContext.java @@ -0,0 +1,20 @@ +package net.momirealms.craftengine.core.plugin.context; + +import net.momirealms.craftengine.core.entity.furniture.Furniture; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameterProvider; +import net.momirealms.craftengine.core.plugin.context.parameter.PlayerParameterProvider; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class PlayerFurnitureActionContext extends PlayerOptionalContext { + + public PlayerFurnitureActionContext(@NotNull Player player, @NotNull Furniture furniture, @NotNull ContextHolder contexts) { + super(player, contexts, List.of(new CommonParameterProvider(), new PlayerParameterProvider(player))); + } + + public static PlayerFurnitureActionContext of(@NotNull Player player, @NotNull Furniture furniture, @NotNull ContextHolder contexts) { + return new PlayerFurnitureActionContext(player, furniture, contexts); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java index 3436e4605..e471cc51a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/PlayerOptionalContext.java @@ -14,7 +14,7 @@ import java.util.Map; public class PlayerOptionalContext extends AbstractAdditionalParameterContext implements Context { public static final PlayerOptionalContext EMPTY = new PlayerOptionalContext(null, ContextHolder.EMPTY); - private final Player player; + protected final Player player; public PlayerOptionalContext(@Nullable Player player, @NotNull ContextHolder contexts) { super(contexts, player == null ? List.of(new CommonParameterProvider()) : List.of(new CommonParameterProvider(), new PlayerParameterProvider(player))); @@ -52,7 +52,7 @@ public class PlayerOptionalContext extends AbstractAdditionalParameterContext im @NotNull public TagResolver[] tagResolvers() { if (this.tagResolvers == null) { - this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new PlaceholderTag(this.player), new I18NTag(this), new NamedArgumentTag(this)}; + this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new PlaceholderTag(this.player), new I18NTag(this), new NamedArgumentTag(this), new ExpressionTag(this)}; } return this.tagResolvers; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/RelationalContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/RelationalContext.java new file mode 100644 index 000000000..7879b155b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/RelationalContext.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.plugin.context; + +import java.util.Optional; + +public interface RelationalContext extends Context { + + ContextHolder viewerContexts(); + + Optional getViewerOptionalParameter(ContextKey parameter); + + T getViewerParameterOrThrow(ContextKey parameter); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/SimpleContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/SimpleContext.java new file mode 100644 index 000000000..a6b92e94e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/SimpleContext.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.plugin.context; + +public class SimpleContext extends AbstractCommonContext { + + public SimpleContext(ContextHolder contexts) { + super(contexts); + } + + public static SimpleContext of(ContextHolder contexts) { + return new SimpleContext(contexts); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ViewerContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ViewerContext.java new file mode 100644 index 000000000..4591d242d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/ViewerContext.java @@ -0,0 +1,67 @@ +package net.momirealms.craftengine.core.plugin.context; + +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.text.minimessage.*; + +import java.util.Optional; + +public class ViewerContext implements RelationalContext { + private final Context owner; + private final PlayerOptionalContext viewer; + private TagResolver[] tagResolvers; + + public ViewerContext(Context owner, PlayerOptionalContext viewer) { + this.owner = owner; + this.viewer = viewer; + } + + public static ViewerContext of(Context owner, PlayerOptionalContext viewer) { + return new ViewerContext(owner, viewer); + } + + @Override + public Optional getViewerOptionalParameter(ContextKey parameter) { + return this.viewer.getOptionalParameter(parameter); + } + + @Override + public ContextHolder viewerContexts() { + return this.viewer.contexts(); + } + + @Override + public T getViewerParameterOrThrow(ContextKey parameter) { + return this.viewer.getParameterOrThrow(parameter); + } + + @Override + public ContextHolder contexts() { + return this.owner.contexts(); + } + + @Override + public Optional getOptionalParameter(ContextKey parameter) { + return this.owner.getOptionalParameter(parameter); + } + + @Override + public T getParameterOrThrow(ContextKey parameter) { + return this.owner.getParameterOrThrow(parameter); + } + + @Override + public TagResolver[] tagResolvers() { + if (this.tagResolvers == null) { + Player optionalOwner = null; + if (this.owner instanceof PlayerOptionalContext context) { + optionalOwner = context.player(); + } + this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, + new PlaceholderTag(optionalOwner), new ViewerPlaceholderTag(this.viewer.player()), + new NamedArgumentTag(this.owner), new ViewerNamedArgumentTag(this.viewer), + new I18NTag(this), new ExpressionTag(this)}; + } + return this.tagResolvers; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java index e1b128982..c89b52606 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AllOfCondition.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.plugin.context.condition; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -35,7 +34,7 @@ public class AllOfCondition implements Condition { return CommonConditions.ALL_OF; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { private final Function, Condition> factory; public FactoryImpl(Function, Condition> factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java index c0e20d22b..4151e9870 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/AnyOfCondition.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.plugin.context.condition; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -35,7 +34,7 @@ public class AnyOfCondition implements Condition { return CommonConditions.ANY_OF; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { private final Function, Condition> factory; public FactoryImpl(Function, Condition> factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java index a8700127a..1607f8013 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java @@ -16,4 +16,5 @@ public final class CommonConditions { public static final Key RANDOM = Key.from("craftengine:random"); public static final Key ENCHANTMENT = Key.from("craftengine:enchantment"); public static final Key FALLING_BLOCK = Key.from("craftengine:falling_block"); + public static final Key DISTANCE = Key.from("craftengine:distance"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/ConditionFactory.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/ConditionFactory.java new file mode 100644 index 000000000..06e595886 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/ConditionFactory.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.plugin.context.condition; + +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; + +import java.util.Map; + +public interface ConditionFactory { + + Condition create(Map args); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/DistanceCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/DistanceCondition.java new file mode 100644 index 000000000..52e22d6a6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/DistanceCondition.java @@ -0,0 +1,65 @@ +package net.momirealms.craftengine.core.plugin.context.condition; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; +import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.core.world.World; + +import java.util.Map; +import java.util.Optional; + +// TODO It's designed for players for the moment, better using entities +public class DistanceCondition implements Condition { + private final NumberProvider min; + private final NumberProvider max; + + public DistanceCondition(NumberProvider min, NumberProvider max) { + this.max = max; + this.min = min; + } + + @Override + public Key type() { + return CommonConditions.DISTANCE; + } + + @Override + public boolean test(CTX ctx) { + float min = this.min.getFloat(ctx); + float max = this.max.getFloat(ctx); + Optional optionalPlayer = ctx.getOptionalParameter(CommonParameters.PLAYER); + World world = ctx.getParameterOrThrow(CommonParameters.WORLD); + Vec3d location = ctx.getParameterOrThrow(CommonParameters.LOCATION); + if (optionalPlayer.isEmpty()) { + return false; + } + Player player = optionalPlayer.get(); + if (!player.world().uuid().equals(world.uuid())) { + return false; + } + + double dx = location.x() - player.x(); + double dy = location.y() - player.y(); + double dz = location.z() - player.z(); + double distanceSquared = dx * dx + dy * dy + dz * dz; + double minSquared = min * min; + double maxSquared = max * max; + + return distanceSquared >= minSquared && distanceSquared <= maxSquared; + } + + public static class FactoryImpl implements ConditionFactory { + + @Override + public Condition create(Map arguments) { + NumberProvider min = NumberProviders.fromObject(arguments.getOrDefault("min", 0)); + NumberProvider max = NumberProviders.fromObject(arguments.getOrDefault("max", 32)); + return new DistanceCondition<>(min, max); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java index 291e0d14e..dda586d78 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EmptyCondition.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.plugin.context.condition; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import java.util.Map; @@ -19,7 +18,7 @@ public class EmptyCondition implements Condition { return true; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java index 57825c36a..3523c9ae4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/EnchantmentCondition.java @@ -4,9 +4,8 @@ import net.momirealms.craftengine.core.item.Enchantment; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; -import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.plugin.context.parameter.PlayerParameters; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -30,14 +29,14 @@ public class EnchantmentCondition implements Condition @Override public boolean test(CTX ctx) { - Optional> item = ctx.getOptionalParameter(CommonParameters.TOOL); + Optional> item = ctx.getOptionalParameter(PlayerParameters.MAIN_HAND_ITEM); if (item.isEmpty()) return false; Optional enchantment = item.get().getEnchantment(id); int level = enchantment.map(Enchantment::level).orElse(0); return this.expression.apply(level); } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java index 820fc2820..1ab5a31b2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/FallingBlockCondition.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.plugin.context.condition; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import java.util.Map; @@ -20,7 +19,7 @@ public class FallingBlockCondition implements Condition implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InvertedCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InvertedCondition.java index bf9febb00..059339456 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InvertedCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InvertedCondition.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.plugin.context.condition; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -30,7 +29,7 @@ public class InvertedCondition implements Condition { return CommonConditions.INVERTED; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { private final Function, Condition> factory; public FactoryImpl(Function, Condition> factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java index e1aee710e..d33b75f8e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchBlockPropertyCondition.java @@ -5,7 +5,10 @@ import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; -import net.momirealms.craftengine.core.util.*; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.Pair; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.ArrayList; import java.util.List; @@ -41,7 +44,7 @@ public class MatchBlockPropertyCondition implements Conditi }).orElse(false); } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java index 48a199634..09951996a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/MatchItemCondition.java @@ -3,9 +3,8 @@ package net.momirealms.craftengine.core.plugin.context.condition; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; -import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.plugin.context.parameter.PlayerParameters; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; @@ -27,7 +26,7 @@ public class MatchItemCondition implements Condition { @Override public boolean test(CTX ctx) { - Optional> item = ctx.getOptionalParameter(CommonParameters.TOOL); + Optional> item = ctx.getOptionalParameter(PlayerParameters.MAIN_HAND_ITEM); if (item.isEmpty()) return false; Key key = item.get().id(); String itemId = key.toString(); @@ -43,7 +42,7 @@ public class MatchItemCondition implements Condition { return false; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java index 9e7657ea8..a855b84f9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/RandomCondition.java @@ -4,17 +4,20 @@ import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; -import net.momirealms.craftengine.core.util.Factory; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.RandomUtils; import java.util.Map; +import java.util.Optional; public class RandomCondition implements Condition { private final NumberProvider chance; + private final boolean previous; - public RandomCondition(NumberProvider chance) { + public RandomCondition(NumberProvider chance, boolean previous) { this.chance = chance; + this.previous = previous; } @Override @@ -24,15 +27,25 @@ public class RandomCondition implements Condition { @Override public boolean test(CTX ctx) { - return RandomUtils.generateRandomFloat(0, 1) < this.chance.getFloat(ctx); + if (this.previous) { + // TODO This might produce bugs if the context doesn't use a common provider + Optional random = ctx.getOptionalParameter(CommonParameters.LAST_RANDOM); + return random.map(d -> d < this.chance.getFloat(ctx)) + .orElseGet(() -> RandomUtils.generateRandomFloat(0, 1) < this.chance.getFloat(ctx)); + } else { + Optional random = ctx.getOptionalParameter(CommonParameters.RANDOM); + return random.map(d -> d < this.chance.getFloat(ctx)) + .orElseGet(() -> RandomUtils.generateRandomFloat(0, 1) < this.chance.getFloat(ctx)); + } } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { NumberProvider provider = NumberProviders.fromObject(arguments.getOrDefault("value", 0.5f)); - return new RandomCondition<>(provider); + boolean useLastRandom = Boolean.parseBoolean(arguments.getOrDefault("use-last", "false").toString()); + return new RandomCondition<>(provider, useLastRandom); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java index da6277ded..385bb708f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/SurvivesExplosionCondition.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.core.plugin.context.condition; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.RandomUtils; @@ -27,7 +26,7 @@ public class SurvivesExplosionCondition implements Conditio return true; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java index 880a52bcb..fb0870344 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/TableBonusCondition.java @@ -4,9 +4,8 @@ import net.momirealms.craftengine.core.item.Enchantment; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; -import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.plugin.context.parameter.PlayerParameters; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; -import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.RandomUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -32,13 +31,13 @@ public class TableBonusCondition implements Condition @Override public boolean test(CTX ctx) { - Optional> item = ctx.getOptionalParameter(CommonParameters.TOOL); + Optional> item = ctx.getOptionalParameter(PlayerParameters.MAIN_HAND_ITEM); int level = item.map(value -> value.getEnchantment(this.enchantmentType).map(Enchantment::level).orElse(0)).orElse(0); float f = this.values.get(Math.min(level, this.values.size() - 1)); return RandomUtils.generateRandomFloat(0, 1) < f; } - public static class FactoryImpl implements Factory> { + public static class FactoryImpl implements ConditionFactory { @Override public Condition create(Map arguments) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/AbstractConditionalFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/AbstractConditionalFunction.java new file mode 100644 index 000000000..25d56a813 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/AbstractConditionalFunction.java @@ -0,0 +1,55 @@ +package net.momirealms.craftengine.core.plugin.context.function; + +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.Factory; +import net.momirealms.craftengine.core.util.MCUtils; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; + +// TODO 将loot functions迁移过来 +public abstract class AbstractConditionalFunction implements Function { + protected final List> predicates; + private final Predicate compositePredicates; + + public AbstractConditionalFunction(List> predicates) { + this.predicates = predicates; + this.compositePredicates = MCUtils.allOf(predicates); + } + + @Override + public void run(CTX ctx) { + if (this.compositePredicates.test(ctx)) { + this.runInternal(ctx); + } + } + + protected abstract void runInternal(CTX ctx); + + public static abstract class AbstractFactory implements Factory> { + private final java.util.function.Function, Condition> factory; + + public AbstractFactory(java.util.function.Function, Condition> factory) { + this.factory = factory; + } + + protected List> getPredicates(Map arguments) { + Object predicates = arguments.get("conditions"); + if (predicates == null) return List.of(); + if (predicates instanceof List list) { + List> conditions = new ArrayList<>(list.size()); + for (Object o : list) { + conditions.add(factory.apply(MiscUtils.castToMap(o, false))); + } + return conditions; + } else if (predicates instanceof Map map) { + return List.of(factory.apply(MiscUtils.castToMap(map, false))); + } + throw new IllegalArgumentException("Unsupported condition type: " + predicates.getClass().getSimpleName()); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java new file mode 100644 index 000000000..a6dd5254d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java @@ -0,0 +1,78 @@ +package net.momirealms.craftengine.core.plugin.context.function; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.Platform; +import net.momirealms.craftengine.core.plugin.context.*; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelector; +import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelectors; +import net.momirealms.craftengine.core.plugin.context.text.TextProvider; +import net.momirealms.craftengine.core.plugin.context.text.TextProviders; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import javax.annotation.Nullable; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class CommandFunction extends AbstractConditionalFunction { + private final List command; + private final boolean asPlayer; + private final PlayerSelector selector; + + public CommandFunction(List> predicates, List command, boolean asPlayer, @Nullable PlayerSelector selector) { + super(predicates); + this.asPlayer = asPlayer; + this.command = command; + this.selector = selector; + } + + @Override + public void runInternal(CTX ctx) { + if (this.asPlayer) { + Optional owner = ctx.getOptionalParameter(CommonParameters.PLAYER); + if (this.selector == null) { + owner.ifPresent(it -> { + for (TextProvider c : this.command) { + it.performCommand(c.get(ctx)); + } + }); + } else { + for (Player viewer : this.selector.get(ctx)) { + RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(viewer, ContextHolder.EMPTY)); + for (TextProvider c : this.command) { + viewer.performCommand(c.get(relationalContext)); + } + } + } + } else { + Platform platform = CraftEngine.instance().platform(); + for (TextProvider c : this.command) { + platform.dispatchCommand(c.get(ctx)); + } + } + } + + @Override + public Key type() { + return CommonFunctions.COMMAND; + } + + public static class FactoryImpl extends AbstractFactory { + + public FactoryImpl(java.util.function.Function, Condition> factory) { + super(factory); + } + + @Override + public Function create(Map arguments) { + Object command = ResourceConfigUtils.requireNonNullOrThrow(ResourceConfigUtils.get(arguments, "command", "commands"), "warning.config.function.command.missing_command"); + List commands = MiscUtils.getAsStringList(command).stream().map(TextProviders::fromString).toList(); + boolean asPlayer = (boolean) arguments.getOrDefault("as-player", false); + return new CommandFunction<>(getPredicates(arguments), commands, asPlayer, PlayerSelectors.fromObject(arguments.get("target"))); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java new file mode 100644 index 000000000..574ad1ba0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.plugin.context.function; + +import net.momirealms.craftengine.core.util.Key; + +public class CommonFunctions { + public static final Key COMMAND = Key.of("craftengine:command"); + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/Function.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/Function.java new file mode 100644 index 000000000..968feb369 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/Function.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.plugin.context.function; + +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.Key; + +public interface Function { + + void run(CTX ctx); + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java index e6c8d24ff..e84c45315 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/CommonParameters.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.plugin.context.parameter; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.entity.player.Player; -import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.ContextKey; import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.World; @@ -17,6 +16,5 @@ public final class CommonParameters { public static final ContextKey FALLING_BLOCK = ContextKey.of("falling_block"); public static final ContextKey EXPLOSION_RADIUS = ContextKey.of("explosion_radius"); public static final ContextKey PLAYER = ContextKey.of("player"); - public static final ContextKey> TOOL = ContextKey.of("tool"); public static final ContextKey BLOCK_STATE = ContextKey.of("block_state"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java index d79f10448..c3a17484f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameterProvider.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.plugin.context.parameter; import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.player.InteractionHand; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.context.ContextKey; import net.momirealms.craftengine.core.plugin.context.LazyContextParameterProvider; @@ -19,12 +20,15 @@ public class PlayerParameterProvider implements LazyContextParameterProvider { CONTEXT_FUNCTIONS.put(PlayerParameters.X, Entity::x); CONTEXT_FUNCTIONS.put(PlayerParameters.Y, Entity::y); CONTEXT_FUNCTIONS.put(PlayerParameters.Z, Entity::z); + CONTEXT_FUNCTIONS.put(PlayerParameters.POS, Entity::position); CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_X, p -> MCUtils.fastFloor(p.x())); CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_Y, p -> MCUtils.fastFloor(p.y())); CONTEXT_FUNCTIONS.put(PlayerParameters.BLOCK_Z, p -> MCUtils.fastFloor(p.z())); CONTEXT_FUNCTIONS.put(PlayerParameters.NAME, Player::name); CONTEXT_FUNCTIONS.put(PlayerParameters.UUID, Player::uuid); CONTEXT_FUNCTIONS.put(PlayerParameters.WORLD_NAME, p -> p.world().name()); + CONTEXT_FUNCTIONS.put(PlayerParameters.MAIN_HAND_ITEM, p -> p.getItemInHand(InteractionHand.MAIN_HAND)); + CONTEXT_FUNCTIONS.put(PlayerParameters.OFF_HAND_ITEM, p -> p.getItemInHand(InteractionHand.OFF_HAND)); } private final Player player; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameters.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameters.java index 68d5fe9a5..4d558ba1b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/PlayerParameters.java @@ -1,6 +1,8 @@ package net.momirealms.craftengine.core.plugin.context.parameter; +import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.context.ContextKey; +import net.momirealms.craftengine.core.world.Vec3d; import java.util.UUID; @@ -10,10 +12,13 @@ public final class PlayerParameters { public static final ContextKey X = ContextKey.of("player.x"); public static final ContextKey Y = ContextKey.of("player.y"); public static final ContextKey Z = ContextKey.of("player.z"); + public static final ContextKey POS = ContextKey.of("player.pos"); public static final ContextKey BLOCK_X = ContextKey.of("player.block_x"); public static final ContextKey BLOCK_Y = ContextKey.of("player.block_y"); public static final ContextKey BLOCK_Z = ContextKey.of("player.block_z"); public static final ContextKey NAME = ContextKey.of("player.name"); public static final ContextKey WORLD_NAME = ContextKey.of("player.world.name"); public static final ContextKey UUID = ContextKey.of("player.uuid"); + public static final ContextKey> MAIN_HAND_ITEM = ContextKey.of("player.main_hand"); + public static final ContextKey> OFF_HAND_ITEM = ContextKey.of("player.off_hand"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/AllPlayerSelector.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/AllPlayerSelector.java new file mode 100644 index 000000000..77e431e1a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/AllPlayerSelector.java @@ -0,0 +1,58 @@ +package net.momirealms.craftengine.core.plugin.context.selector; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class AllPlayerSelector implements PlayerSelector { + private final List> predicates; + + public AllPlayerSelector(List> predicates) { + this.predicates = predicates; + } + + public AllPlayerSelector() { + this.predicates = List.of(); + } + + public List> predicates() { + return predicates; + } + + @SuppressWarnings("unchecked") + @Override + public List get(CTX context) { + if (this.predicates.isEmpty()) { + return Arrays.asList(CraftEngine.instance().networkManager().onlineUsers()); + } else { + List players = new ArrayList<>(); + outer: for (Player player : CraftEngine.instance().networkManager().onlineUsers()) { + PlayerOptionalContext newContext = PlayerOptionalContext.of(player, ContextHolder.builder() + .withOptionalParameter(CommonParameters.WORLD, context.getOptionalParameter(CommonParameters.WORLD).orElse(null)) + .withOptionalParameter(CommonParameters.LOCATION, context.getOptionalParameter(CommonParameters.LOCATION).orElse(null)) + ); + for (Condition predicate : this.predicates) { + if (!predicate.test((CTX) newContext)) { + continue outer; + } + } + players.add(player); + } + return players; + } + } + + @Override + public Key type() { + return PlayerSelectors.ALL; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelector.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelector.java new file mode 100644 index 000000000..1c70278d2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelector.java @@ -0,0 +1,14 @@ +package net.momirealms.craftengine.core.plugin.context.selector; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; + +public interface PlayerSelector { + + List get(CTX context); + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelectors.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelectors.java new file mode 100644 index 000000000..ae5010c81 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/PlayerSelectors.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.plugin.context.selector; + +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.Key; + +public class PlayerSelectors { + public static final Key ALL = Key.of("craftengine:all"); + public static final Key SELF = Key.of("craftengine:self"); + + public static PlayerSelector fromObject(Object object) { + if (object == null) return null; + if (object instanceof String string) { + if (string.equals("self") || string.equals("@self") || string.equals("@s")) { + return new SelfPlayerSelector<>(); + } else if (string.equals("all") || string.equals("@all") || string.equals("@a")) { + return new AllPlayerSelector<>(); + } + } + throw new UnsupportedOperationException("Not supported yet."); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/SelfPlayerSelector.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/SelfPlayerSelector.java new file mode 100644 index 000000000..ea749f3ba --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/selector/SelfPlayerSelector.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.plugin.context.selector; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.parameter.CommonParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; + +public class SelfPlayerSelector implements PlayerSelector { + + @Override + public List get(CTX context) { + return List.of(context.getParameterOrThrow(CommonParameters.PLAYER)); + } + + @Override + public Key type() { + return PlayerSelectors.SELF; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/PlainTextProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/PlainTextProvider.java new file mode 100644 index 000000000..44f481026 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/PlainTextProvider.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.core.plugin.context.text; + +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.Key; + +public class PlainTextProvider implements TextProvider { + private final String text; + + public PlainTextProvider(String text) { + this.text = text; + } + + public static PlainTextProvider of(String text) { + return new PlainTextProvider(text); + } + + @Override + public String get(Context context) { + return this.text; + } + + @Override + public Key type() { + return TextProviders.PLAIN; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TagTextProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TagTextProvider.java new file mode 100644 index 000000000..11c63ac21 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TagTextProvider.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.core.plugin.context.text; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.Key; + +public class TagTextProvider implements TextProvider { + private final String text; + + public TagTextProvider(String text) { + this.text = text; + } + + public static TagTextProvider of(String text) { + return new TagTextProvider(text); + } + + @Override + public String get(Context context) { + Component resultComponent = AdventureHelper.customMiniMessage().deserialize(this.text, context.tagResolvers()); + return AdventureHelper.plainTextContent(resultComponent); + } + + @Override + public Key type() { + return TextProviders.TAG; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProvider.java new file mode 100644 index 000000000..5bd2b1950 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProvider.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.plugin.context.text; + +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.util.Key; + +public interface TextProvider { + + String get(Context context); + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProviders.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProviders.java new file mode 100644 index 000000000..b55de1e34 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/text/TextProviders.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.plugin.context.text; + +import net.momirealms.craftengine.core.util.Key; + +public class TextProviders { + public static final Key PLAIN = Key.of("craftengine:plain"); + public static final Key TAG = Key.of("craftengine:tag"); + + public static TextProvider fromString(String string) { + if (!string.contains("<") || !string.contains(">")) { + return PlainTextProvider.of(string); + } + return TagTextProvider.of(string); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventConditions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventConditions.java new file mode 100644 index 000000000..b6883e577 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventConditions.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.core.plugin.event; + +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.PlayerBlockActionContext; +import net.momirealms.craftengine.core.plugin.context.condition.InvertedCondition; +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.util.Factory; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.util.Map; + +public class BlockEventConditions { + + public static Condition fromMap(Map map) { + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "TODO I18N"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); + if (key.value().charAt(0) == '!') { + Factory> factory = BuiltInRegistries.PLAYER_BLOCK_CONDITION_FACTORY.getValue(new Key(key.namespace(), key.value().substring(1))); + if (factory == null) { + throw new LocalizedResourceConfigException("TODO I18N", type); + } + return new InvertedCondition<>(factory.create(map)); + } else { + Factory> factory = BuiltInRegistries.PLAYER_BLOCK_CONDITION_FACTORY.getValue(key); + if (factory == null) { + throw new LocalizedResourceConfigException("TODO I18N", type); + } + return factory.create(map); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventFunctions.java new file mode 100644 index 000000000..885e7fec2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/BlockEventFunctions.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.plugin.event; + +import net.momirealms.craftengine.core.plugin.context.PlayerBlockActionContext; +import net.momirealms.craftengine.core.plugin.context.function.CommandFunction; +import net.momirealms.craftengine.core.plugin.context.function.CommonFunctions; +import net.momirealms.craftengine.core.plugin.context.function.Function; +import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Factory; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class BlockEventFunctions { + + static { + register(CommonFunctions.COMMAND, new CommandFunction.FactoryImpl<>(BlockEventConditions::fromMap)); + } + + public static void register(Key key, Factory> factory) { + Holder.Reference>> holder = ((WritableRegistry>>) BuiltInRegistries.PLAYER_BLOCK_FUNCTION_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.PLAYER_BLOCK_FUNCTION_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static Function fromMap(Map map) { + String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "TODO I18N"); + Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); + Factory> factory = BuiltInRegistries.PLAYER_BLOCK_FUNCTION_FACTORY.getValue(key); + if (factory == null) { + throw new LocalizedResourceConfigException("TODO I18N", type); + } + return factory.create(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 new file mode 100644 index 000000000..2ea3421eb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/EventTrigger.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.plugin.event; + +public enum EventTrigger { + USE_ITEM, + USE_ITEM_ON, + CONSUME, + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/Trigger.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/Trigger.java deleted file mode 100644 index 4eb301457..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/Trigger.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.momirealms.craftengine.core.plugin.event; - -import net.momirealms.craftengine.core.util.Key; - -public class Trigger { - private final Key id; - - public Trigger(Key id) { - this.id = id; - } - - public Key id() { - return id; - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/Triggers.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/event/Triggers.java deleted file mode 100644 index 474bf48a6..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/event/Triggers.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.momirealms.craftengine.core.plugin.event; - -import net.momirealms.craftengine.core.util.Key; - -import java.util.HashMap; -import java.util.Map; - -public class Triggers { - public static final Map TRIGGERS = new HashMap<>(); - - public static final Trigger USE_ITEM = create(Key.of("use_item")); - public static final Trigger INTERACT = create(Key.of("interact")); - public static final Trigger CONSUME = create(Key.of("consume")); - public static final Trigger BREAK = create(Key.of("break")); - - private static Trigger create(Key id) { - Trigger trigger = new Trigger(id); - TRIGGERS.put(id, trigger); - return trigger; - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java index facef471a..8d2b0c0ba 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java @@ -19,7 +19,7 @@ public interface NetworkManager extends Manageable { Channel getChannel(Player player); - NetWorkUser[] onlineUsers(); + Player[] onlineUsers(); default void sendPacket(@NotNull NetWorkUser player, Object packet) { sendPacket(player, packet, false); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ExpressionTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ExpressionTag.java new file mode 100644 index 000000000..a0f58cc91 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ExpressionTag.java @@ -0,0 +1,59 @@ +package net.momirealms.craftengine.core.plugin.text.minimessage; + +import com.ezylang.evalex.EvaluationException; +import com.ezylang.evalex.Expression; +import com.ezylang.evalex.parser.ParseException; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.util.AdventureHelper; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; +import java.util.Objects; + +public class ExpressionTag implements TagResolver { + private final net.momirealms.craftengine.core.plugin.context.Context context; + + public ExpressionTag(@NotNull net.momirealms.craftengine.core.plugin.context.Context context) { + this.context = Objects.requireNonNull(context, "context"); + } + + @Override + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + if (!has(name)) { + return null; + } + + String format = arguments.popOr("No format provided").toString(); + String expr = arguments.popOr("No expression provided").toString(); + + Component resultComponent = AdventureHelper.customMiniMessage().deserialize(expr, context.tagResolvers()); + String resultString = AdventureHelper.plainTextContent(resultComponent); + Expression expression = new Expression(resultString); + + try { + Number numberValue = expression.evaluate().getNumberValue(); + DecimalFormat df = new DecimalFormat(format); + DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US); + df.setDecimalFormatSymbols(symbols); + String formatted = df.format(numberValue); + return Tag.selfClosingInserting(Component.text(formatted)); + } catch (IllegalArgumentException e) { + throw ctx.newException("Invalid number format: " + format, arguments); + } catch (EvaluationException | ParseException e) { + throw ctx.newException("Invalid expression: " + e.getMessage(), arguments); + } + } + + @Override + public boolean has(@NotNull String name) { + return "expr".equals(name); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java index 920796809..b0fa17a5b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/I18NTag.java @@ -24,11 +24,11 @@ public class I18NTag implements TagResolver { } String i18nKey = arguments.popOr("No argument i18n key provided").toString(); String translation = TranslationManager.instance().miniMessageTranslation(i18nKey); - return Tag.inserting(AdventureHelper.miniMessage().deserialize(translation, this.context.tagResolvers())); + return Tag.selfClosingInserting(AdventureHelper.miniMessage().deserialize(translation, this.context.tagResolvers())); } @Override public boolean has(@NotNull String name) { - return "i18n".equals(name) || "l10n".equals(name); + return "i18n".equals(name); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ImageTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ImageTag.java index a6d718aea..6ba90c439 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ImageTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ImageTag.java @@ -34,9 +34,9 @@ public class ImageTag implements TagResolver { if (arguments.hasNext()) { int row = arguments.popOr("No argument row provided").asInt().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); int column = arguments.popOr("No argument column provided").asInt().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); - return Tag.inserting(Component.empty().children(List.of(optional.get().componentAt(row,column)))); + return Tag.selfClosingInserting(Component.empty().children(List.of(optional.get().componentAt(row,column)))); } else { - return Tag.inserting(Component.empty().children(List.of(optional.get().componentAt(0,0)))); + return Tag.selfClosingInserting(Component.empty().children(List.of(optional.get().componentAt(0,0)))); } } else { throw ctx.newException("Invalid image id", arguments); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/IndexedArgumentTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/IndexedArgumentTag.java index 098b4f6e0..f8a4f6c0e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/IndexedArgumentTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/IndexedArgumentTag.java @@ -13,9 +13,6 @@ import java.util.List; import java.util.Objects; public class IndexedArgumentTag implements TagResolver { - private static final String NAME_0 = "argument"; - private static final String NAME_1 = "arg"; - private final List argumentComponents; public IndexedArgumentTag(@NotNull List argumentComponents) { @@ -39,6 +36,6 @@ public class IndexedArgumentTag implements TagResolver { @Override public boolean has(@NotNull String name) { - return name.equals(NAME_0) || name.equals(NAME_1); + return name.equals("arg"); } } \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java index c2db728c5..595be9c85 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/NamedArgumentTag.java @@ -14,9 +14,6 @@ import java.util.Objects; import java.util.Optional; public class NamedArgumentTag implements TagResolver { - private static final String NAME_0 = "argument"; - private static final String NAME_1 = "arg"; - private final Context context; public NamedArgumentTag(@NotNull Context context) { @@ -39,6 +36,6 @@ public class NamedArgumentTag implements TagResolver { @Override public boolean has(@NotNull String name) { - return name.equals(NAME_0) || name.equals(NAME_1); + return name.equals("arg"); } } \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/PlaceholderTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/PlaceholderTag.java index 07ac1d36d..c326b284b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/PlaceholderTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/PlaceholderTag.java @@ -28,7 +28,7 @@ public class PlaceholderTag implements TagResolver { if (parsed.equals(placeholder)) { parsed = arguments.popOr("No default papi value provided").toString(); } - return Tag.inserting(AdventureHelper.miniMessage().deserialize(parsed)); + return Tag.selfClosingInserting(AdventureHelper.miniMessage().deserialize(parsed)); } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ShiftTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ShiftTag.java index e5ccf26ae..6ed7fdb3f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ShiftTag.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ShiftTag.java @@ -25,7 +25,7 @@ public class ShiftTag implements TagResolver { String shiftAmount = arguments.popOr("No argument shift provided").toString(); try { int shift = Integer.parseInt(shiftAmount); - return Tag.inserting(AdventureHelper.miniMessage().deserialize(CraftEngine.instance().fontManager().createMiniMessageOffsets(shift))); + return Tag.selfClosingInserting(AdventureHelper.miniMessage().deserialize(CraftEngine.instance().fontManager().createMiniMessageOffsets(shift))); } catch (NumberFormatException e) { throw ctx.newException("Invalid shift value", arguments); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerNamedArgumentTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerNamedArgumentTag.java new file mode 100644 index 000000000..e1c2d5e94 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerNamedArgumentTag.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.plugin.text.minimessage; + +import net.momirealms.craftengine.core.plugin.context.Context; +import org.jetbrains.annotations.NotNull; + +public class ViewerNamedArgumentTag extends NamedArgumentTag { + + public ViewerNamedArgumentTag(@NotNull Context context) { + super(context); + } + + @Override + public boolean has(@NotNull String name) { + return name.equals("viewer_arg"); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerPlaceholderTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerPlaceholderTag.java new file mode 100644 index 000000000..397a891ff --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/text/minimessage/ViewerPlaceholderTag.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.core.plugin.text.minimessage; + +import net.momirealms.craftengine.core.entity.player.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class ViewerPlaceholderTag extends PlaceholderTag { + + public ViewerPlaceholderTag(@Nullable Player player) { + super(player); + } + + @Override + public boolean has(@NotNull String name) { + return "viewer_papi".equals(name); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java index 097387d80..a92d3db1d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java @@ -9,7 +9,7 @@ import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe import net.momirealms.craftengine.core.item.recipe.RecipeFactory; import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; -import net.momirealms.craftengine.core.loot.function.LootFunctionApplyBonusCount; +import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction; import net.momirealms.craftengine.core.loot.function.LootFunctionFactory; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.pack.conflict.resolution.ResolutionFactory; @@ -22,6 +22,9 @@ import net.momirealms.craftengine.core.pack.model.special.SpecialModelFactory; import net.momirealms.craftengine.core.pack.model.tint.TintFactory; import net.momirealms.craftengine.core.plugin.config.template.TemplateArgumentFactory; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.PlayerBlockActionContext; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; +import net.momirealms.craftengine.core.plugin.context.function.Function; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; @@ -30,13 +33,13 @@ import net.momirealms.craftengine.core.util.ResourceKey; public class BuiltInRegistries { public static final Registry BLOCK = createRegistry(Registries.BLOCK); public static final Registry OPTIMIZED_ITEM_ID = createRegistry(Registries.OPTIMIZED_ITEM_ID); - public static final Registry PROPERTY_FACTORY = createRegistry(Registries.PROPERTY_FACTORY); public static final Registry BLOCK_BEHAVIOR_FACTORY = createRegistry(Registries.BLOCK_BEHAVIOR_FACTORY); + public static final Registry ITEM_BEHAVIOR_FACTORY = createRegistry(Registries.ITEM_BEHAVIOR_FACTORY); + public static final Registry PROPERTY_FACTORY = createRegistry(Registries.PROPERTY_FACTORY); public static final Registry> LOOT_FUNCTION_FACTORY = createRegistry(Registries.LOOT_FUNCTION_FACTORY); - public static final Registry>> LOOT_CONDITION_FACTORY = createRegistry(Registries.LOOT_CONDITION_FACTORY); + public static final Registry> LOOT_CONDITION_FACTORY = createRegistry(Registries.LOOT_CONDITION_FACTORY); public static final Registry> LOOT_ENTRY_CONTAINER_FACTORY = createRegistry(Registries.LOOT_ENTRY_CONTAINER_FACTORY); public static final Registry> NUMBER_PROVIDER_FACTORY = createRegistry(Registries.NUMBER_PROVIDER_FACTORY); - public static final Registry ITEM_BEHAVIOR_FACTORY = createRegistry(Registries.ITEM_BEHAVIOR_FACTORY); public static final Registry TEMPLATE_ARGUMENT_FACTORY = createRegistry(Registries.TEMPLATE_ARGUMENT_FACTORY); public static final Registry ITEM_MODEL_FACTORY = createRegistry(Registries.ITEM_MODEL_FACTORY); public static final Registry TINT_FACTORY = createRegistry(Registries.TINT_FACTORY); @@ -45,12 +48,14 @@ public class BuiltInRegistries { public static final Registry CONDITION_PROPERTY_FACTORY = createRegistry(Registries.CONDITION_PROPERTY_FACTORY); public static final Registry SELECT_PROPERTY_FACTORY = createRegistry(Registries.SELECT_PROPERTY_FACTORY); public static final Registry> RECIPE_FACTORY = createRegistry(Registries.RECIPE_FACTORY); - public static final Registry FORMULA_FACTORY = createRegistry(Registries.FORMULA_FACTORY); - public static final Registry>> PATH_MATCHER_FACTORY = createRegistry(Registries.PATH_MATCHER_FACTORY); + public static final Registry FORMULA_FACTORY = createRegistry(Registries.FORMULA_FACTORY); + public static final Registry> PATH_MATCHER_FACTORY = createRegistry(Registries.PATH_MATCHER_FACTORY); public static final Registry RESOLUTION_FACTORY = createRegistry(Registries.RESOLUTION_FACTORY); - public static final Registry SMITHING_RESULT_PROCESSOR_FACTORY = createRegistry(Registries.SMITHING_RESULT_PROCESSOR_FACTORY); + public static final Registry SMITHING_RESULT_PROCESSOR_FACTORY = createRegistry(Registries.SMITHING_RESULT_PROCESSOR_FACTORY); public static final Registry HITBOX_FACTORY = createRegistry(Registries.HITBOX_FACTORY); public static final Registry RESOURCE_PACK_HOST_FACTORY = createRegistry(Registries.RESOURCE_PACK_HOST_FACTORY); + public static final Registry>> PLAYER_BLOCK_FUNCTION_FACTORY = createRegistry(Registries.PLAYER_BLOCK_FUNCTION_FACTORY); + public static final Registry>> PLAYER_BLOCK_CONDITION_FACTORY = createRegistry(Registries.PLAYER_BLOCK_CONDITION_FACTORY); private static Registry createRegistry(ResourceKey> key) { return new MappedRegistry<>(key); diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java index b67a7b1ad..434302ba9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java @@ -9,7 +9,7 @@ import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe import net.momirealms.craftengine.core.item.recipe.RecipeFactory; import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; -import net.momirealms.craftengine.core.loot.function.LootFunctionApplyBonusCount; +import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction; import net.momirealms.craftengine.core.loot.function.LootFunctionFactory; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.pack.conflict.resolution.ResolutionFactory; @@ -22,6 +22,9 @@ import net.momirealms.craftengine.core.pack.model.special.SpecialModelFactory; import net.momirealms.craftengine.core.pack.model.tint.TintFactory; import net.momirealms.craftengine.core.plugin.config.template.TemplateArgumentFactory; import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.PlayerBlockActionContext; +import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory; +import net.momirealms.craftengine.core.plugin.context.function.Function; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.util.Factory; import net.momirealms.craftengine.core.util.Key; @@ -36,7 +39,7 @@ public class Registries { public static final ResourceKey> ITEM_BEHAVIOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("item_behavior_factory")); public static final ResourceKey>> LOOT_FUNCTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_function_factory")); public static final ResourceKey>> LOOT_ENTRY_CONTAINER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_entry_container_factory")); - public static final ResourceKey>>> LOOT_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_condition_factory")); + public static final ResourceKey>> LOOT_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_condition_factory")); public static final ResourceKey>> NUMBER_PROVIDER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("number_provider_factory")); public static final ResourceKey> TEMPLATE_ARGUMENT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("template_argument_factory")); public static final ResourceKey> ITEM_MODEL_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("item_model_factory")); @@ -46,10 +49,12 @@ public class Registries { public static final ResourceKey> CONDITION_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("condition_property_factory")); public static final ResourceKey> SELECT_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("select_property_factory")); public static final ResourceKey>> RECIPE_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_factory")); - public static final ResourceKey> FORMULA_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("formula_factory")); - public static final ResourceKey>>> PATH_MATCHER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("path_matcher_factory")); + public static final ResourceKey> FORMULA_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("formula_factory")); + public static final ResourceKey>> PATH_MATCHER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("path_matcher_factory")); public static final ResourceKey> RESOLUTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("resolution_factory")); - public static final ResourceKey> SMITHING_RESULT_PROCESSOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("smithing_result_processor_factory")); + public static final ResourceKey> SMITHING_RESULT_PROCESSOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("smithing_result_processor_factory")); public static final ResourceKey> HITBOX_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("hitbox_factory")); public static final ResourceKey> RESOURCE_PACK_HOST_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("resource_pack_host_factory")); + public static final ResourceKey>>> PLAYER_BLOCK_FUNCTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("player_block_function_factory")); + public static final ResourceKey>>> PLAYER_BLOCK_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("player_block_condition_factory")); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Key.java b/core/src/main/java/net/momirealms/craftengine/core/util/Key.java index c769b1738..ed43ffe8c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/Key.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Key.java @@ -1,5 +1,7 @@ package net.momirealms.craftengine.core.util; +import org.jetbrains.annotations.NotNull; + public record Key(String namespace, String value) { public static final String DEFAULT_NAMESPACE = "craftengine"; @@ -27,6 +29,10 @@ public record Key(String namespace, String value) { return of(decompose(namespacedId, "minecraft")); } + public static Key fromNamespaceAndPath(String namespace, String path) { + return Key.of(namespace, path); + } + public String[] decompose() { return new String[] { namespace, value }; } @@ -47,7 +53,7 @@ public record Key(String namespace, String value) { } @Override - public String toString() { + public @NotNull String toString() { return namespace + ":" + value; } diff --git a/gradle.properties b/gradle.properties index 69b28ee28..788fe5770 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.jvmargs=-Xmx1G # Rule: [major update].[feature update].[bug fix] project_version=0.0.53-beta.3 config_version=31 -lang_version=10 +lang_version=11 project_group=net.momirealms latest_supported_version=1.21.5 @@ -39,7 +39,7 @@ lz4_version=1.8.0 geantyref_version=1.3.16 zstd_version=1.5.7-2 commons_io_version=2.18.0 -sparrow_nbt_version=0.7.1 +sparrow_nbt_version=0.7.3 sparrow_util_version=0.39 fastutil_version=8.5.15 netty_version=4.1.119.Final