From 89193d52f6d09745a0ba6f2f188f86a093816af9 Mon Sep 17 00:00:00 2001 From: pietru Date: Sat, 22 Mar 2025 15:00:31 +0100 Subject: [PATCH] add kits --- .../net/pietru/cookie_utils/CookieUtils.java | 4 + .../pietru/cookie_utils/api/TextCommands.java | 1 + .../cookie_utils/commands/kit_command.java | 55 ++++++ .../commands/reload_cmds/reload_command.java | 5 + .../net/pietru/cookie_utils/kits/Kits.java | 160 ++++++++++++++++++ .../pietru/cookie_utils/kits/kit_info.java | 27 +++ .../cookie_utils/kits/kit_use_info.java | 8 + 7 files changed, 260 insertions(+) create mode 100644 src/main/java/net/pietru/cookie_utils/commands/kit_command.java create mode 100644 src/main/java/net/pietru/cookie_utils/kits/Kits.java create mode 100644 src/main/java/net/pietru/cookie_utils/kits/kit_info.java create mode 100644 src/main/java/net/pietru/cookie_utils/kits/kit_use_info.java diff --git a/src/main/java/net/pietru/cookie_utils/CookieUtils.java b/src/main/java/net/pietru/cookie_utils/CookieUtils.java index e3f26c1..18c391a 100644 --- a/src/main/java/net/pietru/cookie_utils/CookieUtils.java +++ b/src/main/java/net/pietru/cookie_utils/CookieUtils.java @@ -3,6 +3,7 @@ package net.pietru.cookie_utils; import dev.crmodders.cosmicquilt.api.entrypoint.ModInitializer; import finalforeach.cosmicreach.GameSingletons; import net.pietru.cookie_utils.api.Region; +import net.pietru.cookie_utils.kits.Kits; import net.pietru.cookie_utils.permissions.Permissions; import net.pietru.cookie_utils.scripting.ScriptsDB; import net.pietru.cookie_utils.setups.setupCreator; @@ -43,6 +44,9 @@ public class CookieUtils implements ModInitializer { setupCreator.registerSetupCreators(); System.out.println("CookieUtils loaded setup creators..."); + Kits.reload_player_kits(); + System.out.println("CookieUtils loaded kits..."); + GameSingletons.updateObservers.add(new CookieUtilsLogicRunner()); } } 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 a43eed5..c2d5a33 100644 --- a/src/main/java/net/pietru/cookie_utils/api/TextCommands.java +++ b/src/main/java/net/pietru/cookie_utils/api/TextCommands.java @@ -42,6 +42,7 @@ public class TextCommands { commands.put("my_claims",new my_claims_command()); commands.put("setup",new setup_command()); commands.put("region",new region_command()); + commands.put("kit",new kit_command()); commands.put("npc", new npc_command()); diff --git a/src/main/java/net/pietru/cookie_utils/commands/kit_command.java b/src/main/java/net/pietru/cookie_utils/commands/kit_command.java new file mode 100644 index 0000000..84d0312 --- /dev/null +++ b/src/main/java/net/pietru/cookie_utils/commands/kit_command.java @@ -0,0 +1,55 @@ +package net.pietru.cookie_utils.commands; + +import finalforeach.cosmicreach.accounts.Account; +import finalforeach.cosmicreach.networking.NetworkIdentity; +import finalforeach.cosmicreach.networking.packets.MessagePacket; +import finalforeach.cosmicreach.networking.server.ServerSingletons; +import io.netty.channel.ChannelHandlerContext; +import net.pietru.cookie_utils.kits.Kits; + +public class kit_command extends BaseCommand{ + @Override + public String get_command_key() { + return "kit"; + } + + @Override + public void accept(String[] args, NetworkIdentity identity, ChannelHandlerContext ctx) { + Account account = ServerSingletons.getAccount(identity); + boolean used = false; + long timeout = 0; + String kitId = ""; + if (args.length>=2){ + kitId = args[1]; + + if (account!=null && kitId!=null){ + timeout = Kits.get_kit_timeout(account.getUniqueId(),kitId); + timeout = timeout/1000; + used = Kits.use_kit(account.getUniqueId(),kitId); + } + } + + String claim_kit_in_msg = "[Server] You can claim this kit in "; + if (timeout>0){ + long seconds = timeout%60; + long minutes = timeout-seconds; + long hours = timeout-minutes-seconds; + long days = timeout-hours-minutes-seconds; + if (timeout>59){ + if (timeout>3599){ + if (timeout>86399){ + claim_kit_in_msg+=days/(60*60824)+"d "; + } + claim_kit_in_msg+=hours/(60*60)+"h "; + } + claim_kit_in_msg+=minutes/60+"m "; + } + claim_kit_in_msg+=seconds+"s "; + } + + + + MessagePacket packet = new MessagePacket(used ? "[Server] Claimed kit "+Kits.get_kit_name(kitId) : (timeout>0 ? claim_kit_in_msg : "[Server] Could not claim kit...")); + packet.setupAndSend(ctx); + } +} diff --git a/src/main/java/net/pietru/cookie_utils/commands/reload_cmds/reload_command.java b/src/main/java/net/pietru/cookie_utils/commands/reload_cmds/reload_command.java index 33b6b11..ff953b5 100644 --- a/src/main/java/net/pietru/cookie_utils/commands/reload_cmds/reload_command.java +++ b/src/main/java/net/pietru/cookie_utils/commands/reload_cmds/reload_command.java @@ -11,6 +11,7 @@ import java.util.Arrays; import java.util.List; import static net.pietru.cookie_utils.api.Region.reload_regions; +import static net.pietru.cookie_utils.kits.Kits.reload_player_kits; import static net.pietru.cookie_utils.permissions.Permissions.reload_perm_groups; import static net.pietru.cookie_utils.scripting.ScriptsDB.reload_scripts; @@ -44,6 +45,10 @@ public class reload_command extends BaseCommand { reload_regions(); reloaded_funcs+="regions "; } + if (arg_list.contains("kits") || args.length==1) { + reload_player_kits(); + reloaded_funcs+="kits "; + } MessagePacket packet = new MessagePacket("Reloaded: "+reloaded_funcs); packet.setupAndSend(ctx); } diff --git a/src/main/java/net/pietru/cookie_utils/kits/Kits.java b/src/main/java/net/pietru/cookie_utils/kits/Kits.java new file mode 100644 index 0000000..844ae1e --- /dev/null +++ b/src/main/java/net/pietru/cookie_utils/kits/Kits.java @@ -0,0 +1,160 @@ +package net.pietru.cookie_utils.kits; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonWriter; +import finalforeach.cosmicreach.accounts.Account; +import finalforeach.cosmicreach.entities.player.Player; +import finalforeach.cosmicreach.io.SaveLocation; +import finalforeach.cosmicreach.items.Item; +import finalforeach.cosmicreach.items.ItemMergeStrategy; +import finalforeach.cosmicreach.items.ItemStack; +import finalforeach.cosmicreach.networking.server.ServerSingletons; +import net.pietru.cookie_utils.permissions.Permissions; +import net.pietru.cookie_utils.utils.directory_utils; +import net.pietru.cookie_utils.utils.prop; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.util.*; + +import static net.pietru.cookie_utils.utils.directory_utils.get_path_string; + +public class Kits { + static Json json = new Json(); + + static Map kitsMap = new HashMap<>(); + static Map player_kit_uses = new HashMap<>(); + + public static void reload_player_kit_uses(boolean load){ + File def = new File(get_path_string(SaveLocation.getSaveFolder().getPath(),"player_kit_uses.json")); + if (load && def.exists()) { + try { + player_kit_uses = json.fromJson(HashMap.class, Gdx.files.absolute(def.getPath())); + } catch (Exception ignored) { + if (prop.log_level>0) + System.err.println("[KITS] Encountered exception while loading player kit uses..."); + } + return; + } + + + try { + Json json = new Json(); + json.setOutputType(JsonWriter.OutputType.json); + BufferedWriter writer = new BufferedWriter(new FileWriter(def.getPath())); + writer.write(json.prettyPrint(player_kit_uses)); + writer.close(); + } catch (Exception e) { + e.printStackTrace(); + } + + if (prop.log_level>0) + System.out.println("[KITS] Saved player kit uses."); + } + + public static void reload_player_kits(){ + kitsMap.clear(); + + File perms_folder = new File(get_path_string(SaveLocation.getSaveFolder().getPath(),"kits")); + if (!perms_folder.exists()) { + perms_folder.mkdirs(); + } + File def = new File(get_path_string(perms_folder.getPath(),"example.json")); + ArrayList perms = directory_utils.list_files_in_dir_recursive(perms_folder,((dir, name) -> name.endsWith(".json"))); + if (prop.log_level>0) + System.out.println("[KITS] Trying to load %s perm kits.".replace("%s", String.valueOf(perms.size()))); + for (File f : perms) { + kit_info kit; + try { + kit=json.fromJson(kit_info.class,Gdx.files.absolute(f.getPath())); + } catch (Exception ignored){ + if (prop.log_level>0) + System.err.println("[KITS] Perm group file \"%s\" had encountered exception while loading...".replace("%s", f.getPath())); + continue; + } + + if (kit.kit_id.isEmpty()) + continue; + + + kitsMap.put(kit.kit_id,kit); + } + + + try { + if (!def.exists()) { + Json json = new Json(); + json.setOutputType(JsonWriter.OutputType.json); + BufferedWriter writer = new BufferedWriter(new FileWriter(def.getPath())); + writer.write(json.prettyPrint(kit_info.get_default_kit())); + writer.close(); + reload_player_kits(); + } + } catch (Exception e) { + e.printStackTrace(); + } + + reload_player_kit_uses(true); + + if (prop.log_level>0) + System.out.println("[KITS] Loaded %s permissions.".replace("%s",String.valueOf(kitsMap.size()))); + } + + public static Set get_kits(){ + return kitsMap.keySet(); + } + + public static String get_kit_name(String kit_id){ + return kitsMap.getOrDefault(kit_id,new kit_info()).kit_DisplayName; + } + + public static boolean can_use_kit(String playerId,String kit_id){ + if (!kitsMap.containsKey(kit_id)) + return false; + kit_info kit = kitsMap.get(kit_id); + boolean perm = Permissions.has_perm(playerId,kitsMap.get(kit_id).kit_perm); + if (!player_kit_uses.containsKey(playerId)) + return perm; + kit_use_info info = player_kit_uses.get(playerId); + if (!info.kit_use.containsKey(kit_id)) + return perm; + long use_time = info.kit_use.get(kit_id); + long delay_time = (long) ((kit.kit_delay_seconds + kit.kit_delay_minutes*60 + kit.kit_delay_hours*60*60 + kit.kit_delay_days*60*60*24)*1000); + return perm && System.currentTimeMillis()>(use_time+delay_time); + } + + public static boolean use_kit(String playerId,String kit_id){ + if (!can_use_kit(playerId,kit_id)) + return false; + if (!kitsMap.containsKey(kit_id)) + return false; + kit_info kit = kitsMap.get(kit_id); + Account account = ServerSingletons.getAccountByUniqueId(playerId); + Player player = account.getPlayer(); + for (String id : kit.items.keySet()) + player.inventory.merge(new ItemStack(Item.getItem(id),kit.items.getOrDefault(id,1)), ItemMergeStrategy.PRESERVE); + player.inventory.syncDirtySlots(0,ServerSingletons.getConnection(player)); + kit_use_info info = player_kit_uses.getOrDefault(playerId,new kit_use_info()); + info.kit_use.put(kit_id,System.currentTimeMillis()); + player_kit_uses.put(playerId,info); + reload_player_kit_uses(false); + return true; + } + + public static long get_kit_timeout(String playerId,String kit_id){ + if (!kitsMap.containsKey(kit_id)) + return 0; + kit_info kit = kitsMap.get(kit_id); + if (!player_kit_uses.containsKey(playerId)) + return 0; + kit_use_info info = player_kit_uses.get(playerId); + if (!info.kit_use.containsKey(kit_id)) + return 0; + long use_time = info.kit_use.get(kit_id); + long delay_time = (long) ((kit.kit_delay_seconds + kit.kit_delay_minutes*60 + kit.kit_delay_hours*60*60 + kit.kit_delay_days*60*60*24)*1000); + long remaining_time= (use_time+delay_time)-System.currentTimeMillis(); + return Math.max(0,remaining_time); + } +} diff --git a/src/main/java/net/pietru/cookie_utils/kits/kit_info.java b/src/main/java/net/pietru/cookie_utils/kits/kit_info.java new file mode 100644 index 0000000..edd046a --- /dev/null +++ b/src/main/java/net/pietru/cookie_utils/kits/kit_info.java @@ -0,0 +1,27 @@ +package net.pietru.cookie_utils.kits; + +import java.util.HashMap; +import java.util.Map; + +public class kit_info { + public String kit_id = ""; + public String kit_DisplayName = ""; + public String kit_Desc = ""; + public String kit_perm = ""; + public Float kit_delay_seconds = 0F; + public Float kit_delay_minutes = 0F; + public Float kit_delay_hours = 0F; + public Float kit_delay_days = 0F; + public Map items = new HashMap<>(); + + public static kit_info get_default_kit(){ + kit_info val = new kit_info(); + val.kit_id="example"; + val.kit_DisplayName="Example kit"; + val.kit_Desc="The example user kit..."; + val.kit_perm="kit.example"; + val.kit_delay_minutes=1F; + val.items.put("base:stick",1); + return val; + } +} diff --git a/src/main/java/net/pietru/cookie_utils/kits/kit_use_info.java b/src/main/java/net/pietru/cookie_utils/kits/kit_use_info.java new file mode 100644 index 0000000..7b93e21 --- /dev/null +++ b/src/main/java/net/pietru/cookie_utils/kits/kit_use_info.java @@ -0,0 +1,8 @@ +package net.pietru.cookie_utils.kits; + +import java.util.HashMap; +import java.util.Map; + +public class kit_use_info { + public Map kit_use = new HashMap<>(); +}