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); }
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); }