Updated ModNet to be compatable with SDV 1.3.10, which adds bug fixes for sprite errors.
This commit is contained in:
parent
0fb7e729c1
commit
651cd8a26b
|
@ -117,11 +117,11 @@ namespace ModdedUtilitiesNetworking
|
|||
ModCore.monitor.Log("Custom multiplayer binding success!");
|
||||
}
|
||||
|
||||
if(Game1.client !=null && multiplayerSet == false)
|
||||
if (Game1.client != null && multiplayerSet ==false )
|
||||
{
|
||||
if(Game1.client is LidgrenClient)
|
||||
{
|
||||
|
||||
|
||||
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;
|
||||
|
||||
// get the field info
|
||||
|
@ -131,7 +131,7 @@ namespace ModdedUtilitiesNetworking
|
|||
var address = (string)finfo.GetValue(Game1.client);
|
||||
|
||||
Game1.client.disconnect(true); //Disconnect old client
|
||||
CustomLidgrenClient client = new CustomLidgrenClient(address);
|
||||
LidgrenClient client = new CustomLidgrenClient(address);
|
||||
Game1.client = client;
|
||||
client.connect(); //Connect new client.
|
||||
multiplayerSet = true;
|
||||
|
|
|
@ -236,7 +236,7 @@ namespace ModdedUtilitiesNetworking.Framework.Clients
|
|||
this.connectionMessage = message.Reader.ReadString();
|
||||
return;
|
||||
}
|
||||
ModCore.multiplayer.baseProcessMessage(message);
|
||||
ModCore.multiplayer.processIncomingMessage(message);
|
||||
|
||||
|
||||
//Packet signiture for functions that return nothing.
|
||||
|
|
|
@ -7,6 +7,7 @@ using StardewValley.Menus;
|
|||
using StardewValley.Network;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization.Formatters.Binary;
|
||||
using System.Text;
|
||||
|
@ -22,8 +23,49 @@ namespace ModdedUtilitiesNetworking.Framework
|
|||
public CustomMultiplayer()
|
||||
{
|
||||
this.hasConnectedOnce = new List<long>();
|
||||
|
||||
|
||||
}
|
||||
|
||||
public override void writeObjectFull<T>(BinaryWriter writer, NetRoot<T> root, long? peer)
|
||||
{
|
||||
try
|
||||
{
|
||||
root.CreateConnectionPacket(writer, peer);
|
||||
}
|
||||
catch(Exception err)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public override void readObjectDelta<T>(BinaryReader reader, NetRoot<T> root)
|
||||
{
|
||||
try
|
||||
{
|
||||
root.Read(reader);
|
||||
}
|
||||
catch(Exception err)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public override void receiveWorldState(BinaryReader msg)
|
||||
{
|
||||
this.readObjectDelta<IWorldState>(msg, Game1.netWorldState);
|
||||
if (Game1.IsServer)
|
||||
return;
|
||||
int num1 = Game1.timeOfDay;
|
||||
Game1.netWorldState.Value.WriteToGame1();
|
||||
int num2 = Game1.timeOfDay;
|
||||
if (num1 == num2 || Game1.currentLocation == null || Game1.newDaySync != null)
|
||||
return;
|
||||
Game1.performTenMinuteClockUpdate();
|
||||
}
|
||||
|
||||
|
||||
|
||||
public override bool isClientBroadcastType(byte messageType)
|
||||
{
|
||||
return true;
|
||||
|
@ -31,7 +73,94 @@ namespace ModdedUtilitiesNetworking.Framework
|
|||
|
||||
public override void processIncomingMessage(IncomingMessage msg)
|
||||
{
|
||||
base.processIncomingMessage(msg);
|
||||
if (msg.MessageType <= 19)
|
||||
{
|
||||
switch (msg.MessageType)
|
||||
{
|
||||
case 0:
|
||||
NetFarmerRoot netFarmerRoot = this.farmerRoot(msg.Reader.ReadInt64());
|
||||
this.readObjectDelta<Farmer>(msg.Reader, (NetRoot<Farmer>)netFarmerRoot);
|
||||
break;
|
||||
case 2:
|
||||
this.receivePlayerIntroduction(msg.Reader);
|
||||
break;
|
||||
case 3:
|
||||
this.readActiveLocation(msg, false);
|
||||
break;
|
||||
case 4:
|
||||
int eventId = msg.Reader.ReadInt32();
|
||||
int tileX = msg.Reader.ReadInt32();
|
||||
int tileY = msg.Reader.ReadInt32();
|
||||
if (Game1.CurrentEvent != null)
|
||||
break;
|
||||
this.readWarp(msg.Reader, tileX, tileY, (Action)(() =>
|
||||
{
|
||||
Farmer farmerActor = (msg.SourceFarmer.NetFields.Root as NetRoot<Farmer>).Clone().Value;
|
||||
farmerActor.currentLocation = Game1.currentLocation;
|
||||
farmerActor.completelyStopAnimatingOrDoingAction();
|
||||
farmerActor.hidden.Value = false;
|
||||
Event eventById = Game1.currentLocation.findEventById(eventId, farmerActor);
|
||||
Game1.currentLocation.startEvent(eventById);
|
||||
farmerActor.Position = Game1.player.Position;
|
||||
}));
|
||||
break;
|
||||
case 6:
|
||||
GameLocation gameLocation = this.readLocation(msg.Reader);
|
||||
if (gameLocation == null)
|
||||
break;
|
||||
this.readObjectDelta<GameLocation>(msg.Reader, gameLocation.Root);
|
||||
break;
|
||||
case 7:
|
||||
GameLocation location = this.readLocation(msg.Reader);
|
||||
if (location == null)
|
||||
break;
|
||||
location.temporarySprites.AddRange((IEnumerable<TemporaryAnimatedSprite>)this.readSprites(msg.Reader, location));
|
||||
break;
|
||||
case 8:
|
||||
NPC character = this.readNPC(msg.Reader);
|
||||
GameLocation targetLocation = this.readLocation(msg.Reader);
|
||||
if (character == null || targetLocation == null)
|
||||
break;
|
||||
Game1.warpCharacter(character, targetLocation, BinaryReaderWriterExtensions.ReadVector2(msg.Reader));
|
||||
break;
|
||||
case 10:
|
||||
this.receiveChatMessage(msg.SourceFarmer, BinaryReaderWriterExtensions.ReadEnum<LocalizedContentManager.LanguageCode>(msg.Reader), msg.Reader.ReadString());
|
||||
break;
|
||||
case 12:
|
||||
try
|
||||
{
|
||||
this.receiveWorldState(msg.Reader);
|
||||
}
|
||||
catch(Exception err)
|
||||
{
|
||||
|
||||
}
|
||||
break;
|
||||
case 13:
|
||||
this.receiveTeamDelta(msg.Reader);
|
||||
break;
|
||||
case 14:
|
||||
this.receiveNewDaySync(msg);
|
||||
break;
|
||||
case 15:
|
||||
string messageKey = msg.Reader.ReadString();
|
||||
string[] args = new string[(int)msg.Reader.ReadByte()];
|
||||
for (int index = 0; index < args.Length; ++index)
|
||||
args[index] = msg.Reader.ReadString();
|
||||
this.receiveChatInfoMessage(msg.SourceFarmer, messageKey, args);
|
||||
break;
|
||||
case 17:
|
||||
this.receiveFarmerGainExperience(msg);
|
||||
break;
|
||||
case 18:
|
||||
this.parseServerToClientsMessage(msg.Reader.ReadString());
|
||||
break;
|
||||
case 19:
|
||||
this.playerDisconnected(msg.SourceFarmer.UniqueMultiplayerID);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (msg.MessageType == 20)
|
||||
{
|
||||
ModCore.monitor.Log("CUSTOM FUNCTION???");
|
||||
|
|
|
@ -47,13 +47,13 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
}
|
||||
}
|
||||
|
||||
public int connectionsCount
|
||||
{
|
||||
get
|
||||
{
|
||||
return Enumerable.Sum<Server>((IEnumerable<Server>)this.servers, (Func<Server, int>)(s => s.connectionsCount));
|
||||
}
|
||||
}
|
||||
public int connectionsCount
|
||||
{
|
||||
get
|
||||
{
|
||||
return Enumerable.Sum<Server>((IEnumerable<Server>) this.servers, (Func<Server, int>) (s => s.connectionsCount));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -68,15 +68,15 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
return (string)null;
|
||||
}
|
||||
|
||||
public string getUserName(long farmerId)
|
||||
{
|
||||
foreach (Server server in this.servers)
|
||||
{
|
||||
if (server.getUserName(farmerId) != null)
|
||||
return server.getUserName(farmerId);
|
||||
}
|
||||
return (string)null;
|
||||
}
|
||||
public string getUserName(long farmerId)
|
||||
{
|
||||
foreach (Server server in this.servers)
|
||||
{
|
||||
if (server.getUserName(farmerId) != null)
|
||||
return server.getUserName(farmerId);
|
||||
}
|
||||
return (string) null;
|
||||
}
|
||||
|
||||
protected void initialize()
|
||||
{
|
||||
|
@ -104,6 +104,7 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
|
||||
foreach (Server server in this.servers)
|
||||
{
|
||||
if (server == null) continue;
|
||||
server.receiveMessages();
|
||||
}
|
||||
if (!this.isGameAvailable())
|
||||
|
@ -116,7 +117,7 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
public void sendMessage(long peerId, OutgoingMessage message)
|
||||
{
|
||||
foreach (Server server in this.servers)
|
||||
if (server is CustomLidgrenServer)
|
||||
if (server is CustomLidgrenServer || server is LidgrenServer)
|
||||
{
|
||||
server.sendMessage(peerId, message);
|
||||
}
|
||||
|
@ -136,7 +137,18 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
|
||||
public bool canOfferInvite()
|
||||
{
|
||||
return Enumerable.Aggregate<bool, bool>(Enumerable.Select<Server, bool>((IEnumerable<Server>)this.servers, (Func<Server, bool>)(s => s.canOfferInvite())), false, (Func<bool, bool, bool>)((a, b) => a | b));
|
||||
if (this.servers == null)
|
||||
{
|
||||
ModCore.monitor.Log("WAIT WHY IS THIS HAPPENING????");
|
||||
}
|
||||
foreach(var v in this.servers)
|
||||
{
|
||||
if (v.canOfferInvite() == true) continue;
|
||||
else return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
//return Enumerable.Aggregate<bool, bool>(Enumerable.Select<Server, bool>((IEnumerable<Server>)this.servers, (Func<Server, bool>)(s => s.canOfferInvite())), false, (Func<bool, bool, bool>)((a, b) => a | b));
|
||||
}
|
||||
|
||||
public void offerInvite()
|
||||
|
@ -177,12 +189,12 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
{
|
||||
Console.WriteLine("Starting server. Protocol version: " + ModCore.multiplayer.protocolVersion);
|
||||
this.initialize();
|
||||
if ((NetFieldBase<Farmer, NetRef<Farmer>>)Game1.serverHost == (NetRef<Farmer>)null)
|
||||
if (Game1.serverHost.Value == null)
|
||||
Game1.serverHost = new NetFarmerRoot();
|
||||
Game1.serverHost.Value = Game1.player;
|
||||
Game1.serverHost.MarkClean();
|
||||
Game1.serverHost.Clock.InterpolationTicks = ModCore.multiplayer.defaultInterpolationTicks;
|
||||
if ((NetFieldBase<IWorldState, NetRef<IWorldState>>)Game1.netWorldState == (NetRef<IWorldState>)null)
|
||||
if (Game1.netWorldState.Value == (NetRef<IWorldState>)null)
|
||||
Game1.netWorldState = new NetRoot<IWorldState>((IWorldState)new NetWorldState());
|
||||
Game1.netWorldState.Clock.InterpolationTicks = 0;
|
||||
Game1.netWorldState.Value.UpdateFromGame1();
|
||||
|
@ -209,6 +221,8 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void playerDisconnected(long disconnectee)
|
||||
{
|
||||
Farmer sourceFarmer = (Farmer)null;
|
||||
|
@ -217,6 +231,7 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
if (sourceFarmer == null)
|
||||
return;
|
||||
|
||||
|
||||
if (this.hasPlayerDisconnectedOnce.Contains(disconnectee))
|
||||
{
|
||||
OutgoingMessage message = new OutgoingMessage((byte)19, sourceFarmer, new object[0]);
|
||||
|
@ -230,6 +245,15 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
{
|
||||
this.hasPlayerDisconnectedOnce.Add(disconnectee);
|
||||
}
|
||||
/*
|
||||
OutgoingMessage message = new OutgoingMessage((byte)19, sourceFarmer, new object[0]);
|
||||
foreach (long peerId in (IEnumerable<long>)Game1.otherFarmers.Keys)
|
||||
{
|
||||
if (peerId != disconnectee)
|
||||
this.sendMessage(peerId, message);
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -455,7 +479,6 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
OutgoingMessage message1 = new OutgoingMessage(messageType, f, data);
|
||||
foreach (long peerId in (IEnumerable<long>)Game1.otherFarmers.Keys)
|
||||
{
|
||||
ModCore.monitor.Log("RESEND MESSAGE TO CLIENT!!!", StardewModdingAPI.LogLevel.Alert);
|
||||
this.sendMessage(peerId, message1);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,38 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
{
|
||||
class CustomLidgrenServer : Server
|
||||
{
|
||||
///Save this for later
|
||||
|
||||
protected override void playerDisconnected(long disconnectee)
|
||||
{
|
||||
this.gameServer.playerDisconnected(disconnectee);
|
||||
|
||||
this.introductionsSent.Remove(this.peers[disconnectee]);
|
||||
|
||||
this.peers.RemoveLeft(disconnectee);
|
||||
}
|
||||
|
||||
protected void sendMessage(NetConnection connection, OutgoingMessage message)
|
||||
{
|
||||
NetOutgoingMessage message1 = this.server.CreateMessage();
|
||||
using (NetBufferWriteStream bufferWriteStream = new NetBufferWriteStream((NetBuffer)message1))
|
||||
{
|
||||
using (BinaryWriter writer = new BinaryWriter((Stream)bufferWriteStream)) {
|
||||
if (message.MessageType < 20)
|
||||
{
|
||||
message.Write(writer);
|
||||
}
|
||||
else
|
||||
{
|
||||
OutgoingMessageBase.WriteFromMessage(message, writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
int num = (int)this.server.SendMessage(message1, connection, NetDeliveryMethod.ReliableOrdered);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private HashSet<NetConnection> introductionsSent = new HashSet<NetConnection>();
|
||||
private Bimap<long, NetConnection> peers = new Bimap<long, NetConnection>();
|
||||
public const int defaultPort = 24642;
|
||||
|
@ -35,7 +67,7 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
}
|
||||
|
||||
public override string getUserName(long farmerId)
|
||||
{
|
||||
{
|
||||
if (!this.peers.ContainsLeft(farmerId))
|
||||
return (string)null;
|
||||
return this.peers[farmerId].RemoteEndPoint.Address.ToString();
|
||||
|
@ -84,8 +116,6 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
NetIncomingMessage netIncomingMessage;
|
||||
while ((netIncomingMessage = this.server.ReadMessage()) != null)
|
||||
{
|
||||
int i = (int)netIncomingMessage.MessageType;
|
||||
//ModCore.monitor.Log("Message Type: " + i.ToString());
|
||||
switch (netIncomingMessage.MessageType)
|
||||
{
|
||||
case NetIncomingMessageType.WarningMessage:
|
||||
|
@ -114,11 +144,10 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
netIncomingMessage.SenderConnection.Deny();
|
||||
break;
|
||||
case NetIncomingMessageType.Data:
|
||||
//ModCore.monitor.Log("GOT DATA~~");
|
||||
this.parseDataMessageFromClient(netIncomingMessage);
|
||||
break;
|
||||
default:
|
||||
//ModCore.monitor.Log(netIncomingMessage.ToString());
|
||||
Game1.debugOutput = netIncomingMessage.ToString();
|
||||
break;
|
||||
}
|
||||
this.server.Recycle(netIncomingMessage);
|
||||
|
@ -150,28 +179,15 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
case NetConnectionStatus.Disconnecting:
|
||||
if (!this.peers.ContainsRight(message.SenderConnection))
|
||||
break;
|
||||
//Forces a de-sync with money.
|
||||
|
||||
|
||||
this.playerDisconnected(this.peers[message.SenderConnection]);
|
||||
|
||||
this.playerDisconnected(this.peers[message.SenderConnection]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void playerDisconnected(long disconnectee)
|
||||
{
|
||||
this.gameServer.playerDisconnected(disconnectee);
|
||||
|
||||
this.introductionsSent.Remove(this.peers[disconnectee]);
|
||||
|
||||
this.peers.RemoveLeft(disconnectee);
|
||||
}
|
||||
|
||||
|
||||
private void parseDataMessageFromClient(NetIncomingMessage dataMsg)
|
||||
{
|
||||
//ModCore.monitor.Log("DATA MSG: "+dataMsg.ToString());
|
||||
NetConnection peer = dataMsg.SenderConnection;
|
||||
using (IncomingMessage message = new IncomingMessage())
|
||||
{
|
||||
|
@ -182,7 +198,6 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
while ((long)dataMsg.LengthBits - dataMsg.Position >= 8L)
|
||||
{
|
||||
message.Read(reader);
|
||||
int type = message.MessageType;
|
||||
if (this.peers.ContainsLeft(message.FarmerID) && this.peers[message.FarmerID] == peer)
|
||||
this.gameServer.processIncomingMessage(message);
|
||||
else if ((int)message.MessageType == 2)
|
||||
|
@ -203,24 +218,7 @@ namespace ModdedUtilitiesNetworking.Framework.Servers
|
|||
this.sendMessage(this.peers[peerId], message);
|
||||
}
|
||||
|
||||
protected void sendMessage(NetConnection connection, OutgoingMessage message)
|
||||
{
|
||||
NetOutgoingMessage message1 = this.server.CreateMessage();
|
||||
using (NetBufferWriteStream bufferWriteStream = new NetBufferWriteStream((NetBuffer)message1))
|
||||
{
|
||||
using (BinaryWriter writer = new BinaryWriter((Stream)bufferWriteStream)) {
|
||||
if (message.MessageType < 20)
|
||||
{
|
||||
message.Write(writer);
|
||||
}
|
||||
else
|
||||
{
|
||||
OutgoingMessageBase.WriteFromMessage(message, writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
int num = (int)this.server.SendMessage(message1, connection, NetDeliveryMethod.ReliableOrdered);
|
||||
}
|
||||
|
||||
|
||||
public override void setLobbyData(string key, string value)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue