protected virtual void AsyncRelease(StarverPlayer player) { Task.Run(() => { try { player.SetBuff(BuffID.ShadowDodge, 60 * 3); player.SetBuff(BuffID.Webbed, 60 * 3); unsafe { Vector *Source = stackalloc Vector[Max]; Vector *ReversedSource = stackalloc Vector[Max]; Vector velocity = new Vector(15, 0); int damage = 1080 * 2; damage += (int)(Math.Sqrt(player.Level) * 3); for (int i = 0; i < Max; i++) { Source[i] = Vector.FromPolar(Math.PI * 2 * i / Max, RadiumMax); ReversedSource[i] = Source[i]; ReversedSource[i].Angle += Math.PI / 2; } #region First stage var rotation = 0.0; while (rotation < 2 * Math.PI) { for (int i = 0; i < Max; i++) { #region NoReverse velocity.Angle = Source[i].Angle - Math.PI / 2 - Math.PI / 12; player.NewProj(player.Center + Source[i], velocity, FromIn[0], damage, 20f); // Source[i].Length -= 16 * 2 / 3; Source[i].Angle += Math.PI / 2 / 30; #endregion #region Reverse velocity.Angle = ReversedSource[i].Angle + Math.PI / 2 + Math.PI / 12; player.NewProj(player.Center + ReversedSource[i], velocity, FromIn[1], damage, 20f); // ReversedSource[i].Length += 16 * 2 / 3; ReversedSource[i].Angle -= Math.PI / 2 / 30; #endregion } rotation += Math.PI / 2 / 30; Thread.Sleep(2000 / 30); } #endregion #region Second stage(Beams) damage /= 2; damage *= 3; for (int i = 0; i < Beams.Length; i++) { player.ProjCircle(player.Center, 16 * 4 + 16 * 8 * i, -13 - 2 * i, Beams[i], 10 + 5 * i, (int)(damage * (1 + 0.1f * i))); Thread.Sleep(175 + 25 * i); } #endregion } } catch { } }); }
public PreNPCStrikeEventArgs(NpcStrikeEventArgs rawArgs, StarverPlayer player, double dIndexLevel, double dIndexMP) { RawArgs = rawArgs; Player = player; DIndexLevel = dIndexLevel; DIndexMP = dIndexMP; }
public PostNPCStrikeEventArgs(NpcStrikeEventArgs rawArgs, StarverPlayer player, int realDamage, int expGet) { RawArgs = rawArgs; RealDamage = realDamage; ExpGet = expGet; Player = player; }
public override void Release(StarverPlayer player, Vector vel) { int damage = 100 + (int)(100 * Math.Log(player.Level * player.Level / 2)); player.NewProj(vel * 10, ProjectileID.DD2ApprenticeStorm, damage, 1); player.NewProj(Vector2.Zero, ProjectileID.SolarWhipSwordExplosion, damage, 1); }
public override void Release(StarverPlayer player, Vector vel) { for (int i = 0; i < 5; i++) { player.NewProj(player.Center, player.FromPolar(vel.Angle + Rand.NextDouble(0, Math.PI / 4), 19f), ProjectileID.MolotovFire, (int)(10 + Math.Log(player.Level)), 2f); } }
protected Vector ItemOffset(StarverPlayer player) { float length = player.HeldItem.height; Vector offset = Vector.FromPolar(player.ItemUseAngle, length); return(offset); }
/// <summary> /// 30%可能性,发射各种宝石法杖弹幕 /// </summary> /// <param name="player"></param> /// <param name="vel"></param> private unsafe void TreasureShots(StarverPlayer player, Vector2 vel) { int *Bolts = stackalloc int[TreasureBolts.Length]; #region RandSelect { bool *Selected = stackalloc bool[TreasureBolts.Length]; for (int i = 0; i < TreasureBolts.Length; i++) { int t; do { t = Rand.Next(TreasureBolts.Length); }while (Selected[t]); Selected[t] = true; Bolts[i] = TreasureBolts[t]; } } #endregion vel.Length(19); Vector relativePos = new Vector(16 * 3.75f, 0); int damage = 60; damage += (int)(2 * Math.Sqrt(player.Level)); damage = Math.Min(300, damage); for (int i = 0; i < TreasureBolts.Length; i++) { relativePos.Angle = Math.PI * 2 * i / TreasureBolts.Length; player.NewProj(player.Center + relativePos, vel, Bolts[i], damage, 5f); } }
public override void Release(StarverPlayer player, Vector vel) { if (!player.IgnoreCD) { AsyncRelease(player); } }
public PostReleaseSkillEventArgs(StarverPlayer player, StarverSkill skill, int mpCost, int cd) { Player = player; Skill = skill; MPCost = mpCost; CD = cd; }
private async void AsyncRelease(StarverPlayer player) { await Task.Run(() => { try { int[] arr = new int[Rand.Next(4) + 1]; int damage = (int)(50 * Math.Log(player.Level)); for (int i = 0; i < arr.Length; i++) { arr[i] = player.NewProj(player.Center, Rand.NextVector2(9), ProjectileID.SporeGas, damage, 20f); } int timer = 0; while (Main.projectile[arr[0]].active && Main.projectile[arr[0]].owner == player.Index && timer < 3000) { foreach (var idx in arr) { player.NewProj(Main.projectile[idx].Center, Rand.NextVector2(15), ProjectileID.TerrarianBeam, damage * 3 / 2, 20f); } timer += 25; Thread.Sleep(25); } } catch { } }); }
protected override void InternalRelease(StarverPlayer player, Vector vel) { Task.Run(() => { try { var damage = Math.Min(2000, player.Level / 80 + 900); player.ProjCircle(player.Center, 32, 16, ProjectileID.DD2SquireSonicBoom, 10, 1080); player.ProjSector(player.Center, 16, 16, vel.Angle, Math.PI / 4, 1310, ProjectileID.NebulaBlaze2, 3); var vertical = vel.ToVertical(84); player.ProjLine(player.Center + vertical, player.Center - vertical, vel.ToLenOf(18f), 10, 2300, ProjectileID.TerraBeam); vertical.Length = 16 * 10; var center = player.Center; var go = vel.ToLenOf(16 * 3f); var v2 = go.ToLenOf(0.1f); for (int i = 0; i < 20; i++) { player.ProjLine(center - vertical, center + vertical, v2, 10, damage, ProjectileID.SolarWhipSwordExplosion); center += go; Thread.Sleep(4000 / 39); } } catch { } }); }
public override void Release(StarverPlayer player, Vector vel) { foreach (NPC npc in Main.npc) { if (npc.active && (npc.Center - player.TPlayer.Center).Length() <= rec + Math.Min(player.Level / 5, 16 * 30)) { npc.velocity = new Vector2(0); NetMessage.SendData((int)PacketTypes.NpcUpdate, -1, -1, null, npc.whoAmI); player.NewProj(npc.Center, Vector2.Zero, ProjectileID.StardustGuardianExplosion, player.Level * 10 + 1400, 0); } } if (player.TPlayer.hostile) { foreach (Player ply in Main.player) { if ((!ply.hostile) || (ply.Center - player.TPlayer.Center).Length() > rec + player.Level || ply.whoAmI == player.Index || (ply.team == player.TSPlayer.Team && ply.team != 0 && ply.team != 1)) { continue; } ply.velocity = Vector2.Zero; NetMessage.SendData((int)PacketTypes.PlayerUpdate, -1, -1, null, ply.whoAmI); player.NewProj(ply.Center, Vector2.Zero, ProjectileID.StardustGuardianExplosion, player.Level * 10 + 1400, 0); } } player.SetBuff(BuffID.ShadowDodge); }
private async void AsyncRelease(StarverPlayer player) { await Task.Run(() => { try { int damage = (int)Math.Log(player.Level); damage *= damage; damage *= 5; Vector2 RandPos() { return(player.Center + new Vector2(0, 16 * 2) + Rand.NextVector2(16 * 3.5f, 0)); } Vector2 RandVel() { return(Rand.NextVector2(0.5f, 0.1f) + new Vector2(0, 0.1f)); } int Tag = 10 * 8; while (Tag > 0 && player.Alive) { player.NewProj(RandPos(), RandVel(), Projs.Next(), damage, 20f); Thread.Sleep(125); Tag--; } } catch { } }); }
internal static async void AsyncUpingGreen(StarverPlayer player, Vector2 Center, int Height, int Width) { await Task.Run(() => { int Timer = 0; int speed = 18; Vector velocity = new Vector(0, -speed); Vector StartPos = (Vector)Center; StartPos.Y += Height / 4 + Height / 2; Vector Line = new Vector(2 * Width, 0); Line.X = Math.Min(16 * 6, Line.X); int Num = (int)(Line.Length / 8); int damage = (int)Math.Sqrt(player.Level); damage *= 5; damage += 900; while (Timer++ < 5) { player.ProjLine(StartPos + Line, StartPos - Line, velocity, Num, damage, UpingGreenID); Thread.Sleep(20); } }); }
internal static void AsyncUpingGreen(StarverPlayer player, Entity target) { #region Wasted /* * await Task.Run(() => * { * int Timer = 0; * int speed = 16; * Vector velocity = new Vector(0, -speed); * Vector StartPos = (Vector)target.Center; * StartPos.Y += target.height / 4 + target.height / 2; * Vector Line = new Vector(2 * target.width, 0); * Line.X = Math.Min(16 * 6, Line.X); * * int Num = (int)(Line.Length / 4); * * int damage = (int)Math.Sqrt(player.Level); * damage *= 5; * damage += 900; * * * while (Timer++ < 6) * { * player.ProjLine(StartPos + Line, StartPos - Line, velocity, Num, damage, UpingGreenID); * Thread.Sleep(3 * speed); * } * }); */ #endregion AsyncUpingGreen(player, target.Center, target.height, target.width); }
public override void Release(StarverPlayer player, Vector vel) { var Start = player.Center + new Vector2(-Math.Min(player.Level, 348 * 10) - 48 * 10, -16 * 40); var End = player.Center + new Vector2(Math.Min(player.Level, 48 * 10) + 48 * 10, -16 * 40); var down = new Vector2(0, 16); player.ProjLine(Start, End, down, Math.Max(Math.Min(player.Level / 48, 10), 10) * 2 + 20, 400, ProjectileID.RocketSnowmanIII); }
public override bool CheckSpawn(StarverPlayer player) { return(false); timer++; bool success = timer % sChecker.SpawnRate == 0 && rand.NextDouble() < sChecker.SpawnChance; return(success && sChecker.Match(player.GetNPCSpawnChecker())); }
public override bool CanSet(StarverPlayer player) { if (!NPC.downedBoss3) { player.SendText("该技能已被地牢的诅咒封印", 238, 232, 170); return(false); } return(base.CanSet(player)); }
public override bool CanSet(StarverPlayer player) { if (!NPC.downedPlantBoss) { player.SendText("该技能已被一株强大的植物封印", 173, 255, 47); return(false); } return(base.CanSet(player)); }
public override bool CanSet(StarverPlayer player) { if (!NPC.downedGolemBoss) { player.SendText("该技能已被一尊蜥蜴石像封印", 210, 105, 30); return(false); } return(base.CanSet(player)); }
public override bool CanSet(StarverPlayer player) { if (!Main.hardMode) { player.SendText("该技能已被血肉之墙封印", 220, 20, 60); return(false); } return(base.CanSet(player)); }
public override bool CanSet(StarverPlayer player) { if (!(NPC.downedMechBoss1 && NPC.downedMechBoss2 && NPC.downedMechBoss3)) { player.SendText("该技能已被三位机械头目共同封印", 192, 192, 192); return(false); } return(base.CanSet(player)); }
public override bool CanSet(StarverPlayer player) { if (!NPC.downedBoss1) { player.SendText("该技能被某种邪恶的目光注视着,暂时无法使用", 255, 192, 203); return(false); } return(base.CanSet(player)); }
public override bool CanSet(StarverPlayer player) { if (!NPC.downedBoss2) { player.SendText("该技能已被血腐的力量封印", 199, 21, 133); return(false); } return(base.CanSet(player)); }
public override bool CanSet(StarverPlayer player) { if (!NPC.downedMechBossAny) { player.SendText("该技能已被一位机械头目封印", 220, 220, 220); return(false); } return(base.CanSet(player)); }
public override void Release(StarverPlayer player, Vector vel) { int damage = 142 + player.Level > 10000 ? (int)(122 * Math.Log(player.Level)) : 0; player.NewProj(vel * 10, ProjectileID.Daybreak, 130, 1); player.NewProj(player.Center + vel.ToLenOf(8), vel * 10, ProjectileID.Daybreak, damage, 1); player.NewProj(player.Center + vel.ToLenOf(16), vel * 10, ProjectileID.Daybreak, damage / 10, 1); player.NewProj(Vector2.Zero, ProjectileID.DD2ExplosiveTrapT3Explosion, damage / 2, 1); player.NewProj(Vector2.Zero, ProjectileID.SolarWhipSwordExplosion, damage / 2, 1); }
public override void Release(StarverPlayer player, Vector vel) { int damage = 5 + (int)(20 * Math.Log(player.Level)); Vector2 velocity = vel * 3.5f; for (int i = 0; i < 10; i++) { player.NewProj(player.Center + Rand.NextVector2(16 * 3, 16 * 3), velocity, Projs.Next(), damage, 10f); } }
public override void Release(StarverPlayer player, Vector vel) { //var realm = new ReflectingRealm(player) //{ // DefaultTimeLeft = 60 * 60, // Radium = 16 * 30, // Center = player.Center //}; //Starver.Instance.Aura.AddRealm(realm); }
public override void Release(StarverPlayer player, Vector vel) { //int damage = (int)(10 * Math.Log10(player.Level) + Math.Min(32567, player.MP / 10)) + 200; //int n = (int)(10 * Math.Log(player.MP) + 10); //player.MPCost = 0; //for (int i = 0; i < n; i++) //{ // player.NewProj(player.Center, player.FromPolar(vel.Angle + Rand.NextDouble(-Math.PI / 6, Math.PI / 6), 29), ProjectileID.CursedFlameFriendly, damage, 20f); //} }
public override void Release(StarverPlayer player, Vector vel) { double dirold = vel.Angle; for (double d = dirold - Math.PI / 12; d < dirold + Math.PI / 12; d += Math.PI / 24) { player.ProjLine(player.Center, player.Center + player.FromPolar(d, 16 * 50), Vector2.Zero, 45, 80, ProjectileID.Flames); Thread.Sleep(20); } }