added TagEquations
This commit is contained in:
parent
0699841535
commit
1ac749affe
2 changed files with 87 additions and 3 deletions
|
@ -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
|
||||
|
||||
}
|
||||
|
|
67
src/main/java/org/dimdev/dimdoors/util/TagEquations.java
Normal file
67
src/main/java/org/dimdev/dimdoors/util/TagEquations.java
Normal 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;
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue