public ActionResult CheckCheatBidsByCandidateId(int candidateId, int configA = 500, int configB = 100, int configC = 100) { AntiCheat ac = new AntiCheat(configA, configB, configC); ac.CheckVoteByCandidate(candidateId); return(null); }
public ActionResult CheckCheatBids(int topCount, int configA = 500, int configB = 100, int configC = 100) { CandidateRepository cr = new CandidateRepository(); IEnumerable <int> topCandidateIds = cr.GetTopCandidates(topCount); AntiCheat ac = new AntiCheat(configA, configB, configC); foreach (int candidateId in topCandidateIds) { ac.CheckVoteByCandidate(candidateId); } return(null); }
public static cint Encode(int value) { int v = value; v ^= AntiCheat.Factor; v += AntiCheat.Factor; v = ~v; return(new cint { value = v, check = AntiCheat.CalcCheck(value), inited = true }); }
public static clong Encode(long value) { long v = value; v ^= AntiCheat.Factor; v += AntiCheat.Factor; v = ~v; return(new clong { value = v, check = AntiCheat.CalcCheck(value), inited = true }); }
public static long Decode(clong value) { if (value.inited) { long v = value.value; v = ~v; v -= AntiCheat.Factor; v ^= AntiCheat.Factor; if (value.check == AntiCheat.CalcCheck(v)) { return(v); } else { AntiCheat.InvokeOnCheat(); } } return(0); }
public static bool Decode(cbool value) { if (!value.inited) { return(false); } else if (value.value == AntiCheat.Factor) { return(true); } else if (value.value == ~AntiCheat.Factor) { return(false); } else { AntiCheat.InvokeOnCheat(); return(false); } }
public static void LoadSub() { Channels.Load(); Clan.Load(); AntiCheat.Load(); Player.Load(); LoginEvent.Load(); Experience.Load(); ChatEvent.Load(); Christmas.Load(); RandomBoxEvent.Load(); ChristmasBoxEvent.Load(); SupplyBoxEvent.Load(); }
public static void handleGameState(string uri, string serverreply = "", string POST = "", string GET = "") { RPCstartTimestamp = DateTime.Now; var SBRW_XML = new XmlDocument(); string[] splitted_uri = uri.Split('/'); if (uri == "/events/gettreasurehunteventsession") { PersonaTreasure = 0; TotalTreasure = 15; TEDay = 0; SBRW_XML.LoadXml(serverreply); var xPersonaTreasure = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/CoinsCollected").InnerText); for (var i = 0; i < 15; i++) { if ((xPersonaTreasure & (1 << (15 - i))) != 0) { PersonaTreasure++; } } TotalTreasure = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/NumCoins").InnerText); TEDay = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/Streak").InnerText); } if (uri == "/events/notifycoincollected") { PersonaTreasure++; _presence.Details = "Collecting gems (" + PersonaTreasure + " of " + TotalTreasure + ")"; _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = "Treasure Hunt - Day: " + TEDay, SmallImageKey = "gamemode_treasure" }; MainScreen.discordRpcClient.SetPresence(_presence); } if (uri == "/User/SecureLoginPersona") { LoggedPersonaId = GET.Split(';').Last().Split('=').Last(); canUpdateProfileField = true; Helper.personaid = LoggedPersonaId; } if (uri == "/User/SecureLogoutPersona") { PersonaId = String.Empty; PersonaName = String.Empty; PersonaLevel = String.Empty; PersonaAvatarId = String.Empty; PersonaCarId = String.Empty; PersonaCarName = String.Empty; PersonaTreasure = 0; } //FIRST PERSONA EVER LOCALIZED IN CODE if (uri == "/User/GetPermanentSession") { //try { Statuses.getToken(); } catch { } try { SBRW_XML.LoadXml(serverreply); PersonaName = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/Name").InnerText.Replace("¤", "[S]"); PersonaLevel = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/Level").InnerText; PersonaAvatarId = "avatar_" + SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/IconIndex").InnerText; PersonaId = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/PersonaId").InnerText; //Let's get rest of PERSONAIDs XmlNode UserInfo = SBRW_XML.SelectSingleNode("UserInfo"); XmlNodeList personas = UserInfo.SelectNodes("personas/ProfileData"); foreach (XmlNode node in personas) { PersonaIds.Add(node.SelectSingleNode("PersonaId").InnerText); } } catch (Exception) { } } //CREATE/DELETE PERSONA Handler if (uri == "/DriverPersona/CreatePersona") { SBRW_XML.LoadXml(serverreply); PersonaIds.Add(SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText); } //DRIVING CARNAME if (uri == "/DriverPersona/GetPersonaInfo" && canUpdateProfileField == true) { if (LoggedPersonaId == GET.Split(';').Last().Split('=').Last()) { SBRW_XML.LoadXml(serverreply); PersonaName = SBRW_XML.SelectSingleNode("ProfileData/Name").InnerText.Replace("¤", "[S]"); PersonaLevel = SBRW_XML.SelectSingleNode("ProfileData/Level").InnerText; PersonaAvatarId = (SBRW_XML.SelectSingleNode("ProfileData/IconIndex").InnerText == "26") ? "nfsw" : "avatar_" + SBRW_XML.SelectSingleNode("ProfileData/IconIndex").InnerText; PersonaId = SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText; AntiCheat.persona_name = SBRW_XML.SelectSingleNode("ProfileData/Name").InnerText.Replace("¤", "[S]"); } } if (uri == "/matchmaking/leavelobby" || uri == "/matchmaking/declineinvite") { _presence.Details = "Driving " + PersonaCarName; _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = "In-Freeroam", SmallImageKey = "gamemode_freeroam" }; _presence.Timestamps = GetCurrentTimestamp(); MainScreen.discordRpcClient.SetPresence(_presence); eventTerminatedManually = true; Self.CanDisableGame = true; } //IN LOBBY if (uri == "/matchmaking/acceptinvite") { Self.CanDisableGame = false; SBRW_XML.LoadXml(serverreply); var eventIdNode = SBRW_XML.SelectSingleNode("LobbyInfo/EventId"); if (eventIdNode != null) { EventID = Convert.ToInt32(eventIdNode.InnerText); _presence.Details = "In Lobby: " + EventList.getEventName(EventID); _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = EventList.getEventName(Convert.ToInt32(EventID)), SmallImageKey = EventList.getEventType(Convert.ToInt32(EventID)) }; MainScreen.discordRpcClient.SetPresence(_presence); eventTerminatedManually = false; } } if (uri == "/matchmaking/joinqueueracenow") { _presence.Details = "Searching for event..."; _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = "In-Freeroam", SmallImageKey = "gamemode_freeroam" }; _presence.Timestamps = GetCurrentTimestamp(); MainScreen.discordRpcClient.SetPresence(_presence); eventTerminatedManually = true; } //IN SAFEHOUSE/FREEROAM if (uri == "/DriverPersona/UpdatePersonaPresence") { string UpdatePersonaPresenceParam = GET.Split(';').Last().Split('=').Last(); _presence.Assets = new Assets(); if (UpdatePersonaPresenceParam == "1") { _presence.Details = "Driving " + PersonaCarName; _presence.Assets.SmallImageText = "In-Freeroam"; _presence.Assets.SmallImageKey = "gamemode_freeroam"; Self.CanDisableGame = true; } else { _presence.Details = "In Safehouse"; _presence.Assets.SmallImageText = "In-Safehouse"; _presence.Assets.SmallImageKey = "gamemode_safehouse"; Self.CanDisableGame = false; } _presence.State = serverName; _presence.Assets.LargeImageText = PersonaName + " - Level: " + PersonaLevel; _presence.Assets.LargeImageKey = PersonaAvatarId; _presence.Timestamps = GetCurrentTimestamp(); MainScreen.discordRpcClient.SetPresence(_presence); } //IN EVENT if (Regex.Match(uri, "/matchmaking/launchevent").Success) { Self.CanDisableGame = false; EventID = Convert.ToInt32(splitted_uri[3]); _presence.Details = "In Event: " + EventList.getEventName(EventID); _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = EventList.getEventName(EventID), SmallImageKey = EventList.getEventType(EventID) }; MainScreen.discordRpcClient.SetPresence(_presence); eventTerminatedManually = false; } if (uri == "/event/arbitration") { _presence.Details = "In Event: " + EventList.getEventName(EventID); _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = EventList.getEventName(EventID), SmallImageKey = EventList.getEventType(EventID) }; AntiCheat.disableChecks(); MainScreen.discordRpcClient.SetPresence(_presence); eventTerminatedManually = false; } if (uri == "/event/launched" && eventTerminatedManually == false) { _presence.Details = "In Event: " + EventList.getEventName(EventID); _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = EventList.getEventName(EventID), SmallImageKey = EventList.getEventType(EventID) }; AntiCheat.event_id = EventID; AntiCheat.enableChecks(); _presence.Timestamps = GetCurrentTimestamp(); MainScreen.discordRpcClient.SetPresence(_presence); } //CARS RELATED foreach (var single_personaId in PersonaIds) { if (Regex.Match(uri, "/personas/" + single_personaId + "/carslots", RegexOptions.IgnoreCase).Success) { carslotsXML = serverreply; SBRW_XML.LoadXml(carslotsXML); int DefaultID = Convert.ToInt32(SBRW_XML.SelectSingleNode("CarSlotInfoTrans/DefaultOwnedCarIndex").InnerText); int current = 0; XmlNode CarsOwnedByPersona = SBRW_XML.SelectSingleNode("CarSlotInfoTrans/CarsOwnedByPersona"); XmlNodeList OwnedCarTrans = CarsOwnedByPersona.SelectNodes("OwnedCarTrans"); foreach (XmlNode node in OwnedCarTrans) { if (DefaultID == current) { PersonaCarName = CarList.getCarName(node.SelectSingleNode("CustomCar/Name").InnerText); } current++; } } if (Regex.Match(uri, "/personas/" + single_personaId + "/defaultcar", RegexOptions.IgnoreCase).Success) { if (splitted_uri.Last() != "defaultcar") { string receivedId = splitted_uri.Last(); SBRW_XML.LoadXml(carslotsXML); XmlNode CarsOwnedByPersona = SBRW_XML.SelectSingleNode("CarSlotInfoTrans/CarsOwnedByPersona"); XmlNodeList OwnedCarTrans = CarsOwnedByPersona.SelectNodes("OwnedCarTrans"); foreach (XmlNode node in OwnedCarTrans) { if (receivedId == node.SelectSingleNode("Id").InnerText) { PersonaCarName = CarList.getCarName(node.SelectSingleNode("CustomCar/Name").InnerText); } } } } } }
private void LaunchGame() { WindowState = FormWindowState.Minimized; var args = "EU " + Tokens.IPAddress + " " + Tokens.LoginToken + " " + Tokens.UserId; var psi = new ProcessStartInfo(); psi.WorkingDirectory = Directory.GetCurrentDirectory(); psi.FileName = "nfsw.exe"; psi.Arguments = args; var nfswProcess = Process.Start(psi); nfswProcess.PriorityClass = ProcessPriorityClass.AboveNormal; var processorAffinity = 0; for (var i = 0; i < Math.Min(Math.Max(1, Environment.ProcessorCount), 8); i++) { processorAffinity |= 1 << i; } nfswProcess.ProcessorAffinity = (IntPtr)processorAffinity; AntiCheat.process_id = nfswProcess.Id; AntiCheat.Checks(); //TIMER HERE secondsToShutDown = (result["secondsToShutDown"].AsInt == 0) ? result["secondsToShutDown"].AsInt : 2 * 60 * 60; System.Timers.Timer shutdowntimer = new System.Timers.Timer(); shutdowntimer.Elapsed += (x2, y2) => { Process[] allOfThem = Process.GetProcessesByName("nfsw"); if (secondsToShutDown <= 0) { GameKilledBySpeedBugCheck = true; foreach (var oneProcess in allOfThem) { Process.GetProcessById(oneProcess.Id).Kill(); } } //change title foreach (var oneProcess in allOfThem) { long p = oneProcess.MainWindowHandle.ToInt64(); TimeSpan t = TimeSpan.FromSeconds(secondsToShutDown); string secondsToShutDownNamed = string.Format("{0:D2}:{1:D2}:{2:D2}", t.Hours, t.Minutes, t.Seconds); User32.SetWindowText((IntPtr)p, "NEED FOR SPEED™ WORLD | Server: " + SelectedServerName + " | " + UserAgent.WindowTextForGame + " | Force Restart In: " + secondsToShutDownNamed); } --secondsToShutDown; }; shutdowntimer.Interval = 1000; shutdowntimer.Enabled = true; if (nfswProcess != null) { nfswProcess.EnableRaisingEvents = true; _nfswPid = nfswProcess.Id; nfswProcess.Exited += (sender2, e2) => { _nfswPid = 0; var exitCode = nfswProcess.ExitCode; if (GameKilledBySpeedBugCheck == true && CheatsWasUsed == false) { exitCode = 2137; } if (CheatsWasUsed == true) { exitCode = 2017; } if (exitCode == 0) { CloseButton(null, null); } else { try { AntiCheat.thread.Abort(); } catch { } String errorMsg = "Game Crash with exitcode: " + exitCode.ToString() + " (0x" + exitCode.ToString("X") + ")"; if (exitCode == -1073741819) { errorMsg = "Game Crash: Access Violation (0x" + exitCode.ToString("X") + ")"; } if (exitCode == -1073740940) { errorMsg = "Game Crash: Heap Corruption (0x" + exitCode.ToString("X") + ")"; } if (exitCode == -1073740791) { errorMsg = "Game Crash: Stack buffer overflow (0x" + exitCode.ToString("X") + ")"; } if (exitCode == -805306369) { errorMsg = "Game Crash: Application Hang (0x" + exitCode.ToString("X") + ")"; } if (exitCode == -1073741515) { errorMsg = "Game Crash: Missing dependency files (0x" + exitCode.ToString("X") + ")"; } if (exitCode == -1073740972) { errorMsg = "Game Crash: Debugger crash (0x" + exitCode.ToString("X") + ")"; } if (exitCode == -1073741676) { errorMsg = "Game Crash: Division by Zero (0x" + exitCode.ToString("X") + ")"; } if (exitCode == 1) { errorMsg = "The process nfsw.exe was killed via Task Manager"; } if (exitCode == 2017) { errorMsg = "Server replied with Code: " + Tokens.UserId + " (0x" + exitCode.ToString("X") + ")"; } if (exitCode == 2137) { errorMsg = "Launcher killed your game to prevent SpeedBugging."; } if (exitCode == -3) { errorMsg = "The Server was unable to resolve the request"; } if (exitCode == -4) { errorMsg = "Another instance is already executed"; } if (exitCode == -5) { errorMsg = "DirectX Device was not found. Please install GPU Drivers before playing"; } if (exitCode == -6) { errorMsg = "Server was unable to resolve your request"; } //ModLoader if (exitCode == 2) { errorMsg = "ModNet: Game was launched with invalid command line parameters."; } if (exitCode == 3) { errorMsg = "ModNet: .links file should not exist upon startup!"; } if (exitCode == 4) { errorMsg = "ModNet: An Unhandled Error Appeared"; } if (_nfswPid != 0) { try { Process.GetProcessById(_nfswPid).Kill(); } catch { /* ignored */ } } DialogResult restartApp = MessageBox.Show(null, errorMsg + "\nWould you like to restart the launcher?", "GameLauncher", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (restartApp == DialogResult.Yes) { Application.Restart(); Application.ExitThread(); } else { CloseButton(null, null); } } }; } }
public static void HandleGameState(string uri, string serverreply, dynamic GET) { try { foreach (var param in GET) { dynamic value = GET[param]; QueryParams[param] = value; } GETContent = string.Join(";", QueryParams.Select(x => x.Key + "=" + x.Value).ToArray()); } catch (Exception Error) { LogToFileAddons.OpenLog("DISCORD GAME PRESENCE [GET]", null, Error, null, true); } finally { QueryParams.Clear(); } try { var SBRW_XML = new XmlDocument(); string[] splitted_uri = uri.Split('/'); String _serverPanelLink = InformationCache.SelectedServerJSON.webPanelUrl; String _serverWebsiteLink = InformationCache.SelectedServerJSON.homePageUrl; String _serverDiscordLink = InformationCache.SelectedServerJSON.discordUrl; if (!String.IsNullOrWhiteSpace(_serverWebsiteLink) || !String.IsNullOrWhiteSpace(_serverDiscordLink) || !String.IsNullOrWhiteSpace(_serverPanelLink)) { DiscordLauncherPresence.ButtonsList.Clear(); if (!String.IsNullOrWhiteSpace(_serverPanelLink)) { /* Let's format it now, if possible */ if (AntiCheat.persona_id == String.Empty || AntiCheat.persona_name == String.Empty) { DiscordLauncherPresence.ButtonsList.Add(new DiscordButton() { Label = "View Panel", Url = _serverPanelLink.Split(new string[] { "{sep}" }, StringSplitOptions.None)[0] }); } else { _serverPanelLink = _serverPanelLink.Replace("{personaid}", AntiCheat.persona_id); _serverPanelLink = _serverPanelLink.Replace("{personaname}", AntiCheat.persona_name); _serverPanelLink = _serverPanelLink.Replace("{sep}", String.Empty); DiscordLauncherPresence.ButtonsList.Add(new DiscordButton() { Label = "Check " + AntiCheat.persona_name + " on Panel", Url = _serverPanelLink }); } } else if (!String.IsNullOrWhiteSpace(_serverWebsiteLink) && _serverWebsiteLink != _serverDiscordLink) { DiscordLauncherPresence.ButtonsList.Add(new DiscordButton() { Label = "Website", Url = _serverWebsiteLink }); } if (!String.IsNullOrWhiteSpace(_serverDiscordLink)) { DiscordLauncherPresence.ButtonsList.Add(new DiscordButton() { Label = "Discord", Url = _serverDiscordLink }); } } if (uri == "/User/SecureLoginPersona") { LoggedPersonaId = GETContent.Split(';').Last().Split('=').Last(); canUpdateProfileField = true; } if (uri == "/User/SecureLogoutPersona") { PersonaId = String.Empty; PersonaName = String.Empty; PersonaLevel = String.Empty; PersonaAvatarId = String.Empty; PersonaCarId = String.Empty; PersonaCarName = String.Empty; LauncherRPC = String.Empty; PersonaTreasure = 0; } /* FIRST PERSONA EVER LOCALIZED IN CODE */ if (uri == "/User/GetPermanentSession") { /* Moved Statuses.cs Code to Gist | Check RemovedClasses.cs for Link */ //try { Statuses.getToken(); } catch { } SBRW_XML.LoadXml(serverreply); PersonaName = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/Name").InnerText.Replace("¤", "[S]"); PersonaLevel = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/Level").InnerText; PersonaAvatarId = "avatar_" + SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/IconIndex").InnerText; PersonaId = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/PersonaId").InnerText; /* Let's get rest of PERSONAIDs */ XmlNode UserInfo = SBRW_XML.SelectSingleNode("UserInfo"); XmlNodeList personas = UserInfo.SelectNodes("personas/ProfileData"); foreach (XmlNode node in personas) { PersonaIds.Add(node.SelectSingleNode("PersonaId").InnerText); } } /* CREATE/DELETE PERSONA Handler */ if (uri == "/DriverPersona/CreatePersona") { SBRW_XML.LoadXml(serverreply); PersonaIds.Add(SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText); } /* DRIVING CARNAME */ if (uri == "/DriverPersona/GetPersonaInfo" && canUpdateProfileField) { if (LoggedPersonaId == GETContent.Split(';').Last().Split('=').Last()) { SBRW_XML.LoadXml(serverreply); PersonaName = SBRW_XML.SelectSingleNode("ProfileData/Name").InnerText.Replace("¤", "[S]"); PersonaLevel = SBRW_XML.SelectSingleNode("ProfileData/Level").InnerText; PersonaAvatarId = "avatar_" + SBRW_XML.SelectSingleNode("ProfileData/IconIndex").InnerText; PersonaId = SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText; AntiCheat.persona_id = SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText; AntiCheat.persona_name = SBRW_XML.SelectSingleNode("ProfileData/Name").InnerText.Replace("¤", "[S]"); } } if (uri == "/events/gettreasurehunteventsession") { /* Treasure Hunt Streak/Gems From Server */ PersonaTreasure = 0; TotalTreasure = 15; THDay = 0; SBRW_XML.LoadXml(serverreply); var xPersonaTreasure = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/CoinsCollected").InnerText); for (var i = 0; i < 15; i++) { if ((xPersonaTreasure & (1 << (15 - i))) != 0) { PersonaTreasure++; } } TotalTreasure = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/NumCoins").InnerText); THDay = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/Streak").InnerText); } if (uri == "/events/notifycoincollected") { eventTerminatedManually = FunctionStatus.CanCloseGame = true; /* Actively Collection Treasure Hunt Gems */ PersonaTreasure++; if (PersonaTreasure != TotalTreasure) { _presence.Details = "Collecting Gems (" + PersonaTreasure + " of " + TotalTreasure + ")"; } else if (PersonaTreasure == TotalTreasure) { _presence.Details = "Finished Collecting Gems (" + PersonaTreasure + " of " + TotalTreasure + ")"; } _presence.State = LauncherRPC; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = "Treasure Hunt - Day: " + THDay, SmallImageKey = "gamemode_treasure" }; _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray(); if (DiscordLauncherPresence.Running()) { DiscordLauncherPresence.Client.SetPresence(_presence); } } /* IN SAFEHOUSE/FREEROAM */ if (uri == "/DriverPersona/UpdatePersonaPresence") { string UpdatePersonaPresenceParam = GETContent.Split(';').Last().Split('=').Last(); _presence.Assets = new Assets(); if (UpdatePersonaPresenceParam == "1") { _presence.Details = "Driving " + PersonaCarName; _presence.Assets.SmallImageText = "In-Freeroam"; _presence.Assets.SmallImageKey = "gamemode_freeroam"; _presence.State = LauncherRPC; eventTerminatedManually = FunctionStatus.CanCloseGame = true; inSafeHouse = false; } else { _presence.Details = "In Safehouse"; _presence.Assets.SmallImageText = "In-Safehouse"; _presence.Assets.SmallImageKey = "gamemode_safehouse"; _presence.State = serverName; eventTerminatedManually = FunctionStatus.CanCloseGame = false; inSafeHouse = true; } _presence.Assets.LargeImageText = PersonaName + " - Level: " + PersonaLevel; _presence.Assets.LargeImageKey = PersonaAvatarId; _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray(); if (DiscordLauncherPresence.Running()) { DiscordLauncherPresence.Client.SetPresence(_presence); } } if (uri == "/matchmaking/leavelobby" || uri == "/matchmaking/declineinvite") { /* Display Current Car in Freeroam */ _presence.Details = "Driving " + PersonaCarName; _presence.State = LauncherRPC; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = "In-Freeroam", SmallImageKey = "gamemode_freeroam" }; _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray(); if (uri == "/matchmaking/leavelobby") { AntiCheat.DisableChecks(false); } eventTerminatedManually = FunctionStatus.CanCloseGame = true; if (DiscordLauncherPresence.Running()) { DiscordLauncherPresence.Client.SetPresence(_presence); } } /* IN LOBBY */ else if (uri == "/matchmaking/acceptinvite") { /* Accept (Group/Search) Event Invite */ eventTerminatedManually = FunctionStatus.CanCloseGame = false; SBRW_XML.LoadXml(serverreply); XmlNode eventIdNode = SBRW_XML.SelectSingleNode("LobbyInfo/EventId"); if (eventIdNode != null) { EventID = Convert.ToInt32(eventIdNode.InnerText); _presence.Details = "In Lobby: " + EventsList.GetEventName(EventID); _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = LauncherRPC, SmallImageKey = EventsList.GetEventType(Convert.ToInt32(EventID)) }; _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray(); if (DiscordLauncherPresence.Running()) { DiscordLauncherPresence.Client.SetPresence(_presence); } } } else if (uri == "/matchmaking/joinqueueracenow") { eventTerminatedManually = FunctionStatus.CanCloseGame = true; /* Searching for Events */ _presence.Details = "Searching for Event"; _presence.State = LauncherRPC; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = "In-Freeroam", SmallImageKey = "gamemode_freeroam" }; _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray(); if (DiscordLauncherPresence.Running()) { DiscordLauncherPresence.Client.SetPresence(_presence); } } /* IN EVENT */ if (Regex.Match(uri, "/matchmaking/launchevent").Success) { /* Singleplayer Event (Launch) */ eventTerminatedManually = FunctionStatus.CanCloseGame = false; EventID = Convert.ToInt32(splitted_uri[3]); _presence.Details = "Loading Event: " + EventsList.GetEventName(EventID); _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = LauncherRPC, SmallImageKey = EventsList.GetEventType(EventID) }; _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray(); if (DiscordLauncherPresence.Running()) { DiscordLauncherPresence.Client.SetPresence(_presence); } } else if (uri == "/event/launched" && !eventTerminatedManually) { /* Once the Race Starts */ _presence.Details = "In Event: " + EventsList.GetEventName(EventID); _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = LauncherRPC, SmallImageKey = EventsList.GetEventType(EventID) }; _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray(); AntiCheat.event_id = EventID; AntiCheat.EnableChecks(); if (DiscordLauncherPresence.Running()) { DiscordLauncherPresence.Client.SetPresence(_presence); } } else if (uri == "/event/arbitration") { eventTerminatedManually = FunctionStatus.CanCloseGame = false; /* Once the Race Finishes */ _presence.Details = "Finished Event: " + EventsList.GetEventName(EventID); _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = LauncherRPC, SmallImageKey = EventsList.GetEventType(EventID) }; _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray(); AntiCheat.DisableChecks(true); if (DiscordLauncherPresence.Running()) { DiscordLauncherPresence.Client.SetPresence(_presence); } } /* Extending Safehouse */ if (uri.Contains("catalog") && inSafeHouse) { if (GETContent.Contains("categoryName=NFSW_NA_EP_VINYLS_Category")) { _presence.Details = "In Safehouse - Applying Vinyls"; } if (GETContent.Contains("clientProductType=PAINTS_BODY")) { _presence.Details = "In Safehouse - Applying Colors"; } if (GETContent.Contains("clientProductType=PERFORMANCEPART")) { _presence.Details = "In Safehouse - Applying Performance Parts"; } if (GETContent.Contains("clientProductType=VISUALPART")) { _presence.Details = "In Safehouse - Applying Visual Parts"; } if (GETContent.Contains("clientProductType=SKILLMODPART")) { _presence.Details = "In Safehouse - Applying Skillmods"; } if (GETContent.Contains("clientProductType=PRESETCAR")) { _presence.Details = "In Safehouse - Purchasing Car"; } if (GETContent.Contains("categoryName=BoosterPacks")) { _presence.Details = "In Safehouse - Opening Cardpacks"; } _presence.Assets = new Assets { SmallImageText = "In-Safehouse", SmallImageKey = "gamemode_safehouse" }; _presence.State = serverName; _presence.Assets.LargeImageText = PersonaName + " - Level: " + PersonaLevel; _presence.Assets.LargeImageKey = PersonaAvatarId; _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray(); if (DiscordLauncherPresence.Running()) { DiscordLauncherPresence.Client.SetPresence(_presence); } } /* CARS RELATED */ foreach (var single_personaId in PersonaIds) { if (Regex.Match(uri, "/personas/" + single_personaId + "/carslots", RegexOptions.IgnoreCase).Success) { carslotsXML = serverreply; SBRW_XML.LoadXml(carslotsXML); int DefaultID = Convert.ToInt32(SBRW_XML.SelectSingleNode("CarSlotInfoTrans/DefaultOwnedCarIndex").InnerText); int current = 0; XmlNode CarsOwnedByPersona = SBRW_XML.SelectSingleNode("CarSlotInfoTrans/CarsOwnedByPersona"); XmlNodeList OwnedCarTrans = CarsOwnedByPersona.SelectNodes("OwnedCarTrans"); foreach (XmlNode node in OwnedCarTrans) { if (DefaultID == current) { PersonaCarName = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes (CarsList.GetCarName(node.SelectSingleNode("CustomCar/Name").InnerText))); } current++; } } if (Regex.Match(uri, "/personas/" + single_personaId + "/defaultcar", RegexOptions.IgnoreCase).Success) { if (splitted_uri.Last() != "defaultcar") { string receivedId = splitted_uri.Last(); SBRW_XML.LoadXml(carslotsXML); XmlNode CarsOwnedByPersona = SBRW_XML.SelectSingleNode("CarSlotInfoTrans/CarsOwnedByPersona"); XmlNodeList OwnedCarTrans = CarsOwnedByPersona.SelectNodes("OwnedCarTrans"); foreach (XmlNode node in OwnedCarTrans) { if (receivedId == node.SelectSingleNode("Id").InnerText) { PersonaCarName = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes( CarsList.GetCarName(node.SelectSingleNode("CustomCar/Name").InnerText))); } } } } } } catch (Exception Error) { LogToFileAddons.OpenLog("DISCORD GAME PRESENCE", null, Error, null, true); } finally { GETContent = string.Empty; } }
public static void HandleGameState(string uri, string serverreply, string GET) { var SBRW_XML = new XmlDocument(); string[] splitted_uri = uri.Split('/'); String _serverPanelLink = MainScreen.json.webPanelUrl; String _serverWebsiteLink = MainScreen.json.homePageUrl; String _serverDiscordLink = MainScreen.json.discordUrl; if (!String.IsNullOrEmpty(_serverWebsiteLink) || !String.IsNullOrEmpty(_serverDiscordLink) || !String.IsNullOrEmpty(_serverPanelLink)) { MainScreen.ButtonsList.Clear(); if (!String.IsNullOrEmpty(_serverPanelLink)) { //Let's format it now, if possible if (AntiCheat.persona_id == String.Empty || AntiCheat.persona_name == String.Empty) { MainScreen.ButtonsList.Add(new DiscordButton() { Label = "View Panel", Url = _serverPanelLink.Split(new string[] { "{sep}" }, StringSplitOptions.None)[0] }); } else { _serverPanelLink = _serverPanelLink.Replace("{personaid}", AntiCheat.persona_id); _serverPanelLink = _serverPanelLink.Replace("{personaname}", AntiCheat.persona_name); _serverPanelLink = _serverPanelLink.Replace("{sep}", String.Empty); MainScreen.ButtonsList.Add(new DiscordButton() { Label = "Check " + AntiCheat.persona_name + " on Panel", Url = _serverPanelLink }); } } else if (!String.IsNullOrEmpty(_serverWebsiteLink) && _serverWebsiteLink != _serverDiscordLink) { MainScreen.ButtonsList.Add(new DiscordButton() { Label = "Website", Url = _serverWebsiteLink }); } if (!String.IsNullOrEmpty(_serverDiscordLink)) { MainScreen.ButtonsList.Add(new DiscordButton() { Label = "Discord", Url = _serverDiscordLink }); } } if (uri == "/events/gettreasurehunteventsession") { PersonaTreasure = 0; TotalTreasure = 15; TEDay = 0; SBRW_XML.LoadXml(serverreply); var xPersonaTreasure = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/CoinsCollected").InnerText); for (var i = 0; i < 15; i++) { if ((xPersonaTreasure & (1 << (15 - i))) != 0) { PersonaTreasure++; } } TotalTreasure = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/NumCoins").InnerText); TEDay = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/Streak").InnerText); } if (uri == "/events/notifycoincollected") { PersonaTreasure++; _presence.Details = "Collecting gems (" + PersonaTreasure + " of " + TotalTreasure + ")"; _presence.State = LauncherRPC; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = "Treasure Hunt - Day: " + TEDay, SmallImageKey = "gamemode_treasure" }; _presence.Buttons = MainScreen.ButtonsList.ToArray(); if (MainScreen.discordRpcClient != null) { MainScreen.discordRpcClient.SetPresence(_presence); } } if (uri == "/User/SecureLoginPersona") { LoggedPersonaId = GET.Split(';').Last().Split('=').Last(); canUpdateProfileField = true; Helper.personaid = LoggedPersonaId; } if (uri == "/User/SecureLogoutPersona") { PersonaId = String.Empty; PersonaName = String.Empty; PersonaLevel = String.Empty; PersonaAvatarId = String.Empty; PersonaCarId = String.Empty; PersonaCarName = String.Empty; LauncherRPC = String.Empty; PersonaTreasure = 0; } //FIRST PERSONA EVER LOCALIZED IN CODE if (uri == "/User/GetPermanentSession") { /* Moved Statuses.cs Code to Gist | Check RemovedClasses.cs for Link */ //try { Statuses.getToken(); } catch { } try { SBRW_XML.LoadXml(serverreply); PersonaName = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/Name").InnerText.Replace("¤", "[S]"); PersonaLevel = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/Level").InnerText; PersonaAvatarId = "avatar_" + SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/IconIndex").InnerText; PersonaId = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/PersonaId").InnerText; //Let's get rest of PERSONAIDs XmlNode UserInfo = SBRW_XML.SelectSingleNode("UserInfo"); XmlNodeList personas = UserInfo.SelectNodes("personas/ProfileData"); foreach (XmlNode node in personas) { PersonaIds.Add(node.SelectSingleNode("PersonaId").InnerText); } } catch (Exception) { } } //CREATE/DELETE PERSONA Handler if (uri == "/DriverPersona/CreatePersona") { SBRW_XML.LoadXml(serverreply); PersonaIds.Add(SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText); } //DRIVING CARNAME if (uri == "/DriverPersona/GetPersonaInfo" && canUpdateProfileField == true) { if (LoggedPersonaId == GET.Split(';').Last().Split('=').Last()) { SBRW_XML.LoadXml(serverreply); PersonaName = SBRW_XML.SelectSingleNode("ProfileData/Name").InnerText.Replace("¤", "[S]"); PersonaLevel = SBRW_XML.SelectSingleNode("ProfileData/Level").InnerText; PersonaAvatarId = "avatar_" + SBRW_XML.SelectSingleNode("ProfileData/IconIndex").InnerText; PersonaId = SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText; AntiCheat.persona_id = SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText; AntiCheat.persona_name = SBRW_XML.SelectSingleNode("ProfileData/Name").InnerText.Replace("¤", "[S]"); } } if (uri == "/matchmaking/leavelobby" || uri == "/matchmaking/declineinvite") { _presence.Details = "Driving " + PersonaCarName; _presence.State = LauncherRPC; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = "In-Freeroam", SmallImageKey = "gamemode_freeroam" }; _presence.Buttons = MainScreen.ButtonsList.ToArray(); if (MainScreen.discordRpcClient != null) { MainScreen.discordRpcClient.SetPresence(_presence); } eventTerminatedManually = true; FunctionStatus.CanCloseGame = true; } //IN LOBBY if (uri == "/matchmaking/acceptinvite") { FunctionStatus.CanCloseGame = false; SBRW_XML.LoadXml(serverreply); var eventIdNode = SBRW_XML.SelectSingleNode("LobbyInfo/EventId"); if (eventIdNode != null) { EventID = Convert.ToInt32(eventIdNode.InnerText); _presence.Details = "In Lobby: " + EventsList.GetEventName(EventID); _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = EventsList.GetEventName(Convert.ToInt32(EventID)), SmallImageKey = EventsList.GetEventType(Convert.ToInt32(EventID)) }; _presence.Buttons = MainScreen.ButtonsList.ToArray(); if (MainScreen.discordRpcClient != null) { MainScreen.discordRpcClient.SetPresence(_presence); } eventTerminatedManually = false; } } if (uri == "/matchmaking/joinqueueracenow") { _presence.Details = "Searching for event..."; _presence.State = LauncherRPC; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = "In-Freeroam", SmallImageKey = "gamemode_freeroam" }; _presence.Buttons = MainScreen.ButtonsList.ToArray(); if (MainScreen.discordRpcClient != null) { MainScreen.discordRpcClient.SetPresence(_presence); } eventTerminatedManually = true; } //IN SAFEHOUSE/FREEROAM if (uri == "/DriverPersona/UpdatePersonaPresence") { string UpdatePersonaPresenceParam = GET.Split(';').Last().Split('=').Last(); _presence.Assets = new Assets(); if (UpdatePersonaPresenceParam == "1") { _presence.Details = "Driving " + PersonaCarName; _presence.Assets.SmallImageText = "In-Freeroam"; _presence.Assets.SmallImageKey = "gamemode_freeroam"; _presence.State = LauncherRPC; FunctionStatus.CanCloseGame = true; } else { _presence.Details = "In Safehouse"; _presence.Assets.SmallImageText = "In-Safehouse"; _presence.Assets.SmallImageKey = "gamemode_safehouse"; FunctionStatus.CanCloseGame = false; _presence.State = serverName; } _presence.Assets.LargeImageText = PersonaName + " - Level: " + PersonaLevel; _presence.Assets.LargeImageKey = PersonaAvatarId; _presence.Buttons = MainScreen.ButtonsList.ToArray(); if (MainScreen.discordRpcClient != null) { MainScreen.discordRpcClient.SetPresence(_presence); } } //IN EVENT if (Regex.Match(uri, "/matchmaking/launchevent").Success) { FunctionStatus.CanCloseGame = false; EventID = Convert.ToInt32(splitted_uri[3]); _presence.Details = "In Event: " + EventsList.GetEventName(EventID); _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = EventsList.GetEventName(EventID), SmallImageKey = EventsList.GetEventType(EventID) }; _presence.Buttons = MainScreen.ButtonsList.ToArray(); if (MainScreen.discordRpcClient != null) { MainScreen.discordRpcClient.SetPresence(_presence); } eventTerminatedManually = false; } if (uri == "/event/arbitration") { _presence.Details = "In Event: " + EventsList.GetEventName(EventID); _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = EventsList.GetEventName(EventID), SmallImageKey = EventsList.GetEventType(EventID) }; _presence.Buttons = MainScreen.ButtonsList.ToArray(); AntiCheat.DisableChecks(); if (MainScreen.discordRpcClient != null) { MainScreen.discordRpcClient.SetPresence(_presence); } eventTerminatedManually = false; } if (uri == "/event/launched" && eventTerminatedManually == false) { _presence.Details = "In Event: " + EventsList.GetEventName(EventID); _presence.State = serverName; _presence.Assets = new Assets { LargeImageText = PersonaName + " - Level: " + PersonaLevel, LargeImageKey = PersonaAvatarId, SmallImageText = EventsList.GetEventName(EventID), SmallImageKey = EventsList.GetEventType(EventID) }; _presence.Buttons = MainScreen.ButtonsList.ToArray(); AntiCheat.event_id = EventID; AntiCheat.EnableChecks(); if (MainScreen.discordRpcClient != null) { MainScreen.discordRpcClient.SetPresence(_presence); } } //CARS RELATED foreach (var single_personaId in PersonaIds) { if (Regex.Match(uri, "/personas/" + single_personaId + "/carslots", RegexOptions.IgnoreCase).Success) { carslotsXML = serverreply; SBRW_XML.LoadXml(carslotsXML); int DefaultID = Convert.ToInt32(SBRW_XML.SelectSingleNode("CarSlotInfoTrans/DefaultOwnedCarIndex").InnerText); int current = 0; XmlNode CarsOwnedByPersona = SBRW_XML.SelectSingleNode("CarSlotInfoTrans/CarsOwnedByPersona"); XmlNodeList OwnedCarTrans = CarsOwnedByPersona.SelectNodes("OwnedCarTrans"); foreach (XmlNode node in OwnedCarTrans) { if (DefaultID == current) { PersonaCarName = CarsList.GetCarName(node.SelectSingleNode("CustomCar/Name").InnerText); } current++; } } if (Regex.Match(uri, "/personas/" + single_personaId + "/defaultcar", RegexOptions.IgnoreCase).Success) { if (splitted_uri.Last() != "defaultcar") { string receivedId = splitted_uri.Last(); SBRW_XML.LoadXml(carslotsXML); XmlNode CarsOwnedByPersona = SBRW_XML.SelectSingleNode("CarSlotInfoTrans/CarsOwnedByPersona"); XmlNodeList OwnedCarTrans = CarsOwnedByPersona.SelectNodes("OwnedCarTrans"); foreach (XmlNode node in OwnedCarTrans) { if (receivedId == node.SelectSingleNode("Id").InnerText) { PersonaCarName = CarsList.GetCarName(node.SelectSingleNode("CustomCar/Name").InnerText); } } } } } }
private void Start() { instance = this; }
private async Task <Response> ProxyRequest(NancyContext context, CancellationToken cancellationToken) { string path = Strings.Encode(context.Request.Path); string method = Strings.Encode(context.Request.Method.ToUpperInvariant()); if (!path.StartsWith("/nfsw/Engine.svc")) { Log.Error("PROXY HANDLER: Invalid Request: " + path); return("SBRW Launcher Version: " + Theming.PrivacyRPCBuild + "\nBuild Date: " + InsiderInfo.BuildNumberOnly()); } else { path = path.Substring("/nfsw/Engine.svc".Length); UrlFlurl resolvedUrl = new UrlFlurl(ServerProxy.Instance.GetServerUrl()).AppendPathSegment(path, false); foreach (var queryParamName in context.Request.Query) { resolvedUrl = resolvedUrl.SetQueryParam(queryParamName, context.Request.Query[queryParamName], NullValueHandling.Ignore); } IFlurlRequest request = resolvedUrl.AllowAnyHttpStatus(); foreach (var header in context.Request.Headers) { /* Don't send Content-Length for GET requests - HeyItsLeo */ if (method == "GET" && header.Key.ToLowerInvariant() == "content-length") { continue; } request = request.WithHeader (header.Key, (header.Key == "Host") ? resolvedUrl.ToUri().Host : ((header.Value != null) ? header.Value.First() : string.Empty)); } string requestBody = (method != "GET") ? context.Request.Body.AsString(UTF8) : string.Empty; CommunicationLog.RecordEntry(ServerProxy.Instance.GetServerName(), "SERVER", CommunicationLogEntryType.Request, new CommunicationLogRequest(requestBody, resolvedUrl.ToString(), method)); IFlurlResponse responseMessage; if (path == "/event/arbitration" && !string.IsNullOrWhiteSpace(requestBody)) { requestBody = Strings.Encode( requestBody.Replace("</TopSpeed>", "</TopSpeed><Konami>" + AntiCheat.Get_Cheat_Status() + "</Konami>")); foreach (var header in context.Request.Headers) { if (header.Key.ToLowerInvariant() == "content-length") { int KonamiCode = Convert.ToInt32(header.Value.First()) + ("<Konami>" + AntiCheat.Get_Cheat_Status() + "</Konami>").Length; request = request.WithHeader(header.Key, KonamiCode); } } } switch (method) { case "GET": responseMessage = await request.GetAsync(cancellationToken); break; case "POST": responseMessage = await request.PostAsync(new CapturedStringContent(requestBody), cancellationToken); break; case "PUT": responseMessage = await request.PutAsync(new CapturedStringContent(requestBody), cancellationToken); break; case "DELETE": responseMessage = await request.DeleteAsync(cancellationToken); break; default: Log.Error("PROXY HANDLER: Cannot handle Request Method " + method); responseMessage = null; break; } string responseBody = Strings.Encode(await responseMessage.GetStringAsync()); int statusCode = responseMessage.StatusCode; DiscordGamePresence.HandleGameState(path, responseBody, context.Request.Query); TextResponse Response = new TextResponse(responseBody, responseMessage.ResponseMessage.Content.Headers.ContentType?.MediaType ?? "application/xml;charset=UTF-8") { StatusCode = (HttpStatusCode)statusCode }; CommunicationLog.RecordEntry(ServerProxy.Instance.GetServerName(), "SERVER", CommunicationLogEntryType.Response, new CommunicationLogResponse(responseBody, resolvedUrl.ToString(), method)); return(Response); } }
public void ProcessPacket(int packetID, Player player) { switch ((PacketID)packetID) { case PacketID.entityUpdate: #region entity update var entityUpdate = new EntityUpdate(player.reader); string ACmessage = AntiCheat.Inspect(entityUpdate); if (ACmessage != "ok") { var kickMessage = new ChatMessage() { message = "illegal " + ACmessage }; kickMessage.Write(player.writer, true); Console.WriteLine(player.entityData.name + " kicked for illegal " + kickMessage.message); Thread.Sleep(100); //thread is about to run out anyway so np Kick(player); return; } if (entityUpdate.name != null) { Announce.Join(entityUpdate.name, player.entityData.name, players); } entityUpdate.entityFlags |= 1 << 5; //enable friendly fire flag for pvp if (!player.entityData.IsEmpty) { entityUpdate.Filter(player.entityData); } if (!entityUpdate.IsEmpty) { entityUpdate.Broadcast(players, 0); if (entityUpdate.HP == 0 && player.entityData.HP > 0) { Tomb.Show(player).Broadcast(players, 0); } else if (player.entityData.HP == 0 && entityUpdate.HP > 0) { Tomb.Hide(player).Broadcast(players, 0); } entityUpdate.Merge(player.entityData); } break; #endregion case PacketID.entityAction: #region action EntityAction entityAction = new EntityAction(player.reader); switch (entityAction.type) { case ActionType.talk: break; case ActionType.staticInteraction: //var staticEntity = new StaticEntity(); //staticEntity.chunkX = entityAction.chunkX; //staticEntity.chunkY = entityAction.chunkY; //staticEntity.id = entityAction.index; //staticEntity.type = 0; //staticEntity.position = player.entityData.position; //staticEntity.rotation = 0; //staticEntity.size.x = 2; //staticEntity.size.y = 1; //staticEntity.size.z = 1; //staticEntity.closed = 0; //staticEntity.time = 1000; //staticEntity.guid = player.entityData.guid; //var serverUpdate = new ServerUpdate(); //serverUpdate.statics.Add(staticEntity); //serverUpdate.Send(players, 0); break; case ActionType.pickup: //shouldn't occur since item drops are disabled break; case ActionType.drop: //send item back to dropper because dropping is disabled to prevent chatspam var pickup = new ServerUpdate.Pickup() { guid = player.entityData.guid, item = entityAction.item }; var serverUpdate6 = new ServerUpdate(); serverUpdate6.pickups.Add(pickup); serverUpdate6.Write(player.writer, true); break; case ActionType.callPet: var petItem = player.entityData.equipment[(int)Equipment.pet]; var pet = new EntityUpdate() { guid = 2000 + player.entityData.guid, position = player.entityData.position, hostility = (int)Hostility.pet, entityType = 28, appearance = player.entityData.appearance, HP = 999, parentOwner = 3000 + (long)player.entityData.guid, equipment = player.entityData.equipment, name = "doppelganger" }; pet.Broadcast(players, 0); pet = new EntityUpdate() { guid = 3000 + player.entityData.guid, position = player.entityData.position, hostility = (int)Hostility.pet, entityType = 28, mode = 106, appearance = player.entityData.appearance, HP = 999, parentOwner = (long)player.entityData.guid, equipment = player.entityData.equipment, name = "doppelganger" }; pet.Broadcast(players, 0); break; default: Console.WriteLine("unknown action (" + entityAction.type + ") by " + player.entityData.name); break; } break; #endregion case PacketID.hit: #region hit var hit = new Hit(player.reader); hit.damage *= 0.75f; if (players.ContainsKey(hit.target)) { var serverUpdate7 = new ServerUpdate(); serverUpdate7.hits.Add(hit); serverUpdate7.Broadcast(players, player.entityData.guid); } break; #endregion case PacketID.passiveProc: #region passiveProc var passiveProc = new PassiveProc(player.reader); var serverUpdate8 = new ServerUpdate(); serverUpdate8.passiveProcs.Add(passiveProc); serverUpdate8.Broadcast(players, player.entityData.guid); switch (passiveProc.type) { case ProcType.warFrenzy: case ProcType.camouflage: case ProcType.fireSpark: case ProcType.intuition: case ProcType.elusivenes: case ProcType.swiftness: //nothing particular yet break; case ProcType.manashield: var chatMessage6m = new ChatMessage() { message = string.Format("manashield: {0}", passiveProc.modifier), sender = 0 }; chatMessage6m.Write(player.writer, true); break; case ProcType.bulwalk: var chatMessage6b = new ChatMessage() { message = string.Format("bulwalk: {0}% dmg reduction", 1.0f - passiveProc.modifier), sender = 0 }; chatMessage6b.Write(player.writer, true); break; case ProcType.poison: if (players.ContainsKey(passiveProc.target)) //in case target is a tomb or sth { var poisonDmg = new Hit() { attacker = passiveProc.source, target = passiveProc.target, damage = passiveProc.modifier, position = players[passiveProc.target].entityData.position, type = DamageType.normal }; var poisonTick = new ServerUpdate(); poisonTick.hits.Add(poisonDmg); Poison(poisonTick, passiveProc.duration); } break; default: Console.WriteLine("unknown passiveProc.type: " + passiveProc.type); break; } break; #endregion case PacketID.shoot: #region shoot var shoot = new Shoot(player.reader); var serverUpdate9 = new ServerUpdate(); serverUpdate9.shoots.Add(shoot); serverUpdate9.Broadcast(players, player.entityData.guid); break; #endregion case PacketID.chat: #region chat var chatMessage = new ChatMessage(player.reader) { sender = player.entityData.guid }; if (chatMessage.message.StartsWith("/")) { string parameter = ""; string command = chatMessage.message.Substring(1); if (chatMessage.message.Contains(" ")) { int spaceIndex = command.IndexOf(" "); parameter = command.Substring(spaceIndex + 1); command = command.Substring(0, spaceIndex); } Command.TCP(command, parameter, player); //wip } else { chatMessage.Broadcast(players, 0); Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("#" + player.entityData.guid + " " + player.entityData.name + ": "); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(chatMessage.message); } break; #endregion case PacketID.chunk: #region chunk var chunk = new Chunk(player.reader); break; #endregion case PacketID.sector: #region sector var sector = new Chunk(player.reader); break; #endregion case PacketID.version: #region version var version = new ProtocolVersion(player.reader); if (version.version != 3) { version.version = 3; version.Write(player.writer, true); player.tcp.Close(); } else { player.entityData.guid = guidCounter; guidCounter++; var join = new Join() { guid = player.entityData.guid, junk = new byte[0x1168] }; join.Write(player.writer, true); var mapSeed = new MapSeed() { seed = Database.mapseed }; mapSeed.Write(player.writer, true); foreach (Player p in players.Values) { p.entityData.Write(player.writer); } players.Add(player.entityData.guid, player); Task.Delay(10000).ContinueWith(t => Load_world_delayed(player)); //WIP, causes crash when player disconnects before executed } break; #endregion default: Console.WriteLine("unknown packet ID: " + packetID); //causes some console spam, but allows resyncing with the player without DC or crash break; } }
public void ProcessDatagram(byte[] datagram, Player source) { switch ((DatagramID)datagram[0]) { case DatagramID.entityUpdate: #region entityUpdate var entityUpdate = new EntityUpdate(datagram); string ACmessage = AntiCheat.Inspect(entityUpdate); if (ACmessage != "ok") { //var kickMessage = new ChatMessage() { // message = "illegal " + ACmessage //}; //kickMessage.Write(player.writer, true); //Console.WriteLine(player.entityData.name + " kicked for illegal " + kickMessage.message); //Thread.Sleep(100); //thread is about to run out anyway so np //Kick(player); //return; } if (entityUpdate.name != null) { //Announce.Join(entityUpdate.name, player.entityData.name, players); } entityUpdate.entityFlags |= 1 << 5; //enable friendly fire flag for pvp if (!source.entityData.IsEmpty) //dont filter the first packet //entityUpdate.Filter(player.entityData); { } if (!entityUpdate.IsEmpty) { //entityUpdate.Broadcast(players, 0); BroadcastUDP(entityUpdate.Data, source); if (entityUpdate.HP == 0 && source.entityData.HP > 0) { BroadcastUDP(Tomb.Show(source).Data); } else if (source.entityData.HP == 0 && entityUpdate.HP > 0) { BroadcastUDP(Tomb.Hide(source).Data); } entityUpdate.Merge(source.entityData); } break; #endregion case DatagramID.attack: #region attack var attack = new Attack(datagram); source.lastTarget = attack.Target; if (players.ContainsKey(attack.Target)) //in case the target is a tombstone { SendUDP(datagram, players[attack.Target]); } break; #endregion case DatagramID.shoot: #region shoot var shoot = new Resources.Datagram.Shoot(datagram); BroadcastUDP(datagram, source); //pass to all players except source break; #endregion case DatagramID.proc: #region proc var proc = new Proc(datagram); switch (proc.Type) { case ProcType.bulwalk: SendUDP(new Chat(string.Format("bulwalk: {0}% dmg reduction", 1.0f - proc.Modifier)).data, source); break; case ProcType.poison: var poisonTickDamage = new Attack() { Damage = proc.Modifier, Target = proc.Target }; var target = players[poisonTickDamage.Target]; Func <bool> tick = () => { bool f = players.ContainsKey(poisonTickDamage.Target); if (f) { SendUDP(poisonTickDamage.data, target); } return(!f); }; Tools.DoLater(tick, 500, 7); //Poison(players[proc.Target], poisonTickDamage); break; case ProcType.manashield: SendUDP(new Chat(string.Format("manashield: {0}", proc.Modifier)).data, source); break; case ProcType.warFrenzy: case ProcType.camouflage: case ProcType.fireSpark: case ProcType.intuition: case ProcType.elusivenes: case ProcType.swiftness: break; default: break; } BroadcastUDP(datagram, source); //pass to all players except source break; #endregion case DatagramID.chat: #region chat var chat = new Chat(datagram); if (chat.Text.StartsWith("/")) { Command.Server(chat.Text, source, this); //wip } else { Console.ForegroundColor = ConsoleColor.Cyan; Console.Write(players[chat.Sender].entityData.name + ": "); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(chat.Text); BroadcastUDP(datagram, null, true); //pass to all players } break; #endregion case DatagramID.interaction: #region interaction var interaction = new Interaction(datagram); BroadcastUDP(datagram, source); //pass to all players except source break; #endregion case DatagramID.connect: #region connect var connect = new Connect(datagram) { Guid = (ushort)source.entityData.guid, Mapseed = Database.mapseed }; SendUDP(connect.data, source); foreach (Player player in players.Values) { if (player.playing) { SendUDP(player.entityData.Data, source); } } source.playing = true; //Task.Delay(100).ContinueWith(t => Load_world_delayed(source)); //WIP, causes crash when player disconnects before executed Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(source.IpEndPoint.Address + " is now playing"); break; #endregion case DatagramID.disconnect: #region disconnect var disconnect = new Disconnect(datagram); source.playing = false; BroadcastUDP(datagram, source, true); source.entityData = new EntityUpdate() { guid = source.entityData.guid }; Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(source.IpEndPoint.Address + " is now lurking"); break; #endregion case DatagramID.specialMove: #region specialMove var specialMove = new SpecialMove(datagram); switch (specialMove.Id) { case SpecialMoveID.taunt: var targetGuid = specialMove.Guid; specialMove.Guid = (ushort)source.entityData.guid; SendUDP(specialMove.data, players[targetGuid]); break; case SpecialMoveID.cursedArrow: case SpecialMoveID.arrowRain: case SpecialMoveID.shrapnel: case SpecialMoveID.smokeBomb: case SpecialMoveID.iceWave: case SpecialMoveID.confusion: case SpecialMoveID.shadowStep: BroadcastUDP(specialMove.data, source); break; default: break; } break; #endregion case DatagramID.dummy: break; default: Console.WriteLine("unknown DatagramID: " + datagram[0]); break; } }