Пример #1
0
        public static async Task <T> sendRequestToFarmer <T>(string address, object request, Farmer farmer, Action <T> callback = null, SerializationType serializationType = SerializationType.PLAIN, int timeout = 500, XmlSerializer xmlSerializer = null)
        {
            long fromFarmer = farmer.UniqueMultiplayerID;

            if (xmlSerializer == null)
            {
                xmlSerializer = new XmlSerializer(typeof(T));
            }

            object objectData = request;

            if (serializationType == SerializationType.XML)
            {
                StringWriter writer = new StringWriter();
                xmlSerializer.Serialize(writer, request);
                objectData = writer.ToString();
            }
            else if (serializationType == SerializationType.JSON)
            {
                objectData = JsonConvert.SerializeObject(request);
            }

            Int16           id            = (Int16)random.Next(Int16.MinValue, Int16.MaxValue);
            string          returnAddress = address + "." + id;
            PyMessenger <T> messenger     = new PyMessenger <T>(returnAddress);

            sendMessage(new MPMessage(address, Game1.player, objectData, id, fromFarmer));

            object result = await Task.Run(() =>
            {
                while (true)
                {
                    List <T> msgs = new List <T>(messenger.receive());
                    if (msgs.Count() > 0)
                    {
                        messages.Remove(returnAddress);
                        return(msgs[0]);
                    }

                    timeout--;

                    if (timeout < 0)
                    {
                        return(default(T));
                    }
                    Thread.Sleep(1);
                }
            });

            callback?.Invoke((T)result);
            return((T)result);
        }
Пример #2
0
        public static Task <T> sendRequestToFarmer <T>(string address, object request, long uniqueMultiplayerId, Action <T> callback = null, SerializationType serializationType = SerializationType.PLAIN, int timeout = 500, XmlSerializer xmlSerializer = null)
        {
            return(Task.Run(() =>
            {
                long toFarmer = uniqueMultiplayerId;

                if (xmlSerializer == null)
                {
                    xmlSerializer = new XmlSerializer(typeof(T));
                }

                object objectData = request;

                if (serializationType == SerializationType.XML)
                {
                    StringWriter writer = new StringWriter();
                    xmlSerializer.Serialize(writer, request);
                    objectData = writer.ToString();
                }
                else if (serializationType == SerializationType.JSON)
                {
                    objectData = JsonConvert.SerializeObject(request);
                }
                int id = Guid.NewGuid().GetHashCode();
                string returnAddress = address + "." + id;
                PyMessenger <T> messenger = new PyMessenger <T>(returnAddress, null);

                int run = 0;
                bool received = false;
                T result = default(T);

                EventHandler <StardewModdingAPI.Events.ModMessageReceivedEventArgs> handler = (s, e) => checkForMessage(messenger, ref result, ref received, ref run);
                Helper.Events.Multiplayer.ModMessageReceived += handler;

                sendMessage(new MPMessage(address, Game1.player, objectData, id, toFarmer));
                if (timeout > 0)
                {
                    while (!received && run < 100 && timeout > 0)
                    {
                        timeout--;
                        Thread.Sleep(10);
                    }
                }

                Helper.Events.Multiplayer.ModMessageReceived -= handler;

                callback?.Invoke((T)result);

                return ((T)result);
            }));
        }
Пример #3
0
        private static void checkForMessage <T>(PyMessenger <T> messenger, ref T result, ref bool received, ref int run)
        {
            foreach (T msg in messenger.receive())
            {
                result   = msg;
                received = true;
                break;
            }

            if (received)
            {
                messages.Remove(messenger.address);
            }

            run++;
        }