// Decompiled with JetBrains decompiler // Type: Terraria.GameContent.Events.MysticLogFairiesEvent // Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null // MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83 // Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe using Microsoft.Xna.Framework; using System; using System.Collections.Generic; using Terraria.Enums; namespace Terraria.GameContent.Events { public class MysticLogFairiesEvent { private bool _canSpawnFairies; private int _delayUntilNextAttempt; private const int DELAY_BETWEEN_ATTEMPTS = 60; private List _stumpCoords = new List(); public void WorldClear() { this._canSpawnFairies = false; this._delayUntilNextAttempt = 0; this._stumpCoords.Clear(); } public void StartWorld() { if (Main.netMode == 1) return; this.ScanWholeOverworldForLogs(); } public void StartNight() { if (Main.netMode == 1) return; this._canSpawnFairies = true; this._delayUntilNextAttempt = 0; this.ScanWholeOverworldForLogs(); } public void UpdateTime() { if (Main.netMode == 1 || !this._canSpawnFairies || !this.IsAGoodTime()) return; this._delayUntilNextAttempt = Math.Max(0, this._delayUntilNextAttempt - Main.dayRate); if (this._delayUntilNextAttempt != 0) return; this._delayUntilNextAttempt = 60; this.TrySpawningFairies(); } private bool IsAGoodTime() => !Main.dayTime && Main.time >= 6480.00009655952 && Main.time <= 25920.0003862381; private void TrySpawningFairies() { if ((double) Main.maxRaining > 0.0 || Main.bloodMoon || NPC.MoonLordCountdown > 0 || Main.snowMoon || Main.pumpkinMoon || Main.invasionType > 0 || this._stumpCoords.Count == 0) return; int oneOverSpawnChance = this.GetOneOverSpawnChance(); bool flag = false; for (int index = 0; index < Main.dayRate; ++index) { if (Main.rand.Next(oneOverSpawnChance) == 0) { flag = true; break; } } if (!flag) return; Point stumpCoord = this._stumpCoords[Main.rand.Next(this._stumpCoords.Count)]; Vector2 worldCoordinates = stumpCoord.ToWorldCoordinates(24f); worldCoordinates.Y -= 50f; if (WorldGen.PlayerLOS(stumpCoord.X, stumpCoord.Y)) return; int num1 = Main.rand.Next(1, 4); if (Main.rand.Next(7) == 0) ++num1; int num2 = (int) Utils.SelectRandom(Main.rand, (short) 585, (short) 584, (short) 583); for (int index = 0; index < num1; ++index) { int Type = (int) Utils.SelectRandom(Main.rand, (short) 585, (short) 584, (short) 583); int number = NPC.NewNPC((int) worldCoordinates.X, (int) worldCoordinates.Y, Type); if (Main.netMode == 2 && number < 200) NetMessage.SendData(23, number: number); } this._canSpawnFairies = false; } public void FallenLogDestroyed() { if (Main.netMode == 1) return; this.ScanWholeOverworldForLogs(); } private void ScanWholeOverworldForLogs() { this._stumpCoords.Clear(); NPC.fairyLog = false; int num1 = (int) Main.worldSurface - 10; int num2 = 100; int num3 = Main.maxTilesX - 100; int num4 = 3; int num5 = 2; List pointList = new List(); for (int x = 100; x < num3; x += num4) { for (int y = num1; y >= num2; y -= num5) { Tile tile = Main.tile[x, y]; if (tile.active() && tile.type == (ushort) 488 && tile.liquid == (byte) 0) { pointList.Add(new Point(x, y)); NPC.fairyLog = true; } } } foreach (Point stumpRandomPoint in pointList) this._stumpCoords.Add(this.GetStumpTopLeft(stumpRandomPoint)); } private Point GetStumpTopLeft(Point stumpRandomPoint) { Tile tile = Main.tile[stumpRandomPoint.X, stumpRandomPoint.Y]; Point point = stumpRandomPoint; point.X -= (int) tile.frameX / 18; point.Y -= (int) tile.frameY / 18; return point; } private int GetOneOverSpawnChance() { int num; switch (Main.GetMoonPhase()) { case MoonPhase.Full: case MoonPhase.Empty: num = 3600; break; default: num = 10800; break; } return num / 60; } } }