Ejemplo n.º 1
0
 private void SubscribeProjectile(ProjectileView view)
 {
     view.OnTimeEnd      -= OnTimeEnd;
     view.OnTimeEnd      += OnTimeEnd;
     view.EnemyCollision -= OnEnemyCollision;
     view.EnemyCollision += OnEnemyCollision;
 }
    public static ProjectileController CreateProjectile(TowerController towerController, Projectile model, ProjectileType type)
    {
        GameObject prefab = null;

        switch (type)
        {
        case ProjectileType.ROCK:
            prefab = instance.rockProjectilePrefab;
            break;

        case ProjectileType.FIREBALL:
            prefab = instance.fireballProjectilePrefab;
            break;
        }

        GameObject projectile = Instantiate(
            prefab,
            towerController.View.transform.position,
            towerController.View.transform.rotation);
        ProjectileView       view       = projectile.GetComponent <ProjectileView>();
        ProjectileController controller = new ProjectileController(model, view);

        view.Controller = controller;

        return(controller);
    }
 void Awake()
 {
     this.projectileController            = GetComponentInChildren <ProjectileController>();
     projectileModel                      = new ProjectileModel();
     projectileController.projectileModel = projectileModel;
     projectileView = GetComponentInChildren <ProjectileView>();
     projectileController.projectileView = projectileView;
     projectileView.projectileModel      = projectileModel;
     projectileView.projectileController = projectileController;
 }
Ejemplo n.º 4
0
    /**
     * <summary>Deals damage to an enemy when a player weapon interacts
     * with them. Some enemies can only be killed by certain weapons. Necessary
     * player information that made the attack is automatically acquired.</summary>
     *
     * <param name="weapon">The player weapon game object.</param>
     * <param name="enemy">The enemy game object.</param>
     */
    private void OnWeaponWithEnemy(GameObject weapon, GameObject enemy)
    {
        Element    weaponScript = weapon.GetComponent <Element>();
        EnemyData  enemyData    = GetEnemyData(enemy);
        EnemyView  enemyView    = enemy.GetComponent <EnemyView>();
        PlayerData playerData   = null;

        PlayerNumber.PlayerNum player = PlayerNumber.PlayerNum.PlayerOne;

        if (weaponScript is MeleeWeaponView)
        {
            //Handle all logic for melee weapons here

            /** Notes
             * 1. Ghost's and Death can't be killed with melee attacks
             */
            MeleeWeaponView playerWeapon = weapon.GetComponent <MeleeWeaponView>();

            player = playerWeapon.BelongsTo;

            playerData = GetPlayerData(player);

            if (enemy.layer == 16 || (enemy.layer >= 18 && enemy.layer <= enemyMaxLayer))
            {
                enemyView.CurrentHealth -= playerData.Melee;
            }
        }
        else if (weaponScript is ProjectileView)
        {
            //Handle all logic for projectile weapons here
            //ProjectileInfo projectileInfo = app.data.projectiles.RetrieveProjectileInfo(weapon);

            //player = projectileInfo.Player;
            ProjectileView playerProjectile = weapon.GetComponent <ProjectileView>();

            playerData = GetPlayerData(playerProjectile.BelongsTo);

            if (enemy.layer >= 16 && enemy.layer <= enemyMaxLayer)
            {
                enemyView.CurrentHealth -= playerData.Shot;
            }

            RemoveProjectile(weapon);
        }


        if (enemyView.CurrentHealth <= 0)
        {
            playerData.Score += enemyData.ScoreOnDeath;
            Destroy(enemy.gameObject);
        }

        UpdatePlayerHUDS(player);
    }
Ejemplo n.º 5
0
 public ProjectileViewArcPath(ProjectileView view) : base(view)
 {
     this.velocityY = view.LifetimeSeconds / 2f * 9.8f;
     if (view.LifetimeSeconds != 0f)
     {
         this.velocityY -= view.StartLocation.y / view.LifetimeSeconds;
     }
     this.velocityXZ   = view.TargetLocation - view.StartLocation;
     this.velocityXZ.y = 0f;
     this.velocityXZ.Normalize();
     this.velocityXZ *= (float)(view.ProjectileType.MaxSpeed * 3);
     this.spinSpeed   = view.ProjectileType.SpinSpeed;
 }
Ejemplo n.º 6
0
        private void ReturnProjectile(ProjectileView view, WeaponType type)
        {
            UnsubscribeProjectile(view);
            view.GetRigidbody().velocity = Vector3.zero;
            view.Hide();
            Observable.Timer(TimeSpan.FromSeconds(0.5f)).Subscribe(_ =>
            {
                var poolManager = CoreManager.Instance.GetData <PoolManager>();
                poolManager.ReturnItem <WeaponType>((int)type, view);
                _fireRate[type]--;

                EventHolder <GameEventType> .Dispatcher.Broadcast(GameEventType.AmmoChange, type, _fireRate[type]);
            }).AddTo(_disposable);
        }
Ejemplo n.º 7
0
        private void LaunchProjectile(ProjectileView view, Vector3 direction, IWeapon weapon, float force)
        {
            view.Init(weapon.GetWeaponType());
            SubscribeProjectile(view);
            var rigid = view.GetRigidbody();

            rigid.AddForce(direction * force, ForceMode.Impulse);
            var data = view.gameObject.AddComponent <CollisionData>();

            data.Type   = weapon.GetWeaponType();
            data.Damage = weapon.GetDamage();
            view.StartTimer();
            IncreaseFireRateValue(weapon.GetWeaponType());

            _projectiles.Add(view);
        }
Ejemplo n.º 8
0
        public ProjectileViewMultiStagePath(ProjectileView view) : base(view)
        {
            this.stage1DurS           = view.ProjectileType.Stage1Duration / 1000f;
            this.stageTransDurS       = view.ProjectileType.StageTransitionDuration / 1000f;
            this.stage2DurS           = view.ProjectileType.Stage2Duration / 1000f;
            this.stage2TransKeyFrameS = this.stage1DurS;
            this.stage2KeyFrameS      = this.stage1DurS + this.stageTransDurS;
            Vector3 vector = view.TargetLocation - view.StartLocation;

            vector.y = 0f;
            vector.Normalize();
            vector             *= (float)view.ProjectileType.ArcRange;
            this.stage1EndPos   = view.StartLocation + vector;
            this.stage1EndPos.y = (float)view.ProjectileType.ArcHeight;
            this.deltaS1        = this.stage1EndPos - view.StartLocation;
            this.deltaS2        = view.TargetLocation - this.stage1EndPos;
        }
Ejemplo n.º 9
0
 public ProjectileViewLinearPath(ProjectileView view) : base(view)
 {
     this.delta = view.TargetLocation - view.StartLocation;
 }
Ejemplo n.º 10
0
        private void SpawnProjectile(uint id, object cookie)
        {
            SpecialAttack specialAttack = (SpecialAttack)cookie;

            StaRTS.Utils.Diagnostics.Logger logger = Service.Logger;
            if (specialAttack == null)
            {
                logger.Error("SpawnProjectile: specialAttack is null");
                this.SendSpecialAttackFired(null);
                return;
            }
            if (specialAttack.GetGunLocator() == null)
            {
                logger.Error("SpawnProjectile: specialAttack.GetGunLocator() is null " + specialAttack.VO.Uid);
                this.SendSpecialAttackFired(specialAttack.VO);
                return;
            }
            if (specialAttack.GetGunLocator().transform == null)
            {
                logger.Error("SpawnProjectile: specialAttack.GetGunLocator().transform is null " + specialAttack.VO.Uid);
                this.SendSpecialAttackFired(specialAttack.VO);
                return;
            }
            Vector3 position = specialAttack.GetGunLocator().transform.position;

            if (specialAttack.VO == null)
            {
                logger.Error("SpawnProjectile: specialAttack.VO is null");
                this.SendSpecialAttackFired(specialAttack.VO);
                return;
            }
            float num      = specialAttack.VO.NumberOfAttackers;
            int   quantity = (int)((float)specialAttack.VO.Damage / num);

            specialAttack.ApplySpecialAttackBuffs(ref quantity);
            HealthFragment       payload = new HealthFragment(null, HealthType.Damaging, quantity);
            ProjectileController projectileController = Service.ProjectileController;

            if (specialAttack.TargetShield != null && !specialAttack.VO.ProjectileType.PassThroughShield)
            {
                Entity shieldBorderEntity = specialAttack.TargetShield.ShieldBorderEntity;
                if (shieldBorderEntity == null)
                {
                    logger.Error("SpawnProjectile: shieldTarget is null");
                    this.SendSpecialAttackFired(specialAttack.VO);
                    return;
                }
                Vector3 targetWorldPos = specialAttack.TargetWorldPos;
                Vector3 targetWorldLoc = Vector3.zero;
                if (!Service.ShieldController.GetRayShieldIntersection(position, specialAttack.TargetWorldPos, specialAttack.TargetShield, out targetWorldLoc))
                {
                    targetWorldLoc = targetWorldPos;
                }
                Target target      = Target.CreateTargetWithWorldLocation((SmartEntity)shieldBorderEntity, targetWorldLoc);
                int    spawnBoardX = Units.WorldToBoardX((float)((int)position.x));
                int    spawnBoardZ = Units.WorldToBoardZ((float)((int)position.z));
                projectileController.SpawnProjectileForTarget(specialAttack.VO.HitDelay, spawnBoardX, spawnBoardZ, position, target, payload, specialAttack.TeamType, null, specialAttack.VO.ProjectileType, false, specialAttack.SpecialAttackBuffs, specialAttack.VO.Faction, null);
                this.AddProjectileInFlight(specialAttack.VO.ProjectileType);
            }
            else
            {
                Bullet bullet = projectileController.SpawnProjectileForTargetPosition(specialAttack.VO.HitDelay, position, specialAttack.TargetBoardX, specialAttack.TargetBoardZ, payload, specialAttack.TeamType, null, specialAttack.VO.ProjectileType, specialAttack.SpecialAttackBuffs, specialAttack.VO.Faction, specialAttack.VO.HasDropoff);
                if (specialAttack.VO.HasDropoff)
                {
                    bullet.Cookie = specialAttack;
                    ProjectileView projectileView = Service.ProjectileViewManager.SpawnProjectile(bullet);
                    Transform      transform      = projectileView.GetTransform();
                    this.AttachGameObject(transform, specialAttack.StarshipDetachableGameObject, false);
                    specialAttack.UpdateDetachableShadowAnimator(SpecialAttackDetachableObjectState.Falling);
                }
                this.AddProjectileInFlight(specialAttack.VO.ProjectileType);
            }
            this.SendSpecialAttackFired(specialAttack.VO);
        }
Ejemplo n.º 11
0
 public InfluenceEventArgs(ProjectileView projectile, ProjectileInfluence projectileInfluence)
 {
     Projectile          = projectile;
     ProjectileInfluence = projectileInfluence;
 }
Ejemplo n.º 12
0
 public ProjectileViewPath(ProjectileView view)
 {
     this.view            = view;
     this.CurrentLocation = view.StartLocation;
 }
Ejemplo n.º 13
0
 public ShootEventArgs(PlayerView player, ProjectileView projectile)
 {
     Player     = player;
     Projectile = projectile;
 }
Ejemplo n.º 14
0
 private void OnTimeEnd(ProjectileView view, WeaponType type)
 {
     ReturnProjectile(view, type);
 }
Ejemplo n.º 15
0
 private void OnEnemyCollision(ProjectileView view, WeaponType type)
 {
     ReturnProjectile(view, type);
 }