Пример #1
0
        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;
            }
        }
Пример #2
0
        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;
                }
            }
        }
Пример #3
0
 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);
 }