From 515f9408bd2ce066b746b0b57d669a28c1a9bdd7 Mon Sep 17 00:00:00 2001 From: Jofairden Date: Thu, 13 Jul 2017 16:16:28 +0200 Subject: [PATCH] Motherboard small improvements Refactoring, generic calls, NPCLoot slightly improved Note: still bugged in MP --- NPCs/Motherboard.cs | 327 ++++++++++++++++++++++---------------------- Tremor.csproj | 11 ++ 2 files changed, 177 insertions(+), 161 deletions(-) diff --git a/NPCs/Motherboard.cs b/NPCs/Motherboard.cs index 0127df3e..89e6da7e 100644 --- a/NPCs/Motherboard.cs +++ b/NPCs/Motherboard.cs @@ -4,65 +4,70 @@ using Terraria; using Terraria.ID; using Terraria.ModLoader; +using Tremor.Items; namespace Tremor.NPCs { + // TODO: fix Motherboard despawn on first hit + // TODO: rewrite this thing, lol [AutoloadBossHead] public class Motherboard : ModNPC { #region "Константы" - const int stateOne_FollowPlayerTime = 120; // Время следования за игроком в первой стадии - const int stateOne_DisappearingTime = 30; // Время исчезновения в первой стадии - const int stateOne_AppearingTime = 30; // Время появления в первой стадии - const int stateSecond_FollowPlayerTime = 90; // Время следования за игроком в второй стадии - const int stateSecond_DisappearingTime = 30; // Время исчезновения в второй стадии - const int stateSecond_AppearingTime = 30; // Время появления в второй стадии - const int maxDrones = 20; // Макс. кол-во дронов - const int DronSpawnAreaX = 300; // Размер площади, в которой может заспавнится дрон, по X - const int DronSpawnAreaY = 300; // Размер площади, в которой может заспавнится дрон, по Y - const int StartDronCount = 8; // Начальное кол-во дронов - const int ShootRate = 150; // Скорость стрельбы (60ед. == 1сек.) - const int LaserDamage = 40; // Урон от лазера - const float LaserKB = 1; // Отброс от лазера - const int LaserYOffset = 95; // Смещение точки спавна лазера по Y ( + значени это вниз, - значение это вверх) - const int TimeToLaserRate = 3; // Скорость выстрелов лазером от дрона до дрона - const int LaserType = ProjectileID.ShadowBeamHostile; // Тип выстрела по игроку - const int AnimationRate = 6; // Скорость смены кадров - const int SecondShootCount = 3; - const float SecondShootSpeed = 15f; - const int SecondShootDamage = 30; - const float SecondShootKN = 1.0f; - const int SecondShootRate = 60; - const int SecondShootSpread = 65; - const float SecondShootSpreadMult = 0.05f; + + private const int StateOneFollowPlayerTime = 120; // Время следования за игроком в первой стадии + private const int StateOneDisappearingTime = 30; // Время исчезновения в первой стадии + private const int StateOneAppearingTime = 30; // Время появления в первой стадии + private const int StateSecondFollowPlayerTime = 90; // Время следования за игроком в второй стадии + private const int StateSecondDisappearingTime = 30; // Время исчезновения в второй стадии + private const int StateSecondAppearingTime = 30; // Время появления в второй стадии + private const int MaxDrones = 20; // Макс. кол-во дронов + private const int DronSpawnAreaX = 300; // Размер площади, в которой может заспавнится дрон, по X + private const int DronSpawnAreaY = 300; // Размер площади, в которой может заспавнится дрон, по Y + private const int StartDronCount = 8; // Начальное кол-во дронов + private const int ShootRate = 150; // Скорость стрельбы (60ед. == 1сек.) + private const int LaserDamage = 40; // Урон от лазера + private const float LaserKb = 1; // Отброс от лазера + private const int LaserYOffset = 95; // Смещение точки спавна лазера по Y ( + значени это вниз, - значение это вверх) + private const int TimeToLaserRate = 3; // Скорость выстрелов лазером от дрона до дрона + private const int LaserType = ProjectileID.ShadowBeamHostile; // Тип выстрела по игроку + private const int AnimationRate = 6; // Скорость смены кадров + private const int SecondShootCount = 3; + private const float SecondShootSpeed = 15f; + private const int SecondShootDamage = 30; + private const float SecondShootKn = 1.0f; + private const int SecondShootRate = 60; + private const int SecondShootSpread = 65; + private const float SecondShootSpreadMult = 0.05f; #endregion #region "Переменные" - bool FirstAI = true; // Первый ли раз вызван метод AI - bool FirstState = true; // Первая ли стадия - List SignalDrones = new List(); // ID сигнальных дронов - int LastSignalDron = -1; // Последний дрон принимающий лазер - int stateTime = stateOne_AppearingTime + stateOne_DisappearingTime + stateOne_FollowPlayerTime; // Время стадии - bool ShootNow; // Происходит ли сейчас стрелба - int TimeToNextDrone = 1; // Время до спавна следующего дрона - int TimeToShoot = 60; // Время до следующего выстрела - int TimeToLaser = 3; // Время до выстрела лазера от дрона до дрона - int CurrentFrame; // Содержит текущий кадр анимации - int TimeToAnimation = 6; // Время до смены кадра - List Clampers = new List(); // Список кламперов - int SecondShootTime = 60; - int ai = 0; - int getStateTime => getAppearingTimeNow + getDisappearingTimeNow + getFollowPlayerTimeNow; -//----- - // Получить время требуемое на полный цикл смены состояний - int getTimeToNextDrone => (Main.rand.Next(3, 6) * 60); -// Получить время до следующего дрона + private bool _firstAi = true; // Первый ли раз вызван метод AI + private bool _firstState = true; // Первая ли стадия + private List _signalDrones = new List(); // ID сигнальных дронов + private int _lastSignalDron = -1; // Последний дрон принимающий лазер + private int _stateTime = StateOneAppearingTime + StateOneDisappearingTime + StateOneFollowPlayerTime; // Время стадии + private bool _shootNow; // Происходит ли сейчас стрелба + private int _timeToNextDrone = 1; // Время до спавна следующего дрона + private int _timeToShoot = 60; // Время до следующего выстрела + private int _timeToLaser = 3; // Время до выстрела лазера от дрона до дрона + private int _currentFrame; // Содержит текущий кадр анимации + private int _timeToAnimation = 6; // Время до смены кадра + private List _clampers = new List(); // Список кламперов + private int _secondShootTime = 60; + private int _ai = 0; + + private int GetStateTime => GetAppearingTimeNow + GetDisappearingTimeNow + GetFollowPlayerTimeNow; + //----- + // Получить время требуемое на полный цикл смены состояний + private int GetTimeToNextDrone => (Main.rand.Next(3, 6) * 60); + // Получить время до следующего дрона //----- Методы получения времени на состояния в данный момент - int getFollowPlayerTimeNow => (FirstState) ? stateOne_FollowPlayerTime : stateSecond_FollowPlayerTime; - int getDisappearingTimeNow => (FirstState) ? stateOne_DisappearingTime : stateSecond_DisappearingTime; - int getAppearingTimeNow => (FirstState) ? stateOne_AppearingTime : stateSecond_AppearingTime; + private int GetFollowPlayerTimeNow => (_firstState) ? StateOneFollowPlayerTime : StateSecondFollowPlayerTime; + private int GetDisappearingTimeNow => (_firstState) ? StateOneDisappearingTime : StateSecondDisappearingTime; + private int GetAppearingTimeNow => (_firstState) ? StateOneAppearingTime : StateSecondAppearingTime; //----- #endregion @@ -88,7 +93,7 @@ public override void SetDefaults() npc.HitSound = SoundID.NPCHit4; npc.DeathSound = SoundID.NPCDeath10; music = 13; - bossBag = mod.ItemType("MotherboardBag"); + bossBag = mod.ItemType(); } public override void ScaleExpertStats(int numPlayers, float bossLifeScale) @@ -97,7 +102,7 @@ public override void ScaleExpertStats(int numPlayers, float bossLifeScale) npc.damage = (int)(npc.damage * 0.6f); } - void Teleport() + private void Teleport() { npc.aiStyle = 2; npc.position += npc.velocity * 2; @@ -117,17 +122,17 @@ public override void AI() npc.rotation = 0; return; } - if (FirstAI) + if (_firstAi) { - FirstAI = false; + _firstAi = false; for (int i = 0; i < ((StartDronCount <= 0) ? 1 : StartDronCount); i++) { - Vector2 SpawnPosition = Helper.RandomPointInArea(new Vector2(npc.Center.X - DronSpawnAreaX / 2, npc.Center.Y - DronSpawnAreaY / 2), new Vector2(npc.Center.X + DronSpawnAreaX / 2, npc.Center.Y + DronSpawnAreaY / 2)); - SignalDrones.Add(NPC.NewNPC((int)SpawnPosition.X, (int)SpawnPosition.Y, mod.NPCType("SignalDron"), 0, 0, 0, 0, npc.whoAmI)); + Vector2 spawnPosition = Helper.RandomPointInArea(new Vector2(npc.Center.X - DronSpawnAreaX / 2, npc.Center.Y - DronSpawnAreaY / 2), new Vector2(npc.Center.X + DronSpawnAreaX / 2, npc.Center.Y + DronSpawnAreaY / 2)); + _signalDrones.Add(NPC.NewNPC((int)spawnPosition.X, (int)spawnPosition.Y, mod.NPCType("SignalDron"), 0, 0, 0, 0, npc.whoAmI)); } } - ChangeAI(); - if (FirstState) + ChangeAi(); + if (_firstState) { Main.npcHeadBossTexture[NPCID.Sets.BossHeadTextures[npc.type]] = mod.GetTexture("NPCs/Motherboard_Head_Boss"); Drones(); @@ -137,7 +142,7 @@ public override void AI() { Main.npcHeadBossTexture[NPCID.Sets.BossHeadTextures[npc.type]] = mod.GetTexture("NPCs/Motherboard_Head_Boss2"); Teleport(); - if (ai == 1) + if (_ai == 1) { npc.TargetClosest(true); Vector2 vector142 = new Vector2(npc.Center.X, npc.Center.Y); @@ -211,21 +216,21 @@ public override void AI() ChangeStady(); } - void Animation() + private void Animation() { - if (--TimeToAnimation <= 0) + if (--_timeToAnimation <= 0) { - if (++CurrentFrame > 3) - CurrentFrame = 1; - TimeToAnimation = AnimationRate; - npc.frame = GetFrame(CurrentFrame + ((FirstState) ? 0 : 3)); + if (++_currentFrame > 3) + _currentFrame = 1; + _timeToAnimation = AnimationRate; + npc.frame = GetFrame(_currentFrame + ((_firstState) ? 0 : 3)); } } - Rectangle GetFrame(int Number) + private Rectangle GetFrame(int number) { - return new Rectangle(0, npc.frame.Height * (Number - 1), npc.frame.Width, npc.frame.Height); + return new Rectangle(0, npc.frame.Height * (number - 1), npc.frame.Width, npc.frame.Height); } public override void HitEffect(int hitDirection, double damage) @@ -244,56 +249,57 @@ public override void HitEffect(int hitDirection, double damage) } } - void SecondShoot() + private void SecondShoot() { for (int i = (int)npc.position.X - 8; i < (npc.position.X + 8 + npc.width); i += 8) for (int l = (int)npc.Center.Y + 90; l < (npc.Center.Y + 106); l += 8) if (WorldGen.SolidTile(i / 16, l / 16)) return; - if (--SecondShootTime <= 0) + if (--_secondShootTime <= 0) { - SecondShootTime = SecondShootRate; - Projectile.NewProjectile(npc.Center.X, npc.Center.Y + 95, 0, 0, mod.ProjectileType("projMotherboardSuperLaser"), SecondShootDamage, SecondShootKN, 0, npc.whoAmI, 0); - Projectile.NewProjectile(npc.Center.X, npc.Center.Y + 95, 0, 0, mod.ProjectileType("projMotherboardSuperLaser"), SecondShootDamage, SecondShootKN, 0, npc.whoAmI, 1); + _secondShootTime = SecondShootRate; + Projectile.NewProjectile(npc.Center.X, npc.Center.Y + 95, 0, 0, mod.ProjectileType("projMotherboardSuperLaser"), SecondShootDamage, SecondShootKn, 0, npc.whoAmI, 0); + Projectile.NewProjectile(npc.Center.X, npc.Center.Y + 95, 0, 0, mod.ProjectileType("projMotherboardSuperLaser"), SecondShootDamage, SecondShootKn, 0, npc.whoAmI, 1); } } - void ChangeStady() // Попытка смены стадии + private void ChangeStady() // Попытка смены стадии { CheckDrones(); // Удаляем лишних дронов (мёртвых) - if (SignalDrones.Count <= 0) // Если живих дронов нет + if (_signalDrones.Count <= 0) // Если живих дронов нет { - FirstState = false; // Выключаем первую стадию - Clampers = new List + _firstState = false; // Выключаем первую стадию + _clampers = new List { NPC.NewNPC((int) npc.Center.X - 15, (int) npc.Center.Y + 25, mod.NPCType("Clamper"), 0, 0, 0, 0, npc.whoAmI), NPC.NewNPC((int) npc.Center.X - 10, (int) npc.Center.Y + 25, mod.NPCType("Clamper"), 0, 0, 0, 0, npc.whoAmI), NPC.NewNPC((int) npc.Center.X + 10, (int) npc.Center.Y + 25, mod.NPCType("Clamper"), 0, 0, 0, 0, npc.whoAmI), NPC.NewNPC((int) npc.Center.X + 15, (int) npc.Center.Y + 25, mod.NPCType("Clamper"), 0, 0, 0, 0, npc.whoAmI) }; - Main.npc[Clampers[0]].localAI[1] = 1; - Main.npc[Clampers[1]].localAI[1] = 2; - Main.npc[Clampers[2]].localAI[1] = 3; - Main.npc[Clampers[3]].localAI[1] = 4; + Main.npc[_clampers[0]].localAI[1] = 1; + Main.npc[_clampers[1]].localAI[1] = 2; + Main.npc[_clampers[2]].localAI[1] = 3; + Main.npc[_clampers[3]].localAI[1] = 4; } } - int AppearTime; - void ChangeAI() // Сменяет состояние (преследование/исчезновение/появление) + private int _appearTime; + + private void ChangeAi() // Сменяет состояние (преследование/исчезновение/появление) { - if (FirstState) + if (_firstState) { - --stateTime; // Уменьшаем время состояний - if (stateTime <= 0) // Если время состояния меньше или равно 0, то обновляем переменную - stateTime = getStateTime; // Обновление - for (int i = 0; i < Clampers.Count; i++) - Main.npc[Clampers[i]].ai[2] = 1; - if (stateTime <= getAppearingTimeNow) // Если у нас стадия появления + --_stateTime; // Уменьшаем время состояний + if (_stateTime <= 0) // Если время состояния меньше или равно 0, то обновляем переменную + _stateTime = GetStateTime; // Обновление + for (int i = 0; i < _clampers.Count; i++) + Main.npc[_clampers[i]].ai[2] = 1; + if (_stateTime <= GetAppearingTimeNow) // Если у нас стадия появления { npc.ai[0] = -3; // То появляемся return; // Завершаем метод } - if (stateTime <= getAppearingTimeNow + getDisappearingTimeNow) // Если у нас стадия исчезновения + if (_stateTime <= GetAppearingTimeNow + GetDisappearingTimeNow) // Если у нас стадия исчезновения { npc.ai[0] = -2; // Исчезаем return; // Завершаем метод @@ -301,8 +307,8 @@ void ChangeAI() // Сменяет состояние (преследование } // Сюда процессор дойдёт только в том случаи, если сейчас стадия следования за игроком, по этому... if (npc.ai[0] == -2) - AppearTime = getAppearingTimeNow; - if (--AppearTime > 0) + _appearTime = GetAppearingTimeNow; + if (--_appearTime > 0) { npc.ai[0] = -3; return; @@ -310,90 +316,90 @@ void ChangeAI() // Сменяет состояние (преследование npc.ai[0] = -1; // Следуем за игроком } - void CheckClampers() + private void CheckClampers() { - for (int index = 0; index < Clampers.Count; index++) // Проходим по каждому элементу массива с id кламперов - if (!Main.npc[Clampers[index]].active || Main.npc[Clampers[index]].type != mod.NPCType("Clamper")) // Если... - // NPC с текущим ID из массива кламперов, не является клампером, или мёртв, то... + for (int index = 0; index < _clampers.Count; index++) // Проходим по каждому элементу массива с id кламперов + if (!Main.npc[_clampers[index]].active || Main.npc[_clampers[index]].type != mod.NPCType("Clamper")) // Если... + // NPC с текущим ID из массива кламперов, не является клампером, или мёртв, то... { - Clampers.RemoveAt(index); // Удаляем из списка кламперов ID данного NPC + _clampers.RemoveAt(index); // Удаляем из списка кламперов ID данного NPC --index; // Уменьшаем индекс на 1, чтобы не перескочить через одно значение в массиве ID кламперов } - foreach (int ID in Clampers) + foreach (int ID in _clampers) { - int id = Projectile.NewProjectile(npc.Center.X, npc.Center.Y + LaserYOffset, 0, 0, mod.ProjectileType("projClamperLaser"), LaserDamage, LaserKB, 0, npc.whoAmI, ID); - Main.projectile[id].localAI[1] = stateTime; + int id = Projectile.NewProjectile(npc.Center.X, npc.Center.Y + LaserYOffset, 0, 0, mod.ProjectileType("projClamperLaser"), LaserDamage, LaserKb, 0, npc.whoAmI, ID); + Main.projectile[id].localAI[1] = _stateTime; } } - void Drones() // Работает с дронами (только в первой стадии) + private void Drones() // Работает с дронами (только в первой стадии) { CheckDrones(); // Удаляет из списка всех мёртвых дронов SpawnDrones(); // Спавнит дронов ShootDrones(); // Работа с лазерами } - void CheckDrones() // Удаляет из списка всех мёртвых дронов + private void CheckDrones() // Удаляет из списка всех мёртвых дронов { - for (int index = 0; index < SignalDrones.Count; index++) // Проходим по каждому элементу массива с id дронов - if (!Main.npc[SignalDrones[index]].active || Main.npc[SignalDrones[index]].type != mod.NPCType("SignalDron")) // Если... - // NPC с текущим ID из массива дронов, не является дроном, или мёртв, то... + for (int index = 0; index < _signalDrones.Count; index++) // Проходим по каждому элементу массива с id дронов + if (!Main.npc[_signalDrones[index]].active || Main.npc[_signalDrones[index]].type != mod.NPCType("SignalDron")) // Если... + // NPC с текущим ID из массива дронов, не является дроном, или мёртв, то... { - SignalDrones.RemoveAt(index); // Удаляем из списка дронов ID данного NPC + _signalDrones.RemoveAt(index); // Удаляем из списка дронов ID данного NPC --index; // Уменьшаем индекс на 1, чтобы не перескочить через одно значение в массиве ID дронов } } - void SpawnDrones() // Если пришло время, спавнит дрона + private void SpawnDrones() // Если пришло время, спавнит дрона { - if (SignalDrones.Count >= maxDrones) // Если текущее кол-во дронов равно или привышает лимит дронов, то... + if (_signalDrones.Count >= MaxDrones) // Если текущее кол-во дронов равно или привышает лимит дронов, то... return; // Завершаем метод - if (--TimeToNextDrone <= 0) // Уменьшаем время до спавна следующего дрона. Если время до следующего дрона меньше или равно 0, то... + if (--_timeToNextDrone <= 0) // Уменьшаем время до спавна следующего дрона. Если время до следующего дрона меньше или равно 0, то... { - TimeToNextDrone = getTimeToNextDrone; // Устанавливаем новое время для спавна дронов - Vector2 SpawnPosition = Helper.RandomPointInArea(new Vector2(npc.Center.X - DronSpawnAreaX / 2, npc.Center.Y - DronSpawnAreaY / 2), new Vector2(npc.Center.X + DronSpawnAreaX / 2, npc.Center.Y + DronSpawnAreaY / 2)); + _timeToNextDrone = GetTimeToNextDrone; // Устанавливаем новое время для спавна дронов + Vector2 spawnPosition = Helper.RandomPointInArea(new Vector2(npc.Center.X - DronSpawnAreaX / 2, npc.Center.Y - DronSpawnAreaY / 2), new Vector2(npc.Center.X + DronSpawnAreaX / 2, npc.Center.Y + DronSpawnAreaY / 2)); // С помощью хелпера определяем случайную позицию вокруг босса и записываем в переменную 01 - SignalDrones.Add(NPC.NewNPC((int)SpawnPosition.X, (int)SpawnPosition.Y + LaserYOffset, mod.NPCType("SignalDron"), 0, 0, 0, 0, npc.whoAmI)); + _signalDrones.Add(NPC.NewNPC((int)spawnPosition.X, (int)spawnPosition.Y + LaserYOffset, mod.NPCType("SignalDron"), 0, 0, 0, 0, npc.whoAmI)); // Спавним дрона с координатами из переменной 01 и с ID данного босса в ai[3] } } - void ShootDrones() // Если пришло время, начинает стрельбу + private void ShootDrones() // Если пришло время, начинает стрельбу { - if (SignalDrones.Count <= 0) // Если нету дронов, то... + if (_signalDrones.Count <= 0) // Если нету дронов, то... return; // Завершаем метод - if (--TimeToShoot <= 0 || ShootNow) // Если сейчас идёт стрельба, или настало её время (тут же это время изменяем), то + if (--_timeToShoot <= 0 || _shootNow) // Если сейчас идёт стрельба, или настало её время (тут же это время изменяем), то { - if (LastSignalDron == -1 && npc.ai[0] != -1) + if (_lastSignalDron == -1 && npc.ai[0] != -1) return; - TimeToShoot = ShootRate; // Устанавливаем новое время выстрела - ShootNow = true; // Сейчас стреляем - if (--TimeToLaser <= 0) // Если время стрелять лазером от дрона до дрона + _timeToShoot = ShootRate; // Устанавливаем новое время выстрела + _shootNow = true; // Сейчас стреляем + if (--_timeToLaser <= 0) // Если время стрелять лазером от дрона до дрона { - TimeToLaser = TimeToLaserRate; // Устанавливаем новое время - if (LastSignalDron == -1) // Если нет последнего стрелявшего дрона, то... + _timeToLaser = TimeToLaserRate; // Устанавливаем новое время + if (_lastSignalDron == -1) // Если нет последнего стрелявшего дрона, то... { - LastSignalDron = 0; // Берём первого дрона из массива - Main.projectile[Projectile.NewProjectile(npc.Center.X, npc.Center.Y, 0, 0, mod.ProjectileType("projMotherboardLaser"), LaserDamage, LaserKB, 0, npc.whoAmI, SignalDrones[LastSignalDron])].localAI[1] = 1; + _lastSignalDron = 0; // Берём первого дрона из массива + Main.projectile[Projectile.NewProjectile(npc.Center.X, npc.Center.Y, 0, 0, mod.ProjectileType("projMotherboardLaser"), LaserDamage, LaserKb, 0, npc.whoAmI, _signalDrones[_lastSignalDron])].localAI[1] = 1; // Стреляем в него из босса return; // Выход из метода } - ++LastSignalDron; // Берём следующего дрона - if (LastSignalDron < SignalDrones.Count) // Проверка на выход за пределы массива - Projectile.NewProjectile(npc.Center.X, npc.Center.Y, 0, 0, mod.ProjectileType("projMotherboardLaser"), LaserDamage, LaserKB, 0, SignalDrones[LastSignalDron - 1], SignalDrones[LastSignalDron]); + ++_lastSignalDron; // Берём следующего дрона + if (_lastSignalDron < _signalDrones.Count) // Проверка на выход за пределы массива + Projectile.NewProjectile(npc.Center.X, npc.Center.Y, 0, 0, mod.ProjectileType("projMotherboardLaser"), LaserDamage, LaserKb, 0, _signalDrones[_lastSignalDron - 1], _signalDrones[_lastSignalDron]); // Спавним лазер - if (LastSignalDron + 1 >= SignalDrones.Count) // Если это замыкающий дрон, то... + if (_lastSignalDron + 1 >= _signalDrones.Count) // Если это замыкающий дрон, то... { - Vector2 vel = Helper.VelocityToPoint(Main.npc[SignalDrones[SignalDrones.Count - 1]].Center, Main.player[npc.target].Center, 15f); + Vector2 vel = Helper.VelocityToPoint(Main.npc[_signalDrones[_signalDrones.Count - 1]].Center, Main.player[npc.target].Center, 15f); for (int i = 0; i < SecondShootCount; i++) { - Vector2 velocity = Helper.VelocityToPoint(Main.npc[SignalDrones[SignalDrones.Count - 1]].Center, Main.player[npc.target].Center, SecondShootSpeed); + Vector2 velocity = Helper.VelocityToPoint(Main.npc[_signalDrones[_signalDrones.Count - 1]].Center, Main.player[npc.target].Center, SecondShootSpeed); velocity.X = velocity.X + Main.rand.Next(-SecondShootSpread, SecondShootSpread + 1) * SecondShootSpreadMult; velocity.Y = velocity.Y + Main.rand.Next(-SecondShootSpread, SecondShootSpread + 1) * SecondShootSpreadMult; - Projectile.NewProjectile(npc.Center.X, npc.Center.Y, velocity.X, velocity.Y, LaserType, SecondShootDamage, SecondShootKN); + Projectile.NewProjectile(npc.Center.X, npc.Center.Y, velocity.X, velocity.Y, LaserType, SecondShootDamage, SecondShootKn); } - LastSignalDron = -1; - ShootNow = false; + _lastSignalDron = -1; + _shootNow = false; // Стреляем в игрока другим лазером, устанавливаем последнего дрона на -1 и завершаем цикл стрельбы } } @@ -405,49 +411,48 @@ public override void NPCLoot() NPC.downedMechBossAny = true; NPC.downedMechBoss1 = true; TremorWorld.downedMotherboard = true; - if (Main.netMode != 1) - { - int centerX = (int)(npc.position.X + npc.width / 2) / 16; - int centerY = (int)(npc.position.Y + npc.height / 2) / 16; - int halfLength = npc.width / 2 / 16 + 1; - if (Main.expertMode) - { - npc.DropBossBags(); - } - if (!Main.expertMode && Main.rand.Next(1) == 0) - { - Item.NewItem((int)npc.position.X, (int)npc.position.Y, npc.width, npc.height, mod.ItemType("SoulofMind"), Main.rand.Next(20, 40)); - } - if (!Main.expertMode && Main.rand.Next(1) == 0) - { - Item.NewItem((int)npc.position.X, (int)npc.position.Y, npc.width, npc.height, 499, Main.rand.Next(5, 15)); - } - if (!Main.expertMode && Main.rand.Next(1) == 0) - { - Item.NewItem((int)npc.position.X, (int)npc.position.Y, npc.width, npc.height, 1225, Main.rand.Next(15, 35)); - } - if (!Main.expertMode && Main.rand.Next(7) == 0) - { - Item.NewItem((int)npc.position.X, (int)npc.position.Y, npc.width, npc.height, mod.ItemType("MotherboardMask")); - } - if (Main.rand.Next(10) == 0) + if (Main.expertMode) + { + npc.DropBossBags(); + } + else + { + if (Main.rand.NextBool()) { - Item.NewItem((int)npc.position.X, (int)npc.position.Y, npc.width, npc.height, mod.ItemType("MotherboardTrophy")); + Helper.NewItemFast(npc.position, npc.Size, mod.ItemType(), Main.rand.Next(20, 40)); } - if (Main.rand.Next(3) == 0) + if (Main.rand.NextBool()) { - Item.NewItem((int)npc.position.X, (int)npc.position.Y, npc.width, npc.height, mod.ItemType("BenderLegs")); + Helper.NewItemFast(npc.position, npc.Size, ItemID.GreaterHealingPotion, Main.rand.Next(5, 15)); } - if (NPC.downedMoonlord && Main.rand.Next(1) == 0) + if (Main.rand.NextBool()) { - Item.NewItem((int)npc.position.X, (int)npc.position.Y, npc.width, npc.height, mod.ItemType("CarbonSteel"), Main.rand.Next(6, 12)); + Helper.NewItemFast(npc.position, npc.Size, ItemID.HallowedBar, Main.rand.Next(15, 35)); } - if (NPC.downedMechBossAny && Main.rand.Next(10) == 0) + if (Main.rand.Next(7) == 0) { - Item.NewItem((int)npc.position.X, (int)npc.position.Y, npc.width, npc.height, mod.ItemType("FlaskCore")); + Helper.NewItemFast(npc.position, npc.Size, mod.ItemType()); } } + + if (Main.rand.Next(10) == 0) + { + Helper.NewItemFast(npc.position, npc.Size, mod.ItemType()); + } + if (Main.rand.Next(3) == 0) + { + Helper.NewItemFast(npc.position, npc.Size, mod.ItemType()); + } + if (Main.rand.Next(10) == 0) + { + Helper.NewItemFast(npc.position, npc.Size, mod.ItemType()); + } + + if (NPC.downedMoonlord && Main.rand.NextBool()) + { + Helper.NewItemFast(npc.position, npc.Size, mod.ItemType(), Main.rand.Next(6, 12)); + } } } } \ No newline at end of file diff --git a/Tremor.csproj b/Tremor.csproj index 65de0d3e..2d07a4e4 100644 --- a/Tremor.csproj +++ b/Tremor.csproj @@ -3043,6 +3043,17 @@ + + + + + + + + + + +