public static async void StartServer() { if (Listening) { MessageBox.Show("Net client already started!"); return; } Listening = true; while (Listening) { Debugging.Log("Listening for data..."); string Logic = await Task.Run(() => RecieveData()); Debugging.Log(Logic); LogicObjects.MMRTpacket NetData = new LogicObjects.MMRTpacket(); if (Logic != "") { try { NetData = JsonConvert.DeserializeObject <LogicObjects.MMRTpacket>(Logic); ManageNetData(NetData); Debugging.Log($"Data Processed"); } catch (Exception e) { Debugging.Log($"Data Invalid: {e}"); } } } Debugging.Log("Server Shutting Down"); return; }
public static void OnlinePlay_TriggerAddRemoteToIPList(LogicObjects.MMRTpacket Data) { LogicObjects.IPDATA NewIP = new LogicObjects.IPDATA(); try { NewIP.IP = IPAddress.Parse(Data.IPData.IP); } catch { return; } NewIP.PORT = Data.IPData.PORT; NewIP.DisplayName = $"{NewIP.IP}:{NewIP.PORT}"; IPS.Add(NewIP); if (CurrentOpenForm != null) { CurrentOpenForm.UpdateFormItems(); } }
private static void SendRequestedUpdate(LogicObjects.MMRTpacket Data, bool IPInSendingList) { if (IPInSendingList) { try { IPAddress NIP = IPAddress.Parse(Data.IPData.IP); SendData(new List <LogicObjects.IPDATA> { new LogicObjects.IPDATA { IP = NIP, PORT = Data.IPData.PORT } }, 0); } catch (Exception e) { Debugging.Log($"Could not send requested data\nReason: Send Request Errored with\n{e}"); } } else { Debugging.Log($"Could not send requested data\nReason: User not in send list {Data.IPData.IP}:{Data.IPData.PORT}"); } }
//Sending Data public static LogicObjects.MMRTpacket CreateNetData(int Type) { bool isValidSyncable(LogicObjects.LogicEntry x) { if (x.IsFake) { return(false); } if (!x.HasRandomItem(true)) { return(false); } return(true); } List <LogicObjects.NetData> NetData = new List <LogicObjects.NetData>(); foreach (var i in LogicObjects.MainTrackerInstance.Logic.Where(x => isValidSyncable(x))) { if (LogicObjects.MainTrackerInstance.Options.IsMultiWorld && (!i.Checked || i.ItemBelongsToMe())) { continue; } NetData.Add(new LogicObjects.NetData { ID = i.ID, PI = i.PlayerData.ItemBelongedToPlayer, Ch = i.Checked, RI = i.RandomizedItem }); } LogicObjects.MMRTpacket Pack = new LogicObjects.MMRTpacket { LogicData = (Type == 1) ? new List <LogicObjects.NetData>() : NetData, PlayerID = LogicObjects.MainTrackerInstance.Options.MyPlayerID, RequestingUpdate = Type, IPData = new LogicObjects.IPDATASerializable { IP = MyIP.ToString(), PORT = LogicObjects.MainTrackerInstance.Options.PortNumber } }; return(Pack); }
public static void CleanMultiWorldData(LogicObjects.TrackerInstance Instance, LogicObjects.MMRTpacket Data) { foreach (var i in Instance.Logic.Where(x => x.Aquired && x.PlayerData.ItemCameFromPlayer == Data.PlayerID)) { i.Aquired = false; i.PlayerData.ItemCameFromPlayer = -1; } var log = LogicObjects.MainTrackerInstance.Logic; var itemsAquired = new List <LogicObjects.LogicEntry>(); var itemsInUse = new List <LogicObjects.LogicEntry>(); foreach (var i in log) { if (i.IsFake) { continue; } if (i.LogicItemAquired()) { itemsAquired.Add(i); itemsInUse.Add(i); } if (i.ItemHasBeenPlaced(Instance.Logic)) { itemsInUse.Add(i); } } foreach (var i in Data.LogicData) { if (i.PI != LogicObjects.MainTrackerInstance.Options.MyPlayerID || i.Ch == false || !Instance.ItemInRange(i.RI) || log[i.RI].IsEntrance()) { continue; } if (itemsInUse.Where(x => x.ID == i.RI).Any()) { Debugging.Log($"{log[i.RI].DictionaryName} was in use elsewhere"); var MatchingItems = log.Where(x => x.SpoilerItem.Intersect(log[i.RI].SpoilerItem).Any()); var FindUnusedMatchingItem = MatchingItems.Where(x => !itemsInUse.Where(y => y.ID == x.ID).Any()); var FindUnAquiredMatchingItem = MatchingItems.Where(x => !itemsAquired.Where(y => y.ID == x.ID).Any()); if (FindUnusedMatchingItem.Any()) { Debugging.Log($"Unused Matching Item found: {FindUnusedMatchingItem.ToArray()[0].DictionaryName}"); var newItem = FindUnusedMatchingItem.First(); i.RI = newItem.ID; itemsAquired.Add(newItem); itemsInUse.Add(newItem); } else if (FindUnAquiredMatchingItem.Any()) { Debugging.Log($"No Unused Matching Items Were Found, getting unaquired matching item."); Debugging.Log($"Matching UnAquired Item Found: {FindUnAquiredMatchingItem.First().DictionaryName}"); var newItem = FindUnAquiredMatchingItem.First(); i.RI = newItem.ID; itemsAquired.Add(newItem); itemsInUse.Add(newItem); } else { Debugging.Log($"No Unused items were found. This is an error and could cause Issues."); } } } }
public static void ManageNetData(LogicObjects.MMRTpacket Data) { var log = LogicObjects.MainTrackerInstance.Logic; var Instance = LogicObjects.MainTrackerInstance; var IPInSendingList = IPS.FindIndex(f => f.IP.ToString() == Data.IPData.IP && f.PORT == Data.IPData.PORT) > -1; //bool SameLAN = (Data.IPData.IP == MyIP.ToString() && Data.IPData.PORT != LogicObjects.MainTrackerInstance.Options.PortNumber); if (!IPInSendingList) { if (LogicObjects.MainTrackerInstance.Options.StrictIP) { return; } if (LogicObjects.MainTrackerInstance.Options.AutoAddIncomingConnections) { OnlinePlay_TriggerAddRemoteToIPList(Data); } } if (Data.RequestingUpdate != 0) { SendRequestedUpdate(Data, IPInSendingList); } if (Data.RequestingUpdate == 1) { return; } bool ChangesMade = false; if (LogicObjects.MainTrackerInstance.Options.IsMultiWorld) { CleanMultiWorldData(Instance, Data); } ListBox ItemsToCheck = new ListBox(); foreach (var i in Data.LogicData) { if (LogicObjects.MainTrackerInstance.Options.IsMultiWorld) { if (i.PI != LogicObjects.MainTrackerInstance.Options.MyPlayerID || i.Ch == false || !Instance.ItemInRange(i.RI) || log[i.RI].IsEntrance()) { continue; } var entry = new LogicObjects.LogicEntry { ID = -1, Checked = false, RandomizedItem = i.RI, SpoilerRandom = i.RI, Options = 0 }; ItemsToCheck.Items.Add(entry); ChangesMade = true; } else if (Instance.ItemInRange(i.ID) && !log[i.ID].Checked) { var entry = log[i.ID]; if (!entry.HasRandomItem(false)) { entry.RandomizedItem = (entry.SpoilerRandom > -2 ? entry.SpoilerRandom : i.RI); ChangesMade = true; } if (LogicObjects.MainTrackerInstance.Options.AllowCheckingItems && i.Ch) { ItemsToCheck.Items.Add(entry); ChangesMade = true; } } } if (!ChangesMade) { return; } for (int i = 0; i < ItemsToCheck.Items.Count; i++) { ItemsToCheck.SetSelected(i, true); } MainInterface.CurrentProgram.CheckItemSelected(ItemsToCheck, true, 0, false, Data.PlayerID, true); }