mirror of
https://github.com/opensim/opensim.git
synced 2026-08-11 03:45:35 +08:00
* TEST * unscripted sit
This commit is contained in:
@@ -2103,12 +2103,29 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10)
|
||||
{
|
||||
// if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10)
|
||||
// {
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is unset and within 10m",
|
||||
// Name, part.Name, part.LocalId);
|
||||
|
||||
if (m_scene.PhysicsScene != null &&
|
||||
part.PhysActor != null &&
|
||||
Util.GetDistanceTo(AbsolutePosition, pos) <= 30)
|
||||
{
|
||||
|
||||
Vector3 camdif = CameraPosition - part.AbsolutePosition;
|
||||
camdif.Normalize();
|
||||
|
||||
// m_log.InfoFormat("sit {0} {1}", offset.ToString(), camdif.ToString());
|
||||
|
||||
if (m_scene.PhysicsScene.SitAvatar(part.PhysActor, AbsolutePosition, CameraPosition, offset, new Vector3(0.35f, 0, 0.65f), PhysicsSitResponse) != 0)
|
||||
return;
|
||||
}
|
||||
|
||||
if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10)
|
||||
{
|
||||
|
||||
AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight);
|
||||
canSit = true;
|
||||
}
|
||||
@@ -2196,197 +2213,54 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
SendSitResponse(targetID, offset, Quaternion.Identity);
|
||||
}
|
||||
|
||||
/*
|
||||
public void SitRayCastAvatarPosition(SceneObjectPart part)
|
||||
public void PhysicsSitResponse(int status, uint partID, Vector3 offset, Quaternion Orientation)
|
||||
{
|
||||
Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
|
||||
Vector3 StartRayCastPosition = AbsolutePosition;
|
||||
Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
|
||||
float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
|
||||
m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastAvatarPositionResponse);
|
||||
}
|
||||
|
||||
public void SitRayCastAvatarPositionResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
|
||||
{
|
||||
SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
|
||||
if (part != null)
|
||||
{
|
||||
if (hitYN)
|
||||
{
|
||||
if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
|
||||
{
|
||||
SitRaycastFindEdge(collisionPoint, normal);
|
||||
m_log.DebugFormat("[SIT]: Raycast Avatar Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
|
||||
}
|
||||
else
|
||||
{
|
||||
SitRayCastAvatarPositionCameraZ(part);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SitRayCastAvatarPositionCameraZ(part);
|
||||
}
|
||||
}
|
||||
else
|
||||
if (status < 0)
|
||||
{
|
||||
ControllingClient.SendAlertMessage("Sit position no longer exists");
|
||||
m_requestedSitTargetUUID = UUID.Zero;
|
||||
m_requestedSitTargetID = 0;
|
||||
m_requestedSitOffset = Vector3.Zero;
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
if (status == 0)
|
||||
return;
|
||||
|
||||
public void SitRayCastAvatarPositionCameraZ(SceneObjectPart part)
|
||||
{
|
||||
// Next, try to raycast from the camera Z position
|
||||
Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
|
||||
Vector3 StartRayCastPosition = AbsolutePosition; StartRayCastPosition.Z = CameraPosition.Z;
|
||||
Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
|
||||
float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
|
||||
m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastAvatarPositionCameraZResponse);
|
||||
}
|
||||
|
||||
public void SitRayCastAvatarPositionCameraZResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
|
||||
{
|
||||
SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
|
||||
if (part != null)
|
||||
SceneObjectPart part = m_scene.GetSceneObjectPart(partID);
|
||||
if (part == null || part.ParentGroup.IsAttachment)
|
||||
{
|
||||
if (hitYN)
|
||||
{
|
||||
if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
|
||||
{
|
||||
SitRaycastFindEdge(collisionPoint, normal);
|
||||
m_log.DebugFormat("[SIT]: Raycast Avatar Position + CameraZ succeeded at point: {0}, normal:{1}", collisionPoint, normal);
|
||||
}
|
||||
else
|
||||
{
|
||||
SitRayCastCameraPosition(part);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SitRayCastCameraPosition(part);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ControllingClient.SendAlertMessage("Sit position no longer exists");
|
||||
m_requestedSitTargetUUID = UUID.Zero;
|
||||
m_requestedSitTargetID = 0;
|
||||
m_requestedSitOffset = Vector3.Zero;
|
||||
return;
|
||||
}
|
||||
|
||||
// m_log.InfoFormat("physsit {0} {1}", offset.ToString(),Orientation.ToString());
|
||||
|
||||
part.AddSittingAvatar(UUID);
|
||||
|
||||
Vector3 cameraAtOffset = part.GetCameraAtOffset();
|
||||
Vector3 cameraEyeOffset = part.GetCameraEyeOffset();
|
||||
bool forceMouselook = part.GetForceMouselook();
|
||||
|
||||
ControllingClient.SendSitResponse(
|
||||
part.UUID, offset, Orientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook);
|
||||
|
||||
part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK);
|
||||
|
||||
// assuming no autopilot in use
|
||||
Velocity = Vector3.Zero;
|
||||
RemoveFromPhysicalScene();
|
||||
|
||||
Rotation = Orientation;
|
||||
m_pos = offset;
|
||||
|
||||
m_requestedSitTargetID = 0; // invalidate the viewer sit comand for now
|
||||
part.ParentGroup.AddAvatar(UUID);
|
||||
|
||||
ParentPart = part;
|
||||
ParentID = part.LocalId;
|
||||
|
||||
Animator.TrySetMovementAnimation("SIT");
|
||||
SendAvatarDataToAllAgents();
|
||||
}
|
||||
|
||||
public void SitRayCastCameraPosition(SceneObjectPart part)
|
||||
{
|
||||
// Next, try to raycast from the camera position
|
||||
Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
|
||||
Vector3 StartRayCastPosition = CameraPosition;
|
||||
Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
|
||||
float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
|
||||
m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastCameraPositionResponse);
|
||||
}
|
||||
|
||||
public void SitRayCastCameraPositionResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
|
||||
{
|
||||
SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
|
||||
if (part != null)
|
||||
{
|
||||
if (hitYN)
|
||||
{
|
||||
if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
|
||||
{
|
||||
SitRaycastFindEdge(collisionPoint, normal);
|
||||
m_log.DebugFormat("[SIT]: Raycast Camera Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
|
||||
}
|
||||
else
|
||||
{
|
||||
SitRayHorizontal(part);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SitRayHorizontal(part);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ControllingClient.SendAlertMessage("Sit position no longer exists");
|
||||
m_requestedSitTargetUUID = UUID.Zero;
|
||||
m_requestedSitTargetID = 0;
|
||||
m_requestedSitOffset = Vector3.Zero;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void SitRayHorizontal(SceneObjectPart part)
|
||||
{
|
||||
// Next, try to raycast from the avatar position to fwd
|
||||
Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
|
||||
Vector3 StartRayCastPosition = CameraPosition;
|
||||
Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
|
||||
float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
|
||||
m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastHorizontalResponse);
|
||||
}
|
||||
|
||||
public void SitRayCastHorizontalResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
|
||||
{
|
||||
SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
|
||||
if (part != null)
|
||||
{
|
||||
if (hitYN)
|
||||
{
|
||||
if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
|
||||
{
|
||||
SitRaycastFindEdge(collisionPoint, normal);
|
||||
m_log.DebugFormat("[SIT]: Raycast Horizontal Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
|
||||
// Next, try to raycast from the camera position
|
||||
Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
|
||||
Vector3 StartRayCastPosition = CameraPosition;
|
||||
Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
|
||||
float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
|
||||
//m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastResponseAvatarPosition);
|
||||
}
|
||||
else
|
||||
{
|
||||
ControllingClient.SendAlertMessage("Sit position not accessable.");
|
||||
m_requestedSitTargetUUID = UUID.Zero;
|
||||
m_requestedSitTargetID = 0;
|
||||
m_requestedSitOffset = Vector3.Zero;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ControllingClient.SendAlertMessage("Sit position not accessable.");
|
||||
m_requestedSitTargetUUID = UUID.Zero;
|
||||
m_requestedSitTargetID = 0;
|
||||
m_requestedSitOffset = Vector3.Zero;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ControllingClient.SendAlertMessage("Sit position no longer exists");
|
||||
m_requestedSitTargetUUID = UUID.Zero;
|
||||
m_requestedSitTargetID = 0;
|
||||
m_requestedSitOffset = Vector3.Zero;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void SitRaycastFindEdge(Vector3 collisionPoint, Vector3 collisionNormal)
|
||||
{
|
||||
int i = 0;
|
||||
//throw new NotImplementedException();
|
||||
//m_requestedSitTargetUUID = UUID.Zero;
|
||||
//m_requestedSitTargetID = 0;
|
||||
//m_requestedSitOffset = Vector3.Zero;
|
||||
|
||||
SendSitResponse(ControllingClient, m_requestedSitTargetUUID, collisionPoint - m_requestedSitOffset, Quaternion.Identity);
|
||||
}
|
||||
*/
|
||||
|
||||
public void HandleAgentSit(IClientAPI remoteClient, UUID agentID)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user