Beispiel #1
0
        internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags, ScriptControlled ignored)
        {
            if (ignored == ScriptControlled.CONTROL_ZERO)
                return flags;

            if ((ignored & ScriptControlled.CONTROL_BACK) != 0)
                flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG);
            if ((ignored & ScriptControlled.CONTROL_FWD) != 0)
                flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_AT_POS);
            if ((ignored & ScriptControlled.CONTROL_DOWN) != 0)
                flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG);
            if ((ignored & ScriptControlled.CONTROL_UP) != 0)
                flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS | AgentManager.ControlFlags.AGENT_CONTROL_UP_POS);
            if ((ignored & ScriptControlled.CONTROL_LEFT) != 0)
                flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS);
            if ((ignored & ScriptControlled.CONTROL_RIGHT) != 0)
                flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG);
            if ((ignored & ScriptControlled.CONTROL_ROT_LEFT) != 0)
                flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG);
            if ((ignored & ScriptControlled.CONTROL_ROT_RIGHT) != 0)
                flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS);
            if ((ignored & ScriptControlled.CONTROL_ML_LBUTTON) != 0)
                flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN);
            if ((ignored & ScriptControlled.CONTROL_LBUTTON) != 0)
                flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP | 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;
        }
Beispiel #2
0
        public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID)
        {
            ScriptControllers takecontrols;

            lock (scriptedcontrols)
            {
                if (scriptedcontrols.TryGetValue(Script_item_UUID, out takecontrols))
                {
                    ScriptControlled sctc = takecontrols.eventControls;

                    ControllingClient.SendTakeControls((int)sctc, false, false);
                    ControllingClient.SendTakeControls((int)sctc, true, false);

                    scriptedcontrols.Remove(Script_item_UUID);
                    IgnoredControls = ScriptControlled.CONTROL_ZERO;
                    foreach (ScriptControllers scData in scriptedcontrols.Values)
                    {
                        IgnoredControls |= scData.ignoreControls;
                    }
                }
            }
        }
Beispiel #3
0
        private void SendControlsToScripts(uint flags)
        {
            // Notify the scripts only after calling UpdateMovementAnimations(), so that if a script
            // (e.g., a walking script) checks which animation is active it will be the correct animation.
            lock (scriptedcontrols)
            {
                if (scriptedcontrols.Count <= 0)
                    return;

                ScriptControlled allflags = ScriptControlled.CONTROL_ZERO;
    
                if (MouseDown)
                {
                    allflags = LastCommands & (ScriptControlled.CONTROL_ML_LBUTTON | ScriptControlled.CONTROL_LBUTTON);
                    if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP) != 0 || (flags & unchecked((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP)) != 0)
                    {
                        allflags = ScriptControlled.CONTROL_ZERO;
                        MouseDown = true;
                    }
                }
    
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_ML_LBUTTON;
                    MouseDown = true;
                }
    
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_LBUTTON;
                    MouseDown = true;
                }
    
                // find all activated controls, whether the scripts are interested in them or not
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_FWD;
                }
    
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_BACK;
                }
    
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_UP;
                }
    
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_DOWN;
                }

                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_LEFT;
                }
    
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_RIGHT;
                }
    
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_ROT_RIGHT;
                }
    
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_ROT_LEFT;
                }

                // optimization; we have to check per script, but if nothing is pressed and nothing changed, we can skip that
                if (allflags != ScriptControlled.CONTROL_ZERO || allflags != LastCommands)
                {
                    foreach (KeyValuePair<UUID, ScriptControllers> kvp in scriptedcontrols)
                    {
                        UUID scriptUUID = kvp.Key;
                        ScriptControllers scriptControlData = kvp.Value;
    
                        ScriptControlled localHeld = allflags & scriptControlData.eventControls;     // the flags interesting for us
                        ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle
                        ScriptControlled localChange = localHeld ^ localLast;                        // the changed bits

                        if (localHeld != ScriptControlled.CONTROL_ZERO || localChange != ScriptControlled.CONTROL_ZERO)
                        {
                            // only send if still pressed or just changed
                            m_scene.EventManager.TriggerControlEvent(scriptUUID, UUID, (uint)localHeld, (uint)localChange);
                        }
                    }
                }
    
                LastCommands = allflags;
            }
        }
Beispiel #4
0
 public void HandleForceReleaseControls(IClientAPI remoteClient, UUID agentID)
 {
     IgnoredControls = ScriptControlled.CONTROL_ZERO;
     lock (scriptedcontrols)
     {
         scriptedcontrols.Clear();
     }
     ControllingClient.SendTakeControls(int.MaxValue, false, false);
 }
Beispiel #5
0
 public void ClearControls()
 {
     IgnoredControls = ScriptControlled.CONTROL_ZERO;
     lock (scriptedcontrols)
     {
         scriptedcontrols.Clear();
     }
 }
        internal void SendControlToScripts(uint flags)
        {
            ScriptControlled allflags = ScriptControlled.CONTROL_ZERO;

            // The viewers send a stream of control flags repeatedly while there is movement. If no control is active, 
            // viewers send a CONTROL_NONE flag. This logic introduces a small repeat delay in controls to mimic the
            // behavior in SL and thus retain LSL script compatibility.
            //

            // If an active control flag is sent and it has been a while since the last one,
            // begin the delay interval.
            if (flags != (uint)AgentManager.ControlFlags.NONE)
            {
                if (((uint)Environment.TickCount - m_LastControlsTime) > CONTROLS_REPEAT_DELAY)
                {
                    m_NextControlsTime = 0;
                }
                m_LastControlsTime = (uint)Environment.TickCount;
            }

            // Let the first control event through, but set a delay interval.
            if (m_NextControlsTime == 0)
            {
                m_NextControlsTime = (uint)Environment.TickCount + CONTROLS_REPEAT_DELAY;
            }

            // Drop the events until either the delay ends or a different set of flags arrive.
            else if ((uint)Environment.TickCount < m_NextControlsTime && flags == m_LastControls)
            {
                // m_log.DebugFormat("[SCENE PRESENCE]: Skipped flags={0} now={1} next={2}", (AgentManager.ControlFlags)flags, Environment.TickCount, m_NextControlsTime);
                return;
            }
            m_LastControls = flags;
            // m_log.DebugFormat("[SCENE PRESENCE]: Processed flags={0} now={1} next={2}", (AgentManager.ControlFlags)flags, Environment.TickCount, m_NextControlsTime);

            if (MouseDown)
            {
                allflags = LastCommands & (ScriptControlled.CONTROL_ML_LBUTTON | ScriptControlled.CONTROL_LBUTTON);
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP) != 0 || (flags & unchecked((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP)) != 0)
                {
                    allflags = ScriptControlled.CONTROL_ZERO;
                    MouseDown = true;
                }
            }

            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN) != 0)
            {
                allflags |= ScriptControlled.CONTROL_ML_LBUTTON;
                MouseDown = true;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0)
            {
                allflags |= ScriptControlled.CONTROL_LBUTTON;
                MouseDown = true;
            }

            // find all activated controls, whether the scripts are interested in them or not
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) != 0)
            {
                allflags |= ScriptControlled.CONTROL_FWD;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) != 0)
            {
                allflags |= ScriptControlled.CONTROL_BACK;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) != 0)
            {
                allflags |= ScriptControlled.CONTROL_UP;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)
            {
                allflags |= ScriptControlled.CONTROL_DOWN;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) != 0)
            {
                allflags |= ScriptControlled.CONTROL_LEFT;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) != 0)
            {
                allflags |= ScriptControlled.CONTROL_RIGHT;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0)
            {
                allflags |= ScriptControlled.CONTROL_ROT_RIGHT;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0)
            {
                allflags |= ScriptControlled.CONTROL_ROT_LEFT;
            }
            // optimization; we have to check per script, but if nothing is pressed and nothing changed, we can skip that
            if (allflags != ScriptControlled.CONTROL_ZERO || allflags != LastCommands)
            {
                UUID[] scripts;
                lock (m_scriptedcontrols)
                {
                    // Must not call TriggerControlEvent with thes controls locked (deadlocks with m_items iterations).
                    scripts = new UUID[m_scriptedcontrols.Count];
                    m_scriptedcontrols.Keys.CopyTo(scripts, 0);
                }
                foreach (UUID scriptUUID in scripts)
                {
                    ScriptControllers scriptControlData = m_scriptedcontrols[scriptUUID];
                    ScriptControlled localHeld = allflags & scriptControlData.eventControls;     // the flags interesting for us
                    ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle
                    ScriptControlled localChange = localHeld ^ localLast;                        // the changed bits
                    if (localHeld != ScriptControlled.CONTROL_ZERO || localChange != ScriptControlled.CONTROL_ZERO)
                    {
                        // only send if still pressed or just changed
                        m_scene.EventManager.TriggerControlEvent(scriptControlData.objID, scriptUUID, UUID, (uint)localHeld, (uint)localChange);
                    }
                }
            }

            LastCommands = allflags;
        }
Beispiel #7
0
        public void RegisterControlEventsToScript(int controls, int accept, int pass_on, uint Obj_localID, UUID Script_item_UUID)
        {
            SceneObjectPart p = m_scene.GetSceneObjectPart(Obj_localID);
            if (p == null)
                return;

            ControllingClient.SendTakeControls(controls, false, false);
            ControllingClient.SendTakeControls(controls, true, false);

            ScriptControllers obj = new ScriptControllers();
            obj.ignoreControls = ScriptControlled.CONTROL_ZERO;
            obj.eventControls = ScriptControlled.CONTROL_ZERO;

            obj.objectID = p.ParentGroup.UUID;
            obj.itemID = Script_item_UUID;
            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_UUID))
                        scriptedcontrols.Remove(Script_item_UUID);
                }
                else
                {
                    scriptedcontrols[Script_item_UUID] = obj;
                }
            }

            ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true);
        }
        public void RegisterControlEventsToScript(int oldControls, int oldPassOn, int controls, int accept, int pass_on, uint Obj_localID, UUID Script_item_UUID, bool silent)
        {
            ScriptControllers obj = new ScriptControllers();
            obj.ignoreControls = ScriptControlled.CONTROL_ZERO;
            obj.eventControls = ScriptControlled.CONTROL_ZERO;

            obj.itemID = Script_item_UUID;
            obj.objID = Obj_localID;

            SceneObjectPart part = m_scene.GetSceneObjectPart(Obj_localID);
            if (part == null)
            {
                m_log.ErrorFormat("[SCENE PRESENCE]: Could not register control events to script in object {0}. Object was not found in the scene", Obj_localID);
                return;
            }

            lock (m_scriptedcontrols)
            {
                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;
                }

                if (pass_on == 1 && accept == 0)
                {
                    IgnoredControls &= ~(ScriptControlled)controls;
                    RemoveScriptFromControlNotifications(Script_item_UUID, part);
                }
                else
                {
                    AddScriptToControlNotifications(Script_item_UUID, part, ref obj);
                }
            }

            if (!silent)
            {
                // SL includes these extra bits if you request FWD/BACK/LEFT/RIGHT
                oldControls = AdjustControlsForNudges(oldControls);
                controls = AdjustControlsForNudges(controls);
                
                if (accept == 0)
                {
                    if (pass_on == 0)   // a=false, p=false
                        ControllingClient.SendTakeControls2(oldControls, false, oldPassOn != 0, ~controls, true, false);
                    else   // false, true
                        ControllingClient.SendTakeControls2(oldControls, false, oldPassOn != 0, ~controls, true, true);
                }
                else
                {
                    if (pass_on == 0)   // a=true, p=false
                        ControllingClient.SendTakeControls2(oldControls, false, oldPassOn != 0, controls, true, false);
                    else   // true, true

                        ControllingClient.SendTakeControls2(oldControls, false, oldPassOn != 0, controls, true, true);
                }
            }
        }
        public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID, bool silent)
        {
            SceneObjectPart part = m_scene.GetSceneObjectPart(Obj_localID);

            lock (m_scriptedcontrols)
            {
                int controls;
                bool accept;
                bool pass_on;
                if (m_scriptedcontrols.ContainsKey(Script_item_UUID))
                {
                    ScriptControllers takecontrolls = m_scriptedcontrols[Script_item_UUID];

                    if (m_isChildAgent)
                        m_log.InfoFormat("[SCENE PRESENCE]: UnRegisterControlEventsToScript2: Request({0}) from CHILD agent {1}", silent.ToString(), this.UUID.ToString());

                    if (takecontrolls.ignoreControls == ScriptControlled.CONTROL_ZERO)
                    {
                        // the only one with zero ignoreControls is a=true,p=true case
                        controls = (int)takecontrolls.eventControls;
                        accept = true;
                        pass_on = true;
                    } else
                    if (takecontrolls.eventControls == ScriptControlled.CONTROL_ZERO)
                    {
                        // the only one with zero eventControls is a=false,p=false case
                        controls = (int)takecontrolls.ignoreControls;
                        accept = false;
                        pass_on = false;
                    } else {
                        // that only leaves a=true,p=false case
                        controls = (int)takecontrolls.eventControls;    // also in ignoreControls
                        accept = true;
                        pass_on = false;
                    }

                    RemoveScriptFromControlNotifications(Script_item_UUID, part);

                    IgnoredControls = ScriptControlled.CONTROL_ZERO;
                    foreach (ScriptControllers scData in m_scriptedcontrols.Values)
                    {
                        IgnoredControls |= scData.ignoreControls;
                    }
                }
                else
                {
                    // the only one with no m_scriptedcontrols is a=false,p=true
                    controls = 0;
                    accept = false;
                    pass_on = true;
                }

                // SL includes these extra bits if you request FWD/BACK/LEFT/RIGHT
                controls = AdjustControlsForNudges(controls);

                // accept==false sends inverted controls bits
                if (accept == false)
                    controls = ~controls;

                if (!(silent || m_isChildAgent))  // don't notify the viewer if silent or child agent
                {
                    // accept isn't used in this case, always false on release
                    ControllingClient.SendTakeControls(controls, false, pass_on);
                }
            }
        }
Beispiel #10
0
        internal void SendControlToScripts(uint flags)
        {
            ScriptControlled allflags = ScriptControlled.CONTROL_ZERO;

            if (MouseDown)
            {
                allflags = LastCommands & (ScriptControlled.CONTROL_ML_LBUTTON | ScriptControlled.CONTROL_LBUTTON);
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP) != 0 || (flags & unchecked((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP)) != 0)
                {
                    allflags = ScriptControlled.CONTROL_ZERO;
                    MouseDown = true;
                }
            }

            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN) != 0)
            {
                allflags |= ScriptControlled.CONTROL_ML_LBUTTON;
                MouseDown = true;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0)
            {
                allflags |= ScriptControlled.CONTROL_LBUTTON;
                MouseDown = true;
            }

            // find all activated controls, whether the scripts are interested in them or not
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) != 0)
            {
                allflags |= ScriptControlled.CONTROL_FWD;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) != 0)
            {
                allflags |= ScriptControlled.CONTROL_BACK;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) != 0)
            {
                allflags |= ScriptControlled.CONTROL_UP;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)
            {
                allflags |= ScriptControlled.CONTROL_DOWN;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) != 0)
            {
                allflags |= ScriptControlled.CONTROL_LEFT;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) != 0)
            {
                allflags |= ScriptControlled.CONTROL_RIGHT;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0)
            {
                allflags |= ScriptControlled.CONTROL_ROT_RIGHT;
            }
            if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0)
            {
                allflags |= ScriptControlled.CONTROL_ROT_LEFT;
            }
            // optimization; we have to check per script, but if nothing is pressed and nothing changed, we can skip that
            if (allflags != ScriptControlled.CONTROL_ZERO || allflags != LastCommands)
            {
                lock (scriptedcontrols)
                {
                    foreach (UUID scriptUUID in scriptedcontrols.Keys)
                    {
                        ScriptControllers scriptControlData = scriptedcontrols[scriptUUID];
                        ScriptControlled localHeld = allflags & scriptControlData.eventControls;     // the flags interesting for us
                        ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle
                        ScriptControlled localChange = localHeld ^ localLast;                        // the changed bits
                        if (localHeld != ScriptControlled.CONTROL_ZERO || localChange != ScriptControlled.CONTROL_ZERO)
                        {
                            // only send if still pressed or just changed
                            m_scene.EventManager.TriggerControlEvent(scriptControlData.objID, scriptUUID, UUID, (uint)localHeld, (uint)localChange);
                        }
                    }
                }
            }

            LastCommands = allflags;
        }
        /// <summary>
        /// This turns a root agent into a child agent
        /// when an agent departs this region for a neighbor, this gets called.
        ///
        /// It doesn't get called for a teleport.  Reason being, an agent that
        /// teleports out may not end up anywhere near this region
        /// </summary>
        public void MakeChildAgent(ulong destinationRegionHandle)
        {
            DumpDebug("MakeChildAgent", "n/a");
            m_log.Info("[SCENE]: " + Scene.RegionInfo.RegionName + ": MakeChildAgent...");

            m_animations.Clear(m_scene.AvatarIsInTransitOnPrim(UUID));

            // Clear controls in the child SP. (They'll be set again if the root agent returns, if needed.
            lock (m_scriptedcontrols)
            {
                m_scriptedcontrols.Clear();
                IgnoredControls = ScriptControlled.CONTROL_ZERO;
            }

//            m_log.DebugFormat(
//                 "[SCENE PRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}",
//                 Name, UUID, m_scene.RegionInfo.RegionName);

            // Don't zero out the velocity since this can cause problems when an avatar is making a region crossing,
            // depending on the exact timing.  This shouldn't matter anyway since child agent positions are not updated.
            //Velocity = Vector3.Zero;

            RemoveFromPhysicalScene();
            m_requestedSitTargetID = 0;
            m_requestedSitTargetUUID = UUID.Zero;
            lock (m_posInfo)
            {
                Vector3 restorePos = m_posInfo.Parent == null ? AbsolutePosition : m_posInfo.m_parentPos;
                IsFullyInRegion = false;
                m_isChildAgent = true;
                m_posInfo.Position = restorePos;
                m_posInfo.Parent = null;
                m_posInfo.m_parentPos = Vector3.Zero;
                m_scene.SwapRootAgentCount(true);
                currentParcelUUID = UUID.Zero;  // so that if the agent reenters this region, it recognizes it as a parcel change.
                if (!IsBot)
                    m_scene.CommsManager.UserService.UnmakeLocalUser(m_uuid);
            }
            m_scene.EventManager.TriggerOnMakeChildAgent(this);

            ClearSceneView();
        }
Beispiel #12
0
        public void RegisterControlEventsToScript(int controls, int accept, int pass_on, uint Obj_localID, UUID Script_item_UUID)
        {
            ScriptControllers obj = new ScriptControllers();
            obj.ignoreControls = ScriptControlled.CONTROL_ZERO;
            obj.eventControls = ScriptControlled.CONTROL_ZERO;

            obj.itemID = Script_item_UUID;
            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_UUID))
                        scriptedcontrols.Remove(Script_item_UUID);

                }
                else
                {

                    if (scriptedcontrols.ContainsKey(Script_item_UUID))
                    {
                        scriptedcontrols[Script_item_UUID] = obj;
                    }
                    else
                    {
                        scriptedcontrols.Add(Script_item_UUID, obj);
                    }
                }
            }
            ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true);
        }
            public void RegisterControlEventsToScript(int controls, int accept, int pass_on, ISceneChildEntity part,
                                                      UUID Script_item_UUID)
            {
                ScriptControllers obj = new ScriptControllers
                                            {
                                                ignoreControls = ScriptControlled.CONTROL_ZERO,
                                                eventControls = ScriptControlled.CONTROL_ZERO,
                                                itemID = Script_item_UUID,
                                                part = part
                                            };

                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_UUID))
                            scriptedcontrols.Remove(Script_item_UUID);
                    }
                    else
                    {
                        scriptedcontrols[Script_item_UUID] = obj;
                    }
                }
                m_sp.ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true);
            }
 public void HandleForceReleaseControls(IClientAPI remoteClient, UUID agentID)
 {
     IgnoredControls = ScriptControlled.CONTROL_ZERO;
     scriptedcontrolsRwLock.AcquireWriterLock(-1);
     try
     {
         scriptedcontrols.Clear();
     }
     finally
     {
         scriptedcontrolsRwLock.ReleaseWriterLock();
     }
     ControllingClient.SendTakeControls(int.MaxValue, false, false);
 }
            protected internal void SendControlToScripts(uint flags)
            {
                ScriptControlled allflags = ScriptControlled.CONTROL_ZERO;

                if (MouseDown)
                {
                    allflags = LastCommands & (ScriptControlled.CONTROL_ML_LBUTTON | ScriptControlled.CONTROL_LBUTTON);
                    if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP) != 0 ||
                        (flags & unchecked ((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP)) != 0)
                    {
                        allflags  = ScriptControlled.CONTROL_ZERO;
                        MouseDown = true;
                    }
                }

                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_ML_LBUTTON;
                    MouseDown = true;
                }
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_LBUTTON;
                    MouseDown = true;
                }

                // find all activated controls, whether the scripts are interested in them or not
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 ||
                    (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_FWD;
                }
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0 ||
                    (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_BACK;
                }
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0 ||
                    (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_UP;
                }
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 ||
                    (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_DOWN;
                }
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) != 0 ||
                    (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_LEFT;
                }
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) != 0 ||
                    (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_RIGHT;
                }
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_ROT_RIGHT;
                }
                if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0)
                {
                    allflags |= ScriptControlled.CONTROL_ROT_LEFT;
                }
                // optimization; we have to check per script, but if nothing is pressed and nothing changed, we can skip that
                if (allflags != ScriptControlled.CONTROL_ZERO || allflags != LastCommands)
                {
                    lock (scriptedcontrols)
                    {
                        foreach (KeyValuePair <UUID, ScriptControllers> kvp in scriptedcontrols)
                        {
                            UUID scriptUUID = kvp.Key;
                            ScriptControllers scriptControlData = kvp.Value;

                            ScriptControlled localHeld = allflags & scriptControlData.eventControls;
                            // the flags interesting for us
                            ScriptControlled localLast = LastCommands & scriptControlData.eventControls;
                            // the activated controls in the last cycle
                            ScriptControlled localChange = localHeld ^ localLast; // the changed bits
                            if (localHeld != ScriptControlled.CONTROL_ZERO ||
                                localChange != ScriptControlled.CONTROL_ZERO)
                            {
                                // only send if still pressed or just changed
                                m_sp.Scene.EventManager.TriggerControlEvent(scriptControlData.part, scriptUUID,
                                                                            m_sp.UUID, (uint)localHeld,
                                                                            (uint)localChange);
                            }
                        }
                    }
                }

                LastCommands = allflags;
            }
            protected internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags,
                                                                                      ScriptControlled ignored)
            {
                if (ignored == ScriptControlled.CONTROL_ZERO)
                {
                    return(flags);
                }

                if ((ignored & ScriptControlled.CONTROL_BACK) != 0)
                {
                    flags &=
                        ~(AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG |
                          AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG);
                }
                if ((ignored & ScriptControlled.CONTROL_FWD) != 0)
                {
                    flags &=
                        ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS |
                          AgentManager.ControlFlags.AGENT_CONTROL_AT_POS);
                }
                if ((ignored & ScriptControlled.CONTROL_DOWN) != 0)
                {
                    flags &=
                        ~(AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG |
                          AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG);
                }
                if ((ignored & ScriptControlled.CONTROL_UP) != 0)
                {
                    flags &=
                        ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS |
                          AgentManager.ControlFlags.AGENT_CONTROL_UP_POS);
                }
                if ((ignored & ScriptControlled.CONTROL_LEFT) != 0)
                {
                    flags &=
                        ~(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS |
                          AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS);
                }
                if ((ignored & ScriptControlled.CONTROL_RIGHT) != 0)
                {
                    flags &=
                        ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG |
                          AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG);
                }
                if ((ignored & ScriptControlled.CONTROL_ROT_LEFT) != 0)
                {
                    flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG);
                }
                if ((ignored & ScriptControlled.CONTROL_ROT_RIGHT) != 0)
                {
                    flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS);
                }
                if ((ignored & ScriptControlled.CONTROL_ML_LBUTTON) != 0)
                {
                    flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN);
                }
                if ((ignored & ScriptControlled.CONTROL_LBUTTON) != 0)
                {
                    flags &=
                        ~(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP |
                          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);
            }