Added RelativeReferenceModifier

This commit is contained in:
Waterpicker 2021-02-10 17:15:28 -06:00
parent d4e103c315
commit a0d5c239e0
4 changed files with 84 additions and 1 deletions

View file

@ -47,6 +47,7 @@ public interface Modifier {
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);
ModifierType<RelativeReferenceModifier> RELATIVE_REFERENCE_MODIFIER_TYPE = register(new Identifier("dimdoors", RelativeReferenceModifier.KEY), RelativeReferenceModifier::new);
Modifier fromTag(CompoundTag tag);
CompoundTag toTag(CompoundTag tag);

View file

@ -0,0 +1,62 @@
package org.dimdev.dimdoors.pockets.modifier;
import java.util.Optional;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.world.ServerWorld;
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
import org.dimdev.dimdoors.rift.targets.LocalReference;
import org.dimdev.dimdoors.rift.targets.RiftReference;
import org.dimdev.dimdoors.util.Location;
import org.dimdev.dimdoors.util.PocketGenerationParameters;
public class RelativeReferenceModifier implements Modifier {
public static final String KEY = "relative";
private int point_a, point_b;
@Override
public Modifier fromTag(CompoundTag tag) {
point_a = tag.getInt("point_a");
point_b = tag.getInt("point_b");
return this;
}
@Override
public CompoundTag toTag(CompoundTag tag) {
Modifier.super.toTag(tag);
tag.putInt("point_a", point_a);
tag.putInt("point_b", point_b);
return tag;
}
@Override
public ModifierType<? extends Modifier> getType() {
return ModifierType.RELATIVE_REFERENCE_MODIFIER_TYPE;
}
@Override
public String getKey() {
return KEY;
}
@Override
public void apply(PocketGenerationParameters parameters, RiftManager manager) {
Optional<Location> riftA = manager.get(point_a).map(rift -> new Location((ServerWorld) rift.getWorld(), rift.getPos()));
Optional<Location> riftB = manager.get(point_b).map(rift -> new Location((ServerWorld) rift.getWorld(), rift.getPos()));
if(riftA.isPresent() && riftB.isPresent()) {
RiftReference link1 = LocalReference.tryMakeRelative(riftA.get(), riftB.get());
RiftReference link2 = LocalReference.tryMakeRelative(riftB.get(), riftA.get());
manager.consume(point_a, rift -> addLink(rift, link1));
manager.consume(point_b, rift -> addLink(rift, link2));
}
}
private boolean addLink(RiftBlockEntity rift, RiftReference link) {
rift.setDestination(link);
return true;
}
}

View file

@ -2,6 +2,7 @@ package org.dimdev.dimdoors.pockets.modifier;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BiPredicate;
@ -75,4 +76,8 @@ public class RiftManager {
}
}
}
public Optional<RiftBlockEntity> get(int id) {
return Optional.ofNullable(map.get(id));
}
}

View file

@ -18,8 +18,23 @@
},
{
"type": "dimdoors:rift_data",
"ids": [1,2,3,4,5,6,7],
"ids": [4],
"rift_data": "rift_data/public_entrance"
},
{
"type": "dimdoors:relative",
"point_a": 1,
"point_b": 7
},
{
"type": "dimdoors:relative",
"point_a": 2,
"point_b": 6
},
{
"type": "dimdoors:relative",
"point_a": 3,
"point_b": 5
}
],
"offset_x": "1",