public override void ModifyHitNPC(NPC target, ref int damage, ref float knockback, ref bool crit, ref int hitDirection) { EpikGlobalNPC egnpc = target.GetGlobalNPC <EpikGlobalNPC>(); egnpc.suppressorHits += 8 + (16 * projectile.ai[0]); damage += (int)(egnpc.suppressorHits / 6); //Main.player[projectile.owner].chatOverhead.NewMessage(egnpc.SuppressorHits+"", 15); if (egnpc.suppressorHits > 35) { Projectile.NewProjectile(projectile.Center, Vector2.Zero, ProjectileID.SolarWhipSwordExplosion, (int)egnpc.suppressorHits, 0, projectile.owner, ai1: 1); egnpc.suppressorHits -= 9; } }
public override void OnHitNPC(Player player, NPC target, int damage, float knockBack, bool crit) { ModPlayerFists mpf = player.GetModPlayer <ModPlayerFists>(); if (player.controlUp && (player.oldVelocity.Y == 0 || mpf.jumpAgainUppercut)) { target.velocity.Y -= (target.noGravity?6.5f:11.4f) * Max(target.knockBackResist, 0.1f); } mpf.jumpAgainUppercut = true; EpikGlobalNPC EGN = target.GetGlobalNPC <EpikGlobalNPC>(); if (EGN.jaded) { target.life = 0; target.checkDead(); Main.PlaySound(SoundID.Shatter, (int)target.Center.X, (int)target.Center.Y, pitchOffset: -0.15f); Rectangle r = ModPlayerFists.UseItemGraphicbox(player, 1, 8); for (int i = 9; i-- > 0;) { Vector2 pos = target.TopLeft + new Vector2(Main.rand.Next(target.width), Main.rand.Next(target.height)); Vector2 vel = pos - r.Center(); vel.Normalize(); vel *= 8; int p = Projectile.NewProjectile( r.Center(), vel.RotatedByRandom(0.5f), ProjectileID.CrystalStorm, damage / 6, knockBack / 9, player.whoAmI); Main.projectile[p].penetrate += 2; Main.projectile[p].extraUpdates++; Main.projectile[p].timeLeft /= 2; Main.projectile[p].GetGlobalProjectile <EpikGlobalProjectile>().jade = true; } } if (mpf.ComboEffectAbs == comboEffect) { bool flag = target.noGravity; ModPlayerFists.provideImmunity(player, player.itemAnimation); Point origin = target.Center.ToTileCoordinates(); if (!flag && !WorldUtils.Find(origin, Searches.Chain(new Searches.Down(4), new Conditions.IsSolid()), out Point _)) { flag = true; } if (flag) { player.velocity = target.velocity; player.velocity.X -= player.direction * 8f + player.direction * player.HeldItem.knockBack * 0.1f; player.velocity.Y -= player.gravDir * 0.125f * player.itemAnimationMax; player.fallStart = (int)(player.position.Y / 16f); } else { player.velocity = new Vector2(-player.direction * (2f + player.HeldItem.knockBack * 0.5f) + target.velocity.X * 0.5f, target.velocity.Y * 1.5f * target.knockBackResist); player.fallStart = (int)(player.position.Y / 16f); } //ManagePlayerComboMovement.Invoke(mpf,new object[]{target}); mpf.dashSpeed = 0f; mpf.dashMaxSpeedThreshold = 0f; mpf.dashMaxFriction = 0f; mpf.dashMinFriction = 0f; mpf.dashEffect = 0; player.dash = 0; player.attackCD = player.itemAnimationMax; player.itemAnimation = 1; switch (target.type) { case 139: case 315: case 325: case 329: case 439: case 533: case 423: case 478: case 471: target.buffImmune[BuffID.MoonLeech] = false; break; default: break; } float combomult = 20f - player.GetModPlayer <ModPlayerFists>().comboCounterMaxBonus; combomult /= Math.Max(0.5f, 2 - item.scale); if (target.life > 0 && target.life < (mpf.ComboCounter + item.tileBoost) * combomult && !target.immortal && !target.buffImmune[BuffID.MoonLeech]) { EGN.jaded = true; EGN.freezeFrame = target.frame; mpf.ModifyComboCounter(-mpf.ComboCounter); target.velocity.X += knockBack * player.direction; } } }
public override bool Shoot(Player player, ref Vector2 position, ref float speedX, ref float speedY, ref int type, ref int damage, ref float knockBack) { position = Main.MouseWorld; player.manaRegenDelay = (int)player.maxRegenDelay; try { item.newAndShiny = true; #region target check float distanceFromTarget = 160f; Vector2 targetCenter = position; int target = -1; bool foundTarget = false; for (int i = 0; i < Main.maxPlayers; i++) { if (i < Main.maxNPCs) { NPC npc = Main.npc[i]; if (npc.CanBeHitBy(player, item)) { float between = npc.Hitbox.Distance(position); bool closest = getTargetEntity(target).Hitbox.Distance(position) > between; bool inRange = npc.chaseable?between < distanceFromTarget:between == 0f; if ((closest || !foundTarget) && inRange) { distanceFromTarget = between; targetCenter = npc.Center; target = npc.whoAmI; foundTarget = true; } } } Player targetPlayer = Main.player[i]; if ((player.hostile && targetPlayer.hostile) && (player.team == 0 || player.team != targetPlayer.team)) { float between = targetPlayer.Hitbox.Distance(position); bool closest = getTargetEntity(target).Hitbox.Distance(position) > between; bool inRange = between < distanceFromTarget; if ((closest || !foundTarget) && inRange) { distanceFromTarget = between; targetCenter = targetPlayer.Center; target = -1 - targetPlayer.whoAmI; foundTarget = true; } } if (distanceFromTarget == 0) { break; } } #endregion if (foundTarget) { Entity targetEntity = getTargetEntity(target); if (target >= 0) { NPC targetNPC = (NPC)targetEntity; EpikGlobalNPC globalNPC = targetNPC.GetGlobalNPC <EpikGlobalNPC>(); int dmg = damage + (int)globalNPC.organRearrangement; player.addDPS(dmg); targetNPC.lifeMax -= 15; dmg = (int)targetNPC.StrikeNPC(dmg + targetNPC.defense / 2, knockBack, player.direction); if (targetNPC.life > targetNPC.lifeMax) { targetNPC.life = targetNPC.lifeMax; } globalNPC.organRearrangement += 5; //sendOrganRearrangementPacket(target, globalNPC.organRearrangement); tryGhostHeal(target, player.whoAmI, dmg); targetNPC.netUpdate = true; } else { //Player targetPlayer = Main.player[-1-target]; Player targetPlayer = (Player)targetEntity; targetPlayer.Hurt(Terraria.DataStructures.PlayerDeathReason.ByPlayer(player.whoAmI), damage + (int)(player.statDefense * (Main.expertMode?0.75f:0.5f)), 0, true); targetPlayer.GetModPlayer <EpikPlayer>().organRearrangement += 15; //sendOrganRearrangementPacket(target, targetPlayer.GetModPlayer<EpikPlayer>().organRearrangement); } Vector2 targPos = targetCenter + Main.rand.NextVector2Circular(Math.Min(targetEntity.width / 3f, 16), Math.Min(targetEntity.height / 3f, 16)); Vector2 currPos = player.itemLocation; Vector2 diff = targPos - currPos; int dusts = (int)(diff.Length() / 8); diff /= dusts; Dust dust; for (int i = 0; i < dusts; i++) { currPos += diff; dust = Dust.NewDustDirect(currPos, 0, 0, 235); dust.velocity *= 0.2f; } if (!player.CheckMana(item, pay: true)) { player.Hurt(Terraria.DataStructures.PlayerDeathReason.ByPlayer(player.whoAmI), 10 + (int)(player.statDefense * (Main.expertMode?0.75f:0.5f)), 0, true); player.GetModPlayer <EpikPlayer>().organRearrangement += 25; //sendOrganRearrangementPacket(-1-player.whoAmI, player.GetModPlayer<EpikPlayer>().organRearrangement); } } } finally { item.newAndShiny = false; } return(false); }