Commit initial BossHealth, DamageNumbers, Horde, ThirdPerson mods
This commit is contained in:
1 parent
7bd44d1d99
commit
9c123865bc
176 files changed
+10367
No files matched your search
@@ -0,0 +1,262 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using BepInEx.Configuration;
|
||||
|
||||
namespace Skopje.Horde
|
||||
{
|
||||
// One row here becomes a setting on Global and on every zone.
|
||||
// Zone values are used only when that zone's Override is true.
|
||||
static class HordeConfig
|
||||
{
|
||||
internal const string PopulationKey = "PopulationMultiplier";
|
||||
internal const string StatKey = "StatMultiplier";
|
||||
|
||||
sealed class FieldDef
|
||||
{
|
||||
public string Key;
|
||||
public bool IsFloat;
|
||||
public int IntDefault = 0;
|
||||
public float FloatDefault;
|
||||
public int IntMin = 0;
|
||||
public int IntMax = 0;
|
||||
public float FloatMin;
|
||||
public float FloatMax;
|
||||
}
|
||||
|
||||
sealed class District
|
||||
{
|
||||
public string Name;
|
||||
public string[] Zones;
|
||||
|
||||
public District(string name, params string[] zones)
|
||||
{
|
||||
Name = name;
|
||||
Zones = zones;
|
||||
}
|
||||
}
|
||||
|
||||
internal sealed class ZoneSettings
|
||||
{
|
||||
public string District;
|
||||
public string Name;
|
||||
public ConfigEntry<bool> Override;
|
||||
public Dictionary<string, ConfigEntry<int>> Ints = new Dictionary<string, ConfigEntry<int>>();
|
||||
public Dictionary<string, ConfigEntry<float>> Floats = new Dictionary<string, ConfigEntry<float>>();
|
||||
}
|
||||
|
||||
const string Explanation =
|
||||
"Global multipliers apply to every zone whose Override is false.\n" +
|
||||
"PopulationMultiplier multiplies that zone's enemy count, remaining kills, and alive cap. Decimal, range 0.01 to 64, default 4.\n" +
|
||||
"StatMultiplier multiplies health and damage of enemies that zone spawns. Range 0.01 to 10, default 0.5.\n" +
|
||||
"Set a zone's Override to true to use that zone's own PopulationMultiplier and StatMultiplier instead of Global.";
|
||||
|
||||
static readonly FieldDef[] Fields =
|
||||
{
|
||||
new FieldDef
|
||||
{
|
||||
Key = PopulationKey,
|
||||
IsFloat = true,
|
||||
FloatDefault = 4f,
|
||||
FloatMin = 0.01f,
|
||||
FloatMax = 64f,
|
||||
},
|
||||
new FieldDef
|
||||
{
|
||||
Key = StatKey,
|
||||
IsFloat = true,
|
||||
FloatDefault = 0.5f,
|
||||
FloatMin = 0.01f,
|
||||
FloatMax = 10f,
|
||||
},
|
||||
};
|
||||
|
||||
// Neighborhoods from the game's zone table, grouped into the district that owns them.
|
||||
static readonly District[] Districts =
|
||||
{
|
||||
new District("Metalsky",
|
||||
"Kale",
|
||||
"Chair - West",
|
||||
"Chair - East",
|
||||
"Chair",
|
||||
"Zhelezara",
|
||||
"Avtokomanda",
|
||||
"Triangla"),
|
||||
new District("Vesna",
|
||||
"Vesna",
|
||||
"Karposh",
|
||||
"Kozle",
|
||||
"Debar Maalo",
|
||||
"Taftalidze",
|
||||
"Treska",
|
||||
"Stadium"),
|
||||
new District("Teofan",
|
||||
"Teofan",
|
||||
"Ostrovo",
|
||||
"Michurin",
|
||||
"Kisela Voda",
|
||||
"Kisela Voda - East",
|
||||
"Crniche",
|
||||
"Aerodrom",
|
||||
"Sandanski"),
|
||||
new District("Eva",
|
||||
"Eva"),
|
||||
new District("Ana",
|
||||
"Ana",
|
||||
"UKIM",
|
||||
"Kapishtec",
|
||||
"Gradski Dzid"),
|
||||
};
|
||||
|
||||
static readonly Dictionary<string, ConfigEntry<int>> GlobalInts = new Dictionary<string, ConfigEntry<int>>();
|
||||
static readonly Dictionary<string, ConfigEntry<float>> GlobalFloats = new Dictionary<string, ConfigEntry<float>>();
|
||||
static readonly Dictionary<string, ZoneSettings> Zones = new Dictionary<string, ZoneSettings>(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
public static float GlobalPopulation
|
||||
{
|
||||
get { return GlobalFloats[PopulationKey].Value; }
|
||||
}
|
||||
|
||||
public static float GlobalStat
|
||||
{
|
||||
get { return GlobalFloats[StatKey].Value; }
|
||||
}
|
||||
|
||||
public static void Bind(ConfigFile config)
|
||||
{
|
||||
GlobalInts.Clear();
|
||||
GlobalFloats.Clear();
|
||||
Zones.Clear();
|
||||
|
||||
for (int i = 0; i < Fields.Length; i++)
|
||||
BindField(config, "Global", Fields[i], null, true);
|
||||
|
||||
for (int d = 0; d < Districts.Length; d++)
|
||||
{
|
||||
District district = Districts[d];
|
||||
for (int z = 0; z < district.Zones.Length; z++)
|
||||
BindZone(config, district.Name, district.Zones[z]);
|
||||
}
|
||||
}
|
||||
|
||||
public static float Population(SpawnZone zone)
|
||||
{
|
||||
return FloatSetting(zone, PopulationKey);
|
||||
}
|
||||
|
||||
public static float Stat(SpawnZone zone)
|
||||
{
|
||||
return FloatSetting(zone, StatKey);
|
||||
}
|
||||
|
||||
// Shared alive budget has to cover the largest multiplier actually in use.
|
||||
public static float BudgetPopulation()
|
||||
{
|
||||
float budget = GlobalPopulation;
|
||||
foreach (KeyValuePair<string, ZoneSettings> pair in Zones)
|
||||
{
|
||||
ZoneSettings zone = pair.Value;
|
||||
if (!zone.Override.Value)
|
||||
continue;
|
||||
|
||||
float population = zone.Floats[PopulationKey].Value;
|
||||
if (population > budget)
|
||||
budget = population;
|
||||
}
|
||||
|
||||
return budget < 0.01f ? 0.01f : budget;
|
||||
}
|
||||
|
||||
public static void CollectStats(List<float> into)
|
||||
{
|
||||
into.Clear();
|
||||
AddStat(into, GlobalStat);
|
||||
foreach (KeyValuePair<string, ZoneSettings> pair in Zones)
|
||||
{
|
||||
ZoneSettings zone = pair.Value;
|
||||
if (zone.Override.Value)
|
||||
AddStat(into, zone.Floats[StatKey].Value);
|
||||
}
|
||||
}
|
||||
|
||||
public static int IntSetting(SpawnZone zone, string key)
|
||||
{
|
||||
ZoneSettings settings;
|
||||
if (TryZone(zone, out settings) && settings.Override.Value)
|
||||
return settings.Ints[key].Value;
|
||||
return GlobalInts[key].Value;
|
||||
}
|
||||
|
||||
public static float FloatSetting(SpawnZone zone, string key)
|
||||
{
|
||||
ZoneSettings settings;
|
||||
if (TryZone(zone, out settings) && settings.Override.Value)
|
||||
return settings.Floats[key].Value;
|
||||
return GlobalFloats[key].Value;
|
||||
}
|
||||
|
||||
public static bool TryZone(SpawnZone zone, out ZoneSettings settings)
|
||||
{
|
||||
settings = null;
|
||||
if (zone == null)
|
||||
return false;
|
||||
|
||||
string name = zone.ZoneName;
|
||||
if (string.IsNullOrEmpty(name))
|
||||
return false;
|
||||
|
||||
return Zones.TryGetValue(name.Trim(), out settings);
|
||||
}
|
||||
|
||||
static void BindZone(ConfigFile config, string district, string zone)
|
||||
{
|
||||
string section = district + "." + zone;
|
||||
var settings = new ZoneSettings
|
||||
{
|
||||
District = district,
|
||||
Name = zone,
|
||||
Override = config.Bind(section, "Override", false, (string)null),
|
||||
};
|
||||
|
||||
for (int i = 0; i < Fields.Length; i++)
|
||||
BindField(config, section, Fields[i], settings, false);
|
||||
|
||||
Zones[zone] = settings;
|
||||
}
|
||||
|
||||
static void BindField(ConfigFile config, string section, FieldDef field, ZoneSettings zone, bool global)
|
||||
{
|
||||
// The explanation is written once, above the first global setting.
|
||||
string description = global && field.Key == PopulationKey ? Explanation : null;
|
||||
ConfigDescription configDescription = field.IsFloat
|
||||
? new ConfigDescription(description, new AcceptableValueRange<float>(field.FloatMin, field.FloatMax))
|
||||
: new ConfigDescription(description, new AcceptableValueRange<int>(field.IntMin, field.IntMax));
|
||||
|
||||
if (!field.IsFloat)
|
||||
{
|
||||
ConfigEntry<int> entry = config.Bind(section, field.Key, field.IntDefault, configDescription);
|
||||
if (zone == null)
|
||||
GlobalInts[field.Key] = entry;
|
||||
else
|
||||
zone.Ints[field.Key] = entry;
|
||||
return;
|
||||
}
|
||||
|
||||
ConfigEntry<float> floating = config.Bind(section, field.Key, field.FloatDefault, configDescription);
|
||||
if (zone == null)
|
||||
GlobalFloats[field.Key] = floating;
|
||||
else
|
||||
zone.Floats[field.Key] = floating;
|
||||
}
|
||||
|
||||
static void AddStat(List<float> into, float value)
|
||||
{
|
||||
for (int i = 0; i < into.Count; i++)
|
||||
{
|
||||
if (Math.Abs(into[i] - value) < 0.0001f)
|
||||
return;
|
||||
}
|
||||
|
||||
into.Add(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,484 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using BepInEx;
|
||||
using BepInEx.Logging;
|
||||
using BepInEx.Unity.IL2CPP;
|
||||
using FishNet.Object.Synchronizing;
|
||||
using HarmonyLib;
|
||||
using Il2CppInterop.Runtime.InteropTypes.Arrays;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Skopje.Horde
|
||||
{
|
||||
[BepInPlugin(PluginGuid, PluginName, PluginVersion)]
|
||||
public class HordePlugin : BasePlugin
|
||||
{
|
||||
public const string PluginGuid = "com.skopje.horde";
|
||||
public const string PluginName = "Skopje Horde";
|
||||
public const string PluginVersion = "1.0.0";
|
||||
|
||||
internal static ManualLogSource LogSource;
|
||||
|
||||
static Harmony _harmony;
|
||||
|
||||
public override void Load()
|
||||
{
|
||||
LogSource = Log;
|
||||
HordeConfig.Bind(Config);
|
||||
_harmony = new Harmony(PluginGuid);
|
||||
|
||||
Patch(AccessTools.Method(typeof(SpawnSystem), nameof(SpawnSystem.Awake)), nameof(HordePatches.AfterSpawnSystemAwake), null);
|
||||
Patch(AccessTools.Method(typeof(SpawnSystem), nameof(SpawnSystem.OnStartServer)), nameof(HordePatches.AfterSpawnSystemReady), null);
|
||||
Patch(AccessTools.Method(typeof(SpawnZone), nameof(SpawnZone.OnStartServer)), nameof(HordePatches.AfterZoneServerStart), nameof(HordePatches.BeforeZoneServerStart));
|
||||
Patch(AccessTools.Method(typeof(SpawnZone), nameof(SpawnZone.ResetZone)), null, nameof(HordePatches.BeforeZoneServerStart));
|
||||
Patch(AccessTools.Method(typeof(SpawnZone), "get_EnemiesLeft"), nameof(HordePatches.AfterReadEnemiesLeft), null);
|
||||
Patch(AccessTools.Method(typeof(SpawnZone), "set_EnemiesLeft"), null, nameof(HordePatches.BeforeWriteEnemiesLeft));
|
||||
Patch(AccessTools.Method(typeof(RunSaveManager), "SaveSpawnZones"), nameof(HordePatches.AfterSaveZones), nameof(HordePatches.BeforeSaveZones));
|
||||
Patch(AccessTools.Method(typeof(RunSaveManager), "LoadSpawnZones"), nameof(HordePatches.AfterLoadZones), nameof(HordePatches.BeforeLoadZones));
|
||||
Patch(AccessTools.Method(typeof(EnemyControlAStar), nameof(EnemyControlAStar.OnStartServer)), nameof(HordePatches.AfterEnemyServerStart), null);
|
||||
Patch(AccessTools.Method(typeof(EnemyControlAStar), nameof(EnemyControlAStar.OnStartClient)), nameof(HordePatches.AfterEnemyClientStart), null);
|
||||
Patch(AccessTools.Method(typeof(EnemyControlAStar), nameof(EnemyControlAStar.OnStopServer)), nameof(HordePatches.AfterEnemyServerStop), null);
|
||||
Patch(AccessTools.Method(typeof(PawnStatus), "get_Damage"), nameof(HordePatches.AfterReadDamage), null);
|
||||
|
||||
LogSource.LogInfo($"{PluginName} {PluginVersion} loaded. Global population x{HordeConfig.GlobalPopulation}, stats {HordeConfig.GlobalStat:0%}. Config: {Config.ConfigFilePath}");
|
||||
}
|
||||
|
||||
public override bool Unload()
|
||||
{
|
||||
if (_harmony != null)
|
||||
_harmony.UnpatchSelf();
|
||||
HordePatches.Clear();
|
||||
return true;
|
||||
}
|
||||
|
||||
static void Patch(MethodInfo method, string postfix, string prefix)
|
||||
{
|
||||
if (method == null)
|
||||
{
|
||||
LogSource.LogWarning("Horde hook was not found: " + (postfix ?? prefix));
|
||||
return;
|
||||
}
|
||||
|
||||
_harmony.Patch(
|
||||
method,
|
||||
prefix: prefix == null ? null : new HarmonyMethod(typeof(HordePatches), prefix),
|
||||
postfix: postfix == null ? null : new HarmonyMethod(typeof(HordePatches), postfix));
|
||||
}
|
||||
}
|
||||
|
||||
static class HordePatches
|
||||
{
|
||||
sealed class CapState
|
||||
{
|
||||
public float Vanilla;
|
||||
public float Applied;
|
||||
public bool Captured;
|
||||
}
|
||||
|
||||
static readonly Dictionary<int, int> _vanillaInitial = new Dictionary<int, int>();
|
||||
static readonly Dictionary<int, float> _appliedPopulation = new Dictionary<int, float>();
|
||||
static readonly Dictionary<int, int> _loadedLeft = new Dictionary<int, int>();
|
||||
static readonly Dictionary<int, int> _vanillaBudget = new Dictionary<int, int>();
|
||||
static readonly Dictionary<int, SpawnZone> _trackedZones = new Dictionary<int, SpawnZone>();
|
||||
static readonly Dictionary<int, CapState> _caps = new Dictionary<int, CapState>();
|
||||
static readonly HashSet<int> _healthScaled = new HashSet<int>();
|
||||
static readonly Dictionary<int, float> _pawnStats = new Dictionary<int, float>();
|
||||
static readonly Dictionary<int, int> _pawnByEnemy = new Dictionary<int, int>();
|
||||
static readonly HashSet<string> _unknownZones = new HashSet<string>();
|
||||
static readonly List<float> _statCandidates = new List<float>();
|
||||
|
||||
static float _budgetMultiplier;
|
||||
static int _loading;
|
||||
static bool _saving;
|
||||
static bool _applying;
|
||||
|
||||
public static void Clear()
|
||||
{
|
||||
_vanillaInitial.Clear();
|
||||
_appliedPopulation.Clear();
|
||||
_loadedLeft.Clear();
|
||||
_vanillaBudget.Clear();
|
||||
_trackedZones.Clear();
|
||||
_caps.Clear();
|
||||
_healthScaled.Clear();
|
||||
_pawnStats.Clear();
|
||||
_pawnByEnemy.Clear();
|
||||
_unknownZones.Clear();
|
||||
_budgetMultiplier = 0;
|
||||
_loading = 0;
|
||||
_saving = false;
|
||||
_applying = false;
|
||||
}
|
||||
|
||||
public static void AfterSpawnSystemAwake(SpawnSystem __instance)
|
||||
{
|
||||
ScaleBudget(__instance);
|
||||
}
|
||||
|
||||
public static void AfterSpawnSystemReady(SpawnSystem __instance)
|
||||
{
|
||||
ScaleBudget(__instance);
|
||||
}
|
||||
|
||||
public static void BeforeZoneServerStart(SpawnZone __instance)
|
||||
{
|
||||
ScaleQuota(__instance);
|
||||
}
|
||||
|
||||
public static void AfterZoneServerStart(SpawnZone __instance)
|
||||
{
|
||||
if (__instance == null)
|
||||
return;
|
||||
|
||||
int id = __instance.GetInstanceID();
|
||||
if (!_loadedLeft.Remove(id, out int left) || __instance.EnemiesLeft == left)
|
||||
return;
|
||||
|
||||
_applying = true;
|
||||
try
|
||||
{
|
||||
__instance.EnemiesLeft = left;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_applying = false;
|
||||
}
|
||||
}
|
||||
|
||||
public static void BeforeSaveZones()
|
||||
{
|
||||
_saving = true;
|
||||
}
|
||||
|
||||
public static void AfterSaveZones()
|
||||
{
|
||||
_saving = false;
|
||||
}
|
||||
|
||||
public static void BeforeLoadZones()
|
||||
{
|
||||
_loading++;
|
||||
}
|
||||
|
||||
public static void AfterLoadZones()
|
||||
{
|
||||
if (_loading > 0)
|
||||
_loading--;
|
||||
|
||||
foreach (KeyValuePair<int, SpawnZone> pair in _trackedZones)
|
||||
{
|
||||
if (pair.Value != null)
|
||||
ApplyCap(pair.Value);
|
||||
}
|
||||
}
|
||||
|
||||
// Saves store the vanilla kill count. While a save is reading the property, report that count.
|
||||
public static void AfterReadEnemiesLeft(SpawnZone __instance, ref int __result)
|
||||
{
|
||||
if (!_saving || __instance == null)
|
||||
return;
|
||||
|
||||
int id = __instance.GetInstanceID();
|
||||
if (!_vanillaInitial.ContainsKey(id))
|
||||
return;
|
||||
|
||||
float population = AppliedPopulation(__instance);
|
||||
if (population <= 0f)
|
||||
return;
|
||||
|
||||
__result = Mathf.CeilToInt(__result / population);
|
||||
}
|
||||
|
||||
// Loaded kills are the vanilla remaining count. Stretch them to the horde quota.
|
||||
public static void BeforeWriteEnemiesLeft(SpawnZone __instance, [HarmonyArgument(0)] ref int value)
|
||||
{
|
||||
if (_applying || _loading <= 0)
|
||||
return;
|
||||
|
||||
value = ScaleCount(value, AppliedPopulation(__instance));
|
||||
if (__instance != null)
|
||||
_loadedLeft[__instance.GetInstanceID()] = value;
|
||||
}
|
||||
|
||||
public static void AfterEnemyServerStart(EnemyControlAStar __instance)
|
||||
{
|
||||
try
|
||||
{
|
||||
Weaken(__instance);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
HordePlugin.LogSource.LogWarning("Horde could not weaken a zone enemy: " + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
public static void AfterEnemyClientStart(EnemyControlAStar __instance)
|
||||
{
|
||||
try
|
||||
{
|
||||
MatchClientHealth(__instance);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
HordePlugin.LogSource.LogWarning("Horde could not match client health: " + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
public static void AfterEnemyServerStop(EnemyControlAStar __instance)
|
||||
{
|
||||
if (__instance == null)
|
||||
return;
|
||||
|
||||
int enemyId = __instance.GetInstanceID();
|
||||
_healthScaled.Remove(enemyId);
|
||||
if (_pawnByEnemy.TryGetValue(enemyId, out int pawnId))
|
||||
{
|
||||
_pawnStats.Remove(pawnId);
|
||||
_pawnByEnemy.Remove(enemyId);
|
||||
}
|
||||
}
|
||||
|
||||
public static void AfterReadDamage(PawnStatus __instance, ref float __result)
|
||||
{
|
||||
if (__instance == null)
|
||||
return;
|
||||
|
||||
if (_pawnStats.TryGetValue(__instance.GetInstanceID(), out float multiplier))
|
||||
__result *= multiplier;
|
||||
}
|
||||
|
||||
static void ScaleBudget(SpawnSystem system)
|
||||
{
|
||||
if (system == null)
|
||||
return;
|
||||
|
||||
int id = system.GetInstanceID();
|
||||
if (!_vanillaBudget.TryGetValue(id, out int vanilla))
|
||||
{
|
||||
int cap = system.EnemiesCap;
|
||||
if (cap <= 0)
|
||||
return;
|
||||
|
||||
vanilla = cap;
|
||||
_vanillaBudget[id] = vanilla;
|
||||
}
|
||||
|
||||
float budget = HordeConfig.BudgetPopulation();
|
||||
if (budget <= 0f)
|
||||
budget = 1f;
|
||||
|
||||
_budgetMultiplier = budget;
|
||||
int scaled = ScaleCount(vanilla, budget);
|
||||
if (system.EnemiesCap != scaled)
|
||||
{
|
||||
system.EnemiesCap = scaled;
|
||||
HordePlugin.LogSource.LogInfo($"Horde enemy cap {vanilla} -> {scaled}.");
|
||||
}
|
||||
|
||||
foreach (KeyValuePair<int, SpawnZone> pair in _trackedZones)
|
||||
{
|
||||
if (pair.Value != null)
|
||||
ApplyCap(pair.Value);
|
||||
}
|
||||
}
|
||||
|
||||
static void ScaleQuota(SpawnZone zone)
|
||||
{
|
||||
if (zone == null)
|
||||
return;
|
||||
|
||||
int id = zone.GetInstanceID();
|
||||
_trackedZones[id] = zone;
|
||||
NoteZone(zone);
|
||||
|
||||
if (!_vanillaInitial.TryGetValue(id, out int vanilla))
|
||||
{
|
||||
vanilla = zone.InitialEnemies;
|
||||
_vanillaInitial[id] = vanilla;
|
||||
}
|
||||
|
||||
float population = HordeConfig.Population(zone);
|
||||
if (population <= 0f)
|
||||
population = 1f;
|
||||
|
||||
_appliedPopulation[id] = population;
|
||||
int scaled = ScaleCount(vanilla, population);
|
||||
if (zone.InitialEnemies != scaled)
|
||||
zone.InitialEnemies = scaled;
|
||||
|
||||
ApplyCap(zone);
|
||||
}
|
||||
|
||||
static float AppliedPopulation(SpawnZone zone)
|
||||
{
|
||||
if (zone != null && _appliedPopulation.TryGetValue(zone.GetInstanceID(), out float applied) && applied > 0f)
|
||||
return applied;
|
||||
|
||||
float population = HordeConfig.Population(zone);
|
||||
return population <= 0f ? 1f : population;
|
||||
}
|
||||
|
||||
static int ScaleCount(int count, float multiplier)
|
||||
{
|
||||
if (count <= 0 || multiplier <= 0f)
|
||||
return 0;
|
||||
|
||||
return Mathf.Max(0, Mathf.RoundToInt(count * multiplier));
|
||||
}
|
||||
|
||||
// The shared cap is one number. A zone's own share is its multiplier over that shared budget.
|
||||
static void ApplyCap(SpawnZone zone)
|
||||
{
|
||||
float population = HordeConfig.Population(zone);
|
||||
if (population <= 0f)
|
||||
population = 1f;
|
||||
|
||||
float budget = _budgetMultiplier > 0f ? _budgetMultiplier : HordeConfig.BudgetPopulation();
|
||||
if (budget <= 0f)
|
||||
budget = 1f;
|
||||
|
||||
int id = zone.GetInstanceID();
|
||||
if (!_caps.TryGetValue(id, out CapState state))
|
||||
{
|
||||
state = new CapState();
|
||||
_caps[id] = state;
|
||||
}
|
||||
|
||||
float current = zone.CapMultiplier;
|
||||
if (!state.Captured)
|
||||
{
|
||||
state.Vanilla = current;
|
||||
state.Captured = true;
|
||||
}
|
||||
else if (Mathf.Abs(current - state.Applied) > 0.0001f)
|
||||
{
|
||||
state.Vanilla = current;
|
||||
}
|
||||
|
||||
float next = state.Vanilla * population / budget;
|
||||
state.Applied = next;
|
||||
if (Mathf.Abs(current - next) > 0.0001f)
|
||||
zone.CapMultiplier = next;
|
||||
}
|
||||
|
||||
static void NoteZone(SpawnZone zone)
|
||||
{
|
||||
if (HordeConfig.TryZone(zone, out _))
|
||||
return;
|
||||
|
||||
string name = zone.ZoneName;
|
||||
if (string.IsNullOrEmpty(name) || !_unknownZones.Add(name))
|
||||
return;
|
||||
|
||||
HordePlugin.LogSource.LogInfo("Horde has no config entry for zone '" + name + "'. Using global multipliers.");
|
||||
}
|
||||
|
||||
static void Weaken(EnemyControlAStar enemy)
|
||||
{
|
||||
if (enemy == null || enemy.SpawnZone == null)
|
||||
return;
|
||||
|
||||
PawnStatus status = enemy.PawnStatus;
|
||||
if (status == null)
|
||||
return;
|
||||
|
||||
int enemyId = enemy.GetInstanceID();
|
||||
if (!_healthScaled.Add(enemyId))
|
||||
return;
|
||||
|
||||
float stat = HordeConfig.Stat(enemy.SpawnZone);
|
||||
if (Mathf.Abs(stat - 1f) < 0.0001f)
|
||||
{
|
||||
_healthScaled.Remove(enemyId);
|
||||
return;
|
||||
}
|
||||
|
||||
status.InitialHealth *= stat;
|
||||
|
||||
SyncVar<float> health = status.Health;
|
||||
if (health != null)
|
||||
health.Value *= stat;
|
||||
|
||||
ScaleParts(enemy.damageableParts, stat);
|
||||
|
||||
int pawnId = status.GetInstanceID();
|
||||
_pawnStats[pawnId] = stat;
|
||||
_pawnByEnemy[enemyId] = pawnId;
|
||||
}
|
||||
|
||||
// The zone reference is not networked. A client sees the replicated health already
|
||||
// halved and has to lower the local max so the bar still starts full.
|
||||
static void MatchClientHealth(EnemyControlAStar enemy)
|
||||
{
|
||||
if (enemy == null)
|
||||
return;
|
||||
|
||||
int enemyId = enemy.GetInstanceID();
|
||||
if (_healthScaled.Contains(enemyId))
|
||||
return;
|
||||
|
||||
PawnStatus status = enemy.PawnStatus;
|
||||
if (status == null)
|
||||
return;
|
||||
|
||||
float stat;
|
||||
if (enemy.SpawnZone != null)
|
||||
{
|
||||
stat = HordeConfig.Stat(enemy.SpawnZone);
|
||||
}
|
||||
else
|
||||
{
|
||||
SyncVar<float> health = status.Health;
|
||||
float initial = status.InitialHealth;
|
||||
if (health == null || initial <= 1f || !TryMatchStat(health.Value, initial, out stat))
|
||||
return;
|
||||
}
|
||||
|
||||
if (Mathf.Abs(stat - 1f) < 0.0001f)
|
||||
return;
|
||||
|
||||
_healthScaled.Add(enemyId);
|
||||
status.InitialHealth *= stat;
|
||||
}
|
||||
|
||||
static bool TryMatchStat(float health, float initial, out float multiplier)
|
||||
{
|
||||
multiplier = 1f;
|
||||
HordeConfig.CollectStats(_statCandidates);
|
||||
float best = 0.05f;
|
||||
bool found = false;
|
||||
for (int i = 0; i < _statCandidates.Count; i++)
|
||||
{
|
||||
float candidate = _statCandidates[i];
|
||||
float delta = Mathf.Abs(health - initial * candidate);
|
||||
if (delta > best)
|
||||
continue;
|
||||
|
||||
best = delta;
|
||||
multiplier = candidate;
|
||||
found = true;
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
static void ScaleParts(Il2CppReferenceArray<DamageablePart> parts, float stat)
|
||||
{
|
||||
if (parts == null)
|
||||
return;
|
||||
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
{
|
||||
DamageablePart part = parts[i];
|
||||
if (part == null || part.MaxHealth <= 0f)
|
||||
continue;
|
||||
|
||||
part.MaxHealth *= stat;
|
||||
SyncVar<float> current = part.CurrentHealth;
|
||||
if (current != null)
|
||||
current.Value *= stat;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<ImplicitUsings>disable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<AssemblyName>Skopje.Horde</AssemblyName>
|
||||
<RootNamespace>Skopje.Horde</RootNamespace>
|
||||
<AppendTargetFrameworkToOutputPath>true</AppendTargetFrameworkToOutputPath>
|
||||
<GameDir Condition="'$(GameDir)' == ''">D:\SteamLibrary\steamapps\common\Skopje83</GameDir>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="0Harmony">
|
||||
<HintPath>$(GameDir)\BepInEx\core\0Harmony.dll</HintPath>
|
||||
<Private>false</Private>
|
||||
</Reference>
|
||||
<Reference Include="BepInEx.Core">
|
||||
<HintPath>$(GameDir)\BepInEx\core\BepInEx.Core.dll</HintPath>
|
||||
<Private>false</Private>
|
||||
</Reference>
|
||||
<Reference Include="BepInEx.Unity.IL2CPP">
|
||||
<HintPath>$(GameDir)\BepInEx\core\BepInEx.Unity.IL2CPP.dll</HintPath>
|
||||
<Private>false</Private>
|
||||
</Reference>
|
||||
<Reference Include="Il2CppInterop.Runtime">
|
||||
<HintPath>$(GameDir)\BepInEx\core\Il2CppInterop.Runtime.dll</HintPath>
|
||||
<Private>false</Private>
|
||||
</Reference>
|
||||
<Reference Include="Il2Cppmscorlib">
|
||||
<HintPath>$(GameDir)\BepInEx\interop\Il2Cppmscorlib.dll</HintPath>
|
||||
<Private>false</Private>
|
||||
</Reference>
|
||||
<Reference Include="SkopjeAssembly">
|
||||
<HintPath>$(GameDir)\BepInEx\interop\SkopjeAssembly.dll</HintPath>
|
||||
<Private>false</Private>
|
||||
</Reference>
|
||||
<Reference Include="FishNet.Runtime">
|
||||
<HintPath>$(GameDir)\BepInEx\interop\FishNet.Runtime.dll</HintPath>
|
||||
<Private>false</Private>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.CoreModule">
|
||||
<HintPath>$(GameDir)\BepInEx\interop\UnityEngine.CoreModule.dll</HintPath>
|
||||
<Private>false</Private>
|
||||
</Reference>
|
||||
<Reference Include="Archon.SwissArmyLib">
|
||||
<HintPath>$(GameDir)\BepInEx\interop\Archon.SwissArmyLib.dll</HintPath>
|
||||
<Private>false</Private>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v6.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v6.0": {
|
||||
"Skopje.Horde/1.0.0": {
|
||||
"runtime": {
|
||||
"Skopje.Horde.dll": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"Skopje.Horde/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,230 @@
|
||||
## Settings file was created by plugin Skopje Horde v1.0.0
|
||||
## Plugin GUID: com.skopje.horde
|
||||
##
|
||||
## Global multipliers apply to every zone whose Override is false.
|
||||
## PopulationMultiplier multiplies that zone's enemy count, remaining kills, and alive cap. Decimal, range 0.01 to 64, default 4.
|
||||
## StatMultiplier multiplies health and damage of enemies that zone spawns. Range 0.01 to 10, default 0.5.
|
||||
## Set a zone's Override to true to use that zone's own PopulationMultiplier and StatMultiplier instead of Global.
|
||||
|
||||
[Global]
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Metalsky.Kale]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Metalsky.Chair - West]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Metalsky.Chair - East]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Metalsky.Chair]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Metalsky.Zhelezara]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Metalsky.Avtokomanda]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Metalsky.Triangla]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Vesna.Vesna]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Vesna.Karposh]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Vesna.Kozle]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Vesna.Debar Maalo]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Vesna.Taftalidze]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Vesna.Treska]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Vesna.Stadium]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Teofan.Teofan]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Teofan.Ostrovo]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Teofan.Michurin]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Teofan.Kisela Voda]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Teofan.Kisela Voda - East]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Teofan.Crniche]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Teofan.Aerodrom]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Teofan.Sandanski]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Eva.Eva]
|
||||
|
||||
Override = true
|
||||
|
||||
PopulationMultiplier = 1
|
||||
|
||||
StatMultiplier = 1
|
||||
|
||||
[Ana.Ana]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Ana.UKIM]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Ana.Kapishtec]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
[Ana.Gradski Dzid]
|
||||
|
||||
Override = false
|
||||
|
||||
PopulationMultiplier = 4
|
||||
|
||||
StatMultiplier = 0.5
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"format": 1,
|
||||
"restore": {
|
||||
"c:\\Users\\andre\\Desktop\\SkopjeMods\\Horde\\HordePlugin.csproj": {}
|
||||
},
|
||||
"projects": {
|
||||
"c:\\Users\\andre\\Desktop\\SkopjeMods\\Horde\\HordePlugin.csproj": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "c:\\Users\\andre\\Desktop\\SkopjeMods\\Horde\\HordePlugin.csproj",
|
||||
"projectName": "Skopje.Horde",
|
||||
"projectPath": "c:\\Users\\andre\\Desktop\\SkopjeMods\\Horde\\HordePlugin.csproj",
|
||||
"packagesPath": "C:\\Users\\andre\\AppData\\Local\\Temp\\cursor-sandbox-cache\\a0404811fc6e51c4c5761fd11591789f\\nuget",
|
||||
"outputPath": "c:\\Users\\andre\\Desktop\\SkopjeMods\\Horde\\obj\\",
|
||||
"projectStyle": "PackageReference",
|
||||
"configFilePaths": [
|
||||
"C:\\Users\\andre\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net6.0"
|
||||
],
|
||||
"sources": {
|
||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
||||
"https://api.nuget.org/v3/index.json": {}
|
||||
},
|
||||
"frameworks": {
|
||||
"net6.0": {
|
||||
"framework": "net6.0",
|
||||
"targetAlias": "net6.0",
|
||||
"projectReferences": {}
|
||||
}
|
||||
},
|
||||
"warningProperties": {
|
||||
"warnAsError": [
|
||||
"NU1605"
|
||||
]
|
||||
},
|
||||
"restoreAuditProperties": {
|
||||
"enableAudit": "true",
|
||||
"auditLevel": "low",
|
||||
"auditMode": "direct"
|
||||
},
|
||||
"SdkAnalysisLevel": "10.0.300"
|
||||
},
|
||||
"frameworks": {
|
||||
"net6.0": {
|
||||
"framework": "net6.0",
|
||||
"targetAlias": "net6.0",
|
||||
"imports": [
|
||||
"net461",
|
||||
"net462",
|
||||
"net47",
|
||||
"net471",
|
||||
"net472",
|
||||
"net48",
|
||||
"net481"
|
||||
],
|
||||
"assetTargetFallback": true,
|
||||
"warn": true,
|
||||
"downloadDependencies": [
|
||||
{
|
||||
"name": "Microsoft.AspNetCore.App.Ref",
|
||||
"version": "[6.0.36, 6.0.36]"
|
||||
},
|
||||
{
|
||||
"name": "Microsoft.NETCore.App.Ref",
|
||||
"version": "[6.0.36, 6.0.36]"
|
||||
},
|
||||
{
|
||||
"name": "Microsoft.WindowsDesktop.App.Ref",
|
||||
"version": "[6.0.36, 6.0.36]"
|
||||
}
|
||||
],
|
||||
"frameworkReferences": {
|
||||
"Microsoft.NETCore.App": {
|
||||
"privateAssets": "all"
|
||||
}
|
||||
},
|
||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.301\\RuntimeIdentifierGraph.json"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\AppData\Local\Temp\cursor-sandbox-cache\a0404811fc6e51c4c5761fd11591789f\nuget</NuGetPackageRoot>
|
||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\andre\AppData\Local\Temp\cursor-sandbox-cache\a0404811fc6e51c4c5761fd11591789f\nuget</NuGetPackageFolders>
|
||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<SourceRoot Include="C:\Users\andre\AppData\Local\Temp\cursor-sandbox-cache\a0404811fc6e51c4c5761fd11591789f\nuget\" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />
|
||||
@@ -0,0 +1,4 @@
|
||||
// <autogenerated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
|
||||
@@ -0,0 +1,22 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("Skopje.Horde")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("Skopje.Horde")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("Skopje.Horde")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
// Generated by the MSBuild WriteCodeFragment class.
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
78354d0dbe9c37cdeff6d330f786856a0657639466ace854ec971ba17a86c0d3
|
||||
@@ -0,0 +1,18 @@
|
||||
is_global = true
|
||||
build_property.TargetFramework = net6.0
|
||||
build_property.TargetFrameworkIdentifier = .NETCoreApp
|
||||
build_property.TargetFrameworkVersion = v6.0
|
||||
build_property.TargetPlatformMinVersion =
|
||||
build_property.UsingMicrosoftNETSdkWeb =
|
||||
build_property.ProjectTypeGuids =
|
||||
build_property.InvariantGlobalization =
|
||||
build_property.PlatformNeutralAssembly =
|
||||
build_property.EnforceExtendedAnalyzerRules =
|
||||
build_property.EntryPointFilePath =
|
||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||
build_property.RootNamespace = Skopje.Horde
|
||||
build_property.ProjectDir = c:\Users\andre\Desktop\SkopjeMods\Horde\
|
||||
build_property.EnableComHosting =
|
||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||
build_property.EffectiveAnalysisLevelStyle = 6.0
|
||||
build_property.EnableCodeStyleSeverity =
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
c7952710e69e753726d2741a7baa2fed13a39f80a1316f04ebf980f3f88f4dfc
|
||||
@@ -0,0 +1,12 @@
|
||||
c:\Users\andre\Desktop\SkopjeMods\Horde\obj\Release\net6.0\HordePlugin.csproj.AssemblyReference.cache
|
||||
c:\Users\andre\Desktop\SkopjeMods\Horde\obj\Release\net6.0\HordePlugin.GeneratedMSBuildEditorConfig.editorconfig
|
||||
c:\Users\andre\Desktop\SkopjeMods\Horde\obj\Release\net6.0\HordePlugin.AssemblyInfoInputs.cache
|
||||
c:\Users\andre\Desktop\SkopjeMods\Horde\obj\Release\net6.0\HordePlugin.AssemblyInfo.cs
|
||||
c:\Users\andre\Desktop\SkopjeMods\Horde\obj\Release\net6.0\HordePlugin.csproj.CoreCompileInputs.cache
|
||||
c:\Users\andre\Desktop\SkopjeMods\Horde\bin\Release\net6.0\Skopje.Horde.deps.json
|
||||
c:\Users\andre\Desktop\SkopjeMods\Horde\bin\Release\net6.0\Skopje.Horde.dll
|
||||
c:\Users\andre\Desktop\SkopjeMods\Horde\bin\Release\net6.0\Skopje.Horde.pdb
|
||||
c:\Users\andre\Desktop\SkopjeMods\Horde\obj\Release\net6.0\Skopje.Horde.dll
|
||||
c:\Users\andre\Desktop\SkopjeMods\Horde\obj\Release\net6.0\refint\Skopje.Horde.dll
|
||||
c:\Users\andre\Desktop\SkopjeMods\Horde\obj\Release\net6.0\Skopje.Horde.pdb
|
||||
c:\Users\andre\Desktop\SkopjeMods\Horde\obj\Release\net6.0\ref\Skopje.Horde.dll
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"version": 4,
|
||||
"targets": {
|
||||
"net6.0": {}
|
||||
},
|
||||
"libraries": {},
|
||||
"projectFileDependencyGroups": {
|
||||
"net6.0": []
|
||||
},
|
||||
"packageFolders": {
|
||||
"C:\\Users\\andre\\AppData\\Local\\Temp\\cursor-sandbox-cache\\a0404811fc6e51c4c5761fd11591789f\\nuget": {}
|
||||
},
|
||||
"project": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "c:\\Users\\andre\\Desktop\\SkopjeMods\\Horde\\HordePlugin.csproj",
|
||||
"projectName": "Skopje.Horde",
|
||||
"projectPath": "c:\\Users\\andre\\Desktop\\SkopjeMods\\Horde\\HordePlugin.csproj",
|
||||
"packagesPath": "C:\\Users\\andre\\AppData\\Local\\Temp\\cursor-sandbox-cache\\a0404811fc6e51c4c5761fd11591789f\\nuget",
|
||||
"outputPath": "c:\\Users\\andre\\Desktop\\SkopjeMods\\Horde\\obj\\",
|
||||
"projectStyle": "PackageReference",
|
||||
"configFilePaths": [
|
||||
"C:\\Users\\andre\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net6.0"
|
||||
],
|
||||
"sources": {
|
||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
||||
"https://api.nuget.org/v3/index.json": {}
|
||||
},
|
||||
"frameworks": {
|
||||
"net6.0": {
|
||||
"framework": "net6.0",
|
||||
"targetAlias": "net6.0",
|
||||
"projectReferences": {}
|
||||
}
|
||||
},
|
||||
"warningProperties": {
|
||||
"warnAsError": [
|
||||
"NU1605"
|
||||
]
|
||||
},
|
||||
"restoreAuditProperties": {
|
||||
"enableAudit": "true",
|
||||
"auditLevel": "low",
|
||||
"auditMode": "direct"
|
||||
},
|
||||
"SdkAnalysisLevel": "10.0.300"
|
||||
},
|
||||
"frameworks": {
|
||||
"net6.0": {
|
||||
"framework": "net6.0",
|
||||
"targetAlias": "net6.0",
|
||||
"imports": [
|
||||
"net461",
|
||||
"net462",
|
||||
"net47",
|
||||
"net471",
|
||||
"net472",
|
||||
"net48",
|
||||
"net481"
|
||||
],
|
||||
"assetTargetFallback": true,
|
||||
"warn": true,
|
||||
"downloadDependencies": [
|
||||
{
|
||||
"name": "Microsoft.AspNetCore.App.Ref",
|
||||
"version": "[6.0.36, 6.0.36]"
|
||||
},
|
||||
{
|
||||
"name": "Microsoft.NETCore.App.Ref",
|
||||
"version": "[6.0.36, 6.0.36]"
|
||||
},
|
||||
{
|
||||
"name": "Microsoft.WindowsDesktop.App.Ref",
|
||||
"version": "[6.0.36, 6.0.36]"
|
||||
}
|
||||
],
|
||||
"frameworkReferences": {
|
||||
"Microsoft.NETCore.App": {
|
||||
"privateAssets": "all"
|
||||
}
|
||||
},
|
||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.301\\RuntimeIdentifierGraph.json"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"version": 2,
|
||||
"dgSpecHash": "6A7ZxIjC660=",
|
||||
"success": true,
|
||||
"projectFilePath": "c:\\Users\\andre\\Desktop\\SkopjeMods\\Horde\\HordePlugin.csproj",
|
||||
"expectedPackageFiles": [
|
||||
"C:\\Users\\andre\\AppData\\Local\\Temp\\cursor-sandbox-cache\\a0404811fc6e51c4c5761fd11591789f\\nuget\\microsoft.netcore.app.ref\\6.0.36\\microsoft.netcore.app.ref.6.0.36.nupkg.sha512",
|
||||
"C:\\Users\\andre\\AppData\\Local\\Temp\\cursor-sandbox-cache\\a0404811fc6e51c4c5761fd11591789f\\nuget\\microsoft.windowsdesktop.app.ref\\6.0.36\\microsoft.windowsdesktop.app.ref.6.0.36.nupkg.sha512",
|
||||
"C:\\Users\\andre\\AppData\\Local\\Temp\\cursor-sandbox-cache\\a0404811fc6e51c4c5761fd11591789f\\nuget\\microsoft.aspnetcore.app.ref\\6.0.36\\microsoft.aspnetcore.app.ref.6.0.36.nupkg.sha512"
|
||||
],
|
||||
"logs": []
|
||||
}
|
||||
Reference in new issue
Block a user