Пример #1
0
    public BasicProjectile CreateProjectile(ProjectileType type, bool _isEnemy, int damage, Vector3 startPos, BaseElementObject target, GameElement bulletType)
    {
        BasicProjectile bp = PrefabsManager.SpawnProjectile(type);

        bp = GameObject.Instantiate(bp);
        if (type == ProjectileType.Fire_Hero)
        {
            bp.Init(_isEnemy, damage, startPos, target.transform.position + new Vector3(Random.Range(-0.5f, 0.5f), Random.Range(-0.5f, 0.5f), Random.Range(-0.5f, 0.5f))
                    , target, bulletType);
            bp.isChaseBullet = false;
        }
        else
        {
            if (type == ProjectileType.Water_Hero)
            {
                bp.Init(_isEnemy, damage, startPos, target.transform.position, target, bulletType);
            }
            else
            {
                bp.Init(_isEnemy, damage, startPos, target.transform.position, target, bulletType);
            }
        }
        projectileList.Add(bp);
        return(bp);
    }
Пример #2
0
 public override void EAction()
 {
     if (t == null)
     {
         if (CurrentCooldown != MaxCooldown)
         {
             return;
         }
         t = new CasterEMove(SpriteSource.SpriteRectangle.Right - (SpriteSource.SpriteRectangle.Width / 2), SpriteSource.SpriteRectangle.Top,
                             BasicProjectile.GenerateVelocityVector(new Vector2(SpriteSource.SpriteRectangle.Center.X, SpriteSource.SpriteRectangle.Center.Y), MouseHandler.mousePos, 7));
         // t.Velocity.Y = 0;
         RenderHandler.allProjectiles.Add(t);
         CurrentCooldown -= 0.01;
     }
     else
     {
         if (t.Colliding[2])
         {
             SpriteSource.SpriteRectangle.X = t.ProjRect.Right - SpriteSource.SpriteRectangle.Width;
             SpriteSource.SpriteRectangle.Y = t.ProjRect.Y + 2;
         }
         else
         {
             SpriteSource.SpriteRectangle.X = t.ProjRect.X;
             SpriteSource.SpriteRectangle.Y = t.ProjRect.Y + 2;
         }
         t.Delete();
         t = null;
     }
 }
    protected override void CreateProjectile()
    {
        for (int i = 0; i <= projectilePelletCount; i++)
        {
            GameObject      projectileObject = Instantiate(projectilePrefab);
            BasicProjectile projectile       = projectileObject.GetComponent <BasicProjectile>();
            if (this.person != null)
            {
                projectile.origin = this.person.gameObject;
            }

            //float rotation = transform.eulerAngles.z;
            float rotation = -spreadAngle / 2 + (i / (float)projectilePelletCount) * spreadAngle + transform.eulerAngles.z;

            Vector2 direction = VectorUtil.Deg2Vector2(rotation);

            float   spawnX   = transform.position.x + direction.x * projectileOffset;
            float   spawnY   = transform.position.y + direction.y * projectileOffset;
            Vector2 spawnPos = new Vector2(spawnX, spawnY);
            projectile.transform.position = spawnPos;
            projectile.transform.rotation = transform.rotation;
            projectile.transform.Rotate(0, 0, rotation);
            projectile.projectileRigidbody.velocity = direction * projectile.velocity;

            Destroy(projectileObject, livetime);
        }
    }
        /// <summary>Patch for Rascal slingshot damage increase with travel time.</summary>
        private static bool BasicProjectileBehaviorOnCollisionWithMonsterPrefix(ref BasicProjectile __instance, ref NetBool ___damagesMonsters, ref NetCharacterRef ___theOneWhoFiredMe, ref int ___travelTime, NPC n, GameLocation location)
        {
            try
            {
                if (!___damagesMonsters || n is not Monster)
                {
                    return(true);                                                         // run original logic
                }
                var who = ___theOneWhoFiredMe.Get(location) is Farmer
                                        ? ___theOneWhoFiredMe.Get(location) as Farmer
                                        : Game1.player;

                if (!Utility.SpecificPlayerHasProfession("Rascal", who))
                {
                    return(true);                                                                     // run original logic
                }
                AwesomeProfessions.Reflection.GetMethod(__instance, name: "explosionAnimation")?.Invoke(location);
                var damageToMonster = (int)(__instance.damageToFarmer.Value * Utility.GetRascalBonusDamageForTravelTime(___travelTime));
                location.damageMonster(n.GetBoundingBox(), damageToMonster, damageToMonster + 1, isBomb: false, who);

                return(false);                // don't run original logic
            }
            catch (Exception ex)
            {
                Monitor.Log($"Failed in {nameof(BasicProjectileBehaviorOnCollisionWithMonsterPrefix)}:\n{ex}", LogLevel.Error);
                return(true);                // default to original logic
            }
        }
    public static GameObject SpawnBullet(Vector3 position, float offset, Vector2 direction, float speed = 1f, int ttl = 1000)
    {
        // create new game object
        GameObject bullet = new GameObject();

        // add bullet image to it
        SpriteRenderer sr = bullet.AddComponent <SpriteRenderer> ();

        sr.sprite = Resources.Load <Sprite>("Sprites/Projectiles/Bullet");

        // make it act like a projectile
        BasicProjectile projectile = bullet.AddComponent <BasicProjectile> ();

        projectile.direction         = direction;
        projectile.speed             = speed;
        projectile.lifeInFixedFrames = ttl;

        // add a collider
        CircleCollider2D collider = bullet.AddComponent <CircleCollider2D>();

        collider.radius = .1f;

        // position the object
        Vector2 adjust = direction.normalized;

        adjust.x *= offset;
        adjust.y *= offset;
        Vector3 bulletPos = new Vector3(position.x + adjust.x, position.y + adjust.y, position.z);

        bullet.transform.position = bulletPos;

        return(bullet);
    }
Пример #6
0
 public override bool Shoot()
 {
     if (CurrentShotCooldown <= 0.0f)
     {
         if (!base.Shoot())
         {
             return(false);
         }
         GameObject obj = Instantiate(Projectile, child.position, Quaternion.identity);
         if (obj)
         {
             BasicProjectile prj = obj.GetComponent <BasicProjectile>();
             if (prj)
             {
                 prj.Damage           = WeaponDamage;
                 prj.Direction        = transform.parent.forward;
                 prj.ImpulseDirection = transform.parent.transform.forward;
             }
             else
             {
                 EnemyProjectile eprj = obj.GetComponent <EnemyProjectile>();
                 if (eprj)
                 {
                     eprj.Damage           = WeaponDamage;
                     eprj.Direction        = transform.parent.forward;
                     eprj.ImpulseDirection = transform.parent.transform.forward;
                 }
             }
             CurrentShotCooldown = ShotCooldown;
             bIsShooting         = true;
         }
     }
     return(true);
 }
Пример #7
0
    public override void Execute(PlayerScript pScript)
    {
        if (pScript.IsProjReady() && pScript.currentHP > 0)
        {
            if (pScript.IsBoosted())
            {
                GameObject      proj1       = Instantiate(pScript.basicProjectile, pScript.gameObject.transform.position + deviation, Quaternion.identity);
                BasicProjectile projScript1 = proj1.GetComponent <BasicProjectile>();
                projScript1.SetSpeed(pScript.GetBaseProjSpeed());
                projScript1.SetDamage(pScript.GetBaseProjDamage());

                GameObject      proj2       = Instantiate(pScript.basicProjectile, pScript.gameObject.transform.position - deviation, Quaternion.identity);
                BasicProjectile projScript2 = proj2.GetComponent <BasicProjectile>();
                projScript2.SetSpeed(pScript.GetBaseProjSpeed());
                projScript2.SetDamage(pScript.GetBaseProjDamage());
            }
            else
            {
                GameObject      proj       = Instantiate(pScript.basicProjectile, pScript.gameObject.transform.position, Quaternion.identity);
                BasicProjectile projScript = proj.GetComponent <BasicProjectile>();
                projScript.SetSpeed(pScript.GetBaseProjSpeed());
                projScript.SetDamage(pScript.GetBaseProjDamage());
            }

            pScript.PlayShotAudio();

            pScript.SetProjReady(false);
        }
    }
Пример #8
0
    public void FireGun()
    {
        BasicProjectile p = Instantiate(projPrefab, gunEnd.position, Quaternion.identity).GetComponent <BasicProjectile>();

        p.InitializeProjectile(speed, gunEnd.position - initPos.position + Vector3.up * Random.Range(-accuracy, accuracy), 2);
        aud.PlayOneShot(gunSound);
    }
    // Update is called once per frame
    void Update()
    {
        GameObject bullet = null;

        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            bullet = SpawningUtility.SpawnBullet(gameObject.transform.position, .6f, Vector2.up);
        }
        if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            bullet = SpawningUtility.SpawnBullet(gameObject.transform.position, .6f, Vector2.right);
        }
        if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            bullet = SpawningUtility.SpawnBullet(gameObject.transform.position, .6f, Vector2.down);
        }
        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            bullet = SpawningUtility.SpawnBullet(gameObject.transform.position, .6f, Vector2.left);
        }

        if (bullet)
        {
            PlayerScript player = GetComponentInParent <PlayerScript> ();
            if (player)
            {
                BasicProjectile projectile = bullet.GetComponent <BasicProjectile> ();
                if (projectile)
                {
                    projectile.damage = (int)((float)projectile.damage * player.damageMultiplier);
                    //Debug.Log ("bullet damage set to " + projectile.damage);
                }
            }
        }
    }
Пример #10
0
        protected override void _OnSwing(MeleeWeapon weapon, Farmer farmer)
        {
            base._OnSwing(weapon, farmer);
            Vector2 shot_velocity     = default(Vector2);
            Vector2 shot_origin       = farmer.getStandingPosition() - new Vector2(32f, 32f);
            float   rotation_velocity = 0f;

            switch (farmer.facingDirection.Value)
            {
            case 0:
                shot_velocity.Y = -1f;
                break;

            case 1:
                shot_velocity.X = 1f;
                break;

            case 3:
                shot_velocity.X = -1f;
                break;

            case 2:
                shot_velocity.Y = 1f;
                break;
            }
            rotation_velocity = 32f;
            shot_velocity    *= 10f;
            BasicProjectile projectile = new BasicProjectile((int)Math.Ceiling((float)weapon.minDamage.Value / 4f), 11, 0, 1, rotation_velocity * ((float)Math.PI / 180f), shot_velocity.X, shot_velocity.Y, shot_origin, "", "", explode: false, damagesMonsters: true, farmer.currentLocation, farmer);

            projectile.ignoreTravelGracePeriod.Value = true;
            projectile.ignoreMeleeAttacks.Value      = true;
            projectile.maxTravelDistance.Value       = 256;
            projectile.height.Value = 32f;
            farmer.currentLocation.projectiles.Add(projectile);
        }
Пример #11
0
 public virtual void OnAttacked(Vector2 trajectory)
 {
     if (Game1.IsMasterGame && stackedSlimes.Value > 0)
     {
         stackedSlimes.Value--;
         if (trajectory.LengthSquared() == 0f)
         {
             trajectory = new Vector2(0f, -1f);
         }
         else
         {
             trajectory.Normalize();
         }
         trajectory *= 16f;
         BasicProjectile projectile = new BasicProjectile(base.DamageToFarmer / 3 * 2, 13, 3, 0, (float)Math.PI / 16f, trajectory.X, trajectory.Y, base.Position, "", "", explode: true, damagesMonsters: false, base.currentLocation, this);
         projectile.height.Value             = 24f;
         projectile.color.Value              = color.Value;
         projectile.ignoreMeleeAttacks.Value = true;
         projectile.hostTimeUntilAttackable  = 0.1f;
         if (Game1.random.NextDouble() < 0.5)
         {
             projectile.debuff.Value = 13;
         }
         base.currentLocation.projectiles.Add(projectile);
     }
 }
Пример #12
0
    public void ShootTarget()
    {
        //spawn the projectile
        BasicProjectile proj = Instantiate(m_bulletPrefab, transform.position + (transform.forward * 2), Quaternion.identity);

        proj.Init(m_target.transform.position, transform);
    }
        /// <summary>Patch to increase Desperado projectile velocity + allow Rascal projectile bounce.</summary>
        private static void BasicProjectileCtorPostfix(ref BasicProjectile __instance, ref NetInt ___bouncesLeft, float xVelocity, float yVelocity, Character firer)
        {
            if (firer is not Farmer)
            {
                return;
            }

            try
            {
                if (Utility.SpecificPlayerHasProfession("Desperado", (Farmer)firer))
                {
                    AwesomeProfessions.Reflection.GetField <NetFloat>(__instance, name: "xVelocity").GetValue().Set(xVelocity * 1.5f);
                    AwesomeProfessions.Reflection.GetField <NetFloat>(__instance, name: "yVelocity").GetValue().Set(yVelocity * 1.5f);
                }

                if (AwesomeProfessions.Config.ModKey.IsDown() && Utility.SpecificPlayerHasProfession("Rascal", (Farmer)firer))
                {
                    ++___bouncesLeft.Value;
                }
            }
            catch (Exception ex)
            {
                Monitor.Log($"Failed in {nameof(BasicProjectileCtorPostfix)}:\n{ex}", LogLevel.Error);
            }
        }
Пример #14
0
        public static ActionResponse UpdateTick()
        {
            if (tick++ > 2)
            {
                return(ActionResponse.Retry);
            }
            else
            {
                tick = 0;
            }

            BNC_Core.Logger.Log($" fireballs {fireballsLeft} ", LogLevel.Debug);

            for (int i = 0; i < Game1.random.Next(20); i++)
            {
                if (FireballEvent.fireballsLeft-- <= 0)
                {
                    FireballEvent.fireballsLeft = 0;
                    return(ActionResponse.Retry);
                }

                BNC_Core.Logger.Log($" Try to spawn{fireballsLeft} ", LogLevel.Debug);

                Vector2         startPosition = getStartingLocation();
                Vector2         trajectory2   = Utility.getVelocityTowardPoint(startPosition, new Vector2(Game1.player.GetBoundingBox().X, Game1.player.GetBoundingBox().Y) + new Vector2(Game1.random.Next(-128, 128)), 8f);
                BasicProjectile fireball      = new BasicProjectile(15, 10, 8, 4, 0f, trajectory2.X, trajectory2.Y, startPosition, "", "", true, false, Game1.player.currentLocation, Game1.player);
                fireball.height.Value = 48f;

                Game1.player.currentLocation.projectiles.Add(fireball);
                Game1.player.currentLocation?.playSound("fireball");
            }

            BNC_Core.Logger.Log($" Done {fireballsLeft} ", LogLevel.Debug);
            return(ActionResponse.Done);
        }
Пример #15
0
        public static void Postfix(BasicProjectile __instance)
        {
            var r = ModEntry.BRGame.ModHelper.Reflection;

            r.GetField <NetBool>(__instance, "damagesMonsters").SetValue(new NetBool(false));
            r.GetField <NetInt>(__instance, "damageToFarmer").SetValue(new NetInt(15));
        }
Пример #16
0
        public static bool Prefix(BasicProjectile __instance, GameLocation location, Farmer player)
        {
            bool damagesMonsters = ModEntry.BRGame.ModHelper.Reflection.GetField <NetBool>(__instance, "damagesMonsters").GetValue().Value;

            Console.WriteLine($"damage, m = {damagesMonsters}");
            if (!damagesMonsters || true && SlingshotPatch5.GetFarmerBounds(player).Intersects(__instance.getBoundingBox()))            //TODO: remove?
            {
                //TODO: modify slingshot damage here?
                int damage = __instance.damageToFarmer.Value;
                damage = Math.Min(damage, 10);

                if (player == Game1.player)
                {
                    Console.WriteLine("sending slingshot damage to self");
                    ModEntry.BRGame.TakeDamage(damage);
                }
                else
                {
                    Console.WriteLine("sending slingshot damage to other player");
                    NetworkUtility.SendDamageToPlayer(damage, player, Game1.player.UniqueMultiplayerID);
                }

                try
                {
                    if (!HitShaker.IsPlayerFlashing(player.UniqueMultiplayerID))
                    {
                        var r = ModEntry.BRGame.ModHelper.Reflection;
                        r.GetMethod(__instance, "explosionAnimation", false)?.Invoke(location);
                    }
                }
                catch (Exception) { }
            }
            return(false);
        }
Пример #17
0
    public void SpawnProjectile()
    {
        BasicProjectile projScript = Instantiate(projectilePrefab, transform.position, Quaternion.identity).GetComponent <BasicProjectile>();

        projScript.SetSpeed(-projectileSpeed);

        enemyController.PlayShotAudio();
    }
Пример #18
0
    /// <summary>
    /// Shoots a projectile. at the target.
    /// </summary>
    protected virtual void SpawnProjectile()
    {
        GameObject projectileGO = Instantiate(projectilePrefab, transform.position, Quaternion.identity);

        projectileGO.transform.parent = transform;
        BasicProjectile projectile = projectileGO.GetComponent <BasicProjectile>();

        projectile.Seek(currentTarget, multiplier);
    }
Пример #19
0
    void Shoot()
    {
        GameObject      projectileObject = Instantiate(projectile, firePoint.position, firePoint.rotation);
        BasicProjectile projectileScript = projectileObject.GetComponent <BasicProjectile>();

        if (projectileScript != null)
        {
            projectileScript.Seek(target.transform);
        }
    }
Пример #20
0
    protected void FireProjectile(BasicProjectile.Owner owner, Vector3 shootVec)
    {
        GameObject      newProjectile       = Instantiate(projectile, transform.position, Quaternion.identity);
        BasicProjectile newProjectileScript = newProjectile.GetComponent <BasicProjectile> ();

        newProjectileScript.owner = owner;
        newProjectileScript.SetVelocity(shootVec.normalized * projectileSpeed * Time.fixedDeltaTime);

        projectiles.Add(newProjectile);
    }
Пример #21
0
 public override void EAction()
 {
     if (CurrentCooldown != MaxCooldown)
     {
         return;
     }
     Game.PlayerCharacter.velocity = BasicProjectile.GenerateVelocityVector(new Vector2(Game.PlayerCharacter.SpriteRectangle.X, Game.PlayerCharacter.SpriteRectangle.Y),
                                                                            MouseHandler.mousePos, 1200);
     CurrentCooldown -= 0.01;
 }
Пример #22
0
        private static void BasicProjectile_Postfix(BasicProjectile __instance, Character firer)
        {
            if (!Config.EnableMod || firer is not Farmer)
            {
                return;
            }
            var dam = GetStatMod(GetStatValue(firer as Farmer, "dex", Config.BaseStatValue)) * Config.DexRangedDamageBonus;

            SMonitor.Log($"Modifying projectile damage by {dam}");
            __instance.damageToFarmer.Value = (int)Math.Max(0, Math.Round(__instance.damageToFarmer.Value * (1 + dam)));
        }
Пример #23
0
        public override GameObject FireAmmo(IDamager damager, Ray damageRay, LayerMask layerMask, float damageMultiplier)
        {
            System.Action <Collision> onCollision = (collision) => {
                // calculate and dole out damage here
            };

            BasicProjectile spear = BasicProjectile.pool.GetPrefabInstance(prefab);

            spear.LaunchToPosition(damageRay, mass, velocity, lifeTime, useGravityOnStart, useGravityOnCollision, onCollision);
            return(spear.gameObject);
        }
Пример #24
0
    protected virtual void Shoot()
    {
        Vector3 dir = DirectionUtil.Convert(direction);

        GameObject      go = ProjectileManager.CreateProjectile(projectile);
        BasicProjectile bp = go.GetComponent <BasicProjectile>();

        go.transform.position = transform.position; // + dir
        go.transform.rotation = Quaternion.Euler(0, 0, Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg);
        bp.direction          = dir;
        bp.IgnoreCollision(GetComponent <Collider2D>());
    }
Пример #25
0
 private void UpdateShooting()
 {
     if (Mouse.GetButton() == Mouse.Button.Left)
     {
         if (fireRate <= 0 && Ammo != 0 && !moving)
         {
             Vector2 vec2  = Mouse.GetIsoCoordinate() - position;
             double  angle = Math.Atan2(vec2.Y, vec2.X);
             Shoot(position + new Vector2(28, 28), angle);
             angle += Math.PI;
             if (angle < (Math.PI * 0.125) || angle > (Math.PI * 1.875))
             {
                 direction = Direction.West;
             }
             else if (angle < (Math.PI * 0.375))
             {
                 direction = Direction.NorthWest;
             }
             else if (angle < (Math.PI * 0.625))
             {
                 direction = Direction.North;
             }
             else if (angle < (Math.PI * 0.875))
             {
                 direction = Direction.NorthEast;
             }
             else if (angle < (Math.PI * 1.125))
             {
                 direction = Direction.East;
             }
             else if (angle < (Math.PI * 1.375))
             {
                 direction = Direction.SouthEast;
             }
             else if (angle < (Math.PI * 1.625))
             {
                 direction = Direction.South;
             }
             else if (angle < (Math.PI * 1.875))
             {
                 direction = Direction.SouthWest;
             }
             fireRate = BasicProjectile.GetRateOfFire();
             Ammo--;
             attacking = true;
         }
     }
     else
     {
         attacking = false;
     }
 }
Пример #26
0
    private void Attack(Vector3 dir)
    {
        //  PlayerSegmentHealth h = seg.GetComponent<PlayerSegmentHealth>();
        //  if (h != null)
        //  {
        //      h.TakeDamage(damage);
        //  }
        GameObject      proj = ProjectileManager.CreateProjectile(bulletPrefab);
        BasicProjectile ep   = proj.GetComponent <BasicProjectile>();

        proj.transform.position = transform.position;
        proj.transform.rotation = Quaternion.Euler(0, 0, Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg);
        ep.direction            = dir;
    }
Пример #27
0
        private void GameLoop_UpdateTicking(object sender, StardewModdingAPI.Events.UpdateTickingEventArgs e)
        {
            if (Game1.player?.currentLocation != null && firing)
            {
                if (ticks % 120 == 0 && Config.FireSound != "")
                {
                    Game1.player.currentLocation.playSound(Config.FireSound, NetAudio.SoundContext.Default);
                }
                if (ticks++ % 3 != 0)
                {
                    return;
                }
                float   fire_angle  = 0f;
                float   mouthOffset = 16f;
                Vector2 shot_origin = new Vector2((float)Game1.player.GetBoundingBox().Center.X - 32f, (float)Game1.player.GetBoundingBox().Center.Y - 80f);
                switch (Game1.player.facingDirection.Value)
                {
                case 0:
                    shot_origin.Y -= mouthOffset;
                    fire_angle     = 90f;
                    break;

                case 1:
                    shot_origin.X += mouthOffset;
                    fire_angle     = 0f;
                    break;

                case 2:
                    fire_angle     = 270f;
                    shot_origin.Y += mouthOffset;
                    break;

                case 3:
                    shot_origin.X -= mouthOffset;
                    fire_angle     = 180f;
                    break;
                }
                fire_angle += (float)Math.Sin((double)((float)ticks * 16 / 1000f * 180f) * 3.1415926535897931 / 180.0) * 25f;
                Vector2 shot_velocity = new Vector2((float)Math.Cos((double)fire_angle * 3.1415926535897931 / 180.0), -(float)Math.Sin((double)fire_angle * 3.1415926535897931 / 180.0));
                shot_velocity *= 10f;
                BasicProjectile projectile = new BasicProjectile((int)Math.Round(Config.FireDamage * (Config.ScaleWithSkill ? Game1.player.getEffectiveSkillLevel(4) / 10f : 1)), 10, 0, 1, 0.196349546f, shot_velocity.X, shot_velocity.Y, shot_origin, "", "", false, true, Game1.player.currentLocation, Game1.player, false, null);
                projectile.ignoreTravelGracePeriod.Value = true;
                projectile.maxTravelDistance.Value       = (int)Math.Round(Config.FireDistance * (Config.ScaleWithSkill ? Game1.player.getEffectiveSkillLevel(4) / 10f : 1));
                Game1.player.currentLocation.projectiles.Add(projectile);
            }
            else
            {
                ticks = 0;
            }
        }
Пример #28
0
    protected virtual void Shoot()
    {
        //Create a projectile and assign fields
        GameObject      projectileObject = Instantiate(projectile, firePoint.position, firePoint.rotation);
        BasicProjectile projectileScript = projectileObject.GetComponent <BasicProjectile>();

        if (projectileScript != null)
        {
            //assign damage from tower
            projectileScript.Dmg = damage;
            projectileScript.Seek(target.transform);
        }
        fireTimer = 1f / fireRate;
    }
Пример #29
0
    /// <summary>
    /// Anything that can fire a projectile is itself hittable.
    /// </summary>
    /// <param name="collider"></param>
    /// <param name="transform"></param>
    /// <param name="hit"></param>
    /// <param name="projectile"></param>
    /// <param name="firedFrom"></param>
    /// <returns></returns>
    public virtual void Hit(Transform collider, Transform transform, RaycastHit hit, BasicProjectile projectile)
    {
        HitPoints -= 1;

        if (HitPoints > 0)
        {
            _hitEffect?.Apply();
            _hitAction?.Apply(collider, transform, hit, projectile);
        }
        else
        {
            DestroyHittable();
        }
    }
Пример #30
0
    protected void FireProjectile(Vector3 shootVec, GameObject projectile)
    {
        //spawn under player sprite
        Vector3 spawnVec = transform.position;

        spawnVec.y -= 1;

        GameObject      projectileInstance = Instantiate(projectile, spawnVec, Quaternion.identity);
        BasicProjectile projectileScript   = projectileInstance.GetComponent <BasicProjectile> ();

        projectileScript.owner = BasicProjectile.Owner.Player;
        projectileScript.SetVelocity(shootVec * ProjectileSpeed * Time.fixedDeltaTime);

        projectiles.Add(projectileInstance);
    }