Skip to content

Commit

Permalink
separate internal data values
Browse files Browse the repository at this point in the history
  • Loading branch information
deirn committed Jan 5, 2024
1 parent 888d874 commit c23e823
Show file tree
Hide file tree
Showing 20 changed files with 564 additions and 502 deletions.
14 changes: 13 additions & 1 deletion src/api/java/mcp/mobius/waila/api/IRegistrar.java
Original file line number Diff line number Diff line change
Expand Up @@ -545,14 +545,26 @@ default <T, E extends Entity> void addEntityData(IDataProvider<E> provider, Clas
addEntityData(provider, clazz, DEFAULT_PRIORITY);
}

/**
* Registers a data type used for syncing data from server to client.
*
* @param id the id of the data type
* @param apiType the public type of data, to be used when {@linkplain IDataReader#get(Class) getting} it
* @param implType the actual type of data that get sent
* @param serializer the data to buffer serializer
*/
<A extends IData, I extends A> void addDataType(ResourceLocation id, Class<A> apiType, Class<I> implType, IData.Serializer<I> serializer);

/**
* Registers a data type used for syncing data from server to client.
*
* @param id the id of the data type
* @param type the type of data
* @param serializer the data to buffer serializer
*/
<T extends IData> void addDataType(ResourceLocation id, Class<T> type, IData.Serializer<T> serializer);
default <T extends IData> void addDataType(ResourceLocation id, Class<T> type, IData.Serializer<T> serializer) {
addDataType(id, type, type, serializer);
}

/**
* Registers an {@link IThemeType} instance.
Expand Down
11 changes: 11 additions & 0 deletions src/api/java/mcp/mobius/waila/api/__internal__/IExtraService.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package mcp.mobius.waila.api.__internal__;

import mcp.mobius.waila.api.IPluginConfig;
import mcp.mobius.waila.api.data.EnergyData;
import mcp.mobius.waila.api.data.FluidData;
import mcp.mobius.waila.api.data.ItemData;
import mcp.mobius.waila.api.data.ProgressData;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.material.Fluid;
import org.jetbrains.annotations.ApiStatus;
Expand All @@ -22,4 +25,12 @@ public interface IExtraService {

void setCauldronDescFor(Class<? extends Block> clazz, FluidData.CauldronDescriptor getter);

EnergyData createEnergyData(double stored, double capacity);

FluidData createFluidData(FluidData.Unit unit, int slotCountHint);

ItemData createItemData(IPluginConfig config);

ProgressData createProgressData(float ratio);

}
44 changes: 3 additions & 41 deletions src/api/java/mcp/mobius/waila/api/data/EnergyData.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import mcp.mobius.waila.api.__internal__.IApiService;
import mcp.mobius.waila.api.__internal__.IExtraService;
import mcp.mobius.waila.buildconst.Tl;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
Expand All @@ -16,7 +15,8 @@
/**
* Adds an energy information to an object.
*/
public final class EnergyData implements IData {
@ApiStatus.NonExtendable
public abstract class EnergyData implements IData {

public static final ResourceLocation ID = BuiltinDataUtil.rl("energy");

Expand Down Expand Up @@ -77,7 +77,7 @@ public static EnergyData of(double stored, double capacity) {
stored = Mth.clamp(stored, 0.0, capacity);
if (capacity == 0) capacity = Double.POSITIVE_INFINITY;

return new EnergyData(stored, capacity);
return IExtraService.INSTANCE.createEnergyData(stored, capacity);
}

@ApiStatus.NonExtendable
Expand Down Expand Up @@ -106,42 +106,4 @@ public interface Description {

}

// -----------------------------------------------------------------------------------------------------------------------------------------------

private final double stored;
private final double capacity;

@ApiStatus.Internal
private EnergyData(double stored, double capacity) {
this.stored = stored;
this.capacity = capacity;
}

/** @hidden */
@ApiStatus.Internal
public EnergyData(FriendlyByteBuf buf) {
this.stored = buf.readDouble();
this.capacity = buf.readDouble();
}

/** @hidden */
@Override
@ApiStatus.Internal
public void write(FriendlyByteBuf buf) {
buf.writeDouble(stored);
buf.writeDouble(capacity);
}

/** @hidden */
@ApiStatus.Internal
public double stored() {
return stored;
}

/** @hidden */
@ApiStatus.Internal
public double capacity() {
return capacity;
}

}
117 changes: 6 additions & 111 deletions src/api/java/mcp/mobius/waila/api/data/FluidData.java
Original file line number Diff line number Diff line change
@@ -1,31 +1,26 @@
package mcp.mobius.waila.api.data;

import java.util.ArrayList;
import java.util.List;

import com.google.common.base.Preconditions;
import mcp.mobius.waila.api.IData;
import mcp.mobius.waila.api.__internal__.ApiSide;
import mcp.mobius.waila.api.__internal__.IExtraService;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.FlowingFluid;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.material.Fluids;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;

/**
* Adds fluid information to an object.
*/
public final class FluidData implements IData {
@ApiStatus.NonExtendable
public abstract class FluidData implements IData {

public static final ResourceLocation ID = BuiltinDataUtil.rl("fluid");
public static final ResourceLocation CONFIG_DISPLAY_UNIT = BuiltinDataUtil.rl("fluid.display_unit");
Expand Down Expand Up @@ -106,7 +101,7 @@ public static void describeCauldron(Class<? extends Block> clazz, CauldronDescri
* @param unit the fluid unit of measurement
*/
public static FluidData of(Unit unit) {
return new FluidData(new ArrayList<>(), unit);
return IExtraService.INSTANCE.createFluidData(unit, -1);
}

/**
Expand All @@ -117,7 +112,7 @@ public static FluidData of(Unit unit) {
* than necessary, the user can call {@link #add} more than the specified count
*/
public static FluidData of(Unit unit, int slotCountHint) {
return new FluidData(new ArrayList<>(slotCountHint), unit);
return IExtraService.INSTANCE.createFluidData(unit, slotCountHint);
}

/**
Expand All @@ -134,7 +129,7 @@ public FluidData add(Fluid fluid, @Nullable CompoundTag nbt, double stored, doub
if (capacity == 0) capacity = Double.POSITIVE_INFINITY;

var source = fluid instanceof FlowingFluid flowing ? flowing.getSource() : fluid;
entries.add(new Entry<>(source, nbt, stored, capacity));
implAdd(source, nbt, stored, capacity);
return this;
}

Expand Down Expand Up @@ -225,107 +220,7 @@ public interface CauldronDescriptor {

// -----------------------------------------------------------------------------------------------------------------------------------------------

private final List<Entry<?>> entries;
private final Unit unit;

@ApiStatus.Internal
private FluidData(List<Entry<?>> entries, Unit unit) {
this.entries = entries;
this.unit = unit;
}

/** @hidden */
@ApiStatus.Internal
public FluidData(FriendlyByteBuf buf) {
unit = buf.readEnum(Unit.class);

var size = buf.readVarInt();
entries = new ArrayList<>(size);

for (var i = 0; i < size; i++) {
if (buf.readBoolean()) continue;

var id = buf.readVarInt();
var fluid = BuiltInRegistries.FLUID.byId(id);
var nbt = buf.readNbt();
var stored = buf.readDouble();
var capacity = buf.readDouble();
add(fluid, nbt, stored, capacity);
}
}

/** @hidden */
@Override
@ApiStatus.Internal
public void write(FriendlyByteBuf buf) {
buf.writeEnum(unit);
buf.writeVarInt(entries.size());

for (var entry : entries) {
if (entry.isEmpty()) {
buf.writeBoolean(true);
} else {
buf.writeBoolean(false);
buf.writeId(BuiltInRegistries.FLUID, entry.fluid);
buf.writeNbt(entry.nbt);
buf.writeDouble(entry.stored);
buf.writeDouble(entry.capacity);
}
}
}

/** @hidden */
@ApiStatus.Internal
public Unit unit() {
return unit;
}

/** @hidden */
@ApiStatus.Internal
public List<Entry<?>> entries() {
return entries;
}

/** @hidden */
@ApiStatus.Internal
public static class Entry<T extends Fluid> implements FluidDescriptionContext<T> {

private final T fluid;
private final @Nullable CompoundTag nbt;
private final double stored;
private final double capacity;

private Entry(T fluid, @Nullable CompoundTag nbt, double stored, double capacity) {
this.fluid = fluid;
this.nbt = nbt;
this.stored = stored;
this.capacity = capacity;
}

public boolean isEmpty() {
return fluid == Fluids.EMPTY || stored <= 0;
}

@Override
public T fluid() {
return fluid;
}

@Override
@Nullable
public CompoundTag nbt() {
return nbt;
}

public double stored() {
return stored;
}

public double capacity() {
return capacity;
}

}
protected abstract void implAdd(Fluid fluid, @Nullable CompoundTag nbt, double stored, double capacity);

// -----------------------------------------------------------------------------------------------------------------------------------------------
// TODO: Remove
Expand Down
69 changes: 5 additions & 64 deletions src/api/java/mcp/mobius/waila/api/data/ItemData.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@

import mcp.mobius.waila.api.IData;
import mcp.mobius.waila.api.IPluginConfig;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.network.FriendlyByteBuf;
import mcp.mobius.waila.api.__internal__.IExtraService;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.Container;
import net.minecraft.world.item.ItemStack;
Expand All @@ -17,7 +16,8 @@
/**
* Adds item information to an object.
*/
public final class ItemData implements IData {
@ApiStatus.NonExtendable
public abstract class ItemData implements IData {

public static final ResourceLocation ID = BuiltinDataUtil.rl("item");
public static final ResourceLocation CONFIG_SYNC_NBT = BuiltinDataUtil.rl("item.nbt");
Expand All @@ -28,7 +28,7 @@ public final class ItemData implements IData {
* Creates an item data based from plugin config.
*/
public static ItemData of(IPluginConfig config) {
return new ItemData(config);
return IExtraService.INSTANCE.createItemData(config);
}

/**
Expand Down Expand Up @@ -85,65 +85,6 @@ public ItemData ensureSpace(int length) {

// -----------------------------------------------------------------------------------------------------------------------------------------------

private final IPluginConfig config;
private final ArrayList<ItemStack> items = new ArrayList<>();
private boolean syncNbt;

@ApiStatus.Internal
private ItemData(IPluginConfig config) {
this.config = config;
}

/** @hidden */
@ApiStatus.Internal
public ItemData(FriendlyByteBuf buf) {
this.config = null;

syncNbt = buf.readBoolean();
var size = buf.readVarInt();
ensureSpace(size);

for (var i = 0; i < size; i++) {
if (buf.readBoolean()) continue;

var item = buf.readById(BuiltInRegistries.ITEM);
var count = buf.readVarInt();
var stack = new ItemStack(item, count);
if (syncNbt) stack.setTag(buf.readNbt());
add(stack);
}
}

/** @hidden */
@Override
@ApiStatus.Internal
public void write(FriendlyByteBuf buf) {
var syncNbt = config.getBoolean(CONFIG_SYNC_NBT);
buf.writeBoolean(syncNbt);
buf.writeVarInt(items.size());

for (var stack : items) {
if (stack.isEmpty()) {
buf.writeBoolean(true);
} else {
buf.writeBoolean(false);
buf.writeId(BuiltInRegistries.ITEM, stack.getItem());
buf.writeVarInt(stack.getCount());
if (syncNbt) buf.writeNbt(stack.getTag());
}
}
}

/** @hidden */
@ApiStatus.Internal
public ArrayList<ItemStack> items() {
return items;
}

/** @hidden */
@ApiStatus.Internal
public boolean syncNbt() {
return syncNbt;
}
protected final ArrayList<ItemStack> items = new ArrayList<>();

}
Loading

0 comments on commit c23e823

Please sign in to comment.