Jump to content

laodu

Member
  • Posts

    846
  • Joined

  • Last visited

Everything posted by laodu

  1. zh-CN
  2. Can you provide an executable configuration file for default-DefaultProfiles.json that other friends have set up? I can slowly compare, translate, and understand the others. It would be great if I could get your help.
  3. If you could provide me with English text on the GUI, it would be ideal to include explanations for each function. That's also very helpful for me,
  4. If you could provide a simple tutorial, I would greatly appreciate it!
  5. I translate English through translation software. I am a disaster with English, and there are too many professional terms on the UI. I use translation software one by one to translate, and the results will be different from the original meaning. This makes me very distressed! Thank you very much for replying to me so quickly.
  6. I really like this plugin. After purchasing it, I realized that there are no language file settings. Do you have detailed configuration instructions? My native language is not English, and the UI is all English, which is really a disaster for me!
  7. All settings, including the SQL database, are correct, and it is possible to connect to the SQL database and create basic tables. The real problem is that players cannot add or reduce new playback data, including economics, when using it
  8. I have set it to true, but the player's economic data will not be added to the SQL database. And economics cannot be used either.
  9. 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
1.7m

Downloads

Total number of downloads.

7.9k

Customers

Total customers served.

119.5k

Files Sold

Total number of files sold.

2.4m

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.