* Committing a bunch of work for control snatching. Not done yet. No visible features.

0.6.0-stable
Teravus Ovares 2008-05-06 02:47:14 +00:00
parent 240e8646da
commit add13276a9
5 changed files with 156 additions and 0 deletions

View File

@ -750,6 +750,9 @@ namespace OpenSim.Framework
void SendInventoryItemCreateUpdate(InventoryItemBase Item);
void SendRemoveInventoryItem(LLUUID itemID);
void SendTakeControls(int controls, bool passToAgent, bool TakeControls);
void SendTaskInventory(LLUUID taskID, short serial, byte[] fileName);
/// <summary>

View File

@ -1595,6 +1595,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
OutPacket(remove, ThrottleOutPacketType.Asset);
}
public void SendTakeControls(int controls, bool passToAgent, bool TakeControls)
{
ScriptControlChangePacket scriptcontrol = (ScriptControlChangePacket)PacketPool.Instance.GetPacket(PacketType.ScriptControlChange);
ScriptControlChangePacket.DataBlock[] data = new ScriptControlChangePacket.DataBlock[1];
ScriptControlChangePacket.DataBlock ddata = new ScriptControlChangePacket.DataBlock();
ddata.Controls = (uint)controls;
ddata.PassToAgent = passToAgent;
ddata.TakeControls = TakeControls;
data[0] = ddata;
scriptcontrol.Data = data;
OutPacket(scriptcontrol, ThrottleOutPacketType.Task);
}
public void SendTaskInventory(LLUUID taskID, short serial, byte[] fileName)
{
ReplyTaskInventoryPacket replytask = (ReplyTaskInventoryPacket)PacketPool.Instance.GetPacket(PacketType.ReplyTaskInventory);

View File

@ -40,6 +40,29 @@ using OpenSim.Region.Physics.Manager;
namespace OpenSim.Region.Environment.Scenes
{
enum ScriptControlled : int
{
CONTROL_ZERO = 0,
CONTROL_FWD = 1,
CONTROL_BACK = 2,
CONTROL_LEFT = 4,
CONTROL_RIGHT = 8,
CONTROL_UP = 16,
CONTROL_DOWN = 32,
CONTROL_ROT_LEFT = 256,
CONTROL_ROT_RIGHT = 512,
CONTROL_LBUTTON = 268435456,
CONTROL_ML_LBUTTON = 1073741824
}
struct ScriptControllers
{
public LLUUID itemID;
public uint objID;
public ScriptControlled ignoreControls;
public ScriptControlled eventControls;
}
[Serializable]
public class ScenePresence : EntityBase, ISerializable
{
@ -56,6 +79,9 @@ namespace OpenSim.Region.Environment.Scenes
public LLUUID currentParcelUUID = LLUUID.Zero;
private List<LLUUID> m_animations = new List<LLUUID>();
private List<int> m_animationSeqs = new List<int>();
private Dictionary<LLUUID, ScriptControllers> scriptedcontrols = new Dictionary<LLUUID, ScriptControllers>();
private ScriptControlled IgnoredControls = ScriptControlled.CONTROL_ZERO;
public Vector3 lastKnownAllowedPosition = new Vector3();
public bool sentMessageAboutRestrictedParcelFlyingDown = false;
@ -787,6 +813,17 @@ namespace OpenSim.Region.Environment.Scenes
// m_AgentControlFlags = flags;
// m_headrotation = agentData.AgentData.HeadRotation;
// m_state = agentData.AgentData.State;
lock (scriptedcontrols)
{
if (scriptedcontrols.Count > 0)
{
flags = this.RemoveIgnoredControls(flags, IgnoredControls);
}
}
if (m_allowMovement)
{
@ -2397,5 +2434,93 @@ namespace OpenSim.Region.Environment.Scenes
PhysicsActor.AddForce(impulse,true);
}
}
public void SendMovementEventsToScript(int controls, int accept, int pass_on, uint Obj_localID, LLUUID Script_item_LLUUID)
{
ScriptControllers obj = new ScriptControllers();
obj.ignoreControls = ScriptControlled.CONTROL_ZERO;
obj.eventControls = ScriptControlled.CONTROL_ZERO;
obj.itemID = Script_item_LLUUID;
obj.objID = Obj_localID;
if (pass_on == 0 && accept == 0)
{
IgnoredControls |= (ScriptControlled)controls;
obj.ignoreControls = (ScriptControlled)controls;
}
if (pass_on == 0 && accept == 1)
{
IgnoredControls |= (ScriptControlled)controls;
obj.ignoreControls = (ScriptControlled)controls;
obj.eventControls = (ScriptControlled)controls;
}
if (pass_on == 1 && accept == 1)
{
IgnoredControls = ScriptControlled.CONTROL_ZERO;
obj.eventControls = (ScriptControlled)controls;
obj.ignoreControls = ScriptControlled.CONTROL_ZERO;
}
lock (scriptedcontrols)
{
if (pass_on == 1 && accept == 0)
{
IgnoredControls &= ~(ScriptControlled)controls;
if (scriptedcontrols.ContainsKey(Script_item_LLUUID))
scriptedcontrols.Remove(Script_item_LLUUID);
}
else
{
if (scriptedcontrols.ContainsKey(Script_item_LLUUID))
{
scriptedcontrols[Script_item_LLUUID] = obj;
}
else
{
scriptedcontrols.Add(Script_item_LLUUID, obj);
}
}
}
ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true);
}
internal uint RemoveIgnoredControls(uint flags, ScriptControlled Ignored)
{
if (Ignored == ScriptControlled.CONTROL_ZERO)
return flags;
if ((Ignored & ScriptControlled.CONTROL_BACK) != 0)
flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG);
if ((Ignored & ScriptControlled.CONTROL_FWD) != 0)
flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS);
if ((Ignored & ScriptControlled.CONTROL_DOWN) != 0)
flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG);
if ((Ignored & ScriptControlled.CONTROL_UP) != 0)
flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS);
if ((Ignored & ScriptControlled.CONTROL_LEFT) != 0)
flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS);
if ((Ignored & ScriptControlled.CONTROL_RIGHT) != 0)
flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG);
if ((Ignored & ScriptControlled.CONTROL_ROT_LEFT) != 0)
flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG);
if ((Ignored & ScriptControlled.CONTROL_ROT_RIGHT) != 0)
flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS);
if ((Ignored & ScriptControlled.CONTROL_ML_LBUTTON) != 0)
flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN);
if ((Ignored & ScriptControlled.CONTROL_LBUTTON) != 0)
flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP | (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN);
//DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS,
//DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG,
//DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS,
//DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
//DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
//DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
//DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
return flags;
}
}
}

View File

@ -444,6 +444,10 @@ namespace OpenSim.Region.Examples.SimpleModule
{
}
public void SendTakeControls(int controls, bool passToAgent, bool TakeControls)
{
}
public virtual void SendTaskInventory(LLUUID taskID, short serial, byte[] fileName)
{
}

View File

@ -1936,6 +1936,17 @@ namespace OpenSim.Region.ScriptEngine.Common
public void llTakeControls(int controls, int accept, int pass_on)
{
if (m_host.TaskInventory[InventorySelf()].PermsGranter != LLUUID.Zero)
{
ScenePresence presence = World.m_innerScene.ScenePresences[m_host.TaskInventory[InventorySelf()].PermsGranter];
if ((m_host.TaskInventory[InventorySelf()].PermsMask & BuiltIn_Commands_BaseClass.PERMISSION_TAKE_CONTROLS) != 0)
{
presence.SendMovementEventsToScript(controls, accept, pass_on, m_localID, m_itemID);
}
}
m_host.AddScriptLPS(1);
NotImplemented("llTakeControls");
}