diff --git a/plugins/utilities/rank_system.py b/plugins/utilities/rank_system.py new file mode 100644 index 0000000..681bcb4 --- /dev/null +++ b/plugins/utilities/rank_system.py @@ -0,0 +1,142 @@ +# ba_meta require api 9 + +import os +import json +import babase +import bascenev1 as bs + +plugman = dict( + plugin_name="rank_system", + description="ranks system for servers or for local players", + external_url="", + authors=[ + {"name": "ATD", "email": "anasdhaoidi001@gmail.com", "discord": ""}, + ], + version="1.0.0", +) + +MODS_DIR = os.path.dirname(__file__) +STATS_DIR = os.path.join(MODS_DIR, "stats") +STATS_FILE = os.path.join(STATS_DIR, "ranks.json") + + +class RankSystem: + + def __init__(self): + self.data = {} + self.load() + + def load(self): + if not os.path.exists(STATS_DIR): + os.makedirs(STATS_DIR) + + if os.path.exists(STATS_FILE): + try: + with open(STATS_FILE, "r") as f: + self.data = json.load(f) + except: + self.data = {} + + def save(self): + with open(STATS_FILE, "w") as f: + json.dump(self.data, f, indent=4) + + def add_score(self, account_id, score=1): + if account_id not in self.data: + self.data[account_id] = { + "score": 0, + "rank": 0 + } + + self.data[account_id]["score"] += score + self.update_ranks() + self.save() + + def update_ranks(self): + sorted_players = sorted( + self.data.items(), + key=lambda x: x[1]["score"], + reverse=True + ) + + for i, (aid, p) in enumerate(sorted_players): + p["rank"] = i + 1 + + def get_rank(self, account_id): + return self.data.get(account_id, {}).get("rank") + + +rank_sys = RankSystem() + + +class RankTag: + def __init__(self, node, rank): + + m = bs.newnode( + "math", + owner=node, + attrs={ + "input1": (0, 1.2, 0), + "operation": "add" + } + ) + + node.connectattr("torso_position", m, "input2") + + if rank == 1: + text = "1" + color = (1, 1, 1) + elif rank == 2: + text = "2" + color = (1, 1, 1) + elif rank == 3: + text = "3" + color = (1, 1, 1) + else: + text = f"#{rank}" + color = (1, 1, 1) + + t = bs.newnode( + "text", + owner=node, + attrs={ + "text": text, + "in_world": True, + "color": color, + "scale": 0.01, + "h_align": "center" + } + ) + + m.connectattr("output", t, "position") + + +# 🔌 plugin +# ba_meta export babase.Plugin +class byATD(babase.Plugin): + + def on_app_running(self): + print("Rank System Loaded ") + + import bascenev1._gameactivity as ga + + old_spawn = ga.GameActivity.spawn_player_spaz + + def new_spawn(self, player, *args, **kwargs): + spaz = old_spawn(self, player, *args, **kwargs) + + try: + aid = player.sessionplayer.get_account_id() + + rank_sys.add_score(aid, 1) + + rank = rank_sys.get_rank(aid) + if rank: + RankTag(spaz.node, rank) + + except Exception as e: + print("Rank error:", e) + + return spaz + + ga.GameActivity.spawn_player_spaz = new_spawn