using ModdedUtilitiesNetworking.Framework.Clients; using ModdedUtilitiesNetworking.Framework.Messages; using ModdedUtilitiesNetworking.Framework.Servers; using StardewValley; using StardewValley.Network; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; using static ModdedUtilitiesNetworking.Framework.Delegates.DelegateInfo; namespace ModdedUtilitiesNetworking.Framework { public class CustomMultiplayer : StardewValley.Multiplayer { public override bool isClientBroadcastType(byte messageType) { return true; } public override void processIncomingMessage(IncomingMessage msg) { base.processIncomingMessage(msg); if (msg.MessageType == 20) { ModCore.monitor.Log("CUSTOM FUNCTION???"); } } /// /// Sends an outgoing message to appropriate players. /// /// private void sendMessage(OutgoingMessage message) { if (Game1.server != null) { foreach (long peerId in (IEnumerable)Game1.otherFarmers.Keys) { Game1.server.sendMessage(peerId, message); } } if (Game1.client != null) { if (Game1.client is CustomLidgrenClient) { (Game1.client as CustomLidgrenClient).sendMessage(message); return; } if (Game1.client is CustomGalaxyClient) { (Game1.client as CustomGalaxyClient).sendMessage(message); return; } ModCore.monitor.Log("Error sending server message!!!"); } } /// /// Updates the server. /// public override void UpdateEarly() { if (Game1.CurrentEvent == null) this.removeDisconnectedFarmers(); this.updatePendingConnections(); if (Game1.server != null) (Game1.server as CustomGameServer).receiveMessages(); else if (Game1.client != null) Game1.client.receiveMessages(); this.tickFarmerRoots(); this.tickLocationRoots(); } /// /// Creates a net outgoing message that is written specifically to call a void function when sent. USed to specifiy types and specific ways to handle them. /// /// /// /// /// /// public OutgoingMessage sendOutGoingMessageReturnVoid(string functionName, string objectParametersType, object data, Farmer source,Enums.MessageTypes.messageTypes sendingInfo) { byte bite = new byte(); if (sendingInfo == Enums.MessageTypes.messageTypes.SendOneWay) bite = Enums.MessageTypes.SendOneWay; if (sendingInfo == Enums.MessageTypes.messageTypes.SendToAll) bite = Enums.MessageTypes.SendToAll; OutgoingMessage message = new OutgoingMessage(bite, source, makeDataArray(functionName, objectParametersType, data)); return message; } public OutgoingMessage sendOutGoingMessageReturnVoid(string functionName, Type objectParametersType, object data, Farmer source, Enums.MessageTypes.messageTypes sendingInfo) { byte bite=new byte(); if (sendingInfo == Enums.MessageTypes.messageTypes.SendOneWay) bite = Enums.MessageTypes.SendOneWay; if (sendingInfo == Enums.MessageTypes.messageTypes.SendToAll) bite = Enums.MessageTypes.SendToAll; OutgoingMessage message = new OutgoingMessage(bite, source, makeDataArray(functionName, objectParametersType.ToString(), data)); return message; } public OutgoingMessage sendOutGoingMessageReturnVoid(string functionName, string objectParametersType, object data, Farmer source, Enums.MessageTypes.messageTypes sendingInfo, Farmer recipient) { byte bite = new byte(); if (sendingInfo == Enums.MessageTypes.messageTypes.SendOneWay) bite = Enums.MessageTypes.SendOneWay; if (sendingInfo == Enums.MessageTypes.messageTypes.SendToAll) bite = Enums.MessageTypes.SendToAll; if (sendingInfo == Enums.MessageTypes.messageTypes.SendToSpecific) bite = Enums.MessageTypes.SendToSpecific; OutgoingMessage message = new OutgoingMessage(bite, source, makeDataArray(functionName, objectParametersType, data,recipient)); return message; } public OutgoingMessage sendOutGoingMessageReturnVoid(string functionName, Type objectParametersType, object data, Farmer source, Enums.MessageTypes.messageTypes sendingInfo, Farmer recipient) { byte bite = new byte(); if (sendingInfo == Enums.MessageTypes.messageTypes.SendOneWay) bite = Enums.MessageTypes.SendOneWay; if (sendingInfo == Enums.MessageTypes.messageTypes.SendToAll) bite = Enums.MessageTypes.SendToAll; if (sendingInfo == Enums.MessageTypes.messageTypes.SendToSpecific) bite = Enums.MessageTypes.SendToSpecific; OutgoingMessage message = new OutgoingMessage(bite, source, makeDataArray(functionName, objectParametersType.ToString(), data, recipient)); return message; } public object[] makeDataArray(string functionName, string objectParametersType, object data) { DataInfo datainfo = new DataInfo(objectParametersType, data); object[] obj = new object[3] { functionName, typeof(DataInfo).ToString(), datainfo, }; return obj; } public object[] makeDataArray(string functionName, string objectParametersType, object data, Farmer recipient) { DataInfo datainfo = new DataInfo(objectParametersType, data,recipient); object[] obj = new object[3] { functionName, typeof(DataInfo).ToString(), datainfo, }; return obj; } public object[] makeDataArray(string functionName, string objectParametersType, object data, long recipient) { DataInfo datainfo = new DataInfo(objectParametersType, data, recipient.ToString()); object[] obj = new object[3] { functionName, typeof(DataInfo).ToString(), datainfo, }; return obj; } /// /// Creates all of the necessary parameters for the outgoing message to be sent to the server/client on what to do and how to handle the data sent. /// This message written will attempt to access a function that doesn't return anything. Essentially null. /// /// /// /// public void sendMessage(string uniqueID, Type classType, object data, Enums.MessageTypes.messageTypes sendingInfo, Farmer recipient = null) { Farmer f = Game1.player; if ((sendingInfo == Enums.MessageTypes.messageTypes.SendOneWay || sendingInfo == Enums.MessageTypes.messageTypes.SendToAll)) { OutgoingMessage message = ModCore.multiplayer.sendOutGoingMessageReturnVoid(uniqueID, classType, data, f, sendingInfo); ModCore.multiplayer.sendMessage(message); return; } if (sendingInfo == Enums.MessageTypes.messageTypes.SendToSpecific && recipient != null) { OutgoingMessage message = ModCore.multiplayer.sendOutGoingMessageReturnVoid(uniqueID, classType, data, f, sendingInfo, recipient); ModCore.multiplayer.sendMessage(message); return; } if (sendingInfo == Enums.MessageTypes.messageTypes.SendToSpecific && recipient == null) { ModCore.monitor.Log("ERROR: Attempted to send a target specific message to a NULL recipient"); return; } } /// /// A way to send mod info across the net. /// /// /// /// /// /// public void sendMessage(string uniqueID, string classType, object data, Enums.MessageTypes.messageTypes sendingInfo, Farmer recipient=null) { Farmer f = Game1.player; if ((sendingInfo == Enums.MessageTypes.messageTypes.SendOneWay || sendingInfo == Enums.MessageTypes.messageTypes.SendToAll)) { OutgoingMessage message = ModCore.multiplayer.sendOutGoingMessageReturnVoid(uniqueID, classType, data, f, sendingInfo); ModCore.multiplayer.sendMessage(message); return; } if (sendingInfo == Enums.MessageTypes.messageTypes.SendToSpecific && recipient!=null) { OutgoingMessage message = ModCore.multiplayer.sendOutGoingMessageReturnVoid(uniqueID, classType, data, f, sendingInfo,recipient); ModCore.multiplayer.sendMessage(message); return; } if (sendingInfo == Enums.MessageTypes.messageTypes.SendToSpecific && recipient == null) { ModCore.monitor.Log("ERROR: Attempted to send a target specific message to a NULL recipient"); return; } } public static Farmer getServerHost() { return Game1.serverHost.Value; } public static Farmer getPlayerOne() { return getServerHost(); } public static Farmer getPlayerTwo() { return Game1.otherFarmers.ElementAt(0).Value; } public static Farmer getPlayerThree() { return Game1.otherFarmers.ElementAt(1).Value; } public static Farmer getPlayerFour() { return Game1.otherFarmers.ElementAt(2).Value; } } }