private void spawnParticles(ISceneObject other) { Vector direction; Vector collision; if (other is Asteroid) { Asteroid a = other as Asteroid; collision = a.Center + (a.Direction * a.Radius); } else if (other is IMovable) { IMovable o = other as IMovable; collision = o.Center; } else { return; } direction = new Vector(0, -1); EmmitorGroup g = ParticleEmmitorFactory.CreateBaseExplosionEmmitors(baze, collision, direction); g.Attach(me.SceneMgr); }
private void ProcessStep() { switch (step) { case 1: { ParticleEmmitor fireEmmitor = ParticleEmmitorFactory.CreateBasicFire(me.SceneMgr, Color.FromArgb(40, 255, 60, 0)); fireEmmitor.Amount = 20; fireEmmitor.MinLife = 0.3f; fireEmmitor.MaxLife = 0.4f; fireEmmitor.MinSize = asteroid.Radius / 5.0f; fireEmmitor.MaxSize = asteroid.Radius / 6.0f; fireEmmitor.Infinite = true; meNode.AddEmmitor(fireEmmitor, new Vector(0, 0), false); } break; case 2: { asteroid.AddControl(new ShakingControl(1, true, 0.05f)); } break; case 3: break; } }
private void CreateEmmitor(Vector position) { EmmitorGroup g = ParticleEmmitorFactory.CreateFireEmmitors(me.SceneMgr, position); emmitors.Push(g); g.Attach(me.SceneMgr, false); }
public virtual void HitAsteroid(IDestroyable asteroid) { if (hit) { return; } else { hit = true; } if (bullet.Owner.IsCurrentPlayerOrBot()) { bullet.Owner.AddScoreAndShow(ScoreDefines.CANNON_HIT); if (bullet.Owner.IsCurrentPlayer()) { bullet.SceneMgr.FloatingTextMgr.AddFloatingText(ScoreDefines.CANNON_HIT, bullet.Center, FloatingTextManager.TIME_LENGTH_1, FloatingTextType.SCORE); } if (asteroid is UnstableAsteroid) { Rect opponentLoc = PlayerBaseLocation.GetBaseLocation(bullet.Owner.GetPosition() == PlayerPosition.RIGHT ? PlayerPosition.LEFT : PlayerPosition.RIGHT); double xMin = opponentLoc.X; double xMax = opponentLoc.X + opponentLoc.Width; if (asteroid.Position.Y > SharedDef.VIEW_PORT_SIZE.Height * 0.4 && asteroid.Position.X >= xMin && asteroid.Position.X <= xMax) { if (bullet.Owner.IsCurrentPlayer()) { bullet.SceneMgr.FloatingTextMgr.AddFloatingText(Strings.ft_score_cannon_unstable_above_enemy, bullet.Center, FloatingTextManager.TIME_LENGTH_4, FloatingTextType.BONUS_SCORE, FloatingTextManager.SIZE_BIG, false, true); } bullet.Owner.AddScoreAndShow(ScoreDefines.CANNON_DESTROYED_UNSTABLE_ASTEROID_ABOVE_ENEMY); } } } asteroid.TakeDamage(bullet.Damage, bullet); NetOutgoingMessage msg = bullet.SceneMgr.CreateNetMessage(); msg.Write((int)PacketType.BULLET_HIT); msg.Write(bullet.Id); msg.Write(asteroid.Id); msg.Write(bullet.Damage); bullet.SceneMgr.SendMessage(msg); EmmitorGroup g = ParticleEmmitorFactory.CreateBulletImplosionEmmitor(bullet.SceneMgr, bullet.Center, bullet.Color); g.Attach(bullet.SceneMgr, false); }
public void DoCollideWith(ISceneObject other, float tpf) { if (other is Asteroid && (other as Asteroid).Enabled) { other.DoRemoveMe(); // nebudou hitovat objekty, ktere jsou uz pod horizontem if (other.Center.Y > baze.Position.Y + baze.Size.Height) { return; } int damage = (other as Asteroid).Radius / 2; // score Player otherPlayer = baze.SceneMgr.GetOtherActivePlayer(baze.Owner.GetId()); if (otherPlayer != null && otherPlayer.IsCurrentPlayer()) { Vector textPos = new Vector(otherPlayer.GetBaseLocation().X + (otherPlayer.GetBaseLocation().Width / 2), otherPlayer.GetBaseLocation().Y - 20); baze.SceneMgr.FloatingTextMgr.AddFloatingText(damage * ScoreDefines.DAMAGE_DEALT, textPos, FloatingTextManager.TIME_LENGTH_2, FloatingTextType.SCORE, FloatingTextManager.SIZE_MEDIUM); } if (otherPlayer != null && otherPlayer.IsCurrentPlayerOrBot()) { otherPlayer.AddScoreAndShow(damage * ScoreDefines.DAMAGE_DEALT); } // damage baze.SceneMgr.FloatingTextMgr.AddFloatingText(damage, new Vector((other as Asteroid).Center.X, (other as Asteroid).Center.Y - 10), FloatingTextManager.TIME_LENGTH_1, FloatingTextType.DAMAGE, FloatingTextManager.SIZE_MEDIUM); SoundManager.Instance.StartPlayingOnce(SharedDef.MUSIC_DAMAGE_TO_BASE); baze.Integrity -= damage; baze.Owner.Statistics.DamageTaken += damage; EmmitorGroup g = ParticleEmmitorFactory.CreateAsteroidExplosionEmmitors(me.SceneMgr, other.Center); g.Attach(me.SceneMgr, false); if (baze.Owner.IsCurrentPlayer()) { me.SceneMgr.ScreenShakingMgr.Start(ShakePower.WEAK); } if (baze.Owner.IsCurrentPlayerOrBot()) { spawnParticles(other); } } }
protected override void OnDeath() { if (me is MiningModule) { module.Owner.Statistics.DeadTime += SharedDef.SPECTATOR_RESPAWN_TIME; } module.GetControlOfType <HpBarControl>().Bar.Percentage = 0; module.GetControlOfType <RespawningObjectControl>().Die(SharedDef.SPECTATOR_RESPAWN_TIME); Vulnerable = false; EmmitorGroup g = ParticleEmmitorFactory.CreateExplosionEmmitors(module.SceneMgr, module.Center); g.Attach(module.SceneMgr, false); if (me.SceneMgr.GetCurrentPlayer().Device == module) { me.SceneMgr.ScreenShakingMgr.Start(ShakePower.STRONG); } }
protected ParticleEmmitor CreateAndAddSmokeEmmitor(int num) { ParticleEmmitor smallSmokeEmmitor1 = ParticleEmmitorFactory.CreateSmokeParticleEmmitor(me.SceneMgr, asteroid.Position); smallSmokeEmmitor1.EmmitingDirection = asteroid.Direction.Rotate(Math.PI); smallSmokeEmmitor1.Infinite = true; smallSmokeEmmitor1.MinAngle = (float)FastMath.DegToRad(15); smallSmokeEmmitor1.MaxAngle = (float)FastMath.DegToRad(-15); smallSmokeEmmitor1.MinLife = 1.2f; smallSmokeEmmitor1.MaxLife = 1.5f; smallSmokeEmmitor1.Amount = 30; smallSmokeEmmitor1.MinSize *= 1.2f; smallSmokeEmmitor1.MaxSize *= 1.2f; EmmitorDirectionCloneControl control = new EmmitorDirectionCloneControl(me); control.DirectionOfsetRotation = (float)Math.PI; smallSmokeEmmitor1.AddControl(control); IMovementControl c = asteroid.GetControlOfType <IMovementControl>(); if (num == 0) { meNode.AddEmmitor(smallSmokeEmmitor1, new Vector(asteroid.Radius * 0.85, 0), false); } else if (num == 1) { meNode.AddEmmitor(smallSmokeEmmitor1, new Vector(asteroid.Radius * 0.85, asteroid.Radius * 0.2).Rotate((Math.PI / 4)), false); } else if (num == 2) { meNode.AddEmmitor(smallSmokeEmmitor1, new Vector(asteroid.Radius * 0.85, asteroid.Radius * 0.2).Rotate(-(Math.PI / 4)), false); } return(smallSmokeEmmitor1); }
private void CreateSpark() { ParticleNode node = new ParticleNode(me.SceneMgr, IdMgr.GetNewId(me.SceneMgr.GetCurrentPlayer().GetId())); // TODO spawn in a whole volume bool left = me.SceneMgr.GetRandomGenerator().Next(2) == 0 ? false : true; if (left) { Vector position = (meNode.Center - (meNode.Direction.Rotate(Math.PI / 4) * (asteroid.Radius))); position += meNode.Direction * (asteroid.Radius * 1.5); node.Position = position; node.Direction = meNode.Direction.Rotate(FastMath.DegToRad(-10)); } else { Vector position = (meNode.Center - (meNode.Direction.Rotate(-Math.PI / 4) * (asteroid.Radius))); position += meNode.Direction * (asteroid.Radius * 1.5); node.Position = position; node.Direction = meNode.Direction.Rotate(FastMath.DegToRad(10)); } float minSize = (float)FastMath.LinearInterpolate(0.2, 0.5, me.SceneMgr.GetRandomGenerator().NextDouble()); float maxSize = minSize * 1.2f; ParticleEmmitor smokeEmmitor = ParticleEmmitorFactory.CreateBasicFire(me.SceneMgr, Color.FromArgb(80, 0, 0, 0)); smokeEmmitor.Amount = 20; smokeEmmitor.MinLife = 0.3f; smokeEmmitor.MaxLife = 0.4f; smokeEmmitor.MinSize = minSize * 1.3f; smokeEmmitor.MaxSize = maxSize * 1.3f; smokeEmmitor.SpawnRadius = 4f; smokeEmmitor.Infinite = true; ParticleEmmitor fireEmmitor = ParticleEmmitorFactory.CreateBasicFire(me.SceneMgr, Color.FromArgb(150, 255, 100, 0)); fireEmmitor.Amount = 20; fireEmmitor.MinLife = 0.1f; fireEmmitor.MaxLife = 0.2f; fireEmmitor.MinSize = minSize * 1.1f; fireEmmitor.MaxSize = maxSize * 1.1f; fireEmmitor.Infinite = true; ParticleEmmitor fireEmmitor2 = ParticleEmmitorFactory.CreateBasicFire(me.SceneMgr, Color.FromArgb(200, 255, 200, 0)); fireEmmitor2.Amount = 20; fireEmmitor2.MinLife = 0.1f; fireEmmitor2.MaxLife = 0.1f; fireEmmitor2.MinSize = minSize; fireEmmitor2.MaxSize = maxSize; fireEmmitor2.Infinite = true; EmmitorGroup grp = new EmmitorGroup(); grp.Add(smokeEmmitor); grp.Add(fireEmmitor); grp.Add(fireEmmitor2); node.AddEmmitorGroup(grp, new Vector(), false); NewtonianMovementControl nmc = new NewtonianMovementControl(); nmc.Speed = (asteroid.GetControlOfType <IMovementControl>().RealSpeed / tpf) * 0.75f; node.AddControl(nmc); node.AddControl(new LimitedLifeControl((float)FastMath.LinearInterpolate(0.5, 2, me.SceneMgr.GetRandomGenerator().NextDouble()))); me.SceneMgr.DelayedAttachToScene(node); }