Ejemplo n.º 1
0
        public void UpdateAttackCollisionWithRobot(GameTime gameTime, AttackBox ActiveAttackBox, RobotAnimation TargetRobot)
        {
            if (TargetRobot.HP <= 0 || TargetRobot.Team == ActiveAttackBox.Owner.Team)
            {
                return;
            }

            if (!ActiveAttackBox.ListAttackedRobots.Contains(TargetRobot))
            {
                PolygonCollisionResult FinalCollisionResult = new PolygonCollisionResult(Vector2.Zero, -1);
                Polygon FinalCollisionPolygon = null;

                foreach (CollisionPolygon EnemyCollision in TargetRobot.ListCollisionPolygon)
                {
                    foreach (Polygon CollisionPolygon in ActiveAttackBox.ListCollisionPolygon)
                    {
                        PolygonCollisionResult CollisionResult = Polygon.PolygonCollisionSAT(CollisionPolygon, EnemyCollision.ActivePolygon, ActiveAttackBox.Speed);

                        if (FinalCollisionResult.Distance < 0 || (CollisionResult.Distance >= 0 && CollisionResult.Distance > FinalCollisionResult.Distance))
                        {
                            FinalCollisionResult  = CollisionResult;
                            FinalCollisionPolygon = EnemyCollision.ActivePolygon;
                        }
                    }
                }

                if (FinalCollisionResult.Distance >= 0)
                {
                    if (TargetRobot.RobotAI != null)
                    {
                        TargetRobot.RobotAI.Update(gameTime, "On Hit");
                    }

                    Vector2 CollisionPoint;
                    ActiveAttackBox.OnCollision(FinalCollisionResult, FinalCollisionPolygon, out CollisionPoint);

                    if (ActiveAttackBox.ExplosionAttributes.ExplosionRadius > 0)
                    {
                        CreateExplosion(CollisionPoint, ActiveAttackBox);
                    }

                    ActiveAttackBox.ListAttackedRobots.Add(TargetRobot);

                    if (TargetRobot.HasKnockback)
                    {
                        TargetRobot.Speed.X = Math.Sign(ActiveAttackBox.Speed.X) * 3;
                        TargetRobot.Speed.Y = Math.Sign(ActiveAttackBox.Speed.Y) * 3;
                    }

                    if (Owner.IsOfflineOrServer || Owner.IsServer)
                    {
                        int FinalDamage = (int)ActiveAttackBox.Damage;

                        TargetRobot.HP -= FinalDamage;

                        OnDamageRobot(ActiveAttackBox.Owner, TargetRobot, FinalDamage, FinalCollisionPolygon.Center, Owner.IsMainCharacter(TargetRobot.ID));
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public void UpdateAttackCollisionWithWorld(AttackBox ActiveAttackBox)
        {
            PolygonCollisionResult FinalCollisionResult       = new PolygonCollisionResult(Vector2.Zero, -1);
            PolygonCollisionResult FinalCollisionGroundResult = new PolygonCollisionResult(Vector2.Zero, -1);
            Polygon FinalCollisionPolygon = null;

            foreach (Polygon ActivePolygon in ListWorldCollisionPolygon)
            {
                foreach (Polygon CollisionPolygon in ActiveAttackBox.ListCollisionPolygon)
                {
                    PolygonCollisionResult CollisionGroundResult;
                    PolygonCollisionResult CollisionResult = Polygon.PolygonCollisionSAT(CollisionPolygon, ActivePolygon, ActiveAttackBox.Speed, out CollisionGroundResult);

                    if (FinalCollisionResult.Distance < 0 || (CollisionResult.Distance >= 0 && CollisionResult.Distance > FinalCollisionResult.Distance))
                    {
                        FinalCollisionResult       = CollisionResult;
                        FinalCollisionGroundResult = CollisionGroundResult;
                        FinalCollisionPolygon      = ActivePolygon;
                    }
                }
            }

            if (FinalCollisionResult.Distance >= 0)
            {
                Vector2 CollisionPoint;
                ActiveAttackBox.OnCollision(FinalCollisionResult, FinalCollisionPolygon, out CollisionPoint);
                SetAttackContext(ActiveAttackBox, ActiveAttackBox.Owner, (float)Math.Atan2(-FinalCollisionGroundResult.Axis.X, -FinalCollisionGroundResult.Axis.Y), CollisionPoint);
                ActiveAttackBox.UpdateSkills(TripleThunderAttackRequirement.OnGroundCollisionAttackName);

                if (ActiveAttackBox.ExplosionAttributes.ExplosionRadius > 0)
                {
                    CreateExplosion(CollisionPoint, ActiveAttackBox);
                }
                else if (!ActiveAttackBox.FollowOwner)
                {
                    Owner.PlayerSFXGenerator.PlayBulletHitObjectSound();
                }
            }
        }