Syncing Server Data
Danger
This section uses Mojang Mappings.
By default, I*ComponentProvider can only access client data. To access server data, you need to
sync the data from the server. To do that, WTHIT provides an IDataProvider interface.
IDataProvider provides a way to sync server data via either an NBT object for simple data, or
specific IData object.
Simple NBT Data
Using NBT data is pretty straightforward, in your IDataProvider implementation call
IDataWriter#raw and modify the returned NBT object.
public class SimpleDataProvider implements IDataProvider<MyBlockEntity> {
@Override
public void appendData(IDataWriter data, IServerAccessor<MyBlockEntity> accessor, IPluginConfig config) {
data.raw().putInt("someInt", accessor.getTarget().getSomeInt());
}
}
Then in your I*ComponentProvider implementation, call IDataReader#raw to get the synced data
public class SimpleComponentProvider implements IBlockComponentProvider {
@Override
public void appendBody(ITooltip tooltip, IBlockAccessor accessor, IPluginConfig config) {
CompoundTag data = accessor.getData().raw();
if (data.contains("someInt")) {
int someInt = data.getInt("someInt");
}
}
}
Data Key
Use a uniqe key to identify your data as it may conflict with data from other mod's provider.
Complex Data Type
IData interface allows synced data to have type safety when modifying/accessing it. It also
allows implementations to decide how the data is structured directly in the packet byte buffer.
Built-in Data Types
WTHIT contains built-in data types that can be used to attach informations in a standarized way.
The built-in data types that WTHIT provides are EnergyData, FluidData, ItemData, and
ProgressData.
EnergyData
EnergyData provides information regarding target object's energy storage. By default, it supports
the modding platform standard APIs:
- Forge
IEnergyStorageCapability - Team Reborn Energy
EnergyData#describe can be used to customize how the energy data is shown in the client.
FluidData
FluidData provides information regarding target object's fluid storage. By default, it supports
the modding platform standard APIs:
- Forge
IFluidHandlerCapability - Fabric Transfer API
FluidData#describeFluid can be used to customize how the fluid is shown in the client, but if you
already used the standard API it should already work out of the box.
FluidData#describeCauldron can be used if you have a custom blockstate-based cauldron for your
fluids. Not needed on Fabric as Fabric API's CauldronFluidContent already provides this
functionality.
ItemData
ItemData provides information regarding target object's item storage. By default, it supports the
modding platform standard APIs:
- Forge
IItemHandlerCapability - Fabric Transfer API
- Vanilla
Container
ProgressData
ProgressData provides information regarding target object's crafting progress status. This is the
only data type that needs explicit implementation for the target object.
Disabling built-in data for your object
You can use the block methods from the section below to block the data, or you can use datapack tags to do so:
| Data Type | Tag ID |
|---|---|
EnergyData |
waila:extra/energy_blacklist |
FluidData |
waila:extra/fluid_blacklist |
ItemData |
waila:extra/item_blacklist |
ProgressData |
waila:extra/progress_blacklist |
The tags is available for blocks, block entity types, and entity types.
Attaching Complex Data
First check if your objects already show some data and if the data are correct. To attach the data
call IDataWriter#add with the type that you want to attach.
public class ComplexDataProvider implements IDataProvider<MyBlockEntity> {
@Override
public void appendData(IDataWriter data, IServerAccessor<MyBlockEntity> accessor, IPluginConfig config) {
data.add(EnergyData.class, res -> {
MyBlockEntity be = accessor.getTarget();
res.add(EnergyData.of(be.getStoredEnergy(), be.getEnergyCapacity()));
});
}
}
IDataWriter.Result#block can be used to block the data from being synced to the client.
WTHIT also provides the IDataWriter#blockAll method and BlockingDataProvider class that can be
used to block all data unconditionally.
Creating Custom Data Type
First, create an object that implements the IData interface. You also need to create a
constructor that accepts a buffer for the client side.
public class StringData implements IData {
private final String value;
public StringData(String value) {
this.value = value;
}
public StringData(FriendlyByteBuf buf) {
this(buf.readUtf());
}
@Override
public void write(FriendlyByteBuf buf) {
buf.writeUtf(value);
}
}
Then, register the data type in your main plugin class.
public class MyWailaPlugin implements IWailaPlugin {
@Override
public void register(IRegistrar registrar) {
registrar.addDataType(new ResourceLocation("mymod:str"),
StringData.class, StringData::new);
}
}
Getting Complex Data on Client
Warning
Note that built-in data types are not designed to be retreived by other mods on the client, they simply for attaching data on the server.
Getting complex data is actually simpler as you don't have to deal with string key.
To get the data on the client, simply call IDataReader#get with the type of data that you want.
public class SimpleComponentProvider implements IBlockComponentProvider {
@Override
public void appendBody(ITooltip tooltip, IBlockAccessor accessor, IPluginConfig config) {
StringData data = accessor.getData().get(StringData.class);
if (data != null) {
// do something with data
}
}
}