Иконка ресурса

FREE WarriorPointsManager : 1.2.6 1.2.6

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Oxide.Core;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("WarriorPointsManager", "YourName", "1.2.6")]
    [Description("Manages points and coins for players, giving new players 100 points on their first login and awarding points for destroying barrels, roadsigns, and looting specific items.")]
    public class WarriorPointsManager : RustPlugin
    {
        private Dictionary<string, PlayerInfo> playerPoints = new Dictionary<string, PlayerInfo>();
        private const string PointsDataFileName = "WarriorPointsData";
        private const int DefaultPoints = 100;
        private const int DefaultCoins = 0; // Default coins set to 0 for new players
        private const int BarrelDestroyPoints = 50;
        private const int LootablePoints = 50;

        private const string PermissionGiveCoins = "warriorpointsmanager.givecoins";

        private class PlayerInfo
        {
            public string Name { get; set; }
            public int Points { get; set; }
            public int Coins { get; set; } // New currency property
        }

        #region Oxide Hooks

        private void Init()
        {
            LoadPointsData();
            permission.RegisterPermission(PermissionGiveCoins, this);
        }

        private void OnPlayerConnected(BasePlayer player)
        {
            Puts($"Player connected: {player.displayName} ({player.UserIDString})");
            AddOrUpdatePlayerPoints(player);
        }

        private void Unload()
        {
            SavePointsData();
        }

        private void OnEntityDeath(BaseCombatEntity entity, HitInfo info)
        {
            if (entity == null || info == null || info.Initiator == null)
                return;

            var initiator = info.Initiator.ToPlayer();
            if (initiator == null)
                return;

            if (IsBarrelOrRoadsign(entity))
            {
                AwardPoints(initiator, BarrelDestroyPoints);
                Puts($"Awarded {BarrelDestroyPoints} points to {initiator.displayName} for destroying a barrel or roadsign.");
            }
        }

        private void OnLootEntityEnd(BasePlayer player, BaseEntity entity)
        {
            if (entity == null)
                return;

            if (IsLootable(entity))
            {
                var storageContainer = entity as StorageContainer;
                if (storageContainer == null)
                    return;

                if (IsContainerEmpty(storageContainer))
                {
                    AwardPoints(player, LootablePoints);
                    Puts($"Awarded {LootablePoints} points to {player.displayName} for fully looting a lootable.");
                }
            }
        }

        #endregion

        #region Points Management

        private void LoadPointsData()
        {
            try
            {
                var dataFile = Interface.Oxide.DataFileSystem.GetFile(PointsDataFileName);
                playerPoints = dataFile.ReadObject<Dictionary<string, PlayerInfo>>() ?? new Dictionary<string, PlayerInfo>();
                Puts("Points data loaded.");
            }
            catch (Exception ex)
            {
                Puts($"Error loading points data: {ex.Message}");
                playerPoints = new Dictionary<string, PlayerInfo>();
            }
        }

        private void SavePointsData()
        {
            try
            {
                var dataFile = Interface.Oxide.DataFileSystem.GetFile(PointsDataFileName);
                dataFile.WriteObject(playerPoints);
                Puts("Points data saved.");
            }
            catch (Exception ex)
            {
                Puts($"Error saving points data: {ex.Message}");
            }
        }

        private void AddOrUpdatePlayerPoints(BasePlayer player)
        {
            string userId = player.UserIDString;
            if (!playerPoints.ContainsKey(userId))
            {
                playerPoints[userId] = new PlayerInfo
                {
                    Name = player.displayName,
                    Points = DefaultPoints,
                    Coins = DefaultCoins // Initialize coins for new players to 0
                };
                player.ChatMessage($"Welcome! You have been given {DefaultPoints} points and {DefaultCoins} coins.");
                Puts($"Added {DefaultPoints} points and {DefaultCoins} coins for new player {player.displayName} ({userId}).");
            }
            else
            {
                var playerInfo = playerPoints[userId];
                if (playerInfo.Name != player.displayName)
                {
                    playerInfo.Name = player.displayName; // Update name in case it has changed
                    Puts($"Updated name for player {userId} to {player.displayName}.");
                }
                // Do not reset points or coins for existing players
            }
            // Comment out SavePointsData() to prevent automatic saving on connection
            // SavePointsData();
        }

        private void AwardPoints(BasePlayer player, int points)
        {
            string userId = player.UserIDString;
            if (playerPoints.ContainsKey(userId))
            {
                playerPoints[userId].Points += points;
                player.ChatMessage($"You have been awarded {points} points.Total points: {playerPoints[userId].Points}");
                SavePointsData();
            }
        }

        private void AwardCoins(BasePlayer player, int coins)
        {
            string userId = player.UserIDString;
            if (playerPoints.ContainsKey(userId))
            {
                playerPoints[userId].Coins += coins;
                player.ChatMessage($"You have been awarded {coins} coins.Total coins: {playerPoints[userId].Coins}");
                SavePointsData();
            }
        }

        // Public method to get player points and coins
        public int GetPlayerPoints(string userId)
        {
            if (playerPoints.ContainsKey(userId))
            {
                return playerPoints[userId].Points;
            }
            return 0;
        }

        public int GetPlayerCoins(string userId)
        {
            if (playerPoints.ContainsKey(userId))
            {
                return playerPoints[userId].Coins;
            }
            return 0;
        }

        // Public method to set player points and coins
        public void SetPlayerPoints(string userId, int points)
        {
            if (playerPoints.ContainsKey(userId))
            {
                playerPoints[userId].Points = points;
                SavePointsData();
            }
        }

        public void SetPlayerCoins(string userId, int coins)
        {
            if (playerPoints.ContainsKey(userId))
            {
                playerPoints[userId].Coins = coins;
                SavePointsData();
            }
        }

        private bool IsBarrelOrRoadsign(BaseCombatEntity entity)
        {
            string prefabName = entity.ShortPrefabName;
            return prefabName == "loot-barrel-1" || prefabName == "loot-barrel-2" ||
                   prefabName == "loot_barrel_1" || prefabName == "loot_barrel_2" ||
                   prefabName == "oil_barrel" ||
                   prefabName.StartsWith("roadsign") && prefabName.Length == 9 && char.IsDigit(prefabName[8]);
        }

        private bool IsLootable(BaseEntity entity)
        {
            string prefabName = entity.ShortPrefabName;
            return prefabName == "trash-pile-1" || prefabName == "crate_basic" || prefabName == "crate_elite" ||
                   prefabName == "crate_mine" || prefabName == "crate_normal" || prefabName == "crate_normal_2" ||
                   prefabName == "crate_normal_2_food" || prefabName == "crate_normal_2_medical" || prefabName == "crate_tools" ||
                   prefabName == "crate_underwater_advanced" || prefabName == "crate_underwater_basic" || prefabName == "foodbox" ||
                   prefabName == "loot_trash" || prefabName == "minecart" || prefabName == "crate_ammunition" || prefabName == "crate_food_1" ||
                   prefabName == "crate_food_2" || prefabName == "crate_fuel" || prefabName == "crate_medical" || prefabName == "tech_parts_1" ||
                   prefabName == "tech_parts_22" || prefabName == "vehicle_parts";
        }

        private bool IsContainerEmpty(StorageContainer container)
        {
            return container.inventory.itemList.Count == 0;
        }

        #endregion

        #region Chat Commands

        [ChatCommand("points")]
        private void PointsCommand(BasePlayer player, string command, string[] args)
        {
            string userId = player.UserIDString;
            if (playerPoints.TryGetValue(userId, out PlayerInfo playerInfo))
            {
                player.ChatMessage($"You have {playerInfo.Points} points and {playerInfo.Coins} coins.");
            }
            else
            {
                player.ChatMessage("You have no points or coins recorded.");
            }
        }

        [ChatCommand("givecoins")]
        private void GiveCoinsCommand(BasePlayer player, string command, string[] args)
        {
            if (!permission.UserHasPermission(player.UserIDString, PermissionGiveCoins))
            {
                player.ChatMessage("You do not have permission to use this command.");
                return;
            }

            if (args.Length != 2)
            {
                player.ChatMessage("Usage: /givecoins <playername> <amount>");
                return;
            }

            var targetPlayer = FindPlayerByName(args[0]);
            if (targetPlayer == null)
            {
                player.ChatMessage($"Player '{args[0]}' not found.");
                return;
            }

            if (!int.TryParse(args[1], out var amount) || amount <= 0)
            {
                player.ChatMessage("Invalid amount specified.");
                return;
            }

            AwardCoins(targetPlayer, amount);
            player.ChatMessage($"You have given {amount} coins to {targetPlayer.displayName}.");
        }

        #endregion

        #region Console Commands

        [ConsoleCommand("givecoins")]
        private void GiveCoinsConsoleCommand(ConsoleSystem.Arg arg)
        {
            if (!arg.IsAdmin)
            {
                arg.ReplyWith("You do not have permission to use this command.");
                return;
            }

            if (arg.Args == null || arg.Args.Length != 2)
            {
                arg.ReplyWith("Usage: givecoins <playername> <amount>");
                return;
            }

            var targetPlayer = FindPlayerByName(arg.Args[0]);
            if (targetPlayer == null)
            {
                arg.ReplyWith($"Player '{arg.Args[0]}' not found.");
                return;
            }

            if (!int.TryParse(arg.Args[1], out var amount) || amount <= 0)
            {
                arg.ReplyWith("Invalid amount specified.");
                return;
            }

            AwardCoins(targetPlayer, amount);
            arg.ReplyWith($"You have given {amount} coins to {targetPlayer.displayName}.");
        }

        #endregion

        private BasePlayer FindPlayerByName(string name)
        {
            var players = BasePlayer.activePlayerList;
            foreach (var player in players)
            {
                if (player.displayName.Equals(name, StringComparison.OrdinalIgnoreCase))
                {
                    return player;
                }
            }
            return null;
        }
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху