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