Jump to content

laodu

Member
  • Posts

    975
  • Joined

  • Last visited

  • Days Won

    2

Everything posted by laodu

  1. Hello, Can someone make a couple of changes in one basic plugin? Please reply if you can, I can tip of course After installing the plugin and running it on the server, not a single row with the player was created in the database. And also, when entering the command, the deposit displays a message that 100 has been accrued, even if I enter deposit 1000 And also when viewing the balance of the player displays 100 credits /***********************************************************************************************************************/ /*** DO NOT edit this file! Edit the files under `oxide/config` and/or `oxide/lang`, created once plugin has loaded. ***/ /*** Please note, support cannot be provided if the plugin has been modified. Please use a fresh copy if modified. ***/ /***********************************************************************************************************************/ //#define DEBUG using System; using System.Collections.Generic; using System.Data.SQLite; using System.IO; using System.Linq; using MySql.Data.MySqlClient; using Newtonsoft.Json; using Oxide.Core; using Oxide.Core.Configuration; using Oxide.Core.Libraries.Covalence; namespace Oxide.Plugins { [Info("Economics", "Wulf", "4.0.0")] [Description("Basic economics system and economy API")] public class Economics : CovalencePlugin { #region Configuration private Configuration _config; public class MySqlConfig { public string Server = "localhost"; public string Username = "root"; public string Password = ""; public string Database = "economics"; } public class Configuration { [JsonProperty("Balance limit for accounts (0.0 to disable)")] public double BalanceLimit = 0.0; [JsonProperty("Balance limit for accounts (0 to disable)")] private int BalanceLimitOld { set { BalanceLimit = Convert.ToDouble(value); } } // TODO: From version 3.9.1; remove eventually [JsonProperty("Negative balance limit for accounts (0.0 to disable)")] public double NegativeBalanceLimit; [JsonProperty("Negative balance limit for accounts (0 to disable)")] public int NegativeBalanceLimitOld { set { NegativeBalanceLimit = Convert.ToDouble(value); } } // TODO: From version 3.9.1; remove eventually [JsonProperty("Remove unused accounts")] public bool RemoveUnused = true; [JsonProperty("Log transactions to file")] public bool LogTransactions = false; [JsonProperty("Starting account balance (0.0 or higher)")] public double StartingBalance = 1000.0; [JsonProperty("Starting account balance (0 or higher)")] private int StartingBalanceOld { set { StartingBalance = Convert.ToDouble(value); } } // TODO: From version 3.9.1; remove eventually [JsonProperty("Wipe balances on new save file")] public bool WipeOnNewSave = false; [JsonProperty("Store data in SQLite instead of data files")] public bool UseSqLite = false; [JsonProperty("Store data in MySQL instead of data files")] public bool UseMySql = false; [JsonProperty("MySQL configuration, if using MySQL")] public MySqlConfig MySql = new MySqlConfig(); public string ToJson() => JsonConvert.SerializeObject(this); public Dictionary<string, object> ToDictionary() => JsonConvert.DeserializeObject<Dictionary<string, object>>(ToJson()); } protected override void LoadDefaultConfig() => _config = new Configuration(); protected override void LoadConfig() { base.LoadConfig(); try { _config = Config.ReadObject<Configuration>(); if (_config == null) { throw new JsonException(); } if (!_config.ToDictionary().Keys.SequenceEqual(Config.ToDictionary(x => x.Key, x => x.Value).Keys)) { LogWarning("Configuration appears to be outdated; updating and saving"); SaveConfig(); } } catch { LogWarning($"Configuration file {Name}.json is invalid; using defaults"); LoadDefaultConfig(); } } protected override void SaveConfig() { LogWarning($"Configuration changes saved to {Interface.Oxide.ConfigDirectory}{Path.DirectorySeparatorChar}{Name}.json"); Config.WriteObject(_config, true); } #endregion Configuration #region Stored Data private DynamicConfigFile _oldStoredData; private KeyValuePair<double, double> _balanceLimits; private MySqlConnection _mysqlConnection; private SQLiteConnection _sqlConnection; private StoredData _storedData; private bool _changed; private string _connectionStr; private class StoredData { public readonly Dictionary<string, double> Balances = new Dictionary<string, double>(); } private void SaveData() { if (_changed) { Log("Saving balances for players..."); Interface.Oxide.DataFileSystem.WriteObject(Name, _storedData); // TODO: Try/catch potential IOException _changed = false; } } private void OnServerSave() => SaveData(); private void Unload() => SaveData(); #endregion Stored Data #region Localization protected override void LoadDefaultMessages() { lang.RegisterMessages(new Dictionary<string, string> { ["CommandBalance"] = "balance", ["CommandDeposit"] = "deposit", ["CommandSetBalance"] = "SetBalance", ["CommandTransfer"] = "transfer", ["CommandWithdraw"] = "withdraw", ["CommandWipe"] = "ecowipe", ["DataSaved"] = "Economics data saved!", ["DataWiped"] = "Economics data wiped!", ["DepositedToAll"] = "Deposited {0:C} total ({1:C} each) to {2} player(s)", ["LogDeposit"] = "{0:C} deposited to {1}", ["LogSetBalance"] = "{0:C} set as balance for {1}", ["LogTransfer"] = "{0:C} transferred to {1} from {2}", ["LogWithdrawl"] = "{0:C} withdrawn from {1}", ["NegativeBalance"] = "Balance can not be negative!", ["NotAllowed"] = "You are not allowed to use the '{0}' command", ["NoPlayersFound"] = "No players found with name or ID '{0}'", ["PlayerBalance"] = "Balance for {0}: {1:C}", ["PlayerLacksMoney"] = "'{0}' does not have enough money!", ["PlayersFound"] = "Multiple players were found, please specify: {0}", ["ReceivedFrom"] = "You have received {0} from {1}", ["SetBalanceForAll"] = "Balance set to {0:C} for {1} player(s)", ["TransactionFailed"] = "Transaction failed! Make sure amount is above 0", ["TransferredTo"] = "{0} transferred to {1}", ["TransferredToAll"] = "Transferred {0:C} total ({1:C} each) to {2} player(s)", ["TransferToSelf"] = "You can not transfer money yourself!", ["UsageBalance"] = "{0} - check your balance", ["UsageBalanceOthers"] = "{0} <player name or id> - check balance of a player", ["UsageDeposit"] = "{0} <player name or id> <amount> - deposit amount to player", ["UsageSetBalance"] = "Usage: {0} <player name or id> <amount> - set balance for player", ["UsageTransfer"] = "Usage: {0} <player name or id> <amount> - transfer money to player", ["UsageWithdraw"] = "Usage: {0} <player name or id> <amount> - withdraw money from player", ["UsageWipe"] = "Usage: {0} - wipe all economics data", ["YouLackMoney"] = "You do not have enough money!", ["YouLostMoney"] = "You lost: {0:C}", ["YouReceivedMoney"] = "You received: {0:C}", ["YourBalance"] = "Your balance is: {0:C}", ["WithdrawnForAll"] = "Withdrew {0:C} total ({1:C} each) from {2} player(s)", ["ZeroAmount"] = "Amount cannot be zero" }, this); } #endregion Localization #region Initialization private const string PermissionBalance = "economics.balance"; private const string PermissionDeposit = "economics.deposit"; private const string PermissionDepositAll = "economics.depositall"; private const string PermissionSetBalance = "economics.setbalance"; private const string PermissionSetBalanceAll = "economics.setbalanceall"; private const string PermissionTransfer = "economics.transfer"; private const string PermissionTransferAll = "economics.transferall"; private const string PermissionWithdraw = "economics.withdraw"; private const string PermissionWithdrawAll = "economics.withdrawall"; private const string PermissionWipe = "economics.wipe"; private void Init() { // Register universal chat/console commands AddLocalizedCommand(nameof(CommandBalance)); AddLocalizedCommand(nameof(CommandDeposit)); AddLocalizedCommand(nameof(CommandSetBalance)); AddLocalizedCommand(nameof(CommandTransfer)); AddLocalizedCommand(nameof(CommandWithdraw)); AddLocalizedCommand(nameof(CommandWipe)); // Register permissions for commands permission.RegisterPermission(PermissionBalance, this); permission.RegisterPermission(PermissionDeposit, this); permission.RegisterPermission(PermissionDepositAll, this); permission.RegisterPermission(PermissionSetBalance, this); permission.RegisterPermission(PermissionSetBalanceAll, this); permission.RegisterPermission(PermissionTransfer, this); permission.RegisterPermission(PermissionTransferAll, this); permission.RegisterPermission(PermissionWithdraw, this); permission.RegisterPermission(PermissionWithdrawAll, this); permission.RegisterPermission(PermissionWipe, this); if (_config.UseSqLite && _config.UseMySql) { LogWarning("Both SQLite and MySQL databases are enabled; defaulting to SQLite for data storage"); } if (_config.UseMySql || _config.UseSqLite) { Unsubscribe(nameof(OnServerSave)); Unsubscribe(nameof(Unload)); } bool emptyDatabase = true; if (_config.UseSqLite) { _connectionStr = $"Data Source={Interface.Oxide.DataDirectory}{Path.DirectorySeparatorChar}{Name}.db;"; _sqlConnection = new SQLiteConnection(_connectionStr); _sqlConnection.Open(); emptyDatabase = CheckDatabase(); } else if (_config.UseMySql) { _connectionStr = $"server={_config.MySql.Server};uid={_config.MySql.Username};pwd={_config.MySql.Password};database={_config.MySql.Database};"; _mysqlConnection = new MySqlConnection(_connectionStr); _mysqlConnection.Open(); emptyDatabase = CheckDatabase(); } if ((!_config.UseMySql && !_config.UseSqLite)) { // Load existing data and migrate old data format _oldStoredData = Interface.Oxide.DataFileSystem.GetFile(Name); try { Dictionary<ulong, double> temp = _oldStoredData.ReadObject<Dictionary<ulong, double>>(); try { _storedData = new StoredData(); foreach (KeyValuePair<ulong, double> old in temp) { if (!_storedData.Balances.ContainsKey(old.Key.ToString())) { _storedData.Balances.Add(old.Key.ToString(), old.Value); } } _changed = true; } catch { // Ignore } } catch { _storedData = _oldStoredData.ReadObject<StoredData>(); _changed = true; } List<string> playerData = new List<string>(_storedData.Balances.Keys); // Check for and set any balances over maximum allowed if (_config.BalanceLimit > 0) { foreach (string playerId in playerData) { if (_storedData.Balances[playerId] > _config.BalanceLimit) { _storedData.Balances[playerId] = _config.BalanceLimit; _changed = true; } } } // Check for and remove any inactive player balance data if (_config.RemoveUnused) { foreach (string playerId in playerData) { if (_storedData.Balances[playerId].Equals(_config.StartingBalance)) { _storedData.Balances.Remove(playerId); _changed = true; } } } } if (_config.UseSqLite) { if (emptyDatabase) { // Migrate/import the data file, if present foreach (KeyValuePair<string, double> playerData in _storedData.Balances) { using (SQLiteConnection connection = new SQLiteConnection(_connectionStr)) { connection.Open(); string query = $"INSERT INTO balances VALUES ('{playerData.Key}', {playerData.Value})"; using (SQLiteCommand sqlCommand = new SQLiteCommand(query, connection)) { sqlCommand.ExecuteNonQuery(); } } } } else if (_config.RemoveUnused) { Log("Reading data from SQLite database..."); // Read the storedData from SQLite _storedData = new StoredData(); using (SQLiteConnection connection = new SQLiteConnection(_connectionStr)) { connection.Open(); using (SQLiteCommand sqlCommand = new SQLiteCommand("SELECT DISTINCT playerid, value FROM balances", connection)) using (SQLiteDataReader reader = sqlCommand.ExecuteReader()) { while (reader.Read()) { string playerId = reader.GetString(0); double balance = reader.GetDouble(1); _storedData.Balances.Add(playerId, balance); } } } // Check for and remove any inactive player balance data foreach (string playerId in new List<string>(_storedData.Balances.Keys)) { if (_storedData.Balances[playerId].Equals(_config.StartingBalance)) { using (SQLiteConnection connection = new SQLiteConnection(_connectionStr)) { connection.Open(); using (SQLiteCommand sqlCommand = new SQLiteCommand($"DELETE FROM balances WHERE playerid='{playerId}'", connection)) { sqlCommand.ExecuteNonQuery(); } } } } _storedData = new StoredData(); } } else if (_config.UseMySql) { if (emptyDatabase) { // Migrate/import the data file, if present foreach (KeyValuePair<string, double> playerData in _storedData.Balances) { using (MySqlConnection connection = new MySqlConnection(_connectionStr)) { connection.Open(); string query = $"INSERT INTO balances VALUES ('{playerData.Key}', {playerData.Value})"; using (MySqlCommand sqlCommand = new MySqlCommand(query, connection)) { sqlCommand.ExecuteNonQuery(); } } } } else if (_config.RemoveUnused) { Log("Reading data from MySQL database..."); _storedData = new StoredData(); using (MySqlConnection connection = new MySqlConnection(_connectionStr)) { connection.Open(); using (MySqlCommand sqlCommand = new MySqlCommand("SELECT DISTINCT playerid, value FROM balances", connection)) using (MySqlDataReader reader = sqlCommand.ExecuteReader()) { while (reader.Read()) { string playerId = reader.GetString(0); double balance = reader.GetDouble(1); _storedData.Balances.Add(playerId, balance); } } } // Check for and remove any inactive player balance data foreach (string playerId in new List<string>(_storedData.Balances.Keys)) { if (_storedData.Balances[playerId].Equals(_config.StartingBalance)) { using (MySqlConnection connection = new MySqlConnection(_connectionStr)) { connection.Open(); using (MySqlCommand sqlCommand = new MySqlCommand($"DELETE FROM balances WHERE playerid='{playerId}'", connection)) { sqlCommand.ExecuteNonQuery(); } } } } _storedData = new StoredData(); } } _balanceLimits = new KeyValuePair<double, double>(_config.NegativeBalanceLimit, _config.BalanceLimit); } private bool CheckDatabase() { // Return true if database is empty or non-existent bool found = false; if (_config.UseSqLite) { using (SQLiteConnection connection = new SQLiteConnection(_connectionStr)) { connection.Open(); using (SQLiteCommand command = new SQLiteCommand("SELECT name FROM sqlite_master WHERE type='table' AND name='balances'", connection)) using (SQLiteDataReader reader = command.ExecuteReader()) { while (reader.Read()) { found = true; } } } if (!found) { SQLiteCommand command = new SQLiteCommand("DROP TABLE IF EXISTS balances", _sqlConnection); command.ExecuteNonQuery(); command = new SQLiteCommand("CREATE TABLE balances (playerid varchar(32) PRIMARY KEY, value DOUBLE DEFAULT 0)", _sqlConnection); command.ExecuteNonQuery(); return true; } } else if (_config.UseMySql) { using (MySqlConnection connection = new MySqlConnection(_connectionStr)) { connection.Open(); using (MySqlCommand command = new MySqlCommand($"SELECT * FROM information_schema.tables WHERE table_schema='{_config.MySql.Database}' AND table_name='balances' LIMIT 1;", connection)) using (MySqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { found = true; } } } if (!found) { MySqlCommand command = new MySqlCommand("DROP TABLE IF EXISTS balances", _mysqlConnection); command.ExecuteNonQuery(); command = new MySqlCommand("CREATE TABLE balances (playerid varchar(32) PRIMARY KEY, value DOUBLE DEFAULT 0)", _mysqlConnection); command.ExecuteNonQuery(); return true; } } return !found; } private void OnNewSave() { if (_config.WipeOnNewSave) { if (_config.UseSqLite) { SQLiteCommand command = new SQLiteCommand("DROP TABLE IF EXISTS balances", _sqlConnection); command.ExecuteNonQuery(); command = new SQLiteCommand("CREATE TABLE balances (playerid varchar(32) PRIMARY KEY, value DOUBLE DEFAULT 0)", _sqlConnection); command.ExecuteNonQuery(); } else if (_config.UseMySql) { SQLiteCommand command = new SQLiteCommand("DROP TABLE IF EXISTS balances", _sqlConnection); command.ExecuteNonQuery(); command = new SQLiteCommand("CREATE TABLE balances (playerid varchar(32) PRIMARY KEY, value DOUBLE DEFAULT 0)", _sqlConnection); command.ExecuteNonQuery(); } else { _storedData.Balances.Clear(); _changed = true; } Interface.Call("OnEconomicsDataWiped"); } } #endregion Initialization #region API Methods private double Balance(string playerId) { if (string.IsNullOrEmpty(playerId)) { LogWarning("Balance method called without a valid player ID"); return 0.0; } double balance = _config.StartingBalance; if (_config.UseSqLite) { using (SQLiteConnection connection = new SQLiteConnection(_connectionStr)) { connection.Open(); using (SQLiteCommand sqlCommand = new SQLiteCommand($"SELECT value FROM balances WHERE playerid='{playerId}'", connection)) using (SQLiteDataReader reader = sqlCommand.ExecuteReader()) { while (reader.Read()) { balance = reader.GetDouble(0); } } } } else if (_config.UseMySql) { using (MySqlConnection connection = new MySqlConnection(_connectionStr)) { connection.Open(); using (MySqlCommand sqlCommand = new MySqlCommand($"SELECT value FROM balances WHERE playerid='{playerId}'", connection)) using (MySqlDataReader reader = sqlCommand.ExecuteReader()) { while (reader.Read()) { balance = reader.GetDouble(0); } } } } else { _storedData.Balances.TryGetValue(playerId, out balance); } // TODO: Handle potential database read failure; check if balance changed or not return balance; } private double Balance(ulong playerId) => Balance(playerId.ToString()); private KeyValuePair<double, double> BalanceLimits() => _balanceLimits; private bool Deposit(string playerId, double amount) { if (string.IsNullOrEmpty(playerId)) { LogWarning("Deposit method called without a valid player ID"); return false; } if (amount > 0 && SetBalance(playerId, amount + Balance(playerId))) { Interface.Call("OnEconomicsDeposit", playerId, amount); if (_config.LogTransactions) { LogToFile("transactions", $"[{DateTime.Now}] {GetLang("LogDeposit", null, amount, playerId)}", this); } return true; } return false; } private bool Deposit(ulong playerId, double amount) => Deposit(playerId.ToString(), amount); private bool SetBalance(string playerId, double amount) { if (string.IsNullOrEmpty(playerId)) { LogWarning("SetBalance method called without a valid player ID"); return false; } amount = Math.Round(amount, 2); if (amount < 0 && _config.NegativeBalanceLimit == 0) { return false; } if (_config.BalanceLimit > 0 && amount > _config.BalanceLimit) { amount = _config.BalanceLimit; } else if (_config.NegativeBalanceLimit < 0 && amount < _config.NegativeBalanceLimit) { amount = _config.NegativeBalanceLimit; } double oldAmount = Balance(playerId); if (oldAmount > _config.StartingBalance) { if (_config.UseSqLite) { using (SQLiteConnection connection = new SQLiteConnection(_connectionStr)) { connection.Open(); //string query = $"UPDATE balances SET value={amount} WHERE playerid='{playerId}'"; //string query = $"INSERT INTO balances VALUES ('{playerId}', {amount})"; //string query = $"INSERT INTO balances (playerid, value) VALUES ('{playerId}', {amount})" // + "ON CONFLICT (playerid) DO UPDATE SET value=excluded.value"; string query = $"REPLACE INTO balances (playerid, value) VALUES('{playerId}', {amount})"; using (SQLiteCommand sqlCommand = new SQLiteCommand(query, connection)) { sqlCommand.ExecuteNonQuery(); } } } else if (_config.UseMySql) { using (MySqlConnection connection = new MySqlConnection(_connectionStr)) { connection.Open(); //string query = $"UPDATE balances SET value={amount} WHERE playerid='{playerId}'"; //string query = $"INSERT INTO balances VALUES ('{playerId}', {amount})"; //string query = $"INSERT INFO balances VALUES ('{playerId}', {amount})" // + $"ON DUPLICATE KEY UPDATE playerid='{playerId}', value={amount}"; string query = $"REPLACE INTO balances (playerid, value) VALUES('{playerId}', {amount})"; using (MySqlCommand sqlCommand = new MySqlCommand(query, connection)) { sqlCommand.ExecuteNonQuery(); } } } else { if (_storedData.Balances.ContainsKey(playerId)) { _storedData.Balances[playerId] = amount; } else { _storedData.Balances.Add(playerId, amount); } _changed = true; } Interface.Call("OnEconomicsBalanceUpdated", playerId, amount, oldAmount); Interface.CallDeprecatedHook("OnBalanceChanged", "OnEconomicsBalanceUpdated", new DateTime(2023, 1, 1), playerId, amount); if (_config.LogTransactions) { LogToFile("transactions", $"[{DateTime.Now}] {GetLang("LogSetBalance", null, amount, playerId)}", this); } } return true; } private bool SetBalance(ulong playerId, double amount) => SetBalance(playerId.ToString(), amount); private bool Transfer(string playerId, string targetId, double amount) { if (string.IsNullOrEmpty(playerId)) { LogWarning("Transfer method called without a valid player ID"); return false; } if (Withdraw(playerId, amount) && Deposit(targetId, amount)) { Interface.Call("OnEconomicsTransfer", playerId, targetId, amount); if (_config.LogTransactions) { LogToFile("transactions", $"[{DateTime.Now}] {GetLang("LogTransfer", null, amount, targetId, playerId)}", this); } return true; } return false; } private bool Transfer(ulong playerId, ulong targetId, double amount) { return Transfer(playerId.ToString(), targetId.ToString(), amount); } private bool Withdraw(string playerId, double amount) { if (string.IsNullOrEmpty(playerId)) { LogWarning("Withdraw method called without a valid player ID"); return false; } double balance = Balance(playerId); if (amount >= 0 || balance <= _config.NegativeBalanceLimit && _config.NegativeBalanceLimit < 0) { if (balance >= amount && SetBalance(playerId, balance - amount) || _config.NegativeBalanceLimit <= balance - amount && SetBalance(playerId, balance - amount)) { Interface.Call("OnEconomicsWithdrawl", playerId, amount); if (_config.LogTransactions) { LogToFile("transactions", $"[{DateTime.Now}] {GetLang("LogWithdrawl", null, amount, playerId)}", this); } return true; } } return false; } private bool Withdraw(ulong playerId, double amount) => Withdraw(playerId.ToString(), amount); #endregion API Methods #region Commands #region Balance Command private void CommandBalance(IPlayer player, string command, string[] args) { if (args != null && args.Length > 0) { if (!player.HasPermission(PermissionBalance)) { Message(player, "NotAllowed", command); return; } IPlayer target = FindPlayer(args[0], player); if (target == null) { Message(player, "UsageBalance", command); return; } Message(player, "PlayerBalance", target.Name, Balance(target.Id)); return; } if (player.IsServer) { Message(player, "UsageBalanceOthers", command); } else { Message(player, "YourBalance", Balance(player.Id)); } } #endregion Balance Command #region Deposit Command private void CommandDeposit(IPlayer player, string command, string[] args) { if (!player.HasPermission(PermissionDeposit)) { Message(player, "NotAllowed", command); return; } if (args == null || args.Length <= 1) { Message(player, "UsageDeposit", command); return; } double amount; double.TryParse(args[1], out amount); if (amount <= 0) { Message(player, "ZeroAmount"); return; } if (args[0] == "*") { if (!player.HasPermission(PermissionDepositAll)) { Message(player, "NotAllowed", command); return; } int receivers = 0; if (_config.UseSqLite) { using (SQLiteConnection connection = new SQLiteConnection(_connectionStr)) { connection.Open(); // TODO: INSERT OR UPDATE string query = $"UPDATE balances SET value=value+{amount}"; using (SQLiteCommand sqlCommand = new SQLiteCommand(query, connection)) { sqlCommand.ExecuteNonQuery(); } using (SQLiteCommand sqlCommand = new SQLiteCommand("SELECT COUNT(*) FROM balances", connection)) using (SQLiteDataReader reader = sqlCommand.ExecuteReader()) { while (reader.Read()) { receivers = reader.GetInt32(0); } } } } else if (_config.UseMySql) { using (MySqlConnection connection = new MySqlConnection(_connectionStr)) { connection.Open(); // TODO: INSERT OR UPDATE string query = $"UPDATE balances SET value=value+{amount}"; using (MySqlCommand sqlCommand = new MySqlCommand(query, connection)) { sqlCommand.ExecuteNonQuery(); } using (MySqlCommand sqlCommand = new MySqlCommand("SELECT COUNT(*) FROM balances", connection)) using (MySqlDataReader reader = sqlCommand.ExecuteReader()) { while (reader.Read()) { receivers = reader.GetInt32(0); } } } } else { foreach (string targetId in _storedData.Balances.Keys.ToList()) { if (Deposit(targetId, amount)) { receivers++; } } } Message(player, "DepositedToAll", amount * receivers, amount, receivers); } else { IPlayer target = FindPlayer(args[0], player); if (target == null) { return; } if (Deposit(target.Id, amount)) { Message(player, "PlayerBalance", target.Name, Balance(target.Id)); } else { Message(player, "TransactionFailed", target.Name); } } } #endregion Deposit Command #region Set Balance Command private void CommandSetBalance(IPlayer player, string command, string[] args) { if (!player.HasPermission(PermissionSetBalance)) { Message(player, "NotAllowed", command); return; } if (args == null || args.Length <= 1) { Message(player, "UsageSetBalance", command); return; } double amount; double.TryParse(args[1], out amount); if (amount < 0) { Message(player, "NegativeBalance"); return; } if (args[0] == "*") { if (!player.HasPermission(PermissionSetBalanceAll)) { Message(player, "NotAllowed", command); return; } int receivers = 0; if (_config.UseSqLite) { using (SQLiteConnection connection = new SQLiteConnection(_connectionStr)) { connection.Open(); // TODO: INSERT OR UPDATE string query = $"UPDATE balances SET value={amount}"; using (SQLiteCommand sqlCommand = new SQLiteCommand(query, connection)) { sqlCommand.ExecuteNonQuery(); } using (SQLiteCommand sqlCommand = new SQLiteCommand("SELECT COUNT(*) FROM balances", connection)) using (SQLiteDataReader reader = sqlCommand.ExecuteReader()) { while (reader.Read()) { receivers = reader.GetInt32(0); } } } } else if (_config.UseMySql) { using (MySqlConnection connection = new MySqlConnection(_connectionStr)) { connection.Open(); // TODO: INSERT OR UPDATE string query = $"UPDATE balances SET value={amount}"; using (MySqlCommand sqlCommand = new MySqlCommand(query, connection)) { sqlCommand.ExecuteNonQuery(); } using (MySqlCommand sqlCommand = new MySqlCommand("SELECT COUNT(*) FROM balances", connection)) using (MySqlDataReader reader = sqlCommand.ExecuteReader()) { while (reader.Read()) { receivers = reader.GetInt32(0); } } } } else { foreach (string targetId in _storedData.Balances.Keys.ToList()) { if (SetBalance(targetId, amount)) { receivers++; } } } Message(player, "SetBalanceForAll", amount, receivers); } else { IPlayer target = FindPlayer(args[0], player); if (target == null) { return; } if (SetBalance(target.Id, amount)) { Message(player, "PlayerBalance", target.Name, Balance(target.Id)); } else { Message(player, "TransactionFailed", target.Name); } } } #endregion Set Balance Command #region Transfer Command private void CommandTransfer(IPlayer player, string command, string[] args) { if (!player.HasPermission(PermissionTransfer)) { Message(player, "NotAllowed", command); return; } if (args == null || args.Length <= 1) { Message(player, "UsageTransfer", command); return; } double amount; double.TryParse(args[1], out amount); if (amount <= 0) { Message(player, "ZeroAmount"); return; } if (args[0] == "*") { if (!player.HasPermission(PermissionTransferAll)) { Message(player, "NotAllowed", command); return; } if (!Withdraw(player.Id, amount)) { Message(player, "YouLackMoney"); return; } int receivers = players.Connected.Count(); double splitAmount = amount /= receivers; foreach (IPlayer target in players.Connected) { if (Deposit(target.Id, splitAmount)) { if (target.IsConnected) { Message(target, "ReceivedFrom", splitAmount, player.Name); } } } Message(player, "TransferedToAll", amount, splitAmount, receivers); } else { IPlayer target = FindPlayer(args[0], player); if (target == null) { return; } if (target.Equals(player)) { Message(player, "TransferToSelf"); return; } if (!Withdraw(player.Id, amount)) { Message(player, "YouLackMoney"); return; } if (Deposit(target.Id, amount)) { Message(player, "TransferredTo", amount, target.Name); Message(target, "ReceivedFrom", amount, player.Name); } else { Message(player, "TransactionFailed", target.Name); } } } #endregion Transfer Command #region Withdraw Command private void CommandWithdraw(IPlayer player, string command, string[] args) { if (!player.HasPermission(PermissionWithdraw)) { Message(player, "NotAllowed", command); return; } if (args == null || args.Length <= 1) { Message(player, "UsageWithdraw", command); return; } double amount; double.TryParse(args[1], out amount); if (amount <= 0) { Message(player, "ZeroAmount"); return; } if (args[0] == "*") { if (!player.HasPermission(PermissionWithdrawAll)) { Message(player, "NotAllowed", command); return; } int receivers = 0; if (_config.UseSqLite) { using (SQLiteConnection connection = new SQLiteConnection(_connectionStr)) { connection.Open(); // TODO: INSERT OR UPDATE string query = $"UPDATE balances SET value=value-{amount}"; using (SQLiteCommand sqlCommand = new SQLiteCommand(query, connection)) { sqlCommand.ExecuteNonQuery(); } using (SQLiteCommand sqlCommand = new SQLiteCommand("SELECT COUNT(*) FROM balances", connection)) using (SQLiteDataReader reader = sqlCommand.ExecuteReader()) { while (reader.Read()) { receivers = reader.GetInt32(0); } } } } else if (_config.UseMySql) { using (MySqlConnection connection = new MySqlConnection(_connectionStr)) { connection.Open(); // TODO: INSERT OR UPDATE string query = $"UPDATE balances SET value=value-{amount}"; using (MySqlCommand sqlCommand = new MySqlCommand(query, connection)) { sqlCommand.ExecuteNonQuery(); } using (MySqlCommand sqlCommand = new MySqlCommand("SELECT COUNT(*) FROM balances", connection)) using (MySqlDataReader reader = sqlCommand.ExecuteReader()) { while (reader.Read()) { receivers = reader.GetInt32(0); } } } } else { foreach (string targetId in _storedData.Balances.Keys.ToList()) { if (Withdraw(targetId, amount)) { receivers++; } } } Message(player, "WithdrawnForAll", amount * receivers, amount, receivers); } else { IPlayer target = FindPlayer(args[0], player); if (target == null) { return; } if (Withdraw(target.Id, amount)) { Message(player, "PlayerBalance", target.Name, Balance(target.Id)); } else { Message(player, "YouLackMoney", target.Name); } } } #endregion Withdraw Command #region Wipe Command private void CommandWipe(IPlayer player, string command, string[] args) { if (!player.HasPermission(PermissionWipe)) { Message(player, "NotAllowed", command); return; } if (_config.UseSqLite) { using (SQLiteConnection connection = new SQLiteConnection(_connectionStr)) { connection.Open(); using (SQLiteCommand sqlCommand = new SQLiteCommand("DELETE FROM balances", connection)) { sqlCommand.ExecuteNonQuery(); } } } else if (_config.UseMySql) { using (MySqlConnection connection = new MySqlConnection(_connectionStr)) { connection.Open(); using (MySqlCommand sqlCommand = new MySqlCommand("DELETE FROM balances", connection)) { sqlCommand.ExecuteNonQuery(); } } } else { _storedData = new StoredData(); _changed = true; SaveData(); } Message(player, "DataWiped"); Interface.Call("OnEconomicsDataWiped", player); } #endregion Wipe Command #endregion Commands #region Helpers private void AddLocalizedCommand(string command) { foreach (string language in lang.GetLanguages(this)) { foreach (KeyValuePair<string, string> message in lang.GetMessages(language, this)) { if (message.Key.Equals(command) && !string.IsNullOrEmpty(message.Value)) { AddCovalenceCommand(message.Value, command); } } } } private IPlayer FindPlayer(string playerNameOrId, IPlayer player) { IPlayer[] foundPlayers = players.FindPlayers(playerNameOrId).ToArray(); if (foundPlayers.Length > 1) { Message(player, "PlayersFound", string.Join(", ", foundPlayers.Select(p => p.Name).Take(10).ToArray()).Truncate(60)); return null; } IPlayer target = foundPlayers.Length == 1 ? foundPlayers[0] : null; if (target == null) { Message(player, "NoPlayersFound", playerNameOrId); return null; } return target; } private string GetLang(string langKey, string playerId = null, params object[] args) { return string.Format(lang.GetMessage(langKey, this, playerId), args); } private void Message(IPlayer player, string textOrLang, params object[] args) { if (player.IsConnected) { string message = GetLang(textOrLang, player.Id, args); player.Reply(message != textOrLang ? message : textOrLang); } } #endregion Helpers } } #region Extension Methods namespace Oxide.Plugins.EconomicsExtensionMethods { public static class ExtensionMethods { public static T Clamp<T>(this T val, T min, T max) where T : IComparable<T> { if (val.CompareTo(min) < 0) { return min; } if (val.CompareTo(max) > 0) { return max; } return val; } } } #endregion Extension Methods
2.1m

Downloads

Total number of downloads.

9.8k

Customers

Total customers served.

143k

Files Sold

Total number of files sold.

3m

Payments Processed

Total payments processed.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.