mirror of
https://github.com/opensim/opensim.git
synced 2026-08-09 02:36:00 +08:00
Mantis 6063 osNpcTouch.
Allow NPCS to touch obects.
This commit is contained in:
committed by
Justin Clark-Casey (justincc)
parent
43a2da9edb
commit
1b1f841c6a
@@ -104,6 +104,45 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||
OnMoneyTransferRequest(m_uuid, target, amount, 1, "Payment");
|
||||
}
|
||||
|
||||
public bool Touch(UUID target)
|
||||
{
|
||||
SceneObjectPart part = m_scene.GetSceneObjectPart(target);
|
||||
if (part == null)
|
||||
return false;
|
||||
bool objectTouchable = hasTouchEvents(part); // Only touch an object that is scripted to respond
|
||||
if (!objectTouchable && !part.IsRoot)
|
||||
objectTouchable = hasTouchEvents(part.ParentGroup.RootPart);
|
||||
if (!objectTouchable)
|
||||
return false;
|
||||
// Set up the surface args as if the touch is from a client that does not support this
|
||||
SurfaceTouchEventArgs surfaceArgs = new SurfaceTouchEventArgs();
|
||||
surfaceArgs.FaceIndex = -1; // TOUCH_INVALID_FACE
|
||||
surfaceArgs.Binormal = Vector3.Zero; // TOUCH_INVALID_VECTOR
|
||||
surfaceArgs.Normal = Vector3.Zero; // TOUCH_INVALID_VECTOR
|
||||
surfaceArgs.STCoord = new Vector3(-1.0f, -1.0f, 0.0f); // TOUCH_INVALID_TEXCOORD
|
||||
surfaceArgs.UVCoord = surfaceArgs.STCoord; // TOUCH_INVALID_TEXCOORD
|
||||
List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
|
||||
touchArgs.Add(surfaceArgs);
|
||||
Vector3 offset = part.OffsetPosition * -1.0f;
|
||||
if (OnGrabObject == null)
|
||||
return false;
|
||||
OnGrabObject(part.LocalId, offset, this, touchArgs);
|
||||
if (OnGrabUpdate != null)
|
||||
OnGrabUpdate(part.UUID, offset, part.ParentGroup.RootPart.GroupPosition, this, touchArgs);
|
||||
if (OnDeGrabObject != null)
|
||||
OnDeGrabObject(part.LocalId, this, touchArgs);
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool hasTouchEvents(SceneObjectPart part)
|
||||
{
|
||||
if ((part.ScriptEvents & scriptEvents.touch) != 0 ||
|
||||
(part.ScriptEvents & scriptEvents.touch_start) != 0 ||
|
||||
(part.ScriptEvents & scriptEvents.touch_end) != 0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public void InstantMessage(UUID target, string message)
|
||||
{
|
||||
OnInstantMessage(this, new GridInstantMessage(m_scene,
|
||||
|
||||
@@ -305,6 +305,16 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool Touch(UUID agentID, UUID objectID)
|
||||
{
|
||||
lock (m_avatars)
|
||||
{
|
||||
if (m_avatars.ContainsKey(agentID))
|
||||
return m_avatars[agentID].Touch(objectID);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public UUID GetOwner(UUID agentID)
|
||||
{
|
||||
lock (m_avatars)
|
||||
|
||||
Reference in New Issue
Block a user