Skip to content
This repository was archived by the owner on May 23, 2023. It is now read-only.

Commit 448ef81

Browse files
committed
feat: basic computercraft integration
1 parent 717eefb commit 448ef81

10 files changed

+254
-1
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ dependencies {
137137
implementation fg.deobf("curse.maven:tfcraft-302973:3268988")
138138
implementation fg.deobf("curse.maven:ae2-extended-life-570458:4323863")
139139
implementation fg.deobf("curse.maven:gregtech-food-option-${project.gtfo_id}:${project.gtfo_version}")
140+
implementation fg.deobf("curse.maven:cc-tweaked-282001:2718128")
140141

141142
// May get some form of compatibility in the future
142143
//implementation fg.deobf("curse.maven:mcjtylib-233105:2745846")

src/main/java/gregification/base/BaseConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,9 @@ public class BaseConfig {
2828
@Comment({"Enable Tinkers' Construct integration.", "Default: true"})
2929
@RequiresMcRestart
3030
public static boolean enableTinkersConstructModule = true;
31+
32+
@Comment({"Enable ComputerCraft integration.", "Default: true"})
33+
@RequiresMcRestart
34+
public static boolean enableComputerCraftModule = true;
35+
3136
}

src/main/java/gregification/base/ModIDs.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ public class ModIDs {
2323
MODID_THAUM = "thaumcraft",
2424
GENDUSTRY = "gendustry",
2525
MODID_GTFO = "gregtechfoodoption",
26-
MODID_TFC = "tfc";
26+
MODID_TFC = "tfc",
27+
MODID_CC = "computercraft";
2728
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package gregification.modules.computercraft;
2+
3+
import gregification.Gregification;
4+
import net.minecraftforge.common.config.Config;
5+
import net.minecraftforge.common.config.Config.LangKey;
6+
7+
8+
@LangKey("gregification.config.open_computers")
9+
@Config(modid = Gregification.MODID, name = Gregification.MODID + "/computercraft", category = "ComputerCraft")
10+
public class ComputerCraftConfig {
11+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package gregification.modules.computercraft;
2+
3+
import dan200.computercraft.api.ComputerCraftAPI;
4+
import dan200.computercraft.api.peripheral.IPeripheral;
5+
import dan200.computercraft.api.peripheral.IPeripheralProvider;
6+
import gregification.base.BaseConfig;
7+
import gregification.base.ModIDs;
8+
import gregification.base.Module;
9+
import gregification.modules.computercraft.peripheral.MetaTileEntityPeripheral;
10+
import gregtech.api.metatileentity.MetaTileEntity;
11+
import gregtech.api.util.GTUtility;
12+
import net.minecraft.util.EnumFacing;
13+
import net.minecraft.util.math.BlockPos;
14+
import net.minecraft.world.World;
15+
import net.minecraftforge.fml.common.Loader;
16+
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
17+
import org.apache.logging.log4j.Logger;
18+
19+
import javax.annotation.Nonnull;
20+
import javax.annotation.Nullable;
21+
22+
@Module.Root(name = "Gregification: Computercraft")
23+
public class ComputerCraftModule implements Module {
24+
25+
@Log
26+
public static Logger logger;
27+
28+
@Override
29+
public boolean isModuleActive() {
30+
return BaseConfig.enableComputerCraftModule && Loader.isModLoaded(ModIDs.MODID_CC);
31+
}
32+
33+
@Override
34+
public void init(FMLInitializationEvent event) {
35+
ComputerCraftAPI.registerPeripheralProvider(new IPeripheralProvider() {
36+
@Nullable
37+
@Override
38+
public IPeripheral getPeripheral(@Nonnull World world, @Nonnull BlockPos blockPos, @Nonnull EnumFacing enumFacing) {
39+
MetaTileEntity metaTileEntity = GTUtility.getMetaTileEntity(world, blockPos);
40+
if (metaTileEntity != null) {
41+
return new MetaTileEntityPeripheral(metaTileEntity, enumFacing);
42+
}
43+
return null;
44+
}
45+
});
46+
}
47+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package gregification.modules.computercraft.peripheral;
2+
3+
import dan200.computercraft.api.lua.ILuaContext;
4+
import dan200.computercraft.api.lua.LuaException;
5+
import dan200.computercraft.api.peripheral.IComputerAccess;
6+
import dan200.computercraft.api.peripheral.IPeripheral;
7+
import gregtech.api.metatileentity.MetaTileEntity;
8+
import net.minecraft.util.EnumFacing;
9+
10+
import javax.annotation.Nonnull;
11+
import javax.annotation.Nullable;
12+
import java.util.Arrays;
13+
14+
public class MetaTileEntityPeripheral implements IPeripheral {
15+
private final MetaTileEntityPeripheralFunction[] functions;
16+
17+
public MetaTileEntityPeripheral(MetaTileEntity metaTileEntity, EnumFacing enumFacing) {
18+
this.functions = Arrays.stream(new MetaTileEntityPeripheralFunction[]{
19+
new MetaTileEntityPeripheralEnergyContainerFunction(metaTileEntity, enumFacing),
20+
new MetaTileEntityPeripheralStatusFunction(metaTileEntity),
21+
new MetaTileEntityPeripheralSetEnabledFunction(metaTileEntity),
22+
}).filter(MetaTileEntityPeripheralFunction::isEnabled).toArray(MetaTileEntityPeripheralFunction[]::new);
23+
}
24+
25+
@Nonnull
26+
public String getType() {
27+
return "gregtech_meta_timer_entity";
28+
}
29+
30+
@Nonnull
31+
public String[] getMethodNames() {
32+
return Arrays.stream(functions).map(MetaTileEntityPeripheralFunction::getName).toArray(String[]::new);
33+
}
34+
35+
@Nullable
36+
public Object[] callMethod(@Nonnull IComputerAccess iComputerAccess, @Nonnull ILuaContext iLuaContext, int i, @Nonnull Object[] objects) throws LuaException, InterruptedException {
37+
return functions[i].call(iComputerAccess, iLuaContext, i, objects);
38+
}
39+
40+
public boolean equals(@Nullable IPeripheral iPeripheral) {
41+
return iPeripheral == this;
42+
}
43+
44+
}
45+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package gregification.modules.computercraft.peripheral;
2+
3+
import dan200.computercraft.api.lua.ILuaContext;
4+
import dan200.computercraft.api.peripheral.IComputerAccess;
5+
import gregtech.api.capability.GregtechCapabilities;
6+
import gregtech.api.capability.IEnergyContainer;
7+
import gregtech.api.metatileentity.MetaTileEntity;
8+
import net.minecraft.util.EnumFacing;
9+
10+
import java.util.HashMap;
11+
import java.util.Map;
12+
13+
class MetaTileEntityPeripheralEnergyContainerFunction implements MetaTileEntityPeripheralFunction {
14+
15+
private final IEnergyContainer energyContainer;
16+
17+
public MetaTileEntityPeripheralEnergyContainerFunction(MetaTileEntity metaTileEntity, EnumFacing enumFacing) {
18+
this.energyContainer = metaTileEntity.getCapability(GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER, enumFacing);
19+
}
20+
21+
@Override
22+
public boolean isEnabled() {
23+
return this.energyContainer != null;
24+
}
25+
26+
@Override
27+
public String getName() {
28+
return "getEnergy";
29+
}
30+
31+
@Override
32+
public Object[] call(IComputerAccess iComputerAccess, ILuaContext iLuaContext, int i, Object[] objects) {
33+
Map<String, Object> data = new HashMap<>();
34+
data.put("stored", energyContainer.getEnergyStored());
35+
data.put("capacity", energyContainer.getEnergyCapacity());
36+
data.put("average_input", energyContainer.getInputPerSec());
37+
data.put("average_output", energyContainer.getOutputPerSec());
38+
data.put("input_voltage", energyContainer.getInputVoltage());
39+
data.put("output_voltage", energyContainer.getOutputVoltage());
40+
data.put("input_amperage", energyContainer.getInputAmperage());
41+
data.put("output_amperage", energyContainer.getOutputAmperage());
42+
return new Object[]{data};
43+
}
44+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package gregification.modules.computercraft.peripheral;
2+
3+
import dan200.computercraft.api.lua.ILuaContext;
4+
import dan200.computercraft.api.lua.LuaException;
5+
import dan200.computercraft.api.peripheral.IComputerAccess;
6+
7+
interface MetaTileEntityPeripheralFunction {
8+
boolean isEnabled();
9+
10+
String getName();
11+
12+
Object[] call(IComputerAccess iComputerAccess, ILuaContext iLuaContext, int i, Object[] objects) throws LuaException, InterruptedException;
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package gregification.modules.computercraft.peripheral;
2+
3+
import dan200.computercraft.api.lua.ILuaContext;
4+
import dan200.computercraft.api.peripheral.IComputerAccess;
5+
import gregtech.api.capability.GregtechTileCapabilities;
6+
import gregtech.api.capability.IControllable;
7+
import gregtech.api.metatileentity.MetaTileEntity;
8+
9+
class MetaTileEntityPeripheralSetEnabledFunction implements MetaTileEntityPeripheralFunction {
10+
11+
private final IControllable controllable;
12+
13+
public MetaTileEntityPeripheralSetEnabledFunction(MetaTileEntity metaTileEntity) {
14+
this.controllable = metaTileEntity.getCapability(GregtechTileCapabilities.CAPABILITY_CONTROLLABLE, null);
15+
}
16+
17+
@Override
18+
public boolean isEnabled() {
19+
return this.controllable != null;
20+
}
21+
22+
@Override
23+
public String getName() {
24+
return "setEnabled";
25+
}
26+
27+
@Override
28+
public Object[] call(IComputerAccess iComputerAccess, ILuaContext iLuaContext, int i, Object[] objects) {
29+
boolean enabled = objects.length > 0 && objects[0] instanceof Boolean ? (Boolean) objects[0] : true;
30+
controllable.setWorkingEnabled(enabled);
31+
return new Object[]{};
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package gregification.modules.computercraft.peripheral;
2+
3+
import dan200.computercraft.api.lua.ILuaContext;
4+
import dan200.computercraft.api.peripheral.IComputerAccess;
5+
import gregtech.api.capability.GregtechTileCapabilities;
6+
import gregtech.api.capability.IControllable;
7+
import gregtech.api.capability.impl.AbstractRecipeLogic;
8+
import gregtech.api.metatileentity.MetaTileEntity;
9+
import gregtech.api.metatileentity.TieredMetaTileEntity;
10+
11+
import java.util.HashMap;
12+
import java.util.Map;
13+
14+
class MetaTileEntityPeripheralStatusFunction implements MetaTileEntityPeripheralFunction {
15+
16+
private final TieredMetaTileEntity tieredMetaTileEntity;
17+
18+
private final IControllable controllable;
19+
private final AbstractRecipeLogic recipeLogic;
20+
21+
public MetaTileEntityPeripheralStatusFunction(MetaTileEntity metaTileEntity) {
22+
this.tieredMetaTileEntity = metaTileEntity instanceof TieredMetaTileEntity ? (TieredMetaTileEntity) metaTileEntity : null;
23+
this.controllable = metaTileEntity.getCapability(GregtechTileCapabilities.CAPABILITY_CONTROLLABLE, null);
24+
this.recipeLogic = metaTileEntity.getCapability(GregtechTileCapabilities.CAPABILITY_RECIPE_LOGIC, null);
25+
}
26+
27+
@Override
28+
public boolean isEnabled() {
29+
return this.tieredMetaTileEntity != null || this.controllable != null || this.recipeLogic != null;
30+
}
31+
32+
@Override
33+
public String getName() {
34+
return "getStatus";
35+
}
36+
37+
@Override
38+
public Object[] call(IComputerAccess iComputerAccess, ILuaContext iLuaContext, int i, Object[] objects) {
39+
Map<String, Object> data = new HashMap<>();
40+
if (controllable != null) {
41+
data.put("enabled", controllable.isWorkingEnabled());
42+
}
43+
if (tieredMetaTileEntity != null) {
44+
data.put("tier", tieredMetaTileEntity.getTier());
45+
}
46+
if (recipeLogic != null) {
47+
data.put("active", recipeLogic.isActive());
48+
data.put("progress", recipeLogic.getProgress());
49+
data.put("maxProgress", recipeLogic.getMaxProgress());
50+
}
51+
return new Object[]{data};
52+
}
53+
}

0 commit comments

Comments
 (0)