From 3c8a0fdeab104368d51b095c931a78e5c55c3e89 Mon Sep 17 00:00:00 2001 From: pietru Date: Sat, 30 Mar 2024 00:56:45 +0100 Subject: [PATCH] Add BlockEntities support as optional/soft dependency --- build.gradle | 2 + gradle.properties | 2 +- .../java/net/pietru/omni_power/OmniPower.java | 9 +- .../pietru/omni_power/api/EPowerProducer.java | 15 +++ .../pietru/omni_power/api/IPowerClient.java | 5 + .../pietru/omni_power/api/IPowerProducer.java | 8 ++ .../pietru/omni_power/blockevents/Power.java | 74 ++++++++++++--- .../adapter/cable_adapter_blue_off.json | 86 ++++++++++++++++++ .../adapter/cable_adapter_blue_on.json | 86 ++++++++++++++++++ .../adapter/cable_adapter_red_off.json | 86 ++++++++++++++++++ .../adapter/cable_adapter_red_on.json | 86 ++++++++++++++++++ .../omni_power/blocks/cable_adapter.json | 53 +++++++++++ .../adapter/model_cable_adapter_blue.json | 19 ++++ .../adapter/model_cable_adapter_red.json | 19 ++++ .../textures/blocks/cable_adapter_blue.png | Bin 0 -> 7094 bytes .../textures/blocks/cable_adapter_red.png | Bin 0 -> 4794 bytes src/main/resources/quilt.mod.json | 7 ++ 17 files changed, 540 insertions(+), 17 deletions(-) create mode 100644 src/main/java/net/pietru/omni_power/api/EPowerProducer.java create mode 100644 src/main/java/net/pietru/omni_power/api/IPowerClient.java create mode 100644 src/main/java/net/pietru/omni_power/api/IPowerProducer.java create mode 100644 src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_blue_off.json create mode 100644 src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_blue_on.json create mode 100644 src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_red_off.json create mode 100644 src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_red_on.json create mode 100644 src/main/resources/assets/omni_power/blocks/cable_adapter.json create mode 100644 src/main/resources/assets/omni_power/models/blocks/adapter/model_cable_adapter_blue.json create mode 100644 src/main/resources/assets/omni_power/models/blocks/adapter/model_cable_adapter_red.json create mode 100644 src/main/resources/assets/omni_power/textures/blocks/cable_adapter_blue.png create mode 100644 src/main/resources/assets/omni_power/textures/blocks/cable_adapter_red.png diff --git a/build.gradle b/build.gradle index dd0f41f..7fab9fc 100644 --- a/build.gradle +++ b/build.gradle @@ -66,6 +66,8 @@ dependencies { //quiltMod "quilt-mod:resource-loader:1.0.2" quiltMod "com.github.CRModders:FluxAPI:0.4.0" + + quiltMod "com.github.ForwarD-NerN:BlockEntityPrototype:master-SNAPSHOT" } processResources { diff --git a/gradle.properties b/gradle.properties index b7d3775..5b29bc3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.caching=false # Project Info - version=1.1.1 + version=1.2.0 group=net.pietru id=omni_power diff --git a/src/main/java/net/pietru/omni_power/OmniPower.java b/src/main/java/net/pietru/omni_power/OmniPower.java index 7a2701b..622a1ef 100644 --- a/src/main/java/net/pietru/omni_power/OmniPower.java +++ b/src/main/java/net/pietru/omni_power/OmniPower.java @@ -6,19 +6,24 @@ import finalforeach.cosmicreach.world.blockevents.BlockEvents; import net.pietru.omni_power.blockevents.Power; import org.coolcosmos.cosmicquilt.api.entrypoint.ModInitializer; import org.quiltmc.loader.api.ModContainer; +import org.quiltmc.loader.api.QuiltLoader; public class OmniPower implements ModInitializer { public static final String MOD_ID = "omni_power"; + public static boolean block_entities = false; public static final String[] blocks = { "cable", "lever", "door_cube", - "cable_merger" + "cable_merger", + "cable_adapter" }; @Override public void onInitialize(ModContainer mod) { + if (QuiltLoader.isModLoaded("becraft")) + block_entities=true; System.out.println("Pop Structures Mod Initialized!"); - BlockEvents.registerBlockEventAction(new Power()); + BlockEvents.registerBlockEventAction(new Power(block_entities)); for (String block:blocks) { BlockBuilderUtils.getBlockFromJson(new Identifier(MOD_ID, block)); } diff --git a/src/main/java/net/pietru/omni_power/api/EPowerProducer.java b/src/main/java/net/pietru/omni_power/api/EPowerProducer.java new file mode 100644 index 0000000..43c6d82 --- /dev/null +++ b/src/main/java/net/pietru/omni_power/api/EPowerProducer.java @@ -0,0 +1,15 @@ +package net.pietru.omni_power.api; + +import finalforeach.cosmicreach.world.BlockPosition; +import finalforeach.cosmicreach.world.World; +import ru.nern.becraft.bed.api.BlockEntity; +import ru.nern.becraft.bed.api.BlockEntityType; + + +public abstract class EPowerProducer extends BlockEntity implements IPowerProducer{ + public EPowerProducer(BlockEntityType type, World world, BlockPosition blockPos) { + super(type, world, blockPos); + } + + public abstract void send_to_client(BlockEntity client); +} diff --git a/src/main/java/net/pietru/omni_power/api/IPowerClient.java b/src/main/java/net/pietru/omni_power/api/IPowerClient.java new file mode 100644 index 0000000..082cfea --- /dev/null +++ b/src/main/java/net/pietru/omni_power/api/IPowerClient.java @@ -0,0 +1,5 @@ +package net.pietru.omni_power.api; + + +public interface IPowerClient { +} diff --git a/src/main/java/net/pietru/omni_power/api/IPowerProducer.java b/src/main/java/net/pietru/omni_power/api/IPowerProducer.java new file mode 100644 index 0000000..e7ec399 --- /dev/null +++ b/src/main/java/net/pietru/omni_power/api/IPowerProducer.java @@ -0,0 +1,8 @@ +package net.pietru.omni_power.api; + +import ru.nern.becraft.bed.api.BlockEntity; + + +public interface IPowerProducer{ + void send_to_client(BlockEntity client); +} diff --git a/src/main/java/net/pietru/omni_power/blockevents/Power.java b/src/main/java/net/pietru/omni_power/blockevents/Power.java index a880ca8..c9e57ac 100644 --- a/src/main/java/net/pietru/omni_power/blockevents/Power.java +++ b/src/main/java/net/pietru/omni_power/blockevents/Power.java @@ -8,11 +8,21 @@ import finalforeach.cosmicreach.world.blockevents.BlockEventTrigger; import finalforeach.cosmicreach.world.blockevents.IBlockEventAction; import finalforeach.cosmicreach.world.blocks.BlockState; import net.pietru.omni_power.OmniPower; +import net.pietru.omni_power.api.EPowerProducer; +import net.pietru.omni_power.api.IPowerClient; +import net.pietru.omni_power.api.IPowerProducer; +import ru.nern.becraft.bed.BEUtils; +import ru.nern.becraft.bed.api.BlockEntity; import java.util.HashMap; import java.util.Map; public class Power implements IBlockEventAction { + public static boolean block_entities = false; + + public Power(boolean block_entities_enabled){ + block_entities=block_entities_enabled; + } @Override public String getActionId() { System.out.println("Registering "+ OmniPower.MOD_ID+":power"); @@ -28,9 +38,16 @@ public class Power implements IBlockEventAction { OrderedMap p = blockEventTrigger.getParams(); String triggerId = (String)p.get("triggerId"); String cable_group = (String)p.get("cable_group"); - Boolean self_run = true; + boolean self_run = true; if (p.containsKey("self_run")) { - self_run = (Boolean)p.get("self_run"); + self_run = (boolean)p.get("self_run"); + } + boolean source_be = false; + BlockEntity source_entity = null; + if (block_entities){ + source_entity = BEUtils.getBlockEntity(sourcePos); + if (source_entity!=null) + source_be = (source_entity instanceof IPowerProducer); } Array power_transmitters = new Array<>(); Array checked_blocks = new Array<>(); @@ -50,6 +67,12 @@ public class Power implements IBlockEventAction { if (to_check!=sourcePos || self_run){ runTrigger(triggerId,to_check,world); } + if (block_entities && source_be){ + BlockEntity target_entity = BEUtils.getBlockEntity(sourcePos); + if (target_entity!=null) + if (target_entity instanceof IPowerClient) + ((EPowerProducer)source_entity).send_to_client(target_entity); + } if (targetBlockState.stringId.contains(cable_group)){ power_transmitters.add(to_check); unchecked_blocks.addAll(get_touching_positions(world,to_check,targetBlockState)); @@ -83,20 +106,27 @@ public class Power implements IBlockEventAction { public Array get_touching_positions(World world,BlockPosition pos,BlockState state){ Array arr = new Array<>(); - if (state.stringId.contains("xp_power")) - arr.add(pos.getOffsetBlockPos(world, 1, 0, 0)); - if (state.stringId.contains("xm_power")) - arr.add(pos.getOffsetBlockPos(world, -1, 0, 0)); + BlockPosition side_pos; + side_pos = pos.getOffsetBlockPos(world, 1, 0, 0); + if (state.stringId.contains("xp_power") && block_has_dir_or_all(side_pos,"xm_power")) + arr.add(side_pos); + side_pos = pos.getOffsetBlockPos(world, -1, 0, 0); + if (state.stringId.contains("xm_power") && block_has_dir_or_all(side_pos,"xp_power")) + arr.add(side_pos); - if (state.stringId.contains("yp_power")) - arr.add(pos.getOffsetBlockPos(world, 0, 1, 0)); - if (state.stringId.contains("ym_power")) - arr.add(pos.getOffsetBlockPos(world, 0, -1, 0)); + side_pos = pos.getOffsetBlockPos(world, 0, 1, 0); + if (state.stringId.contains("yp_power") && block_has_dir_or_all(side_pos,"ym_power")) + arr.add(side_pos); + side_pos = pos.getOffsetBlockPos(world, 0, -1, 0); + if (state.stringId.contains("ym_power") && block_has_dir_or_all(side_pos,"yp_power")) + arr.add(side_pos); - if (state.stringId.contains("zp_power")) - arr.add(pos.getOffsetBlockPos(world, 0, 0, 1)); - if (state.stringId.contains("zm_power")) - arr.add(pos.getOffsetBlockPos(world, 0, 0, -1)); + side_pos = pos.getOffsetBlockPos(world, 0, 0, 1); + if (state.stringId.contains("zp_power") && block_has_dir_or_all(side_pos,"zm_power")) + arr.add(side_pos); + side_pos = pos.getOffsetBlockPos(world, 0, 0, -1); + if (state.stringId.contains("zm_power") && block_has_dir_or_all(side_pos,"zp_power")) + arr.add(side_pos); if (arr.size<=0) { arr.add(pos.getOffsetBlockPos(world, 1, 0, 0)); @@ -110,4 +140,20 @@ public class Power implements IBlockEventAction { } return arr; } + + public Boolean block_has_dir_or_all(BlockPosition pos, String dir){ + if (pos==null) + return false; + BlockState state = pos.getBlockState(); + if (state==null) + return false; + return state.stringId.contains(dir) || !( + state.stringId.contains("xp_power")|| + state.stringId.contains("xm_power")|| + state.stringId.contains("yp_power")|| + state.stringId.contains("ym_power")|| + state.stringId.contains("zp_power")|| + state.stringId.contains("zm_power") + ); + } } diff --git a/src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_blue_off.json b/src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_blue_off.json new file mode 100644 index 0000000..6b4c197 --- /dev/null +++ b/src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_blue_off.json @@ -0,0 +1,86 @@ +{ + "parent":"base:block_events_default", + "stringId": "omni_power:adapter/cable_adapter_blue_off", + "triggers": + { + "universal_power": + [ + { + "actionId": "base:replace_block_state", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": 0, + "blockStateId": "omni_power:cable_adapter[powered,cable_blue]" + } + }, + { + "actionId": "omni_power:power", + "parameters": + { + "triggerId": "power_up_blue", + "cable_group": "cable_blue", + "self_run": false + } + } + ], + "power_up_blue": + [ + { + "actionId": "base:replace_block_state", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": 0, + "blockStateId": "omni_power:cable_adapter[powered,cable_blue]" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 1, "yOff": 0, "zOff": 0, + "triggerId": "universal_power" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": -1, "yOff": 0, "zOff": 0, + "triggerId": "universal_power" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": 1, "zOff": 0, + "triggerId": "universal_power" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": -1, "zOff": 0, + "triggerId": "universal_power" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": 1, + "triggerId": "universal_power" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": -1, + "triggerId": "universal_power" + } + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_blue_on.json b/src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_blue_on.json new file mode 100644 index 0000000..2bcfe0f --- /dev/null +++ b/src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_blue_on.json @@ -0,0 +1,86 @@ +{ + "parent":"base:block_events_default", + "stringId": "omni_power:adapter/cable_adapter_blue_on", + "triggers": + { + "universal_unpower": + [ + { + "actionId": "base:replace_block_state", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": 0, + "blockStateId": "omni_power:cable_adapter[default,cable_blue]" + } + }, + { + "actionId": "omni_power:power", + "parameters": + { + "triggerId": "power_down_blue", + "cable_group": "cable_blue", + "self_run": false + } + } + ], + "power_down_blue": + [ + { + "actionId": "base:replace_block_state", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": 0, + "blockStateId": "omni_power:cable_adapter[default,cable_blue]" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 1, "yOff": 0, "zOff": 0, + "triggerId": "universal_unpower" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": -1, "yOff": 0, "zOff": 0, + "triggerId": "universal_unpower" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": 1, "zOff": 0, + "triggerId": "universal_unpower" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": -1, "zOff": 0, + "triggerId": "universal_unpower" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": 1, + "triggerId": "universal_unpower" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": -1, + "triggerId": "universal_unpower" + } + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_red_off.json b/src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_red_off.json new file mode 100644 index 0000000..5e55dba --- /dev/null +++ b/src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_red_off.json @@ -0,0 +1,86 @@ +{ + "parent":"base:block_events_default", + "stringId": "omni_power:adapter/cable_adapter_red_off", + "triggers": + { + "universal_power": + [ + { + "actionId": "base:replace_block_state", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": 0, + "blockStateId": "omni_power:cable_adapter[powered,cable_red]" + } + }, + { + "actionId": "omni_power:power", + "parameters": + { + "triggerId": "power_up_red", + "cable_group": "cable_red", + "self_run": false + } + } + ], + "power_up_red": + [ + { + "actionId": "base:replace_block_state", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": 0, + "blockStateId": "omni_power:cable_adapter[powered,cable_red]" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 1, "yOff": 0, "zOff": 0, + "triggerId": "universal_power" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": -1, "yOff": 0, "zOff": 0, + "triggerId": "universal_power" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": 1, "zOff": 0, + "triggerId": "universal_power" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": -1, "zOff": 0, + "triggerId": "universal_power" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": 1, + "triggerId": "universal_power" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": -1, + "triggerId": "universal_power" + } + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_red_on.json b/src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_red_on.json new file mode 100644 index 0000000..2693457 --- /dev/null +++ b/src/main/resources/assets/omni_power/block_events/adapter/cable_adapter_red_on.json @@ -0,0 +1,86 @@ +{ + "parent":"base:block_events_default", + "stringId": "omni_power:adapter/cable_adapter_red_on", + "triggers": + { + "universal_unpower": + [ + { + "actionId": "base:replace_block_state", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": 0, + "blockStateId": "omni_power:cable_adapter[default,cable_red]" + } + }, + { + "actionId": "omni_power:power", + "parameters": + { + "triggerId": "power_down_red", + "cable_group": "cable_red", + "self_run": false + } + } + ], + "power_down_red": + [ + { + "actionId": "base:replace_block_state", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": 0, + "blockStateId": "omni_power:cable_adapter[default,cable_red]" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 1, "yOff": 0, "zOff": 0, + "triggerId": "universal_unpower" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": -1, "yOff": 0, "zOff": 0, + "triggerId": "universal_unpower" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": 1, "zOff": 0, + "triggerId": "universal_unpower" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": -1, "zOff": 0, + "triggerId": "universal_unpower" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": 1, + "triggerId": "universal_unpower" + } + }, + { + "actionId": "base:run_trigger", + "parameters": + { + "xOff": 0, "yOff": 0, "zOff": -1, + "triggerId": "universal_unpower" + } + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/omni_power/blocks/cable_adapter.json b/src/main/resources/assets/omni_power/blocks/cable_adapter.json new file mode 100644 index 0000000..8b98ada --- /dev/null +++ b/src/main/resources/assets/omni_power/blocks/cable_adapter.json @@ -0,0 +1,53 @@ +{ + "stringId": "omni_power:cable_adapter", + "blockStates": + { + "default,cable_red": + { + "modelName": "omni_power:adapter/model_cable_adapter_red", + "blockEventsId": "omni_power:adapter/cable_adapter_red_off", + "isTransparent": false, + "generateSlabs": false, + "isOpaque": true, + "lightLevelRed": 0, + "lightLevelGreen": 0, + "lightLevelBlue": 0 + }, + "powered,cable_red": + { + "modelName": "omni_power:adapter/model_cable_adapter_red", + "blockEventsId": "omni_power:adapter/cable_adapter_red_on", + "isTransparent": false, + "generateSlabs": false, + "isOpaque": true, + "lightLevelRed": 0, + "lightLevelGreen": 0, + "lightLevelBlue": 0, + "catalogHidden": true + }, + + "default,cable_blue": + { + "modelName": "omni_power:adapter/model_cable_adapter_blue", + "blockEventsId": "omni_power:adapter/cable_adapter_blue_off", + "isTransparent": false, + "generateSlabs": false, + "isOpaque": true, + "lightLevelRed": 0, + "lightLevelGreen": 0, + "lightLevelBlue": 0 + }, + "powered,cable_blue": + { + "modelName": "omni_power:adapter/model_cable_adapter_blue", + "blockEventsId": "omni_power:adapter/cable_adapter_blue_on", + "isTransparent": false, + "generateSlabs": false, + "isOpaque": true, + "lightLevelRed": 0, + "lightLevelGreen": 0, + "lightLevelBlue": 0, + "catalogHidden": true + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/omni_power/models/blocks/adapter/model_cable_adapter_blue.json b/src/main/resources/assets/omni_power/models/blocks/adapter/model_cable_adapter_blue.json new file mode 100644 index 0000000..e493392 --- /dev/null +++ b/src/main/resources/assets/omni_power/models/blocks/adapter/model_cable_adapter_blue.json @@ -0,0 +1,19 @@ +{ + "parent": "cube", + + "textures": + { + "top": + { + "fileName": "omni_power:cable_adapter_blue.png" + }, + "bottom": + { + "fileName": "omni_power:cable_adapter_blue.png" + }, + "side": + { + "fileName": "omni_power:cable_adapter_blue.png" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/omni_power/models/blocks/adapter/model_cable_adapter_red.json b/src/main/resources/assets/omni_power/models/blocks/adapter/model_cable_adapter_red.json new file mode 100644 index 0000000..27ee05e --- /dev/null +++ b/src/main/resources/assets/omni_power/models/blocks/adapter/model_cable_adapter_red.json @@ -0,0 +1,19 @@ +{ + "parent": "cube", + + "textures": + { + "top": + { + "fileName": "omni_power:cable_adapter_red.png" + }, + "bottom": + { + "fileName": "omni_power:cable_adapter_red.png" + }, + "side": + { + "fileName": "omni_power:cable_adapter_red.png" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/omni_power/textures/blocks/cable_adapter_blue.png b/src/main/resources/assets/omni_power/textures/blocks/cable_adapter_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..c25ae05ac330d0ceb62469a86b0062487afb89ef GIT binary patch literal 7094 zcmdT|3v3is6x|jBbXv+sOGH5m@@Y_UcHWyeGXh3vYbk`562w9wbar+J3PnmO+9JR3 z3nB%nfV8o;K|zIrP>N7K${!;jKdB{_4U$NMgitY|K}z+$H?!THvQQw9bZ0a3=KbzH z=iGZ=HuKT>#``3!KenYZE^>W(2hD=-s*{JiGq$pK7xOeV7&d*Y__OVt5*(< zib?8xbS{eSk#}NH>8{X{sBW)z8nU#YrT9{4t=k@bav!?b@6+7%rG=$6mD#VQms}WA z*=K$KAr&1*9e#Uvef9E!_}t9DvgXXLo;ALDR;&4~(#~aWnz_GpdO~{tbw{eN>?oKp z2qz6|yI}WKJ#O8Z_&&>5qy$gecXib0x~aIwnsLtt7u0OcpOJZR=)o3~%S$eI`D1JO zy50*D7wzd>UR<;9Y;N}-qY`d+9+|IB=tcT;?pQIxmA-0Q`Q_w;cMo07}C3(H#c9wh})z^Mu#mJhS|JHxAD{R_k z$5L%sSjXKr;_e=}@!mz}_^I}9-wZyV_(g3+keE{QPR-s^(WmabG5_?-V=H^ky<%JJ zj(vSq*{#_VtLAM#o~NfDy4|a+zjH=h?fOqnqzWP5^}ac5`srD1W`rJb&$*@iu%Oe` zNjJIoYl~6O3m-?g$ECP`FPczSzhqX6?VB?X#82Kh4x$l~F?jTJn=Sk>y@OW268<8@ z=3G{6a@Gj-gUF1`sd`$vD>5r5!xibuPSb51eR7fX66^wpMM)+KAv|1I!HS^5i%ffP z(RZG=^O!x&4r}PBWt_8{@9?c?nZ>x4p4 zz$M701CJro5u%6$SYYnw6!Qg9&oE&(7pf*bqR5gjHHW#Ld7%%w4sMPeCqJ;KGk zdug={F(2bMylEL(nvJ7RBfOCU;Y6OuM3*q!h`mvO2%v#ABx8Ys1`SMUnG>Enb|$UL zX6yL3UoY8HGHe_?m=8gg6b@-fmq1ElCx|$RC}Dvo0uhM>iRD60&_j1P9J(ODxI!=; z5hWyIC*rXaLV#c`Bq4`oNtIxuh$I!eL`QNS3JMmUT)3Pt853_pmqpbNUhF2N-MTEWG9NrDdfpwJ(@(G=1lX#~M( zIDi&OprwR4VwYsWNeR(;1BWjXfC1Wqasp8#9;hiGf(wwDNI@0>T#A5*a)yuq5#whO zk#2;GDJlD+XRcjdbvd8_f)OVWGdEE(OfwMrKIU2ctj0O2O=Igm#$}++H*J~#HFly| ztv}c}XvX$f&2y$M9xWiuOkAC45=}fNttb)~NX^uQcs3CBh=EkBaFBX-C|~G zWQq<#PW*15>8C(ZK)`{t>4@&&Kv+K>MA;uQ<^t*rSm=-7Q%{4}}`6oKmZb9(xa^%!x&CKeD$fn2BRh|G1v zIm-8S!>iYWuXiA5!OQ0S z(C6;Q-(t+~nPiCJS;r6=$0(g(!}lEYR{cEZmbEpD);jn&y{B);EB(Xad-{kT4u^M@ z528mU<26Fxd<4+$$uvJ|RxSZnB33!!+groeipDbm_>b*D zWUTZ8AZia!CIF~CE}7;?&6i66Agn zl^d?^t!*1yp)JYJE!wiSefjhGWyMLioGpWnKXZQUwaO*Me}>erU9#cJoI7ih&#nkP zcBe||zOhT|?%`kMgy6S=PsS7$M@*dOF1bFiFft-}Xx*G{13Fw!Not#zI<9E(#Hy~_ p+LfITFWD5cT7DnHssNa25keH8JI++J$FHbNoG1sWB+1j z?(V(c`M%%zzTfvd_w3n}n{7*s|7kpeAc^)YYaaZ4LcU_7;rEPh{>>nWqFk_8a_tt2 zG9db0f(IZ-+WGBoE=;p7o_cz%#xk?=-2BG(6YA4ao}K*s=GtiO^n~6H!t(KP%_q-Q zRUByC+1PzGjC$(ZmtUQG!1Vl;dV%eMETeeTvbRz$sYymRTYdwyzW^{S+(+U|F2LSoy( zwlRgx^;6*5(GO<6iTxOPTwP=I0uu8t)d(i6<9RWAD^g&axe;Kb)o}+TUQq=<RD6p_g4>|t#o-l{B~B8i4WO&5B%!fYBKH*v+p>97s?Vt38y+< z=`sGXd~)YYcjAkB_h_DOfBmVBRVzCFw%dKLZ)4e*gAL+|RkrV1U{~S-S<8Y5GVY{& zDYic|ZVEJ>EOq8fc}($x9x0`g08oOk;6jk_HE(Xlgb$Um$L?-US16v^&DBcp%=_w_ zmIalY9L1+Y3io4eJteJe`^xu4J5Gro*B}kcn=>XQHtkI9{PXk+DesgS61Hsnta|+N zo?ct}r7xeH;ygO3{c^(Dm324!dblrV*t<5SEY<(kH`5eXACw;x^d`DdJ9e++t+eAgfvKQ8< zS_={6@pJ*!lkZqWbAGRy;r%R7hrIzS}3KDFxoF`i0hk zI|3F^AY_$_U`c7VlPfLcjJ#@Idb}x2LjW(37-iV&@dfFySrx&h;k|6eRLY2pRA^S^ zJ93p4zX+6+no{FvW>_d9Rq63clgPX1JnMo12>4`H6-ZKm#<1ezVs)`b?HAn`VKf>s zoWw{Hg&t_I#3wOf)E7*ZA^I__AjpYAKoa~urHsk2{*Yu=so=QsL4MwV!!Zc&3l6XV z`M|ZOPJ-gMclIN#+KPT{XN%P?9jPC`EDrWjPi{8HUjSJxOT^gLVj% z-4~P?9|vS82(A_&4gnaTA&oq$G3d1@WiS{}R?F*A7iYvtqmDOldVB~(jwnD?GM=GX z$xu9m0xrFtVR@a5!lM+SXHg@eVNsF=S`7hQl$O*)pm>g6;1|6NY^UI5+yD#s+>rs9 za5^K`ZdQ@%{#hfITn{6;V1QY*NbrTi4_%#t7c7w&nN31Z;5sd(!}SIn$F=&0PD_Cp zgi4e#30$qwMMmVd(6AUtEFC?ibKl~e?Kp{O8%R-ym*wR{+4G6K{$U&#MHl{mVlT0pZXs? zLS!i^m61h3GhBZOL8b`skvt(*{}5Ne_}l=#JqG0Zz%KlN6i6fC(gW6o8jTv*KNc8J z0|{7^V0C&ZE0W~2uHooGze_4+M3CWzJVLIZJR@8w(;|(UGu*ql0LWc{grT?wC3H@L zq6q`!Y=AKA(U-_DT9V)ldRQV0b;=M%)BqO{%JD9aq+Bi%*MZ?l|4$`GG(l-;O8fsS zQA+`aCs__9G;$XyhCz)6J%O@-)3`W7&*+TQk6ofHd;RbdO_==Vf1q0v_C00yI}F(> zVE6lNa0`Mv8aBA44ah>?JRad^U`0K`86foNBqQQ?l&(>_M#R8~oJZ9)O4o=O7?Ja+ zx_≥vXK0fe-$dErv(l({*Qd!{c%^yU=Dueuk7IEz<+f-h!4G$?nLE`D)Dg$Hh<%(ni1{_6Gr0kQ6=0.4.0" } + ], + + "suggests": [ + { + "id": "becraft", + "versions": ">=1.0.7" + } ] },