private void StopStabilizingTargetedObject() { if (m_distanceJointObject != null) { m_distanceJointObject.Remove(); m_distanceJoint.Remove(); m_targetedObjectJoint.Remove(); } var player = ScriptHelper.CastPlayer(TargetedObject); if (player != null) { player.AddCommand(new PlayerCommand(PlayerCommandType.StopStagger)); player.SetInputEnabled(true); } m_pullJoint.SetTargetObject(null); if (TargetedObject != null) { if (Owner.IsBot) { TargetedObject.SetCollisionFilter(m_oldCollisionFilter); } if (TargetedObject.GetCollisionFilter().CategoryBits == CategoryBits.DynamicG2) { TargetedObject.TrackAsMissile(true); // must be called after updating CollisionFilter } TargetedObject.SetMass(m_oldMass); TargetedObject = null; } IsTargetedObjectStabilized = false; }
private void Pull(IObject o) { var player = ScriptHelper.CastPlayer(o); if (player != null) { ScriptHelper.ExecuteSingleCommand(player, PlayerCommandType.Stagger, 20, GetStaggerDirection(player)); } if (o.GetBodyType() == BodyType.Static) { o.SetBodyType(BodyType.Dynamic); } var pullJoint = (IObjectPullJoint)Game.CreateObject("PullJoint"); var originalMass = o.GetMass(); o.SetMass(.004f); pullJoint.SetWorldPosition(o.GetWorldPosition()); pullJoint.SetForce(GetPullForce(o)); pullJoint.SetForcePerDistance(0); //if (Game.IsEditorTest) pullJoint.SetLineVisual(LineVisual.DJRope); pullJoint.SetTargetObject(o); pullJoint.SetTargetObjectJoint(m_magnetJoint); m_pulledObjects.Add(o.UniqueID, new PulledObjectInfo() { Object = o, OriginalMass = originalMass, PullJoint = pullJoint, }); }
private void TryStabilizeTargetedObject(Vector2 holdPosition) { var results = RayCastTargetedObject(false); var stabilizedZone = GetStabilizedZone(holdPosition); Game.DrawArea(stabilizedZone, Color.Green); var targetedObjectFound = false; var targetHitbox = TargetedObject.GetAABB(); if (stabilizedZone.Intersects(targetHitbox)) { targetedObjectFound = true; } foreach (var result in results) { if (result.HitObject == null) { continue; } if (result.HitObject.UniqueID == TargetedObject.UniqueID) { targetedObjectFound = true; if (stabilizedZone.Intersects(targetHitbox)) { if (!IsTargetedObjectStabilized) { StabilizeTargetedObject(); IsTargetedObjectStabilized = true; } } break; } } if (!targetedObjectFound) { StopStabilizingTargetedObject(); } else { var player = ScriptHelper.CastPlayer(TargetedObject); if (player != null && !player.IsStaggering) { // Not sure why StaggerInfinite is not infinite! player.AddCommand(new PlayerCommand(PlayerCommandType.StaggerInfinite)); } } }
private void CheckIfCollide() { var currentVec = Instance.GetLinearVelocity(); if (currentVec.Length() - m_lastVelocity.Length() <= -6 || MathExtension.Diff(Instance.GetAngle(), m_lastAngle) >= MathExtension.OneDeg * 3 || TotalDistanceTraveled >= 15 && currentVec.Length() <= 1) { TargetedObject = Game.GetObjectsByArea(Instance.GetAABB()) .Where(o => o.UniqueID != Instance.UniqueID && ScriptHelper.IsInteractiveObject(o)) .FirstOrDefault(); if (TargetedObject != null) { m_timeElasped = Game.TotalElapsedGameTime; TargetedPlayer = ScriptHelper.CastPlayer(TargetedObject); if (TargetedPlayer != null) { Instance.SetBodyType(BodyType.Static); m_relPlayerPosition = TargetedPlayer.GetWorldPosition() - Instance.GetWorldPosition(); } else { m_weldJoint = (IObjectWeldJoint)Game.CreateObject("WeldJoint"); m_weldJoint.SetWorldPosition(Instance.GetWorldPosition()); m_weldJoint.SetTargetObjects(new List <IObject>() { Instance, TargetedObject }); } } } m_lastVelocity = currentVec; m_lastAngle = Instance.GetAngle(); }