Skip to content

Commit

Permalink
Update Data Providers with Luck Permissions nodes and default permiss…
Browse files Browse the repository at this point in the history
…ions levels
  • Loading branch information
sakura-ryoko committed Jun 29, 2024
1 parent 5aa3159 commit 4af52fb
Show file tree
Hide file tree
Showing 11 changed files with 388 additions and 69 deletions.
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ dependencies {
//modCompile "net.fabricmc.fabric-api:fabric-api:" + project.fabric_version
include(modApi(fabricApi.module("fabric-api-base", project.fabric_api_version)))
include(modApi(fabricApi.module("fabric-networking-api-v1", project.fabric_api_version)))

// Lucko Permissions API
modImplementation include("me.lucko:fabric-permissions-api:${project.fabric_permissions_api_version}")
}

group = project.group + "." + project.mod_id
Expand Down
5 changes: 4 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ author = masa
mod_file_name = servux-fabric

# Current mod version
mod_version = 0.2.0-entity_data.5
mod_version = 0.2.0-entity_data.6

# The Minecraft version that gets set in the built file name
minecraft_version_out = 1.21
Expand All @@ -18,3 +18,6 @@ mappings_version = 1.21+build.2

fabric_loader_version = 0.15.11
fabric_api_version = 0.100.1+1.21

# Luck Permissions API
fabric_permissions_api_version = 0.3.1
2 changes: 2 additions & 0 deletions src/main/java/fi/dy/masa/servux/Servux.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.apache.logging.log4j.Logger;
import fi.dy.masa.servux.dataproviders.DataProviderManager;
import fi.dy.masa.servux.dataproviders.EntitiesDataProvider;
import fi.dy.masa.servux.dataproviders.LitematicsDataProvider;
import fi.dy.masa.servux.dataproviders.StructureDataProvider;
import fi.dy.masa.servux.event.PlayerHandler;
import fi.dy.masa.servux.event.PlayerListener;
Expand All @@ -19,6 +20,7 @@ public class Servux implements ModInitializer
public void onInitialize()
{
DataProviderManager.INSTANCE.registerDataProvider(StructureDataProvider.INSTANCE);
DataProviderManager.INSTANCE.registerDataProvider(LitematicsDataProvider.INSTANCE);
DataProviderManager.INSTANCE.registerDataProvider(EntitiesDataProvider.INSTANCE);

ServerListener serverListener = new ServerListener();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,20 @@ public abstract class DataProviderBase implements IDataProvider
{
protected final Identifier networkChannel;
protected final String name;
protected final String permNode;
protected final String description;
protected final int protocolVersion;
protected final int defaultPerm;
protected boolean enabled;
private int tickRate = 40;

protected DataProviderBase(String name, Identifier channel, int protocolVersion, String description)
protected DataProviderBase(String name, Identifier channel, int protocolVersion, int defaultPerm, String permNode, String description)
{
this.name = name;
this.networkChannel = channel;
this.protocolVersion = protocolVersion;
this.defaultPerm = defaultPerm > -1 && defaultPerm < 5 ? defaultPerm : 0;
this.permNode = permNode;
this.description = description;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,16 @@ public void readFromConfig()
{
obj = JsonUtils.getNestedObject(root, "DataProviderToggles", false);
}

for (IDataProvider provider : this.providersImmutable)
{
String name = provider.getName();

if (JsonUtils.hasObject(root, name))
{
provider.fromJson(JsonUtils.getNestedObject(root, name, false));
}
}
}

for (IDataProvider provider : this.providersImmutable)
Expand All @@ -147,6 +157,12 @@ public void writeToConfig()

root.add("DataProviderToggles", objToggles);

for (IDataProvider provider : this.providersImmutable)
{
String name = provider.getName();
root.add(name, provider.toJson());
}

JsonUtils.writeJsonToFile(root, this.getConfigFile());
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package fi.dy.masa.servux.dataproviders;

import fi.dy.masa.servux.schematic.placement.SchematicPlacement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import me.lucko.fabric.api.permissions.v0.Permissions;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.entity.Entity;
import net.minecraft.nbt.NbtCompound;
Expand All @@ -13,21 +15,22 @@
import fi.dy.masa.servux.network.ServerPlayHandler;
import fi.dy.masa.servux.network.packet.ServuxEntitiesHandler;
import fi.dy.masa.servux.network.packet.ServuxEntitiesPacket;
import fi.dy.masa.servux.network.packet.ServuxLitematicaHandler;
import fi.dy.masa.servux.network.packet.ServuxLitematicaPacket;
import fi.dy.masa.servux.schematic.placement.SchematicPlacement;
import fi.dy.masa.servux.util.JsonUtils;

public class EntitiesDataProvider extends DataProviderBase
{
public static final EntitiesDataProvider INSTANCE = new EntitiesDataProvider();
protected final static ServuxEntitiesHandler<ServuxEntitiesPacket.Payload> HANDLER = ServuxEntitiesHandler.getInstance();
protected final static ServuxLitematicaHandler<ServuxLitematicaPacket.Payload> LITEMATICA_HANDLER = ServuxLitematicaHandler.getInstance();
protected final NbtCompound metadata = new NbtCompound();
protected int permissionLevel = -1;

protected EntitiesDataProvider()
{
super("entity_data",
ServuxEntitiesHandler.CHANNEL_ID,
ServuxEntitiesPacket.PROTOCOL_VERSION,
0, "servux.provider.entity_data",
"Entity Data provider for Client Side mods.");

this.metadata.putString("name", this.getName());
Expand All @@ -42,20 +45,13 @@ public void registerHandler()
ServerPlayHandler.getInstance().registerServerPlayHandler(HANDLER);
HANDLER.registerPlayPayload(ServuxEntitiesPacket.Payload.ID, ServuxEntitiesPacket.Payload.CODEC, IPluginServerPlayHandler.BOTH_SERVER);
HANDLER.registerPlayReceiver(ServuxEntitiesPacket.Payload.ID, HANDLER::receivePlayPayload);

ServerPlayHandler.getInstance().registerServerPlayHandler(LITEMATICA_HANDLER);
LITEMATICA_HANDLER.registerPlayPayload(ServuxLitematicaPacket.Payload.ID, ServuxLitematicaPacket.Payload.CODEC, IPluginServerPlayHandler.BOTH_SERVER);
LITEMATICA_HANDLER.registerPlayReceiver(ServuxLitematicaPacket.Payload.ID, LITEMATICA_HANDLER::receivePlayPayload);
}

@Override
public void unregisterHandler()
{
HANDLER.unregisterPlayReceiver();
ServerPlayHandler.getInstance().unregisterServerPlayHandler(HANDLER);

LITEMATICA_HANDLER.unregisterPlayReceiver();
ServerPlayHandler.getInstance().unregisterServerPlayHandler(LITEMATICA_HANDLER);
}

@Override
Expand All @@ -64,38 +60,25 @@ public IPluginServerPlayHandler<?> getPacketHandler()
return HANDLER;
}

public IPluginServerPlayHandler<?> getPacketHandler_Litematica()
{
return LITEMATICA_HANDLER;
}

public void sendMetadata(ServerPlayerEntity player)
{
Servux.logger.warn("entityDataChannel: sendMetadata to player {}", player.getName().getLiteralString());

// Sends Metadata handshake, it doesn't succeed the first time, so using networkHandler
if (player.networkHandler != null)
if (this.hasPermission(player) == false)
{
HANDLER.sendPlayPayload(player.networkHandler, new ServuxEntitiesPacket.Payload(ServuxEntitiesPacket.MetadataResponse(this.metadata)));
// No Permission
Servux.logger.info("entity_data: Denying access for player {}, Insufficient Permissions", player.getName().getLiteralString());
return;
}
else
{
HANDLER.sendPlayPayload(player, new ServuxEntitiesPacket.Payload(ServuxEntitiesPacket.MetadataResponse(this.metadata)));
}
}

public void sendMetadata_Litematica(ServerPlayerEntity player)
{
Servux.logger.warn("sendMetadata_Litematica: sendMetadata to player {}", player.getName().getLiteralString());
Servux.logger.warn("entityDataChannel: sendMetadata to player {}", player.getName().getLiteralString());

// Sends Metadata handshake, it doesn't succeed the first time, so using networkHandler
if (player.networkHandler != null)
{
LITEMATICA_HANDLER.sendPlayPayload(player.networkHandler, new ServuxLitematicaPacket.Payload(ServuxLitematicaPacket.MetadataResponse(this.metadata)));
HANDLER.sendPlayPayload(player.networkHandler, new ServuxEntitiesPacket.Payload(ServuxEntitiesPacket.MetadataResponse(this.metadata)));
}
else
{
LITEMATICA_HANDLER.sendPlayPayload(player, new ServuxLitematicaPacket.Payload(ServuxLitematicaPacket.MetadataResponse(this.metadata)));
HANDLER.sendPlayPayload(player, new ServuxEntitiesPacket.Payload(ServuxEntitiesPacket.MetadataResponse(this.metadata)));
}
}

Expand All @@ -104,49 +87,41 @@ public void onPacketFailure(ServerPlayerEntity player)
// Do something when packets fail, if required
}

public void onPacketFailure_Litematica(ServerPlayerEntity player)
{
// Do something when packets fail, if required
}

public void onBlockEntityRequest(ServerPlayerEntity player, BlockPos pos)
{
if (this.hasPermission(player) == false)
{
return;
}

Servux.logger.warn("onBlockEntityRequest(): from player {}", player.getName().getLiteralString());

BlockEntity be = player.getEntityWorld().getBlockEntity(pos);
NbtCompound nbt = be != null ? be.createNbt(player.getRegistryManager()) : new NbtCompound();
HANDLER.encodeServerData(player, ServuxEntitiesPacket.SimpleBlockResponse(pos, nbt));
}

public void onBlockEntityRequest_Litematica(ServerPlayerEntity player, BlockPos pos)
{
Servux.logger.warn("onBlockEntityRequest_Litematica(): from player {}", player.getName().getLiteralString());

BlockEntity be = player.getEntityWorld().getBlockEntity(pos);
NbtCompound nbt = be != null ? be.createNbt(player.getRegistryManager()) : new NbtCompound();
LITEMATICA_HANDLER.encodeServerData(player, ServuxLitematicaPacket.SimpleBlockResponse(pos, nbt));
}

public void onEntityRequest(ServerPlayerEntity player, int entityId)
{
if (this.hasPermission(player) == false)
{
return;
}

Servux.logger.warn("onEntityRequest(): from player {}", player.getName().getLiteralString());

Entity entity = player.getWorld().getEntityById(entityId);
NbtCompound nbt = entity != null ? entity.writeNbt(new NbtCompound()) : new NbtCompound();
HANDLER.encodeServerData(player, ServuxEntitiesPacket.SimpleEntityResponse(entityId, nbt));
}

public void onEntityRequest_Litematica(ServerPlayerEntity player, int entityId)
{
Servux.logger.warn("onEntityRequest_Litematica(): from player {}", player.getName().getLiteralString());

Entity entity = player.getWorld().getEntityById(entityId);
NbtCompound nbt = entity != null ? entity.writeNbt(new NbtCompound()) : new NbtCompound();
LITEMATICA_HANDLER.encodeServerData(player, ServuxLitematicaPacket.SimpleEntityResponse(entityId, nbt));
}

public void handleClientNbtRequest(ServerPlayerEntity player, int transactionId, NbtCompound tags)
{
if (this.hasPermission(player) == false)
{
return;
}

Servux.logger.warn("handleBulkEntityData(): from player {}", player.getName().getLiteralString());
if (tags.getString("Task").equals("LitematicaPaste"))
{
Expand All @@ -157,4 +132,44 @@ public void handleClientNbtRequest(ServerPlayerEntity player, int transactionId,
player.sendMessage(Text.literal("Pasted ").append(placement.getName()).append(" to world ").append(player.getServerWorld().getRegistryKey().getValue().toString()).append(" in ").append(String.valueOf(timeElapsed)).append("ms."), false);
}
}

protected void setPermissionLevel(int level)
{
if (!(level < 0 || level > 4))
{
this.permissionLevel = level;
}
}

@Override
public boolean hasPermission(ServerPlayerEntity player)
{
return Permissions.check(player, this.permNode, this.permissionLevel > -1 ? this.permissionLevel : this.defaultPerm);
}

@Override
public JsonObject toJson()
{
JsonObject obj = new JsonObject();

if (this.permissionLevel > -1)
{
obj.add("permission_level", new JsonPrimitive(this.permissionLevel));
}
else
{
obj.add("permission_level", new JsonPrimitive(this.defaultPerm));
}

return obj;
}

@Override
public void fromJson(JsonObject obj)
{
if (JsonUtils.hasInteger(obj, "permission_level"))
{
this.setPermissionLevel(JsonUtils.getInteger(obj, "permission_level"));
}
}
}
17 changes: 17 additions & 0 deletions src/main/java/fi/dy/masa/servux/dataproviders/IDataProvider.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package fi.dy.masa.servux.dataproviders;

import com.google.gson.JsonObject;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.Identifier;
import fi.dy.masa.servux.network.IPluginServerPlayHandler;

Expand Down Expand Up @@ -91,4 +93,19 @@ default void tick(MinecraftServer server, int tickCounter)
* @return
*/
IPluginServerPlayHandler<?> getPacketHandler();

/**
* Determine if Player has permissions to this Data Provider
* @param player (Player to test permissions for)
* @return (true|false)
*/
boolean hasPermission(ServerPlayerEntity player);

/**
* Config file handling
* @return
*/
JsonObject toJson();

void fromJson(JsonObject obj);
}
Loading

0 comments on commit 4af52fb

Please sign in to comment.