Files
7d2dXG/Mods/zzz_REBIRTH__Utils/Harmony/Harmony_RewardLootItem.cs
Nathaniel Cosford e06f2bd282 Add All Mods
2025-05-29 23:33:28 +09:30

249 lines
12 KiB
C#

using Audio;
using Platform;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
namespace Harmony.RewardLootItemPatches
{
[HarmonyPatch(typeof(RewardLootItem))]
[HarmonyPatch("SetupReward")]
public class SetupRewardPatch
{
public static bool Prefix(RewardLootItem __instance)
{
//Log.Out("RewardLootItem-SetupReward item: " + __instance.Item.itemValue.ItemClass.Name);
if (RebirthUtilities.ScenarioSkip())
{
string name = __instance.Item.itemValue.ItemClass.Name.ToLower();
if (name.StartsWith("armor") &&
(name.Contains("helmet") ||
name.Contains("outfit") ||
name.Contains("gloves") ||
name.Contains("boots")
)
)
{
//int questTier = __instance.OwnerQuest.OwnerJournal.GetCurrentFactionTier((byte)1);
int questTier = __instance.OwnerQuest.QuestClass.DifficultyTier;
//Log.Out("RewardLootItem-SetupReward questTier: " + questTier);
Dictionary<string, int> perks = new Dictionary<string, int>();
if (questTier > 1 && questTier <= 2)
{
perks = new Dictionary<string, int>
{
{ "perkMeleeDamage", 1 },
{ "perkSexualTrex", 1 },
{ "perkMiner69r", 1 },
{ "perkMotherLode", 1 },
{ "perkRuleOneCardio", 1 },
{ "perkParkour", 1 },
{ "perkDodge", 1 },
{ "perkPackMule", 1 }
};
}
else if (questTier > 2 && questTier <= 3)
{
perks = new Dictionary<string, int>
{
{ "perkMeleeDamage", 2 },
{ "perkSexualTrex", 2 },
{ "perkMiner69r", 2 },
{ "perkMotherLode", 2 },
{ "perkRuleOneCardio", 2 },
{ "perkParkour", 2 },
{ "perkDodge", 2 },
{ "perkPackMule", 2 },
{ "perkHealingFactor", 1 },
{ "perkSlowMetabolism", 1 },
{ "perkDeepCuts", 1 },
{ "perkLuckyLooter", 1 },
{ "perkPhysician", 1 },
{ "perkTreasureHunter", 1 },
{ "perkDaringAdventurer", 1 },
{ "perkBetterBarter", 1 },
{ "perkCharismaticNature", 1 }
};
}
else if (questTier > 3 && questTier <= 4)
{
perks = new Dictionary<string, int>
{
{ "perkMeleeDamage", 3 },
{ "perkSexualTrex", 3 },
{ "perkMiner69r", 3 },
{ "perkMotherLode", 3 },
{ "perkRuleOneCardio", 3 },
{ "perkParkour", 3 },
{ "perkDodge", 3 },
{ "perkPackMule", 3 },
{ "perkHealingFactor", 2 },
{ "perkSlowMetabolism", 2 },
{ "perkDeepCuts", 2 },
{ "perkLuckyLooter", 2 },
{ "perkPhysician", 2 },
{ "perkTreasureHunter", 2 },
{ "perkDaringAdventurer", 2 },
{ "perkBetterBarter", 2 },
{ "perkCharismaticNature", 2 }
};
}
else if (questTier > 4)
{
perks = new Dictionary<string, int>
{
{ "perkMeleeDamage", 4 },
{ "perkSexualTrex", 4 },
{ "perkMiner69r", 4 },
{ "perkMotherLode", 4 },
{ "perkRuleOneCardio", 4 },
{ "perkParkour", 4 },
{ "perkDodge", 4 },
{ "perkPackMule", 4 },
{ "perkHealingFactor", 2 },
{ "perkSlowMetabolism", 2 },
{ "perkDeepCuts", 2 },
{ "perkLuckyLooter", 2 },
{ "perkPhysician", 2 },
{ "perkTreasureHunter", 2 },
{ "perkDaringAdventurer", 2 },
{ "perkBetterBarter", 2 },
{ "perkCharismaticNature", 2 }
};
}
int chance = Manager.random.RandomRange(0, 101);
EntityPlayer player = __instance.OwnerQuest.OwnerJournal.OwnerPlayer;
float threshold = 60;
if (player != null)
{
ProgressionValue progressionValue = player.Progression.GetProgressionValue("perkDaringAdventurer");
float perkDaringAdventurer = RebirthUtilities.GetCalculatedLevel(player, progressionValue);
threshold = threshold + perkDaringAdventurer * 5;
}
if (questTier > 1 && chance <= threshold)
{
System.Random random = new System.Random();
KeyValuePair<string, int> randomPerk = perks.ElementAt(random.Next(perks.Count));
ItemValue itemValue = new ItemValue(ItemClass.GetItem(__instance.Item.itemValue.ItemClass.Name, false).type);
itemValue.SetMetadata("bonus", randomPerk.Key, TypedMetadataValue.TypeTag.String);
itemValue.SetMetadata("type", "", TypedMetadataValue.TypeTag.String);
itemValue.SetMetadata("level", randomPerk.Value, TypedMetadataValue.TypeTag.Integer);
itemValue.SetMetadata("active", 2, TypedMetadataValue.TypeTag.Integer);
__instance.Item.itemValue = itemValue;
}
}
else
{
List<string> tagNames = __instance.Item.itemValue.ItemClass.ItemTags.GetTagNames();
bool isMelee = RebirthUtilities.isMeleeWeapon(tagNames);
bool isRanged = RebirthUtilities.hasTag(tagNames, "ranged");
bool isTool = RebirthUtilities.hasTag(tagNames, "tool");
bool isAxe = RebirthUtilities.hasTag(tagNames, "axe");
bool isRepairTool = RebirthUtilities.hasTag(tagNames, "repairTool");
bool isAmmo = RebirthUtilities.hasTag(tagNames, "ammo");
if ((isRanged && !isAmmo) ||
(isMelee && !(isTool || isRepairTool)) ||
(isAxe && !isRepairTool)
)
{
int questTier = __instance.OwnerQuest.QuestClass.DifficultyTier;
int chance = Manager.random.RandomRange(0, 101);
EntityPlayer player = __instance.OwnerQuest.OwnerJournal.OwnerPlayer;
float threshold = 25;
if (player != null )
{
ProgressionValue progressionValue = player.Progression.GetProgressionValue("perkDaringAdventurer");
float perkDaringAdventurer = RebirthUtilities.GetCalculatedLevel(player, progressionValue);
threshold = threshold + perkDaringAdventurer * 5;
}
if (questTier > 1 && chance <= threshold)
{
string bonusName = RebirthVariables.weaponAura[Manager.random.RandomRange(0, RebirthVariables.weaponAura.Count)];
string bonusType = "aura";
int bonusLevel = Manager.random.RandomRange(questTier, questTier + 1) - 1;
ItemValue itemValue = new ItemValue(ItemClass.GetItem(__instance.Item.itemValue.ItemClass.Name, false).type);
itemValue.SetMetadata("bonus", bonusName, TypedMetadataValue.TypeTag.String);
itemValue.SetMetadata("type", bonusType, TypedMetadataValue.TypeTag.String);
itemValue.SetMetadata("level", bonusLevel, TypedMetadataValue.TypeTag.Integer);
itemValue.SetMetadata("active", 1, TypedMetadataValue.TypeTag.Integer);
__instance.Item.itemValue = itemValue;
}
}
}
}
__instance.LootGameStage = Convert.ToInt32(__instance.Value);
ItemClass itemClass = __instance.Item.itemValue.ItemClass;
__instance.Description = itemClass.GetLocalizedItemName();
__instance.ValueText = __instance.Value;
switch (itemClass.Groups[0].ToLower())
{
case "ammo/weapons":
__instance.Icon = "ui_game_symbol_knife";
break;
case "basics":
__instance.Icon = "ui_game_symbol_shopping_cart";
break;
case "books":
__instance.Icon = "ui_game_symbol_book";
break;
case "building":
__instance.Icon = "ui_game_symbol_map_house";
break;
case "chemicals":
__instance.Icon = "ui_game_symbol_water";
break;
case "clothing":
__instance.Icon = "ui_game_symbol_shirt";
break;
case "decor/miscellaneous":
__instance.Icon = "ui_game_symbol_chair";
break;
case "food/cooking":
__instance.Icon = "ui_game_symbol_fork";
break;
case "mods":
__instance.Icon = "ui_game_symbol_assemble";
break;
case "resources":
__instance.Icon = "ui_game_symbol_resource";
break;
case "science":
__instance.Icon = "ui_game_symbol_science";
break;
case "special items":
__instance.Icon = "ui_game_symbol_book";
break;
case "tools/traps":
__instance.Icon = "ui_game_symbol_tool";
break;
}
__instance.IconAtlas = "ItemIconAtlas";
return false;
}
}
}