Switch to plain old nbt, some annotations

This commit is contained in:
SD 2021-03-09 14:05:00 +05:30
parent d695bcfa85
commit ea96bc9af3
8 changed files with 89 additions and 86 deletions

View file

@ -129,4 +129,14 @@ public class DetachedRiftBlockEntity extends RiftBlockEntity {
public void setUnregisterDisabled(boolean unregisterDisabled) {
this.unregisterDisabled = unregisterDisabled;
}
@Override
public boolean isLocked() {
return false;
}
@Override
public void setLocked(boolean locked) {
// NO-OP
}
}

View file

@ -12,6 +12,7 @@ import net.minecraft.util.JsonHelper;
import net.minecraft.util.math.EulerAngle;
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.block.CoordinateTransformerBlock;
import org.dimdev.dimdoors.item.RiftKeyItem;
import org.dimdev.dimdoors.rift.registry.Rift;
import org.dimdev.dimdoors.util.EntityUtils;
import org.dimdev.dimdoors.util.TeleportUtil;
@ -52,16 +53,21 @@ public class EntranceRiftBlockEntity extends RiftBlockEntity {
if (this.isLocked()) {
if (entity instanceof LivingEntity) {
ItemStack stack = ((LivingEntity) entity).getStackInHand(((LivingEntity) entity).getActiveHand());
RiftKeyIdsComponent component = RiftKeyIdsComponent.get(stack);
Rift rift = this.asRift();
if (!component.hasId(rift.getId())) {
EntityUtils.chat(entity, new TranslatableText("rifts.isLocked"));
return false;
if (RiftKeyItem.has(stack, rift.getId())) {
return innerTeleport(entity);
}
} else {
return false;
EntityUtils.chat(entity, new TranslatableText("rifts.isLocked"));
}
return false;
}
return innerTeleport(entity);
}
private boolean innerTeleport(Entity entity) {
boolean status = super.teleport(entity);
if (this.riftStateChanged && !this.data.isAlwaysDelete()) {

View file

@ -1,15 +1,17 @@
package org.dimdev.dimdoors.item;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import org.dimdev.dimdoors.block.RiftProvider;
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
import org.dimdev.dimdoors.mixin.ListTagAccessor;
import org.dimdev.dimdoors.rift.registry.Rift;
import org.dimdev.dimdoors.util.EntityUtils;
import org.dimdev.dimdoors.util.Location;
import org.dimdev.dimdoors.world.level.component.RiftKeyIdsComponent;
import org.dimdev.dimdoors.world.level.registry.DimensionalRegistry;
import org.jetbrains.annotations.Nullable;
@ -19,12 +21,16 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUsageContext;
import net.minecraft.nbt.IntArrayTag;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.ActionResult;
import net.minecraft.util.dynamic.DynamicSerializableUuid;
import net.minecraft.world.World;
import net.fabricmc.fabric.api.util.NbtType;
public class RiftKeyItem extends Item {
public RiftKeyItem(Settings settings) {
super(settings);
@ -32,11 +38,12 @@ public class RiftKeyItem extends Item {
@Override
public void appendTooltip(ItemStack stack, @Nullable World world, List<Text> tooltip, TooltipContext context) {
RiftKeyIdsComponent component = RiftKeyIdsComponent.get(stack);
if (context.isAdvanced() && !component.isEmpty()) {
if (isEmpty(stack)) {
tooltip.add(new TranslatableText("item.dimdoors.rift_key.no_links"));
} else if (context.isAdvanced()) {
tooltip.add(LiteralText.EMPTY);
tooltip.add(new TranslatableText("item.dimdoors.rift_key.ids"));
for (UUID id : component.getIds()) {
for (UUID id : getIds(stack)) {
tooltip.add(new LiteralText(" " + id.toString()));
}
}
@ -45,7 +52,12 @@ public class RiftKeyItem extends Item {
@Override
public boolean hasGlint(ItemStack stack) {
return RiftKeyIdsComponent.get(stack).isEmpty();
return !isEmpty(stack);
}
@Override
public boolean shouldSyncTagToClient() {
return super.shouldSyncTagToClient();
}
@Override
@ -53,6 +65,13 @@ public class RiftKeyItem extends Item {
return 30;
}
@Override
public ItemStack getDefaultStack() {
ItemStack stack = super.getDefaultStack();
stack.putSubTag("Ids", ListTagAccessor.createListTag(new ArrayList<>(), (byte) NbtType.INT_ARRAY));
return stack;
}
@Override
public ActionResult useOnBlock(ItemUsageContext context) {
if (context.getWorld().isClient) {
@ -61,7 +80,6 @@ public class RiftKeyItem extends Item {
PlayerEntity player = context.getPlayer();
BlockState state = context.getWorld().getBlockState(context.getBlockPos());
if (player != null && state.getBlock() instanceof RiftProvider && player.isSneaky()) {
RiftKeyIdsComponent component = RiftKeyIdsComponent.get(context.getStack());
RiftBlockEntity riftBlockEntity = ((RiftProvider<?>) state.getBlock()).getRift(context.getWorld(), context.getBlockPos(), state);
if (riftBlockEntity.isDetached()) {
return super.useOnBlock(context);
@ -69,17 +87,17 @@ public class RiftKeyItem extends Item {
EntranceRiftBlockEntity entranceRiftBlockEntity = ((EntranceRiftBlockEntity) riftBlockEntity);
Rift rift = DimensionalRegistry.getRiftRegistry().getRift(new Location(entranceRiftBlockEntity.getWorld().getRegistryKey(), entranceRiftBlockEntity.getPos()));
if (entranceRiftBlockEntity.isLocked()) {
if (!component.remove(rift.getId())) {
EntityUtils.chat(player, new TranslatableText("rifts.cantUnlock"));
} else {
if (tryRemove(context.getStack(), rift.getId())) {
entranceRiftBlockEntity.setLocked(false);
entranceRiftBlockEntity.markDirty();
EntityUtils.chat(player, new TranslatableText("rifts.unlocked"));
return ActionResult.SUCCESS;
} else {
EntityUtils.chat(player, new TranslatableText("rifts.cantUnlock"));
}
} else {
entranceRiftBlockEntity.setLocked(true);
component.addId(rift.getId());
add(context.getStack(), rift.getId());
entranceRiftBlockEntity.markDirty();
EntityUtils.chat(player, new TranslatableText("rifts.locked"));
return ActionResult.SUCCESS;
@ -87,4 +105,32 @@ public class RiftKeyItem extends Item {
}
return super.useOnBlock(context);
}
public static boolean tryRemove(ItemStack stack, UUID id) {
IntArrayTag arrayTag = new IntArrayTag(DynamicSerializableUuid.toIntArray(id));
return stack.getOrCreateTag().getList("Ids", NbtType.LIST).remove(arrayTag);
}
public static void add(ItemStack stack, UUID id) {
IntArrayTag arrayTag = new IntArrayTag(DynamicSerializableUuid.toIntArray(id));
if (!has(stack, id)) stack.getOrCreateTag().getList("Ids", NbtType.LIST).add(arrayTag);
}
public static boolean has(ItemStack stack, UUID id) {
return stack.getOrCreateTag().getList("Ids", NbtType.INT_ARRAY).contains(new IntArrayTag(DynamicSerializableUuid.toIntArray(id)));
}
public static boolean isEmpty(ItemStack stack) {
return stack.getOrCreateTag().getList("Ids", NbtType.INT_ARRAY).isEmpty();
}
public static List<UUID> getIds(ItemStack stack) {
return stack.getOrCreateTag()
.getList("ids", NbtType.INT_ARRAY)
.stream()
.map(IntArrayTag.class::cast)
.map(IntArrayTag::getIntArray)
.map(DynamicSerializableUuid::toUuid)
.collect(Collectors.toList());
}
}

View file

@ -1,6 +1,12 @@
package org.dimdev.dimdoors.util.math;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.BiFunction;
import net.minecraft.util.Pair;
@ -9,6 +15,7 @@ import org.apache.logging.log4j.Logger;
import net.minecraft.util.math.MathHelper;
@FunctionalInterface
public interface Equation {
double FALSE = 0d;
double TRUE = 1d;
@ -132,7 +139,7 @@ public interface Equation {
throw new EquationParseException("\"" + equationString + "\" could not be parsed");
}
@FunctionalInterface
private interface EquationParser {
Optional<Equation> tryParse(String toParse) throws EquationParseException;
}
@ -240,7 +247,7 @@ public interface Equation {
}
}
@FunctionalInterface
private interface TriFunction<T, U, V, R> {
R apply(T t, U u, V v);
}

View file

@ -13,14 +13,12 @@ import dev.onyxstudios.cca.api.v3.level.LevelComponentInitializer;
import org.dimdev.dimdoors.item.ModItems;
import org.dimdev.dimdoors.world.level.component.ChunkLazilyGeneratedComponent;
import org.dimdev.dimdoors.world.level.component.CounterComponent;
import org.dimdev.dimdoors.world.level.component.RiftKeyIdsComponent;
import org.dimdev.dimdoors.world.level.registry.DimensionalRegistry;
@SuppressWarnings("UnstableApiUsage")
public class DimensionalDoorsComponents implements LevelComponentInitializer, ItemComponentInitializer, ChunkComponentInitializer {
public static final ComponentKey<DimensionalRegistry> DIMENSIONAL_REGISTRY_COMPONENT_KEY = ComponentRegistryV3.INSTANCE.getOrCreate(new Identifier("dimdoors:dimensional_registry"), DimensionalRegistry.class);
public static final ComponentKey<CounterComponent> COUNTER_COMPONENT_KEY = ComponentRegistryV3.INSTANCE.getOrCreate(new Identifier("dimdoors:counter"), CounterComponent.class);
public static final ComponentKey<RiftKeyIdsComponent> RIFT_KEY_IDS_COMPONENT_KEY = ComponentRegistryV3.INSTANCE.getOrCreate(new Identifier("dimdoors:rift_key_ids"), RiftKeyIdsComponent.class);
public static final ComponentKey<ChunkLazilyGeneratedComponent> CHUNK_LAZILY_GENERATED_COMPONENT_KEY = ComponentRegistryV3.INSTANCE.getOrCreate(new Identifier("dimdoors:chunk_lazily_generated"), ChunkLazilyGeneratedComponent.class);
@Override
@ -31,7 +29,6 @@ public class DimensionalDoorsComponents implements LevelComponentInitializer, It
@Override
public void registerItemComponentFactories(ItemComponentFactoryRegistry registry) {
registry.register(ModItems.RIFT_CONFIGURATION_TOOL, COUNTER_COMPONENT_KEY, CounterComponent::new);
registry.register(ModItems.RIFT_KEY, RIFT_KEY_IDS_COMPONENT_KEY, RiftKeyIdsComponent::new);
}
@Override

View file

@ -1,62 +0,0 @@
package org.dimdev.dimdoors.world.level.component;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import dev.onyxstudios.cca.api.v3.item.ItemComponent;
import org.dimdev.dimdoors.mixin.ListTagAccessor;
import org.dimdev.dimdoors.world.level.DimensionalDoorsComponents;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.IntArrayTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.NbtOps;
import net.minecraft.util.dynamic.DynamicSerializableUuid;
import net.fabricmc.fabric.api.util.NbtType;
public class RiftKeyIdsComponent extends ItemComponent {
public RiftKeyIdsComponent(ItemStack stack) {
super(stack);
if (!hasTag("ids")) {
this.putList("ids", ListTagAccessor.createListTag(new ArrayList<>(), (byte) NbtType.INT_ARRAY));
}
}
public void addId(UUID uuid) {
if (!hasId(uuid)) this.getList("ids", NbtType.INT_ARRAY).add(new IntArrayTag(DynamicSerializableUuid.toIntArray(uuid)));
}
public void addAll(Iterable<UUID> uuids) {
uuids.forEach(this::addId);
}
public boolean hasId(UUID uuid) {
return this.getList("ids", NbtType.INT_ARRAY).contains(new IntArrayTag(DynamicSerializableUuid.toIntArray(uuid)));
}
public boolean remove(UUID uuid) {
return this.getList("ids", NbtType.INT_ARRAY).remove(new IntArrayTag(DynamicSerializableUuid.toIntArray(uuid)));
}
public boolean isEmpty() {
return this.getList("ids", NbtType.INT_ARRAY).isEmpty();
}
public List<UUID> getIds() {
return this.getList("ids", NbtType.INT_ARRAY)
.stream()
.map(IntArrayTag.class::cast)
.map(IntArrayTag::getIntArray)
.map(DynamicSerializableUuid::toUuid)
.collect(Collectors.toList());
}
public static RiftKeyIdsComponent get(ItemStack stack) {
return DimensionalDoorsComponents.RIFT_KEY_IDS_COMPONENT_KEY.get(stack);
}
}

View file

@ -26,7 +26,7 @@ import org.dimdev.dimdoors.world.pocket.PrivateRegistry;
import static org.dimdev.dimdoors.DimensionalDoorsInitializer.getServer;
public class DimensionalRegistry implements ComponentV3 {
public static final int RIFT_DATA_VERSION = 1; // Increment this number every time
public static final int RIFT_DATA_VERSION = 1; // Increment this number every time a new schema is added
private Map<RegistryKey<World>, PocketDirectory> pocketRegistry = new HashMap<>();
private RiftRegistry riftRegistry = new RiftRegistry();
private PrivateRegistry privateRegistry = new PrivateRegistry();

View file

@ -46,7 +46,6 @@
"cardinal-components": [
"dimdoors:dimensional_registry",
"dimdoors:counter",
"dimdoors:rift_key_ids",
"dimdoors:chunk_lazily_generated"
],
"waila:plugins": {