Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- class PacketParser {
- public $DB, $ClientData, $Room, $Items;
- public function __construct() {
- try {
- $this->DB = new DB(Config::get('User'), Config::get('Pass'), Config::get('DB'));
- } catch (PDOException $e) {
- echo $e->getMessage();
- }
- $this->ClientData = new Map();
- $this->Room = new Room();
- $this->Items = new Map();
- $this->CacheAll();
- }
- public function CacheAll() {
- $items = $this->DB->query('SELECT * FROM items')->resultset();
- foreach($items as $item) {
- $this->Items->set($item->id, $item);
- }
- $this->write("Cached {$this->Items->size()} items", "CACHE");
- unset($items);
- }
- public function CheckPacket($client, $packet) {
- if (startsWith($packet, "<")) {
- $this->HandleXML($client, $packet);
- } else {
- $this->HandlePercentage($client, $packet);
- }
- }
- public function HandleXML($client, $xml) {
- if(contains('policy', $xml)) {
- $this->send($client, "<cross-domain-policy><allow-access-from domain='*' to-ports='5588'/></cross-domain-policy>");
- } elseif(contains("verChk", $xml)) {
- $this->send($client, "<msg t='sys'><body action='apiOK' r='0'></body></msg>");
- } elseif(contains("login", $xml)){
- $this->LoginParse($client, $xml);
- } else {
- $this->write('Unknown packet: ' . $xml, 'CORE');
- }
- }
- public function moveToCell($client) {
- $packet = json_decode('{"t":"xt","b":{"r":-1,"o":{"cmd":"uotls","o":{"strFrame":"Enter","intMP":100.0,"intLevel":1,"entID":2,"strPad":"Spawn","intMPMax":400.0,"intHP":400.0,"afk":false,"intHPMax":400.0,"ty":0,"tx":0,"intState":1,"entType":"p","showCloak":true,"showHelm":true,"strUsername":"lol","uoName":"lol"},"unm":"lol"}}}', true);
- $user = $this->GetClientData($client);
- $packet['b']['o']['o']['entID'] = (int) $user->id;
- $packet['b']['o']['o']['strUsername'] = $user->Username;
- $packet['b']['o']['o']['uoName'] = $user->Username;
- $packet['b']['o']['unm'] = $user->Username;
- $this->SendRoom_Except($client, stripslashes(json_encode($packet)));
- }
- public function RetriveUserData($client, $id) {
- $user = $this->GetData_ID($id);
- $packet = json_decode('{"t":"xt","b":{"r":-1,"o":{"uid":30426,"cmd":"initUserData","data":{"intColorTrim":"7890487","intColorAccessory":"4674410","iCP":0,"intLevel":52,"intColorSkin":"14333328","intAccessLevel":"0","intColorBase":"7681060","iUpgDays":"-1744","strHairFilename":"hair/M/DFSpiky.swf","intColorHair":"16777215","intColorEye":"16737792","strHairName":"DFSpiky","strGender":"M","strUsername":"ChaoticShaper","strClassName":"undefined","eqp":{}}}}}', true);
- $packet['b']['o']['uid'] = (int) $user->id;
- $packet['b']['o']['data']['intColorTrim'] = $user->ColorTrim;
- $packet['b']['o']['data']['intColorAccessory'] = $user->ColorAccessory;
- $packet['b']['o']['data']['iCP'] = 0;
- $packet['b']['o']['data']['intLevel'] = (int) $user->Level;
- $packet['b']['o']['data']['intColorSkin'] = $user->ColorSkin;
- $packet['b']['o']['data']['intAccessLevel'] = $user->Access;
- $packet['b']['o']['data']['intColorBase'] = $user->ColorBase;
- $packet['b']['o']['data']['iUpgDays'] = $user->UpgradeDays;
- $packet['b']['o']['data']['strHairFilename'] = $user->HairFile;
- $packet['b']['o']['data']['intColorHair'] = $user->ColorHair;
- $packet['b']['o']['data']['intColorEye'] = $user->ColorEye;
- $packet['b']['o']['data']['strHairName'] = $user->HairName;
- $packet['b']['o']['data']['strGender'] = $user->Gender;
- $packet['b']['o']['data']['strUsername'] = $user->Username;
- $packet['b']['o']['data']['strClassName'] = 'Warrior';
- $packet['b']['o']['data']['eqp'] = '';
- $UserItems = $this->DB->query('SELECT equipment, itemid FROM users_items WHERE userid = ? AND equipped = 1')->bind(1, $user->id)->resultset();
- foreach($UserItems as $UserItem) {
- $Item = $this->Items->get($UserItem->itemid);
- $packet['b']['o']['data']['eqp'][$UserItem->equipment] = [];
- $packet['b']['o']['data']['eqp'][$UserItem->equipment]['ItemID'] = (int) $Item->id;
- $packet['b']['o']['data']['eqp'][$UserItem->equipment]['sFile'] = $Item->File;
- $packet['b']['o']['data']['eqp'][$UserItem->equipment]['sLink'] = $Item->Link;
- }
- $this->send($client, stripslashes(json_encode($packet)));
- //$this->equipItem($client);
- }
- public function HandlePercentage($client, $perc) {
- if(contains('firstJoin', $perc)) {
- $this->SendCVU($client);
- $this->UserBody($client);
- $this->SendRoomData($client, 'battleon', 1);
- } elseif(contains('retrieveUserDatas', $perc)) {
- $this->RetrieveUserDatas($client, $perc);
- } elseif(contains('moveToCell', $perc)) {
- $this->moveToCell($client);
- } elseif(contains('%xt%zm%retrieveUserData%', $perc)) {
- $splitted = explode("%", $perc);
- array_pop($splitted);
- for($i = 5; $i < count($splitted); $i++) {
- $this->RetriveUserData($client, $splitted[$i]);
- }
- } elseif(contains('mv', $perc)) {
- $splitted = explode("%", $perc);
- array_pop($splitted);
- $this->SendRoom("%xt%zm%mv%2%{$splitted[5]}%{$splitted[6]}%{$splitted[7]}%");
- } else {
- $this->write('Unknown packet: ' . $perc);
- }
- }
- public function RetrieveUserDatas($client, $perc) {
- $a = [];
- $splitted = explode("%", $perc);
- for($i = 5; $i < count($splitted); $i++) {
- //array_pop($splitted);
- if($i != 0 && $i != null && $splitted[$i] != 0 && $splitted[$i] != null) {
- array_push($a, $this->RetrieveUserInfo($splitted[$i]));
- }
- }
- $packet = [
- "t" => "xt",
- "b" => [
- "r" => -1,
- "o" => [
- "cmd" => "initUserDatas",
- "a" => $a
- ]
- ]
- ];
- $this->send($client, stripslashes(json_encode($packet)));
- }
- public function RetrieveUserInfo($id) {
- $user = $this->GetData_ID($id);
- $this->write("USER ID: " . $user->id);
- $userArr = [];
- $userArr['uid'] = $user->id;
- $userArr['data'] = [];
- $userArr['data']['intColorTrim'] = $user->ColorTrim;
- $userArr['data']['intColorAccessory'] = $user->ColorAccessory;
- $userArr['data']['iCP'] = 0;
- $userArr['data']['intLevel'] = (int) $user->Level;
- $userArr['data']['intColorSkin'] = $user->ColorSkin;
- $userArr['data']['intAccessLevel'] = $user->Access;
- $userArr['data']['intColorBase'] = $user->ColorBase;
- $userArr['data']['iUpgDays'] = $user->UpgradeDays;
- $userArr['data']['strHairFilename'] = $user->HairFile;
- $userArr['data']['intColorHair'] = $user->ColorHair;
- $userArr['data']['intColorEye'] = $user->ColorEye;
- $userArr['data']['strHairName'] = $user->HairName;
- $userArr['data']['strGender'] = $user->Gender;
- $userArr['data']['strUsername'] = $user->Username;
- $userArr['data']['strClassName'] = 'Warrior';
- $userArr['data']['eqp'] = '';
- $UserItems = $this->DB->query('SELECT equipment, itemid FROM users_items WHERE userid = ? AND equipped = 1')->bind(1, $user->id)->resultset();
- foreach($UserItems as $UserItem) {
- $Item = $this->Items->get($UserItem->itemid);
- $userArr['data']['eqp'][$UserItem->equipment] = [];
- $userArr['data']['eqp'][$UserItem->equipment]['ItemID'] = (int) $Item->id;
- $userArr['data']['eqp'][$UserItem->equipment]['sFile'] = $Item->File;
- $userArr['data']['eqp'][$UserItem->equipment]['sLink'] = $Item->Link;
- }
- return $userArr;
- }
- public function SendRoomData($client, $battleon, $rid) {
- $this->JoinOK($client);
- $packet = json_decode('{"t":"xt","b":{"r":-1,"o":{"cmd":"moveToArea","areaName":"battleon-2","uoBranch":[{"strFrame":"Enter2","intMP":100,"intLevel":61,"entID":26752,"strPad":"Spawn","intMPMax":100,"intHP":2593,"afk":false,"intHPMax":2593,"ty":387,"tx":170,"intState":1,"entType":"p","showHelm":true,"showCloak":true,"strUsername":"havokpwndu","uoName":"havokpwndu"},{"strFrame":"Enter","intMP":100,"intLevel":51,"entID":26799,"strPad":"Spawn","intMPMax":100,"intHP":2175,"afk":true,"intHPMax":2175,"ty":0,"tx":0,"intState":1,"entType":"p","showHelm":true,"showCloak":true,"strUsername":"ghostxzz","uoName":"ghostxzz"},{"strFrame":"Enter","intMP":100,"intLevel":46,"entID":26815,"strPad":"Spawn","intMPMax":100,"intHP":1815,"afk":false,"intHPMax":1815,"ty":0,"tx":0,"intState":1,"entType":"p","showHelm":true,"showCloak":false,"strUsername":"pes9632","uoName":"pes9632"},{"strFrame":"Enter","intMP":100,"intLevel":29,"entID":26817,"strPad":"Spawn","intMPMax":100,"intHP":1688,"afk":false,"intHPMax":1688,"ty":0,"tx":0,"intState":1,"entType":"p","showHelm":true,"showCloak":true,"strUsername":"maki_okami","uoName":"maki_okami"},{"strFrame":"Enter","intMP":100,"intLevel":65,"entID":26821,"strPad":"Spawn","intMPMax":100,"intHP":2655,"afk":false,"intHPMax":2655,"ty":429,"tx":694,"intState":1,"entType":"p","showHelm":true,"showCloak":true,"strUsername":"mazenzeka2015","uoName":"mazenzeka2015"},{"strFrame":"Enter","intMP":100,"intLevel":43,"entID":26822,"strPad":"Spawn","intMPMax":100,"intHP":1851,"afk":false,"intHPMax":1851,"ty":0,"tx":0,"intState":1,"entType":"p","showHelm":true,"showCloak":true,"strUsername":"Mario Mario Mario4","uoName":"mario mario mario4"},{"strFrame":"Enter","intMP":100,"intLevel":52,"entID":26825,"strPad":"Spawn","intMPMax":100,"intHP":100,"afk":false,"intHPMax":100,"ty":0,"tx":0,"intState":1,"entType":"p","showHelm":true,"showCloak":true,"strUsername":"ChaoticShaper","uoName":"chaoticshaper"}],"strMapFileName":"Battleon/town-battleon-30Jul16-QUIB.swf","mondef":[{"intHPMax":310,"sRace":"Chaos","strElement":"Fire","MonID":"2566","intMP":"100","intLevel":1,"strLinkage":"Chicken","strMonFileName":"Monster-Chicken.swf","strMonName":"Chicken","intMPMax":100,"intHP":310,"strBehave":"walk"},{"intHPMax":310,"sRace":"Dragonkin","strElement":"Fire","MonID":"2568","intMP":"100","intLevel":1,"strLinkage":"Chicken2","strMonFileName":"Monster-Chicken2.swf","strMonName":"Sabertooth Chicken","intMPMax":100,"intHP":310,"strBehave":"walk"}],"intType":"2","monBranch":[{"intHPMax":310,"iLvl":1,"MonMapID":5,"MonID":"2566","intMP":100,"wDPS":6,"intState":1,"intMPMax":100,"bRed":"0","intHP":310},{"intHPMax":310,"iLvl":1,"MonMapID":3,"MonID":"2566","intMP":100,"wDPS":6,"intState":1,"intMPMax":100,"bRed":"0","intHP":310},{"intHPMax":310,"iLvl":1,"MonMapID":4,"MonID":"2568","intMP":100,"wDPS":6,"intState":1,"intMPMax":100,"bRed":"0","intHP":310}],"sExtra":"","monmap":[{"MonMapID":"3","strFrame":"Enter2","intRSS":"-1","MonID":"2566","bRed":"0"},{"MonMapID":"4","strFrame":"Enter2","intRSS":"-1","MonID":"2568","bRed":"0"},{"MonMapID":"5","strFrame":"Enter2","intRSS":"-1","MonID":"2566","bRed":"0"}],"areaId":66516,"strMapName":"battleon"}}}');
- $packet->b->o->areaName = "battleon-2";
- $packet->b->o->uoBranch = $this->GetUOBranch();
- $packet->b->o->strMapFileName = "Battleon/town-battleon-20may11r1.swf";
- $packet->b->o->mondef = [];
- $packet->b->o->intType = "2";
- $packet->b->o->monBranch = [];
- $packet->b->o->sExtra = "";
- $packet->b->o->monmap = [];
- $packet->b->o->areaId = 2;
- $packet->b->o->strMapName = "battleon";
- $this->send($client, stripslashes(json_encode($packet)));
- $this->SendMessage($client, 'server', 'You joined "battleon-2"!');
- }
- public function GetUOBranch() {
- $usersArr = [];
- foreach($this->Room->UserList as $users) {
- $user = $this->GetClientData($users);
- array_push($usersArr, [
- "strFrame" => "Enter",
- "intMP" => 100,
- "intLevel" => $user->Level,
- "entID" => $user->id,
- "strPad" => "Spawn",
- "intMPMax" => 100,
- "intHP" => 1000,
- "afk" => false,
- "intHPMax" => 1000,
- "ty" => 0,
- "tx" => 0,
- "intState" => 1,
- "entType" => "p",
- "showHelm" => true,
- "showCloak" => true,
- "strUsername" => $user->Username,
- "uoName" => $user->Username
- ]);
- }
- return $usersArr;
- }
- public function SendMessage($client, $type, $msg) {
- $this->send($client, '%xt%'.$type.'%-1%'.$msg.'%');
- }
- public function JoinOK($client) {
- $data = "<msg t='sys'><body action='joinOK' r='2'><pid id='1'/><vars /><uLs r='2'>";
- foreach($this->Room->UserList as $users) {
- $user = $this->GetClientData($users);
- $data .= "<u i='{$user->id}' m='0' s='0' p='1'><n><![CDATA[{$user->Username}]]></n><vars></vars></u>";
- }
- $data .= "</uLs></body></msg>";
- $this->send($client, $data);
- }
- public function UserBody($client) {
- $data = "<msg t='sys'><body action='uER' r='2'>";
- foreach($this->Room->UserList as $users) {
- $user = $this->GetClientData($users);
- $data .= "<u i ='" . $user->id . "' m='0' s='0' p='1'><n><![CDATA[" . $user->Username . "]]></n><vars></vars></u>";
- }
- $data .= "</body></msg>";
- $this->SendRoom_Except($client, stripslashes($data));
- }
- public function SendRoom_Except($client, $packet) {
- foreach ($this->Room->UserList as $user) {
- if ($client != $user) {
- $this->send($user, $packet);
- }
- }
- }
- public function SendRoom($packet) {
- foreach ($this->Room->UserList as $user) {
- $this->send($user, $packet);
- }
- }
- public function equipItem($client) {
- $packet = null;
- $user = $this->GetClientData($client);
- $useritems = $this->DB->query('SELECT * FROM users_items WHERE userid = ? AND equipped=1')->bind(1, $user->id);
- if($useritems->num_rows() > 0) {
- $UItems = $useritems->resultset();
- foreach($UItems as $Item) {
- $packet = json_decode('{"t":"xt","b":{"r":-1,"o":{"uid":1,"ItemID":1,"strES":"Weapon","cmd":"equipItem","sFile":"items/swords/sword01.swf","sLink":"","sType":"Sword","sMeta":""}}}');
- $items = $this->Items->get($Item->itemid);
- $packet->b->o->uid = (int) $user->id;
- $packet->b->o->ItemID = (int) $items->id;
- $packet->b->o->strES = $Item->equipment;
- $packet->b->o->sFile = $items->File;
- $packet->b->o->sLink = $items->Link;
- $packet->b->o->sType = $items->Type;
- $this->send($client, stripslashes(json_encode($packet)));
- }
- }
- $this->send($client, '{"t":"xt","b":{"r":-1,"o":{"uid":'.$user->id.',"sStats":"Warriors favor Strength, Endurance, and Dexterity","iCP":568,"cmd":"updateClass","sDesc":"Warriors are quintessential melee fighters. Simple, direct, and effective, they are masters of armed combat, and quite durable.","sClassCat":"M1","aMRM":["Warriors gain mana when they Strike an enemy in combat (more effective on crits) Are struck by an enemy in combat"],"sClassName":"Warrior"}}}');
- unset($packet);
- unset($user);
- }
- public function SendCVU($client) {
- $this->send($client, '{"t":"xt","b":{"r":-1,"o":{"cmd":"cvu","o":{"PCstRatio":7.47,"PChpDelta":1640,"PChpBase1":360,"baseHit":0,"intSPtoDPS":10,"resistRating":17,"curveExponent":0.66,"baseCritValue":1.5,"PChpGoal100":4000,"intLevelCap":100,"baseMiss":0.1,"baseParry":0.03,"GstBase":12,"modRating":3,"baseResistValue":0.7,"baseBlockValue":0.7,"intHPperEND":5,"baseHaste":0,"baseBlock":0,"statsExponent":1,"PChpBase100":2000,"intAPtoDPS":10,"PCstBase":15,"baseCrit":0.05,"baseEventValue":0.05,"GstGoal":572,"PChpGoal1":400,"GstRatio":5.6,"intLevelMax":100,"bigNumberBase":8,"PCstGoal":762,"baseDodge":0.04,"PCDPSMod":0.85}}}}');
- }
- public function LoginParse($client, $xml) {
- $XMLDom = new SimpleXMLElement($xml);
- $unmArray = $XMLDom->xpath('/msg/body/login/nick');
- $pwdArray = $XMLDom->xpath('/msg/body/login/pword');
- $username = explode("~",$unmArray[0])[1];
- $password = $pwdArray[0];
- unset($unmArray);
- unset($pwdArray);
- $XMLDom = null;
- $this->write("Login attempt by: " . $username . ", " . $password, "XML");
- $query = $this->DB->query('SELECT * FROM users WHERE Username = ? AND Password =?')->bind(1, $username)->bind(2, $password);
- if($query->num_rows() > 0) {
- $this->Room->AddToRoom($client);
- $resultset = $query->single();
- $resultset->Username = strtolower($resultset->Username);
- $this->AddClientData($client, $resultset);
- $settings = $this->GetsettingsObject();
- $this->send($client, "%xt%loginResponse%-1%true%{$resultset->id}%{$resultset->Username}%{$settings->MOTD}%2016-07-18T01:01:05%sNews={$settings->News},sMap={$settings->Map},sBook={$settings->Book},sFBC={$settings->FBC},sAssets={$settings->Assets},sWTSandbox={$settings->WTSandbox},gMenu={$settings->GameMenu},sVideo={$settings->Video}%");
- unset($settings);
- unset($resultset);
- }
- unset($query);
- }
- public function write($msg, $type = 'INFO') {
- printf('%s%s %s <%s> %s %s', "\n", @date('m/d/y'), @date('g:i A'), $type, $msg, chr(10));
- }
- public function AddClientData($socket, $data) {
- $this->ClientData->set((int)$socket, $data);
- }
- public function GetClientData($client) {
- if ($this->ClientData->containsKey((int)$client) && !$this->ClientData->isEmpty()) {
- return $this->ClientData->get((int)$client);
- }
- return null;
- }
- public function GetData_ID($id) {
- return $this->DB->query('SELECT * FROM users WHERE id = ?')->bind(1, $id)->single();
- }
- public function GetsettingsObject() {
- return $this->DB->query('SELECT * FROM settings_server WHERE id = 1')->single();
- }
- public function send($client, $packet) {
- $packet .= "\0";
- socket_write($client, $packet);
- $this->write($packet, "SENDPACKET");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement