Pushed First attempt pocket with new system and fixes.

This commit is contained in:
Waterpicker 2021-02-10 10:02:35 -06:00
parent 21b860fbee
commit 142eb7ee37
10 changed files with 179 additions and 5 deletions

View file

@ -27,6 +27,7 @@ import org.dimdev.dimdoors.util.PocketGenerationParameters;
import org.dimdev.dimdoors.util.Weighted;
import org.dimdev.dimdoors.util.math.Equation;
import org.dimdev.dimdoors.util.math.Equation.EquationParseException;
import org.dimdev.dimdoors.world.level.DimensionalRegistry;
import org.dimdev.dimdoors.world.pocket.Pocket;
import java.util.ArrayList;
@ -139,7 +140,7 @@ public abstract class PocketGenerator implements Weighted<PocketGenerationParame
return this.weightEquation.apply(parameters.toVariableMap(new HashMap<>()));
}
public void apply(PocketGenerationParameters parameters, RiftManager manager) {
public void applyModifiers(PocketGenerationParameters parameters, RiftManager manager) {
for (Modifier modifier : modifierList) {
modifier.apply(parameters, manager);
}
@ -168,6 +169,10 @@ public abstract class PocketGenerator implements Weighted<PocketGenerationParame
}
});
TemplateUtils.registerRifts(rifts, parameters.getLinkTo(), parameters.getLinkProperties(), pocket);
System.out.println("Printing Bullshit.");
DimensionalRegistry.getRiftRegistry().getPocketEntrances(pocket).forEach(System.out::println);
pocket.virtualLocation = parameters.getSourceVirtualLocation(); //TODO: this makes very little sense
}

View file

@ -9,6 +9,7 @@ import net.minecraft.util.registry.RegistryKey;
import net.minecraft.util.registry.SimpleRegistry;
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
import org.dimdev.dimdoors.block.entity.RiftData;
import org.dimdev.dimdoors.util.PocketGenerationParameters;
import org.dimdev.dimdoors.world.pocket.Pocket;
@ -45,7 +46,7 @@ public interface Modifier {
ModifierType<ShellModifier> SHELL_MODIFIER_TYPE = register(new Identifier("dimdoors", ShellModifier.KEY), ShellModifier::new);
ModifierType<DimensionalDoorModifier> DIMENSIONAL_DOOR_MODIFIER_TYPE = register(new Identifier("dimdoors", DimensionalDoorModifier.KEY), DimensionalDoorModifier::new);
ModifierType<PocketEntranceModifier> PUBLIC_MODIFIER_TYPE = register(new Identifier("dimdoors", PocketEntranceModifier.KEY), PocketEntranceModifier::new);
ModifierType<RiftDataModifier> RIFT_DATA_MODIFIER_TYPE = register(new Identifier("dimdoors", RiftDataModifier.KEY), RiftDataModifier::new);
Modifier fromTag(CompoundTag tag);
CompoundTag toTag(CompoundTag tag);

View file

@ -0,0 +1,111 @@
package org.dimdev.dimdoors.pockets.modifier;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.IntTag;
import net.minecraft.nbt.ListTag;
import net.fabricmc.fabric.api.util.NbtType;
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
import org.dimdev.dimdoors.block.entity.RiftData;
import org.dimdev.dimdoors.pockets.SchematicV2Handler;
import org.dimdev.dimdoors.rift.targets.VirtualTarget;
import org.dimdev.dimdoors.util.PocketGenerationParameters;
import org.dimdev.dimdoors.util.TagEquations;
public class RiftDataModifier implements Modifier {
private static final Logger LOGGER = LogManager.getLogger();
public static final String KEY = "rift_data";
private CompoundTag doorData;
private String doorDataReference;
private List<Integer> ids;
@Override
public Modifier fromTag(CompoundTag tag) {
if (tag.getType("rift_data") == NbtType.STRING) {
doorDataReference = tag.getString("rift_data");
doorData = (CompoundTag) SchematicV2Handler.getInstance().readNbtFromJson(doorDataReference);
LOGGER.info("Print Door bullshit: " + "\n" + doorData);
}
else if (tag.getType("rift_data") == NbtType.COMPOUND) doorData = tag.getCompound("rift_data");
ids = stream(tag.getByteArray("ids")).boxed().collect(Collectors.toList());
LOGGER.info("Checking bullshit 2 Electric Bugaloo: " + tag);
return this;
}
public static IntStream stream(byte[] bytes) {
ByteBuffer buffer = ByteBuffer.wrap(bytes);
return IntStream.generate(buffer::get).limit(buffer.remaining());
}
private static byte[] toByteArray(int[] ints) {
byte[] bytes = new byte[ints.length];
for (int i = 0; i < ints.length; i++) {
bytes[i] = (byte) ints[i];
}
return bytes;
}
@Override
public CompoundTag toTag(CompoundTag tag) {
Modifier.super.toTag(tag);
if (doorDataReference != null) tag.putString("rift_data", doorDataReference);
else if (doorData != null) tag.put("rift_data", doorData);
tag.putByteArray("ids", toByteArray(ids.stream().mapToInt(Integer::intValue).toArray()));
return tag;
}
@Override
public ModifierType<? extends Modifier> getType() {
return ModifierType.RIFT_DATA_MODIFIER_TYPE;
}
@Override
public String getKey() {
return KEY;
}
@Override
public void apply(PocketGenerationParameters parameters, RiftManager manager) {
Map<String, Double> variableMap = manager.getPocket().toVariableMap(new HashMap<>());
Consumer<RiftBlockEntity> riftBlockEntityConsumer;
if (doorData == null) {
riftBlockEntityConsumer = rift -> rift.setDestination(VirtualTarget.NoneTarget.INSTANCE);
} else {
CompoundTag solvedDoorData = TagEquations.solveCompoundTagEquations(doorData, variableMap);
RiftData data = RiftData.fromTag(solvedDoorData);
LOGGER.info("Dealing spefific bullshit.");
LOGGER.info(RiftData.toTag(data));
LOGGER.info(solvedDoorData);
riftBlockEntityConsumer = rift -> rift.setData(data);
}
manager.foreachConsume((id, rift) -> {
if(ids.contains(id)) {
riftBlockEntityConsumer.accept(rift);
return true;
} else {
return false;
}
});
}
}

View file

@ -1,7 +1,10 @@
package org.dimdev.dimdoors.pockets.modifier;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.BiPredicate;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
@ -43,8 +46,8 @@ public class RiftManager {
return false;
}
public boolean consume(int id, Function<RiftBlockEntity, Boolean> consumer) {
if (map.containsKey(id) && consumer.apply(map.get(id))) {
public boolean consume(int id, Predicate<RiftBlockEntity> consumer) {
if (map.containsKey(id) && consumer.test(map.get(id))) {
map.remove(id);
return true;
}
@ -62,4 +65,12 @@ public class RiftManager {
public boolean available(int id) { // TODO: remove? method is likely redundant
return !map.containsKey(id);
}
public void foreachConsume(BiPredicate<Integer, RiftBlockEntity> consumer) {
for(int id : map.keySet()) {
if(consumer.test(id, map.get(id))) {
map.remove(id);
}
}
}
}

View file

@ -97,7 +97,7 @@ public abstract class PocketGeneratorReference extends VirtualSingularPocket {
RiftManager manager = new RiftManager(pocket);
generator.apply(parameters, manager);
generator.applyModifiers(parameters, manager);
this.applyModifiers(parameters, manager);
generator.setup(pocket, parameters, setupLoot != null ? setupLoot : true);

View file

@ -0,0 +1,28 @@
{
"type": "dimdoors:schematic",
"id": "v2/custom/purpur_hallway",
"modifiers": [
{
"layers": [
{
"block_state": "dimdoors:pink_ancient_fabric",
"thickness": "1"
}
],
"type": "dimdoors:shell"
},
{
"type": "dimdoors:rift_data",
"ids": [0],
"rift_data": "rift_data/pocket_entrance"
},
{
"type": "dimdoors:rift_data",
"ids": [1,2,3,4,5,6,7],
"rift_data": "rift_data/public_entrance"
}
],
"offset_x": "1",
"offset_y": "1",
"offset_z": "1"
}

View file

@ -0,0 +1,4 @@
{
"id": "custom/purpur_hallway",
"type": "dimdoors:id"
}

View file

@ -0,0 +1,9 @@
{
"destination": {
"ifDestination": {
"type": "dimdoors:pocket_exit"
},
"weight": 1.0,
"type": "dimdoors:pocket_entrance"
}
}

View file

@ -0,0 +1,5 @@
{
"destination": {
"type": "dimdoors:public_pocket"
}
}