private void StabilizeTargetedObject() { TargetedObject.SetLinearVelocity(Vector2.Zero); m_distanceJointObject = Game.CreateObject("InvisibleBlockSmall"); m_distanceJointObject.SetBodyType(BodyType.Dynamic); m_distanceJoint = (IObjectDistanceJoint)Game.CreateObject("DistanceJoint"); m_distanceJoint.SetLineVisual(LineVisual.None); m_distanceJoint.SetLengthType(DistanceJointLengthType.Fixed); m_targetedObjectJoint = (IObjectTargetObjectJoint)Game.CreateObject("TargetObjectJoint"); var targetedObjPosition = TargetedObject.GetAABB().Center; m_distanceJointObject.SetWorldPosition(targetedObjPosition); TargetedObject.SetWorldPosition(targetedObjPosition); m_pullJoint.SetWorldPosition(targetedObjPosition); m_distanceJoint.SetWorldPosition(targetedObjPosition); // if DistanceJoint and TargetObjectJoint is at the same position, weird things may happen // uncomment the part below to stop it m_targetedObjectJoint.SetWorldPosition(m_distanceJointObject.GetWorldPosition() /* - Vector2.UnitY*/); m_pullJoint.SetTargetObject(m_distanceJointObject); m_distanceJoint.SetTargetObject(m_distanceJointObject); m_distanceJoint.SetTargetObjectJoint(m_targetedObjectJoint); m_targetedObjectJoint.SetTargetObject(TargetedObject); m_pullJoint.SetForce(15); IsTargetedObjectStabilized = true; }
private void Release() { if (TargetedObject == null) { var results = RayCastTargetedObject(true); if (results.Count() > 0) { var result = results.First(); TargetedObject = result.HitObject; if (result.IsPlayer) { MakePlayer((IPlayer)result.HitObject, PlayerCommandType.Fall); } } } if (TargetedObject != null) { var velocity = Owner.AimVector * 40; TargetedObject.SetLinearVelocity(velocity); // PS: I dont like the effects, uncomment if you want to see it //m_releasedObject = m_targetedObject; //m_stopPlayingReleaseEffect = true; //ScriptHelper.RunIn(() => //{ // if (m_releasedObject.IsRemoved) return; // Game.PlayEffect(EffectName.BulletSlowmoTrace, m_releasedObject.GetWorldPosition()); // for (var i = 0; i < 1; i++) // { // var effectPosition = ScriptHelerp.WithinArea(m_releasedObject.GetAABB()); // Game.PlayEffect(EffectName.ItemGleam, effectPosition); // } //}, 1); StopStabilizingTargetedObject(); } }