Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?
- ############################################################################
- # This is free software; you may redistribute it and/or modify
- # it under the terms of the GNU General Public License as
- # published by the Free Software Foundation; either version 2,
- # or (at your option) any later version.
- #
- # This is distributed in the hope that it will be useful, but
- # WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- ############################################################################
- /*
- * Advanced cached class by adriahu
- * Version 1.3 beta
- */
- define ('DEBUG_CACHED', TRUE);
- if (DEBUG_CACHED && !defined('DEBUG_INC')) include "cached_dbg.class.php";
- if (!defined('CONNECTION_INC')) include "cached_conn.class.php";
- ############################################################################
- define ('AdminVersion', 0);
- # d - version (normal=60)
- # check admin version
- define ('CheckCharacter', 1);
- # d - charId
- # offline/online
- define ('SetCharacterLocation', 2);
- # ddddd - charId, worldId, x, y, z
- # teleport char
- define ('SetBuilderCharacter', 3);
- # dd - charId, builderLevel
- # (char offline!)
- define ('ChangeCharacterName', 4);
- # dS - charId, newName
- # (char offline!)
- define ('KickCharacter', 5);
- # d - charId
- define ('AddSkill', 6);
- # ddd - charId, skillId, skillLevel
- define ('DelSkill', 7);
- # dd - charId, skillId
- define ('ModSkill', 8);
- # ddd - charId, skillId, skillLevel
- define ('SetOnetimeQuest', 9);
- # ddd - charId, questId, questState
- define ('SetQuest', 10);
- # ddd - charId, questId, questState
- define ('DelQuest', 11);
- # dd - charId, questId
- define ('AddItem', 12);
- # (not work)
- define ('DelItem', 13);
- # dddd - charId, wareHouse, itemDbId, itemAmount
- define ('ModItem', 14);
- # dddddddddd - charId, wareHouse, itemDbId, newItemType, newItemAmount,\
- # newEnchant, newEroded, newBless, newIdent, newWished
- # (char offline!)
- define ('ModChar', 15);
- # ddddddd - charId, newSp, newExp, newAlign, newPk, newPkPardon, newDuel
- # (class_id sql modify needed)
- define ('ModChar2', 16);
- # (char offline!)
- # ddddddd - charId, newGender, newRace, newClass, newFace, newHairShape,\
- # newHairColor
- define ('ModCharPledge', 17);
- # change or add char title
- # dS - charId, title
- define ('PunishChar', 18);
- # ddd - charId, punishId(1-shopBan(not work),2-chatBan),\
- # remainTime min (0=remove)
- define ('SetBuilderAccount', 19);
- # Sd - accountName, builderLevel
- define ('DisableCharacter', 20);
- # (not logged!)
- # dd - charId, option(1-remove from char list)
- define ('EnableCharacter', 21);
- # (first DisableCharacter)
- # dd - charId, accountId
- define ('GetCharacters', 22);
- # (not work, timeouts)
- define ('SetBookMark', 23);
- # dSdddd - charId, bookmarkName, worldId, x, y, z
- define ('DelBookMark', 24);
- # dS - charId, bookmarkName
- define ('DelPledgeCrest', 25);
- # d - pledgeId
- define ('ModPledgeName', 26);
- # (need sql fix uppercase letters)
- # dS - pledgeId, newPledgeName
- define ('SetProhibited', 27);
- # (in table lin2world..user_prohibit)
- # dS - option(1-add,2-del), charName
- define ('SeizeItem', 28);
- # (char offline!)
- # dddd - option(1-on,2-off), charId, wareHouse, itemDbId
- define ('ModChar3', 29);
- # (char offline!)
- # ddddddd - charId, deltaSp, deltaExp, deltaAlign, deltaPk,\
- # deltaPkPardon, deltaDuel
- define ('MoveItem', 30);
- # (char offline!)
- # ddddd - charId, wareHouse, itemDbId, receiverCharId, receiverWareHouse
- define ('MoveCharacter', 31);
- # ddS - charId, accountId, accountName
- define ('CommentWrite', 32);
- # write comment to lin2world..user_comment
- # dSS - charId, comment, writer
- define ('CommentDelete', 33);
- # dd - commentId, option(0-undelete,1-delete(flag only))
- define ('DeleteChar', 34);
- # (char offline!)
- # d - charId
- define ('RestoreChar', 35);
- # ddS - charId, accountId, accountName
- define ('PledgeOust', 36);
- # (char offline!)
- # d - charId
- define ('PledgeChangeOwner', 37);
- # (not work)
- # dd - pledgeId, newOwnerId
- define ('PledgeDelete', 38);
- # (not work)
- # d - pledgeId
- define ('BanChar', 39);
- # (char offline!)
- # dd - charId, banHour(0-remove)
- define ('MoveItem2', 40);
- # (char offline!)
- # dddd - charId, itemDbId, receiverCharId, wareHouse
- define ('PrintAllAccountData', 41);
- # (in CacheD console)
- define ('PrintAllItemData', 42);
- # (not work)
- define ('CopyChar', 43);
- # dSdS - srcCharId, newCharName, destAccountId, destAccountName
- define ('CreatePet', 44);
- # dddddddd - charId, petCollarClassId, npcClassId, exp, level, hp, mp,\
- # meal
- define ('SendHome', 45);
- # d - charId
- define ('ChangePledgeLevel', 46);
- # dd - pledgeId, pledgeLevel
- define ('CreatePledge', 47);
- # Sd - pledgeName, ownerCharId
- define ('SetSkillAll', 48);
- # d - charId
- define ('RestoreChar2', 49);
- # (need sql fix uppercase letters)
- # dSdS - charId, newCharName, accountId, accountName
- define ('ManAnnounce', 50);
- # manage login announce
- # ddS - action(1,2=addOrReplace, 3=delete), announceId, announceTxt
- define ('ManIntAnnounce', 51);
- # manage interval announce
- # dddS - action(1,2=addOrReplace, 3=delete), announceInterval,\
- # announceId, announceTxt
- define ('ModWeekPlay', 52);
- # play time limit ;) (maybe for relax server)
- # ddd - charId, action(1-add, 2-del), min
- define ('SeizeItem2', 53);
- # (char offline!)
- # dd - option(1-seize,2-free(to wareHouse)), itemDbId
- define ('DelItem2', 54);
- # (char offline!)
- # d - itemDbId
- define ('AddItem2', 55);
- # (char offline!)
- # dddddddddd - charId, wareHouse, itemId, amount, enchant, eroded, bless,\
- # ident, wished
- define ('GetCharacters2', 56);
- # output_packet
- # d - accountId
- define ('DelMacro', 57);
- # (char offline!)
- # dd - charId, macroDbId
- define ('DelMonRaceTicket', 58);
- # (char offline!)
- # ddd - charId, itemDbId, ticketDbId
- define ('DelRecipe', 59);
- # (char offline!)
- # dd - charId, recipeDbId
- define ('DelLotto', 60);
- # (not work, timeouts)
- define ('ModifyPledgePower', 61);
- # ddS - charId, unknownINT, power_flag
- # (for example\
- # '1110000000000000000000000000000000000000000000000000000000000000')
- define ('EventPoint', 62);
- # (server crash!, buffer overflow)
- # ???????????????
- define ('GetPledge', 63);
- # output_packet
- # d - pledgeId
- define ('EventPoint2', 64); #renamed
- # (not used)
- define ('CreateCharacter', 65); #???? sprawdzic
- # SSddddddddffdddddddddd - newCharName, accountName, accountId, gender,\
- # raceId, classId, worldId, x, y, z, (float)hp, (float)mp, sp, exp, lvl,\
- # align, PK, duel, pkpardon, face, hairShape, hairColor
- # return new_char_id
- define ('AddItems', 66);
- # dd d*(dddddddd) - charId, unknown(>0), count*(wareHouse, itemId,
- # amount, enchant, eroded, bless, ident, wished)
- define ('AddSkills', 67);
- # ddd*(dd) - charId, unknown(dont use 0), count*(skillId, skillLvl)
- define ('GetCharacters3', 68);
- # output_packet
- # d - accountId
- define ('SetSociality', 69);
- # (server crash!: CLog::Add -> CLog::AddV -> Log::AddV - vswprintf_s)
- # dd - charId, sociality
- define ('SetInstantAnnounce', 70);
- # S - announceTxt
- define ('DelHenna', 71);
- # (server crash!: CLog::Add -> CLog::AddV -> Log::AddV - vswprintf_s)
- # dd - charId, hennaId
- define ('AddHenna', 72);
- # (server crash!: CLog::Add -> CLog::AddV -> Log::AddV - vswprintf_s)
- # dd - charId, hennaId
- define ('ReserveCharName', 73); #renamed
- # dSdd - option(0=add,1=del), name, accountId, used
- define ('AddHennas', 74);
- # (server crash!: CLog::Add -> CLog::AddV -> Log::AddV - vswprintf_s)
- define ('GetCastleList', 75);
- # output_packet
- # void
- define ('ModifyCharProperty', 76);
- # (char offline!)
- # dddddddd - charId, sp, exp, subJobClass, pk, pkpardon, duel, subjobId
- define ('ModifyCharAbilityDelta', 77);
- # (char offline!)
- # dddddddd - charId, subJobSp, subJobExp, align, pk, pkpardon, duel,\
- # subjobId
- define ('ModifyCharAbility', 78); #renamed
- # (char offline!)
- # dddddddd - charId, subJobSp, subJobExp, align, pk, pkpardon, duel,\
- # subJobId
- define ('DelHenna2', 79);
- # (char offline!)
- # ddd - charId, hennaId, subJobId
- define ('AddHenna2', 80);
- # (char offline!)
- # ddd - charId, hennaId, subJobId
- define ('AddSkill2', 81);
- # dddd - charId, skillId, skillLevel, subJobId
- define ('DelSkill2', 82);
- # ddd - charId, skillId, subJobId
- define ('ModifySkill2', 83);
- # dddd - charId, skillId, skillLevel, subJobId
- define ('AddMacro', 84);
- # (char offline!)
- # return macroId for AddMacroInfo packet
- # dSSSd - charId, macroName, macroToolTip, macroIconName, macroIconType
- define ('GetSSQStatus', 85);
- # output_packet
- # void
- define ('GetSSQMainEventRecord', 86);
- # output_packet
- # void
- define ('ModifyDepositedSSQItem', 87);
- # (char offline!)
- # dddd - charId, option(1=pointsAndItems,2=items), sealStoneId, amount
- define ('ChangePetName', 88);
- # ddS - charId, petId (from table pet_data), newPetName
- define ('ChangeSubJob', 89);
- # (char offline!)
- # dd - charId, subJobId
- define ('StopChar', 90);
- # (char offline!) freeze char
- # dd - charId, min
- define ('CancelPersonalShop', 91);
- # (char offline!) shop ban
- # dd - charId, min
- define ('AddMacroInfo', 92);
- # (char offline!)
- # ddddddS - charId, macroId, macroOrder, macroInt1, macroInt2, macroInt3,\
- # macroStr
- define ('CreateCharacter2', 93); #??????
- # SSddddddddffddddddddddddf - newCharName, accountName, accountId,\
- # gender, raceId, classId, worldId, x, y, z, (float)hp, (float)mp, sp,\
- # exp, lvl, align, PK, duel, pkpardon, face, hairShape, hairColor,\
- # SubjobId, MainClassId, (float)CP
- define ('AddSkills2', 94);
- # dd d*(ddd) - charId, unknown(dont use 0! server crash!),\
- # count*(skillId, skillLevel, subJobId)
- define ('AddHennas2', 95);
- # ddd*(d) - charId, unknown(dont use 0! server crash!),\
- # count(max=3)*(hennaId)
- # don't work properly, always add henna with subjob_id = NULL
- define ('AddSubjobs', 96);
- # dd d*(dddddddddd) - charId, unknown(dont use 0! server crash!),
- # count*(classId, HP, MP, SP, EXP, Level, subJobId, henna1Id, henna2Id,\
- # henna3Id)
- define ('GetPledge2', 97);
- # output_packet
- # d - pledgeId
- define ('DelPledgeEmblem', 98);
- # d - pledgeId
- define ('RegisterAccount', 99);
- # insert accountName into lin2world..account_ch2
- # S - accountName
- define ('DelPledgeAnnounce', 100);
- # d - pledgeId
- define ('SendPrivateAnnounce', 101);
- # dS - charId, announceTxt
- define ('GetAgitList', 102);
- # output_packet
- # void
- define ('GetPledgeMember', 103);
- # output_packet
- # d - pledgeId
- define ('EternalBan', 104);
- # (char offline!)
- # update user_ban table with status=2 and unlimited time
- # d - char_id
- define ('GetCharacters4', 105);
- # output_packet
- # d - accountId
- define ('SetNobless', 106); #need fixed cached. thx Ra1n0
- # dd - charId, noblessType
- define ('SetHero', 107); #need fixed cached. thx Ra1n0
- # dd - charId, heroType
- define ('SetPartyLocation', 108);
- # dddd - charId, x, y, z
- define ('ModOlympiadPoint', 109);
- # dddd - charId, previousPoint, olympiadPoint, mode(1=absolute, 2=delta)
- $outPackets = array # (patter_count, pattern)
- (
- GetCharacters2 => array(7, 'VSVSVVVS'),
- # V S V S V V \
- # char_id, char_name, account_id, account_name, level, class_id,\
- # V S
- # pledge_id, pledge_name
- GetCharacters3 => array(7, 'VSVSVVVSV'),
- # V S V S V V \
- # char_id, char_name, account_id, account_name, level, class_id,\
- # V S, V
- # pledge_id, pledge_name, online
- GetCharacters4 => array(7, 'VSVSVVVSVSVV'),
- # V S V S V V \
- # char_id, char_name, account_id, account_name, level, class_id,\
- # V S, V S V V
- # pledge_id, pledge_name, online, logout, noblessType, heroType
- GetPledge => array(1, 'SVSVVVS'),
- # S V S V V \
- # pledge_name, ruler_id, rurel_name, pledge_lvl, players_count,\
- # V S
- # ally_id, ally_name
- GetPledge2 => array(1, 'SVSVVVSV'),
- # S V S V V \
- # pledge_name, ruler_id, rurel_name, pledge_lvl, players_count,\
- # V S V
- # ally_id, ally_name, ally_master_pledge_id
- GetPledgeMember => array(40, 'VSVV'),
- # V S V V
- # char_id, char_name, class_id, online
- GetCastleList => array(9, 'VVSVSVSVVV'),
- # V V S V S V \
- # castle_id, pledge_id, pledge_name, ruler_id, ruler_name, ally_id,\
- # S V V V
- # ally_name, next_war_time, tax_rate, tax_rate_to_change
- GetAgitList => array(40, 'VSVSVSVV'),
- # V S V S V S \
- # agit_id, agit_name, pledge_id, pledge_name, ruler_id, ruler_name,\
- # V V
- # next_auction_time, next_war_time
- GetSSQStatus => array(1, 'VVVVVVVVVVV'),
- # V V V V V V V V \
- # twilight_point, dawn_point, seal1, seal2, seal3, seal4, seal5, seal6,\
- # V V V
- # seal7, time, status
- GetSSQMainEventRecord => array(5, 'VVVVVVVVVVVVVVVVV'),
- # V V VVVVVVVVVVVVVVV
- # ssq_round, room_no?, ????????????????????
- );
- $errors = array
- (
- 1 => 'Error',
- 2 => 'Arguments need',
- 3 => 'Arguments invalid',
- 4 => 'Char not found',
- 5 => 'Warehouse not found',
- 6 => 'Account not found',
- 7 => 'Char in game',
- 8 => 'Too many chars',
- 9 => 'Char in pledge',
- 10 => 'Char pledge owner',
- 11 => 'Cannot ban',
- 12 => 'Name exist',
- 13 => 'Obsolete',
- 14 => 'Invalid char name',
- 15 => 'Char not in game',
- 16 => 'Same char',
- 17 => 'Char not in pledge',
- 18 => 'Char pledge master',
- 19 => 'Server not connected',
- 20 => 'Create pet failed',
- 21 => 'Pledge exist',
- 22 => 'No chars',
- 23 => 'Invalid announce id',
- 24 => 'Pledge not found',
- 25 => 'Castle not found',
- 26 => 'Pet not found',
- 28 => 'Bad admin version',
- 29 => 'Alredy moved',
- 31 => 'Create char failed',
- 32 => 'ModifyDepositedSSQItem error 1',
- 34 => 'Alredy hero',
- );
- ############################################################################
- function toUCS($str)
- {
- return mb_convert_encoding($str, "UCS-2LE", "UTF-8")."\x00\x00";
- }
- function toISO($str)
- {
- return mb_convert_encoding($str, "UTF-8", "UCS-2LE");
- }
- function cutBytes(&$in, $bytes)
- {
- $in = substr($in,$bytes,strlen($in)-$bytes);
- }
- ############################################################################
- class CacheD
- {
- function __construct($host = '127.0.0.1', $port = 2012,
- $adminNick = 'admin', $timeout = 2)
- {
- $this->timeout = $timeout;
- $this->Error = 0;
- $this->ErrorTxt = '';
- $this->adminNick = toUCS($adminNick);
- $this->retPacket = '';
- $this->CacheDSock = new Connection($host, $port, $timeout);
- }
- function __destruct()
- {
- if (@$this->CacheDSock && $this->CacheDSock->connected())
- $this->CacheDSock->write("\x00");
- }
- function error($str, $dbg = '')
- {
- if (DEBUG_CACHED && $dbg) print hexdump($dbg);
- if (DEBUG_CACHED) print backtrace();
- die($str);
- }
- function execute($packet)
- {
- if(!$packet) $this->error("Empty packet!");
- $this->Error = 0;
- $this->ErrorTxt = '';
- $this->CacheDSock->write($packet);
- $header = $this->CacheDSock->read(3);
- if (DEBUG_CACHED) $this->retPacket .= $header;
- $header = unpack('vlength/CpacketId', $header);
- $length = $header['length']-3;
- $packetId = $header['packetId'];
- if($length < 4) $this->error('Bad CacheD response [1]!');
- $buf = $this->CacheDSock->read(4);
- if (DEBUG_CACHED) $this->retPacket .= $buf;
- $length -= 4;
- $ok = unpack('Vok', $buf);
- $ok = (bool)$ok['ok'];
- if (!$length)
- {
- return $ok;
- }
- elseif ($length < 4)
- {
- if (DEBUG_CACHED) print hexdump($this->CacheDSock->read($length));
- $this->error('Bad CacheD response [2]!');
- }
- elseif ($length == 4)
- {
- $buf = $this->CacheDSock->read(4);
- if (DEBUG_CACHED) $this->retPacket .= $buf;
- $length -= 4;
- $errorId = unpack('VerrorId', $buf);
- $errorId = $errorId['errorId'];
- if (!$ok)
- {
- if ($packetId != CheckCharacter) #mini fix
- {
- $this->Error = $errorId;
- $this->ErrorTxt = $this->getErrorTxt($errorId);
- }
- }
- else
- {
- $ret = unpack ('Vret', $buf);
- return $ret['ret'];
- }
- return $ok;
- }
- else
- {
- $buf = $this->CacheDSock->read($length);
- if (DEBUG_CACHED) $this->retPacket .= $buf;
- return $buf; #extra data
- }
- }
- function getErrorTxt($id)
- {
- global $errors;
- if (isset($errors[$id])) return $errors[$id];
- return "Unknown error [id=$id]";
- }
- function sendPacket($paketId)
- {
- global $outPackets;
- $argList = func_get_args();
- $packet = $this->preparePacket($argList);
- if (DEBUG_CACHED)
- {
- print hexdump($packet, 'packet');
- $this->retPacket = '';
- }
- $response = $this->execute($packet);
- if (DEBUG_CACHED) print hexdump($this->retPacket, 'ret packet');
- if (isset($outPackets[$paketId]))
- $response = $this->dissasemble($paketId, $response);
- return $response;
- }
- function preparePacket(&$argList)
- {
- $paketId = array_shift($argList);
- if ($paketId > 109) $this->error("Illegal packet ID [$paketId]");
- $packet = pack('C', $paketId);
- foreach ($argList as $arg)
- {
- if (is_int($arg))
- $packet .= pack ('V', $arg);
- elseif (is_float($arg))
- $packet .= pack ('d', $arg);
- elseif (is_string($arg))
- $packet .= toUCS($arg);
- }
- $packet .= $this->adminNick;
- $packet = pack('S', strlen($packet)+2).$packet;
- return $packet;
- }
- function getV(&$packet, $type)
- {
- $ret = '';
- switch ($type)
- {
- case 'V':
- if (DEBUG_CACHED) print hexdump(substr($packet,0,4));
- $ret = unpack('Vret', substr($packet,0,4));
- cutBytes($packet,4);
- return $ret['ret'];
- break;
- case 'S':
- if (strpos ($packet, "\x00\x00") !== 0)
- {
- list ($ret, $packet) = explode ("\x00\x00\x00", $packet, 2);
- if (DEBUG_CACHED) print hexdump($ret."\x00");
- $ret = toISO($ret."\x00");
- return $ret;
- }
- else #empty string
- {
- if (DEBUG_CACHED) print hexdump("\x00\x00");
- cutBytes($packet,2);
- return '';
- }
- break;
- }
- }
- function dissasemble($paketId, $response)
- {
- global $outPackets;
- $ret = array();
- $ret_all = array();
- list($count, $pattern) = $outPackets[$paketId];
- if ($count-1) $pattern = str_repeat($pattern.' ', $count);
- $len = strlen($pattern);
- for ($i = 0; $i < $len; $i++)
- {
- if ($pattern[$i] == ' ')
- {
- $ret_all[] = $ret;
- $ret = array();
- continue;
- }
- if (!$response) break;
- $data = $this->getV($response, $pattern[$i]);
- if (DEBUG_CACHED) print $data;
- $ret[] = $data;
- }
- if ($ret_all) return $ret_all;
- return $ret;
- }
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement