示例#1
0
        private void ReturnAction(string[] sdata)
        {
            string actionID = sdata[1];
            string state    = sdata[2];

            if (!waitingActions.ContainsKey(actionID))
            {
                return;
            }

            object[] rparams = new object[sdata.Length - 3];
            for (int i = 3; i < sdata.Length; i++)
            {
                if (sdata[i].Contains("%s%"))
                {
                    sdata[i]       = sdata[i].Replace("%s%", " ");
                    rparams[i - 3] = sdata[i];
                }
                else if (sdata[i].StartsWith("NETOBJ"))
                {
                    if (int.TryParse(sdata[i].Substring(6), out int r))
                    {
                        NetworkedObject no = NetObjByID(r);
                        if (no != null)
                        {
                            rparams[i - 3] = no;
                            continue;
                        }
                        rparams[i - 3] = sdata[i];
                    }
                    rparams[i - 3] = sdata[i];
                }
                else
                {
                    rparams[i - 3] = sdata[i];
                }
            }

            ActionState actionState = ParseState(state);

            ActionReturn actionReturn = new ActionReturn(waitingActions[actionID], actionState, rparams);

            waitingActions[actionID].callback.Invoke(actionReturn);
        }
示例#2
0
        public void InvokeAction(Action action)
        {
            string data = "ACT ";

            data += action.ActionID + " ";
            if (ServerB.singleton.functionToString.ContainsKey(action.serverFunction))
            {
                data += ServerB.singleton.functionToString[action.serverFunction];
            }
            else
            {
                Debug.LogWarning("Function not properly registered, action rejected");
                ActionReturn actionReturn = new ActionReturn(action, ActionState.functionMismatchClient);
                action.callback.Invoke(actionReturn);
                return;
            }

            foreach (object o in action.parameters)
            {
                data += " ";
                if (o is NetworkedObject no)
                {
                    data += "NETOBJ" + no.networkID;
                    continue;
                }
                if (o is string s)
                {
                    data += s.Replace(" ", "%s%");
                    continue;
                }
                if (o is int i)
                {
                    data += i.ToString();
                    continue;
                }
                if (o is float f)
                {
                    data += f.ToString();
                    continue;
                }
                if (o is bool b)
                {
                    data += b.ToString();
                    continue;
                }

                Debug.LogWarning("Only string, int, float, bool, and network objects can be passed as action parameters, action rejected");
                ActionReturn actionReturn = new ActionReturn(action, ActionState.badParams);
                action.callback.Invoke(actionReturn);
                return;
            }

            waitingActions.Add(action.ActionID, action);

            if (data.Length * 2 / 1000 > 63)
            {
                Debug.LogWarning("Failed to send action, data larger than 63k bytes.");
                ActionReturn actionReturn = new ActionReturn(action, ActionState.tooBig);
                action.callback.Invoke(actionReturn);
                return;
            }

            SendData(data);
        }