using System; using System.Linq; using System.Reflection; using System.Collections.Generic; using UnityEngine; using Oxide.Core; using Oxide.Core.Plugins; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Facepunch; using Rust; #region Changelogs and ToDo /********************************************************************** * * 1.0.0 : - Initial release * 1.1.0 : - patch & Randomising egg injection * 1.1.1 : - Added config settings for egg randomiser * - Added a gathermultiplier block for eggs (1) to cancel multipliers from Gathermanaer and Zlevels) * 1.1.2 : - Patched to make sure 1st egg is chosen if multiple eggs where triggered * 1.1.3 : - Recalculated the hard limit of 1 egg on gathering * 1.1.4 : - Fix for egg sequence giving diffrent eggs * 1.1.5 : - Patched for double codeing to fix Gold egg issue * 1.1.6 : - Reformatted position of egg cap limiting (timing) * - Default eggs now displays egg types instead of shortname in chat * - Added support for custom egg naming through cfg - Added Eggnames to language file for messages * - Added Egg amount limits per type through cfg * **********************************************************************/ #endregion namespace Oxide.Plugins { [Info("Eggs", "Krungh Crow", "1.1.6")] [Description("Harvest eggs from chickens to upgrade")] class Eggs : RustPlugin { #region Variables const string Chat_Perm = "eggs.chat"; ulong chaticon = 0; string prefix; bool Debug = false; bool ShowMsg = true; string RandomEgg; string EggName; bool EggSucces; #endregion #region Configuration void Init() { if (!LoadConfigVariables()) { Puts("Config file issue detected. Please delete file, or check syntax and fix."); return; } permission.RegisterPermission(Chat_Perm, this); Debug = configData.PlugCFG.Debug; ShowMsg = configData.PlugCFG.Msg; prefix = "[Eggs] : "; if (Debug) Puts($"[Debug] Debug is activated if unintentional disable this in the config !"); } private ConfigData configData; class ConfigData { [JsonProperty(PropertyName = "Main config")] public SettingsPlugin PlugCFG = new SettingsPlugin(); [JsonProperty(PropertyName = "Egg injection Settings")] public EggSettings EggCFG = new EggSettings(); [JsonProperty(PropertyName = "Max eggs when using multiplier plugins")] public Multipliers EggMax = new Multipliers(); [JsonProperty(PropertyName = "Custom egg names (suggest to keep default)")] public CustomNames EggNaming = new CustomNames(); } class SettingsPlugin { [JsonProperty(PropertyName = "Debug")] public bool Debug = false; [JsonProperty(PropertyName = "Show Chat messages")] public bool Msg = true; } class EggSettings { [JsonProperty(PropertyName = "Chance on Egg Injection (0-100)")] public float RandomEgg = 50f; [JsonProperty(PropertyName = "Chance on Regular Egg (0-100)")] public float RandomEggRegular = 60f; [JsonProperty(PropertyName = "Chance on Bronze Egg (0-100)")] public float RandomEggBronze = 30f; [JsonProperty(PropertyName = "Chance on Silver Egg (0-100)")] public float RandomEggSilver = 20f; [JsonProperty(PropertyName = "Chance on Golden Egg (0-100)")] public float RandomEggGold = 10f; [JsonProperty(PropertyName = "Default Egg")] public string DefaultEgg = "easter.paintedeggs"; } class Multipliers { [JsonProperty(PropertyName = "Max Regular Eggs")] public int MaxRegular = 1; [JsonProperty(PropertyName = "Max Bronze Eggs")] public int MaxBronze = 1; [JsonProperty(PropertyName = "Max Silver Eggs")] public int MaxSilver = 1; [JsonProperty(PropertyName = "Max Golden Eggs")] public int MaxGolden = 1; } class CustomNames { [JsonProperty(PropertyName = "Regular egg")] public string NameRegular = "EGG"; [JsonProperty(PropertyName = "Bronze egg")] public string NameBronze = "BRONZE EGG"; [JsonProperty(PropertyName = "Silver egg")] public string NameSilver = "SILVER EGG"; [JsonProperty(PropertyName = "Gold egg")] public string NameGold = "GOLD EGG"; } private bool LoadConfigVariables() { try { configData = Config.ReadObject(); } catch { return false; } SaveConf(); return true; } protected override void LoadDefaultConfig() { Puts("Fresh install detected Creating a new config file."); configData = new ConfigData(); SaveConf(); } void SaveConf() => Config.WriteObject(configData, true); #endregion #region LanguageAPI protected override void LoadDefaultMessages() { lang.RegisterMessages(new Dictionary { ["EggRegular"] = "Egg", ["EggBronze"] = "Bronze EGG", ["EggSilver"] = "Silver EGG", ["EggGold"] = "Gold EGG", ["Info"] = "\nAvailable Commands\n/egg info : Shows info on version/author and commands", ["InvalidInput"] = "Please enter a valid command!", ["FoundEgg"] = "You found a {0}", ["Version"] = "Version : V", ["NoPermission"] = "You do not have permission to use that command!", }, this); } #endregion #region Commands [ChatCommand("egg")] private void cmdPrimary(BasePlayer player, string command, string[] args) { if (!permission.UserHasPermission(player.UserIDString, Chat_Perm)) { Player.Message(player, prefix + string.Format(msg("NoPermission", player.UserIDString)), chaticon); if (Debug) Puts($"[Debug] {player} had no permission for using Commands"); return; } if (args.Length == 0) { Player.Message(player, prefix + string.Format(msg("InvalidInput", player.UserIDString)), chaticon); } else { if (args[0].ToLower() == "info") { Player.Message(player, prefix + string.Format(msg("Version", player.UserIDString)) + this.Version.ToString() + " By : " + this.Author.ToString() + msg("Info") , chaticon); return; } else { Player.Message(player, prefix + string.Format(msg("InvalidInput", player.UserIDString)), chaticon); } } } #endregion #region Hooks #region Egg injection void OnEntitySpawned(BaseCorpse corpse) { var dispenser = corpse.GetComponent(); if (dispenser != null && dispenser.ToString().Contains("chicken.corpse") && (UnityEngine.Random.Range(0f, 1f) <= configData.EggCFG.RandomEgg / 100)) { EggSucces = false; if (UnityEngine.Random.Range(0f, 1f) <= configData.EggCFG.RandomEggGold / 100) { RandomEgg = "easter.goldegg"; EggName = lang.GetMessage("EggGold", this); EggSucces = true; } else if (UnityEngine.Random.Range(0f, 1f) <= configData.EggCFG.RandomEggSilver / 100) { RandomEgg = "easter.silveregg"; EggName = lang.GetMessage("EggSilver", this); EggSucces = true; } else if (UnityEngine.Random.Range(0f, 1f) <= configData.EggCFG.RandomEggBronze / 100) { RandomEgg = "easter.bronzeegg"; EggName = lang.GetMessage("EggBronze", this); EggSucces = true; } else if (UnityEngine.Random.Range(0f, 1f) <= configData.EggCFG.RandomEggRegular / 100) { RandomEgg = "easter.paintedeggs"; EggName = lang.GetMessage("EggRegular", this); EggSucces = true; } else if(!EggSucces) { RandomEgg = configData.EggCFG.DefaultEgg; if (RandomEgg.Contains("easter.paintedeggs")) { EggName = lang.GetMessage("EggRegular", this); } if (RandomEgg.Contains("easter.bronzeegg")) { EggName = lang.GetMessage("EggBronze", this); } if (RandomEgg.Contains("easter.silveregg")) { EggName = lang.GetMessage("EggSilver", this); } if (RandomEgg.Contains("easter.goldegg")) { EggName = lang.GetMessage("EggGold", this); } if (Debug) Puts($"{corpse} was injected with a [{EggName}] (EggSucces was false)"); } Item egg = ItemManager.CreateByName(RandomEgg, 1, 0); ItemAmount EggInfo = new ItemAmount() { itemDef = egg.info, amount = 1, startAmount = 1 }; dispenser.containedItems.Add(EggInfo); dispenser.Initialize(); if (Debug) Puts($"{corpse} was injected with a [{EggName}]"); return; } return; } #endregion #region egg skin handling - messages - egg limit void OnDispenserGather(ResourceDispenser dispenser, BaseEntity entity, Item item) //dispencer = resourcedispenser | entity is player | item is items harvested { BasePlayer player = entity.ToPlayer(); if (player == null || dispenser == null || entity == null || item == null) return; if (dispenser.ToString().Contains("chicken.corpse")) { if (item.info.itemid == -126305173)//easter.paintedeggs { item.name = configData.EggNaming.NameRegular; item.skin = 2588614999UL;//Egg item.MarkDirty(); if (ShowMsg) Player.Message(player, prefix + string.Format(msg("FoundEgg", player.UserIDString), EggName), chaticon); EggName = lang.GetMessage("EggRegular", this); if (item.amount > configData.EggMax.MaxRegular) { if (Debug) Puts($"[{item.amount} {EggName}(s)] was reduced to {configData.EggMax.MaxRegular}"); item.UseItem(item.amount - configData.EggMax.MaxRegular); } } else if (item.info.itemid == 844440409)//Bronze Egg { item.name = configData.EggNaming.NameBronze; item.MarkDirty(); EggName = lang.GetMessage("EggBronze", this); if (ShowMsg) Player.Message(player, prefix + string.Format(msg("FoundEgg", player.UserIDString), EggName), chaticon); if (item.amount > configData.EggMax.MaxBronze) { if (Debug) Puts($"[{item.amount} {EggName}(s)] was reduced to {configData.EggMax.MaxBronze}"); item.UseItem(item.amount - configData.EggMax.MaxBronze); } } else if (item.info.itemid == 1757265204)//Silver Egg { item.name = configData.EggNaming.NameSilver; item.MarkDirty(); EggName = lang.GetMessage("EggSilver", this); if (ShowMsg) Player.Message(player, prefix + string.Format(msg("FoundEgg", player.UserIDString), EggName), chaticon); if (item.amount > configData.EggMax.MaxSilver) { if (Debug) Puts($"[{item.amount} {EggName}(s)] was reduced to {configData.EggMax.MaxSilver}"); item.UseItem(item.amount - configData.EggMax.MaxSilver); } } else if (item.info.itemid == -1002156085)//Gold Egg { item.name = configData.EggNaming.NameGold; item.MarkDirty(); EggName = lang.GetMessage("EggGold", this); if (ShowMsg) Player.Message(player, prefix + string.Format(msg("FoundEgg", player.UserIDString), EggName), chaticon); if (item.amount > configData.EggMax.MaxGolden) { if (Debug) Puts($"[{item.amount} {EggName}(s)] was reduced to {configData.EggMax.MaxGolden}"); item.UseItem(item.amount - configData.EggMax.MaxGolden); } } } return; } #endregion #endregion #region Message helper private string msg(string key, string id = null) => lang.GetMessage(key, this, id); #endregion } }