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 ed75e1f..aae04b2 100644 --- a/src/main/java/net/pietru/cookie_utils/api/Area.java +++ b/src/main/java/net/pietru/cookie_utils/api/Area.java @@ -3,16 +3,27 @@ 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.Json; import com.badlogic.gdx.utils.JsonValue; +import com.badlogic.gdx.utils.JsonWriter; +import finalforeach.cosmicreach.io.SaveLocation; 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.utils.directory_utils.get_path_string; +import static net.pietru.cookie_utils.utils.player_utils.is_plr_valid; + public class Area { BoundingBox space = new BoundingBox(); public String name = "none"; public String parent = ""; public boolean enabled = true; + public boolean protect = false; public ObjectPermList perms = new ObjectPermList(); public int piority = 0; @@ -37,7 +48,7 @@ public class Area { } public boolean get_action_bool(String action,String player_id){ - if (!player_id.contains("offline")) + if (is_plr_valid(player_id)) 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)){ @@ -48,11 +59,11 @@ public class Area { } public boolean is_user_type(String player_id,String type){ - if (!player_id.contains("offline")) + if (is_plr_valid(player_id)) 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 player_perms.get(i).type.equalsIgnoreCase(type); } } return false; @@ -74,9 +85,26 @@ public class Area { val.addChild("z2", new JsonValue(space.max.z)); val.addChild("enabled", new JsonValue(enabled)); + val.addChild("protect", new JsonValue(protect)); + val.addChild("parent", new JsonValue(parent)); perms.get_json(val); val.addChild("piority", new JsonValue(piority)); return val; } + public void save(boolean reload){ + File area_file = new File(get_path_string(SaveLocation.getSaveFolder().getPath(),"regions",name)); + try { + Json json = new Json(); + json.setOutputType(JsonWriter.OutputType.json); + BufferedWriter writer = new BufferedWriter(new FileWriter(area_file.getPath())); + writer.write(json.prettyPrint(get_json().toString())); + writer.close(); + } catch (Exception e) { + e.printStackTrace(); + } + if (reload) + Region.reload_regions(); + } + } 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 9c28eb6..9fecf8a 100644 --- a/src/main/java/net/pietru/cookie_utils/api/Region.java +++ b/src/main/java/net/pietru/cookie_utils/api/Region.java @@ -44,7 +44,8 @@ public class Region { boolean can = is_not_reloading; if (is_not_reloading) - for (Area a : areas){ + for (int i = 0; i< areas.size; i++){ + Area a = areas.get(i); if (a.enabled && a.does_intersect(g_position)){ can=a.get_action_bool(action); break; @@ -58,7 +59,8 @@ public class Region { boolean can = is_not_reloading; if (is_not_reloading) - for (Area a : areas){ + for (int i = 0; i< areas.size; i++){ + Area a = areas.get(i); if (a.enabled && a.does_intersect(position)){ can=a.get_action_bool(action,player_id); break; @@ -72,7 +74,8 @@ public class Region { boolean can = is_not_reloading; if (is_not_reloading) - for (Area a : areas){ + for (int i = 0; i< areas.size; i++){ + Area a = areas.get(i); if (a.enabled && a.does_intersect(position)){ can=a.is_user_type(player_id,type); break; @@ -83,10 +86,9 @@ public class Region { } public static Area get_area_at_pos(Vector3 position){ - boolean can = is_not_reloading; - if (is_not_reloading) - for (Area a : areas){ + for (int i = 0; i< areas.size; i++){ + Area a = areas.get(i); if (a.enabled && a.does_intersect(position)){ return a; } @@ -130,6 +132,7 @@ public class Region { area.name=f.getName(); area.enabled=region.getBoolean("enabled",true); + area.protect=region.getBoolean("protect",false); area.parent = region.getString("parent",""); if (area.parent.isEmpty()) { @@ -167,7 +170,14 @@ public class Region { } } } + sort_areas(); + is_not_reloading=true; + + System.out.println("[REGIONS] Loaded %s areas.".replace("%s",String.valueOf(areas.size))); + } + + public static void sort_areas(){ Sort sorter = Sort.instance(); sorter.sort(areas,(a,b)->{ @@ -176,10 +186,6 @@ public class Region { return pior; return Math.toIntExact(a.size - b.size); }); - - is_not_reloading=true; - - System.out.println("[REGIONS] Loaded %s areas.".replace("%s",String.valueOf(areas.size))); } public static void reload_area_player_perms(String area_name){ @@ -216,6 +222,7 @@ public class Region { if (perm.player_id.isEmpty()) continue; + perm.filename=f.getName(); perm.type=perm_json.getString("type", ""); perm.enabled=perm_json.getBoolean("enabled", false); @@ -247,6 +254,6 @@ public class Region { e.printStackTrace(); } - System.out.println("[REGIONS] Loaded %s permissions.".replace("%s",String.valueOf(areas.size))); + System.out.println("[AREA] Loaded %s permissions.".replace("%s",String.valueOf(areas.size))); } } 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 24c2e2e..0d0ff8c 100644 --- a/src/main/java/net/pietru/cookie_utils/api/TextCommands.java +++ b/src/main/java/net/pietru/cookie_utils/api/TextCommands.java @@ -3,6 +3,7 @@ package net.pietru.cookie_utils.api; import com.badlogic.gdx.math.Vector3; import finalforeach.cosmicreach.accounts.Account; import finalforeach.cosmicreach.entities.player.Player; +import finalforeach.cosmicreach.io.SaveLocation; import finalforeach.cosmicreach.networking.NetworkIdentity; import finalforeach.cosmicreach.networking.packets.MessagePacket; import finalforeach.cosmicreach.networking.server.ServerSingletons; @@ -11,14 +12,16 @@ import io.netty.channel.ChannelHandlerContext; import net.pietru.cookie_utils.permissions.Permissions; import net.pietru.cookie_utils.setups.Setup; +import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Objects; -import static net.pietru.cookie_utils.api.Region.reload_area_player_perms; -import static net.pietru.cookie_utils.api.Region.reload_regions; +import static net.pietru.cookie_utils.api.Region.*; import static net.pietru.cookie_utils.permissions.Permissions.has_perm; import static net.pietru.cookie_utils.permissions.Permissions.reload_perm_groups; +import static net.pietru.cookie_utils.utils.directory_utils.get_path_string; +import static net.pietru.cookie_utils.utils.player_utils.get_player_id; public class TextCommands { public static final Map> commands = new HashMap<>(); @@ -29,7 +32,7 @@ public class TextCommands { if (!commands.containsKey(args[0])) return; Account account = ServerSingletons.getAccount(id); - if (!Permissions.has_perm(account.getUniqueId(),args[0])) + if (!has_perm(account.getUniqueId(),args[0])) return; TriConsumer cmd = commands.get(args[0]); cmd.accept(args, id, ctx); @@ -60,6 +63,22 @@ public class TextCommands { packet.playerUniqueId=account.getUniqueId(); packet.setupAndSend(channelHandlerContext); }); + commands.put("my_name",(args, networkIdentity, channelHandlerContext) -> { + Account account = ServerSingletons.getAccount(networkIdentity); + + MessagePacket packet = new MessagePacket("Your name is "+account.getUsername()); + packet.playerUniqueId=account.getUniqueId(); + packet.setupAndSend(channelHandlerContext); + }); + commands.put("my_area",(args, networkIdentity, channelHandlerContext) -> { + Account account = ServerSingletons.getAccount(networkIdentity); + Player plr = ServerSingletons.getPlayer(networkIdentity); + Area area = get_area_at_pos(plr.getPosition()); + + MessagePacket packet = new MessagePacket("You are in "+(area!=null?area.name : "no area atm...")); + packet.playerUniqueId=account.getUniqueId(); + packet.setupAndSend(channelHandlerContext); + }); commands.put("setup",(args, networkIdentity, channelHandlerContext) -> { Account account = ServerSingletons.getAccount(networkIdentity); boolean started = false; @@ -83,6 +102,76 @@ public class TextCommands { packet.setupAndSend(channelHandlerContext); } }); + commands.put("region",(args, networkIdentity, channelHandlerContext) -> { + Account account = ServerSingletons.getAccount(networkIdentity); + MessagePacket packet = new MessagePacket("[Server] Usage :region area_name.json action value(optional)"); + if (args.length>=3) { + String txt = args[1]; + if (!txt.endsWith(".json")) + txt+=".json"; + Area area = null; + for (int i = 0; i < areas.size; i++) { + if (areas.get(i).name.equals(txt)){ + area=areas.get(i); + } + } + boolean a = has_perm(account.getUniqueId(), "region.*"); + boolean b = has_perm(account.getUniqueId(), "region."+args[2]); + if (a && b && area!=null){ + switch (args[2]){ + case "enabled": + if (args.length==4){ + try { + area.enabled=Boolean.parseBoolean(args[3]); + area.save(false); + } catch (Exception ignored) {} + packet = new MessagePacket("[Server] Area is now "+(area.enabled?"ENABLED":"DISABLED")); + } else + packet = new MessagePacket("[Server] Area is "+(area.enabled?"ENABLED":"DISABLED")); + break; + case "protect": + if (args.length==4){ + try { + area.protect=Boolean.parseBoolean(args[3]); + area.save(false); + } catch (Exception ignored) {} + packet = new MessagePacket("[Server] Area protection is now "+(area.protect?"ENABLED":"DISABLED")); + } else + packet = new MessagePacket("[Server] Area protection is "+(area.protect?"ENABLED":"DISABLED")); + break; + case "priority", "piority": + if (args.length==4){ + try { + area.piority=Integer.parseInt(args[3]); + area.save(false); + sort_areas(); + } catch (Exception ignored) {} + packet = new MessagePacket("[Server] Area priority is now "+area.piority); + + } else + packet = new MessagePacket("[Server] Area priority is "+area.piority); + break; + case "delete": + if (area.protect) + packet = new MessagePacket("[Server] Sorry but this area is protected..."); + else { + File region = new File(get_path_string(SaveLocation.getSaveFolder().getPath(), "regions", area.name)); + if (region.exists()) { + region.delete(); + packet = new MessagePacket("[Server] Usage :region area_name.json ACTION value(if required)"); + } + } + break; + } + } else { + packet = new MessagePacket("[Server] Insufficient permissions or wrong area..."); + } + + } + + packet.playerUniqueId=account.getUniqueId(); + packet.setupAndSend(channelHandlerContext); + }); commands.put("perm_code",(args, networkIdentity, channelHandlerContext) -> { @@ -106,13 +195,13 @@ public class TextCommands { MessagePacket packet=null; if (args.length==4) { if (Objects.equals(args[1], "set")) { - boolean res = Permissions.set_group(args[2], args[3]); - packet = new MessagePacket(res ? "Group set for user..." : "Failed to set group for user..."); + boolean res = Permissions.set_group(get_player_id(args[2]), args[3]); + packet = new MessagePacket(res ? "[Server] Group set for user..." : "[Server] Failed to set group for user..."); } } else if (args.length==3) { if (Objects.equals(args[1], "clear")) { - Permissions.clear_group(args[2]); + Permissions.clear_group(get_player_id(args[2])); packet = new MessagePacket("[Server] If user had perm it was cleared..."); } } diff --git a/src/main/java/net/pietru/cookie_utils/mixins/LoginPacketMixin.java b/src/main/java/net/pietru/cookie_utils/mixins/LoginPacketMixin.java new file mode 100644 index 0000000..0fec7bc --- /dev/null +++ b/src/main/java/net/pietru/cookie_utils/mixins/LoginPacketMixin.java @@ -0,0 +1,28 @@ +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.packets.meta.LoginPacket; +import io.netty.channel.ChannelHandlerContext; +import net.pietru.cookie_utils.utils.player_utils; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static net.pietru.cookie_utils.utils.player_utils.is_plr_valid; + +@Mixin(LoginPacket.class) +public class LoginPacketMixin { + @Shadow + public Account account; + + @Inject(method = "handle", at = @At("TAIL")) + private void event_player_data(CallbackInfo ci, @Local NetworkIdentity identity, @Local ChannelHandlerContext ctx){ + if (is_plr_valid(account.getUniqueId())){ + player_utils.usernames_to_ids.put(account.getUsername(), account.getUniqueId()); + } + } +} diff --git a/src/main/java/net/pietru/cookie_utils/permissions/GroupPerms.java b/src/main/java/net/pietru/cookie_utils/permissions/GroupPerms.java index 9f6751b..3224743 100644 --- a/src/main/java/net/pietru/cookie_utils/permissions/GroupPerms.java +++ b/src/main/java/net/pietru/cookie_utils/permissions/GroupPerms.java @@ -16,6 +16,7 @@ public class GroupPerms { val.perms.add("gpos"); val.perms.add("my_zone"); val.perms.add("my_id"); + val.perms.add("my_name"); val.perms.add("perm_code"); val.perms.add("perm_clear"); return val; diff --git a/src/main/java/net/pietru/cookie_utils/permissions/Permissions.java b/src/main/java/net/pietru/cookie_utils/permissions/Permissions.java index b7c79be..4a624aa 100644 --- a/src/main/java/net/pietru/cookie_utils/permissions/Permissions.java +++ b/src/main/java/net/pietru/cookie_utils/permissions/Permissions.java @@ -16,6 +16,7 @@ import java.util.Objects; import java.util.Random; import static net.pietru.cookie_utils.utils.directory_utils.get_path_string; +import static net.pietru.cookie_utils.utils.player_utils.is_plr_valid; public class Permissions { static Json json = new Json(); @@ -110,11 +111,11 @@ public class Permissions { if (player_group.containsKey(playerId)) if (groupPermsMap.containsKey(player_group.get(playerId))) group=groupPermsMap.get(player_group.get(playerId)); - return has_user_special_perm(playerId) || group.has_perm(perm); + return has_user_special_perm(playerId) || group.has_perm(perm) || group.has_perm("*"); } public static boolean set_group(String playerId,String group){ - if (!groupPermsMap.containsKey(group)) + if (!groupPermsMap.containsKey(group) || !is_plr_valid(playerId)) return false; player_group.put(playerId,group); reload_player_groups(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 09ea25e..f06b76e 100644 --- a/src/main/java/net/pietru/cookie_utils/permissions/PlayerAreaPerm.java +++ b/src/main/java/net/pietru/cookie_utils/permissions/PlayerAreaPerm.java @@ -3,6 +3,7 @@ package net.pietru.cookie_utils.permissions; import com.badlogic.gdx.utils.JsonValue; public class PlayerAreaPerm { + public String filename = ""; public String player_id = ""; public String type = ""; public boolean enabled = true; diff --git a/src/main/java/net/pietru/cookie_utils/setups/areaPermSetup.java b/src/main/java/net/pietru/cookie_utils/setups/areaPermSetup.java index bcb9ca5..af55e50 100644 --- a/src/main/java/net/pietru/cookie_utils/setups/areaPermSetup.java +++ b/src/main/java/net/pietru/cookie_utils/setups/areaPermSetup.java @@ -2,6 +2,7 @@ package net.pietru.cookie_utils.setups; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonValue; import com.badlogic.gdx.utils.JsonWriter; import finalforeach.cosmicreach.GameSingletons; import finalforeach.cosmicreach.accounts.Account; @@ -20,6 +21,7 @@ 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; +import static net.pietru.cookie_utils.utils.player_utils.*; public class areaPermSetup extends Setup { String mode=""; @@ -41,6 +43,12 @@ public class areaPermSetup extends Setup { steps.add(()->{}); steps.add(()->{}); steps.add(()->{ + if (!is_plr_valid(usr_id) || !has_player(usr_id,area)) { + step_hints.add("Permission setup failed - invalid player id"); + isActive = false; + return; + } + for (int i = 0; i < area.player_perms.size; i++) { PlayerAreaPerm perm = area.player_perms.get(i); if (perm.player_id.equals(usr_id)) { @@ -49,15 +57,11 @@ public class areaPermSetup extends Setup { } } 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(); + plr_perm.filename=usr_id.replace(":","_")+".json"; + plr_perm.player_id=usr_id; ObjectPermList.get_default_perms(plr_perm.perms); + area.player_perms.add(plr_perm); } step_hints.add("Permission setup complete"); @@ -103,16 +107,15 @@ public class areaPermSetup extends Setup { @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")); + File perm_file = new File(get_path_string(SaveLocation.getSaveFolder().getPath(),"region_perms",area.name,plr_perm.filename)); 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(); - } + Json json = new Json(); + JsonValue val = plr_perm.get_json(); + json.setOutputType(JsonWriter.OutputType.json); + BufferedWriter writer = new BufferedWriter(new FileWriter(perm_file.getPath())); + writer.write(json.prettyPrint(val.toString())); + writer.close(); + Region.load_area_player_perms(area); } catch (Exception e) { e.printStackTrace(); } @@ -126,11 +129,11 @@ public class areaPermSetup extends Setup { @Override public boolean set_setup_text(String value) { if (step==1) - mode=value; + mode=value.toLowerCase(); if (step==2) - selected_perm=value; + selected_perm=value.toLowerCase(); if (step==3) - usr_id=value; + usr_id=get_player_id(value); return step==0 || step==1 || step==2 || step==3; } 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 50bb5c6..b3f3792 100644 --- a/src/main/java/net/pietru/cookie_utils/setups/regionSetup.java +++ b/src/main/java/net/pietru/cookie_utils/setups/regionSetup.java @@ -53,19 +53,12 @@ public class regionSetup extends Setup { @Override public void run_setup_finish() { isActive=false; - File area_file = new File(get_path_string(SaveLocation.getSaveFolder().getPath(),"regions",name)); - 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(area.get_json().toString())); - writer.close(); - Region.reload_regions(); - } - } catch (Exception e) { - e.printStackTrace(); - } + area.save(false); + + Region.areas.add(area); + + if (area.parent.isEmpty()) + Region.load_area_player_perms(area); } @Override diff --git a/src/main/java/net/pietru/cookie_utils/utils/player_utils.java b/src/main/java/net/pietru/cookie_utils/utils/player_utils.java new file mode 100644 index 0000000..2cda515 --- /dev/null +++ b/src/main/java/net/pietru/cookie_utils/utils/player_utils.java @@ -0,0 +1,38 @@ +package net.pietru.cookie_utils.utils; + +import net.pietru.cookie_utils.api.Area; +import net.pietru.cookie_utils.permissions.PlayerAreaPerm; + +import java.util.HashMap; +import java.util.Map; + +public class player_utils { + public static Map usernames_to_ids = new HashMap<>(); + + public static boolean has_player(String value){ + return usernames_to_ids.containsKey(value) || usernames_to_ids.containsValue(value); + } + + public static boolean has_player(String value, Area area){ + String plr_id = get_player_id(value); + for (int i = 0; i < area.player_perms.size; i++) { + PlayerAreaPerm perm = area.player_perms.get(i); + if (perm.player_id.equals(plr_id)) { + return true; + } + } + return usernames_to_ids.containsKey(value) || usernames_to_ids.containsValue(value); + } + + public static boolean is_plr_valid(String player_id){ + return !player_id.contains("offline"); + } + + public static String get_player_id(String value){ + if (usernames_to_ids.containsKey(value)) + return usernames_to_ids.get(value); + if (usernames_to_ids.containsValue(value)) + return value; + return ""; + } +} diff --git a/src/main/resources/cookie_utils.mixins.json b/src/main/resources/cookie_utils.mixins.json index 8b26cac..e5958ef 100644 --- a/src/main/resources/cookie_utils.mixins.json +++ b/src/main/resources/cookie_utils.mixins.json @@ -9,6 +9,7 @@ "BlockPlaceMixin", "InteractBlockMixin", "MessagePacketMixin", + "LoginPacketMixin", "PlayerPositionMixin", "ServerSingletonsMixin" ],