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;
            }
        }
Example #2
0
        /// <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);
        }