From 2280d6b95e784a4c02c31dc07e1f2fec89abded4 Mon Sep 17 00:00:00 2001 From: LeeGod Date: Fri, 10 Dec 2021 01:40:27 +0700 Subject: [PATCH] Initialize Implementation for EntityData (mc-platform alternative DataWatcher) --- .../io/fairyproject/mc/entity/EntityData.java | 41 +++++++++ .../mc/entity/EntityDataImpl.java | 86 +++++++++++++++++++ .../mc/entity/EntityDataSerializer.java | 27 ++++++ .../java/io/fairytest/mc/EntityDataTest.java | 48 +++++++++++ 4 files changed, 202 insertions(+) create mode 100644 io.fairyproject.platforms/mc-platform/src/main/java/io/fairyproject/mc/entity/EntityData.java create mode 100644 io.fairyproject.platforms/mc-platform/src/main/java/io/fairyproject/mc/entity/EntityDataImpl.java create mode 100644 io.fairyproject.platforms/mc-platform/src/main/java/io/fairyproject/mc/entity/EntityDataSerializer.java create mode 100644 io.fairyproject.platforms/mc-platform/src/test/java/io/fairytest/mc/EntityDataTest.java diff --git a/io.fairyproject.platforms/mc-platform/src/main/java/io/fairyproject/mc/entity/EntityData.java b/io.fairyproject.platforms/mc-platform/src/main/java/io/fairyproject/mc/entity/EntityData.java new file mode 100644 index 00000000..6f6013be --- /dev/null +++ b/io.fairyproject.platforms/mc-platform/src/main/java/io/fairyproject/mc/entity/EntityData.java @@ -0,0 +1,41 @@ +package io.fairyproject.mc.entity; + +import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; + +public interface EntityData { + + static EntityData createImpl() { + return new EntityDataImpl(); + } + + boolean add(Item item); + + Item get(int index); + + Item remove(int index); + + boolean isEmpty(); + + Set> all(); + + void clear(); + + Item define(int index, EntityDataSerializer dataSerializer); + + interface Item { + + int index(); + + EntityDataSerializer serializer(); + + @Nullable + T getObject(); + + void setObject(@Nullable T t); + + } + +} diff --git a/io.fairyproject.platforms/mc-platform/src/main/java/io/fairyproject/mc/entity/EntityDataImpl.java b/io.fairyproject.platforms/mc-platform/src/main/java/io/fairyproject/mc/entity/EntityDataImpl.java new file mode 100644 index 00000000..e471e87a --- /dev/null +++ b/io.fairyproject.platforms/mc-platform/src/main/java/io/fairyproject/mc/entity/EntityDataImpl.java @@ -0,0 +1,86 @@ +package io.fairyproject.mc.entity; + +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; +import java.util.stream.Collectors; + +public class EntityDataImpl implements EntityData { + + private final Int2ObjectOpenHashMap> items; + + public EntityDataImpl() { + this.items = new Int2ObjectOpenHashMap<>(); + } + + @Override + public boolean add(Item item) { + return this.items.put(item.index(), item) != item; + } + + @Override + public Item get(int index) { + return this.items.get(index); + } + + @Override + public Item remove(int index) { + return this.items.remove(index); + } + + @Override + public boolean isEmpty() { + return this.items.isEmpty(); + } + + @Override + public Set> all() { + return this.items.int2ObjectEntrySet() + .stream() + .map(entry -> Pair.of(entry.getIntKey(), (Item)entry.getValue())) + .collect(Collectors.toSet()); + } + + @Override + public void clear() { + this.items.clear(); + } + + @Override + public Item define(int index, EntityDataSerializer dataSerializer) { + return new ItemImpl<>(index, dataSerializer); + } + + @RequiredArgsConstructor + public static class ItemImpl implements EntityData.Item { + + private final int index; + private final EntityDataSerializer serializer; + @Nullable + private T object; + + @Override + public int index() { + return this.index; + } + + @Override + public EntityDataSerializer serializer() { + return this.serializer; + } + + @Override + @Nullable + public T getObject() { + return this.object; + } + + @Override + public void setObject(@Nullable T t) { + this.object = t; + } + } +} diff --git a/io.fairyproject.platforms/mc-platform/src/main/java/io/fairyproject/mc/entity/EntityDataSerializer.java b/io.fairyproject.platforms/mc-platform/src/main/java/io/fairyproject/mc/entity/EntityDataSerializer.java new file mode 100644 index 00000000..f93fdbae --- /dev/null +++ b/io.fairyproject.platforms/mc-platform/src/main/java/io/fairyproject/mc/entity/EntityDataSerializer.java @@ -0,0 +1,27 @@ +package io.fairyproject.mc.entity; + +import io.fairyproject.mc.protocol.netty.FriendlyByteBuf; + +public abstract class EntityDataSerializer { + + public static EntityDataSerializer DOUBLE = new EntityDataSerializer() { + @Override + public Double read(FriendlyByteBuf byteBuf) { + return byteBuf.readDouble(); + } + + @Override + public void write(FriendlyByteBuf byteBuf, Double obj) { + byteBuf.writeDouble(obj); + } + }; + + public T read(FriendlyByteBuf byteBuf) { + throw new UnsupportedOperationException(); + } + + public void write(FriendlyByteBuf byteBuf, T obj) { + throw new UnsupportedOperationException(); + } + +} diff --git a/io.fairyproject.platforms/mc-platform/src/test/java/io/fairytest/mc/EntityDataTest.java b/io.fairyproject.platforms/mc-platform/src/test/java/io/fairytest/mc/EntityDataTest.java new file mode 100644 index 00000000..cb2adf7f --- /dev/null +++ b/io.fairyproject.platforms/mc-platform/src/test/java/io/fairytest/mc/EntityDataTest.java @@ -0,0 +1,48 @@ +package io.fairytest.mc; + +import io.fairyproject.mc.entity.EntityData; +import io.fairyproject.mc.entity.EntityDataSerializer; +import org.apache.commons.lang3.tuple.Pair; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Collections; +import java.util.Set; + +public class EntityDataTest { + + @Test + public void basicOperation() { + EntityData entityData = EntityData.createImpl(); + EntityData.Item item = entityData.define(2, EntityDataSerializer.DOUBLE); + item.setObject(20.0D); + + // test empty + Assert.assertTrue(entityData.isEmpty()); + + // test adding + Assert.assertTrue(entityData.add(item)); + Assert.assertEquals(item, entityData.get(2)); + + // test non-empty + Assert.assertFalse(entityData.isEmpty()); + + // test not exists index + Assert.assertNull(entityData.get(1)); + + // test all + Set> all = entityData.all(); + Set> expected = Collections.singleton(Pair.of(2, item)); + Assert.assertEquals(expected, all); + + // test removing + Assert.assertEquals(item, entityData.remove(2)); + Assert.assertNull(entityData.get(2)); + + // test clear + entityData.add(item); + entityData.clear(); + Assert.assertTrue(entityData.isEmpty()); + } + +}