diff --git a/src/main/java/com/cleanroommc/modularui/api/value/IShortValue.java b/src/main/java/com/cleanroommc/modularui/api/value/IShortValue.java new file mode 100644 index 000000000..d6abb1e56 --- /dev/null +++ b/src/main/java/com/cleanroommc/modularui/api/value/IShortValue.java @@ -0,0 +1,8 @@ +package com.cleanroommc.modularui.api.value; + +public interface IShortValue extends IValue { + + short getShortValue(); + + void setShortValue(short val); +} diff --git a/src/main/java/com/cleanroommc/modularui/api/value/sync/IShortSyncValue.java b/src/main/java/com/cleanroommc/modularui/api/value/sync/IShortSyncValue.java new file mode 100644 index 000000000..5f5d7782c --- /dev/null +++ b/src/main/java/com/cleanroommc/modularui/api/value/sync/IShortSyncValue.java @@ -0,0 +1,22 @@ +package com.cleanroommc.modularui.api.value.sync; + +import com.cleanroommc.modularui.api.value.IShortValue; + +/** + * A helper interface for sync values which can be turned into a short. + * + * @param value type + */ +public interface IShortSyncValue extends IValueSyncHandler, IShortValue { + + @Override + default void setShortValue(short val) { + setShortValue(val, true, true); + } + + default void setShortValue(short val, boolean setSource) { + setShortValue(val, setSource, true); + } + + void setShortValue(short value, boolean setSource, boolean sync); +} diff --git a/src/main/java/com/cleanroommc/modularui/value/ShortValue.java b/src/main/java/com/cleanroommc/modularui/value/ShortValue.java new file mode 100644 index 000000000..4080a1d50 --- /dev/null +++ b/src/main/java/com/cleanroommc/modularui/value/ShortValue.java @@ -0,0 +1,79 @@ +package com.cleanroommc.modularui.value; + +import com.cleanroommc.modularui.api.value.IIntValue; +import com.cleanroommc.modularui.api.value.IShortValue; + +public class ShortValue implements IShortValue, IIntValue { + + public static Dynamic wrap(IShortValue val) { + return new Dynamic(val::getShortValue, val::setShortValue); + } + + protected short value; + + @Override + public void setShortValue(short b) { + value = b; + } + + @Override + public short getShortValue() { + return value; + } + + @Override + public Short getValue() { + return getShortValue(); + } + + @Override + public void setValue(Short value) { + setShortValue(value); + } + + @Override + public Class getValueType() { + return Short.class; + } + + @Override + public int getIntValue() { + return value; + } + + @Override + public void setIntValue(int val) { + setShortValue((short) val); + } + + public static class Dynamic extends ShortValue { + + private final Supplier getter; + private final Consumer setter; + + public Dynamic(Supplier getter, Consumer setter) { + this.getter = getter; + this.setter = setter; + } + + @Override + public void setShortValue(short b) { + this.setter.setShort(b); + } + + @Override + public short getShortValue() { + return this.getter.getShort(); + } + } + + public interface Supplier { + + short getShort(); + } + + public interface Consumer { + + void setShort(short b); + } +} diff --git a/src/main/java/com/cleanroommc/modularui/value/sync/ShortSyncValue.java b/src/main/java/com/cleanroommc/modularui/value/sync/ShortSyncValue.java new file mode 100644 index 000000000..f67f857a1 --- /dev/null +++ b/src/main/java/com/cleanroommc/modularui/value/sync/ShortSyncValue.java @@ -0,0 +1,129 @@ +package com.cleanroommc.modularui.value.sync; + +import com.cleanroommc.modularui.api.value.sync.IIntSyncValue; +import com.cleanroommc.modularui.api.value.sync.IShortSyncValue; +import com.cleanroommc.modularui.api.value.sync.IStringSyncValue; +import com.cleanroommc.modularui.network.NetworkUtils; + +import com.cleanroommc.modularui.value.ShortValue; + +import net.minecraft.network.PacketBuffer; + +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +public class ShortSyncValue extends ValueSyncHandler implements IShortSyncValue, IIntSyncValue, IStringSyncValue { + + private short cache; + private final ShortValue.Supplier getter; + private final ShortValue.Consumer setter; + + public ShortSyncValue(@NotNull ShortValue.Supplier getter, @Nullable ShortValue.Consumer setter) { + this.getter = Objects.requireNonNull(getter); + this.setter = setter; + this.cache = getter.getShort(); + } + + public ShortSyncValue(@NotNull ShortValue.Supplier getter) { + this(getter, (ShortValue.Consumer) null); + } + + @Contract("null, null -> fail") + public ShortSyncValue(@Nullable ShortValue.Supplier clientGetter, + @Nullable ShortValue.Supplier serverGetter) { + this(clientGetter, null, serverGetter, null); + } + + @Contract("null, _, null, _ -> fail") + public ShortSyncValue(@Nullable ShortValue.Supplier clientGetter, @Nullable ShortValue.Consumer clientSetter, + @Nullable ShortValue.Supplier serverGetter, @Nullable ShortValue.Consumer serverSetter) { + if (clientGetter == null && serverGetter == null) { + throw new NullPointerException("Client or server getter must not be null!"); + } + if (NetworkUtils.isClient()) { + this.getter = clientGetter != null ? clientGetter : serverGetter; + this.setter = clientSetter != null ? clientSetter : serverSetter; + } else { + this.getter = serverGetter != null ? serverGetter : clientGetter; + this.setter = serverSetter != null ? serverSetter : clientSetter; + } + this.cache = this.getter.getShort(); + } + + @Override + public Short getValue() { + return this.cache; + } + + @Override + public short getShortValue() { + return this.cache; + } + + @Override + public void setValue(Short value, boolean setSource, boolean sync) { + setShortValue(value, setSource, sync); + } + + @Override + public void setShortValue(short value, boolean setSource, boolean sync) { + this.cache = value; + if (setSource && this.setter != null) { + this.setter.setShort(value); + } + onValueChanged(); + if (sync) sync(); + } + + @Override + public boolean updateCacheFromSource(boolean isFirstSync) { + if (isFirstSync || this.getter.getShort() != this.cache) { + setShortValue(this.getter.getShort(), false, false); + return true; + } + return false; + } + + @Override + public void notifyUpdate() { + setShortValue(this.getter.getShort(), false, true); + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeShort(this.cache); + } + + @Override + public void read(PacketBuffer buffer) { + setShortValue(buffer.readShort(), true, false); + } + + @Override + public void setStringValue(String value, boolean setSource, boolean sync) { + setShortValue(Short.parseShort(value), setSource, sync); + } + + @Override + public String getStringValue() { + return String.valueOf(this.cache); + } + + @Override + public Class getValueType() { + return Short.class; + } + + @Override + public void setIntValue(int value, boolean setSource, boolean sync) { + setShortValue((short) value, setSource, sync); + } + + @Override + public int getIntValue() { + return this.cache; + } +}