Skip to content

Commit e7076ca

Browse files
committed
Port to Forge
1 parent 51ef8a8 commit e7076ca

10 files changed

Lines changed: 389 additions & 11 deletions

File tree

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package org.cyclops.structuredcrafting;
2+
3+
import net.minecraft.world.item.CreativeModeTab;
4+
import net.minecraft.world.item.ItemStack;
5+
import net.minecraftforge.fml.common.Mod;
6+
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
7+
import org.cyclops.cyclopscore.config.ConfigHandlerCommon;
8+
import org.cyclops.cyclopscore.init.ModBaseForge;
9+
import org.cyclops.cyclopscore.proxy.IClientProxyCommon;
10+
import org.cyclops.cyclopscore.proxy.ICommonProxyCommon;
11+
import org.cyclops.structuredcrafting.block.BlockStructuredCrafterConfig;
12+
import org.cyclops.structuredcrafting.blockentity.BlockEntityStructuredCrafterConfig;
13+
import org.cyclops.structuredcrafting.craft.provider.IItemStackProviderRegistry;
14+
import org.cyclops.structuredcrafting.craft.provider.InventoryItemStackProviderForge;
15+
import org.cyclops.structuredcrafting.craft.provider.ItemStackProviderRegistry;
16+
import org.cyclops.structuredcrafting.craft.provider.WorldItemStackProviderForge;
17+
import org.cyclops.structuredcrafting.proxy.ClientProxyForge;
18+
import org.cyclops.structuredcrafting.proxy.CommonProxyForge;
19+
20+
/**
21+
* The main mod class of this mod.
22+
* @author rubensworks
23+
*
24+
*/
25+
@Mod(Reference.MOD_ID)
26+
public class StructuredCraftingForge extends ModBaseForge<StructuredCraftingForge> implements IStructuredCraftingMod {
27+
28+
/**
29+
* The unique instance of this mod.
30+
*/
31+
public static StructuredCraftingForge _instance;
32+
33+
public StructuredCraftingForge() {
34+
super(Reference.MOD_ID, (instance) -> {
35+
_instance = instance;
36+
IStructuredCraftingMod.MOD.set(instance);
37+
});
38+
}
39+
40+
@Override
41+
protected void setup(FMLCommonSetupEvent event) {
42+
getRegistryManager().addRegistry(IItemStackProviderRegistry.class, new ItemStackProviderRegistry());
43+
44+
super.setup(event);
45+
46+
IItemStackProviderRegistry registry = getRegistryManager().getRegistry(IItemStackProviderRegistry.class);
47+
registry.registerProvider(new InventoryItemStackProviderForge(getModHelpers()));
48+
registry.registerProvider(new WorldItemStackProviderForge(getModHelpers()));
49+
}
50+
51+
@Override
52+
protected IClientProxyCommon constructClientProxy() {
53+
return new ClientProxyForge();
54+
}
55+
56+
@Override
57+
protected ICommonProxyCommon constructCommonProxy() {
58+
return new CommonProxyForge();
59+
}
60+
61+
@Override
62+
protected boolean hasDefaultCreativeModeTab() {
63+
return true;
64+
}
65+
66+
@Override
67+
protected CreativeModeTab.Builder constructDefaultCreativeModeTab(CreativeModeTab.Builder builder) {
68+
return super.constructDefaultCreativeModeTab(builder)
69+
.icon(() -> new ItemStack(RegistryEntries.ITEM_STRUCTURED_CRAFTER));
70+
}
71+
72+
@Override
73+
protected void onConfigsRegister(ConfigHandlerCommon configHandler) {
74+
super.onConfigsRegister(configHandler);
75+
76+
configHandler.addConfigurable(new GeneralConfig(this));
77+
78+
configHandler.addConfigurable(new BlockStructuredCrafterConfig<>(this));
79+
configHandler.addConfigurable(new BlockEntityStructuredCrafterConfig<>(this));
80+
}
81+
}
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package org.cyclops.structuredcrafting.craft.provider;
2+
3+
import net.minecraft.core.BlockPos;
4+
import net.minecraft.core.Direction;
5+
import net.minecraft.world.Container;
6+
import net.minecraft.world.item.ItemStack;
7+
import net.minecraft.world.level.Level;
8+
import net.minecraftforge.common.capabilities.ForgeCapabilities;
9+
import net.minecraftforge.items.IItemHandler;
10+
import org.apache.commons.lang3.tuple.Pair;
11+
import org.cyclops.cyclopscore.helper.IModHelpersForge;
12+
import org.cyclops.structuredcrafting.block.BlockStructuredCrafterConfig;
13+
14+
/**
15+
* Inventory that can provide itemstacks.
16+
* @author rubensworks
17+
*/
18+
public class InventoryItemStackProviderForge implements IItemStackProvider {
19+
20+
private final IModHelpersForge modHelpers;
21+
22+
public InventoryItemStackProviderForge(IModHelpersForge modHelpers) {
23+
this.modHelpers = modHelpers;
24+
}
25+
26+
protected Pair<Integer, ItemStack> getFirstItem(Container inventory, Direction side) {
27+
for(int slot = 0; slot < inventory.getContainerSize(); slot++) {
28+
ItemStack itemStack = inventory.getItem(slot);
29+
if(!itemStack.isEmpty()) {
30+
return Pair.of(slot, itemStack);
31+
}
32+
}
33+
return null;
34+
}
35+
36+
protected Pair<Integer, ItemStack> getFirstItem(IItemHandler itemHandler, Direction side) {
37+
for(int slot = 0; slot < itemHandler.getSlots(); slot++) {
38+
ItemStack itemStack = itemHandler.extractItem(slot, 1, true);
39+
if(!itemStack.isEmpty()) {
40+
return Pair.of(slot, itemStack);
41+
}
42+
}
43+
return null;
44+
}
45+
46+
@Override
47+
public boolean canProvideInput() {
48+
return BlockStructuredCrafterConfig.canTakeInputsFromInventory;
49+
}
50+
51+
@Override
52+
public boolean canHandleOutput() {
53+
return BlockStructuredCrafterConfig.canPlaceOutputsIntoInventory;
54+
}
55+
56+
@Override
57+
public boolean isValidForResults(Level world, BlockPos pos, Direction side) {
58+
IItemHandler itemHandler = this.modHelpers.getCapabilityHelpers().getCapability(world, pos, side, ForgeCapabilities.ITEM_HANDLER).orElse(null);
59+
Container inventory = this.modHelpers.getBlockEntityHelpers().get(world, pos, Container.class).orElse(null);
60+
return itemHandler != null || inventory != null;
61+
}
62+
63+
@Override
64+
public boolean hasItemStack(Level world, BlockPos pos, Direction side) {
65+
Container inventory = this.modHelpers.getBlockEntityHelpers().get(world, pos, Container.class).orElse(null);
66+
IItemHandler itemHandler = this.modHelpers.getCapabilityHelpers().getCapability(world, pos, side, ForgeCapabilities.ITEM_HANDLER).orElse(null);
67+
return itemHandler != null || inventory != null;
68+
}
69+
70+
@Override
71+
public ItemStack getItemStack(Level world, BlockPos pos, Direction side) {
72+
IItemHandler itemHandler = this.modHelpers.getCapabilityHelpers().getCapability(world, pos, side, ForgeCapabilities.ITEM_HANDLER).orElse(null);
73+
Container inventory = this.modHelpers.getBlockEntityHelpers().get(world, pos, Container.class).orElse(null);
74+
Pair<Integer, ItemStack> result = itemHandler != null ? getFirstItem(itemHandler, side) : getFirstItem(inventory, side);
75+
if (result != null) {
76+
return result.getRight();
77+
}
78+
return ItemStack.EMPTY;
79+
}
80+
81+
@Override
82+
public boolean reduceItemStack(Level world, BlockPos pos, Direction side, boolean simulate) {
83+
IItemHandler itemHandler = this.modHelpers.getCapabilityHelpers().getCapability(world, pos, side, ForgeCapabilities.ITEM_HANDLER).orElse(null);
84+
if(itemHandler != null) {
85+
boolean extracted = false;
86+
for(int slot = 0; slot < itemHandler.getSlots(); slot++) {
87+
if(!itemHandler.extractItem(slot, 1, simulate).isEmpty()) {
88+
extracted = true;
89+
break;
90+
}
91+
}
92+
return extracted;
93+
} else {
94+
Container inventory = this.modHelpers.getBlockEntityHelpers().get(world, pos, Container.class).orElse(null);
95+
Pair<Integer, ItemStack> result = getFirstItem(inventory, side);
96+
ItemStack newItemStack = result.getRight().copy();
97+
newItemStack.shrink(1);
98+
if (newItemStack.getCount() <= 0) {
99+
newItemStack = ItemStack.EMPTY;
100+
}
101+
if(!simulate) {
102+
inventory.setItem(result.getLeft(), newItemStack);
103+
}
104+
return true;
105+
}
106+
}
107+
108+
@Override
109+
public boolean addItemStack(Level world, BlockPos pos, Direction side, ItemStack itemStack, boolean simulate) {
110+
IItemHandler itemHandler = this.modHelpers.getCapabilityHelpers().getCapability(world, pos, side, ForgeCapabilities.ITEM_HANDLER).orElse(null);
111+
if(itemHandler != null) {
112+
for(int slot = 0; slot < itemHandler.getSlots(); slot++) {
113+
if(itemHandler.insertItem(slot, itemStack, simulate).isEmpty()) {
114+
return true;
115+
}
116+
}
117+
} else {
118+
Container inventory = this.modHelpers.getBlockEntityHelpers().get(world, pos, Container.class).orElse(null);
119+
for (int slot = 0; slot < inventory.getContainerSize(); slot++) {
120+
if (this.modHelpers.getInventoryHelpers().addToSlot(inventory, slot, itemStack, simulate)) {
121+
return true;
122+
}
123+
}
124+
}
125+
return false;
126+
}
127+
128+
@Override
129+
public boolean setItemStack(Level world, BlockPos pos, Direction side, ItemStack itemStack, boolean simulate) {
130+
IItemHandler itemHandler = this.modHelpers.getCapabilityHelpers().getCapability(world, pos, side, ForgeCapabilities.ITEM_HANDLER).orElse(null);
131+
if(itemHandler != null) {
132+
for(int slot = 0; slot < itemHandler.getSlots(); slot++) {
133+
if(itemHandler.insertItem(slot, itemStack, simulate).isEmpty()) {
134+
return true;
135+
}
136+
}
137+
} else {
138+
Container inventory = this.modHelpers.getBlockEntityHelpers().get(world, pos, Container.class).orElse(null);
139+
Pair<Integer, ItemStack> result = getFirstItem(inventory, side);
140+
if (result != null) {
141+
if(!simulate) {
142+
inventory.setItem(result.getLeft(), itemStack);
143+
}
144+
return true;
145+
}
146+
}
147+
return false;
148+
}
149+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.cyclops.structuredcrafting.craft.provider;
2+
3+
import net.minecraft.core.BlockPos;
4+
import net.minecraft.core.Direction;
5+
import net.minecraft.world.item.ItemStack;
6+
import net.minecraft.world.level.Level;
7+
import net.minecraft.world.level.block.state.BlockState;
8+
import net.minecraftforge.common.capabilities.ForgeCapabilities;
9+
import net.minecraftforge.items.IItemHandler;
10+
import org.cyclops.cyclopscore.helper.IModHelpersForge;
11+
12+
/**
13+
* World that can provide an itemstack.
14+
* @author rubensworks
15+
*/
16+
public class WorldItemStackProviderForge extends WorldItemStackProviderBase {
17+
18+
private final IModHelpersForge modHelpers;
19+
20+
public WorldItemStackProviderForge(IModHelpersForge modHelpers) {
21+
this.modHelpers = modHelpers;
22+
}
23+
24+
@Override
25+
protected boolean hasEmptyItemHandler(Level world, BlockPos pos, Direction side) {
26+
IItemHandler itemHandler = this.modHelpers.getCapabilityHelpers().getCapability(world, pos, side, ForgeCapabilities.ITEM_HANDLER).orElse(null);
27+
boolean emptyItemHandler = true;
28+
if (itemHandler != null) {
29+
for (int i = 0; i < itemHandler.getSlots(); i++) {
30+
if (!itemHandler.extractItem(i, 1, true).isEmpty()) {
31+
emptyItemHandler = false;
32+
break;
33+
}
34+
}
35+
}
36+
return emptyItemHandler;
37+
}
38+
39+
@Override
40+
public ItemStack getItemStack(Level world, BlockPos pos, Direction side) {
41+
BlockState blockState = world.getBlockState(pos);
42+
if(blockState != null && hasEmptyItemHandler(world, pos, side)) {
43+
return blockState.getBlock().getCloneItemStack(world, pos, blockState);
44+
}
45+
return ItemStack.EMPTY;
46+
}
47+
48+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.cyclops.structuredcrafting.proxy;
2+
3+
import org.cyclops.cyclopscore.init.ModBaseForge;
4+
import org.cyclops.cyclopscore.proxy.ClientProxyComponentForge;
5+
import org.cyclops.structuredcrafting.StructuredCraftingForge;
6+
7+
/**
8+
* Proxy for the client side.
9+
*
10+
* @author rubensworks
11+
*
12+
*/
13+
public class ClientProxyForge extends ClientProxyComponentForge {
14+
15+
public ClientProxyForge() {
16+
super(new CommonProxyForge());
17+
}
18+
19+
@Override
20+
public ModBaseForge<?> getMod() {
21+
return StructuredCraftingForge._instance;
22+
}
23+
24+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.cyclops.structuredcrafting.proxy;
2+
3+
import org.cyclops.cyclopscore.init.ModBaseForge;
4+
import org.cyclops.cyclopscore.proxy.CommonProxyComponentForge;
5+
import org.cyclops.structuredcrafting.StructuredCraftingForge;
6+
7+
/**
8+
* Proxy for server and client side.
9+
* @author rubensworks
10+
*
11+
*/
12+
public class CommonProxyForge extends CommonProxyComponentForge {
13+
14+
@Override
15+
public ModBaseForge<?> getMod() {
16+
return StructuredCraftingForge._instance;
17+
}
18+
19+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
modLoader="javafml"
2+
loaderVersion="${forge_loader_version_range}"
3+
issueTrackerURL="${issue_tracker_url}"
4+
displayURL="${display_url}"
5+
license="${license}"
6+
logoFile="logo.png"
7+
authors="${mod_author}"
8+
[[mods]]
9+
modId="${mod_id}"
10+
version="${mod_version}"
11+
displayName="${mod_name}"
12+
updateJSONURL="${forge_update_json_url}"
13+
description="${description}"
14+
[[dependencies.${mod_id}]]
15+
modId="cyclopscore"
16+
mandatory=true
17+
versionRange="[${cyclopscore_version_semver},)"
18+
ordering="NONE"
19+
side="BOTH"
20+
[[dependencies.${mod_id}]]
21+
modId="forge"
22+
mandatory=true
23+
versionRange="[${forge_version},)"
24+
ordering="NONE"
25+
side="BOTH"
26+
[[dependencies.${mod_id}]]
27+
modId="minecraft"
28+
mandatory=true
29+
versionRange="[${minecraft_version},]"
30+
ordering="NONE"
31+
side="BOTH"
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"type": "minecraft:crafting_shaped",
3+
"category": "redstone",
4+
"pattern": [
5+
"SCS",
6+
"IRI",
7+
"SCS"
8+
],
9+
"key": {
10+
"S": {
11+
"item": "minecraft:stick"
12+
},
13+
"C": {
14+
"tag": "forge:cobblestone"
15+
},
16+
"I": {
17+
"tag": "forge:ingots/iron"
18+
},
19+
"R": {
20+
"item": "minecraft:crafting_table"
21+
}
22+
},
23+
"result": {
24+
"id": "structuredcrafting:structured_crafter"
25+
}
26+
}

0 commit comments

Comments
 (0)