Add BlockEntities support as optional/soft dependency

This commit is contained in:
pietru 2024-03-30 00:56:45 +01:00
parent 9b37426070
commit 3c8a0fdeab
17 changed files with 540 additions and 17 deletions

View file

@ -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 {

View file

@ -4,7 +4,7 @@
org.gradle.caching=false
# Project Info
version=1.1.1
version=1.2.0
group=net.pietru
id=omni_power

View file

@ -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));
}

View file

@ -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);
}

View file

@ -0,0 +1,5 @@
package net.pietru.omni_power.api;
public interface IPowerClient {
}

View file

@ -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);
}

View file

@ -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<String, Object> 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<BlockPosition> power_transmitters = new Array<>();
Array<BlockPosition> 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<BlockPosition> get_touching_positions(World world,BlockPosition pos,BlockState state){
Array<BlockPosition> 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")
);
}
}

View file

@ -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"
}
}
]
}
}

View file

@ -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"
}
}
]
}
}

View file

@ -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"
}
}
]
}
}

View file

@ -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"
}
}
]
}
}

View file

@ -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
}
}
}

View file

@ -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"
}
}
}

View file

@ -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"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View file

@ -41,6 +41,13 @@
"id": "fluxapi",
"versions": ">=0.4.0"
}
],
"suggests": [
{
"id": "becraft",
"versions": ">=1.0.7"
}
]
},