예제 #1
0
        public override bool Filter(params object[] param)
        {
            if (1 != param.Length)
            {
                return(false);
            }

            PsScript script = param[0] as PsScript;

            if (null == script)
            {
                return(false);
            }

            int scriptId = (int)mScriptIdRef.Value;

            //self
            if (0 == scriptId)
            {
                scriptId = mTrigger.Parent.Id;
            }

            if (script.Id != scriptId)
            {
                return(false);
            }

            return(true);
        }
예제 #2
0
        void ScriptBegin(PsScript script)
        {
            if (null == script)
            {
                return;
            }

            Emit(script);
        }
예제 #3
0
        void ScriptEnd(PsScript script)
        {
            if (null == script)
            {
                return;
            }

            Emit(script);
        }
예제 #4
0
        public static PsScriptMgr Deserialize(Factory factory, byte[] data)
        {
            if (null == data)
            {
                return(null);
            }

            factory.Init();

            PsScriptMgr scriptMgr = new PsScriptMgr(factory);

            MemoryStream sm = new MemoryStream(data, false);

            using (BinaryReader r = new BinaryReader(sm))
            {
                int    varDatalength = r.ReadInt32();
                byte[] varData       = r.ReadBytes(varDatalength);

                scriptMgr.mVarMgr = VariableMgr.Import(varData);

                int count = r.ReadInt32();

                for (int i = 0; i < count; i++)
                {
                    int id = r.ReadInt32();

                    PsScript script = PsScript.Load(scriptMgr, id);
                    if (null == script)
                    {
                        continue;
                    }

                    if (!script.Init())
                    {
                        continue;
                    }

                    scriptMgr.mScriptList.Add(script);

                    script.Restore(r);
                }

                DeserializeList(scriptMgr.mScriptLoadList, r);
                DeserializeList(scriptMgr.mScriptRemoveList, r);
            }

            return(scriptMgr);
        }
예제 #5
0
        protected override bool Exec()
        {
            VarRef scriptIdRef = PatheaScript.Util.GetVarRefOrValue(mInfo, "mission", VarValue.EType.Int, mTrigger);
            int    scriptId    = (int)scriptIdRef.Value;

            PatheaScript.PsScript.EResult result = PatheaScript.Util.GetScriptResult(mInfo);

            if (scriptId >= 0)
            {
                PsScript script = null;

                if (0 == scriptId)
                {
                    script = mTrigger.Parent;
                }
                else
                {
                    script = mTrigger.Parent.Parent.FindScriptById(scriptId);
                }

                if (null != script)
                {
                    script.RequireStop(result);
                    return(true);
                }
            }
            else
            {
                List <PsScript> curScript = new List <PsScript>(mTrigger.Parent.Parent.CurScript);

                if (-2 == scriptId)
                {
                    curScript.Remove(mTrigger.Parent);
                }

                if (curScript.Count > 0)
                {
                    foreach (PsScript q in curScript)
                    {
                        q.RequireStop(result);
                    }
                }
            }

            return(false);
        }
예제 #6
0
        public static PsScript Load(PsScriptMgr mgr, int id)
        {
            string path = mgr.Factory.GetScriptPath(id);

            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(path);
                XmlNode scriptNode = doc.SelectSingleNode("//MISSION");

                if (scriptNode == null)
                {
                    return(null);
                }

                PsScript script = new PsScript(mgr);

                script.Id = id;

                script.Name = Util.GetString(scriptNode, "name");

                TriggerGroup triggerGroup = new TriggerGroup(script);
                triggerGroup.SetInfo(mgr.Factory, scriptNode);
                if (false == triggerGroup.Parse())
                {
                    return(null);
                }
                else
                {
                    script.mTriggerGroup = triggerGroup;
                }

                return(script);
            }
            catch (System.Exception e)
            {
                Debug.LogError(e.ToString());
                return(null);
            }
        }
예제 #7
0
        void LoadScript()
        {
            if (mScriptLoadList.Count <= 0)
            {
                return;
            }

            int[] loadArray = mScriptLoadList.ToArray();

            foreach (int id in loadArray)
            {
                PsScript q = FindScriptById(id);

                if (null != q)
                {
                    Debug.LogError("Duplicated Script:" + q);
                    continue;
                }

                PsScript script = PsScript.Load(this, id);
                if (null == script)
                {
                    continue;
                }

                if (!script.Init())
                {
                    continue;
                }

                mScriptList.Add(script);
                mScriptLoadList.Remove(id);

                Debug.Log("begin script:" + script.Id);
                //脚本开始事件发生后,可能会loadscript。导致向mScriptLoadList添加新元素而发生异常。
                //所以改为遍历数组。
                InternalEvent.Instance.EmitScriptBegin(script);
            }
        }
예제 #8
0
        void RemoveScript()
        {
            if (mScriptRemoveList.Count <= 0)
            {
                return;
            }

            foreach (int scriptId in mScriptRemoveList)
            {
                PsScript q = FindScriptById(scriptId);
                if (null == q)
                {
                    Debug.Log("no script with id:" + scriptId + " found to terminat");
                    continue;
                }

                Debug.Log(q + " terminated");

                q.Reset();
                mScriptList.Remove(q);
            }

            mScriptRemoveList.Clear();
        }
예제 #9
0
 public TriggerGroup(PsScript script)
 {
     mScript = script;
 }
예제 #10
0
 public Trigger(PsScript script)
 {
     mScript = script;
     mStep   = EStep.Max;
     mVarMgr = new VariableMgr();
 }