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)); } } } }
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(); } } }