Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ repositories{
maven { name = "BlameJared"; url = "https://maven.blamejared.com/" } // IE & CT Files
maven { name = "DVS1 Maven FS"; url = "https://dvs1.progwml6.com/files/maven" } // JEI & Tinkers Files
maven { url = 'https://maven.latmod.com/' } // Needed for JEI
maven { name = 'tterrag maven'; url = 'https://maven.tterrag.com/' }

flatDir { dir 'flatdir' }
}
Expand Down Expand Up @@ -137,6 +138,10 @@ dependencies{

compileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-forge-1.18.2:${version_ct}")

implementation fg.deobf("com.simibubi.create:create-${version_minecraft}:${create_version}:slim") { transitive = false }
implementation fg.deobf("com.jozufozu.flywheel:flywheel-forge-${version_minecraft}:${flywheel_version}")
implementation fg.deobf("com.tterrag.registrate:Registrate:${registrate_version}")

runtimeOnly fg.deobf("mezz.jei:jei-${version_minecraft}:${version_jei}")
compileOnly fg.deobf("mezz.jei:jei-${version_minecraft}:${version_jei}:api")
}
Expand Down
10 changes: 7 additions & 3 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@ org.gradle.jvmargs=-Xmx3G
org.gradle.daemon=false

version_minecraft=1.18.2
version_forge=40.1.48
version_forge=40.2.4
version_fml_mappings=1.18.2
version_parchment=1.18.1-2022.03.06-1.18.2
version_ie=1.18.2-8.1.0-150
version_ie=1.18.2-8.4.0-161

create_version=0.5.1.e-318
flywheel_version=0.6.10-105
registrate_version=MC1.18.2-1.1.3

version_jei=9.7.0.195
version_ct=9.1.156
version_ct=9.1.156
Original file line number Diff line number Diff line change
@@ -1,25 +1,149 @@
package twistedgate.overengineered.common.data;

import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import javax.annotation.Nullable;

import com.google.common.base.Preconditions;

import blusunrize.immersiveengineering.api.IEProperties;
import blusunrize.immersiveengineering.api.multiblocks.TemplateMultiblock;
import blusunrize.immersiveengineering.data.models.NongeneratedModels;
import blusunrize.immersiveengineering.data.models.NongeneratedModels.NongeneratedModel;
import blusunrize.immersiveengineering.data.models.SplitModelBuilder;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Vec3i;
import net.minecraft.data.DataGenerator;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.level.block.state.properties.Property;
import net.minecraftforge.client.model.generators.BlockModelBuilder;
import net.minecraftforge.client.model.generators.BlockStateProvider;
import net.minecraftforge.client.model.generators.ConfiguredModel;
import net.minecraftforge.client.model.generators.ItemModelBuilder;
import net.minecraftforge.client.model.generators.ModelFile;
import net.minecraftforge.client.model.generators.VariantBlockStateBuilder;
import net.minecraftforge.client.model.generators.VariantBlockStateBuilder.PartialBlockstate;
import net.minecraftforge.client.model.generators.loaders.OBJLoaderBuilder;
import net.minecraftforge.common.data.ExistingFileHelper;
import twistedgate.overengineered.OverEngineered;
import twistedgate.overengineered.common.OEContent;
import twistedgate.overengineered.common.multiblock.UniversalMotorMultiblock;

@SuppressWarnings("unused")
public class OEBlockStates extends BlockStateProvider{
final ExistingFileHelper exFileHelper;
private final NongeneratedModels nongeneratedModels;
public OEBlockStates(DataGenerator gen, ExistingFileHelper exFileHelper){
super(gen, OverEngineered.MODID, exFileHelper);
this.exFileHelper = exFileHelper;
this.nongeneratedModels = new NongeneratedModels(gen, exFileHelper);
}

@Override
protected void registerStatesAndModels(){
// Multiblocks
universalmotor();

// Blocks
//simpleBlockWithItem(OEContent.Blocks.CREATE_TEST.get());
}

private void universalmotor(){
ResourceLocation texture = modLoc("multiblock/universal_motor");
ResourceLocation modelNormal = modLoc("models/multiblock/obj/universal_motor.obj");
ResourceLocation modelMirrored = modLoc("models/multiblock/obj/universal_motor_mirrored.obj");

BlockModelBuilder normal = multiblockModel(OEContent.Multiblock.UNIVERSAL_MOTOR.get(), modelNormal, texture, "", UniversalMotorMultiblock.INSTANCE, false);
BlockModelBuilder mirrored = multiblockModel(OEContent.Multiblock.UNIVERSAL_MOTOR.get(), modelMirrored, texture, "_mirrored", UniversalMotorMultiblock.INSTANCE, true);

createMultiblock(OEContent.Multiblock.UNIVERSAL_MOTOR.get(), normal, mirrored, texture);
}

/**
* From {@link blusunrize.immersiveengineering.common.data.BlockStates}
*/
private void createMultiblock(Block b, ModelFile masterModel, ModelFile mirroredModel, ResourceLocation particleTexture){
createMultiblock(b, masterModel, mirroredModel, IEProperties.MULTIBLOCKSLAVE, IEProperties.FACING_HORIZONTAL, IEProperties.MIRRORED, 180, particleTexture);
}

/** From {@link blusunrize.immersiveengineering.common.data.BlockStates} */
private void createMultiblock(Block b, ModelFile masterModel, @Nullable ModelFile mirroredModel, Property<Boolean> isSlave, EnumProperty<Direction> facing, @Nullable Property<Boolean> mirroredState, int rotationOffset, ResourceLocation particleTex){
Preconditions.checkArgument((mirroredModel == null) == (mirroredState == null));
VariantBlockStateBuilder builder = getVariantBuilder(b);

boolean[] possibleMirrorStates;
if(mirroredState != null)
possibleMirrorStates = new boolean[]{false, true};
else
possibleMirrorStates = new boolean[1];
for(boolean mirrored:possibleMirrorStates)
for(Direction dir:facing.getPossibleValues()){
final int angleY;
final int angleX;
if(facing.getPossibleValues().contains(Direction.UP)){
angleX = -90 * dir.getStepY();
if(dir.getAxis() != Direction.Axis.Y)
angleY = getAngle(dir, rotationOffset);
else
angleY = 0;
}else{
angleY = getAngle(dir, rotationOffset);
angleX = 0;
}

ModelFile model = mirrored ? mirroredModel : masterModel;
PartialBlockstate partialState = builder.partialState()
// .with(isSlave, false)
.with(facing, dir);

if(mirroredState != null)
partialState = partialState.with(mirroredState, mirrored);

partialState.setModels(new ConfiguredModel(model, angleX, angleY, true));
}
}

/** From {@link blusunrize.immersiveengineering.common.data.BlockStates} */
private int getAngle(Direction dir, int offset){
return (int) ((dir.toYRot() + offset) % 360);
}

private BlockModelBuilder multiblockModel(Block block, ResourceLocation model, ResourceLocation texture, String add, TemplateMultiblock mb, boolean mirror){
UnaryOperator<BlockPos> transform = UnaryOperator.identity();
if(mirror){
Vec3i size = mb.getSize(null);
transform = p -> new BlockPos(size.getX() - p.getX() - 1, p.getY(), p.getZ());
}
final Vec3i offset = mb.getMasterFromOriginOffset();

Stream<Vec3i> partsStream = mb.getStructure(null).stream()
.filter(info -> !info.state.isAir())
.map(info -> info.pos)
.map(transform)
.map(p -> p.subtract(offset));

String name = getMultiblockPath(block) + add;
NongeneratedModel base = nongeneratedModels.withExistingParent(name, mcLoc("block"))
.customLoader(OBJLoaderBuilder::begin).modelLocation(model).detectCullableFaces(false).flipV(true).end()
.texture("texture", texture)
.texture("particle", texture);

BlockModelBuilder split = this.models().withExistingParent(name + "_split", mcLoc("block"))
.customLoader(SplitModelBuilder::begin)
.innerModel(base)
.parts(partsStream.collect(Collectors.toList()))
.dynamic(false).end();

return split;
}

private String getMultiblockPath(Block b){
return "multiblock/" + getPath(b);
}

private BlockModelBuilder objModel(Block b, String modelPath, @Nullable String postFix, ResourceLocation texture){
Expand All @@ -33,6 +157,23 @@ private BlockModelBuilder objModel(Block b, String modelPath, @Nullable String p
return model;
}

private void simpleBlockWithItem(Block block){
ModelFile file = cubeAll(block);

getVariantBuilder(block).partialState()
.setModels(new ConfiguredModel(file));
itemModelWithParent(block, file);
}

private void itemModelWithParent(Block block, ModelFile parent){
getItemBuilder(block).parent(parent)
.texture("particle", modLoc("block/" + getPath(block)));
}

private ItemModelBuilder getItemBuilder(Block block){
return itemModels().getBuilder(modLoc("item/" + getPath(block)).toString());
}

private String getPath(Block b){
return b.getRegistryName().getPath();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@

import net.minecraft.data.DataGenerator;
import net.minecraft.data.tags.BlockTagsProvider;
import net.minecraft.tags.BlockTags;
import net.minecraftforge.common.data.ExistingFileHelper;
import twistedgate.overengineered.OverEngineered;
import twistedgate.overengineered.common.OEContent;

public class OEBlockTags extends BlockTagsProvider{
public OEBlockTags(DataGenerator pGenerator, @Nullable ExistingFileHelper existingFileHelper){
Expand All @@ -14,6 +16,8 @@ public OEBlockTags(DataGenerator pGenerator, @Nullable ExistingFileHelper existi

@Override
protected void addTags(){

tag(BlockTags.MINEABLE_WITH_PICKAXE).add(
OEContent.Multiblock.UNIVERSAL_MOTOR.get()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import blusunrize.immersiveengineering.common.blocks.multiblocks.StaticTemplateManager;
import net.minecraft.data.DataGenerator;
import net.minecraftforge.common.data.ExistingFileHelper;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
import net.minecraftforge.forge.event.lifecycle.GatherDataEvent;
import twistedgate.overengineered.OverEngineered;
import twistedgate.overengineered.common.data.loot.OELootGenerator;

@EventBusSubscriber(modid = OverEngineered.MODID, bus = Bus.MOD)
public class OEDataGenerator{
Expand All @@ -19,11 +21,13 @@ public class OEDataGenerator{
public static void generate(GatherDataEvent event){
DataGenerator generator = event.getGenerator();
ExistingFileHelper exhelper = event.getExistingFileHelper();
StaticTemplateManager.EXISTING_HELPER = exhelper;

if(event.includeServer()){
OEBlockTags blockTags = new OEBlockTags(generator, exhelper);
generator.addProvider(blockTags);
generator.addProvider(new OEItemTags(generator, blockTags, exhelper));
generator.addProvider(new OELootGenerator(generator));
generator.addProvider(new OERecipes(generator));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,21 @@
import net.minecraft.client.renderer.block.model.ItemTransforms.TransformType;
import net.minecraft.data.DataGenerator;
import net.minecraft.world.level.ItemLike;
import net.minecraftforge.client.model.generators.ItemModelBuilder;
import net.minecraftforge.client.model.generators.ItemModelProvider;
import net.minecraftforge.client.model.generators.ModelBuilder;
import net.minecraftforge.client.model.generators.ModelProvider;
import net.minecraftforge.client.model.generators.loaders.OBJLoaderBuilder;
import net.minecraftforge.common.data.ExistingFileHelper;
import twistedgate.overengineered.OverEngineered;
import twistedgate.overengineered.common.OEContent;


public class OEItemModels extends ItemModelProvider{
public class OEItemModels extends ModelProvider<TRSRModelBuilder>{
public OEItemModels(DataGenerator generator, ExistingFileHelper existingFileHelper){
super(generator, OverEngineered.MODID, existingFileHelper);
super(generator, OverEngineered.MODID, ITEM_FOLDER, TRSRModelBuilder::new, existingFileHelper);
}

@Override
protected void registerModels(){
universalmotorItem();
// ModelBuilder<?>.TransformsBuilder trans = model.transforms();
// doTransform(trans, TransformType.FIRST_PERSON_LEFT_HAND, new Vector3f(0, 0, 0), new Vector3f(0, 45, 0), 1.0F);
// doTransform(trans, TransformType.FIRST_PERSON_RIGHT_HAND, new Vector3f(0, 0, 0), new Vector3f(0, 45, 0), 1.0F);
Expand All @@ -33,6 +33,21 @@ protected void registerModels(){
// doTransform(trans, TransformType.FIXED, new Vector3f(0, 0, -7), new Vector3f(-90, 0, 0), 1.0F);
}

private void universalmotorItem(){
TRSRModelBuilder model = obj(OEContent.Multiblock.UNIVERSAL_MOTOR.get(), "multiblock/obj/universal_motor.obj")
.texture("texture", modLoc("multiblock/universal_motor"));

ModelBuilder<?>.TransformsBuilder trans = model.transforms();
doTransform(trans, TransformType.FIRST_PERSON_LEFT_HAND, null, null, 0.03125F);
doTransform(trans, TransformType.FIRST_PERSON_RIGHT_HAND, null, null, 0.03125F);
doTransform(trans, TransformType.THIRD_PERSON_LEFT_HAND, new Vector3f(-0.75F, -5, -1.25F), new Vector3f(0, 90, 0), 0.03125F);
doTransform(trans, TransformType.THIRD_PERSON_RIGHT_HAND, new Vector3f(1.0F, -5, -1.75F), new Vector3f(0, 270, 0), 0.03125F);
doTransform(trans, TransformType.HEAD, new Vector3f(1.5F, 8, 1.5F), null, 0.2F);
doTransform(trans, TransformType.GUI, new Vector3f(-1, -6, 0), new Vector3f(30, 225, 0), 0.0625F);
doTransform(trans, TransformType.GROUND, new Vector3f(1, 0, 1), null, 0.0625F);
doTransform(trans, TransformType.FIXED, new Vector3f(0, -8, 0), null, 0.0625F);
}

private void doTransform(ModelBuilder<?>.TransformsBuilder transform, TransformType type, @Nullable Vector3f translation, @Nullable Vector3f rotationAngle, float scale){
ModelBuilder<?>.TransformsBuilder.TransformVecBuilder trans = transform.transform(type);
if(translation != null)
Expand All @@ -43,9 +58,14 @@ private void doTransform(ModelBuilder<?>.TransformsBuilder transform, TransformT
trans.end();
}

private ItemModelBuilder obj(ItemLike item, String model){
private TRSRModelBuilder obj(ItemLike item, String model){
return getBuilder(item.asItem().getRegistryName().toString())
.customLoader(OBJLoaderBuilder::begin)
.modelLocation(modLoc("models/" + model)).flipV(true).end();
}

@Override
public String getName(){
return "Item Models";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package twistedgate.overengineered.common.data;

import java.io.IOException;
import java.io.InputStreamReader;

import com.google.common.io.CharStreams;
import com.google.gson.JsonObject;

import blusunrize.immersiveengineering.data.models.TransformationMap;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.PackType;
import net.minecraft.server.packs.resources.Resource;
import net.minecraftforge.client.model.generators.ModelBuilder;
import net.minecraftforge.common.data.ExistingFileHelper;

public class TRSRModelBuilder extends ModelBuilder<TRSRModelBuilder>{
private final TransformationMap transforms = new TransformationMap();

protected TRSRModelBuilder(ResourceLocation outputLocation, ExistingFileHelper existingFileHelper){
super(outputLocation, existingFileHelper);
}

public TRSRModelBuilder transforms(ResourceLocation source){
Resource transformFile;
try{
transformFile = existingFileHelper.getResource(source, PackType.CLIENT_RESOURCES, ".json", "transformations");
String jsonString = CharStreams.toString(new InputStreamReader(transformFile.getInputStream()));
transforms.addFromJson(jsonString);
return this;
}catch(IOException e){
throw new RuntimeException("While loading transforms from " + source, e);
}
}

@Override
public JsonObject toJson(){
JsonObject ret = super.toJson();
JsonObject transformJson = transforms.toJson();
if(!transformJson.entrySet().isEmpty())
ret.add("transform", transformJson);
return ret;
}
}
Loading