using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("RandomEncounters")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("RandomEncounters")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("06b0b4cd-89d7-4ff2-8dc9-3eaa535b8d99")]
[assembly: AssemblyFileVersion("1.1.3.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.1.3.0")]
namespace RandomEncounters;
internal class SeaLifeMod
{
public class FinWhaleAIPatches
{
[HarmonyPrefix]
public static bool CheckDistanceToPlayerPatch()
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
for (int i = 0; i < EncounterGenerator.whaleSpawns.Count; i++)
{
if (Vector3.Distance(EncounterGenerator.whaleSpawns[i].position, ((Component)Refs.observerMirror).transform.position) > 650f)
{
Plugin.logger.LogDebug((object)("Destroying " + ((Object)EncounterGenerator.whaleSpawns[i]).name));
Object.Destroy((Object)(object)((Component)EncounterGenerator.whaleSpawns[i]).gameObject);
EncounterGenerator.whaleSpawns.Remove(EncounterGenerator.whaleSpawns[i]);
}
}
return false;
}
}
public static FastInvokeHandler spawnWhale;
public static FastInvokeHandler triggerRandomAnimation;
public static void PatchMod()
{
//IL_0104: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Expected O, but got Unknown
((MonoBehaviour)Plugin.seaLifeModInstance).StopAllCoroutines();
Type type2 = (from type in AppDomain.CurrentDomain.GetAssemblies().SelectMany((Assembly asm) => asm.GetTypes())
where type.IsClass && type.Name == "SeaLifePlugin"
select type).Single();
MethodInfo methodInfo = AccessTools.Method(type2, "SpawnWhale", (Type[])null, (Type[])null);
spawnWhale = MethodInvoker.GetHandler(methodInfo, false);
Type type3 = (from type in AppDomain.CurrentDomain.GetAssemblies().SelectMany((Assembly asm) => asm.GetTypes())
where type.IsClass && type.Name == "FinWhaleAI"
select type).Single();
MethodInfo methodInfo2 = AccessTools.Method(type3, "CheckDistanceToPlayer", (Type[])null, (Type[])null);
MethodInfo methodInfo3 = AccessTools.Method(typeof(FinWhaleAIPatches), "CheckDistanceToPlayerPatch", (Type[])null, (Type[])null);
Plugin.harmony.Patch((MethodBase)methodInfo2, new HarmonyMethod(methodInfo3), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
MethodInfo methodInfo4 = AccessTools.Method(type3, "TriggerRandomAnimation", (Type[])null, (Type[])null);
triggerRandomAnimation = MethodInvoker.GetHandler(methodInfo4, false);
}
}
internal class EncounterGenerator : MonoBehaviour
{
public static EncounterGenerator instance;
public static List<Transform> whaleSpawns;
public void Awake()
{
instance = this;
whaleSpawns = new List<Transform>();
((MonoBehaviour)this).StartCoroutine(GenerateEncounters());
}
private IEnumerator GenerateEncounters()
{
while (true)
{
yield return (object)new WaitForSeconds((float)Random.Range(Plugin.generateEncounterMinTime.Value, Plugin.generateEncounterMinTime.Value + 300));
if ((Object)(object)GameState.currentBoat != (Object)null)
{
Generate();
}
}
}
internal void Generate()
{
Plugin.logger.LogDebug((object)$"Distance to land {GameState.distanceToLand}");
if (!GameState.playing || GameState.sleeping || !(GameState.distanceToLand > 1000f))
{
return;
}
int num = Random.Range(1, 100);
Plugin.logger.LogDebug((object)$"Roll: {num}");
int num2 = num;
int num3 = num2;
if (num3 <= 10)
{
GenerateFlotsam();
return;
}
int num4 = num3;
if (num4 > 10 && num4 <= 15)
{
GenerateFlotsam();
((MonoBehaviour)this).StartCoroutine(GenerateWhale());
return;
}
int num5 = num3;
if (num5 > 15 && num5 <= 40)
{
((MonoBehaviour)this).StartCoroutine(GenerateWhale());
return;
}
int num6 = num3;
if (num6 > 40 && num6 <= 45)
{
((MonoBehaviour)this).StartCoroutine(GenerateDenseFog());
}
}
internal static void GenerateFlotsam()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//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)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
Vector3 spawnPoint = GameState.currentBoat.position + GameState.currentBoat.right * 100f + GameState.currentBoat.forward * (float)Random.Range(-30, 30);
Flotsam.Spawn(spawnPoint);
}
internal IEnumerator GenerateWhale()
{
if (Plugin.controlSeaLifeMod.Value && (Object)(object)Plugin.seaLifeModInstance != (Object)null)
{
for (int i = 0; i < Random.Range(1, 3); i++)
{
Vector3 seaLifespawnPoint = GameState.currentBoat.position + new Vector3((float)Random.Range(-200, 200), -8f, (float)Random.Range(-200, 200));
SeaLifeMod.spawnWhale.Invoke((object)Plugin.seaLifeModInstance, new object[1] { seaLifespawnPoint });
yield return (object)new WaitForSeconds(0.5f);
}
yield return (object)new WaitForSeconds(2f);
whaleSpawns = (from t in ((Component)Refs.shiftingWorld).GetComponentsInChildren<Transform>()
where ((Object)t).name == "FinWhalePrefab(Clone)"
select t).ToList();
Transform whaleTransform = whaleSpawns.FirstOrDefault();
Component finWhaleAI = ((Component)whaleTransform).gameObject.GetComponent("FinWhaleAI");
SeaLifeMod.triggerRandomAnimation.Invoke((object)finWhaleAI, Array.Empty<object>());
}
}
internal IEnumerator GenerateDenseFog()
{
if (!DenseFog.running && !(Traverse.Create((object)WeatherStorms.instance).Method("GetNormalizedDistance", Array.Empty<object>()).GetValue<float>() < 0.5f))
{
DenseFog.Spawn();
yield return (object)new WaitForSeconds(23f);
for (int i = 0; i < 4; i++)
{
Vector3 spawnPoint = GameState.currentBoat.position + GameState.currentBoat.right * (200f + Random.Range(20f, 60f) * (float)i) + GameState.currentBoat.forward * (float)Random.Range(-200, 200);
Flotsam.SpawnItem(spawnPoint, AssetLoader.hull, 1f, wreckage: true);
yield return (object)new WaitForSeconds(1f);
Flotsam.SpawnItem(spawnPoint, AssetLoader.mast, 1f, wreckage: true);
yield return (object)new WaitForSeconds(1f);
Flotsam.SpawnItem(spawnPoint, AssetLoader.bowsprit, 1f, wreckage: true);
yield return (object)new WaitForSeconds(1f);
}
yield return (object)new WaitForSeconds((float)Plugin.fogDuration.Value);
DenseFog.ClearFog();
}
}
}
internal class DenseFog
{
[HarmonyPatch(typeof(OceanColorBlender))]
private class OceanColorBlenderPatches
{
[HarmonyPrefix]
[HarmonyPatch("ApplyPalette")]
public static void ApplyFogDensity(ref OceanColorPalette palette)
{
if (running)
{
originalFogDensity = ((originalFogDensity == 0f) ? palette.fogDensity : originalFogDensity);
currentFogDensity = ((currentFogDensity == 0f) ? palette.fogDensity : currentFogDensity);
if (clearFog && currentFogDensity > originalFogDensity)
{
currentFogDensity -= 1E-05f;
}
if (!clearFog && currentFogDensity < fogDensityMax)
{
currentFogDensity += 1E-05f;
}
palette.fogDensity = currentFogDensity;
if (clearFog && currentFogDensity <= originalFogDensity)
{
running = false;
currentFogDensity = 0f;
originalFogDensity = 0f;
Traverse.Create((object)GameObject.Find("wind").GetComponent<Wind>()).Field("timer").SetValue((object)0);
}
}
}
}
[HarmonyPatch(typeof(Wind))]
private class WindPatches
{
[HarmonyPrefix]
[HarmonyPatch("SetNewGustTarget")]
public static bool NoGust(ref Vector3 ___currentGustTarget, Vector3 ___currentWindTarget)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
if (!running)
{
return true;
}
___currentGustTarget = ___currentWindTarget;
return false;
}
[HarmonyPrefix]
[HarmonyPatch("SetNewWindTarget")]
public static bool LightWind(ref Vector3 ___currentWindTarget)
{
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
if (!running)
{
return true;
}
___currentWindTarget = ((Vector3)(ref Wind.currentBaseWind)).normalized * 3f;
return false;
}
}
[HarmonyPatch(typeof(WaveSound))]
private class WaveSoundPatches
{
[HarmonyPrefix]
[HarmonyPatch("UpdateIntensity")]
public static bool SetToMinVolume(ref float ___audioVolume, float ___minVolume)
{
if (!running)
{
return true;
}
___audioVolume = ___minVolume;
return false;
}
}
[HarmonyPatch(typeof(WindSound))]
private class WindSoundPatches
{
[HarmonyPrefix]
[HarmonyPatch("Update")]
public static bool SetToMinVolume(ref AudioSource ___audio)
{
if (!running)
{
return true;
}
___audio.volume = 0.0001f;
return false;
}
}
internal static bool running = false;
private static bool clearFog = true;
private static readonly float fogDensityMax = 0.06f;
private static float currentFogDensity = 0f;
private static float originalFogDensity = 0f;
public static void Spawn()
{
Plugin.logger.LogDebug((object)"Spawning fog");
clearFog = false;
running = true;
}
public static void ClearFog()
{
Plugin.logger.LogDebug((object)"Clearing fog");
clearFog = true;
}
}
internal class Flotsam
{
private static readonly int[] cargos = new int[22]
{
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 13, 14, 15, 16, 17, 18, 19, 24, 25,
26, 27
};
private static readonly int[] consumables = new int[4] { 104, 108, 131, 132 };
private static readonly int[] bottles = new int[5] { 55, 56, 57, 58, 59 };
private static readonly int[] tobaccos = new int[4] { 311, 313, 315, 319 };
public static void Spawn(Vector3 spawnPoint)
{
//IL_0086: 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_01bd: Unknown result type (might be due to invalid IL or missing references)
//IL_024f: Unknown result type (might be due to invalid IL or missing references)
//IL_025b: Unknown result type (might be due to invalid IL or missing references)
//IL_026d: Unknown result type (might be due to invalid IL or missing references)
//IL_027f: Unknown result type (might be due to invalid IL or missing references)
int num = 4;
int num2 = 3;
int num3 = 2;
for (int i = 0; i < Random.Range(1, num); i++)
{
int num4 = Random.Range(0, cargos.Length - 1);
for (int j = 0; j < Random.Range(1, num2); j++)
{
Plugin.logger.LogDebug((object)$"Choice: {cargos[num4]}");
GameObject val = PrefabsDirectory.instance.directory[cargos[num4]];
float amount = (float)Math.Round((decimal)Random.Range(0f, val.GetComponent<ShipItem>().amount));
SpawnItem(spawnPoint, val, amount);
}
}
for (int k = 0; k < Random.Range(1, num3); k++)
{
int num5 = Random.Range(0, consumables.Length - 1);
Plugin.logger.LogDebug((object)$"Choice: {consumables[num5]}");
GameObject val2 = PrefabsDirectory.instance.directory[consumables[num5]];
float amount2 = (float)Math.Round((decimal)Random.Range(0f, val2.GetComponent<ShipItem>().amount));
SpawnItem(spawnPoint, val2, amount2);
}
for (int l = 0; l < Random.Range(5, 10); l++)
{
int num6 = Random.Range(0, bottles.Length - 1);
Plugin.logger.LogDebug((object)$"Choice: {bottles[num6]}");
GameObject prefabGO = PrefabsDirectory.instance.directory[bottles[num6]];
float amount3 = 0f;
SpawnItem(spawnPoint, prefabGO, amount3);
}
int num7 = Random.Range(0, tobaccos.Length - 1);
Plugin.logger.LogDebug((object)$"Choice: {tobaccos[num7]}");
GameObject val3 = PrefabsDirectory.instance.directory[tobaccos[num7]];
float amount4 = (float)Math.Round((decimal)Random.Range(0f, val3.GetComponent<ShipItem>().amount));
SpawnItem(spawnPoint, val3, amount4);
SpawnItem(spawnPoint, AssetLoader.hull, 1f, wreckage: true);
SpawnItem(spawnPoint, AssetLoader.mast, 1f, wreckage: true);
SpawnItem(spawnPoint, AssetLoader.bowsprit, 1f, wreckage: true);
}
public static void SpawnItem(Vector3 spawnPoint, GameObject prefabGO, float amount, bool wreckage = false)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
GameObject val = Object.Instantiate<GameObject>(prefabGO, spawnPoint, Quaternion.Euler((float)Random.Range(0, 360), (float)Random.Range(0, 360), (float)Random.Range(0, 360)));
val.GetComponent<ShipItem>().sold = true;
val.GetComponent<SaveablePrefab>().RegisterToSave();
if (Object.op_Implicit((Object)(object)val.GetComponent<Good>()))
{
val.GetComponent<Good>().RegisterAsMissionless();
}
val.GetComponent<ShipItem>().amount = amount;
val.GetComponent<ShipItem>().health = amount;
if (wreckage)
{
((GoPointerButton)val.GetComponent<ShipItem>()).unclickable = true;
val.transform.parent = Refs.shiftingWorld;
}
Plugin.logger.LogDebug((object)("Prefab " + ((Object)prefabGO).name + " spawned"));
}
}
[BepInPlugin("com.raddude82.randomencounters", "RandomEncounters", "1.1.3")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
public const string PLUGIN_GUID = "com.raddude82.randomencounters";
public const string PLUGIN_NAME = "RandomEncounters";
public const string PLUGIN_VERSION = "1.1.3";
public const string SEALIFEMOD_GUID = "com.yourname.sailwind.sealifeplugin";
internal static BaseUnityPlugin seaLifeModInstance;
internal static Plugin instance;
internal static ManualLogSource logger;
internal static Harmony harmony;
internal static ConfigEntry<bool> controlSeaLifeMod;
internal static ConfigEntry<int> generateEncounterMinTime;
internal static ConfigEntry<int> fogDuration;
private void Awake()
{
instance = this;
logger = ((BaseUnityPlugin)this).Logger;
harmony = Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "com.raddude82.randomencounters");
generateEncounterMinTime = ((BaseUnityPlugin)this).Config.Bind<int>("Settings", "Minimum encounter generation time", 900, "Minimum time in seconds to get a chance roll for an encounter, the encounter time range max is 5 minutes added to this.");
generateEncounterMinTime = ((BaseUnityPlugin)this).Config.Bind<int>("Settings", "Fog encounter duration", 480, "In seconds, the amount of time the fog encounter lasts.");
controlSeaLifeMod = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Control SeaLifeMod spawns", true, "Use this mod to control SeaLifeMod spawns.");
foreach (KeyValuePair<string, PluginInfo> pluginInfo in Chainloader.PluginInfos)
{
BepInPlugin metadata = pluginInfo.Value.Metadata;
if (controlSeaLifeMod.Value && metadata.GUID.Equals("com.yourname.sailwind.sealifeplugin"))
{
logger.LogInfo((object)"com.yourname.sailwind.sealifeplugin found");
seaLifeModInstance = pluginInfo.Value.Instance;
SeaLifeMod.PatchMod();
}
}
AssetLoader.LoadFlotsam();
((Component)this).gameObject.AddComponent<EncounterGenerator>();
}
}
internal class AssetLoader
{
internal static GameObject hull;
internal static GameObject mast;
internal static GameObject bowsprit;
internal static void LoadFlotsam()
{
string path = Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)Plugin.instance).Info.Location), "Assets", "wreckage_bundle");
AssetBundle val = LoadAssetBundle(path);
hull = val.LoadAsset<GameObject>("hull");
mast = val.LoadAsset<GameObject>("mast");
bowsprit = val.LoadAsset<GameObject>("bowsprit");
}
public static AssetBundle LoadAssetBundle(string path)
{
AssetBundle val = AssetBundle.LoadFromFile(path);
if ((Object)(object)val == (Object)null)
{
Plugin.logger.LogError((object)("Failed to load " + path));
return null;
}
return val;
}
}