added TagEquations

This commit is contained in:
CreepyCre 2021-02-04 19:55:38 +01:00
parent 0699841535
commit 1ac749affe
2 changed files with 87 additions and 3 deletions

View file

@ -4,10 +4,13 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import net.fabricmc.fabric.api.util.NbtType;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.enums.DoubleBlockHalf;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.Tag;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
@ -20,10 +23,12 @@ import org.dimdev.dimdoors.block.DimensionalDoorBlock;
import org.dimdev.dimdoors.block.ModBlocks;
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
import org.dimdev.dimdoors.block.entity.ModBlockEntityTypes;
import org.dimdev.dimdoors.block.entity.RiftData;
import org.dimdev.dimdoors.rift.registry.LinkProperties;
import org.dimdev.dimdoors.rift.targets.PocketEntranceMarker;
import org.dimdev.dimdoors.rift.targets.PocketExitMarker;
import org.dimdev.dimdoors.util.PocketGenerationParameters;
import org.dimdev.dimdoors.util.TagEquations;
import org.dimdev.dimdoors.util.math.Equation;
import org.dimdev.dimdoors.util.math.Equation.EquationParseException;
import org.dimdev.dimdoors.world.pocket.Pocket;
@ -35,6 +40,7 @@ public class DimensionalDoorModifier implements Modifier {
private Direction facing;
private String doorTypeString;
private DimensionalDoorBlock doorType;
private CompoundTag doorData;
private String x;
private String y;
@ -61,6 +67,8 @@ public class DimensionalDoorModifier implements Modifier {
}
doorType = (DimensionalDoorBlock) doorBlock;
if (tag.contains("door_data")) doorData = tag.getCompound("door_data");
try {
x = tag.getString("x");
y = tag.getString("y");
@ -81,6 +89,7 @@ public class DimensionalDoorModifier implements Modifier {
tag.putString("facing", facing.asString());
tag.putString("door_type", doorTypeString);
if (doorData != null) tag.put("door_data", doorData);
tag.putString("x", x);
tag.putString("y", y);
tag.putString("z", z);
@ -109,10 +118,18 @@ public class DimensionalDoorModifier implements Modifier {
world.setBlockState(pos, lower);
world.setBlockState(pos.up(), doorType.getDefaultState().with(DimensionalDoorBlock.HALF, DoubleBlockHalf.UPPER).with(DimensionalDoorBlock.FACING, facing));
// TODO: make the rifts be built more dynamically
EntranceRiftBlockEntity rift = ModBlockEntityTypes.ENTRANCE_RIFT.instantiate();
rift.setDestination(PocketEntranceMarker.builder().ifDestination(new PocketExitMarker()).weight(1f).build());
rift.setProperties(LinkProperties.builder().entranceWeight(1f).groups(Collections.singleton(1)).floatingWeight(1f).linksRemaining(1).oneWay(false).build());
if (doorData == null) {
rift.setDestination(PocketEntranceMarker.builder().ifDestination(new PocketExitMarker()).weight(1f).build());
rift.setProperties(LinkProperties.builder().entranceWeight(1f).groups(Collections.singleton(1)).floatingWeight(1f).linksRemaining(1).oneWay(false).build());
} else {
CompoundTag solvedDoorData = TagEquations.solveCompoundTagEquations(doorData, variableMap);
rift.setData(RiftData.fromTag(solvedDoorData));
}
world.setBlockEntity(pos, rift);
}
// TODO: move this to utility class
}

View file

@ -0,0 +1,67 @@
package org.dimdev.dimdoors.util;
import net.fabricmc.fabric.api.util.NbtType;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.Tag;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.util.math.Equation;
import java.util.Map;
public class TagEquations {
private static final Logger LOGGER = LogManager.getLogger();
public static CompoundTag solveCompoundTagEquations(CompoundTag tag, Map<String, Double> variableMap) {
CompoundTag solved = new CompoundTag();
for (String key : tag.getKeys()) {
if (tag.getType(key) == NbtType.STRING && key.startsWith("equation_")){
try {
double solution = Equation.parse(tag.getString(key)).apply(variableMap);
key = key.substring(9);
if (key.startsWith("int_")) {
key = key.substring(4);
solved.putInt(key, (int) solution);
}
else if (key.startsWith("boolean_")) {
key = key.substring(8);
solved.putBoolean(key, Equation.toBoolean(solution));
}
else if (key.startsWith("double_")) {
key = key.substring(7);
solved.putDouble(key, solution);
}
else {
solved.putDouble(key, solution);
}
} catch (Equation.EquationParseException e) {
LOGGER.error(e);
}
} else if (tag.getType(key) == NbtType.COMPOUND) {
solved.put(key, solveCompoundTagEquations(tag.getCompound(key), variableMap));
} else if (tag.getType(key) == NbtType.LIST) {
solved.put(key, solveListTagEquations((ListTag) tag.get(key), variableMap));
}
else {
solved.put(key, tag.get(key));
}
}
return solved;
}
public static ListTag solveListTagEquations(ListTag listTag, Map<String, Double> variableMap) {
ListTag solved = new ListTag();
for(Tag tag : listTag) {
if (tag.getType() == NbtType.LIST) {
solved.add(solveListTagEquations((ListTag) tag, variableMap));
}
else if (tag.getType() == NbtType.COMPOUND) {
solved.add(solveCompoundTagEquations((CompoundTag) tag, variableMap));
}
else {
solved.add(tag);
}
}
return solved;
}
}