Skip to content

Commit 6333a06

Browse files
authored
Add Material API (#29)
1 parent 1598bff commit 6333a06

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+3646
-176
lines changed

src/main/java/net/swedz/tesseract/neoforge/compat/mi/material/MIMaterials.java

Lines changed: 494 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 312 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,312 @@
1+
package net.swedz.tesseract.neoforge.compat.mi.material.part;
2+
3+
import aztech.modern_industrialization.MI;
4+
import aztech.modern_industrialization.MITags;
5+
import aztech.modern_industrialization.api.energy.CableTier;
6+
import aztech.modern_industrialization.blocks.storage.StorageBehaviour;
7+
import aztech.modern_industrialization.blocks.storage.barrel.BarrelBlock;
8+
import aztech.modern_industrialization.blocks.storage.barrel.BarrelBlockEntity;
9+
import aztech.modern_industrialization.blocks.storage.barrel.BarrelItem;
10+
import aztech.modern_industrialization.blocks.storage.tank.AbstractTankBlockEntity;
11+
import aztech.modern_industrialization.blocks.storage.tank.TankBlock;
12+
import aztech.modern_industrialization.blocks.storage.tank.TankBlockEntity;
13+
import aztech.modern_industrialization.blocks.storage.tank.TankItem;
14+
import aztech.modern_industrialization.datagen.model.DelegatingModelBuilder;
15+
import aztech.modern_industrialization.items.ContainerItem;
16+
import aztech.modern_industrialization.items.ForgeTool;
17+
import aztech.modern_industrialization.items.PortableStorageUnit;
18+
import aztech.modern_industrialization.nuclear.INeutronBehaviour;
19+
import aztech.modern_industrialization.nuclear.NuclearConstant;
20+
import aztech.modern_industrialization.nuclear.NuclearFuel;
21+
import aztech.modern_industrialization.pipes.api.PipeNetworkType;
22+
import aztech.modern_industrialization.pipes.electricity.ElectricityNetwork;
23+
import aztech.modern_industrialization.pipes.electricity.ElectricityNetworkData;
24+
import aztech.modern_industrialization.pipes.electricity.ElectricityNetworkNode;
25+
import aztech.modern_industrialization.pipes.impl.PipeItem;
26+
import aztech.modern_industrialization.proxy.CommonProxy;
27+
import aztech.modern_industrialization.thirdparty.fabrictransfer.api.bridge.SlotFluidHandler;
28+
import aztech.modern_industrialization.thirdparty.fabrictransfer.api.bridge.SlotItemHandler;
29+
import aztech.modern_industrialization.thirdparty.fabrictransfer.api.fluid.FluidVariant;
30+
import aztech.modern_industrialization.thirdparty.fabrictransfer.api.item.ItemVariant;
31+
import net.minecraft.core.registries.BuiltInRegistries;
32+
import net.minecraft.world.item.BlockItem;
33+
import net.minecraft.world.level.block.Block;
34+
import net.minecraft.world.level.block.EntityBlock;
35+
import net.minecraft.world.level.block.entity.BlockEntityType;
36+
import net.neoforged.neoforge.capabilities.Capabilities;
37+
import net.neoforged.neoforge.fluids.FluidType;
38+
import net.swedz.tesseract.neoforge.capabilities.CapabilitiesListeners;
39+
import net.swedz.tesseract.neoforge.compat.mi.material.property.IsotopeFuel;
40+
import net.swedz.tesseract.neoforge.material.part.MaterialPart;
41+
import net.swedz.tesseract.neoforge.material.part.MaterialPartItemFactory;
42+
import net.swedz.tesseract.neoforge.material.part.MaterialPartItemReferenceFormatter;
43+
import net.swedz.tesseract.neoforge.material.part.RegisteredMaterialPart;
44+
import net.swedz.tesseract.neoforge.registry.common.CommonLootTableBuilders;
45+
import net.swedz.tesseract.neoforge.registry.common.CommonModelBuilders;
46+
import net.swedz.tesseract.neoforge.registry.holder.BlockWithItemHolder;
47+
48+
import java.util.concurrent.atomic.AtomicReference;
49+
50+
import static net.swedz.tesseract.neoforge.compat.mi.material.property.MIMaterialProperties.*;
51+
import static net.swedz.tesseract.neoforge.material.builtin.part.CommonMaterialPartRegisters.*;
52+
import static net.swedz.tesseract.neoforge.material.builtin.part.MaterialParts.*;
53+
import static net.swedz.tesseract.neoforge.material.builtin.property.MaterialProperties.*;
54+
55+
public interface MIMaterialParts
56+
{
57+
MaterialPart BATTERY = create("battery", "Battery")
58+
.itemModelBuilder(CommonModelBuilders::generated)
59+
.item((context, holder) ->
60+
{
61+
long batteryCapacity = context.getOrThrow(BATTERY_CAPACITY);
62+
if(batteryCapacity <= 0)
63+
{
64+
throw new IllegalArgumentException("Battery capacity must be > 0");
65+
}
66+
holder.withRegistrationListener((item) -> PortableStorageUnit.CAPACITY_PER_BATTERY.put(item, batteryCapacity));
67+
});
68+
69+
MaterialPart BARREL = create("barrel", "Barrel")
70+
.blockModel((b) -> (provider) ->
71+
{
72+
Block block = b.get();
73+
String id = BuiltInRegistries.BLOCK.getKey(block).getPath();
74+
provider.simpleBlock(block, provider.models().cubeColumn(id, provider.modLoc("block/%s_side".formatted(id)), provider.modLoc("block/%s_top".formatted(id))));
75+
})
76+
.itemModelBuilder(CommonModelBuilders::itemBlockEntity)
77+
.itemTag(MITags.BARRELS)
78+
.withRegister((context) ->
79+
{
80+
AtomicReference<BlockEntityType<BarrelBlockEntity>> bet = new AtomicReference<>();
81+
82+
StorageBehaviour<ItemVariant> storageBehaviour = BarrelBlock.withStackCapacity(context.getOrThrow(BARREL_CAPACITY));
83+
84+
EntityBlock factory = (pos, state) -> new BarrelBlockEntity(bet.get(), pos, state);
85+
BlockWithItemHolder<Block, BlockItem> blockHolder = new BlockWithItemHolder<>(
86+
context.id(), context.englishName(),
87+
context.registry().blockRegistry(), (p) -> new BarrelBlock(factory, storageBehaviour),
88+
context.registry().itemRegistry(), (b, p) -> new BarrelItem((BarrelBlock) b, p)
89+
);
90+
RegisteredMaterialPart registered = RegisteredMaterialPart.existingBlock(blockHolder);
91+
context.register(blockHolder);
92+
93+
context.registry().blockEntityRegistry().register(context.id().getPath(), () ->
94+
{
95+
bet.set((BlockEntityType) BlockEntityType.Builder.of(factory::newBlockEntity, blockHolder.get()).build(null));
96+
return bet.get();
97+
});
98+
99+
CapabilitiesListeners.register(context.registry().modId(), (event) ->
100+
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, bet.get(), (be, side) -> new SlotItemHandler(be)));
101+
102+
CommonProxy.INSTANCE.registerPartBarrelClient(bet::get, context.get(MEAN_RGB));
103+
104+
return registered;
105+
});
106+
107+
MaterialPart BLADE = create("blade", "Blade")
108+
.itemModelBuilder(CommonModelBuilders::generated);
109+
110+
MaterialPart BOLT = create("bolt", "Bolt")
111+
.itemModelBuilder(CommonModelBuilders::generated);
112+
113+
MaterialPart CABLE = create("cable", "Cable")
114+
.itemFactory((c, p) ->
115+
{
116+
CableTier tier = c.getOrThrow(CABLE_TIER);
117+
String cableId = "%s_cable".formatted(c.material().id());
118+
PipeNetworkType type = PipeNetworkType.register(
119+
c.registry().id(cableId),
120+
(id, data) -> new ElectricityNetwork(id, data, tier),
121+
ElectricityNetworkNode::new, c.get(MEAN_RGB) | 0xFF000000, false
122+
);
123+
return new PipeItem(p, type, new ElectricityNetworkData());
124+
})
125+
.itemModel((i) -> (provider) -> provider.getBuilder(BuiltInRegistries.ITEM.getKey(i.get()).getPath())
126+
.customLoader(DelegatingModelBuilder::new)
127+
.delegate(provider.getExistingFile(MI.id("block/pipe")))
128+
.end());
129+
130+
MaterialPart COIL = create("coil", "Coil")
131+
.blockModel(CommonModelBuilders::blockTopEnd)
132+
.blockLoot(CommonLootTableBuilders::self);
133+
134+
MaterialPart CRUSHED_DUST = create("crushed_dust", "Crushed Dust")
135+
.itemModelBuilder(CommonModelBuilders::generated);
136+
137+
MaterialPart CURVED_PLATE = create("curved_plate", "Curved Plate")
138+
.itemModelBuilder(CommonModelBuilders::generated);
139+
140+
MaterialPart DOUBLE_INGOT = create("double_ingot", "Double Ingot")
141+
.itemModelBuilder(CommonModelBuilders::generated);
142+
143+
MaterialPart DRILL_HEAD = create("drill_head", "Drill Head")
144+
.itemModelBuilder(CommonModelBuilders::generated);
145+
146+
MaterialPart DRILL = create("drill", "Drill")
147+
.itemModelBuilder(CommonModelBuilders::generated);
148+
149+
MaterialPart FINE_WIRE = create("fine_wire", "Fine Wire")
150+
.itemModelBuilder(CommonModelBuilders::generated);
151+
152+
MaterialPart GEAR = create("gear", "Gear")
153+
.set(ITEM_REFERENCE, MaterialPartItemReferenceFormatter.tag())
154+
.itemModelBuilder(CommonModelBuilders::generated)
155+
.item(itemTagCommon("gears"));
156+
157+
MaterialPart HAMMER = create("hammer", "Hammer")
158+
.itemFactory((c, p) -> new ForgeTool(c.get(TOOL_TIER), p))
159+
.itemModelBuilder(CommonModelBuilders::generated)
160+
.itemTag(ForgeTool.TAG);
161+
162+
MaterialPart HOT_INGOT = create("hot_ingot", "Hot Ingot")
163+
.itemModelBuilder(CommonModelBuilders::generated);
164+
165+
MaterialPart LARGE_PLATE = create("large_plate", "Large Plate")
166+
.itemModelBuilder(CommonModelBuilders::generated);
167+
168+
MaterialPart MACHINE_CASING = create("machine_casing", "Machine Casing")
169+
.blockModel(CommonModelBuilders::blockCubeAll);
170+
171+
MaterialPart MACHINE_CASING_PIPE = create("machine_casing_pipe", "Pipe Machine Casing")
172+
.blockModel(CommonModelBuilders::blockCubeAll);
173+
174+
MaterialPart MACHINE_CASING_SPECIAL = create("machine_casing_special", "Special Casing")
175+
.blockModel(CommonModelBuilders::blockCubeAll);
176+
177+
MaterialPart PLATED_BRICKS = MACHINE_CASING_SPECIAL
178+
.formattingMaterialOnly("%s_plated_bricks"::formatted, "%s Plated Bricks"::formatted);
179+
180+
MaterialPart CLEAN_MACHINE_CASING = MACHINE_CASING_SPECIAL
181+
.formattingMaterialOnly("clean_%s_machine_casing"::formatted, "Clean %s Machine Casing"::formatted);
182+
183+
MaterialPart SOLID_MACHINE_CASING = MACHINE_CASING_SPECIAL
184+
.formattingMaterialOnly("solid_%s_machine_casing"::formatted, "Solid %s Machine Casing"::formatted);
185+
186+
MaterialPart PLASMA_HANDLING_MACHINE_CASING = MACHINE_CASING_SPECIAL
187+
.formattingMaterialOnly("plasma_handling_%s_machine_casing"::formatted, "Plasma Handling %s Machine Casing"::formatted);
188+
189+
MaterialPart PLATE = create("plate", "Plate")
190+
.set(ITEM_REFERENCE, MaterialPartItemReferenceFormatter.tag())
191+
.itemModelBuilder(CommonModelBuilders::generated)
192+
.item(itemTagCommon("plates"));
193+
194+
MaterialPart RING = create("ring", "Ring")
195+
.itemModelBuilder(CommonModelBuilders::generated);
196+
197+
MaterialPart ROD = create("rod", "Rod")
198+
.set(ITEM_REFERENCE, MaterialPartItemReferenceFormatter.tag())
199+
.itemModelBuilder(CommonModelBuilders::generated)
200+
.item(itemTagCommon("rods"));
201+
202+
MaterialPart ROD_MAGNETIC = create("rod_magnetic", "Magnetic Rod")
203+
.formatting("%s_%s"::formatted, (m, p) -> "Magnetic %s Rod".formatted(m))
204+
.itemModelBuilder(CommonModelBuilders::generated);
205+
206+
MaterialPart ROTOR = create("rotor", "Rotor")
207+
.itemModelBuilder(CommonModelBuilders::generated);
208+
209+
MaterialPart TANK = create("tank", "Tank")
210+
.blockModel((b) -> (provider) ->
211+
{
212+
Block block = b.get();
213+
provider.simpleBlock(block, provider.models()
214+
.getBuilder(provider.blockTexture(block).getPath())
215+
.parent(provider.models().getExistingFile(provider.modLoc("base/tank")))
216+
.texture("0", provider.blockTexture(block).toString()));
217+
})
218+
.itemModelBuilder(CommonModelBuilders::itemBlockEntity)
219+
.itemTag(MITags.TANKS)
220+
.withRegister((context) ->
221+
{
222+
AtomicReference<BlockEntityType<AbstractTankBlockEntity>> bet = new AtomicReference<>();
223+
224+
StorageBehaviour<FluidVariant> storageBehaviour = StorageBehaviour.uniformQuantity(FluidType.BUCKET_VOLUME * context.getOrThrow(TANK_CAPACITY));
225+
226+
EntityBlock factory = (pos, state) -> new TankBlockEntity(bet.get(), pos, state);
227+
BlockWithItemHolder<Block, BlockItem> blockHolder = new BlockWithItemHolder<>(
228+
context.id(), context.englishName(),
229+
context.registry().blockRegistry(), (p) -> new TankBlock(factory, storageBehaviour),
230+
context.registry().itemRegistry(), (b, p) -> new TankItem((TankBlock) b, p)
231+
);
232+
RegisteredMaterialPart registered = RegisteredMaterialPart.existingBlock(blockHolder);
233+
context.register(blockHolder);
234+
235+
context.registry().blockEntityRegistry().register(context.id().getPath(), () ->
236+
{
237+
bet.set((BlockEntityType) BlockEntityType.Builder.of(factory::newBlockEntity, blockHolder.get()).build(null));
238+
return bet.get();
239+
});
240+
241+
CapabilitiesListeners.register(context.registry().modId(), (event) ->
242+
{
243+
event.registerBlockEntity(Capabilities.FluidHandler.BLOCK, bet.get(), (be, side) -> new SlotFluidHandler(be));
244+
245+
TankItem item = (TankItem) blockHolder.asItem();
246+
event.registerItem(Capabilities.FluidHandler.ITEM, (stack, __) -> new ContainerItem.FluidHandler(stack, item), item);
247+
});
248+
249+
CommonProxy.INSTANCE.registerPartTankClient(bet::get, context.get(MEAN_RGB));
250+
251+
return registered;
252+
});
253+
254+
MaterialPart TINY_DUST = create("tiny_dust", "Tiny Dust")
255+
.set(ITEM_REFERENCE, MaterialPartItemReferenceFormatter.tag())
256+
.itemModelBuilder(CommonModelBuilders::generated)
257+
.item(itemTagCommon("tiny_dusts"));
258+
259+
MaterialPart WIRE = create("wire", "Wire")
260+
.itemModelBuilder(CommonModelBuilders::generated);
261+
262+
MaterialPart WIRE_MAGNETIC = create("wire_magnetic", "Magnetic Wire")
263+
.formatting("%s_%s"::formatted, (m, p) -> "Magnetic %s Wire".formatted(m))
264+
.itemModelBuilder(CommonModelBuilders::generated);
265+
266+
static MaterialPartItemFactory fuelRodFactory()
267+
{
268+
return (c, p) ->
269+
{
270+
int size = c.getOrThrow(NUCLEAR_FUEL_SIZE);
271+
IsotopeFuel fuel = c.getOrThrow(ISOTOPE);
272+
NuclearFuel.NuclearFuelParams fuelParams = new NuclearFuel.NuclearFuelParams(
273+
NuclearConstant.DESINTEGRATION_BY_ROD * size, fuel.maxTemp, fuel.tempLimitLow, fuel.tempLimitHigh, fuel.neutronsMultiplication, fuel.directEnergyFactor, size
274+
);
275+
INeutronBehaviour neutronBehaviour = INeutronBehaviour.of(NuclearConstant.ScatteringType.HEAVY, fuel, size);
276+
return new NuclearFuel(p.stacksTo(1), fuelParams, neutronBehaviour, c.registry().id("%s_fuel_rod_depleted".formatted(c.material().id().getPath())));
277+
};
278+
}
279+
280+
MaterialPart FUEL_ROD_DEPLETED = create("fuel_rod_depleted", "Depleted Fuel Rod")
281+
.formattingMaterialOnly("%s_fuel_rod_depleted"::formatted, "Depleted %s Fuel Rod"::formatted);
282+
283+
MaterialPart FUEL_ROD = create("fuel_rod", "Fuel Rod")
284+
.set(NUCLEAR_FUEL_SIZE, 1)
285+
.itemFactory(fuelRodFactory());
286+
287+
MaterialPart FUEL_ROD_DOUBLE = create("fuel_rod_double", "Double Fuel Rod")
288+
.set(NUCLEAR_FUEL_SIZE, 2)
289+
.itemFactory(fuelRodFactory());
290+
291+
MaterialPart FUEL_ROD_QUAD = create("fuel_rod_quad", "Quad Fuel Rod")
292+
.set(NUCLEAR_FUEL_SIZE, 4)
293+
.itemFactory(fuelRodFactory());
294+
295+
MaterialPart[] ALL_FUEL_RODS = {FUEL_ROD, FUEL_ROD_DOUBLE, FUEL_ROD_QUAD, FUEL_ROD_DEPLETED};
296+
297+
MaterialPart N_DOPED_PLATE = create("n_doped_plate", "N-Doped Plate")
298+
.formatting("%s_%s"::formatted, (m, p) -> "N-Doped %s Plate".formatted(m))
299+
.itemModelBuilder(CommonModelBuilders::generated);
300+
301+
MaterialPart P_DOPED_PLATE = create("p_doped_plate", "P-Doped Plate")
302+
.formatting("%s_%s"::formatted, (m, p) -> "P-Doped %s Plate".formatted(m))
303+
.itemModelBuilder(CommonModelBuilders::generated);
304+
305+
MaterialPart[] ITEM_PURE_NON_METAL = {CRUSHED_DUST, DUST, TINY_DUST};
306+
MaterialPart[] ITEM_PURE_METAL = {INGOT, NUGGET, DUST, TINY_DUST};
307+
308+
static MaterialPart create(String id, String englishName)
309+
{
310+
return new MaterialPart(MI.id(id), englishName);
311+
}
312+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package net.swedz.tesseract.neoforge.compat.mi.material.property;
2+
3+
import aztech.modern_industrialization.nuclear.INeutronBehaviour;
4+
import aztech.modern_industrialization.nuclear.IsotopeParams;
5+
import net.swedz.tesseract.neoforge.material.Material;
6+
7+
import static net.swedz.tesseract.neoforge.compat.mi.material.property.MIMaterialProperties.*;
8+
9+
public class IsotopeFuel extends IsotopeParams
10+
{
11+
public final int maxTemp;
12+
public final double neutronsMultiplication;
13+
public final double directEnergyFactor;
14+
public final int tempLimitLow;
15+
public final int tempLimitHigh;
16+
17+
public IsotopeFuel(double thermalAbsorbProba, double thermalScatterings, int maxTemp, int tempLimitLow, int tempLimitHigh,
18+
double neutronsMultiplication, double directEnergyFactor)
19+
{
20+
super(
21+
thermalAbsorbProba,
22+
INeutronBehaviour.reduceCrossProba(thermalAbsorbProba, 0.1),
23+
thermalScatterings,
24+
INeutronBehaviour.reduceCrossProba(thermalScatterings, 0.5)
25+
);
26+
this.maxTemp = maxTemp;
27+
this.neutronsMultiplication = neutronsMultiplication;
28+
this.directEnergyFactor = directEnergyFactor;
29+
this.tempLimitLow = tempLimitLow;
30+
this.tempLimitHigh = tempLimitHigh;
31+
}
32+
33+
public static IsotopeFuel mix(IsotopeFuel a, IsotopeFuel b, double factor)
34+
{
35+
factor = 1 - factor;
36+
37+
double newThermalAbsorptionProba = INeutronBehaviour.probaFromCrossSection(mix(a.thermalAbsorption, b.thermalAbsorption, factor));
38+
double newScatteringProba = INeutronBehaviour.probaFromCrossSection(mix(a.thermalScattering, b.thermalScattering, factor));
39+
double newNeutronMultiplicationFactor = mix(a.neutronsMultiplication, b.neutronsMultiplication, factor);
40+
41+
double totalEnergy = mix(a.neutronsMultiplication * (1 + a.directEnergyFactor), b.neutronsMultiplication * (1 + b.directEnergyFactor), factor);
42+
43+
int newMaxTemp = (int) mix(a.maxTemp, b.maxTemp, factor);
44+
int newTempLimitLow = (int) mix(a.tempLimitLow, b.tempLimitLow, factor);
45+
int newTempLimitHigh = (int) mix(a.tempLimitHigh, b.tempLimitHigh, factor);
46+
47+
double newDirectEnergyFactor = (totalEnergy / newNeutronMultiplicationFactor) - 1;
48+
49+
return new IsotopeFuel(
50+
newThermalAbsorptionProba,
51+
newScatteringProba, newMaxTemp, newTempLimitLow, newTempLimitHigh,
52+
newNeutronMultiplicationFactor, newDirectEnergyFactor
53+
);
54+
}
55+
56+
public static IsotopeFuel mix(Material a, Material b, double factor)
57+
{
58+
return mix(a.getOrThrow(ISOTOPE), b.getOrThrow(ISOTOPE), factor);
59+
}
60+
61+
private static double mix(double a, double b, double r)
62+
{
63+
return r * a + (1 - r) * b;
64+
}
65+
}

0 commit comments

Comments
 (0)