/// <summary> /// Used for weightlessness to determine if we are near a wall. /// </summary> /// <param name="broadPhaseSystem"></param> /// <param name="transform"></param> /// <param name="mover"></param> /// <param name="collider"></param> /// <returns></returns> public static bool IsAroundCollider(SharedBroadPhaseSystem broadPhaseSystem, ITransformComponent transform, IMobMoverComponent mover, IPhysBody collider) { var enlargedAABB = collider.GetWorldAABB().Enlarged(mover.GrabRange); foreach (var otherCollider in broadPhaseSystem.GetCollidingEntities(transform.MapID, enlargedAABB)) { if (otherCollider == collider) { continue; // Don't try to push off of yourself! } // Only allow pushing off of anchored things that have collision. if (otherCollider.BodyType != BodyType.Static || !otherCollider.CanCollide || ((collider.CollisionMask & otherCollider.CollisionLayer) == 0 && (otherCollider.CollisionMask & collider.CollisionLayer) == 0) || (otherCollider.Owner.TryGetComponent(out SharedPullableComponent? pullable) && pullable.BeingPulled)) { continue; } return(true); } return(false); }
public static bool UseMobMovement(SharedBroadPhaseSystem broadPhaseSystem, PhysicsComponent body, IMapManager mapManager) { return((body.BodyStatus == BodyStatus.OnGround) & body.Owner.HasComponent <IMobStateComponent>() && EntitySystem.Get <ActionBlockerSystem>().CanMove(body.Owner) && (!body.Owner.IsWeightless(body, mapManager: mapManager) || body.Owner.TryGetComponent(out SharedPlayerMobMoverComponent? mover) && IsAroundCollider(broadPhaseSystem, body.Owner.Transform, mover, body))); }
public override void Initialize() { base.Initialize(); _broadPhaseSystem = EntitySystem.Get <SharedBroadPhaseSystem>(); _frictionModifier = _configManager.GetCVar(CCVars.TileFrictionModifier); _configManager.OnValueChanged(CCVars.TileFrictionModifier, value => _frictionModifier = value); _stopSpeed = _configManager.GetCVar(CCVars.StopSpeed); _configManager.OnValueChanged(CCVars.StopSpeed, value => _stopSpeed = value); }
public override void Initialize() { base.Initialize(); _broadPhaseSystem = EntitySystem.Get <SharedBroadPhaseSystem>(); }