| 
 | 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 | +}  | 
0 commit comments