reduce some diferences with master
parent
d900d0112d
commit
124602c6c2
|
@ -2174,9 +2174,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
foreach (SceneObjectPart part in parts)
|
foreach (SceneObjectPart part in parts)
|
||||||
SetAlpha(part, alpha, face);
|
SetAlpha(part, alpha, face);
|
||||||
}
|
}
|
||||||
finally
|
finally { }
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2366,10 +2364,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
foreach (SceneObjectPart part in parts)
|
foreach (SceneObjectPart part in parts)
|
||||||
SetTexture(part, texture, face);
|
SetTexture(part, texture, face);
|
||||||
}
|
}
|
||||||
finally
|
finally { }
|
||||||
{
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
ScriptSleep(m_sleepMsOnSetLinkTexture);
|
ScriptSleep(m_sleepMsOnSetLinkTexture);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2737,12 +2733,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
|
|
||||||
|
|
||||||
// Teravus: if (m_host.ParentID == 0) is bug code because the ParentID for the Avatar will cause this to be nonzero for root prim attachments
|
|
||||||
// which is then treated like a child prim rotation and it's offset gets cumulatively multiplied against.
|
|
||||||
// to fix the scripted rotations we also have to check to see if the root part localid is the same as the host's localid.
|
|
||||||
// RootPart != null should shortcircuit
|
|
||||||
|
|
||||||
// try to let this work as in SL...
|
// try to let this work as in SL...
|
||||||
if (m_host.ParentID == 0 || (m_host.ParentGroup != null && m_host == m_host.ParentGroup.RootPart))
|
if (m_host.ParentID == 0 || (m_host.ParentGroup != null && m_host == m_host.ParentGroup.RootPart))
|
||||||
{
|
{
|
||||||
|
@ -2781,7 +2771,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
|
|
||||||
// keep using physactor ideia of isphysical
|
// keep using physactor ideia of isphysical
|
||||||
// it should be SOP ideia of that
|
// it should be SOP ideia of that
|
||||||
// not much of a issue with ubitODE
|
// not much of a issue with ubOde
|
||||||
if (pa != null && pa.IsPhysical)
|
if (pa != null && pa.IsPhysical)
|
||||||
isphys = true;
|
isphys = true;
|
||||||
else
|
else
|
||||||
|
@ -2923,6 +2913,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
return force;
|
return force;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void llSetVelocity(LSL_Vector vel, int local)
|
||||||
|
{
|
||||||
|
m_host.AddScriptLPS(1);
|
||||||
|
m_host.SetVelocity(new Vector3((float)vel.x, (float)vel.y, (float)vel.z), local != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void llSetAngularVelocity(LSL_Vector avel, int local)
|
||||||
|
{
|
||||||
|
m_host.AddScriptLPS(1);
|
||||||
|
m_host.SetAngularVelocity(new Vector3((float)avel.x, (float)avel.y, (float)avel.z), local != 0);
|
||||||
|
}
|
||||||
public LSL_Integer llTarget(LSL_Vector position, double range)
|
public LSL_Integer llTarget(LSL_Vector position, double range)
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
|
@ -3000,11 +3001,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
llSetTorque(torque, local);
|
llSetTorque(torque, local);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llSetVelocity(LSL_Vector vel, int local)
|
|
||||||
{
|
|
||||||
m_host.AddScriptLPS(1);
|
|
||||||
m_host.SetVelocity(new Vector3((float)vel.x, (float)vel.y, (float)vel.z), local != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public LSL_Vector llGetVel()
|
public LSL_Vector llGetVel()
|
||||||
{
|
{
|
||||||
|
@ -3033,12 +3029,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
return new LSL_Vector(m_host.Acceleration);
|
return new LSL_Vector(m_host.Acceleration);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llSetAngularVelocity(LSL_Vector avel, int local)
|
|
||||||
{
|
|
||||||
m_host.AddScriptLPS(1);
|
|
||||||
m_host.SetAngularVelocity(new Vector3((float)avel.x, (float)avel.y, (float)avel.z), local != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public LSL_Vector llGetOmega()
|
public LSL_Vector llGetOmega()
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
|
@ -3700,6 +3690,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
{
|
{
|
||||||
// Unregister controls from Presence
|
// Unregister controls from Presence
|
||||||
presence.UnRegisterControlEventsToScript(m_host.LocalId, m_item.ItemID);
|
presence.UnRegisterControlEventsToScript(m_host.LocalId, m_item.ItemID);
|
||||||
|
// Remove Take Control permission.
|
||||||
|
m_item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4289,9 +4281,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
foreach (SceneObjectPart part in parts)
|
foreach (SceneObjectPart part in parts)
|
||||||
part.SetFaceColorAlpha(face, color, null);
|
part.SetFaceColorAlpha(face, color, null);
|
||||||
}
|
}
|
||||||
finally
|
finally { }
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4428,10 +4418,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
parentPrim.DelinkFromGroup(part.LocalId, true);
|
parentPrim.DelinkFromGroup(part.LocalId, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally { }
|
||||||
{
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
parentPrim.HasGroupChanged = true;
|
parentPrim.HasGroupChanged = true;
|
||||||
parentPrim.ScheduleGroupForFullUpdate();
|
parentPrim.ScheduleGroupForFullUpdate();
|
||||||
|
@ -4450,10 +4438,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
newRoot.ParentGroup.LinkToGroup(part.ParentGroup);
|
newRoot.ParentGroup.LinkToGroup(part.ParentGroup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally { }
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
newRoot.ParentGroup.HasGroupChanged = true;
|
newRoot.ParentGroup.HasGroupChanged = true;
|
||||||
newRoot.ParentGroup.ScheduleGroupForFullUpdate();
|
newRoot.ParentGroup.ScheduleGroupForFullUpdate();
|
||||||
|
@ -4847,24 +4832,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
|
|
||||||
switch (data)
|
switch (data)
|
||||||
{
|
{
|
||||||
case 1: // DATA_ONLINE (0|1)
|
case ScriptBaseClass.DATA_ONLINE: // DATA_ONLINE (0|1)
|
||||||
if (pinfo != null && pinfo.RegionID != UUID.Zero)
|
if (pinfo != null && pinfo.RegionID != UUID.Zero)
|
||||||
reply = "1";
|
reply = "1";
|
||||||
else
|
else
|
||||||
reply = "0";
|
reply = "0";
|
||||||
break;
|
break;
|
||||||
case 2: // DATA_NAME (First Last)
|
case ScriptBaseClass.DATA_NAME: // DATA_NAME (First Last)
|
||||||
reply = account.FirstName + " " + account.LastName;
|
reply = account.FirstName + " " + account.LastName;
|
||||||
break;
|
break;
|
||||||
case 3: // DATA_BORN (YYYY-MM-DD)
|
case ScriptBaseClass.DATA_BORN: // DATA_BORN (YYYY-MM-DD)
|
||||||
DateTime born = new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
DateTime born = new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
||||||
born = born.AddSeconds(account.Created);
|
born = born.AddSeconds(account.Created);
|
||||||
reply = born.ToString("yyyy-MM-dd");
|
reply = born.ToString("yyyy-MM-dd");
|
||||||
break;
|
break;
|
||||||
case 4: // DATA_RATING (0,0,0,0,0,0)
|
case ScriptBaseClass.DATA_RATING: // DATA_RATING (0,0,0,0,0,0)
|
||||||
reply = "0,0,0,0,0,0";
|
reply = "0,0,0,0,0,0";
|
||||||
break;
|
break;
|
||||||
case 8: // DATA_PAYINFO (0|1|2|3)
|
case 7: // DATA_USERLEVEL (integer). This is not available in LL and so has no constant.
|
||||||
|
reply = account.UserLevel.ToString();
|
||||||
|
break;
|
||||||
|
case ScriptBaseClass.DATA_PAYINFO: // DATA_PAYINFO (0|1|2|3)
|
||||||
reply = "0";
|
reply = "0";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -5025,22 +5013,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
|
|
||||||
ScenePresence presence = World.GetScenePresence(agentId);
|
ScenePresence presence = World.GetScenePresence(agentId);
|
||||||
|
|
||||||
|
if (presence == null || presence.PresenceType == PresenceType.Npc)
|
||||||
|
return;
|
||||||
|
|
||||||
// Can't TP sitting avatars
|
// Can't TP sitting avatars
|
||||||
if (presence.ParentID != 0) // Sitting
|
if (presence.ParentID != 0) // Sitting
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (presence != null && presence.PresenceType != PresenceType.Npc)
|
if (m_item.PermsGranter == agentId)
|
||||||
{
|
{
|
||||||
if (m_item.PermsGranter == agentId)
|
// If attached using llAttachToAvatarTemp, cowardly refuse
|
||||||
{
|
if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.ParentGroup.FromItemID == UUID.Zero)
|
||||||
// If attached using llAttachToAvatarTemp, cowardly refuse
|
return;
|
||||||
if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.ParentGroup.FromItemID == UUID.Zero)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TELEPORT) != 0)
|
if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TELEPORT) != 0)
|
||||||
{
|
{
|
||||||
World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation);
|
World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8583,6 +8571,142 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void llSetKeyframedMotion(LSL_List frames, LSL_List options)
|
||||||
|
{
|
||||||
|
SceneObjectGroup group = m_host.ParentGroup;
|
||||||
|
|
||||||
|
if (group.RootPart.PhysActor != null && group.RootPart.PhysActor.IsPhysical)
|
||||||
|
return;
|
||||||
|
if (group.IsAttachment)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (frames.Data.Length > 0) // We are getting a new motion
|
||||||
|
{
|
||||||
|
if (group.RootPart.KeyframeMotion != null)
|
||||||
|
group.RootPart.KeyframeMotion.Delete();
|
||||||
|
group.RootPart.KeyframeMotion = null;
|
||||||
|
|
||||||
|
int idx = 0;
|
||||||
|
|
||||||
|
KeyframeMotion.PlayMode mode = KeyframeMotion.PlayMode.Forward;
|
||||||
|
KeyframeMotion.DataFormat data = KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation;
|
||||||
|
|
||||||
|
while (idx < options.Data.Length)
|
||||||
|
{
|
||||||
|
int option = (int)options.GetLSLIntegerItem(idx++);
|
||||||
|
int remain = options.Data.Length - idx;
|
||||||
|
|
||||||
|
switch (option)
|
||||||
|
{
|
||||||
|
case ScriptBaseClass.KFM_MODE:
|
||||||
|
if (remain < 1)
|
||||||
|
break;
|
||||||
|
int modeval = (int)options.GetLSLIntegerItem(idx++);
|
||||||
|
switch(modeval)
|
||||||
|
{
|
||||||
|
case ScriptBaseClass.KFM_FORWARD:
|
||||||
|
mode = KeyframeMotion.PlayMode.Forward;
|
||||||
|
break;
|
||||||
|
case ScriptBaseClass.KFM_REVERSE:
|
||||||
|
mode = KeyframeMotion.PlayMode.Reverse;
|
||||||
|
break;
|
||||||
|
case ScriptBaseClass.KFM_LOOP:
|
||||||
|
mode = KeyframeMotion.PlayMode.Loop;
|
||||||
|
break;
|
||||||
|
case ScriptBaseClass.KFM_PING_PONG:
|
||||||
|
mode = KeyframeMotion.PlayMode.PingPong;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ScriptBaseClass.KFM_DATA:
|
||||||
|
if (remain < 1)
|
||||||
|
break;
|
||||||
|
int dataval = (int)options.GetLSLIntegerItem(idx++);
|
||||||
|
data = (KeyframeMotion.DataFormat)dataval;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
group.RootPart.KeyframeMotion = new KeyframeMotion(group, mode, data);
|
||||||
|
|
||||||
|
idx = 0;
|
||||||
|
|
||||||
|
int elemLength = 2;
|
||||||
|
if (data == (KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation))
|
||||||
|
elemLength = 3;
|
||||||
|
|
||||||
|
List<KeyframeMotion.Keyframe> keyframes = new List<KeyframeMotion.Keyframe>();
|
||||||
|
while (idx < frames.Data.Length)
|
||||||
|
{
|
||||||
|
int remain = frames.Data.Length - idx;
|
||||||
|
|
||||||
|
if (remain < elemLength)
|
||||||
|
break;
|
||||||
|
|
||||||
|
KeyframeMotion.Keyframe frame = new KeyframeMotion.Keyframe();
|
||||||
|
frame.Position = null;
|
||||||
|
frame.Rotation = null;
|
||||||
|
|
||||||
|
if ((data & KeyframeMotion.DataFormat.Translation) != 0)
|
||||||
|
{
|
||||||
|
LSL_Types.Vector3 tempv = frames.GetVector3Item(idx++);
|
||||||
|
frame.Position = new Vector3((float)tempv.x, (float)tempv.y, (float)tempv.z);
|
||||||
|
}
|
||||||
|
if ((data & KeyframeMotion.DataFormat.Rotation) != 0)
|
||||||
|
{
|
||||||
|
LSL_Types.Quaternion tempq = frames.GetQuaternionItem(idx++);
|
||||||
|
Quaternion q = new Quaternion((float)tempq.x, (float)tempq.y, (float)tempq.z, (float)tempq.s);
|
||||||
|
q.Normalize();
|
||||||
|
frame.Rotation = q;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempf = (float)frames.GetLSLFloatItem(idx++);
|
||||||
|
frame.TimeMS = (int)(tempf * 1000.0f);
|
||||||
|
|
||||||
|
keyframes.Add(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
group.RootPart.KeyframeMotion.SetKeyframes(keyframes.ToArray());
|
||||||
|
group.RootPart.KeyframeMotion.Start();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (group.RootPart.KeyframeMotion == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (options.Data.Length == 0)
|
||||||
|
{
|
||||||
|
group.RootPart.KeyframeMotion.Stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int idx = 0;
|
||||||
|
|
||||||
|
while (idx < options.Data.Length)
|
||||||
|
{
|
||||||
|
int option = (int)options.GetLSLIntegerItem(idx++);
|
||||||
|
|
||||||
|
switch (option)
|
||||||
|
{
|
||||||
|
case ScriptBaseClass.KFM_COMMAND:
|
||||||
|
int cmd = (int)options.GetLSLIntegerItem(idx++);
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
case ScriptBaseClass.KFM_CMD_PLAY:
|
||||||
|
group.RootPart.KeyframeMotion.Start();
|
||||||
|
break;
|
||||||
|
case ScriptBaseClass.KFM_CMD_STOP:
|
||||||
|
group.RootPart.KeyframeMotion.Stop();
|
||||||
|
break;
|
||||||
|
case ScriptBaseClass.KFM_CMD_PAUSE:
|
||||||
|
group.RootPart.KeyframeMotion.Pause();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public LSL_List llGetPhysicsMaterial()
|
public LSL_List llGetPhysicsMaterial()
|
||||||
{
|
{
|
||||||
|
@ -8682,7 +8806,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
if (remain < 1)
|
if (remain < 1)
|
||||||
return new LSL_List();
|
return new LSL_List();
|
||||||
|
|
||||||
v=rules.GetVector3Item(idx++);
|
try
|
||||||
|
{
|
||||||
|
v = rules.GetVector3Item(idx++);
|
||||||
|
}
|
||||||
|
catch(InvalidCastException)
|
||||||
|
{
|
||||||
|
if(code == ScriptBaseClass.PRIM_POSITION)
|
||||||
|
Error(originFunc, string.Format("Error running rule #{0} -> PRIM_POSITION: arg #{1} - parameter 1 must be vector", rulesParsed, idx - idxStart - 1));
|
||||||
|
else
|
||||||
|
Error(originFunc, string.Format("Error running rule #{0} -> PRIM_POS_LOCAL: arg #{1} - parameter 1 must be vector", rulesParsed, idx - idxStart - 1));
|
||||||
|
return new LSL_List();
|
||||||
|
}
|
||||||
if (part.IsRoot && !part.ParentGroup.IsAttachment)
|
if (part.IsRoot && !part.ParentGroup.IsAttachment)
|
||||||
currentPosition = GetSetPosTarget(part, v, currentPosition, true);
|
currentPosition = GetSetPosTarget(part, v, currentPosition, true);
|
||||||
else
|
else
|
||||||
|
@ -10444,6 +10579,43 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Helper to calculate bounding box of an avatar.
|
||||||
|
/// </summary>
|
||||||
|
private void BoundingBoxOfScenePresence(ScenePresence sp, out Vector3 lower, out Vector3 upper)
|
||||||
|
{
|
||||||
|
// Adjust from OS model
|
||||||
|
// avatar height = visual height - 0.2, bounding box height = visual height
|
||||||
|
// to SL model
|
||||||
|
// avatar height = visual height, bounding box height = visual height + 0.2
|
||||||
|
float height = sp.Appearance.AvatarHeight + m_avatarHeightCorrection;
|
||||||
|
|
||||||
|
// According to avatar bounding box in SL 2015-04-18:
|
||||||
|
// standing = <-0.275,-0.35,-0.1-0.5*h> : <0.275,0.35,0.1+0.5*h>
|
||||||
|
// groundsitting = <-0.3875,-0.5,-0.05-0.375*h> : <0.3875,0.5,0.5>
|
||||||
|
// sitting = <-0.5875,-0.35,-0.35-0.375*h> : <0.1875,0.35,-0.25+0.25*h>
|
||||||
|
|
||||||
|
// When avatar is sitting
|
||||||
|
if (sp.ParentPart != null)
|
||||||
|
{
|
||||||
|
lower = new Vector3(m_lABB1SitX0, m_lABB1SitY0, m_lABB1SitZ0 + m_lABB1SitZ1 * height);
|
||||||
|
upper = new Vector3(m_lABB2SitX0, m_lABB2SitY0, m_lABB2SitZ0 + m_lABB2SitZ1 * height);
|
||||||
|
}
|
||||||
|
// When avatar is groundsitting
|
||||||
|
else if (sp.Animator.Animations.ImplicitDefaultAnimation.AnimID == DefaultAvatarAnimations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
|
||||||
|
{
|
||||||
|
lower = new Vector3(m_lABB1GrsX0, m_lABB1GrsY0, m_lABB1GrsZ0 + m_lABB1GrsZ1 * height);
|
||||||
|
upper = new Vector3(m_lABB2GrsX0, m_lABB2GrsY0, m_lABB2GrsZ0 + m_lABB2GrsZ1 * height);
|
||||||
|
}
|
||||||
|
// When avatar is standing or flying
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lower = new Vector3(m_lABB1StdX0, m_lABB1StdY0, m_lABB1StdZ0 + m_lABB1StdZ1 * height);
|
||||||
|
upper = new Vector3(m_lABB2StdX0, m_lABB2StdY0, m_lABB2StdZ0 + m_lABB2StdZ1 * height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public LSL_Vector llGetGeometricCenter()
|
public LSL_Vector llGetGeometricCenter()
|
||||||
{
|
{
|
||||||
return new LSL_Vector(m_host.GetGeometricCenter());
|
return new LSL_Vector(m_host.GetGeometricCenter());
|
||||||
|
@ -10560,6 +10732,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
res.Add(GetPartRot(part));
|
res.Add(GetPartRot(part));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE:
|
||||||
|
res.Add(new LSL_Integer((int)part.PhysicsShapeType));
|
||||||
|
break;
|
||||||
|
|
||||||
case (int)ScriptBaseClass.PRIM_TYPE:
|
case (int)ScriptBaseClass.PRIM_TYPE:
|
||||||
// implementing box
|
// implementing box
|
||||||
PrimitiveBaseShape Shape = part.Shape;
|
PrimitiveBaseShape Shape = part.Shape;
|
||||||
|
@ -12116,17 +12292,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
int width = 0;
|
int width = 0;
|
||||||
int height = 0;
|
int height = 0;
|
||||||
|
|
||||||
uint commandToSend = 0;
|
ParcelMediaCommandEnum? commandToSend = null;
|
||||||
float time = 0.0f; // default is from start
|
float time = 0.0f; // default is from start
|
||||||
|
|
||||||
ScenePresence presence = null;
|
ScenePresence presence = null;
|
||||||
|
|
||||||
for (int i = 0; i < commandList.Data.Length; i++)
|
for (int i = 0; i < commandList.Data.Length; i++)
|
||||||
{
|
{
|
||||||
uint command = (uint)(commandList.GetLSLIntegerItem(i));
|
ParcelMediaCommandEnum command = (ParcelMediaCommandEnum)commandList.Data[i];
|
||||||
switch (command)
|
switch (command)
|
||||||
{
|
{
|
||||||
case (uint)ParcelMediaCommandEnum.Agent:
|
case ParcelMediaCommandEnum.Agent:
|
||||||
// we send only to one agent
|
// we send only to one agent
|
||||||
if ((i + 1) < commandList.Length)
|
if ((i + 1) < commandList.Length)
|
||||||
{
|
{
|
||||||
|
@ -12143,25 +12319,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (uint)ParcelMediaCommandEnum.Loop:
|
case ParcelMediaCommandEnum.Loop:
|
||||||
loop = 1;
|
loop = 1;
|
||||||
commandToSend = command;
|
commandToSend = command;
|
||||||
update = true; //need to send the media update packet to set looping
|
update = true; //need to send the media update packet to set looping
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (uint)ParcelMediaCommandEnum.Play:
|
case ParcelMediaCommandEnum.Play:
|
||||||
loop = 0;
|
loop = 0;
|
||||||
commandToSend = command;
|
commandToSend = command;
|
||||||
update = true; //need to send the media update packet to make sure it doesn't loop
|
update = true; //need to send the media update packet to make sure it doesn't loop
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (uint)ParcelMediaCommandEnum.Pause:
|
case ParcelMediaCommandEnum.Pause:
|
||||||
case (uint)ParcelMediaCommandEnum.Stop:
|
case ParcelMediaCommandEnum.Stop:
|
||||||
case (uint)ParcelMediaCommandEnum.Unload:
|
case ParcelMediaCommandEnum.Unload:
|
||||||
commandToSend = command;
|
commandToSend = command;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (uint)ParcelMediaCommandEnum.Url:
|
case ParcelMediaCommandEnum.Url:
|
||||||
if ((i + 1) < commandList.Length)
|
if ((i + 1) < commandList.Length)
|
||||||
{
|
{
|
||||||
if (commandList.Data[i + 1] is LSL_String)
|
if (commandList.Data[i + 1] is LSL_String)
|
||||||
|
@ -12174,7 +12350,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (uint)ParcelMediaCommandEnum.Texture:
|
case ParcelMediaCommandEnum.Texture:
|
||||||
if ((i + 1) < commandList.Length)
|
if ((i + 1) < commandList.Length)
|
||||||
{
|
{
|
||||||
if (commandList.Data[i + 1] is LSL_String)
|
if (commandList.Data[i + 1] is LSL_String)
|
||||||
|
@ -12187,7 +12363,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (uint)ParcelMediaCommandEnum.Time:
|
case ParcelMediaCommandEnum.Time:
|
||||||
if ((i + 1) < commandList.Length)
|
if ((i + 1) < commandList.Length)
|
||||||
{
|
{
|
||||||
if (commandList.Data[i + 1] is LSL_Float)
|
if (commandList.Data[i + 1] is LSL_Float)
|
||||||
|
@ -12199,7 +12375,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (uint)ParcelMediaCommandEnum.AutoAlign:
|
case ParcelMediaCommandEnum.AutoAlign:
|
||||||
if ((i + 1) < commandList.Length)
|
if ((i + 1) < commandList.Length)
|
||||||
{
|
{
|
||||||
if (commandList.Data[i + 1] is LSL_Integer)
|
if (commandList.Data[i + 1] is LSL_Integer)
|
||||||
|
@ -12213,7 +12389,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (uint)ParcelMediaCommandEnum.Type:
|
case ParcelMediaCommandEnum.Type:
|
||||||
if ((i + 1) < commandList.Length)
|
if ((i + 1) < commandList.Length)
|
||||||
{
|
{
|
||||||
if (commandList.Data[i + 1] is LSL_String)
|
if (commandList.Data[i + 1] is LSL_String)
|
||||||
|
@ -12226,7 +12402,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (uint)ParcelMediaCommandEnum.Desc:
|
case ParcelMediaCommandEnum.Desc:
|
||||||
if ((i + 1) < commandList.Length)
|
if ((i + 1) < commandList.Length)
|
||||||
{
|
{
|
||||||
if (commandList.Data[i + 1] is LSL_String)
|
if (commandList.Data[i + 1] is LSL_String)
|
||||||
|
@ -12239,7 +12415,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (uint)ParcelMediaCommandEnum.Size:
|
case ParcelMediaCommandEnum.Size:
|
||||||
if ((i + 2) < commandList.Length)
|
if ((i + 2) < commandList.Length)
|
||||||
{
|
{
|
||||||
if (commandList.Data[i + 1] is LSL_Integer)
|
if (commandList.Data[i + 1] is LSL_Integer)
|
||||||
|
@ -12309,7 +12485,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (commandToSend != 0)
|
if (commandToSend != null)
|
||||||
{
|
{
|
||||||
// the commandList contained a start/stop/... command, too
|
// the commandList contained a start/stop/... command, too
|
||||||
if (presence == null)
|
if (presence == null)
|
||||||
|
@ -12320,16 +12496,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
if (sp.currentParcelUUID == landData.GlobalID)
|
if (sp.currentParcelUUID == landData.GlobalID)
|
||||||
{
|
{
|
||||||
sp.ControllingClient.SendParcelMediaCommand(0x4, // TODO what is this?
|
sp.ControllingClient.SendParcelMediaCommand(0x4, // TODO what is this?
|
||||||
(ParcelMediaCommandEnum)commandToSend,
|
(ParcelMediaCommandEnum)commandToSend, time);
|
||||||
time);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (!presence.IsChildAgent)
|
else if (!presence.IsChildAgent)
|
||||||
{
|
{
|
||||||
presence.ControllingClient.SendParcelMediaCommand(0x4, // TODO what is this?
|
presence.ControllingClient.SendParcelMediaCommand(0x4, // TODO what is this?
|
||||||
(ParcelMediaCommandEnum)commandToSend,
|
(ParcelMediaCommandEnum)commandToSend, time);
|
||||||
time);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ScriptSleep(m_sleepMsOnParcelMediaCommandList);
|
ScriptSleep(m_sleepMsOnParcelMediaCommandList);
|
||||||
|
@ -13815,6 +13989,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void print(string str)
|
||||||
|
{
|
||||||
|
// yes, this is a real LSL function. See: http://wiki.secondlife.com/wiki/Print
|
||||||
|
IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "OSSL");
|
||||||
|
if (ossl != null)
|
||||||
|
{
|
||||||
|
ossl.CheckThreatLevel(ThreatLevel.High, "print");
|
||||||
|
m_log.Info("LSL print():" + str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public LSL_Integer llGetLinkNumberOfSides(LSL_Integer link)
|
public LSL_Integer llGetLinkNumberOfSides(LSL_Integer link)
|
||||||
{
|
{
|
||||||
List<SceneObjectPart> parts = GetLinkParts(link);
|
List<SceneObjectPart> parts = GetLinkParts(link);
|
||||||
|
@ -14386,46 +14571,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// this is wrong, except on a few trivial cases
|
|
||||||
// keeping it for now just for raycast v3
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Helper to calculate bounding box of an avatar.
|
|
||||||
/// </summary>
|
|
||||||
private void BoundingBoxOfScenePresence(ScenePresence sp, out Vector3 lower, out Vector3 upper)
|
|
||||||
{
|
|
||||||
// Adjust from OS model
|
|
||||||
// avatar height = visual height - 0.2, bounding box height = visual height
|
|
||||||
// to SL model
|
|
||||||
// avatar height = visual height, bounding box height = visual height + 0.2
|
|
||||||
float height = sp.Appearance.AvatarHeight + m_avatarHeightCorrection;
|
|
||||||
|
|
||||||
// According to avatar bounding box in SL 2015-04-18:
|
|
||||||
// standing = <-0.275,-0.35,-0.1-0.5*h> : <0.275,0.35,0.1+0.5*h>
|
|
||||||
// groundsitting = <-0.3875,-0.5,-0.05-0.375*h> : <0.3875,0.5,0.5>
|
|
||||||
// sitting = <-0.5875,-0.35,-0.35-0.375*h> : <0.1875,0.35,-0.25+0.25*h>
|
|
||||||
|
|
||||||
// When avatar is sitting
|
|
||||||
if (sp.ParentPart != null)
|
|
||||||
{
|
|
||||||
lower = new Vector3(m_lABB1SitX0, m_lABB1SitY0, m_lABB1SitZ0 + m_lABB1SitZ1 * height);
|
|
||||||
upper = new Vector3(m_lABB2SitX0, m_lABB2SitY0, m_lABB2SitZ0 + m_lABB2SitZ1 * height);
|
|
||||||
}
|
|
||||||
// When avatar is groundsitting
|
|
||||||
else if (sp.Animator.Animations.ImplicitDefaultAnimation.AnimID == DefaultAvatarAnimations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
|
|
||||||
{
|
|
||||||
lower = new Vector3(m_lABB1GrsX0, m_lABB1GrsY0, m_lABB1GrsZ0 + m_lABB1GrsZ1 * height);
|
|
||||||
upper = new Vector3(m_lABB2GrsX0, m_lABB2GrsY0, m_lABB2GrsZ0 + m_lABB2GrsZ1 * height);
|
|
||||||
}
|
|
||||||
// When avatar is standing or flying
|
|
||||||
else
|
|
||||||
{
|
|
||||||
lower = new Vector3(m_lABB1StdX0, m_lABB1StdY0, m_lABB1StdZ0 + m_lABB1StdZ1 * height);
|
|
||||||
upper = new Vector3(m_lABB2StdX0, m_lABB2StdY0, m_lABB2StdZ0 + m_lABB2StdZ1 * height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Implementation of llCastRay similar to SL 2015-04-21.
|
/// Implementation of llCastRay similar to SL 2015-04-21.
|
||||||
/// http://wiki.secondlife.com/wiki/LlCastRay
|
/// http://wiki.secondlife.com/wiki/LlCastRay
|
||||||
|
@ -15547,145 +15692,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public void llSetKeyframedMotion(LSL_List frames, LSL_List options)
|
|
||||||
{
|
|
||||||
SceneObjectGroup group = m_host.ParentGroup;
|
|
||||||
|
|
||||||
if (group.RootPart.PhysActor != null && group.RootPart.PhysActor.IsPhysical)
|
|
||||||
return;
|
|
||||||
if (group.IsAttachment)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (frames.Data.Length > 0) // We are getting a new motion
|
|
||||||
{
|
|
||||||
if (group.RootPart.KeyframeMotion != null)
|
|
||||||
group.RootPart.KeyframeMotion.Delete();
|
|
||||||
group.RootPart.KeyframeMotion = null;
|
|
||||||
|
|
||||||
int idx = 0;
|
|
||||||
|
|
||||||
KeyframeMotion.PlayMode mode = KeyframeMotion.PlayMode.Forward;
|
|
||||||
KeyframeMotion.DataFormat data = KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation;
|
|
||||||
|
|
||||||
while (idx < options.Data.Length)
|
|
||||||
{
|
|
||||||
int option = (int)options.GetLSLIntegerItem(idx++);
|
|
||||||
int remain = options.Data.Length - idx;
|
|
||||||
|
|
||||||
switch (option)
|
|
||||||
{
|
|
||||||
case ScriptBaseClass.KFM_MODE:
|
|
||||||
if (remain < 1)
|
|
||||||
break;
|
|
||||||
int modeval = (int)options.GetLSLIntegerItem(idx++);
|
|
||||||
switch(modeval)
|
|
||||||
{
|
|
||||||
case ScriptBaseClass.KFM_FORWARD:
|
|
||||||
mode = KeyframeMotion.PlayMode.Forward;
|
|
||||||
break;
|
|
||||||
case ScriptBaseClass.KFM_REVERSE:
|
|
||||||
mode = KeyframeMotion.PlayMode.Reverse;
|
|
||||||
break;
|
|
||||||
case ScriptBaseClass.KFM_LOOP:
|
|
||||||
mode = KeyframeMotion.PlayMode.Loop;
|
|
||||||
break;
|
|
||||||
case ScriptBaseClass.KFM_PING_PONG:
|
|
||||||
mode = KeyframeMotion.PlayMode.PingPong;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ScriptBaseClass.KFM_DATA:
|
|
||||||
if (remain < 1)
|
|
||||||
break;
|
|
||||||
int dataval = (int)options.GetLSLIntegerItem(idx++);
|
|
||||||
data = (KeyframeMotion.DataFormat)dataval;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
group.RootPart.KeyframeMotion = new KeyframeMotion(group, mode, data);
|
|
||||||
|
|
||||||
idx = 0;
|
|
||||||
|
|
||||||
int elemLength = 2;
|
|
||||||
if (data == (KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation))
|
|
||||||
elemLength = 3;
|
|
||||||
|
|
||||||
List<KeyframeMotion.Keyframe> keyframes = new List<KeyframeMotion.Keyframe>();
|
|
||||||
while (idx < frames.Data.Length)
|
|
||||||
{
|
|
||||||
int remain = frames.Data.Length - idx;
|
|
||||||
|
|
||||||
if (remain < elemLength)
|
|
||||||
break;
|
|
||||||
|
|
||||||
KeyframeMotion.Keyframe frame = new KeyframeMotion.Keyframe();
|
|
||||||
frame.Position = null;
|
|
||||||
frame.Rotation = null;
|
|
||||||
|
|
||||||
if ((data & KeyframeMotion.DataFormat.Translation) != 0)
|
|
||||||
{
|
|
||||||
LSL_Types.Vector3 tempv = frames.GetVector3Item(idx++);
|
|
||||||
frame.Position = new Vector3((float)tempv.x, (float)tempv.y, (float)tempv.z);
|
|
||||||
}
|
|
||||||
if ((data & KeyframeMotion.DataFormat.Rotation) != 0)
|
|
||||||
{
|
|
||||||
LSL_Types.Quaternion tempq = frames.GetQuaternionItem(idx++);
|
|
||||||
Quaternion q = new Quaternion((float)tempq.x, (float)tempq.y, (float)tempq.z, (float)tempq.s);
|
|
||||||
q.Normalize();
|
|
||||||
frame.Rotation = q;
|
|
||||||
}
|
|
||||||
|
|
||||||
float tempf = (float)frames.GetLSLFloatItem(idx++);
|
|
||||||
frame.TimeMS = (int)(tempf * 1000.0f);
|
|
||||||
|
|
||||||
keyframes.Add(frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
group.RootPart.KeyframeMotion.SetKeyframes(keyframes.ToArray());
|
|
||||||
group.RootPart.KeyframeMotion.Start();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (group.RootPart.KeyframeMotion == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (options.Data.Length == 0)
|
|
||||||
{
|
|
||||||
group.RootPart.KeyframeMotion.Stop();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int code = (int)options.GetLSLIntegerItem(0);
|
|
||||||
|
|
||||||
int idx = 0;
|
|
||||||
|
|
||||||
while (idx < options.Data.Length)
|
|
||||||
{
|
|
||||||
int option = (int)options.GetLSLIntegerItem(idx++);
|
|
||||||
int remain = options.Data.Length - idx;
|
|
||||||
|
|
||||||
switch (option)
|
|
||||||
{
|
|
||||||
case ScriptBaseClass.KFM_COMMAND:
|
|
||||||
int cmd = (int)options.GetLSLIntegerItem(idx++);
|
|
||||||
switch (cmd)
|
|
||||||
{
|
|
||||||
case ScriptBaseClass.KFM_CMD_PLAY:
|
|
||||||
group.RootPart.KeyframeMotion.Start();
|
|
||||||
break;
|
|
||||||
case ScriptBaseClass.KFM_CMD_STOP:
|
|
||||||
group.RootPart.KeyframeMotion.Stop();
|
|
||||||
break;
|
|
||||||
case ScriptBaseClass.KFM_CMD_PAUSE:
|
|
||||||
group.RootPart.KeyframeMotion.Pause();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected LSL_List SetPrimParams(ScenePresence av, LSL_List rules, string originFunc, ref uint rulesParsed)
|
protected LSL_List SetPrimParams(ScenePresence av, LSL_List rules, string originFunc, ref uint rulesParsed)
|
||||||
{
|
{
|
||||||
|
@ -16104,8 +16110,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
return new LSL_List();
|
return new LSL_List();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void llSetAnimationOverride(LSL_String animState, LSL_String anim)
|
public void llSetAnimationOverride(LSL_String animState, LSL_String anim)
|
||||||
{
|
{
|
||||||
string state = String.Empty;
|
string state = String.Empty;
|
||||||
|
|
Loading…
Reference in New Issue