Skip to content

Commit

Permalink
Merge pull request #948 from Doc-1/1.12
Browse files Browse the repository at this point in the history
Ported rework of structure directional to allow special types.
  • Loading branch information
CreativeMD committed Mar 13, 2024
2 parents 3d106be + d327e1f commit 286a797
Show file tree
Hide file tree
Showing 5 changed files with 200 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,7 @@ public void loadFromNBT(NBTTagCompound nbt) {
}

protected Object failedLoadingRelative(NBTTagCompound nbt, StructureDirectionalField field) {
return field.getDefault();
return field.getDefault(this);
}

protected abstract void loadFromNBTExtra(NBTTagCompound nbt);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public Object get(LittleStructure structure) {
}

public Object createAndSet(LittleStructure structure, NBTTagCompound nbt) {
Object relative = create(nbt);
Object relative = create(structure, nbt);
set(structure, relative);
return relative;
}
Expand All @@ -55,34 +55,35 @@ public void setDefault(Object value) {
this.defaultValue = value;
}

public Object create(NBTTagCompound nbt) {
Object value = type.read(nbt.getTag(saveKey));
public Object create(LittleStructure structure, NBTTagCompound nbt) {
Object value = type.read(this, structure, nbt.getTag(saveKey));
if (value == null)
if (defaultValue != null)
return defaultValue;
else
return type.getDefault();
return getDefault(structure);
return value;
}

public Object createTemporary(NBTTagCompound nbt) {
return create(null, nbt);
}

public void save(NBTTagCompound nbt, Object value) {
nbt.setTag(saveKey, type.write(value));
nbt.setTag(saveKey, type.write(this, value));
}

public Object move(Object value, LittleGridContext context, LittleVec offset) {
return type.move(value, context, offset);
return type.move(this, value, context, offset);
}

public Object flip(Object value, LittleGridContext context, Axis axis, LittleVec doubledCenter) {
return type.flip(value, context, axis, doubledCenter);
return type.mirror(this, value, context, axis, doubledCenter);
}

public Object rotate(Object value, LittleGridContext context, Rotation rotation, LittleVec doubledCenter) {
return type.rotate(value, context, rotation, doubledCenter);
return type.rotate(this, value, context, rotation, doubledCenter);
}

public LittleGridContext getContext(Object value) {
return type.getContext(value);
return type.getContext(this, value);
}

public void convertToSmallest(Object value) {
Expand All @@ -97,7 +98,7 @@ public PlacePreview getPlacePreview(Object value, LittlePreviews previews) {
return type.getPlacePreview(value, previews, this);
}

public Object getDefault() {
return defaultValue != null ? defaultValue : type.getDefault();
public Object getDefault(LittleStructure structure) {
return type.getDefault(this, structure, defaultValue);
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package com.creativemd.littletiles.common.structure.directional;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.function.Function;

import javax.vecmath.Vector3f;

import com.creativemd.creativecore.common.utils.math.Rotation;
import com.creativemd.creativecore.common.utils.math.RotationUtils;
import com.creativemd.littletiles.common.structure.LittleStructure;
import com.creativemd.littletiles.common.structure.relative.StructureRelative;
import com.creativemd.littletiles.common.tile.math.box.LittleBox;
import com.creativemd.littletiles.common.tile.math.vec.LittleVec;
Expand All @@ -17,29 +22,122 @@
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagInt;
import net.minecraft.nbt.NBTTagIntArray;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumFacing.Axis;

public abstract class StructureDirectionalType<T> {

private static HashMap<Class, StructureDirectionalType> types = new HashMap<>();
private static List<Function<Field, StructureDirectionalType>> specialFactories = new ArrayList<>();

public static StructureDirectionalType getType(Field field) {
StructureDirectionalType type = types.get(field.getType());
if (type == null)
throw new RuntimeException("No registered directional type for " + field.getType() + ", " + field.getName());
return type;
if (type != null)
return type;

for (Function<Field, StructureDirectionalType> factory : specialFactories) {
type = factory.apply(field);
if (type != null)
return type;
}

throw new RuntimeException("No registered directional type for " + field.getType() + ", " + field.getName());
}

public static StructureDirectionalType getSubType(Class clazz) {
StructureDirectionalType type = types.get(clazz);
if (type != null)
return type;
throw new RuntimeException("No registered directional type for " + clazz + ", " + clazz.getName());
}

public static void register(Function<Field, StructureDirectionalType> factory) {
specialFactories.add(factory);
}

public static <T> void registerType(Class<T> clazz, StructureDirectionalType<T> type) {
public static <T> void register(Class<T> clazz, StructureDirectionalType<T> type) {
if (types.containsKey(clazz))
throw new IllegalArgumentException("Type already exists. " + clazz);

types.put(clazz, type);
}

static {
registerType(EnumFacing.class, new StructureDirectionalType<EnumFacing>() {
register(x -> {
if (List.class.isAssignableFrom(x.getType()))
return new StructureDirectionalType<List>() {

private final StructureDirectionalType subType;

{
ParameterizedType type = (ParameterizedType) x.getGenericType();
subType = getSubType((Class) type.getActualTypeArguments()[0]);
}

@Override
public List read(StructureDirectionalField field, LittleStructure structure, NBTBase nbt) {
List list = structure != null ? (List) field.get(structure) : new ArrayList<>();
list.clear();
if (nbt instanceof NBTTagList) {
NBTTagList tag = (NBTTagList) nbt;
for (int i = 0; i < tag.tagCount(); i++) {
Object object = subType.read(field, structure, tag.get(i));
if (object != null)
list.add(object);
}
}
return list;
}

@Override
public NBTBase write(StructureDirectionalField field, List value) {
NBTTagList list = new NBTTagList();
for (int i = 0; i < value.size(); i++) {
NBTBase tag = subType.write(field, value.get(i));
if (tag != null)
list.appendTag(tag);
}
return list;
}

@Override
public List move(StructureDirectionalField field, List value, LittleGridContext context, LittleVec offset) {
for (int i = 0; i < value.size(); i++)
subType.move(field, value.get(i), context, offset);
return value;
}

@Override
public List mirror(StructureDirectionalField field, List value, LittleGridContext grid, Axis axis, LittleVec doubledCenter) {
for (int i = 0; i < value.size(); i++)
subType.mirror(field, value.get(i), grid, axis, doubledCenter);
return value;
}

@Override
public List rotate(StructureDirectionalField field, List value, LittleGridContext grid, Rotation rotation, LittleVec doubledCenter) {
for (int i = 0; i < value.size(); i++)
subType.rotate(field, value.get(i), grid, rotation, doubledCenter);
return value;
}

@Override
public Object getDefault(StructureDirectionalField field, LittleStructure structure, Object defaultValue) {
List value = (List) field.get(structure);
value.clear();
if (defaultValue != null && defaultValue instanceof List) {
List list = (List) defaultValue;
value.addAll(list);
}
return value;
}

};
return null;
});

register(EnumFacing.class, new StructureDirectionalTypeSimple<EnumFacing>() {
@Override
public EnumFacing read(NBTBase nbt) {
if (nbt instanceof NBTTagInt)
Expand All @@ -58,7 +156,7 @@ public EnumFacing move(EnumFacing value, LittleGridContext context, LittleVec of
}

@Override
public EnumFacing flip(EnumFacing value, LittleGridContext context, Axis axis, LittleVec doubledCenter) {
public EnumFacing mirror(EnumFacing value, LittleGridContext context, Axis axis, LittleVec doubledCenter) {
if (axis == value.getAxis())
return value.getOpposite();
return value;
Expand All @@ -74,7 +172,7 @@ public EnumFacing getDefault() {
return EnumFacing.EAST;
}
});
registerType(Axis.class, new StructureDirectionalType<Axis>() {
register(Axis.class, new StructureDirectionalTypeSimple<Axis>() {

@Override
public Axis read(NBTBase nbt) {
Expand All @@ -94,7 +192,7 @@ public Axis move(Axis value, LittleGridContext context, LittleVec offset) {
}

@Override
public Axis flip(Axis value, LittleGridContext context, Axis axis, LittleVec doubledCenter) {
public Axis mirror(Axis value, LittleGridContext context, Axis axis, LittleVec doubledCenter) {
return value;
}

Expand All @@ -109,7 +207,7 @@ public Axis getDefault() {
}

});
registerType(StructureRelative.class, new StructureDirectionalType<StructureRelative>() {
register(StructureRelative.class, new StructureDirectionalTypeSimple<StructureRelative>() {

@Override
public StructureRelative read(NBTBase nbt) {
Expand All @@ -130,7 +228,7 @@ public StructureRelative move(StructureRelative value, LittleGridContext context
}

@Override
public StructureRelative flip(StructureRelative value, LittleGridContext context, Axis axis, LittleVec doubledCenter) {
public StructureRelative mirror(StructureRelative value, LittleGridContext context, Axis axis, LittleVec doubledCenter) {
value.flip(context, axis, doubledCenter);
return value;
}
Expand Down Expand Up @@ -167,21 +265,23 @@ public StructureRelative getDefault() {
}

});
registerType(Vector3f.class, new StructureDirectionalType<Vector3f>() {
register(Vector3f.class, new StructureDirectionalTypeSimple<Vector3f>() {

@Override
public Vector3f read(NBTBase nbt) {
if (nbt instanceof NBTTagIntArray) {
int[] array = ((NBTTagIntArray) nbt).getIntArray();
if (array.length == 3)
return new Vector3f(Float.intBitsToFloat(array[0]), Float.intBitsToFloat(array[1]), Float.intBitsToFloat(array[2]));
return new Vector3f(Float.intBitsToFloat(array[0]), Float.intBitsToFloat(array[1]), Float
.intBitsToFloat(array[2]));
}
return null;
}

@Override
public NBTBase write(Vector3f value) {
return new NBTTagIntArray(new int[] { Float.floatToIntBits(value.x), Float.floatToIntBits(value.y), Float.floatToIntBits(value.z) });
return new NBTTagIntArray(new int[] { Float.floatToIntBits(value.x), Float.floatToIntBits(value.y), Float
.floatToIntBits(value.z) });
}

@Override
Expand All @@ -190,7 +290,7 @@ public Vector3f move(Vector3f value, LittleGridContext context, LittleVec offset
}

@Override
public Vector3f flip(Vector3f value, LittleGridContext context, Axis axis, LittleVec doubledCenter) {
public Vector3f mirror(Vector3f value, LittleGridContext context, Axis axis, LittleVec doubledCenter) {
RotationUtils.flip(value, axis);
return value;
}
Expand All @@ -208,19 +308,19 @@ public Vector3f getDefault() {
});
}

public abstract T read(NBTBase nbt);
public abstract T read(StructureDirectionalField field, LittleStructure structure, NBTBase nbt);

public abstract NBTBase write(T value);
public abstract NBTBase write(StructureDirectionalField field, T value);

public abstract T move(T value, LittleGridContext context, LittleVec offset);
public abstract T move(StructureDirectionalField field, T value, LittleGridContext context, LittleVec offset);

public abstract T flip(T value, LittleGridContext context, Axis axis, LittleVec doubledCenter);
public abstract T mirror(StructureDirectionalField field, T value, LittleGridContext context, Axis axis, LittleVec doubledCenter);

public abstract T rotate(T value, LittleGridContext context, Rotation rotation, LittleVec doubledCenter);
public abstract T rotate(StructureDirectionalField field, T value, LittleGridContext context, Rotation rotation, LittleVec doubledCenter);

public abstract T getDefault();
public abstract Object getDefault(StructureDirectionalField field, LittleStructure structure, Object defaultValue);

public LittleGridContext getContext(T value) {
public LittleGridContext getContext(StructureDirectionalField field, T value) {
return null;
}

Expand All @@ -236,4 +336,59 @@ public PlacePreview getPlacePreview(T value, LittlePreviews previews, StructureD
return null;
}

public static abstract class StructureDirectionalTypeSimple<T> extends StructureDirectionalType<T> {

@Override
public T read(StructureDirectionalField field, LittleStructure structure, NBTBase nbt) {
return read(nbt);
}

public abstract T read(NBTBase nbt);

@Override
public NBTBase write(StructureDirectionalField field, T value) {
return write(value);
}

public abstract NBTBase write(T value);

@Override
public T move(StructureDirectionalField field, T value, LittleGridContext context, LittleVec offset) {
return move(value, context, offset);
}

public abstract T move(T value, LittleGridContext context, LittleVec offset);

@Override
public T mirror(StructureDirectionalField field, T value, LittleGridContext grid, Axis axis, LittleVec doubledCenter) {
return mirror(value, grid, axis, doubledCenter);
}

public abstract T mirror(T value, LittleGridContext grid, Axis axis, LittleVec doubledCenter);

@Override
public T rotate(StructureDirectionalField field, T value, LittleGridContext grid, Rotation rotation, LittleVec doubledCenter) {
return rotate(value, grid, rotation, doubledCenter);
}

public abstract T rotate(T value, LittleGridContext grid, Rotation rotation, LittleVec doubledCenter);

@Override
public Object getDefault(StructureDirectionalField field, LittleStructure structure, Object defaultValue) {
if (defaultValue != null)
return defaultValue;
return getDefault();
}

public abstract T getDefault();

@Override
public LittleGridContext getContext(StructureDirectionalField field, T value) {
return getContext(value);
}

public LittleGridContext getContext(T value) {
return null;
}
}
}
Loading

0 comments on commit 286a797

Please sign in to comment.