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; }
/** * <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); }
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; }
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); }
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); }
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; }
public ProjectileViewLinearPath(ProjectileView view) : base(view) { this.delta = view.TargetLocation - view.StartLocation; }
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); }
public InfluenceEventArgs(ProjectileView projectile, ProjectileInfluence projectileInfluence) { Projectile = projectile; ProjectileInfluence = projectileInfluence; }
public ProjectileViewPath(ProjectileView view) { this.view = view; this.CurrentLocation = view.StartLocation; }
public ShootEventArgs(PlayerView player, ProjectileView projectile) { Player = player; Projectile = projectile; }
private void OnTimeEnd(ProjectileView view, WeaponType type) { ReturnProjectile(view, type); }
private void OnEnemyCollision(ProjectileView view, WeaponType type) { ReturnProjectile(view, type); }