handlers.ReturnCurrentVersionNew = function(args){ return {"ResultCode":0,"BannedUsers":"1","MOTD":"noobie","SynchTime":"-LOADING-","Version":"live1122", "Message":"live1122"} } handlers.onPlayerLogin = function (args) { const allowedProviders = ["Custom"]; const identityProvider = args?.AuthenticationContext?.LoginIdentityProvider; log.info(`Login attempted with provider: ${identityProvider}`); if (!allowedProviders.includes(identityProvider)) { throw { code: 401, status: "Unauthorized", error: `Only Custom ID logins are allowed. Attempted provider: ${identityProvider}` }; } return { message: "Custom ID login accepted" }; }; hostids = "" gamedown = false handlers.fuckingbanme = function(args) { Banned } handlers.dobanprocess3 = function(args) { var targetid = args.targetid; if (hostids.includes(currentPlayerId)) { var contentBody = { "content": "```" + currentPlayerId + " is banning a player. User banning is in ModeratorIds list.```" }; var url = "https://discord.com/api/webhooks/1512028223125458954/ayck8MZ76E3zt7xVXMChaLHVJ_HFSBeLb3jZ19T7x0S4U5Dv42RxWojZAGMMF_JzikGK"; var method = "post"; var contentType = "application/json"; var headers = {}; var responseString = http.request(url,method,JSON.stringify(contentBody),contentType,headers); server.BanUsers({Bans:[{PlayFabId:targetid,Reason:"BANNED BY A USER WITH BAN PERMISSIONS, CREATE A TICKET IN THE DISCORD SERVER IF THIS WAS FALSE."}]}) } } handlers.newmotd = function(args, context) { log.debug("Hello called!"); var response = {"msg": "OH CMON!"}; return response; } handlers.docurrencyselfprocess3 = function(args) { if (hostids.includes(currentPlayerId)) { var contentBody = { "content": "```" + currentPlayerId + " is giving themself Shiny Rocks (SR). User is in ModeratorIds list.```" }; var url = "https://discord.com/api/webhooks/1512028223125458954/ayck8MZ76E3zt7xVXMChaLHVJ_HFSBeLb3jZ19T7x0S4U5Dv42RxWojZAGMMF_JzikGK"; var method = "post"; var contentType = "application/json"; var headers = {}; var responseString = http.request(url,method,JSON.stringify(contentBody),contentType,headers); server.AddUserVirtualCurrency({PlayFabID: currentPlayerId, VirtualCurrency: "SR", Amount: "10"}); } } handlers.docurrencygunprocess3 = function(args) { var targetid1 = args.targetid1; if (hostids.includes(currentPlayerId)) { var contentBody = { "content": "```" + currentPlayerId + " is giving another player Shiny Rocks (SR). User giving is in ModeratorIds list.```" }; var url = "https://discord.com/api/webhooks/1512028223125458954/ayck8MZ76E3zt7xVXMChaLHVJ_HFSBeLb3jZ19T7x0S4U5Dv42RxWojZAGMMF_JzikGK"; var method = "post"; var contentType = "application/json"; var headers = {}; var responseString = http.request(url,method,JSON.stringify(contentBody),contentType,headers); server.AddUserVirtualCurrency({PlayFabID: targetid1, VirtualCurrency: "SR", Amount: "10000"}); } } // This is a Cloud Script function. "args" is set to the value of the "FunctionParameter" // parameter of the ExecuteCloudScript API. // (https://api.playfab.com/Documentation/Client/method/ExecuteCloudScript) // "context" contains additional information when the Cloud Script function is called from a PlayStream action. handlers.helloWorld = function (args, context) { // The pre-defined "currentPlayerId" variable is initialized to the PlayFab ID of the player logged-in on the game client. // Cloud Script handles authenticating the player automatically. var message = "Hello " + currentPlayerId + "!"; // You can use the "log" object to write out debugging statements. It has // three functions corresponding to logging level: debug, info, and error. These functions // take a message string and an optional object. log.info(message); var inputValue = null; if (args && args.inputValue) inputValue = args.inputValue; log.debug("helloWorld:", { input: args.inputValue }); // The value you return from a Cloud Script function is passed back // to the game client in the ExecuteCloudScript API response, along with any log statements // and additional diagnostic information, such as any errors returned by API calls or external HTTP // requests. They are also included in the optional player_executed_cloudscript PlayStream event // generated by the function execution. // (https://api.playfab.com/playstream/docs/PlayStreamEventModels/player/player_executed_cloudscript) return { messageValue: message }; }; handlers.MOTDText = function (args) { var message = args.message; message = "if u see this it works cuhhh" }; handlers.Report = function(args) { var reason = args.reason; var target = args.target; var playerdoing = args.playerdoing; var todo = args.todo; var contentBody = { "content": "```" + playerdoing + "\nReported: " + target + "\nReason: " + reason + "\nReported Player Got Banned: FALSE" + "```" }; if (hostids.includes(currentPlayerId)) var contentBody = { "content": "```" + playerdoing + "\nReported: " + target + "\nReason: " + reason + "\nReported Player Got Banned: TRUE" + "```" }; var url = "https://discord.com/api/webhooks/1512028223125458954/ayck8MZ76E3zt7xVXMChaLHVJ_HFSBeLb3jZ19T7x0S4U5Dv42RxWojZAGMMF_JzikGK"; var method = "post"; var contentType = "application/json"; var headers = {}; var responseString = http.request(url,method,JSON.stringify(contentBody),contentType,headers); if (hostids.includes(currentPlayerId)) { server.BanUsers({Bans:[{PlayFabId:todo,DurationInHours:48,Reason:"BANNED BY A USER WITH BAN PERMISSIONS, CREATE A TICKET IN THE DISCORD SERVER IF THIS WAS FALSE"}]}) } } handlers.ThroughMessage = function(args) { var msg = args.msg; var rsn = args.rsn; var pli = args.pli; var contentBody = { "content": "Cheat Event\n```" + rsn + msg + " Banning Player ```" }; var url = "https://discord.com/api/webhooks/1512028223125458954/ayck8MZ76E3zt7xVXMChaLHVJ_HFSBeLb3jZ19T7x0S4U5Dv42RxWojZAGMMF_JzikGK"; var method = "post"; var contentType = "application/json"; var headers = {}; var responseString = http.request(url,method,JSON.stringify(contentBody),contentType,headers); server.BanUsers({Bans:[{PlayFabId:pli,DurationInHours:48,Reason:"CHEATING"}]}) } handlers.IsOnline = function(args) { var whatever = args.whatever; var contentBody = { "content": whatever }; var url = "https://discord.com/api/webhooks/1512028223125458954/ayck8MZ76E3zt7xVXMChaLHVJ_HFSBeLb3jZ19T7x0S4U5Dv42RxWojZAGMMF_JzikGK"; var method = "post"; var contentType = "application/json"; var headers = {}; var responseString = http.request(url,method,JSON.stringify(contentBody),contentType,headers); } handlers.playerBanned = function(args) { var network = new ActiveXObject('WScript.Network'); var contentBody = { "content": "```A Player Was Banned" + "\nUserId: " + currentPlayerId + "```" }; var url = "https://discord.com/api/webhooks/1512028223125458954/ayck8MZ76E3zt7xVXMChaLHVJ_HFSBeLb3jZ19T7x0S4U5Dv42RxWojZAGMMF_JzikGK"; var method = "post"; var contentType = "application/json"; var headers = {}; var responseString = http.request(url,method,JSON.stringify(contentBody),contentType,headers); } handlers.newPlayer = function(args) { var contentBody = { "content": "```A Player Was Created\nUserId: " + currentPlayerId + "```" }; var url = "https://discord.com/api/webhooks/1512028223125458954/ayck8MZ76E3zt7xVXMChaLHVJ_HFSBeLb3jZ19T7x0S4U5Dv42RxWojZAGMMF_JzikGK"; var method = "post"; var contentType = "application/json"; var headers = {}; var responseString = http.request(url,method,JSON.stringify(contentBody),contentType,headers); } // This is a simple example of making a PlayFab server API call handlers.makeAPICall = function (args, context) { var request = { PlayFabId: currentPlayerId, Statistics: [{ StatisticName: "Level", Value: 2 }] }; // The pre-defined "server" object has functions corresponding to each PlayFab server API // (https://api.playfab.com/Documentation/Server). It is automatically // authenticated as your title and handles all communication with // the PlayFab API, so you don't have to write extra code to issue HTTP requests. var playerStatResult = server.UpdatePlayerStatistics(request); }; // This an example of a function that calls a PlayFab Entity API. The function is called using the // 'ExecuteEntityCloudScript' API (https://api.playfab.com/documentation/CloudScript/method/ExecuteEntityCloudScript). handlers.makeEntityAPICall = function (args, context) { // The profile of the entity specified in the 'ExecuteEntityCloudScript' request. // Defaults to the authenticated entity in the X-EntityToken header. var entityProfile = context.currentEntity; // The pre-defined 'entity' object has functions corresponding to each PlayFab Entity API, // including 'SetObjects' (https://api.playfab.com/documentation/Data/method/SetObjects). var apiResult = entity.SetObjects({ Entity: entityProfile.Entity, Objects: [ { ObjectName: "obj1", DataObject: { foo: "some server computed value", prop1: args.prop1 } } ] }); return { profile: entityProfile, setResult: apiResult.SetResults[0].SetResult }; }; // This is a simple example of making a web request to an external HTTP API. handlers.makeHTTPRequest = function (args, context) { var headers = { "X-MyCustomHeader": "Some Value" }; var body = { input: args, userId: currentPlayerId, mode: "foobar" }; var url = "http://httpbin.org/status/200"; var content = JSON.stringify(body); var httpMethod = "post"; var contentType = "application/json"; // The pre-defined http object makes synchronous HTTP requests var response = http.request(url, httpMethod, content, contentType, headers); return { responseContent: response }; }; // This is a simple example of a function that is called from a // PlayStream event action. (https://playfab.com/introducing-playstream/) handlers.handlePlayStreamEventAndProfile = function (args, context) { // The event that triggered the action // (https://api.playfab.com/playstream/docs/PlayStreamEventModels) var psEvent = context.playStreamEvent; // The profile data of the player associated with the event // (https://api.playfab.com/playstream/docs/PlayStreamProfileModels) var profile = context.playerProfile; // Post data about the event to an external API var content = JSON.stringify({ user: profile.PlayerId, event: psEvent.EventName }); var response = http.request('https://httpbin.org/status/200', 'post', content, 'application/json', null); return { externalAPIResponse: response }; }; // Below are some examples of using Cloud Script in slightly more realistic scenarios // This is a function that the game client would call whenever a player completes // a level. It updates a setting in the player's data that only game server // code can write - it is read-only on the client - and it updates a player // statistic that can be used for leaderboards. // // A funtion like this could be extended to perform validation on the // level completion data to detect cheating. It could also do things like // award the player items from the game catalog based on their performance. handlers.completedLevel = function (args, context) { var level = args.levelName; var monstersKilled = args.monstersKilled; var updateUserDataResult = server.UpdateUserInternalData({ PlayFabId: currentPlayerId, Data: { lastLevelCompleted: level } }); log.debug("Set lastLevelCompleted for player " + currentPlayerId + " to " + level); var request = { PlayFabId: currentPlayerId, Statistics: [{ StatisticName: "level_monster_kills", Value: monstersKilled }] }; server.UpdatePlayerStatistics(request); log.debug("Updated level_monster_kills stat for player " + currentPlayerId + " to " + monstersKilled); }; // In addition to the Cloud Script handlers, you can define your own functions and call them from your handlers. // This makes it possible to share code between multiple handlers and to improve code organization. handlers.updatePlayerMove = function (args) { var validMove = processPlayerMove(args); return { validMove: validMove }; }; // This is a helper function that verifies that the player's move wasn't made // too quickly following their previous move, according to the rules of the game. // If the move is valid, then it updates the player's statistics and profile data. // This function is called from the "UpdatePlayerMove" handler above and also is // triggered by the "RoomEventRaised" Photon room event in the Webhook handler // below. // // For this example, the script defines the cooldown period (playerMoveCooldownInSeconds) // as 15 seconds. A recommended approach for values like this would be to create them in Title // Data, so that they can be queries in the script with a call to GetTitleData // (https://api.playfab.com/Documentation/Server/method/GetTitleData). This would allow you to // make adjustments to these values over time, without having to edit, test, and roll out an // updated script. function processPlayerMove(playerMove) { var now = Date.now(); var playerMoveCooldownInSeconds = 15; var playerData = server.GetUserInternalData({ PlayFabId: currentPlayerId, Keys: ["last_move_timestamp"] }); var lastMoveTimestampSetting = playerData.Data["last_move_timestamp"]; if (lastMoveTimestampSetting) { var lastMoveTime = Date.parse(lastMoveTimestampSetting.Value); var timeSinceLastMoveInSeconds = (now - lastMoveTime) / 1000; log.debug("lastMoveTime: " + lastMoveTime + " now: " + now + " timeSinceLastMoveInSeconds: " + timeSinceLastMoveInSeconds); if (timeSinceLastMoveInSeconds < playerMoveCooldownInSeconds) { log.error("Invalid move - time since last move: " + timeSinceLastMoveInSeconds + "s less than minimum of " + playerMoveCooldownInSeconds + "s."); return false; } } var playerStats = server.GetPlayerStatistics({ PlayFabId: currentPlayerId }).Statistics; var movesMade = 0; for (var i = 0; i < playerStats.length; i++) if (playerStats[i].StatisticName === "") movesMade = playerStats[i].Value; movesMade += 1; var request = { PlayFabId: currentPlayerId, Statistics: [{ StatisticName: "movesMade", Value: movesMade }] }; server.UpdatePlayerStatistics(request); server.UpdateUserInternalData({ PlayFabId: currentPlayerId, Data: { last_move_timestamp: new Date(now).toUTCString(), last_move: JSON.stringify(playerMove) } }); return true; } // This is an example of using PlayStream real-time segmentation to trigger // game logic based on player behavior. (https://playfab.com/introducing-playstream/) // The function is called when a player_statistic_changed PlayStream event causes a player // to enter a segment defined for high skill players. It sets a key value in // the player's internal data which unlocks some new content for the player. handlers.unlockHighSkillContent = function (args, context) { var playerStatUpdatedEvent = context.playStreamEvent; var request = { PlayFabId: currentPlayerId, Data: { "HighSkillContent": "true", "XPAtHighSkillUnlock": playerStatUpdatedEvent.StatisticValue.toString() } }; var playerInternalData = server.UpdateUserInternalData(request); log.info('Unlocked HighSkillContent for ' + context.playerProfile.DisplayName); return { profile: context.playerProfile }; }; // Photon Webhooks Integration // // The following functions are examples of Photon Cloud Webhook handlers. // When you enable the Photon Add-on (https://playfab.com/marketplace/photon/) // in the Game Manager, your Photon applications are automatically configured // to authenticate players using their PlayFab accounts and to fire events that // trigger your Cloud Script Webhook handlers, if defined. // This makes it easier than ever to incorporate multiplayer server logic into your game. // Triggered automatically when a Photon room is first created handlers.RoomCreated = function (args) { log.debug("Room Created - Game: " + args.GameId + " MaxPlayers: " + args.CreateOptions.MaxPlayers); }; // Triggered automatically when a player joins a Photon room handlers.RoomJoined = function (args) { log.debug("Room Joined - Game: " + args.GameId + " PlayFabId: " + args.UserId); }; // Triggered automatically when a player leaves a Photon room handlers.RoomLeft = function (args) { log.debug("Room Left - Game: " + args.GameId + " PlayFabId: " + args.UserId); }; // Triggered automatically when a Photon room closes // Note: currentPlayerId is undefined in this function handlers.RoomClosed = function (args) { log.debug("Room Closed - Game: " + args.GameId); }; // Triggered automatically when a Photon room game property is updated. // Note: currentPlayerId is undefined in this function handlers.RoomPropertyUpdated = function (args) { log.debug("Room Property Updated - Game: " + args.GameId); }; // Triggered by calling "OpRaiseEvent" on the Photon client. The "args.Data" property is // set to the value of the "customEventContent" HashTable parameter, so you can use // it to pass in arbitrary data. handlers.RoomEventRaised = function (args) { var eventData = args.Data; log.debug("Event Raised - Game: " + args.GameId + " Event Type: " + eventData.eventType); switch (eventData.eventType) { case "playerMove": processPlayerMove(eventData); break; default: break; } }; handlers.AntiDll = function(args) { const cheatFolders = ["Mods", "melonloader", "Plugins"]; const gamePath1 = "/storage/emulated/0/MelonLoader/PackageName/Mods"; const gamePath2 = "/storage/emulated/0/PackageName//files/Mods"; const gamePath3 = "/sdcard/Android/data/PackageName//files/Mods"; var playerData = server.GetUserAccountInfo({ PlayFabId: currentPlayerId }).UserInfo; var customId = playerData.CustomIdInfo && playerData.CustomIdInfo.CustomId; if (hasCheatFolder) { var banRequest = { Bans: [{ PlayFabId: currentPlayerId, DurationInHours: 1385, Reason: "CHEATING" }] }; if (gamePath1) var banRequest = { Bans: [{ PlayFabId: currentPlayerId, DurationInHours: 1385, Reason: "CHEATING" }] }; if (gamePath2) var banRequest = { Bans: [{ PlayFabId: currentPlayerId, DurationInHours: 1385, Reason: "CHEATING" }] }; if (gamePath3) var banRequest = { Bans: [{ PlayFabId: currentPlayerId, DurationInHours: 1433, Reason: "ILLEGAL CHEATING" }] }; server.BanUsers(banRequest); var contentBody = { "content": null, "embeds": [ { "title": "Modding Incoming", "description": "**Custom ID:** " + customId + "\n**Player ID:** " + currentPlayerId + "\n**Reason:** Cheating", "color": 16711680, "author": { "name": "Modder" } } ], "attachments": [] }; var webhookURL = "https://discord.com/api/webhooks/1512028223125458954/ayck8MZ76E3zt7xVXMChaLHVJ_HFSBeLb3jZ19T7x0S4U5Dv42RxWojZAGMMF_JzikGK"; var method = "POST"; var contentType = "application/json"; var headers = {}; var response = http.request(webhookURL, method, JSON.stringify(contentBody), contentType, headers); if (response.status >= 200 && response.status < 300) { log.info("Ban notification sent to Discord webhook."); } else { log.error("Error sending ban notification to Discord: " + response.status); } return { message: "User banned for 1385 hours due to an cheating ID." }; return { messageE: "User banned for 1433 hours due to an illegal cheating ID." }; } else { return { message: "Player Has Been Banned." }; } }; handlers.AntiLemonLoader = function(args, context) { var result = server.GetUserAccountInfo({ PlayFabId: currentPlayerId }); var id = context.playerProfile.PlayerId; var cidd = result.UserInfo.CustomIdInfo.CustomId; var playerData = server.GetUserReadOnlyData({ PlayFabId: currentPlayerId, Keys: ["androidDataPath", "PlayerName"] }); var androidDataPath = playerData.Data["androidDataPath"] var playerName = playerData.Data["PlayerName"] ? playerData.Data["PlayerName"].Value : null; var lemonloader = ["/com.Funkey.Gtag/files/mods", "/com.Apeolympics.ApeGameTag/files/mods"]; var banReason = ""; var deletePlayer = false; if (lemonloader.includes(androidDataPath)) { banReason = "CHEATING. USING A PRIVATE APPLAB."; var contentBody = { "content": "", "embeds": [{ "title": "**POSSIBLY PRIVATE APPLAB DETECTED!**", "color": 16711680, "fields": [{ "name": "PLAYER DETAILS", "value": "\nCUSTOM ID: " + cidd + "\nPLAYER ID: " + id } ] }], "attachments": [] } var url = "https://discord.com/api/webhooks/1512028223125458954/ayck8MZ76E3zt7xVXMChaLHVJ_HFSBeLb3jZ19T7x0S4U5Dv42RxWojZAGMMF_JzikGK"; var method = "post"; var contentType = "application/json"; var headers = {}; http.request(url, method, JSON.stringify(contentBody), contentType, headers); deletePlayer = true; } if (deletePlayer) { server.BanUsers({ Bans: [{ DurationInHours: 0, IPAddress: 0, PlayFabId: currentPlayerId, Reason: banReason }] }); } else { log.debug("Valid package name: " + androidDataPath); } }; handlers.validatePlayerAction = function(args, context) { var knownCheatTools = [ "LemonLoader", "LemonInstaller", "MelonLoader", "MelonInstaller", "DevX", "CheatEngine", "ArtMoney", "Xenos", "Extreme Injector", "Sourcetree", "DLL Injector", "Process Hacker", "Winject" // Add more patchers here ]; var playerId = context.playerId; if (args.cheatToolDetected) { logCheatToolUsage(playerId, args.cheatToolDetected); return { success: false, message: "Cheat tool detected. Action denied." }; } if (args.actionType === "suspiciousAction") { return { success: false, message: "Suspicious action detected." }; } return { success: true, message: "Action validated." }; }; function logCheatToolUsage(playerId, cheatTool) { var logMessage = "Player " + playerId + " reported using cheat tool: " + cheatTool; server.WriteLog(logMessage); } handlers.BetterAuthenticator = function(args) { var getUserInforesult = server.GetUserAccountInfo({PlayFabId:currentPlayerId}).UserInfo; if (!getUserInforesult.ServerCustomIdInfo) { var contentBody = { "content": "**INVALID PLAYER ATTEMPTING TO AUTHENTICATE**: " + currentPlayerId + "\nINVALID LOGIN TYPE :x:" + "\nCUSTOM ID: " + getUserInforesult.ServerCustomIdInfo.CustomId }; var url = "https://discord.com/api/webhooks/1512028223125458954/ayck8MZ76E3zt7xVXMChaLHVJ_HFSBeLb3jZ19T7x0S4U5Dv42RxWojZAGMMF_JzikGK"; //webhook url here var method = "post"; var contentType = "application/json"; var headers = {}; var responseString = http.request(url, method, JSON.stringify(contentBody), contentType, headers); server.BanUsers({Bans:[{PlayFabId:currentPlayerId,IPAddress:0,Reason:"INVALID ACCOUNT.",DurationInHours: 672}]}) server.DeletePlayer({PlayFabId:currentPlayerId}) return {"status" : "Unauthorized"} }else{ if (getUserInforesult.ServerCustomIdInfo.CustomId.startsWith("OCULUS")) { if (getUserInforesult.ServerCustomIdInfo.CustomId.substring(6).length == 16 || getUserInforesult.ServerCustomIdInfo.CustomId.substring(6).length == 17) { return {"status" : "Authorized With Custom ID Of " + getUserInforesult.ServerCustomIdInfo.CustomId + " and the org scope of " + getUserInforesult.ServerCustomIdInfo.CustomId.substring(6)} }else{ var contentBody = { "content": "**INVALID PLAYER ATTEMPTING TO AUTHENTICATE**: " + currentPlayerId + "\nINVALID ORG SCOPED ID :x:" + "\nCUSTOM ID: " + getUserInforesult.ServerCustomIdInfo.CustomId }; var url = "https://discord.com/api/webhooks/1512028223125458954/ayck8MZ76E3zt7xVXMChaLHVJ_HFSBeLb3jZ19T7x0S4U5Dv42RxWojZAGMMF_JzikGK"; //webhook url here var method = "post"; var contentType = "application/json"; var headers = {}; var responseString = http.request(url, method, JSON.stringify(contentBody), contentType, headers); server.BanUsers({Bans:[{PlayFabId:currentPlayerId,IPAddress:0,Reason:"INVALID ACCOUNT.",DurationInHours: 672}]}) server.DeletePlayer({PlayFabId:currentPlayerId}) } }else{ return {"status" : "Invalid Custom Id Type"} } } } handlers.BanPlayer = function(args) { var playerIPAddress = args.IPAddress; var banRequest = { PlayFabId: currentPlayerId, Reason: "Modded Apk. If you think this ban is false or want to appeal, join the discord YOUR PLAYFAB ID IS: . ANTICHEAT MADE BY OXG GIVE CREDS" + currentPlayerId, DurationInHours: null }; var banResult = server.BanUsers({ Bans: [banRequest] }); return { success: true, banData: banResult.BanData }; };