From 9e048684c8f3f7c3307fe4a37d27302001e5b407 Mon Sep 17 00:00:00 2001 From: pietru Date: Mon, 28 Oct 2024 23:40:58 +0100 Subject: [PATCH] fixes and areaPermSetup --- .../net/pietru/cookie_utils/api/Area.java | 29 ++++ .../net/pietru/cookie_utils/api/Region.java | 28 ++++ .../pietru/cookie_utils/api/TextCommands.java | 5 +- .../mixins/MessagePacketMixin.java | 9 +- .../permissions/ObjectPermList.java | 5 + .../permissions/PlayerAreaPerm.java | 12 ++ .../net/pietru/cookie_utils/setups/Setup.java | 8 + .../cookie_utils/setups/areaPermSetup.java | 146 ++++++++++++++++++ .../cookie_utils/setups/regionSetup.java | 5 +- .../cookie_utils/setups/setupCreator.java | 1 + 10 files changed, 242 insertions(+), 6 deletions(-) create mode 100644 src/main/java/net/pietru/cookie_utils/setups/areaPermSetup.java diff --git a/src/main/java/net/pietru/cookie_utils/api/Area.java b/src/main/java/net/pietru/cookie_utils/api/Area.java index 3ed8fe9..ed75e1f 100644 --- a/src/main/java/net/pietru/cookie_utils/api/Area.java +++ b/src/main/java/net/pietru/cookie_utils/api/Area.java @@ -3,6 +3,7 @@ package net.pietru.cookie_utils.api; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.math.collision.BoundingBox; import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.JsonValue; import net.pietru.cookie_utils.permissions.ObjectPermList; import net.pietru.cookie_utils.permissions.PlayerAreaPerm; @@ -46,8 +47,36 @@ public class Area { return perms.get_bool_perm(action,false); } + public boolean is_user_type(String player_id,String type){ + if (!player_id.contains("offline")) + for (int i = 0; i < player_perms.size; i++) { + PlayerAreaPerm p = player_perms.get(i); + if (p.enabled && !p.player_id.isEmpty() && p.player_id.equals(player_id)){ + return player_perms.get(i).type.equals(type); + } + } + return false; + } + public boolean get_action_bool(String action){ return perms.get_bool_perm(action,false); } + public JsonValue get_json(){ + JsonValue val = new JsonValue(JsonValue.ValueType.object); + + val.addChild("x1", new JsonValue(space.min.x)); + val.addChild("y1", new JsonValue(space.min.y)); + val.addChild("z1", new JsonValue(space.min.z)); + + val.addChild("x2", new JsonValue(space.max.x)); + val.addChild("y2", new JsonValue(space.max.y)); + val.addChild("z2", new JsonValue(space.max.z)); + + val.addChild("enabled", new JsonValue(enabled)); + perms.get_json(val); + val.addChild("piority", new JsonValue(piority)); + return val; + } + } diff --git a/src/main/java/net/pietru/cookie_utils/api/Region.java b/src/main/java/net/pietru/cookie_utils/api/Region.java index 4af95d7..9c28eb6 100644 --- a/src/main/java/net/pietru/cookie_utils/api/Region.java +++ b/src/main/java/net/pietru/cookie_utils/api/Region.java @@ -68,6 +68,33 @@ public class Region { return can; } + public static boolean is_area_user_type(Vector3 position,String player_id,String type){ + boolean can = is_not_reloading; + + if (is_not_reloading) + for (Area a : areas){ + if (a.enabled && a.does_intersect(position)){ + can=a.is_user_type(player_id,type); + break; + } + } + + return can; + } + + public static Area get_area_at_pos(Vector3 position){ + boolean can = is_not_reloading; + + if (is_not_reloading) + for (Area a : areas){ + if (a.enabled && a.does_intersect(position)){ + return a; + } + } + + return null; + } + public static void reload_regions(){ is_not_reloading=false; @@ -189,6 +216,7 @@ public class Region { if (perm.player_id.isEmpty()) continue; + perm.type=perm_json.getString("type", ""); perm.enabled=perm_json.getBoolean("enabled", false); diff --git a/src/main/java/net/pietru/cookie_utils/api/TextCommands.java b/src/main/java/net/pietru/cookie_utils/api/TextCommands.java index 9e3cd69..24c2e2e 100644 --- a/src/main/java/net/pietru/cookie_utils/api/TextCommands.java +++ b/src/main/java/net/pietru/cookie_utils/api/TextCommands.java @@ -64,8 +64,9 @@ public class TextCommands { Account account = ServerSingletons.getAccount(networkIdentity); boolean started = false; if (args.length==2) { - if (has_perm(account.getUniqueId(), Setup.get_perm(args[1])) || - has_perm(account.getUniqueId(), "setup.*")) + boolean a = has_perm(account.getUniqueId(), Setup.get_perm(args[1])); + boolean b = has_perm(account.getUniqueId(), "setup.*"); + if (a || b) started = Setup.start(account.getUniqueId(), args[1]); if (args[1].equals("cancel")) Setup.cancel(account.getUniqueId()); diff --git a/src/main/java/net/pietru/cookie_utils/mixins/MessagePacketMixin.java b/src/main/java/net/pietru/cookie_utils/mixins/MessagePacketMixin.java index 65d0908..23ffd3e 100644 --- a/src/main/java/net/pietru/cookie_utils/mixins/MessagePacketMixin.java +++ b/src/main/java/net/pietru/cookie_utils/mixins/MessagePacketMixin.java @@ -1,9 +1,11 @@ package net.pietru.cookie_utils.mixins; import com.llamalad7.mixinextras.sugar.Local; +import finalforeach.cosmicreach.accounts.Account; import finalforeach.cosmicreach.networking.NetworkIdentity; import finalforeach.cosmicreach.networking.NetworkSide; import finalforeach.cosmicreach.networking.packets.MessagePacket; +import finalforeach.cosmicreach.networking.server.ServerSingletons; import io.netty.channel.ChannelHandlerContext; import net.pietru.cookie_utils.api.TextCommands; import net.pietru.cookie_utils.setups.Setup; @@ -22,20 +24,21 @@ public class MessagePacketMixin { @Inject(method = "handle", at = @At("HEAD"), cancellable = true) private void event_on_message(CallbackInfo ci, @Local NetworkIdentity identity, @Local ChannelHandlerContext ctx){ if (identity.getSide() != NetworkSide.CLIENT) { + Account account = ServerSingletons.getAccount(identity); if (message.startsWith(":")) { String cmd = message.replaceFirst(":",""); String[] data = cmd.split(" "); TextCommands.run(data,identity,ctx); ci.cancel(); - }else if (Setup.setups.containsKey(playerUniqueId)){ - Setup setup = Setup.setups.get(playerUniqueId); + } else if (Setup.setups.containsKey(account.getUniqueId())){ + Setup setup = Setup.setups.get(account.getUniqueId()); if (setup.set_setup_text(message.replace(" ","_"))) { ci.cancel(); setup.run_step(); MessagePacket packet = new MessagePacket("[Server] " + setup.get_step_hint()); - packet.playerUniqueId = playerUniqueId; + packet.playerUniqueId = account.getUniqueId(); packet.setupAndSend(ctx); } } diff --git a/src/main/java/net/pietru/cookie_utils/permissions/ObjectPermList.java b/src/main/java/net/pietru/cookie_utils/permissions/ObjectPermList.java index 4737dde..17f653c 100644 --- a/src/main/java/net/pietru/cookie_utils/permissions/ObjectPermList.java +++ b/src/main/java/net/pietru/cookie_utils/permissions/ObjectPermList.java @@ -24,6 +24,11 @@ public class ObjectPermList { return bool_perms.getOrDefault(key,def_val); } + public void get_json(JsonValue val){ + for (String key : bool_perms.keySet()) + val.addChild(key, new JsonValue(bool_perms.get(key))); + } + public static void get_default_perms(JsonValue val){ val.addChild("canPlace", new JsonValue(false)); val.addChild("canBreak", new JsonValue(false)); diff --git a/src/main/java/net/pietru/cookie_utils/permissions/PlayerAreaPerm.java b/src/main/java/net/pietru/cookie_utils/permissions/PlayerAreaPerm.java index 1fb7857..09ea25e 100644 --- a/src/main/java/net/pietru/cookie_utils/permissions/PlayerAreaPerm.java +++ b/src/main/java/net/pietru/cookie_utils/permissions/PlayerAreaPerm.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.utils.JsonValue; public class PlayerAreaPerm { public String player_id = ""; + public String type = ""; public boolean enabled = true; public ObjectPermList perms = new ObjectPermList(); @@ -11,9 +12,20 @@ public class PlayerAreaPerm { return perms.get_bool_perm(action,false); } + public JsonValue get_json(){ + JsonValue val = new JsonValue(JsonValue.ValueType.object); + + val.addChild("player_id", new JsonValue(player_id)); + val.addChild("type", new JsonValue(type)); + val.addChild("enabled", new JsonValue(enabled)); + perms.get_json(val); + return val; + } + public static JsonValue get_default_perms(){ JsonValue val = new JsonValue(JsonValue.ValueType.object); val.addChild("player_id", new JsonValue("")); + val.addChild("type", new JsonValue("")); val.addChild("enabled", new JsonValue(true)); ObjectPermList.get_default_perms(val); return val; diff --git a/src/main/java/net/pietru/cookie_utils/setups/Setup.java b/src/main/java/net/pietru/cookie_utils/setups/Setup.java index ae14669..8765294 100644 --- a/src/main/java/net/pietru/cookie_utils/setups/Setup.java +++ b/src/main/java/net/pietru/cookie_utils/setups/Setup.java @@ -17,6 +17,9 @@ public abstract class Setup { Setup setup = setupCreator.get(setupId); if (setup==null) return false; + if (!setup.can_start_setup(playerId)) + return false; + setup.creatorId=playerId; setups.put(playerId,setup); return true; } @@ -41,10 +44,15 @@ public abstract class Setup { public boolean isActive = true; + public String creatorId; public int step = 0; public ArrayList steps = new ArrayList<>(); public ArrayList step_hints = new ArrayList<>(); + public boolean can_start_setup(String playerId){ + return true; + } + public void run_step(){ if (!isActive) return; diff --git a/src/main/java/net/pietru/cookie_utils/setups/areaPermSetup.java b/src/main/java/net/pietru/cookie_utils/setups/areaPermSetup.java new file mode 100644 index 0000000..bcb9ca5 --- /dev/null +++ b/src/main/java/net/pietru/cookie_utils/setups/areaPermSetup.java @@ -0,0 +1,146 @@ +package net.pietru.cookie_utils.setups; + +import com.badlogic.gdx.math.Vector3; +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonWriter; +import finalforeach.cosmicreach.GameSingletons; +import finalforeach.cosmicreach.accounts.Account; +import finalforeach.cosmicreach.blocks.BlockPosition; +import finalforeach.cosmicreach.entities.player.Player; +import finalforeach.cosmicreach.io.SaveLocation; +import finalforeach.cosmicreach.networking.server.ServerSingletons; +import net.pietru.cookie_utils.api.Area; +import net.pietru.cookie_utils.api.Region; +import net.pietru.cookie_utils.permissions.ObjectPermList; +import net.pietru.cookie_utils.permissions.PlayerAreaPerm; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; + +import static net.pietru.cookie_utils.api.Region.get_area_at_pos; +import static net.pietru.cookie_utils.utils.directory_utils.get_path_string; + +public class areaPermSetup extends Setup { + String mode=""; + String selected_perm=""; + String usr_id=""; + + Area area; + PlayerAreaPerm plr_perm; + + @Override + public boolean can_start_setup(String playerId) { + Player player = GameSingletons.getPlayerFromUniqueId(playerId); + area=get_area_at_pos(player.getPosition()); + return area!=null&&Region.is_area_user_type(player.getPosition(),playerId,"Owner"); + } + + public areaPermSetup() { + steps.add(()->{}); + steps.add(()->{}); + steps.add(()->{}); + steps.add(()->{ + for (int i = 0; i < area.player_perms.size; i++) { + PlayerAreaPerm perm = area.player_perms.get(i); + if (perm.player_id.equals(usr_id)) { + plr_perm = perm; + break; + } + } + if (plr_perm==null) { + + if (ServerSingletons.getAccountByUniqueId(usr_id)==null) { + step_hints.add("Permission setup failed - invalid player id"); + isActive = false; + return; + } + + plr_perm = new PlayerAreaPerm(); + ObjectPermList.get_default_perms(plr_perm.perms); + } + step_hints.add("Permission setup complete"); + + boolean target = mode.equalsIgnoreCase("grant") || mode.equalsIgnoreCase("g"); + + switch (selected_perm){ + case "all","a": + plr_perm.perms.set_bool_perm("canPlace", target); + plr_perm.perms.set_bool_perm("canBreak", target); + plr_perm.perms.set_bool_perm("canInteract", target); + plr_perm.perms.set_bool_perm("canEnter", target); + break; + case "edit","e": + plr_perm.perms.set_bool_perm("canPlace", target); + plr_perm.perms.set_bool_perm("canBreak", target); + break; + case "interact","i": + plr_perm.perms.set_bool_perm("canInteract", target); + break; + case "enter","m": + plr_perm.perms.set_bool_perm("canEnter", target); + break; + } + + run_setup_finish(); + }); + + step_hints.add("Interactive setup via chat, please type anything to continue..."); + step_hints.add("Please select mode - Grant/Revoke (G/R)"); + step_hints.add("Please select permission: edit(e),interact(i),enter(m),all(a)."); + step_hints.add("Please enter player id..."); + } + + public static void register() { + setupCreator.registerSetupCreator("perm", areaPermSetup::new); + } + + @Override + public String get_setup_perm() { + return "setup.area_perm"; + } + + @Override + public void run_setup_finish() { + isActive=false; + File area_file = new File(get_path_string(SaveLocation.getSaveFolder().getPath(),"region_perms",area.name,usr_id+".json")); + try { + if (!area_file.exists()) { + Json json = new Json(); + json.setOutputType(JsonWriter.OutputType.json); + BufferedWriter writer = new BufferedWriter(new FileWriter(area_file.getPath())); + writer.write(json.prettyPrint(plr_perm.get_json().toString())); + writer.close(); + Region.reload_regions(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void run_setup_canceled() { + + } + + @Override + public boolean set_setup_text(String value) { + if (step==1) + mode=value; + if (step==2) + selected_perm=value; + if (step==3) + usr_id=value; + return step==0 || step==1 || step==2 || step==3; + } + + @Override + public boolean set_setup_vector3(Vector3 value) { + return false; + } + + @Override + public boolean set_setup_block_pos(BlockPosition value) { + return false; + } +} diff --git a/src/main/java/net/pietru/cookie_utils/setups/regionSetup.java b/src/main/java/net/pietru/cookie_utils/setups/regionSetup.java index d17ad04..50bb5c6 100644 --- a/src/main/java/net/pietru/cookie_utils/setups/regionSetup.java +++ b/src/main/java/net/pietru/cookie_utils/setups/regionSetup.java @@ -6,6 +6,7 @@ import com.badlogic.gdx.utils.JsonWriter; import finalforeach.cosmicreach.blocks.BlockPosition; import finalforeach.cosmicreach.io.SaveLocation; import net.pietru.cookie_utils.api.Area; +import net.pietru.cookie_utils.api.Region; import net.pietru.cookie_utils.permissions.ObjectPermList; import java.io.BufferedWriter; @@ -37,6 +38,7 @@ public class regionSetup extends Setup { step_hints.add("Please select first position..."); step_hints.add("Please select second position..."); step_hints.add("Please enter region name (single word)..."); + step_hints.add("Region creation complete"); } public static void register() { @@ -57,8 +59,9 @@ public class regionSetup extends Setup { Json json = new Json(); json.setOutputType(JsonWriter.OutputType.json); BufferedWriter writer = new BufferedWriter(new FileWriter(area_file.getPath())); - writer.write(json.prettyPrint(area)); + writer.write(json.prettyPrint(area.get_json().toString())); writer.close(); + Region.reload_regions(); } } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/net/pietru/cookie_utils/setups/setupCreator.java b/src/main/java/net/pietru/cookie_utils/setups/setupCreator.java index 0d67f82..9fdd1a6 100644 --- a/src/main/java/net/pietru/cookie_utils/setups/setupCreator.java +++ b/src/main/java/net/pietru/cookie_utils/setups/setupCreator.java @@ -7,6 +7,7 @@ public interface setupCreator { static void registerSetupCreators() { regionSetup.register(); + areaPermSetup.register(); } static void registerSetupCreator(String setupId, setupCreator creator) {