public void OnAfterDeserialize() { argumentList = new object[arguments.Length]; var paramTypeList = new Type[arguments.Length]; for (int i = 0; i < argumentList.Length; i++) { argumentList[i] = arguments[i].UnpackParameter(); paramTypeList[i] = arguments[i].ArgumentType; } methodDeleted = false; try { if (target.IsMethod) { methodInvoker = TargetObject.GetType().DelegateForInvoke(Target.TargetMethod.MethodName, paramTypeList); } else { fieldSetter = TargetObject.GetType().DelegateForSetField(Target.TargetFieldSetter.FieldName); } } catch (MissingMethodException) { methodDeleted = true; } catch (MissingFieldException) { methodDeleted = true; } }
/// <summary> /// "SuperUser DO"; debug-only message used to forcefully set attributes of a connected ship. /// </summary> public void OnSudo(NetPeer peer, Messages.Sudo data) { Console.WriteLine("Sudo: {0}", data.Json.ToString()); LocalSpaceship ship = null; if (data.Json.ContainsKey("token")) { var token = (string)data.Json["token"]; ship = QuadTreeNode.ShipsByToken.GetValueOrDefault(token, null); if (ship == null) { return; } } foreach (var kv in data.Json) { if (kv.Key == "token") { continue; } AttributeSetter setter = SUDO_SETTER_MAP.GetValueOrDefault(kv.Key, null); if (setter == null) { Console.Error.WriteLine("Sudo: Unrecognized attribute `" + kv.Key + "`"); return; } try { setter.Invoke(this, ship, kv.Value); } catch (Exception exc) { Console.Error.WriteLine("Sudo: Failed to set attribute `" + kv.Key + "`: " + exc.ToString()); return; } } // Send the same sudo back to the arbiter as ACK Bus.SendMessage(data, ArbiterPeer, LiteNetLib.DeliveryMethod.ReliableOrdered); }