Beispiel #1
0
            internal static bool Prefix(GameServer __instance, IncomingMessage message)
            {
                if (gsskip)
                {
                    return(true);
                }
                try
                {
                    if (message.MessageType == 99)
                    {
                        PyNet.receiveMessage(message);
                    }
                    else
                    {
                        gsskip = true;
                        __instance.processIncomingMessage(message);
                        gsskip = false;
                    }
                }
                catch (Exception e)
                {
                    PyTKMod._monitor.Log("Errot processing Message: Type:" + message.MessageType + " Data:" + message.Data, StardewModdingAPI.LogLevel.Error);
                    PyTKMod._monitor.Log(e.Message + ":" + e.StackTrace, StardewModdingAPI.LogLevel.Error);
                }

                return(false);
            }
        private void respondToFarmer(long farmer, int id, params TOut[] dataSet)
        {
            foreach (TOut data in dataSet)
            {
                object objectData = data;

                if (serializationType == SerializationType.XML)
                {
                    if (xmlSerializer == null)
                    {
                        xmlSerializer = new XmlSerializer(typeof(TOut));
                    }

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

                PyNet.sendMessage(new MPMessage(address + "." + id, Game1.player, objectData, (int)serializationType, farmer));
            }
        }
 public IEnumerable <T> receive(long fromFarmer = -1)
 {
     foreach (MPMessage msg in PyNet.getNewMessages(address, -1, fromFarmer))
     {
         yield return(deserialize((SerializationType)msg.type, msg.message));
     }
 }
Beispiel #4
0
 private IEnumerable <MPMessage> receive()
 {
     foreach (MPMessage msg in PyNet.getNewMessages(address, -1, -1))
     {
         yield return(msg);
     }
 }
        public static string serialize(object contents, ContentType type)
        {
            if (type == ContentType.DictInt)
            {
                StringWriter writer = new StringWriter();
                (contents as SerializableDictionary <int, string>).WriteXml(XmlWriter.Create(writer));
                return(PyNet.CompressString(writer.ToString()));
            }

            if (type == ContentType.DictString)
            {
                StringWriter writer = new StringWriter();
                (contents as SerializableDictionary <string, string>).WriteXml(XmlWriter.Create(writer));
                return(PyNet.CompressString(writer.ToString()));
            }

            if (type == ContentType.Texture)
            {
                return(PyNet.CompressString(JsonConvert.SerializeObject(new SerializationTexture2D((contents as Texture2D)))));
            }

            if (type == ContentType.Map)
            {
                NewTiledTmxFormat format = new NewTiledTmxFormat();
                return(PyNet.CompressString(format.AsString((contents as Map))));
            }

            return("na");
        }
        private static void sendInstruction <T>(string assetName, T asset, ContentType type, bool toGameContent, Farmer farmer, Action <bool> callback, int timeout)
        {
            if (contentPipe.ContainsKey(farmer) && contentPipe[farmer].Contains(assetName))
            {
                return;
            }

            if (contentPipe.ContainsKey(farmer))
            {
                contentPipe[farmer].AddOrReplace(assetName);
            }
            else
            {
                contentPipe.Add(farmer, new List <string>()
                {
                    assetName
                });
            }

            Task.Run(async() =>
            {
                await PyNet.sendRequestToFarmer <bool>(receiverName, new ContentResponse(assetName, (int)type, serialize(asset, type), toGameContent), farmer, (r) =>
                {
                    if (!r)
                    {
                        callback(false);
                    }
                    else
                    {
                        callback(r);
                    }
                }, SerializationType.JSON, timeout);
            });
        }
 public void sendToFarmer(long farmer, SerializationType serializationType = SerializationType.PLAIN, params T[] dataSet)
 {
     foreach (T data in dataSet)
     {
         PyNet.sendMessage(new MPMessage(address, Game1.player, serialize(serializationType, data), (int)serializationType, farmer));
     }
 }
        public static T deserialize <T>(ContentResponse response)
        {
            if (response.type == (int)ContentType.DictInt)
            {
                SerializableDictionary <int, string> newAsset = new SerializableDictionary <int, string>();
                StringReader reader = new StringReader(PyNet.DecompressString(response.content));
                newAsset.ReadXml(XmlReader.Create(reader));
                return((T)(object)newAsset);
            }

            if (response.type == (int)ContentType.DictString)
            {
                SerializableDictionary <string, string> newAsset = new SerializableDictionary <string, string>();
                StringReader reader = new StringReader(PyNet.DecompressString(response.content));
                newAsset.ReadXml(XmlReader.Create(reader));
                return((T)(object)newAsset);
            }

            if (response.type == (int)ContentType.Texture)
            {
                SerializationTexture2D sTexture = JsonConvert.DeserializeObject <SerializationTexture2D>(PyNet.DecompressString(response.content));
                return((T)(object)sTexture.getTexture());
            }

            if (response.type == (int)ContentType.Map)
            {
                NewTiledTmxFormat format = new NewTiledTmxFormat();
                StringReader      reader = new StringReader(PyNet.DecompressString(response.content));
                Map map = format.Load(XmlReader.Create(reader));
                return((T)(object)map);
            }

            return((T)(object)null);
        }
        internal static bool canBeRebuildInMultiplayer(object obj)
        {
            if (!(getDataString(obj).StartsWith(newPrefix) || getDataString(obj).StartsWith(oldPrefix)))
            {
                return(false);
            }

            string dataString = getDataString(obj);

            preProcessors.useAll(p => dataString = p.Invoke(dataString));

            dataString = dataString.Replace(" " + valueSeperator.ToString() + " ", valueSeperator.ToString());
            string[] data = splitElemets(dataString);

            bool result = true;

            if (typeCheckCache.Contains(data[2]))
            {
                return(true);
            }

            foreach (Farmer farmer in Game1.otherFarmers.Values.Where(f => f.isActive() && f != Game1.player))
            {
                Task <bool> fResult = PyNet.sendRequestToFarmer <bool>(typeCheckerName, data[2], farmer);
                fResult.Wait();
                result = result && fResult.Result;
            }

            if (result)
            {
                typeCheckCache.Add(data[2]);
            }

            return(result);
        }
Beispiel #10
0
        public virtual void ReadFull(BinaryReader reader, NetVersion version)
        {
            string dataString = PyNet.DecompressString(reader.ReadString());

            reader.ReadBoolean();
            string replacementString = PyNet.DecompressString(reader.ReadString());

            Dictionary <string, string> data = new Dictionary <string, string>();

            foreach (string s in dataString.Split(SaveHandler.seperator))
            {
                string[] d = s.Split(SaveHandler.valueSeperator);
                data.Add(d[0], d[1]);
            }

            object elementReplacement = Element.getReplacement();

            SaveHandler.ReplaceAll(elementReplacement, elementReplacement);

            if (ReplacementSerializer == null)
            {
                ReplacementSerializer = new XmlSerializer(elementReplacement.GetType());
            }

            StringReader replacementStringReader = new StringReader(replacementString);
            object       replacement             = ReplacementSerializer.Deserialize(replacementStringReader);

            SaveHandler.RebuildAll(replacement, replacement);

            Element.rebuild(data, replacement);
        }
Beispiel #11
0
        public static Map Load(string path, IModHelper helper, bool syncTexturesToClients, IContentPack contentPack)
        {
            Dictionary <TileSheet, Texture2D> tilesheets = Helper.Reflection.GetField <Dictionary <TileSheet, Texture2D> >(Game1.mapDisplayDevice, "m_tileSheetTextures").GetValue();
            Map    map      = tmx2map(Path.Combine(contentPack != null ? contentPack.DirectoryPath : helper.DirectoryPath, path));
            string fileName = new FileInfo(path).Name;

            Monitor.Log(path);
            foreach (TileSheet t in map.TileSheets)
            {
                t.ImageSource = t.ImageSource.Replace(".png", "");
                string[] seasons       = new string[] { "summer_", "fall_", "winter_" };
                string   tileSheetPath = path.Replace(fileName, t.ImageSource + ".png");

                FileInfo tileSheetFile        = new FileInfo(Path.Combine(contentPack != null ? contentPack.DirectoryPath : helper.DirectoryPath, tileSheetPath));
                FileInfo tileSheetFileVanilla = new FileInfo(Path.Combine(PyUtils.getContentFolder(), "Content", t.ImageSource + ".xnb"));
                if (tileSheetFile.Exists && !tileSheetFileVanilla.Exists && tilesheets.Find(k => k.Key.ImageSource == t.ImageSource).Key == null)
                {
                    Texture2D tilesheet = contentPack != null?contentPack.LoadAsset <Texture2D>(tileSheetPath) : helper.Content.Load <Texture2D>(tileSheetPath);

                    tilesheet.inject(t.ImageSource);
                    tilesheet.inject("Maps/" + t.ImageSource);

                    if (syncTexturesToClients && Game1.IsMultiplayer && Game1.IsServer)
                    {
                        foreach (Farmer farmhand in Game1.otherFarmers.Values)
                        {
                            PyNet.sendGameContent(t.ImageSource, tilesheet, farmhand, (b) => Monitor.Log("Syncing " + t.ImageSource + " to " + farmhand.Name + ": " + (b ? "successful" : "failed"), b ? LogLevel.Info : LogLevel.Warn));
                        }
                    }

                    if (t.ImageSource.Contains("spring_"))
                    {
                        foreach (string season in seasons)
                        {
                            string   seasonPath = path.Replace(fileName, t.ImageSource.Replace("spring_", season));
                            FileInfo seasonFile = new FileInfo(Path.Combine(contentPack != null ? contentPack.DirectoryPath : helper.DirectoryPath, seasonPath + ".png"));
                            if (seasonFile.Exists && tilesheets.Find(k => k.Key.ImageSource == t.ImageSource.Replace("spring_", season)).Key == null)
                            {
                                Texture2D seasonTilesheet = contentPack != null?contentPack.LoadAsset <Texture2D>(seasonPath + ".png") : helper.Content.Load <Texture2D>(seasonPath + ".png");

                                string seasonTextureName = t.ImageSource.Replace("spring_", season);
                                seasonTilesheet.inject(seasonTextureName);
                                seasonTilesheet.inject("Maps/" + seasonTextureName);

                                if (syncTexturesToClients && Game1.IsMultiplayer && Game1.IsServer)
                                {
                                    foreach (Farmer farmhand in Game1.otherFarmers.Values)
                                    {
                                        PyNet.sendGameContent(new string[] { seasonTextureName, "Maps/" + seasonTextureName }, seasonTilesheet, farmhand, (b) => Monitor.Log("Syncing " + seasonTextureName + " to " + farmhand.Name + ": " + (b ? "successful" : "failed"), b ? LogLevel.Info : LogLevel.Warn));
                                    }
                                }
                            }
                        }
                    }
                }
            }
            map.LoadTileSheets(Game1.mapDisplayDevice);
            return(map);
        }
Beispiel #12
0
 internal static void sendMoney(Farmer receiver, int money)
 {
     Task.Run(async() =>
     {
         await PyNet.sendRequestToFarmer <bool>(moneyReceiverName, money, receiver, (b) => { if (!b)
                                                                                             {
                                                                                                 Game1.player.Money += money;
                                                                                             }
                                                }, SerializationType.PLAIN, 3000);
     });
 }
        private void syncMaps(IEnumerable <SFarmer> farmers)
        {
            foreach (SFarmer farmer in farmers)
            {
                foreach (KeyValuePair <string, Map> map in mapsToSync)
                {
                    PyNet.syncMap(map.Value, map.Key, Game1.player);
                }

                syncedFarmers.AddOrReplace(farmer);
            }
        }
Beispiel #14
0
        public virtual void Read(BinaryReader reader, NetVersion version)
        {
            string dataString = PyNet.DecompressString(reader.ReadString());
            Dictionary <string, string> data = new Dictionary <string, string>();

            foreach (string s in dataString.Split(SaveHandler.seperator))
            {
                string[] d = s.Split(SaveHandler.valueSeperator);
                data.Add(d[0], d[1]);
            }

            Element.sync(data);
        }
Beispiel #15
0
            internal static bool Prefix(IncomingMessage message)
            {
                if (message.MessageType == 99)
                {
                    PyNet.receiveMessage(message);
                }
                else
                {
                    return(true);
                }

                return(false);
            }
        public Texture2D getTexture()
        {
            byte[]       buffer = PyNet.DecompressBytes(Data);
            MemoryStream stream = new MemoryStream(buffer);
            BinaryReader reader = new BinaryReader(stream);

            Color[] colors = new Color[Width * Height];

            for (int i = 0; i < colors.Length; i++)
            {
                var r = reader.ReadByte();
                var g = reader.ReadByte();
                var b = reader.ReadByte();
                var a = reader.ReadByte();
                colors[i] = new Color(r, g, b, a);
            }

            Texture2D texture = null;

            if (IsScaled)
            {
                byte[]       sbuffer = PyNet.DecompressBytes(ScaledData);
                MemoryStream sstream = new MemoryStream(sbuffer);
                BinaryReader sreader = new BinaryReader(sstream);
                Color[]      scolors = new Color[ScaledWidth * ScaledHeight];

                for (int i = 0; i < scolors.Length; i++)
                {
                    var sr = sreader.ReadByte();
                    var sg = sreader.ReadByte();
                    var sb = sreader.ReadByte();
                    var sa = sreader.ReadByte();
                    scolors[i] = new Color(sr, sg, sb, sa);
                }

                Texture2D stexture = new Texture2D(Game1.graphics.GraphicsDevice, ScaledWidth, ScaledHeight);
                stexture.SetData(scolors);

                texture = new ScaledTexture2D(Game1.graphics.GraphicsDevice, Width, Height, stexture, Scale, (ForcedSourceRectangle.Length > 0 && ForcedSourceRectangle[0] != -1) ? new Rectangle?(new Rectangle(ForcedSourceRectangle[0], ForcedSourceRectangle[1], ForcedSourceRectangle[2], ForcedSourceRectangle[3])) : null);
            }
            else
            {
                texture = new Texture2D(Game1.graphics.GraphicsDevice, Width, Height);
            }

            texture.SetData(colors);

            return(texture);
        }
Beispiel #17
0
        public static Map LoadAndSyncToClients(string path, IModHelper helper, IContentPack contentPack = null, string assetNameMap = null)
        {
            Map map = Load(path, helper, true, contentPack);

            if (assetNameMap != null)
            {
                if (Game1.IsMultiplayer && Game1.IsServer)
                {
                    foreach (Farmer farmhand in Game1.otherFarmers.Values)
                    {
                        PyNet.sendGameContent(assetNameMap, map, farmhand, (b) => Monitor.Log("Syncing " + assetNameMap + " to " + farmhand.Name + ": " + (b ? "successful" : "failed"), b ? LogLevel.Info : LogLevel.Warn));
                    }
                }
            }

            return(map);
        }
Beispiel #18
0
        public virtual void Write(BinaryWriter writer)
        {
            Dictionary <string, string> data = Element.getSyncData();

            if (data == null)
            {
                data = new Dictionary <string, string>()
                {
                    { "na", "na" }
                }
            }
            ;

            string dataString = string.Join(SaveHandler.seperator.ToString(), data.Select(x => x.Key + SaveHandler.valueSeperator + x.Value));

            writer.Write(PyNet.CompressString(dataString));
        }
Beispiel #19
0
 private static void sendInstruction <T>(string[] assetName, T asset, ContentType type, bool toGameContent, Farmer farmer, Action <bool> callback, int timeout)
 {
     Task.Run(async() =>
     {
         await PyNet.sendRequestToFarmer <bool>(receiverName, new ContentResponse(String.Join("|", assetName), (int)type, serialize(asset, type), toGameContent), farmer, (r) =>
         {
             if (!r)
             {
                 PyTKMod._monitor.Log("ContentRequest Failed: Could not send asset: " + String.Join("|", assetName) + " to " + farmer.Name);
                 callback(false);
             }
             else
             {
                 callback(r);
             }
         }, SerializationType.JSON, timeout);
     });
 }
 private static void getResponse <T>(string assetName, ContentType type, bool fromGameContent, Farmer farmer, Action <T> callback, Func <ContentResponse, T> deserializer, int timeout)
 {
     Task.Run(async() =>
     {
         await PyNet.sendRequestToFarmer <ContentResponse>(responderName, new ContentRequest(type, assetName, fromGameContent), farmer, (r) =>
         {
             if (r.content == "na")
             {
                 PyTKMod._monitor.Log("ContentRequest Failed: Could not obtain asset: " + r.assetName);
                 callback((T)(object)null);
             }
             else
             {
                 callback(deserializer(r));
             }
         }, SerializationType.JSON, timeout);
     });
 }
        public void serialize(Texture2D texture)
        {
            Color[] data   = new Color[Width * Height];
            byte[]  buffer = new byte[data.Length * 4];
            texture.GetData(data);

            MemoryStream stream = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(stream);

            for (int i = 0; i < data.Length; i++)
            {
                writer.Write(data[i].R);
                writer.Write(data[i].G);
                writer.Write(data[i].B);
                writer.Write(data[i].A);
            }

            Data = PyNet.CompressBytes(stream.ToArray());
        }
Beispiel #22
0
        private void runSync(object sender, UpdateTickedEventArgs e)
        {
            if (!Game1.IsMultiplayer)
            {
                return;
            }

            if (!e.IsMultipleOf((uint)interval))
            {
                return;
            }

            T data = syncSender();

            if (data != null)
            {
                PyNet.sendDataToFarmer(receiverName, data, -1, SerializationType.JSON);
            }
        }
        public static void setScore(string name, int score)
        {
            Highscore highscore = new Highscore(name, score);
            var       oldEntry  = HighscoreTable.Entries.Find(entry => entry.Name == name && entry.Value >= score);

            if (!(oldEntry is Highscore))
            {
                HighscoreTable.Entries.Add(highscore);
                SnakeMod.monitor.Log("New Highscore!");
                SnakeMod.monitor.Log(highscore.Name + ": " + highscore.Value);
                if (Game1.IsMasterGame)
                {
                    PyNet.sendRequestToAllFarmers <bool>(SnakeMod.highscoreListReceiverName, HighscoreTable, null, serializationType: PyTK.Types.SerializationType.JSON);
                }
                else
                {
                    Task.Run(async() => await PyNet.sendRequestToFarmer <bool>(SnakeMod.highscoreReceiverName, highscore, Game1.MasterPlayer, serializationType: PyTK.Types.SerializationType.JSON));
                }
            }
        }
Beispiel #24
0
 internal static bool Prefix(Farmer receiver, ProposalType proposalType, Item gift)
 {
     if (proposalType == ProposalType.Gift && gift is GoldItem)
     {
         int money = Game1.player.ActiveObject.Stack;
         Task.Run(async() =>
         {
             await PyNet.sendRequestToFarmer <bool>(moneyReceiverName, money, receiver, (b) => { if (!b)
                                                                                                 {
                                                                                                     Game1.player.Money += money;
                                                                                                 }
                                                    }, SerializationType.PLAIN, 3000);
         });
         Game1.player.removeItemFromInventory(Game1.player.ActiveObject);
         return(false);
     }
     else
     {
         return(true);
     }
 }
        public Texture2D getTexture()
        {
            byte[]       buffer = PyNet.DecompressBytes(Data);
            MemoryStream stream = new MemoryStream(buffer);
            BinaryReader reader = new BinaryReader(stream);

            Color[] colors = new Color[Width * Height];

            for (int i = 0; i < colors.Length; i++)
            {
                var r = reader.ReadByte();
                var g = reader.ReadByte();
                var b = reader.ReadByte();
                var a = reader.ReadByte();
                colors[i] = new Color(r, g, b, a);
            }

            Texture2D texture = new Texture2D(Game1.graphics.GraphicsDevice, Width, Height);

            texture.SetData(colors);
            return(texture);
        }
        public void serialize(Texture2D texture)
        {
            Color[] data   = new Color[Width * Height];
            byte[]  buffer = new byte[data.Length * 4];
            texture.GetData(data);

            MemoryStream stream = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(stream);

            for (int i = 0; i < data.Length; i++)
            {
                writer.Write(data[i].R);
                writer.Write(data[i].G);
                writer.Write(data[i].B);
                writer.Write(data[i].A);
            }

            Data = PyNet.CompressBytes(stream.ToArray());

            if (texture is ScaledTexture2D stexture)
            {
                Color[] sdata   = new Color[ScaledWidth * ScaledHeight];
                byte[]  sbuffer = new byte[sdata.Length * 4];
                stexture.STexture.GetData(sdata);

                MemoryStream sstream = new MemoryStream();
                BinaryWriter swriter = new BinaryWriter(sstream);

                for (int i = 0; i < sdata.Length; i++)
                {
                    swriter.Write(sdata[i].R);
                    swriter.Write(sdata[i].G);
                    swriter.Write(sdata[i].B);
                    swriter.Write(sdata[i].A);
                }

                ScaledData = PyNet.CompressBytes(sstream.ToArray());
            }
        }
Beispiel #27
0
        public virtual void WriteFull(BinaryWriter writer)
        {
            Dictionary <string, string> data = Element.getAdditionalSaveData();
            string dataString = string.Join(SaveHandler.seperator.ToString(), data.Select(x => x.Key + SaveHandler.valueSeperator + x.Value));;

            object elementReplacement = Element.getReplacement();

            SaveHandler.ReplaceAll(elementReplacement, elementReplacement);

            if (ReplacementSerializer == null)
            {
                ReplacementSerializer = new XmlSerializer(elementReplacement.GetType());
            }

            StringWriter replacementStringWriter = new StringWriter();

            ReplacementSerializer.Serialize(replacementStringWriter, elementReplacement);
            string replacementString = replacementStringWriter.ToString();

            writer.Write(PyNet.CompressString(dataString));
            writer.Write(true);
            writer.Write(PyNet.CompressString(replacementString));
        }
Beispiel #28
0
        public static void Prefix_drawHairAndAccesories(FarmerRenderer __instance, Farmer who, int facingDirection, Vector2 position, Vector2 origin, float scale, int currentFrame, float rotation, Color overrideColor)
        {
            if (Game1.activeClickableMenu is TitleMenu && who.hat.Value is Hat h && !(h is CustomHat) && SaveHandler.getAdditionalSaveData(h) is Dictionary <string, string> savdata)
            {
                if (savdata.ContainsKey("blueprint") && savdata["blueprint"] is string bid && CustomShirtsMod.hats.Find(bp => bp.fullid == bid) is HatBlueprint hbp)
                {
                    who.hat.Value = new CustomHat(hbp);
                }
            }

            if (who.hat.Value is CustomHat c)
            {
                if (c.texture == null && CustomShirtsMod.syncedHats.ContainsKey(c.hatId + "." + who.UniqueMultiplayerID))
                {
                    c.texture = CustomShirtsMod.syncedHats[c.hatId + "." + who.UniqueMultiplayerID];
                }

                if (c.texture == null && !requestedHatSyncs.Contains(c.hatId + "." + who.UniqueMultiplayerID))
                {
                    requestedHatSyncs.Add(c.hatId + "." + who.UniqueMultiplayerID);
                    try
                    {
                        Task.Run(async() =>
                        {
                            await PyNet.sendRequestToFarmer <HatSync>(CustomShirtsMod.HatSyncerRequestName, c.hatId, who, (hs) =>
                            {
                                requestedHatSyncs.Remove(c.hatId + "." + who.UniqueMultiplayerID);

                                if (hs == null || hs.Texture == null)
                                {
                                    return;
                                }

                                if (CustomShirtsMod.syncedHats.ContainsKey(hs.SyncId))
                                {
                                    CustomShirtsMod.syncedHats.Remove(hs.SyncId);
                                }

                                CustomShirtsMod.syncedHats.Add(hs.SyncId, hs.Texture.getTexture());
                            }, SerializationType.PLAIN, 1000);
                        });
                    }
                    catch (Exception e)
                    {
                        CustomShirtsMod._monitor.Log(e.Message + ":" + e.StackTrace);
                    }
                }

                if (c.texture != null)
                {
                    int direction = who.FacingDirection;
                    FarmerRenderer.hatsTexture = c.texture;
                    if (direction == 0)
                    {
                        direction = 3;
                    }
                    else if (direction == 2)
                    {
                        direction = 0;
                    }
                    else if (direction == 3)
                    {
                        direction = 2;
                    }

                    if (Game1.activeClickableMenu is TitleMenu || Game1.activeClickableMenu is GameMenu)
                    {
                        direction = 0;
                    }

                    if (c.texture is ScaledTexture2D sct)
                    {
                        sct.ForcedSourceRectangle = new Rectangle(0, (int)(direction * 20 * sct.Scale), (int)(20 * sct.Scale), (int)(20 * sct.Scale));
                    }
                }
            }
            else
            {
                FarmerRenderer.hatsTexture = CustomShirtsMod.vanillaHats;
            }

            bool savedShirt = CustomShirtsMod.playerShirts.ContainsKey(who.UniqueMultiplayerID) && CustomShirtsMod.playerBaseShirts.ContainsKey(who.UniqueMultiplayerID) && CustomShirtsMod.playerBaseShirts[who.UniqueMultiplayerID] != -9999;

            if (savedShirt && (Game1.activeClickableMenu is CharacterCustomization || menuIsCC()))
            {
                savedShirt = false;
                CustomShirtsMod.playerShirts.Remove(who.UniqueMultiplayerID);
                CustomShirtsMod.playerBaseShirts.Remove(who.UniqueMultiplayerID);
                who.shirt.Value = ((CustomShirtsMod.shirts.FindIndex(fj => fj.fullid == CustomShirtsMod.config.ShirtId) + 1) * -1);
            }

            if (who.shirt.Value >= 0 && !savedShirt)
            {
                FarmerRenderer.shirtsTexture = CustomShirtsMod.vanillaShirts;
                return;
            }
            else
            {
                try
                {
                    if (!savedShirt && who == Game1.player)
                    {
                        FarmerRenderer.shirtsTexture = CustomShirtsMod.shirts[(who.shirt.Value * -1) - 1].texture2d;
                    }
                    else
                    {
                        if (CustomShirtsMod.playerShirts[who.UniqueMultiplayerID] == null)
                        {
                            return;
                        }
                        FarmerRenderer.shirtsTexture = CustomShirtsMod.playerShirts[who.UniqueMultiplayerID];
                    }
                }
                catch { }
            }

            if (FarmerRenderer.shirtsTexture is ScaledTexture2D st)
            {
                st.ForcedSourceRectangle = new Rectangle?(new Rectangle(0, (int)((facingDirection == 0 ? 24 : facingDirection == 1 ? 8 : facingDirection == 3 ? 16 : 0) * st.Scale), (int)(8 * st.Scale), (int)(8 * st.Scale)));
            }
        }
Beispiel #29
0
        public override void Entry(IModHelper helper)
        {
            monitor         = Monitor;
            SnakeMod.helper = helper;
            helper.Events.GameLoop.GameLaunched += (o, e) =>
            {
                sdata = new CustomObjectData("Snake", "Snake/0/-300/Crafting -9/Play 'Snake by Platonymous' at home!/true/true/0/Snake", helper.Content.Load <Texture2D>(@"Assets/arcade.png"), Color.White, bigCraftable: true, type: typeof(SnakeMachine));

                if (Helper.ModRegistry.GetApi <IMobilePhoneApi>("aedenthorn.MobilePhone") is IMobilePhoneApi api)
                {
                    Texture2D appIcon = Helper.Content.Load <Texture2D>(Path.Combine("assets", "mobile_app_icon.png"));
                    bool      success = api.AddApp(Helper.ModRegistry.ModID + "MobileSnake", "Snake", () =>
                    {
                        Game1.currentMinigame = new SnakeMinigame(helper);
                    }, appIcon);
                }
            };
            helper.Events.GameLoop.SaveLoaded += (o, e) =>
            {
                if (Game1.IsMasterGame)
                {
                    SnakeMinigame.HighscoreTable = helper.Data.ReadSaveData <HighscoreList>("Platonymous.SnakeAcrcade.Highscore");
                    if (SnakeMinigame.HighscoreTable == null)
                    {
                        SnakeMinigame.HighscoreTable = new HighscoreList();
                    }

                    Monitor.Log("Loading Highscores");

                    foreach (Highscore h in SnakeMinigame.HighscoreTable.Entries)
                    {
                        Monitor.Log(h.Name + ": " + h.Value);
                    }
                }
                addToCatalogue();
            };


            helper.Events.GameLoop.Saving += (o, e) =>
            {
                if (Game1.IsMasterGame)
                {
                    helper.Data.WriteSaveData <HighscoreList>("Platonymous.SnakeAcrcade.Highscore", SnakeMinigame.HighscoreTable);
                }
            };

            highscoreReceiver = new PyResponder <bool, Highscore>(highscoreReceiverName, (score) =>
            {
                if (Game1.IsMasterGame)
                {
                    Monitor.Log("Received Highscore from " + score.Name + "(" + score.Value + ")");
                    SnakeMinigame.setScore(score.Name, score.Value);
                    PyNet.sendRequestToAllFarmers <bool>(highscoreListReceiverName, SnakeMinigame.HighscoreTable, null, serializationType: PyTK.Types.SerializationType.JSON);
                }
                return(true);
            }, 60, requestSerialization: SerializationType.JSON);

            highscoreReceiver.start();

            highscoreListReceiver = new PyResponder <bool, HighscoreList>(highscoreListReceiverName, (score) =>
            {
                if (!Game1.IsMasterGame)
                {
                    Monitor.Log("Received Highscore Update");

                    foreach (Highscore h in score.Entries)
                    {
                        Monitor.Log(h.Name + ": " + h.Value);
                    }

                    SnakeMinigame.HighscoreTable = score;
                }
                return(true);
            }, 40, requestSerialization: SerializationType.JSON);

            highscoreListReceiver.start();

            helper.Events.Multiplayer.PeerContextReceived += (s, e) =>
            {
                if (Game1.IsMasterGame)
                {
                    PyUtils.setDelayedAction(5000, () => PyNet.sendRequestToAllFarmers <bool>(highscoreListReceiverName, SnakeMinigame.HighscoreTable, null, serializationType: PyTK.Types.SerializationType.JSON));
                }
            };
        }