Hey! As some of you might noticed lately, you don't need SSM anymore to be listed at CryMP.net, it's enough to just modify your CryNetwork.dll and master does job for you. But there is even more now, now you can quickly check if profile ID is valid (one sent by player using !validate id token) and really simply like this: 1. Grab SHA1 for Lua library here: https://raw.githubusercontent.com/kikito/sha1.lua/master/sha1.lua 2. Get your private key for server here: http://crymp.net/api/mykey.php (it's bound to IP, if your server changes IP, please consider checking for key again) 3. Implement this simple script into your SSM: [code] sha1 = require "sha1" privkey = "YOUR_PRIVATE_KEY" function verifyToken(id, token, privkey) local tok, t = string.match(token, "([a-f0-9A-F]+)_(.*)") if tok:len()<40 then return nil; end local vlen = tok:len() - 40 local hsh = tok:sub(0, vlen) local org = id..":"..t..":"..privkey local sign=sha1(org) local part=sign:sub(0,vlen) return (part==hsh) end [/code] And use it like this [code] AddChatCommand("validate", function(self, player, msg, id, token) --beware, this is SafeWriting syntax -- change it depending on your SSM way of creating chat commands with arguments local num_id = tonumber(id) local ok = false if num_id>800000 then ok=true; else local valid = verifyToken(id, token, privkey) if valid then ok=true; end if not ok then --- in this case offline validation failed num_id = math.random(800000, 1000000) -- if it failed, lets just assign random profile to player end end player.profile = num_id --in case your are using Patriot do this: player.actor.GetProfileId = function(s) return num_id end end,{WORD,WORD}); [/code] In case you are using some other SSM (like AegisX, or any other that uses function like GetProfile(player) to return profile ID), please consider rewriting your function to return simply player.profile or 0, like this: [code] function XGetProfile(player) return player.profile or 0; end -- and make sure to set player.profile = num_id; in your validation command [/code]