using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using On.RoR2;
using On.RoR2.UI.LogBook;
using R2API;
using R2API.Utils;
using RiskOfOptions;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using RoR2;
using RoR2.Achievements;
using RoR2.UI.LogBook;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Rendering;
using oigsItemsMod.Base_Classes;
using oigsItemsMod.Buffs;
using oigsItemsMod.Items;
using oigsItemsMod.SoftDependencies;
using oigsItemsMod.Utils;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("oigsItemsMod")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("oigsItemsMod")]
[assembly: AssemblyTitle("oigsItemsMod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace oigsItemsMod
{
public static class ConfigManager
{
public static ConfigEntry<bool> customStatsOn;
public static ConfigValues bloodyPillowValues;
public static ConfigValues clownNoseValues;
public static ConfigValues companyShieldGeneratorValues;
public static ConfigValues contractOfCommandValues;
public static ConfigValues devouringJarValues;
public static ConfigValues eternalDreadValues;
public static ConfigValues prettyStopwatchValues;
public static ConfigValues quantumBonsaiTreeValues;
public static ConfigValues relentlessMaliceValues;
public static ConfigValues shatteredBladeValues;
public static ConfigValues taintedWillValues;
public static ConfigValues telescopicSightValues;
public static ConfigValues twilightSpearValues;
public static ConfigValues weedWackerValues;
private static Dictionary<string, ConfigEntry<bool>> itemsEnabled = new Dictionary<string, ConfigEntry<bool>>();
public static void Init(ConfigFile config)
{
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.Init();
}
customStatsOn = config.Bind<bool>("Items", "use custom stats", false, "you must enable this if you want to use custom config values for items");
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(customStatsOn, delegate(bool newValue)
{
customStatsOn.Value = newValue;
});
}
bloodyPillowValues = new ConfigValues(customStatsOn, "on killing an enemy there is a 50% chance of gaining or losing <style=cIsUtility>percentStat%</style><style=cStack>(+percentStat% per stack)</style> attack, health, attack speed, or speed. there is an equal chance for each to occur.", new string[1] { "percentStat.float*100" });
clownNoseValues = new ConfigValues(customStatsOn, "increase attack by <style=cIsDamage>percentDamage%</style> <style=cStack>(+percentDamageStack% per stack)</style> BUT if you take damage from <style=cIsUtility>damageSources</style> enemies within <style=cIsUtility>damageSourcesTime</style> <style=cStack>(+damageSourcesTimeStack per stack)</style> seconds the game crashes", new string[5] { "percentDamageStack.float*100", "percentDamage.float*100", "damageSourcesTimeStack.float*1", "damageSourcesTime.float*1", "damageSources.int*" });
companyShieldGeneratorValues = new ConfigValues(customStatsOn, "hitting an enemy at max health gives you <style=cIsHealth>barrier</style> equal to <style=cIsDamage>percentStack%</style><style=cStack> (+percentStack% per stack)</style> of the damage dealt", new string[1] { "percentStack.float*100" });
contractOfCommandValues = new ConfigValues(customStatsOn, "on taking damage deal <style=cIsDamage>allyDamage%</style> of damage taken to allies <style=cIsUtility>radiusm</style> <style=cStack>(+radiusm per stack)</style> away from you and gain <style=cIsDamage>attackGain%</style> <style=cStack>(+attackGain% per stack)</style> damage and <style=cIsUtility>speedGain%</style> <style=cStack>(+speedGain% per stack)</style> speed per ally damaged", new string[4] { "allyDamage.float*100", "attackGain.float*100", "speedGain.float*100", "radius.float*1" });
devouringJarValues = new ConfigValues(customStatsOn, "build up buff stacks based on damage taken, at 100 stacks gain <style=cIsUtility>armorAmount</style> <style=cStack>(+armorAmount per stack)</style> armor and your next hit applies <style=cIsDamage>blotAmount</style> <style=cStack>(+blotAmount per stack)</style> blot and removes 100 buff stacks", new string[2] { "armorAmount.float*1", "blotAmount.int*" });
eternalDreadValues = new ConfigValues(customStatsOn, "every hitInterval hits apply <style=cIsDamage>blotAmount</style> <style=cStack>(+blotAmount per stack)</style> blot on hit and heal <style=cIsHealing>healAmount</style> <style=cStack>(+healAmount per stack)</style> per 10 blot on the target", new string[3] { "blotAmount.int*", "hitInterval.int*", "healAmount.float*1" });
prettyStopwatchValues = new ConfigValues(customStatsOn, "increase movement speed by <style=cIsUtility>percentSpeed%</style> <style=cStack>(+percentSpeed% per stack)</style> every speedTime seconds, the next time you deal damage deal bonus damage equal to (speed * buff stacks * <style=cIsDamage>damageIncreasePerStack</style> <style=cStack>(+damageIncreasePerStack per stack)</style>)% of attack", new string[3] { "percentSpeed.float*100", "speedTime.float*1", "damageIncreasePerStack.float*1" });
quantumBonsaiTreeValues = new ConfigValues(customStatsOn, "<style=cIsUtility>baseDamageChance%</style> chance to heal <style=cIsHealing>percentHeal%</style> <style=cStack>(+percentHeal% per stack)</style> of your max health on hit. the chance increases by <style=cIsUtility>1%</style> for each <style=cIsDamage>overDamageChance%</style> damage over 100% dealt", new string[3] { "baseDamageChance.float*1", "overDamageChance.float*1", "percentHeal.float*100" });
relentlessMaliceValues = new ConfigValues(customStatsOn, "gain a stacking buff that gives <style=cIsDamage>attackSpeedMult%</style> attack speed when hitting enemies with blot, max <style=cIsUtility>maxStacks</style> <style=cStack>(+maxStacks per stack)</style> stacks, gain more stacks per hit based on missing health\n\ngain a blotChance% chance to apply blot to enemies hit", new string[3] { "attackSpeedMult.float*100", "maxStacks.int*", "blotChance.float*1" });
shatteredBladeValues = new ConfigValues(customStatsOn, "<style=cIsUtility>blotChance%</style> <style=cStack>(+blotChance% per stack)</style> chance to apply blot on hit. blot inflicts damage equal to blot times 40% of attacker's base damage when taking damage", new string[1] { "blotChance.float*1" });
taintedWillValues = new ConfigValues(customStatsOn, "reduce damage taken from enemies with blot by <style=cIsUtility>damageReductionStack%</style> <style=cStack>(+damageReductionStack% per stack)</style> (approaches 50%)\n\nyou have a blotChance% chance to apply blot to enemies that damage you", new string[2] { "damageReductionStack.float*100", "blotChance.float*1" });
telescopicSightValues = new ConfigValues(customStatsOn, "deal <style=cIsDamage>distanceDamage%</style> <style=cStack>(+distanceDamage% per stack)</style> bonus damage per distanceIntervalm away from the enemy you are", new string[2] { "distanceInterval.float*1", "distanceDamage.float*100" });
twilightSpearValues = new ConfigValues(customStatsOn, "when hitting an enemy above percentHealth% health apply <style=cIsDamage>blotAmount</style> <style=cStack>(+blotAmount per stack)</style> blot", new string[2] { "blotAmount.int*", "percentHealth.float*100" });
weedWackerValues = new ConfigValues(customStatsOn, "every hitInterval hits deal <style=cIsDamage>baseDamage</style> <style=cStack>(+baseDamage per stack)</style> bonus damage, each time this occurs increase it's damage by <style=cIsDamage>damageIncrease</style> <style=cStack>(+damageIncrease per stack)</style> until the next stage", new string[3] { "hitInterval.int*", "baseDamage.float*1", "damageIncrease.float*1" });
itemsEnabled.Add("BloodyPillow", config.Bind<bool>("Items", "enable Bloody Pillow", true, "enable this item in game"));
bloodyPillowValues.AddValue<ConfigEntry<float>>("percentStat", config.Bind<float>("Items", "Bloody Pillow stat change", 0.05f, "percent stat change"));
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(itemsEnabled["BloodyPillow"], delegate(bool newValue)
{
itemsEnabled["BloodyPillow"].Value = newValue;
});
}
itemsEnabled.Add("ClownNose", config.Bind<bool>("Items", "enable Clown Nose", false, "enable this item in game"));
clownNoseValues.AddValue<ConfigEntry<float>>("percentDamage", config.Bind<float>("Items", "Clown Nose percent damage", 10f, "percent damage increase"));
clownNoseValues.AddValue<ConfigEntry<float>>("percentDamageStack", config.Bind<float>("Items", "Clown Nose percent damage stack", 5f, "percent damage increase per stack"));
clownNoseValues.AddValue<ConfigEntry<int>>("damageSources", config.Bind<int>("Items", "Clown Nose damage sources", 3, "number of damage sources"));
clownNoseValues.AddValue<ConfigEntry<float>>("damageSourcesTime", config.Bind<float>("Items", "Clown Nose damage source time", 4f, "time until damage sources resets"));
clownNoseValues.AddValue<ConfigEntry<float>>("damageSourcesTimeStack", config.Bind<float>("Items", "Clown Nose damage course time stack", 2f, "damage source time increase per stack"));
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(itemsEnabled["ClownNose"], delegate(bool newValue)
{
itemsEnabled["ClownNose"].Value = newValue;
});
}
itemsEnabled.Add("CompanyShieldGenerator", config.Bind<bool>("Items", "enable Company Shield Generator", true, "enable this item in game"));
companyShieldGeneratorValues.AddValue<ConfigEntry<float>>("percentStack", config.Bind<float>("Items", "Company Shield Generator percent damage", 0.2f, "percent of damage to give barrier"));
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(itemsEnabled["CompanyShieldGenerator"], delegate(bool newValue)
{
itemsEnabled["CompanyShieldGenerator"].Value = newValue;
});
}
itemsEnabled.Add("ContractOfCommand", config.Bind<bool>("Items", "enable Contract Of Command", true, "enable this item in game"));
contractOfCommandValues.AddValue<ConfigEntry<float>>("allyDamage", config.Bind<float>("Items", "Contract of Command damage to allies", 0.5f, "percent of damage taken dealt to allies"));
contractOfCommandValues.AddValue<ConfigEntry<float>>("attackGain", config.Bind<float>("Items", "Contract of Command attack increase", 0.5f, "percent attack increase"));
contractOfCommandValues.AddValue<ConfigEntry<float>>("speedGain", config.Bind<float>("Items", "Contract of Command speed increase", 0.5f, "percent speed increase"));
contractOfCommandValues.AddValue<ConfigEntry<float>>("radius", config.Bind<float>("Items", "Contract of Command ally damage radius", 10f, "damage allies up to this distance away"));
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(itemsEnabled["ContractOfCommand"], delegate(bool newValue)
{
itemsEnabled["ContractOfCommand"].Value = newValue;
});
}
itemsEnabled.Add("DevouringJar", config.Bind<bool>("Items", "enable Devouring Jar", true, "enable this item in game"));
devouringJarValues.AddValue<ConfigEntry<float>>("armorAmount", config.Bind<float>("Items", "Devouring Jar armor amount", 100f, "armor at 100 buff stacks"));
devouringJarValues.AddValue<ConfigEntry<int>>("blotAmount", config.Bind<int>("Items", "Devouring Jar blot amount", 50, "blot applied at 100 buff stacks"));
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(itemsEnabled["DevouringJar"], delegate(bool newValue)
{
itemsEnabled["DevouringJar"].Value = newValue;
});
}
itemsEnabled.Add("EternalDread", config.Bind<bool>("Items", "enable Eternal Dread", true, "enable this item in game"));
eternalDreadValues.AddValue<ConfigEntry<int>>("blotAmount", config.Bind<int>("Items", "Eternal Dread blot amount", 10, "blot applied"));
eternalDreadValues.AddValue<ConfigEntry<int>>("hitInterval", config.Bind<int>("Items", "Eternal Dread hit interval", 3, "number of hits required to apply blot"));
eternalDreadValues.AddValue<ConfigEntry<float>>("healAmount", config.Bind<float>("Items", "Eternal Dread heal amount", 5f, "amount to heal per 10 blot"));
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(itemsEnabled["EternalDread"], delegate(bool newValue)
{
itemsEnabled["EternalDread"].Value = newValue;
});
}
itemsEnabled.Add("PrettyStopwatch", config.Bind<bool>("Items", "enable Pretty Stopwatch", true, "enable this item in game"));
prettyStopwatchValues.AddValue<ConfigEntry<float>>("percentSpeed", config.Bind<float>("Items", "Pretty Stopwatch percent speed", 0.05f, "percent speed increase per item stack"));
prettyStopwatchValues.AddValue<ConfigEntry<float>>("speedTime", config.Bind<float>("Items", "Pretty Stopwatch speed increase time", 3f, "seconds between gaining a buff stack"));
prettyStopwatchValues.AddValue<ConfigEntry<float>>("damageIncreasePerStack", config.Bind<float>("Items", "Pretty Stopwatch damage increase per stack", 4f, "multiplier for speed damage per item stack"));
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(itemsEnabled["PrettyStopwatch"], delegate(bool newValue)
{
itemsEnabled["PrettyStopwatch"].Value = newValue;
});
}
itemsEnabled.Add("QuantumBonsaiTree", config.Bind<bool>("Items", "enable Quantum Bonsai Tree", true, "enable this item in game"));
quantumBonsaiTreeValues.AddValue<ConfigEntry<float>>("baseDamageChance", config.Bind<float>("Items", "Quantum Bonsai Tree base damage chance", 5f, "base percent chance of healing"));
quantumBonsaiTreeValues.AddValue<ConfigEntry<float>>("overDamageChance", config.Bind<float>("Items", "Quantum Bonsai Tree damage chance", 100f, "per percent damage to increase heal chance"));
quantumBonsaiTreeValues.AddValue<ConfigEntry<float>>("percentHeal", config.Bind<float>("Items", "Quantum Bonsai heal", 0.3f, "percent of max health to heal"));
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(itemsEnabled["QuantumBonsaiTree"], delegate(bool newValue)
{
itemsEnabled["QuantumBonsaiTree"].Value = newValue;
});
}
itemsEnabled.Add("RelentlessMalice", config.Bind<bool>("Items", "enable Relentless Malice", true, "enable this item in game"));
relentlessMaliceValues.AddValue<ConfigEntry<int>>("attackSpeedMult", config.Bind<float>("Items", "Relentless Malice attack speed", 0.04f, "attack speed increase per buff stack"));
relentlessMaliceValues.AddValue<ConfigEntry<int>>("maxStacks", config.Bind<int>("Items", "Relentless Malice max stacks", 10, "max buff stacks per item stack"));
relentlessMaliceValues.AddValue<ConfigEntry<float>>("blotChance", config.Bind<float>("Items", "Relentless Malice blot chance", 5f, "chance to apply blot on hit"));
relentlessMaliceValues.AddValue<ConfigEntry<float>>("timer", config.Bind<float>("Items", "Relentless Malice timer", 3f, "time buff is applied for"));
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(itemsEnabled["RelentlessMalice"], delegate(bool newValue)
{
itemsEnabled["RelentlessMalice"].Value = newValue;
});
}
itemsEnabled.Add("ShatteredBlade", config.Bind<bool>("Items", "enable Shattered Blade", true, "enable this item in game"));
shatteredBladeValues.AddValue<ConfigEntry<float>>("blotChance", config.Bind<float>("Items", "Shattered Blade blot chance", 20f, "chance to apply blot"));
shatteredBladeValues.AddValue<ConfigEntry<int>>("blightAmount", config.Bind<int>("Items", "Shattered Blade blot amount", 1, "blot applied"));
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(itemsEnabled["ShatteredBlade"], delegate(bool newValue)
{
itemsEnabled["ShatteredBlade"].Value = newValue;
});
}
itemsEnabled.Add("TaintedWill", config.Bind<bool>("Items", "enable Tainted Will", true, "enable this item in game"));
taintedWillValues.AddValue<ConfigEntry<float>>("damageReductionStack", config.Bind<float>("Items", "Tainted Will damage reduction stack", 0.05f, "damage reduction increase per stack"));
taintedWillValues.AddValue<ConfigEntry<float>>("blotChance", config.Bind<float>("Items", "Tainted Will blot chance", 10f, "chance to apply blot on damage taken"));
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(itemsEnabled["TaintedWill"], delegate(bool newValue)
{
itemsEnabled["TaintedWill"].Value = newValue;
});
}
itemsEnabled.Add("TelescopicSight", config.Bind<bool>("Items", "enable Telescopic Sight", true, "enable this item in game"));
telescopicSightValues.AddValue<ConfigEntry<float>>("distanceInterval", config.Bind<float>("Items", "Telescopic Sight distance interval", 20f, "distance interval of damage bonus"));
telescopicSightValues.AddValue<ConfigEntry<float>>("distanceDamage", config.Bind<float>("Items", "Telescopic Sight distance damage", 0.2f, "damage per distance interval"));
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(itemsEnabled["TelescopicSight"], delegate(bool newValue)
{
itemsEnabled["TelescopicSight"].Value = newValue;
});
}
itemsEnabled.Add("TwilightSpear", config.Bind<bool>("Items", "enable Twilight Spear", true, "enable this item in game"));
twilightSpearValues.AddValue<ConfigEntry<int>>("blotAmount", config.Bind<int>("Items", "Twilight Spear blot amount", 1, "blot applied"));
twilightSpearValues.AddValue<ConfigEntry<float>>("percentHealth", config.Bind<float>("Items", "Twilight Spear percent health", 0.5f, "percent health to apply blot at"));
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(itemsEnabled["TwilightSpear"], delegate(bool newValue)
{
itemsEnabled["TwilightSpear"].Value = newValue;
});
}
itemsEnabled.Add("WeedWacker", config.Bind<bool>("Items", "enable Weed Wacker", true, "enable this item in game"));
weedWackerValues.AddValue<ConfigEntry<int>>("hitInterval", config.Bind<int>("Items", "Weed Wacker hit interval", 5, "number attacks required for effect to occur"));
weedWackerValues.AddValue<ConfigEntry<float>>("baseDamage", config.Bind<float>("Items", "Weed Wacker damage", 20f, "damage dealt when effect occurs"));
weedWackerValues.AddValue<ConfigEntry<float>>("damageIncrease", config.Bind<float>("Items", "Weed Wacker damage increase", 2f, "damage increase when effect occurs"));
if (RiskOfOptionsDep.enabled)
{
RiskOfOptionsDep.AddCheckBoxOption(itemsEnabled["WeedWacker"], delegate(bool newValue)
{
itemsEnabled["WeedWacker"].Value = newValue;
});
}
Run.onRunSetRuleBookGlobal += delegate(Run run, RuleBook rulebook)
{
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
foreach (KeyValuePair<string, ConfigEntry<bool>> item in itemsEnabled)
{
if (!item.Value.Value && run.availableItems.Contains(Main.ItemDict[item.Key].itemIndex))
{
run.availableItems.Remove(Main.ItemDict[item.Key].itemIndex);
}
}
};
}
}
public class ConfigValues
{
private Dictionary<string, ConfigEntry<float>> floatEntries;
private Dictionary<string, ConfigEntry<int>> intEntries;
private Dictionary<string, ConfigEntry<bool>> boolEntries;
private ConfigEntry<bool> useCustomStats;
private string descTemplate;
private string[] descPlaceHolders;
public string Description
{
get
{
string text = descTemplate;
for (int i = 0; i < descPlaceHolders.Length; i++)
{
string text2 = descPlaceHolders[i].Substring(descPlaceHolders[i].IndexOf('.'), descPlaceHolders[i].IndexOf('*') - descPlaceHolders[i].IndexOf('.'));
string text3 = descPlaceHolders[i].Substring(0, descPlaceHolders[i].IndexOf('.'));
string s = descPlaceHolders[i].Substring(descPlaceHolders[i].IndexOf('*') + 1);
switch (text2)
{
case ".float":
text = text.Replace(text3, (GetFloat(text3) * float.Parse(s)).ToString());
break;
case ".int":
text = text.Replace(text3, GetInt(text3).ToString());
break;
case ".bool":
text = text.Replace(text3, GetBool(text3).ToString());
break;
}
}
return text;
}
}
public ConfigValues(ConfigEntry<bool> useCustomStats, string descTemplate, string[] descPlaceHolders)
{
floatEntries = new Dictionary<string, ConfigEntry<float>>();
intEntries = new Dictionary<string, ConfigEntry<int>>();
boolEntries = new Dictionary<string, ConfigEntry<bool>>();
this.useCustomStats = useCustomStats;
this.descTemplate = descTemplate;
this.descPlaceHolders = descPlaceHolders;
}
public void AddValue<T>(string name, ConfigEntry<float> configEntry)
{
floatEntries.Add(name, configEntry);
}
public void AddValue<T>(string name, ConfigEntry<bool> configEntry)
{
boolEntries.Add(name, configEntry);
}
public void AddValue<T>(string name, ConfigEntry<int> configEntry)
{
intEntries.Add(name, configEntry);
}
public ConfigEntry<float> GetFloatConfig(string name)
{
return floatEntries[name];
}
public ConfigEntry<bool> GetBoolConfig(string name)
{
return boolEntries[name];
}
public ConfigEntry<int> GetIntConfig(string name)
{
return intEntries[name];
}
public float GetFloat(string name)
{
if (useCustomStats != null && useCustomStats.Value)
{
return floatEntries[name].Value;
}
return (float)((ConfigEntryBase)floatEntries[name]).DefaultValue;
}
public int GetInt(string name)
{
if (useCustomStats != null && useCustomStats.Value)
{
return intEntries[name].Value;
}
return (int)((ConfigEntryBase)intEntries[name]).DefaultValue;
}
public bool GetBool(string name)
{
if (useCustomStats != null && useCustomStats.Value)
{
return boolEntries[name].Value;
}
return (bool)((ConfigEntryBase)boolEntries[name]).DefaultValue;
}
}
[BepInDependency("com.bepis.r2api", "5.1.1")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.oig.oigsItems", "oigs items", "3.0.0")]
public class Main : BaseUnityPlugin
{
public const string ModGUID = "com.oig.oigsItems";
public const string ModName = "oigs items";
public const string ModVersion = "3.0.0";
public static AssetBundle Assets;
public static Dictionary<string, BuffDef> BuffDict = new Dictionary<string, BuffDef>();
public static Dictionary<string, ItemDef> ItemDict = new Dictionary<string, ItemDef>();
public void Awake()
{
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("oigsItemsMod.oigsitemsbundle"))
{
if (stream != null)
{
Assets = AssetBundle.LoadFromStream(stream);
}
}
SoftDepManager.Init();
OigsExtraEvents.Init();
Configs();
Instantiate();
Hooks();
}
public void Configs()
{
ConfigManager.Init(((BaseUnityPlugin)this).Config);
}
public void Hooks()
{
}
public void Instantiate()
{
VerifyItems(new TelescopicSight());
VerifyItems(new QuantumBonsaiTree());
VerifyItems(new CompanyShieldGenerator());
VerifyItems(new BloodyPillow());
VerifyItems(new ContractOfCommand());
VerifyItems(new ClownNose());
VerifyItems(new WeedWacker());
VerifyItems(new PrettyStopwatch());
VerifyItems(new DevouringJar());
VerifyItems(new EternalDread());
VerifyItems(new RelentlessMalice());
VerifyItems(new ShatteredBlade());
VerifyItems(new TaintedWill());
VerifyItems(new TwilightSpear());
VerifyBuffs(new ContractBuff());
VerifyBuffs(new WeedHitBuff());
VerifyBuffs(new WeedDamageBuff());
VerifyBuffs(new ClownNoseDebuff());
VerifyBuffs(new PrettyTimeBuff());
VerifyBuffs(new Blot());
VerifyBuffs(new DreadHitBuff());
VerifyBuffs(new DevouringJarBuff());
VerifyBuffs(new RelentlessMaliceBuff());
}
public void VerifyItems(ItemBase item)
{
item.Init();
ItemDict.Add(item.ItemLangTokenName, item.itemDef);
}
public void VerifyBuffs(BaseBuff buff)
{
buff.Init();
BuffDict.Add(buff.BuffName, buff.buffDef);
}
public void VerifyAchievements(AchievementBase achievement)
{
if (((BaseUnityPlugin)this).Config.Bind<bool>("Items", "enable" + achievement.AchievementNameToken, true, "Enable this achievement in game? Default: true").Value)
{
achievement.Init(((BaseUnityPlugin)this).Config);
}
}
}
internal class OigsExtraEvents
{
public delegate void OigsDamageEventHandler(DamageInfo damageInfo, CharacterBody attackerBody, CharacterBody victimBody);
public class OigsDamageEvents : MonoBehaviour, IOnIncomingDamageServerReceiver
{
public HealthComponent healthComponent;
public CharacterBody victimBody;
public void Start()
{
healthComponent = ((Component)this).GetComponent<HealthComponent>();
if (!Object.op_Implicit((Object)(object)healthComponent))
{
Object.Destroy((Object)(object)this);
}
else
{
victimBody = healthComponent.body;
}
}
public void OnIncomingDamageServer(DamageInfo damageInfo)
{
CharacterBody attackerBody = null;
if (Object.op_Implicit((Object)(object)damageInfo.attacker))
{
attackerBody = damageInfo.attacker.GetComponent<CharacterBody>();
}
OigsExtraEvents.BeforeDamageTaken?.Invoke(damageInfo, attackerBody, victimBody);
}
}
public static event OigsDamageEventHandler BeforeDamageTaken;
public static void Init()
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
HealthComponent.Awake += new hook_Awake(HealthComponent_Awake);
}
private static void HealthComponent_Awake(orig_Awake orig, HealthComponent self)
{
((Component)self).gameObject.AddComponent<OigsDamageEvents>();
orig.Invoke(self);
}
}
}
namespace oigsItemsMod.Utils
{
public static class ArrayHelper
{
public static T[] Append<T>(ref T[] array, List<T> list)
{
int num = array.Length;
int count = list.Count;
Array.Resize(ref array, num + count);
list.CopyTo(array, num);
return array;
}
public static Func<T[], T[]> AppendDel<T>(List<T> list)
{
return (T[] r) => Append(ref r, list);
}
}
internal class ItemHelper
{
public static RendererInfo[] ItemDisplaySetup(GameObject obj)
{
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
MeshRenderer[] componentsInChildren = obj.GetComponentsInChildren<MeshRenderer>();
RendererInfo[] array = (RendererInfo[])(object)new RendererInfo[componentsInChildren.Length];
for (int i = 0; i < componentsInChildren.Length; i++)
{
array[i] = new RendererInfo
{
defaultMaterial = ((Renderer)componentsInChildren[i]).material,
renderer = (Renderer)(object)componentsInChildren[i],
defaultShadowCastingMode = (ShadowCastingMode)1,
ignoreOverlays = false
};
}
return array;
}
}
}
namespace oigsItemsMod.SoftDependencies
{
internal class BetterUIDep
{
}
public static class RiskOfOptionsDep
{
public static bool enabled;
private static bool reloadLogBook;
public static void Init()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: Expected O, but got Unknown
ModSettingsManager.SetModDescription("oig's items settings", "com.oig.oigsItems", "oigs items");
ModSettingsManager.SetModIcon(Main.Assets.LoadAsset<Sprite>("Assets/profile/OigsItemsIcon.png"));
LogBookController.Awake += new hook_Awake(LogBookController_Awake);
}
private static void LogBookController_Awake(orig_Awake orig, LogBookController self)
{
orig.Invoke(self);
if (reloadLogBook)
{
reloadLogBook = false;
LogBookController.BuildStaticData();
}
}
public static void AddCheckBoxOption(ConfigEntry<bool> configEntry, Action<bool> onChanged = null)
{
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Expected O, but got Unknown
if (onChanged != null)
{
configEntry.SettingChanged += delegate
{
onChanged(configEntry.Value);
reloadLogBook = true;
};
onChanged(configEntry.Value);
reloadLogBook = true;
}
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(configEntry), "com.oig.oigsItems", "oigs items");
}
public static void AddIntOption(ConfigEntry<int> configEntry, int min, int max, Action<int> onChanged = null)
{
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Expected O, but got Unknown
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Expected O, but got Unknown
if (onChanged != null)
{
configEntry.SettingChanged += delegate
{
onChanged(configEntry.Value);
reloadLogBook = true;
};
onChanged(configEntry.Value);
reloadLogBook = true;
}
ModSettingsManager.AddOption((BaseOption)new IntSliderOption(configEntry, new IntSliderConfig
{
min = min,
max = max
}), "com.oig.oigsItems", "oigs items");
}
public static void AddFloatOption(ConfigEntry<float> configEntry, float min, float max, Action<float> onChanged = null)
{
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Expected O, but got Unknown
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0091: Expected O, but got Unknown
if (onChanged != null)
{
configEntry.SettingChanged += delegate
{
onChanged(configEntry.Value);
reloadLogBook = true;
};
onChanged(configEntry.Value);
reloadLogBook = true;
}
ModSettingsManager.AddOption((BaseOption)new StepSliderOption(configEntry, new StepSliderConfig
{
min = min,
max = max,
increment = 0.01f
}), "com.oig.oigsItems", "oigs items");
}
}
public static class SoftDepManager
{
public static void Init()
{
Dictionary<string, PluginInfo> pluginInfos = Chainloader.PluginInfos;
if (pluginInfos.ContainsKey("com.rune580.riskofoptions"))
{
RiskOfOptionsDep.enabled = true;
}
}
}
}
namespace oigsItemsMod.Items
{
internal class BloodyPillow : ItemBase
{
public override string ItemName => "Bloody Pillow";
public override string ItemLangTokenName => "BloodyPillow";
public override string ItemPickupDesc => "when killing an enemy randomly gain or lose attack, health, attack speed, or speed.";
public override string ItemFullDescription => ConfigManager.bloodyPillowValues.Description;
public override string ItemLore => "we all feel shame, the levels of shame vary though. somtimes by a lot and i mean A LOT.";
public override ItemTier Tier => (ItemTier)3;
public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[1] { (ItemTag)6 };
public override string ItemModelPath => "Assets/items/bloodypillow/BloodyPillow.prefab";
public override string ItemIconPath => "Assets/items/bloodypillow/BloodyPillow.png";
public override ItemDisplayRuleDict CreateItemDisplayRules()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
return new ItemDisplayRuleDict((ItemDisplayRule[])null);
}
public override void Hooks()
{
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Expected O, but got Unknown
CharacterBody.onBodyStartGlobal += CharacterBody_onBodyStartGlobal;
RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients);
GlobalEventManager.onCharacterDeathGlobal += GlobalEventManager_onCharacterDeathGlobal;
}
public override void Init()
{
CreateItemDisplayRules();
CreateLang();
CreateItem();
Hooks();
}
private void CharacterBody_onBodyStartGlobal(CharacterBody body)
{
if (Object.op_Implicit((Object)(object)body.inventory))
{
((Component)body.inventory).gameObject.AddComponent<BloodyPillowTracker>();
}
}
private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
{
if (Object.op_Implicit((Object)(object)sender.inventory) && GetCount(sender) > 0)
{
BloodyPillowTracker component = ((Component)sender.inventory).GetComponent<BloodyPillowTracker>();
if (Object.op_Implicit((Object)(object)component))
{
args.damageMultAdd += component.pillowStats[0];
args.healthMultAdd += component.pillowStats[1];
args.moveSpeedMultAdd += component.pillowStats[2];
args.attackSpeedMultAdd += component.pillowStats[3];
}
}
}
private void GlobalEventManager_onCharacterDeathGlobal(DamageReport report)
{
if (report.damageInfo.procCoefficient == 0f || report.damageInfo.rejected)
{
return;
}
CharacterBody attackerBody = report.attackerBody;
if (Object.op_Implicit((Object)(object)attackerBody) && Object.op_Implicit((Object)(object)attackerBody.inventory) && GetCount(attackerBody) > 0)
{
BloodyPillowTracker component = ((Component)attackerBody.inventory).GetComponent<BloodyPillowTracker>();
if (Object.op_Implicit((Object)(object)component))
{
int num = Random.Range(0, 4);
bool flag = Util.CheckRoll(50f, attackerBody.master);
component.pillowStats[num] += (flag ? ConfigManager.bloodyPillowValues.GetFloat("percentStat") : (ConfigManager.bloodyPillowValues.GetFloat("percentStat") * -1f));
}
}
}
}
internal class BloodyPillowTracker : MonoBehaviour
{
public float[] pillowStats = new float[4];
}
internal class ClownNose : ItemBase
{
public override string ItemName => "Clown Nose";
public override string ItemLangTokenName => "ClownNose";
public override string ItemPickupDesc => "increase attack by a lot BUT if you take damage from multiple enemies in a short time the game crashes";
public override string ItemFullDescription => ConfigManager.clownNoseValues.Description;
public override string ItemLore => "i swear it's funny";
public override ItemTier Tier => (ItemTier)3;
public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 };
public override string ItemModelPath => "Assets/items/clownnose/ClownNose.prefab";
public override string ItemIconPath => "Assets/items/clownnose/ClownNose.png";
public override ItemDisplayRuleDict CreateItemDisplayRules()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
return new ItemDisplayRuleDict((ItemDisplayRule[])null);
}
public override void Hooks()
{
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
CharacterBody.onBodyStartGlobal += CharacterBody_onBodyStartGlobal;
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients);
}
public override void Init()
{
CreateItemDisplayRules();
CreateLang();
CreateItem();
Hooks();
}
private void CharacterBody_onBodyStartGlobal(CharacterBody body)
{
if (Object.op_Implicit((Object)(object)body.inventory))
{
((Component)body.inventory).gameObject.AddComponent<ClownNoseTracker>();
}
}
private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
{
if (Object.op_Implicit((Object)(object)sender.inventory) && GetCount(sender) > 0)
{
args.damageMultAdd += ConfigManager.clownNoseValues.GetFloat("percentDamage") + ConfigManager.clownNoseValues.GetFloat("percentDamageStack") * (float)(GetCount(sender) - 1);
}
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
if (report.damageInfo.procCoefficient == 0f || report.damageInfo.rejected)
{
return;
}
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (!Object.op_Implicit((Object)(object)attackerBody) || !Object.op_Implicit((Object)(object)victimBody) || !victimBody.isPlayerControlled || !Object.op_Implicit((Object)(object)victimBody.inventory) || GetCount(victimBody) <= 0)
{
return;
}
ClownNoseTracker component = ((Component)victimBody.inventory).GetComponent<ClownNoseTracker>();
if (Object.op_Implicit((Object)(object)component) && !component.sources.Contains(attackerBody))
{
component.sources.Add(attackerBody);
component.timeLeft = ConfigManager.clownNoseValues.GetFloat("damageSourcesTime") + ConfigManager.clownNoseValues.GetFloat("damageSourcesTimeStack") * (float)(GetCount(victimBody) - 1);
if (NetworkServer.active)
{
victimBody.AddTimedBuff(Main.BuffDict["ClownNoseDebuff"], component.timeLeft);
}
}
}
}
internal class ClownNoseTracker : MonoBehaviour
{
public List<CharacterBody> sources = new List<CharacterBody>();
public float timeLeft = 0f;
public TeamIndex team;
private void FixedUpdate()
{
if (timeLeft > 0f)
{
timeLeft -= Time.fixedDeltaTime;
if (timeLeft <= 0f)
{
sources.Clear();
}
if (sources.Count >= ConfigManager.clownNoseValues.GetInt("damageSources"))
{
Application.Quit();
}
}
}
}
internal class CompanyShieldGenerator : ItemBase
{
private const float percentStackDefault = 0.2f;
private float percentStack = 0.2f;
public override string ItemName => "Company Shield Generator";
public override string ItemLangTokenName => "CompanyShieldGenerator";
public override string ItemPickupDesc => "hitting enemies that are at max health gives you barrier.";
public override string ItemFullDescription => ConfigManager.companyShieldGeneratorValues.Description;
public override string ItemLore => "personal projects are for building yourself up, company projects are for destroying the competition";
public override ItemTier Tier => (ItemTier)0;
public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[1] { (ItemTag)2 };
public override string ItemModelPath => "Assets/items/companyshieldgenerator/CompanyShieldGenerator.prefab";
public override string ItemIconPath => "Assets/items/companyshieldgenerator/CompanyShieldGenerator.png";
public override ItemDisplayRuleDict CreateItemDisplayRules()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
return new ItemDisplayRuleDict((ItemDisplayRule[])null);
}
public override void Hooks()
{
}
public override void Init()
{
CreateItemDisplayRules();
CreateLang();
CreateItem();
Hooks();
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
if (report.damageInfo.procCoefficient != 0f && !report.damageInfo.rejected)
{
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (Object.op_Implicit((Object)(object)attackerBody) && Object.op_Implicit((Object)(object)victimBody) && Object.op_Implicit((Object)(object)attackerBody.inventory) && GetCount(attackerBody) > 0 && report.combinedHealthBeforeDamage >= victimBody.maxHealth)
{
attackerBody.healthComponent.AddBarrier(report.damageDealt * ConfigManager.companyShieldGeneratorValues.GetFloat("percentStack") * (float)GetCount(attackerBody));
}
}
}
}
internal class ContractOfCommand : ItemBase
{
private float timer = 5f;
public override string ItemName => "Contract of Command";
public override string ItemLangTokenName => "ContractOfCommand";
public override string ItemPickupDesc => "on taking damage deal damage to nearby allies, gain damage and speed for a few seconds based on number of nearby alies";
public override string ItemFullDescription => ConfigManager.contractOfCommandValues.Description;
public override string ItemLore => "a true commander is contractually obligated to fight for a cause that they believe in because it pays good money";
public override ItemTier Tier => (ItemTier)3;
public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[2]
{
(ItemTag)1,
(ItemTag)3
};
public override string ItemModelPath => "Assets/items/contractofcommand/ContractOfCommand.prefab";
public override string ItemIconPath => "Assets/items/contractofcommand/ContractOfCommand.png";
public override ItemDisplayRuleDict CreateItemDisplayRules()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
return new ItemDisplayRuleDict((ItemDisplayRule[])null);
}
public override void Hooks()
{
CharacterBody.onBodyStartGlobal += CharacterBody_onBodyStartGlobal;
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
public override void Init()
{
CreateItemDisplayRules();
CreateLang();
CreateItem();
Hooks();
}
private void CharacterBody_onBodyStartGlobal(CharacterBody body)
{
if (Object.op_Implicit((Object)(object)body.inventory))
{
((Component)body.inventory).gameObject.AddComponent<ContractOfCommandTracker>();
}
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_0129: Unknown result type (might be due to invalid IL or missing references)
//IL_012e: Unknown result type (might be due to invalid IL or missing references)
//IL_013d: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
//IL_01ac: Expected O, but got Unknown
//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
//IL_0200: Unknown result type (might be due to invalid IL or missing references)
//IL_0205: Unknown result type (might be due to invalid IL or missing references)
//IL_020d: Unknown result type (might be due to invalid IL or missing references)
//IL_0222: Unknown result type (might be due to invalid IL or missing references)
//IL_0227: Unknown result type (might be due to invalid IL or missing references)
if (report.damageInfo.rejected)
{
return;
}
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (!Object.op_Implicit((Object)(object)attackerBody) || !Object.op_Implicit((Object)(object)victimBody) || !Object.op_Implicit((Object)(object)victimBody.inventory) || GetCount(victimBody) <= 0 || attackerBody.teamComponent.teamIndex == victimBody.teamComponent.teamIndex)
{
return;
}
ContractOfCommandTracker component = ((Component)victimBody.inventory).gameObject.GetComponent<ContractOfCommandTracker>();
if (!Object.op_Implicit((Object)(object)component))
{
return;
}
component.attack = ConfigManager.contractOfCommandValues.GetFloat("attackGain") * (float)GetCount(victimBody);
component.speed = ConfigManager.contractOfCommandValues.GetFloat("speedGain") * (float)GetCount(victimBody);
TeamMask val = default(TeamMask);
((TeamMask)(ref val)).AddTeam(victimBody.teamComponent.teamIndex);
HurtBox[] hurtBoxes = new SphereSearch
{
radius = ConfigManager.contractOfCommandValues.GetFloat("radius") * (float)GetCount(victimBody),
origin = victimBody.corePosition,
queryTriggerInteraction = (QueryTriggerInteraction)2,
mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask
}.RefreshCandidates().FilterCandidatesByDistinctHurtBoxEntities().FilterCandidatesByHurtBoxTeam(val)
.GetHurtBoxes();
List<HealthComponent> list = new List<HealthComponent>();
HurtBox[] array = hurtBoxes;
foreach (HurtBox val2 in array)
{
if (!list.Contains(val2.healthComponent) && (Object)(object)val2.healthComponent != (Object)(object)victimBody.healthComponent)
{
list.Add(val2.healthComponent);
DamageInfo val3 = new DamageInfo();
val3.damage = report.damageDealt * ConfigManager.contractOfCommandValues.GetFloat("allyDamage");
val3.attacker = ((Component)victimBody).gameObject;
val3.procCoefficient = 0f;
val3.procChainMask = default(ProcChainMask);
val3.crit = false;
val3.position = ((Component)val2).transform.position;
val3.damageColorIndex = (DamageColorIndex)3;
val3.inflictor = ((Component)victimBody).gameObject;
val3.damageType = DamageTypeCombo.op_Implicit((DamageType)0);
val2.healthComponent.TakeDamage(val3);
if (NetworkServer.active)
{
victimBody.AddTimedBuff(Main.BuffDict["ContractBuff"], timer);
}
}
}
}
}
internal class ContractOfCommandTracker : MonoBehaviour
{
public float attack = 0f;
public float speed = 0f;
}
internal class DevouringJar : ItemBase
{
public override string ItemName => "Devouring Jar";
public override string ItemLangTokenName => "DevouringJar";
public override string ItemPickupDesc => "build up buff stacks to gain armor and apply blot at 100 stacks";
public override string ItemFullDescription => ConfigManager.devouringJarValues.Description;
public override string ItemLore => "hey look, there's a little dude in this jar, he just eats everything i put in there\nhis name is Zar";
public override ItemTier Tier => (ItemTier)2;
public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[2]
{
(ItemTag)3,
(ItemTag)1
};
public override string ItemModelPath => "Assets/items/devouringjar/DevouringJar.prefab";
public override string ItemIconPath => "Assets/items/devouringjar/DevouringJar.png";
public override ItemDisplayRuleDict CreateItemDisplayRules()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
return new ItemDisplayRuleDict((ItemDisplayRule[])null);
}
public override void Hooks()
{
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
public override void Init()
{
CreateItemDisplayRules();
CreateLang();
CreateItem();
Hooks();
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
if (report.damageInfo.procCoefficient == 0f || report.damageInfo.rejected)
{
return;
}
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (!Object.op_Implicit((Object)(object)victimBody) || !Object.op_Implicit((Object)(object)victimBody.healthComponent) || !Object.op_Implicit((Object)(object)victimBody.inventory) || GetCount(victimBody) <= 0)
{
return;
}
int num = Mathf.FloorToInt(report.damageDealt / victimBody.maxHealth * 100f);
if (NetworkServer.active)
{
for (int i = 0; i < num; i++)
{
victimBody.AddBuff(Main.BuffDict["DevouringJarBuff"]);
}
}
}
}
internal class EternalDread : ItemBase
{
public override string ItemName => "Eternal Dread";
public override string ItemLangTokenName => "EternalDread";
public override string ItemPickupDesc => "apply blot and heal based on blot on enemy every 3 hits";
public override string ItemFullDescription => ConfigManager.eternalDreadValues.Description;
public override string ItemLore => "";
public override ItemTier Tier => (ItemTier)2;
public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 };
public override string ItemModelPath => "Assets/items/eternaldread/EternalDread.prefab";
public override string ItemIconPath => "Assets/items/eternaldread/EternalDread.png";
public override ItemDisplayRuleDict CreateItemDisplayRules()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
return new ItemDisplayRuleDict((ItemDisplayRule[])null);
}
public override void Hooks()
{
}
public override void Init()
{
CreateItemDisplayRules();
CreateLang();
CreateItem();
Hooks();
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
if (report.damageInfo.procCoefficient != 0f && !report.damageInfo.rejected)
{
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (Object.op_Implicit((Object)(object)attackerBody) && Object.op_Implicit((Object)(object)victimBody) && Object.op_Implicit((Object)(object)victimBody.healthComponent) && Object.op_Implicit((Object)(object)attackerBody.inventory) && GetCount(attackerBody) > 0 && NetworkServer.active)
{
attackerBody.AddBuff(Main.BuffDict["DreadHitBuff"]);
}
}
}
}
internal class PrettyStopwatch : ItemBase
{
public override string ItemName => "Pretty Stopwatch";
public override string ItemLangTokenName => "PrettyStopwatch";
public override string ItemPickupDesc => "increase movement speed every few seconds, the next time you deal damage deal bonus damage based on movement speed";
public override string ItemFullDescription => ConfigManager.prettyStopwatchValues.Description;
public override string ItemLore => "assassinate in style";
public override ItemTier Tier => (ItemTier)2;
public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[2]
{
(ItemTag)1,
(ItemTag)3
};
public override string ItemModelPath => "Assets/items/prettystopwatch/PrettyStopWatch.prefab";
public override string ItemIconPath => "Assets/items/prettystopwatch/PrettyStopwatch.png";
public override ItemDisplayRuleDict CreateItemDisplayRules()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
return new ItemDisplayRuleDict((ItemDisplayRule[])null);
}
public override void Hooks()
{
CharacterBody.onBodyInventoryChangedGlobal += CharacterBody_onBodyInventoryChangedGlobal;
}
public override void Init()
{
CreateItemDisplayRules();
CreateLang();
CreateItem();
Hooks();
}
private void CharacterBody_onBodyInventoryChangedGlobal(CharacterBody body)
{
body.AddItemBehavior<PrettyStopwatchTracker>(GetCount(body));
}
}
internal class PrettyStopwatchTracker : ItemBehavior
{
public float timerMax = 0f;
private float timer = 0f;
private void Start()
{
timerMax = ConfigManager.prettyStopwatchValues.GetFloat("speedTime");
}
private void FixedUpdate()
{
if (!Object.op_Implicit((Object)(object)base.body) || base.stack <= 0)
{
return;
}
timer += Time.fixedDeltaTime;
if (timer >= timerMax)
{
if (NetworkServer.active)
{
base.body.AddBuff(Main.BuffDict["PrettyTimeBuff"]);
}
timer = 0f;
}
}
}
internal class QuantumBonsaiTree : ItemBase
{
public override string ItemName => "Quantum Bonsai Tree";
public override string ItemLangTokenName => "QuantumBonsaiTree";
public override string ItemPickupDesc => "Chance to heal after dealing damage, chance increases with more damage.";
public override string ItemFullDescription => ConfigManager.quantumBonsaiTreeValues.Description;
public override string ItemLore => "idk man, i strapped a quantum computer to a bonsai tree, dont worry about it";
public override ItemTier Tier => (ItemTier)2;
public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[1] { (ItemTag)2 };
public override string ItemModelPath => "Assets/items/quantumbonsaitree/QuantumBonsaiTree.prefab";
public override string ItemIconPath => "Assets/items/quantumbonsaitree/QuantumBonsaiTree.png";
public override ItemDisplayRuleDict CreateItemDisplayRules()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
return new ItemDisplayRuleDict((ItemDisplayRule[])null);
}
public override void Hooks()
{
}
public override void Init()
{
CreateItemDisplayRules();
CreateLang();
CreateItem();
Hooks();
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
if (report.damageInfo.procCoefficient == 0f || report.damageInfo.rejected)
{
return;
}
CharacterBody attackerBody = report.attackerBody;
if (Object.op_Implicit((Object)(object)attackerBody) && Object.op_Implicit((Object)(object)attackerBody.inventory) && GetCount(attackerBody) > 0)
{
float num = report.damageDealt / attackerBody.damage * 100f - 100f;
if (Util.CheckRoll(ConfigManager.quantumBonsaiTreeValues.GetFloat("baseDamageChance") + (float)((num > 0f) ? ((int)Math.Floor(num / ConfigManager.quantumBonsaiTreeValues.GetFloat("overDamageChance"))) : 0), attackerBody.master))
{
attackerBody.healthComponent.Heal(ConfigManager.quantumBonsaiTreeValues.GetFloat("percentHeal") * (float)GetCount(attackerBody) * attackerBody.maxHealth, default(ProcChainMask), true);
}
}
}
}
internal class RelentlessMalice : ItemBase
{
public override string ItemName => "Relentless Malice";
public override string ItemLangTokenName => "RelentlessMalice";
public override string ItemPickupDesc => "gain stacking attack speed when hitting enemies with blot, gain more stacks at lower health";
public override string ItemFullDescription => ConfigManager.relentlessMaliceValues.Description;
public override string ItemLore => "";
public override ItemTier Tier => (ItemTier)1;
public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 };
public override string ItemModelPath => "Assets/items/relentlessmalice/RelentlessMalice.prefab";
public override string ItemIconPath => "Assets/items/relentlessmalice/RelentlessMalice.png";
public override ItemDisplayRuleDict CreateItemDisplayRules()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
return new ItemDisplayRuleDict((ItemDisplayRule[])null);
}
public override void Hooks()
{
}
public override void Init()
{
CreateItemDisplayRules();
CreateLang();
CreateItem();
Hooks();
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
if (report.damageInfo.procCoefficient == 0f || report.damageInfo.rejected)
{
return;
}
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (!Object.op_Implicit((Object)(object)attackerBody) || !Object.op_Implicit((Object)(object)victimBody) || !Object.op_Implicit((Object)(object)attackerBody.inventory) || GetCount(attackerBody) <= 0)
{
return;
}
if (Util.CheckRoll(ConfigManager.relentlessMaliceValues.GetFloat("blotChance"), attackerBody.master) && NetworkServer.active)
{
victimBody.AddBuff(Main.BuffDict["Blot"]);
}
if (!victimBody.HasBuff(Main.BuffDict["Blot"]) || !Object.op_Implicit((Object)(object)attackerBody.healthComponent))
{
return;
}
int num = Mathf.FloorToInt(1f + 9f / (attackerBody.healthComponent.fullHealth * -0.9f) * (attackerBody.healthComponent.health - attackerBody.healthComponent.fullHealth));
num = Mathf.Clamp(num, 1, 10);
if (!NetworkServer.active)
{
return;
}
for (int i = 0; i < num; i++)
{
if (attackerBody.GetBuffCount(Main.BuffDict["RelentlessMaliceBuff"]) < ConfigManager.relentlessMaliceValues.GetInt("maxStacks") * GetCount(attackerBody))
{
attackerBody.AddTimedBuff(Main.BuffDict["RelentlessMaliceBuff"], ConfigManager.relentlessMaliceValues.GetFloat("timer"));
}
}
}
}
internal class ShatteredBlade : ItemBase
{
public override string ItemName => "Shattered Blade";
public override string ItemLangTokenName => "ShatteredBlade";
public override string ItemPickupDesc => "chance to apply blot on hit";
public override string ItemFullDescription => ConfigManager.shatteredBladeValues.Description;
public override string ItemLore => "oops, i hope no one notices i broke the merchandise";
public override ItemTier Tier => (ItemTier)0;
public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 };
public override string ItemModelPath => "Assets/items/shatteredblade/ShatteredBlade.prefab";
public override string ItemIconPath => "Assets/items/shatteredblade/ShatteredBlade.png";
public override ItemDisplayRuleDict CreateItemDisplayRules()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
return new ItemDisplayRuleDict((ItemDisplayRule[])null);
}
public override void Hooks()
{
}
public override void Init()
{
CreateItemDisplayRules();
CreateLang();
CreateItem();
Hooks();
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
if (report.damageInfo.procCoefficient != 0f && !report.damageInfo.rejected)
{
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (Object.op_Implicit((Object)(object)attackerBody) && Object.op_Implicit((Object)(object)victimBody) && Object.op_Implicit((Object)(object)attackerBody.inventory) && GetCount(attackerBody) > 0 && Util.CheckRoll(ConfigManager.shatteredBladeValues.GetFloat("blotChance"), attackerBody.master) && NetworkServer.active)
{
victimBody.AddBuff(Main.BuffDict["Blot"]);
}
}
}
}
internal class TaintedWill : ItemBase
{
public override string ItemName => "Tainted Will";
public override string ItemLangTokenName => "TaintedWill";
public override string ItemPickupDesc => "reduce damage taken from enemies with blot";
public override string ItemFullDescription => ConfigManager.taintedWillValues.Description;
public override string ItemLore => "hey why won't this bracelet come off";
public override ItemTier Tier => (ItemTier)0;
public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 };
public override string ItemModelPath => "Assets/items/taintedwill/TaintedWill.prefab";
public override string ItemIconPath => "Assets/items/taintedwill/TaintedWill.png";
public override ItemDisplayRuleDict CreateItemDisplayRules()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
return new ItemDisplayRuleDict((ItemDisplayRule[])null);
}
public override void Hooks()
{
OigsExtraEvents.BeforeDamageTaken += OigsExtraEvents_BeforeDamageTaken;
}
public override void Init()
{
CreateItemDisplayRules();
CreateLang();
CreateItem();
Hooks();
}
private void OigsExtraEvents_BeforeDamageTaken(DamageInfo damageInfo, CharacterBody attackerBody, CharacterBody victimBody)
{
if (Object.op_Implicit((Object)(object)attackerBody) && Object.op_Implicit((Object)(object)victimBody) && Object.op_Implicit((Object)(object)victimBody.inventory) && GetCount(victimBody) > 0)
{
if (Util.CheckRoll(ConfigManager.taintedWillValues.GetFloat("blotChance"), victimBody.master) && NetworkServer.active)
{
attackerBody.AddBuff(Main.BuffDict["Blot"]);
}
if (attackerBody.HasBuff(Main.BuffDict["Blot"]))
{
float num = 0.05f * (float)GetCount(victimBody) / (0.1f * (float)GetCount(victimBody) + 1f);
damageInfo.damage *= 1f - num;
}
}
}
}
internal class TelescopicSight : ItemBase
{
public override string ItemName => "Telescopic Sight";
public override string ItemLangTokenName => "TelescopicSight";
public override string ItemPickupDesc => "Deal bonus damage based on how far your attack travels";
public override string ItemFullDescription => ConfigManager.telescopicSightValues.Description;
public override string ItemLore => "its like from the first game but a completely different item";
public override ItemTier Tier => (ItemTier)1;
public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 };
public override string ItemModelPath => "Assets/items/telescopicsight/TelescopicSight.prefab";
public override string ItemIconPath => "Assets/items/telescopicsight/TelescopicSight.png";
public override ItemDisplayRuleDict CreateItemDisplayRules()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
return new ItemDisplayRuleDict((ItemDisplayRule[])null);
}
public override void Hooks()
{
}
public override void Init()
{
CreateItemDisplayRules();
CreateLang();
CreateItem();
Hooks();
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Expected O, but got Unknown
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Unknown result type (might be due to invalid IL or missing references)
//IL_012d: Unknown result type (might be due to invalid IL or missing references)
if (report.damageInfo.procCoefficient == 0f || report.damageInfo.rejected)
{
return;
}
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (Object.op_Implicit((Object)(object)attackerBody) && Object.op_Implicit((Object)(object)attackerBody.inventory) && GetCount(attackerBody) > 0)
{
float num = Vector3.Distance(attackerBody.corePosition, victimBody.corePosition);
if (num >= ConfigManager.telescopicSightValues.GetFloat("distanceInterval"))
{
int num2 = (int)Math.Floor(num / ConfigManager.telescopicSightValues.GetFloat("distanceInterval"));
DamageInfo val = new DamageInfo();
val.attacker = ((Component)attackerBody).gameObject;
val.damageType = DamageTypeCombo.op_Implicit((DamageType)0);
val.damage = report.damageDealt * (ConfigManager.telescopicSightValues.GetFloat("distanceDamage") * (float)GetCount(attackerBody) * (float)num2);
val.crit = false;
val.damageColorIndex = (DamageColorIndex)12;
val.procCoefficient = 0f;
val.position = victimBody.corePosition;
val.procChainMask = default(ProcChainMask);
victimBody.healthComponent.TakeDamage(val);
}
}
}
}
internal class TwilightSpear : ItemBase
{
public override string ItemName => "Twilight Spear";
public override string ItemLangTokenName => "TwilightSpear";
public override string ItemPickupDesc => "apply blot when hitting an enemy near full health";
public override string ItemFullDescription => ConfigManager.twilightSpearValues.Description;
public override string ItemLore => "isn't that just a regular spear?\nno, no, no, look how cool the spear head looks, it has to be special";
public override ItemTier Tier => (ItemTier)1;
public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 };
public override string ItemModelPath => "Assets/items/twilightspear/TwilightSpear.prefab";
public override string ItemIconPath => "Assets/items/twilightspear/TwilightSpear.png";
public override ItemDisplayRuleDict CreateItemDisplayRules()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
return new ItemDisplayRuleDict((ItemDisplayRule[])null);
}
public override void Hooks()
{
}
public override void Init()
{
CreateItemDisplayRules();
CreateLang();
CreateItem();
Hooks();
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
if (report.damageInfo.procCoefficient == 0f || report.damageInfo.rejected)
{
return;
}
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (Object.op_Implicit((Object)(object)attackerBody) && Object.op_Implicit((Object)(object)victimBody) && Object.op_Implicit((Object)(object)victimBody.healthComponent) && Object.op_Implicit((Object)(object)attackerBody.inventory) && GetCount(attackerBody) > 0 && report.combinedHealthBeforeDamage > victimBody.healthComponent.fullHealth * ConfigManager.twilightSpearValues.GetFloat("percentHealth") && NetworkServer.active)
{
for (int i = 0; i < ConfigManager.twilightSpearValues.GetInt("blotAmount") * GetCount(attackerBody); i++)
{
victimBody.AddBuff(Main.BuffDict["Blot"]);
}
}
}
}
internal class WeedWacker : ItemBase
{
public override string ItemName => "Weed Wacker";
public override string ItemLangTokenName => "WeedWacker";
public override string ItemPickupDesc => "every three hits deal bonus damage, each time this occurs increase the damage until the next stage";
public override string ItemFullDescription => ConfigManager.weedWackerValues.Description;
public override string ItemLore => "mow 'em down";
public override ItemTier Tier => (ItemTier)1;
public override ItemTag[] ItemTags => (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 };
public override string ItemModelPath => "Assets/items/weedwacker/WeedWacker.prefab";
public override string ItemIconPath => "Assets/items/weedwacker/WeedWacker.png";
public override ItemDisplayRuleDict CreateItemDisplayRules()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
return new ItemDisplayRuleDict((ItemDisplayRule[])null);
}
public override void Hooks()
{
}
public override void Init()
{
CreateItemDisplayRules();
CreateLang();
CreateItem();
Hooks();
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
if (report.damageInfo.procCoefficient != 0f && !report.damageInfo.rejected)
{
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (Object.op_Implicit((Object)(object)attackerBody) && Object.op_Implicit((Object)(object)victimBody.healthComponent) && Object.op_Implicit((Object)(object)attackerBody.inventory) && GetCount(attackerBody) > 0 && NetworkServer.active)
{
attackerBody.AddBuff(Main.BuffDict["WeedHitBuff"]);
}
}
}
}
}
namespace oigsItemsMod.Examples
{
internal class EXAMPLE_ACHIEVEMENT : AchievementBase
{
public override string AchievementIdentifier => "EXAMPLE_CLASS_ACH_ID";
public override string UnlockableIdentifier => "EXAMPLE_CLASS_UNLK_ID";
public override string AchievementNameToken => "EXAMPLE_CLASS_ACH_NAME";
public override string PrerequisiteUnlockableIdentifier => "";
public override string UnlockableNameToken => "EXAMPLE_CLASS_UNLK_NAME";
public override string AchievementDescToken => "EXAMPLE_CLASS_ACH_DECS";
public override Sprite Sprite
{
get
{
throw new NotImplementedException();
}
}
public override Func<string> GetHowToUnlock { get; } = () => Language.GetStringFormatted("UNLOCK_VIA_ACHIEVEMENT_FORMAT", new object[2]
{
Language.GetString("EXAMPLE_CLASS_ACH_NAME"),
Language.GetString("EXAMPLE_CLASS_ACH_DECS")
});
public override Func<string> GetUnlocked { get; } = () => Language.GetStringFormatted("UNLOCKED_FORMAT", new object[2]
{
Language.GetString("EXAMPLE_CLASS_ACH_NAME"),
Language.GetString("EXAMPLE_CLASS_ACH_DECS")
});
public override void Config(ConfigFile config)
{
}
public override void Init(ConfigFile config)
{
Config(config);
CreateAchievement();
}
public override void OnInstall()
{
base.OnInstall();
}
public override void OnUninstall()
{
base.OnUninstall();
}
}
}
namespace oigsItemsMod.Buffs
{
internal class Blot : BaseBuff
{
public override string BuffName => "Blot";
public override Color BuffColor => Color.white;
public override bool CanStack => true;
public override bool IsDebuff => true;
public override string BuffIconPath => "Assets/buffs/blot/Blot.png";
public override void Hooks()
{
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
public override void Init()
{
CreateLang();
CreateBuff();
Hooks();
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Expected O, but got Unknown
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
if (report.damageInfo.procCoefficient != 0f && !report.damageInfo.rejected)
{
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (Object.op_Implicit((Object)(object)victimBody) && Object.op_Implicit((Object)(object)victimBody.healthComponent) && victimBody.HasBuff(buffDef))
{
DamageInfo val = new DamageInfo();
val.damageType = DamageTypeCombo.op_Implicit((DamageType)0);
val.damage = (Object.op_Implicit((Object)(object)attackerBody) ? ((float)victimBody.GetBuffCount(buffDef) * 0.4f * attackerBody.baseDamage) : ((float)victimBody.GetBuffCount(buffDef))) * report.damageInfo.procCoefficient;
val.crit = false;
val.damageColorIndex = (DamageColorIndex)3;
val.procCoefficient = 0f;
val.position = victimBody.corePosition;
val.procChainMask = default(ProcChainMask);
victimBody.healthComponent.TakeDamage(val);
}
}
}
}
internal class ClownNoseDebuff : BaseBuff
{
public override string BuffName => "ClownNoseDebuff";
public override Color BuffColor => Color.white;
public override bool CanStack => true;
public override bool IsDebuff => true;
public override string BuffIconPath => "Assets/items/clownnose/ClownNoseDebuff.png";
public override void Hooks()
{
}
public override void Init()
{
CreateLang();
CreateBuff();
Hooks();
}
}
internal class ContractBuff : BaseBuff
{
public override string BuffName => "ContractBuff";
public override Color BuffColor => Color.white;
public override bool CanStack => true;
public override bool IsDebuff => false;
public override string BuffIconPath => "Assets/items/contractofcommand/ContractBuff.png";
public override void Hooks()
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients);
}
public override void Init()
{
CreateLang();
CreateBuff();
Hooks();
}
private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
{
if (sender.HasBuff(buffDef) && Object.op_Implicit((Object)(object)sender.inventory))
{
ContractOfCommandTracker component = ((Component)sender.inventory).GetComponent<ContractOfCommandTracker>();
if (Object.op_Implicit((Object)(object)component))
{
args.damageMultAdd += component.attack * (float)sender.GetBuffCount(buffDef);
args.moveSpeedMultAdd += component.speed * (float)sender.GetBuffCount(buffDef);
}
}
}
}
internal class DevouringJarBuff : BaseBuff
{
public override string BuffName => "DevouringJarBuff";
public override Color BuffColor => Color.white;
public override bool CanStack => true;
public override bool IsDebuff => false;
public override string BuffIconPath => "Assets/items/devouringjar/DevouringJarBuff.png";
public override void Hooks()
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients);
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
public override void Init()
{
CreateLang();
CreateBuff();
Hooks();
}
private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
{
if (sender.HasBuff(buffDef) && sender.GetBuffCount(buffDef) >= 100 && Object.op_Implicit((Object)(object)sender.inventory))
{
args.armorAdd += ConfigManager.devouringJarValues.GetFloat("armorAmount") * (float)sender.inventory.GetItemCount(Main.ItemDict["DevouringJar"]);
}
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
if (report.damageInfo.procCoefficient == 0f || report.damageInfo.rejected)
{
return;
}
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (Object.op_Implicit((Object)(object)attackerBody) && Object.op_Implicit((Object)(object)attackerBody.inventory) && Object.op_Implicit((Object)(object)victimBody) && Object.op_Implicit((Object)(object)victimBody.healthComponent) && attackerBody.HasBuff(buffDef) && attackerBody.GetBuffCount(buffDef) >= 100)
{
int buffCount = attackerBody.GetBuffCount(buffDef);
for (int i = 0; i < 100; i++)
{
attackerBody.RemoveBuff(buffDef);
}
for (int j = 0; j < ConfigManager.devouringJarValues.GetInt("blotAmount") * attackerBody.inventory.GetItemCount(Main.ItemDict["DevouringJar"]); j++)
{
victimBody.AddBuff(Main.BuffDict["Blot"]);
}
}
}
}
internal class DreadHitBuff : BaseBuff
{
public override string BuffName => "DreadHitBuff";
public override Color BuffColor => Color.white;
public override bool CanStack => true;
public override bool IsDebuff => false;
public override string BuffIconPath => "Assets/items/eternaldread/DreadHitBuff.png";
public override void Hooks()
{
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
public override void Init()
{
CreateLang();
CreateBuff();
Hooks();
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
//IL_017b: Unknown result type (might be due to invalid IL or missing references)
if (report.damageInfo.procCoefficient == 0f || report.damageInfo.rejected)
{
return;
}
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (!Object.op_Implicit((Object)(object)attackerBody) || !Object.op_Implicit((Object)(object)attackerBody.inventory) || !Object.op_Implicit((Object)(object)attackerBody.healthComponent) || !Object.op_Implicit((Object)(object)victimBody.healthComponent))
{
return;
}
int itemCount = attackerBody.inventory.GetItemCount(Main.ItemDict["EternalDread"]);
int buffCount = attackerBody.GetBuffCount(buffDef);
if (!attackerBody.HasBuff(buffDef) || buffCount < ConfigManager.eternalDreadValues.GetInt("hitInterval"))
{
return;
}
if (NetworkServer.active)
{
for (int i = 0; i < buffCount; i++)
{
attackerBody.RemoveBuff(buffDef);
}
for (int j = 0; j < ConfigManager.eternalDreadValues.GetInt("blotAmount") * itemCount; j++)
{
victimBody.AddBuff(Main.BuffDict["Blot"]);
}
}
attackerBody.healthComponent.Heal(Mathf.Floor((float)victimBody.GetBuffCount(Main.BuffDict["Blot"]) / 10f) * ConfigManager.eternalDreadValues.GetFloat("healAmount"), report.damageInfo.procChainMask, true);
}
}
internal class PrettyTimeBuff : BaseBuff
{
public override string BuffName => "PrettyTimeBuff";
public override Color BuffColor => Color.white;
public override bool CanStack => true;
public override bool IsDebuff => false;
public override string BuffIconPath => "Assets/items/prettystopwatch/PrettyTimeBuff.png";
public override void Hooks()
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients);
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
public override void Init()
{
CreateLang();
CreateBuff();
Hooks();
}
private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
{
if (sender.HasBuff(buffDef) && Object.op_Implicit((Object)(object)sender.inventory))
{
args.moveSpeedMultAdd += ConfigManager.prettyStopwatchValues.GetFloat("percentSpeed") * (float)sender.GetBuffCount(buffDef) + ConfigManager.prettyStopwatchValues.GetFloat("percentSpeed") * (float)sender.GetBuffCount(buffDef) * (float)(sender.inventory.GetItemCount(Main.ItemDict["PrettyStopwatch"]) - 1);
}
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: Expected O, but got Unknown
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
if (report.damageInfo.procCoefficient == 0f || report.damageInfo.rejected)
{
return;
}
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (!Object.op_Implicit((Object)(object)attackerBody) || !Object.op_Implicit((Object)(object)attackerBody.inventory))
{
return;
}
int itemCount = attackerBody.inventory.GetItemCount(Main.ItemDict["PrettyStopwatch"]);
if (!attackerBody.HasBuff(buffDef))
{
return;
}
int buffCount = attackerBody.GetBuffCount(buffDef);
DamageInfo val = new DamageInfo();
val.attacker = ((Component)attackerBody).gameObject;
val.damageType = DamageTypeCombo.op_Implicit((DamageType)0);
val.damage = attackerBody.damage * (attackerBody.moveSpeed * (float)buffCount * (ConfigManager.prettyStopwatchValues.GetFloat("damageIncreasePerStack") + ConfigManager.prettyStopwatchValues.GetFloat("damageIncreasePerStack") * (float)(itemCount - 1)) / 100f);
val.crit = false;
val.damageColorIndex = (DamageColorIndex)3;
val.procCoefficient = 0f;
val.position = victimBody.corePosition;
val.procChainMask = default(ProcChainMask);
victimBody.healthComponent.TakeDamage(val);
if (NetworkServer.active)
{
for (int i = 0; i < buffCount; i++)
{
attackerBody.RemoveBuff(buffDef);
}
}
}
}
internal class RelentlessMaliceBuff : BaseBuff
{
public override string BuffName => "RelentlessMaliceBuff";
public override Color BuffColor => Color.white;
public override bool CanStack => true;
public override bool IsDebuff => false;
public override string BuffIconPath => "Assets/items/relentlessmalice/RelentlessMaliceBuff.png";
public override void Hooks()
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients);
}
public override void Init()
{
CreateLang();
CreateBuff();
Hooks();
}
private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
{
if (sender.HasBuff(buffDef) && Object.op_Implicit((Object)(object)sender.inventory))
{
args.attackSpeedMultAdd += (float)sender.GetBuffCount(buffDef) * ConfigManager.relentlessMaliceValues.GetFloat("attackSpeedMult");
}
}
}
internal class WeedDamageBuff : BaseBuff
{
public override string BuffName => "WeedDamageBuff";
public override Color BuffColor => Color.white;
public override bool CanStack => true;
public override bool IsDebuff => false;
public override string BuffIconPath => "Assets/items/weedwacker/WeedDamageBuff.png";
public override void Hooks()
{
}
public override void Init()
{
CreateLang();
CreateBuff();
Hooks();
}
}
internal class WeedHitBuff : BaseBuff
{
public override string BuffName => "WeedHitBuff";
public override Color BuffColor => Color.white;
public override bool CanStack => true;
public override bool IsDebuff => false;
public override string BuffIconPath => "Assets/items/weedwacker/WeedHitBuff.png";
public override void Hooks()
{
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
}
public override void Init()
{
CreateLang();
CreateBuff();
Hooks();
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Expected O, but got Unknown
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
//IL_016e: Unknown result type (might be due to invalid IL or missing references)
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
//IL_0187: Unknown result type (might be due to invalid IL or missing references)
//IL_0193: Unknown result type (might be due to invalid IL or missing references)
if (report.damageInfo.procCoefficient == 0f || report.damageInfo.rejected)
{
return;
}
CharacterBody attackerBody = report.attackerBody;
CharacterBody victimBody = report.victimBody;
if (!Object.op_Implicit((Object)(object)attackerBody) || !Object.op_Implicit((Object)(object)attackerBody.inventory) || !Object.op_Implicit((Object)(object)victimBody.healthComponent))
{
return;
}
int itemCount = attackerBody.inventory.GetItemCount(Main.ItemDict["WeedWacker"]);
int buffCount = attackerBody.GetBuffCount(buffDef);
if (!attackerBody.HasBuff(buffDef) || buffCount < ConfigManager.weedWackerValues.GetInt("hitInterval"))
{
return;
}
DamageInfo val = new DamageInfo();
val.attacker = ((Component)attackerBody).gameObject;
val.damageType = DamageTypeCombo.op_Implicit((DamageType)0);
val.damage = ConfigManager.weedWackerValues.GetFloat("baseDamage") + ConfigManager.weedWackerValues.GetFloat("baseDamage") * (float)(itemCount - 1) + (ConfigManager.weedWackerValues.GetFloat("damageIncrease") + ConfigManager.weedWackerValues.GetFloat("damageIncrease") * (float)(itemCount - 1)) * (float)(attackerBody.HasBuff(Main.BuffDict["WeedDamageBuff"]) ? attackerBody.GetBuffCount(Main.BuffDict["WeedDamageBuff"]) : 0);
val.crit = false;
val.damageColorIndex = (DamageColorIndex)3;
val.procCoefficient = 0f;
val.position = victimBody.corePosition;
val.procChainMask = default(ProcChainMask);
victimBody.healthComponent.TakeDamage(val);
if (NetworkServer.active)
{
for (int i = 0; i < buffCount; i++)
{
attackerBody.RemoveBuff(buffDef);
}
attackerBody.AddBuff(Main.BuffDict["WeedDamageBuff"]);
}
}
}
}
namespace oigsItemsMod.Base_Classes
{
public abstract class AchievementBase : BaseAchievement, IModdedUnlockableDataProvider
{
private static readonly MethodInfo GenericAddUnlock = typeof(UnlockableAPI).GetMethod("AddUnlockable");
public abstract string AchievementIdentifier { get; }
public abstract string UnlockableIdentifier { get; }
public abstract string AchievementNameToken { get; }
public abstract string PrerequisiteUnlockableIdentifier { get; }
public abstract string UnlockableNameToken { get; }
public abstract string AchievementDescToken { get; }
public abstract Sprite Sprite { get; }
public abstract Func<string> GetHowToUnlock { get; }
public abstract Func<string> GetUnlocked { get; }
public void Revoke()
{
if (((BaseAchievement)this).userProfile.HasAchievement(AchievementIdentifier))
{
((BaseAchievement)this).userProfile.RevokeAchievement(AchievementIdentifier);
}
((BaseAchievement)this).userProfile.RevokeUnlockable(UnlockableCatalog.GetUnlockableDef(UnlockableIdentifier));
}
public abstract void Init(ConfigFile config);
public abstract void Config(ConfigFile config);
protected void CreateAchievement()
{
GenericAddUnlock.MakeGenericMethod(((object)this).GetType()).Invoke(null, new object[1] { true });
}
public override void OnGranted()
{
((BaseAchievement)this).OnGranted();
}
public override void OnInstall()
{
((BaseAchievement)this).OnInstall();
}
public override void OnUninstall()
{
((BaseAchievement)this).OnUninstall();
}
public override float ProgressForAchievement()
{
return ((BaseAchievement)this).ProgressForAchievement();
}
}
public abstract class BaseBuff
{
public BuffDef buffDef = ScriptableObject.CreateInstance<BuffDef>();
public abstract string BuffName { get; }
public abstract Color BuffColor { get; }
public abstract bool CanStack { get; }
public abstract string BuffIconPath { get; }
public abstract bool IsDebuff { get; }
public abstract void Init();
protected void CreateLang()
{
LanguageAPI.Add("BUFF_" + BuffName + "_NAME", BuffName);
}
protected void CreateBuff()
{
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
((Object)buffDef).name = BuffName;
buffDef.buffColor = BuffColor;
buffDef.canStack = CanStack;
buffDef.iconSprite = Main.Assets.LoadAsset<Sprite>(BuffIconPath);
buffDef.isDebuff = IsDebuff;
ContentAddition.AddBuffDef(buffDef);
}
public abstract void Hooks();
}
public abstract class ItemBase
{
public static GameObject ItemBodyModelPrefab;
public ItemDef itemDef = ScriptableObject.CreateInstance<ItemDef>();
public abstract string ItemName { get; }
public abstract string ItemLangTokenName { get; }
public abstract string ItemPickupDesc { get; }
public abstract string ItemFullDescription { get; }
public abstract string ItemLore { get; }
public abstract ItemTier Tier { get; }
public virtual ItemTag[] ItemTags { get; } = (ItemTag[])(object)new ItemTag[0];
public abstract string ItemModelPath { get; }
public abstract string ItemIconPath { get; }
public virtual bool CanRemove { get; }
public virtual bool Hidden { get; }
public virtual bool HasUnlockable { get; }
public virtual UnlockableDef ItemPreReq { get; }
public abstract void Init();
protected void CreateLang()
{
LanguageAPI.Add("ITEM_" + ItemLangTokenName + "_NAME", ItemName);
LanguageAPI.Add("ITEM_" + ItemLangTokenName + "_PICKUP", ItemPickupDesc);
LanguageAPI.Add("ITEM_" + ItemLangTokenName + "_DESCRIPTION", ItemFullDescription);
LanguageAPI.Add("ITEM_" + ItemLangTokenName + "_LORE", ItemLore);
}
public abstract ItemDisplayRuleDict CreateItemDisplayRules();
protected void CreateItem()
{
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
//IL_0159: Unknown result type (might be due to invalid IL or missing references)
//IL_0163: Expected O, but got Unknown
((Object)itemDef).name = "ITEM_" + ItemLangTokenName;
itemDef.nameToken = "ITEM_" + ItemLangTokenName + "_NAME";
itemDef.pickupToken = "ITEM_" + ItemLangTokenName + "_PICKUP";
itemDef.descriptionToken = "ITEM_" + ItemLangTokenName + "_DESCRIPTION";
itemDef.loreToken = "ITEM_" + ItemLangTokenName + "_LORE";
itemDef.pickupModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
itemDef.pickupIconSprite = Main.Assets.LoadAsset<Sprite>(ItemIconPath);
itemDef.hidden = Hidden;
itemDef.tags = ItemTags;
itemDef.canRemove = CanRemove;
itemDef.tier = Tier;
itemDef.unlockableDef = ItemPreReq;
itemDef.canRemove = true;
itemDef.deprecatedTier = Tier;
ItemDisplayRuleDict val = CreateItemDisplayRules();
ItemAPI.Add(new CustomItem(itemDef, CreateItemDisplayRules()));
}
public abstract void Hooks();
public int GetCount(CharacterBody body)
{
if (!Object.op_Implicit((Object)(object)body) || !Object.op_Implicit((Object)(object)body.inventory))
{
return 0;
}
return body.inventory.GetItemCount(itemDef);
}
public int GetCount(CharacterMaster master)
{
if (!Object.op_Implicit((Object)(object)master) || !Object.op_Implicit((Object)(object)master.inventory))
{
return 0;
}
return master.inventory.GetItemCount(itemDef);
}
}
}