

gcr_fc
Bronze Membergcr_fc ganhou no último dia 31 de Janeiro
gcr_fc teve o conteúdo mais curtida!
5 Seguidores
Sobre Mim
-
Discord
GuiCandiotto
Últimos Visitantes
1.826 visualizações
gcr_fc's Achievements
-
gcr_fc começou a seguir Descompilação NPC_King , Descompilção CUser TMSrv 7.57+ , Descompilação Exec_MSG_ReqRanking 0x39F - TMsrv 7.56 / TMsrv 7.57 e 3 outros
-
class CUser //Size Original TMSrv 7.57 4040 Bytes { public: char AccountName[ACCOUNTNAME_LENGTH]; //0 - 15 - CORRETO - TMSrv 7.57 61AAAB8 int Slot; //16 - 19 - CORRETO - TMSrv 7.57 61AAAC8 0x10 unsigned long IP; //20 - 23 - CORRETO - TMSrv 7.57 61AAACC 0x14 int Mode; //24 - 27 - CORRETO - TMSrv 7.57 61AAAD0 0x18 int TradeMode; //28 - 31 - CORRETO - TMSrv 7.57 61AAAD4 0x1C CPSock cSock; //32 - 107 - CORRETO - TMSrv 7.57 61AAAD8 0x20 STRUCT_ITEM Cargo[MAX_CARGO]; //108 - 1131 - CORRETO - TMSrv 7.57 61AAB24 0x6C int Gold; //1132 - 1135 - CORRETO - TMSrv 7.57 61AAF24 0x46C int AttackCount; //1136 - 1139 - CORRETO - TMSrv 7.57 61AAF28 0x470 MSG_Trade Trade; //1140 - 1295 - CORRETO - TMSrv 7.57 61AAF2C 0x474 MSG_SendAutoTrade AutoTrade; //1296 - 1491 - CORRETO - TMSrv 7.57 61AAFC8 0x510 int LastAttack; //1492 - 1495 - CORRETO - TMSrv 7.57 61AB08C 0x5D4 int LastAttackTick; //1496 - 1499 - CORRETO - TMSrv 7.57 61AB090 0x5D8 int LastMove; //1500 - 1503 - CORRETO - TMSrv 7.57 61AB094 0x5DC int LastAction; //1504 - 1507 - CPRRETO - TMSrv 7.57 61AB098 0x5E0 int LastActionTick; //1508 - 1511 - CORRETO - TMSrv 7.57 61AB09C 0x5E4 int LastIllusionTick; //1512 - 1515 - CORRETO - TMSrv 7.57 61AB0A0 0x5E8 int CrackErrorCount; //1516 - 1519 - CORRETO - TMSrv 7.57 61AB0A4 0x5EC STRUCT_SELCHAR SelChar; //1520 - 2267 - CORRETO - TMSrv 7.57 61AB0A8 0x5F0 char LastChat[NAME_LENGTH]; //2260 - 2275 - CORRETO - TMSrv 7.57 61AB3F0 0x938 char UserBillStatus[4]; //2276 - 2279 - CORRETO - TMSrv 7.57 61AB400 0x948 char Session[32]; //2280 - 2411 - CORRETO - TMSrv 7.57 61AB404 0x94C char SkillBar2[16]; //2412 - 2427 - CORRETO - TMSrv 7.57 61AB424 0x96C int LastX; //2428 - 2431 - CORRETO - TMSrv 7.57 61AB434 0x97C int LastY; //2432 - 2435 - CORRETO - TMSrv 7.57 61AB438 0x980 BOOL Whisper; //2436 - 2439 - CORRETO - TMSrv 7.57 61AB43C 0x984 0 on - 1 off BOOL GuildChat; //2440 - 2443 - CORRETO - TMSrv 7.57 61AB440 0x988 0 on - 1 off BOOL PartyChat; //2444 - 2447 - CORRETO - TMSrv 7.57 61AB444 0x98C 0 on - 1 off BOOL Chatting; //2448 - 2451 - CORRETO - TMSrv 7.57 61AB448 0x990 0 on - 1 off BOOL KingdomChat; //2452 - 2455 - CORRETO - TMSrv 7.57 61AB44C 0x994 0 on - 1 off char AutoTradeName[MAX_AUTOTRADETITLE]; //2456 - 2479 - CORRETO - TMSrv 7.57 61AB450 0x998 BOOL PKMode; //2480 - 2483 - CORRETO - TMSrv 7.57 61AB468 0x9B0 int ReqHp; //2484 - 2487 - CORRETO - TMSrv 7.57 61AB46C 0x9B4 int ReqMp; //2488 - 2491 - CORRETO - TMSrv 7.57 61AB470 0x9B8 int bQuaff; //2492 - 2495 - CORRETO - TMSrv 7.57 61AB474 0x9BC char MacAddress[16]; //2496 - 2511 - CORRETO - TMSrv 7.57 61AB478 0x9C0 BOOL ChallengeMode; //2512 - 2515 - CORRETO - TMSrv 7.57 61AB488 0x9D0 int ChallengerIndex; //2516 - 2519 - CORRETO - TMSrv 7.57 61AB48C 0x9D4 int ChallengeType; //2520 - 2523 - CORRETO - TMSrv 7.57 61AB490 0x9D8 int LastReceiveTime; //2524 - 2527 - CORRETO - TMSrv 7.57 61AB494 0x9DC int Admin; //2528 - 2531 - CORRETO - TMSrv 7.57 61AB498 0x9E0 int Child; //2532 - 2535 - CORRETO - TMSrv 7.57 61AB49C 0x9E4 unsigned int ReqBillSec; //2536 - 2539 - CORRETO - TMSrv 7.57 61AB4A0 0x9E8 int CharLoginTime; //2540 - 2543 - CORRETO - TMSrv 7.57 61AB4A4 0x9EC int CastleStateControl; //2544 - 2547 - CORRETO - TMSrv 7.57 61AB4A8 0x9F0 int LogoutAttDelay; //2548 - 2551 - CORRETO - TMSrv 7.57 61AB4AC 0x9F4 int RecallAttDelay; //2552 - 2555 - CORRETO - TMSrv 7.57 61AB4B0 0x9F8 int RestartAttDelay; //2556 - 2559 - CORRETO - TMSrv 7.57 61AB4B4 0x9FC int SummonedMobId; //2560 - 2563 - CORRETO - TMSrv 7.57 61AB4B8 0xA00 int unk_61AB4BC; //2564 - 2567 - CORRETO - TMSrv 7.57 61AB4BC 0xA04 int CubeTelPosition; //2568 - 2571 - CORRETO - TMSrv 7.57 61AB4C0 0xA08 char unk_61AB4C4[16]; //2572 - 2587 - CORRETO - TMSrv 7.57 61AB4C4 0xA0C int AcceptState; //2588 - 2591 - CORRETO - TMSrv 7.57 61AB4D4 0xA1C Nome Provisório -1 e 0 int unk_61AB4D8; //2592 - 2595 - CORRETO - TMSrv 7.57 61AB4D8 0xA20 int unk_61AB4DC; //2596 - 2599 - CORRETO - TMSrv 7.57 61AB4DC 0xA24 int unk_61AB4E0; //2600 - 2603 - CORRETO - TMSrv 7.57 61AB4E0 0xA28 int unk_61AB4E4; //2604 - 2607 - CORRETO - TMSrv 7.57 61AB4E4 0xA2C long long RiseExp; //2608 - 2615 - CORRETO - TMSrv 7.57 61AB4E8 0xA30 int unk_61AB4F0; //2616 - 2619 - CORRETO - TMSrv 7.57 61AB4F0 0xA38 int unk_61AB4F4; //2620 - 2623 - CORRETO - TMSrv 7.57 61AB4F4 0xA3C int unk_61AB4F8; //2624 - 2627 - CORRETO - TMSrv 7.57 61AB4F8 0xA40 int GameRoomState; //2628 - 2631 - CORRETO - TMSrv 7.57 61AB4FC 0xA44 int CurSecTime; //2632 - 2635 - CORRETO - TMSrv 7.57 61AB500 0xA48 Nome Provisório - recebe a SecTimer int LastSecTime; //2636 - 2639 - CORRETO - TMSrv 7.57 61AB504 0xA4C int SecTimeCounter; //2640 - 2643 - CORRETO - TMSrv 7.57 61AB508 0xA50 char TransperCode[52]; //2644 - 2695 - CORRETO - TMSrv 7.57 61AB50C 0xA54 int unk_61AB540; //2696 - 2699 - CORRETO - TMSrv 7.57 61AB540 0xA88 int unk_61AB544; //2700 - 2703 - CORRETO - TMSrv 7.57 61AB544 0xA8C char Snd[MAX_SND_LENGTH]; //2704 - 2831 - CORRETO - TMSrv 7.57 61AB548 0xA90 int CurAniMat; //2832 - 2835 - CORRETO - TMSrv 7.57 61AB5C8 0xB10 int CorrectRespQuizPos; //2836 - 2839 - CORRETO - TMSrv 7.57 61AB5CC 0xB14 int CurTimeRecvRandomQuiz; //2840 - 2843 - CORRETO - TMSrv 7.57 61AB5D0 0xB18 Time que recebeu a pergunda do quiz int MoveStopTick; //2844 - 2847 - CORRETO - TMSrv 7.57 61AB5D4 0xB1C Relacionado ao packet 0x2CB int MoveStopLastX; //2848 - 2851 - CORRETO - TMSrv 7.57 61AB5D8 0xB20 Relacionado ao packet 0x2CB int MoveStopLastY; //2852 - 2855 - CORRETO - TMSrv 7.57 61AB5DC 0xB24 Relacionado ao packet 0x2CB int IsWallX; //2856 - 2859 - CORRETO - TMSrv 7.57 61AB5E0 0xB28 Relacionado ao Packet de Movimento (WALL HACK) int IsWallY; //2860 - 2863 - CORRETO - TMSrv 7.57 61AB5E4 0xB2C Relacionado ao Packet de Movimento (WALL HACK) int unk_61AB5E8; //2864 - 2867 - CORRETO - TMSrv 7.57 61AB5E8 0xB30 int unk_61AB5EC; //2868 - 2871 - CORRETO - TMSrv 7.57 61AB5EC 0xB34 int UseAgainstAttack; //2872 - 2875 - CORRETO - TMSrv 7.57 61AB5F0 0xB38 Relacionado com a 9ª skill sobrevivencia 0 ou 1 STRUCT_REPURCHASEITEM RebuyItem[MAX_REBUY]; //2876 - 3035 - CORRETO - TMSrv 7.57 61AB5F4 0xB3C Aparentemente relacionado com a recompra de itens int unk_61AB694; //3036 - 3039 - CORRETO - TMSrv 7.57 61AB694 0xBDC Aparentemente um Count int GuildFame; //3040 - 3043 - CORRETO - TMSrv 7.57 61AB698 0xBE0 Nome Provisório - Algo relacionado com guildFame int LastSkillTick[MAX_SKILLLIST]; //3044 - 4039 - CORRETO - TMSrv 7.57 61AB69C 0xBE4 termina no 61ABA7F public: //TMSrv 7.57 004D8670 CUser(); //TMSrv 7.57 004D8A50 ~CUser(); //TMSrv 7.57 004D8AA0 void InitUser(); //TMSrv 7.57 004D8C10 int AcceptUser(int ListenSocket); //TMSrv 7.57 004D8E40 int CloseUser(); };
-
gcr_fc obteve troféu Feliz Natal 2024
-
Descompilação Exec_MSG_ReqRanking 0x39F - TMsrv 7.56 / TMsrv 7.57
gcr_fc respondeu ao tópico de Sc2ALLin em Descompilação
Show de bola, tá evoluindo bem nas descompilacoes, parabéns. -
TMSecurity.h #pragma once #include <cstdint> // Para tipos de dados padrão #include <cassert> // Para assert class TMSecurity { public: TMSecurity(); virtual ~TMSecurity(); char GetKeyword(int pos); char GetPasswordKey(); void InitializeKeys(); public: char GameKeyWords[512]; char PasswordKey; }; void MSHDecrypt(unsigned int* v, unsigned int* k); void MSHEncrypt(unsigned int* v, unsigned int* k); char* MSHEncDec(int Mode, const char* filename, char* ptr, int size); unsigned int* getkey(const char* file); TMSecurity.cpp #include "pch.h" #include "TMGlobal.h" const unsigned int DELTA = 0x9E3779B9; //0090AA50 TMSecurity::TMSecurity() //Função Ok { memset(GameKeyWords, 0, 512); PasswordKey = 180; //-76 } //0090AAF0 TMSecurity::~TMSecurity() //Função Ok { memset(GameKeyWords, 0, 512); } //0090AB90 char TMSecurity::GetKeyword(int pos) //Função Ok { char result = 0; if (GameKeyWords[pos]) result = GameKeyWords[pos]; return result; } //0090AC10 char TMSecurity::GetPasswordKey() //Função Ok { return PasswordKey; } //0090AC70 void TMSecurity::InitializeKeys() //Função Ok { std::string fileName = "Conf/VibrantGames.bin"; FILE* fp = NULL; if(!fopen_s(&fp, fileName.c_str(), "rb")) { fseek(fp, 0, 2); int file_size = ftell(fp); rewind(fp); char* buffer = (char*)malloc(file_size); if (buffer) { fread(buffer, 1, file_size, fp); fclose(fp); for (int i = 0; i < file_size; i++) buffer[i] ^= PasswordKey; char* p2 = MSHEncDec(1, (char*)fileName.c_str(), buffer, file_size); if (p2) { if (file_size > 512) file_size = 512; memcpy(&GameKeyWords, p2, file_size); free(p2); free(buffer); } } } else MessageBoxA(0, "Please, reinstall the game, data corrupted!", "Vibrant Games", 0); } //00950210 char* MSHEncDec(int Mode, const char* filename, char* ptr, int size) //Função Ok { if (!filename || !ptr || !size) return NULL; const char* file = filename; for (int i = strlen(filename) - 1; i > 0; i--) { if (filename[i] == '/' || filename[i] == '\\') { file = &filename[i + 1]; break; } } int blocks = size / 8; char* out = (char*)malloc(size); if (!out) return NULL; unsigned int* key = getkey(file); if (!key) { free(out); return NULL; } unsigned char* pout = reinterpret_cast<unsigned char*>(out); unsigned int v[2]; for (int i = 0; i < blocks; i++, ptr += 8, pout += 8) { memcpy(v, ptr, sizeof(v)); if (!Mode) MSHEncrypt(v, key); else MSHDecrypt(v, key); memcpy(pout, v, sizeof(v)); } SecureZeroMemory(key, 4 * sizeof(unsigned int)); free(key); return out; } //00950080 void MSHDecrypt(unsigned int* v, unsigned int* k) //Função Ok { unsigned int v0 = v[0]; unsigned int v1 = v[1]; unsigned int sum = DELTA * 32; for (int i = 0; i < 32; i++) { v1 -= ((v0 << 4) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) + k[3]); v0 -= ((v1 << 4) + k[0]) ^ (v1 + sum) ^ ((v1 >> 5) + k[1]); sum -= DELTA; } v[0] = v0; v[1] = v1; } //00950440 void MSHEncrypt(unsigned int* v, unsigned int* k) //Função Ok { unsigned int v1 = v[0]; unsigned int v0 = v[1]; unsigned int sum = 0; for (int i = 0; i < 32; i++) { sum += DELTA; v0 += ((v1 << 4) + k[0]) ^ (v1 + sum) ^ ((v1 >> 5) + k[1]); v1 += ((v0 << 4) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) + k[3]); } v[0] = v0; v[1] = v1; } //00950920 unsigned int* getkey(const char* file) //Função Ok { unsigned int* key = (unsigned int*)malloc(4 * sizeof(unsigned int)); if (!key) return NULL; int len = strlen(file); char* newFile = (char*)malloc(len); if (!newFile) { free(key); return NULL; } for (int i = 0; file[i] && i < len; i++) newFile[i] = tolower(file[i]); memset(key, (13 * len) + 73, 4 * sizeof(unsigned int)); for (int j = 0; j < len; j++) key[j % 4] ^= newFile[j]; free(newFile); return key; } BaseDef.cpp //0067F240 bool BASE_IsEncrypted(const char* file) //Função Ok { FILE* fp = fopen(file, "rb"); if (!fp) return false; bool encrypted = false; int code[3]{}; if (fread(code, 1, 4, fp) == 4) { if(strstr(file, ".msa") || strstr(file, ".vgo")) { if (code[0] && code[0] != 322 && code[0] != 274) encrypted = true; } else if (strstr(file, ".msh") || strstr(file, ".vgm")) { if (code[0]) encrypted = true; } else if (strstr(file, ".wys") || strstr(file, ".vgt")) { if (code[0] && code[0] != 0x30315357 && code[0] != 0x30315457) encrypted = true; } else if (strstr(file, ".wyt") || strstr(file, ".vgi")) { if (code[0] && code[0] != 0x30315457 && code[0] != 0x30315357) encrypted = true; } } fclose(fp); return encrypted; } Criem uma variaval global para a classe TMSecurity, nome original g_pSecurityManager A g_pSecurityManager->InitializeKeys() dever ser chamada dentro da NewApp A função de decode é chamada nesses locais //00690380 int CMesh::LoadMesh(char* file) //Função Ok //0075E550 int TextureManager::LoadUITexture(int nIndex, int nSrcIndex) //Função Ok //0075C110 int TextureManager::LoadEffectTexture(int nIndex) //Função Ok //0075D940 int TextureManager::LoadModelTexture(int nIndex) //Função Ok //0075CCA0 int TextureManager::LoadEnvTexture(int nIndex) //Função Ok //008E3B10 int TMMesh::LoadMsa(const char* szFileName) //Função Ok //00697C90 char* CPSock::ReadMessage(int* ErrorCode, int* ErrorType) //Função Ok //00697340 int CPSock::AddMessage(char* pMsg, int Size, int FixedKeyWord) //Função Ok A implementacao delas é com vcs
-
void CloseUser(int conn, int numError) //Função Ok { if (!IsPlayer(conn)) { sprintf_s(temp, "err, mob:%s conn:%d pos:%d,%d", pMob[conn].MOB.MobName, conn, pMob[conn].TargetX, pMob[conn].TargetY); Log(temp, "-system", 0); return; } if (pUser[conn].Mode == USER_PLAY && pMob[conn].TargetX >= 0 && pMob[conn].TargetX < MAX_GRIDX && pMob[conn].TargetY >= 0 && pMob[conn].TargetY < MAX_GRIDY) pMobGrid[pMob[conn].TargetY][pMob[conn].TargetX] = MOB_EMPTY; pUser[conn].Admin = FALSE; if (pUser[conn].cSock.Sock) { sprintf_s(temp, "clo,fd %d-%d conn:%d num:%d", pUser[conn].Mode, pMob[conn].Mode, conn, numError); Log(temp, pUser[conn].AccountName, pUser[conn].IP); if (pUser[conn].GameRoomState) sprintf_s(temp, "pcr,Logout fd %d", pUser[conn].Mode); } pUser[conn].cSock.CloseSocket(); pMob[conn].MOB.Equip[FACE].Index = pMob[conn].MobFace; int userMode = pUser[conn].Mode; if (userMode == USER_EMPTY || userMode == USER_ACCEPT) { pUser[conn].CloseUser(); return; } if (userMode == USER_PLAY || userMode == USER_SAVING4QUIT) { RemoveParty(conn, 0); int otherTrade = pUser[conn].Trade.OpponentID; if (IsPlayer(otherTrade) && pUser[otherTrade].Mode == USER_PLAY && pUser[otherTrade].Trade.OpponentID == conn) RemoveTrade(otherTrade); pUser[conn].Trade.OpponentID = MOB_EMPTY; MSG_SavingQuit pSavingQuit{}; pSavingQuit.Header.Type = _MSG_SavingQuit; pSavingQuit.Header.Size = sizeof MSG_SavingQuit; if (pUser[conn].Slot < 0 || pUser[conn].Slot >= 4) return; pMob[conn].MOB.Equip[FACE].Index = pMob[conn].MobFace; memcpy(&pSavingQuit.MOB, &pMob[conn].MOB, sizeof STRUCT_MOB); memcpy(pMob[conn].Ext1.Affect, pMob[conn].Affect, sizeof STRUCT_AFFECT * MAX_AFFECT); memcpy(&pSavingQuit.Ext1, &pMob[conn].Ext1, sizeof STRUCT_EXT1); memcpy(&pSavingQuit.Ext2, &pMob[conn].Ext2, sizeof STRUCT_EXT2); memcpy(pSavingQuit.Cargo, pUser[conn].Cargo, sizeof STRUCT_ITEM * MAX_CARGO); memcpy(pSavingQuit.ShortSkill, pUser[conn].SkillBar2, 16); memcpy(pSavingQuit.AccountName, pUser[conn].AccountName, NAME_LENGTH); pSavingQuit.Coin = pUser[conn].Gold; pSavingQuit.Header.ID = conn; if(DBServerSocket.AddMessage((char*)&pSavingQuit, pSavingQuit.Header.Size)) DBServerSocket.SendMessageA(); else { int attemptsCount = 0; for (int i = 0; i < 5; i++) { int* ip = (int*)LocalIP; if(DBServerSocket.SingleConnect(DBServerAddress, DBServerPort, *ip, WSA_READDB)) break; Sleep(100); attemptsCount++; } if (attemptsCount == 5) Log("err, critical!!! - close user fail", pUser[conn].AccountName, pUser[conn].IP); else { DBServerSocket.SendMessageA(); DBServerSocket.AddMessage((char*)&pSavingQuit, pSavingQuit.Header.Size); } } pUser[conn].Mode = USER_SAVING4QUIT; DeleteMob(conn, DELETE_DISCONNECT); pUser[conn].CrackErrorCount = 0; return; } MSG_STANDARD pNoNeedSave{}; pNoNeedSave.Header.Type = _MSG_DBNoNeedSave; pNoNeedSave.Header.ID = conn; pNoNeedSave.Header.Size = sizeof MSG_STANDARD; DBServerSocket.SendOneMessage((char*)&pNoNeedSave, pNoNeedSave.Header.Size); pMob[conn].Mode = MOB_EMPTY; pUser[conn].CloseUser(); } #define _MSG_SavingQuit (6 | FLAG_GAME2DB) //0x806 struct MSG_SavingQuit //size 2752 { PACKET_HEADER Header; int Slot; STRUCT_MOB MOB; STRUCT_ITEM Cargo[MAX_CARGO]; int Coin; char ShortSkill[16]; char AccountName[NAME_LENGTH]; STRUCT_EXT1 Ext1; STRUCT_EXT2 Ext2; }; #define IsPlayer(conn) ((((conn) > MOB_EMPTY && (conn) < MAX_USER) ? TRUE : FALSE))
-
void ProcessTrainingCamp(int conn, int npcId, int confirm, int merchant) { int questFlag = -1; if (merchant == 36) questFlag == 8; else if (merchant == 40) questFlag == 9; else if (merchant == 41) questFlag == 10; else if (merchant == 43) questFlag == 11; int questBit = 1 << questFlag; int questLvl = questFlag - 8; if (pMob[conn].MOB.CurrentScore.Level > 35 && pMob[conn].MOB.CurrentScore.Level < MAX_USER) return; int keyId = 451 + questLvl; if (questLvl != 3 && pMob[conn].MOB.Quest & questBit) { SendClientMessage(npcId, TRUE, _NN_NewbieQuest_Already1 + questLvl); return; } if (keyId == 454) keyId == 524; //Emblema_Orc int i; for (i = 0; i < MAX_VISIBLE_INVENTORY; i++) { if (pMob[conn].MOB.Inventory[i].Index == keyId) break; } if (i == MAX_VISIBLE_INVENTORY) { SendClientMessage(npcId, TRUE, _NN_NewbieQuest_Cheerup1 + questLvl); return; } SendClientMessage(npcId, TRUE, _NN_NewbieQuest_Complete1 + questLvl); SendClientMessage(conn, FALSE, _NN_NewbieQuest_Reward1 + questLvl); pMob[conn].MOB.Quest |= questBit; if (!questLvl) { STRUCT_ITEM reward{}; reward.Index = 682; //Kit_de_Cura_(20_M.) reward.EF1 = EF_AMOUNT; reward.EFV1 = 20; PutItem(conn, &reward); } else if (questLvl == 1) { int weaponId = pMob[conn].MOB.Equip[WEAPON].Index; if (weaponId >= 3000 && weaponId <= 3007) return; if (weaponId > 0 && weaponId < MAX_ITEMLIST) { char str1[128]{}; char str2[128]{}; int reqLvl = g_pItemList[weaponId].ReqLvl; if (reqLvl > 36 && reqLvl < 1000) return; int baseLvl = 50; BASE_GetItemCode(&pMob[conn].MOB.Equip[WEAPON], str1); int ef1 = pMob[conn].MOB.Equip[WEAPON].EF1; int efv1 = pMob[conn].MOB.Equip[WEAPON].EFV1; pMob[conn].MOB.Equip[WEAPON].EF1 = 0; pMob[conn].MOB.Equip[WEAPON].EFV1 = 0; pMob[conn].MOB.Equip[WEAPON].EF2 = 0; pMob[conn].MOB.Equip[WEAPON].EFV2 = 0; pMob[conn].MOB.Equip[WEAPON].EF3 = 0; pMob[conn].MOB.Equip[WEAPON].EFV3 = 0; SetItemBonus(&pMob[conn].MOB.Equip[WEAPON], reqLvl + baseLvl, TRUE, 0, FALSE); pMob[conn].MOB.Equip[WEAPON].EF1 = ef1; pMob[conn].MOB.Equip[WEAPON].EFV1 = efv1; SendItem(conn, EQUIP_TYPE, WEAPON, &pMob[conn].MOB.Equip[WEAPON]); BASE_GetItemCode(&pMob[conn].MOB.Equip[WEAPON], str2); sprintf(temp, "que, chobo_quest2 befor:%s after:%s", str1, str2); Log(temp, pUser[conn].AccountName, pUser[conn].IP); SetTick(conn, 44, 200, 200); SendScore(conn); } } else if (questLvl == 2) { for (int j = 0; j < 8; j++) { int itemId = pMob[conn].MOB.Equip[j].Index; if (itemId < 500 || itemId >= MAX_ITEMLIST) return; int reqLvl = g_pItemList[itemId].ReqLvl; if (reqLvl > 36 && reqLvl < 1000) return; int itemSanc = BASE_GetItemSanc(&pMob[conn].MOB.Equip[j]); if (itemSanc < 7) itemSanc += (rand() % 3) + 1; if (itemSanc > 9) itemSanc = 9; BASE_SetItemSanc(&pMob[conn].MOB.Equip[j], itemSanc, 0); SendItem(conn, EQUIP_TYPE, j, &pMob[conn].MOB.Equip[j]); } SetTick(conn, 44, 200, 200); SendScore(conn); SendEquip(conn, conn); } else if (questLvl == 3) { int sort = rand() % 3; if (sort == 0) { STRUCT_ITEM reward{}; reward.Index = 682; //Kit_de_Cura_(20_M.) reward.EF1 = EF_AMOUNT; reward.EFV1 = 20; PutItem(conn, &reward); } else if (sort == 1) { STRUCT_ITEM reward{}; reward.Index = 481; //Olho_Crescente PutItem(conn, &reward); } else { STRUCT_ITEM reward{}; reward.Index = 651 + (rand() % 3); //Rubi_do_Carbunkle PutItem(conn, &reward); } SetTick(conn, 44, 200, 200); SendScore(conn); BASE_ClearItem(&pMob[conn].MOB.Inventory[i]); SendItem(conn, INVEN_TYPE, i, &pMob[conn].MOB.Inventory[i]); } }
-
Descompilação SendSummonParty TMSrv 7.57+ Packet 0x3EA
gcr_fc respondeu ao tópico de gcr_fc em Descompilação
Basicamente tá tudo aí, tem que dar uma revisada nos códigos e tal, mas basicamente tem todos... -
void ProcessKings(int conn, int npcId, int confirm) { if (pMob[conn].MOB.Equip[ORB].Index == 1742 && pMob[conn].MOB.Equip[STONE].Index >= 1760 && pMob[conn].MOB.Equip[STONE].Index <= 1763) { if (!BASE_GetCheckFace(pMob[conn].MobFace)) //Criar o Arch { if (!confirm) { SendClientMessage(npcId, TRUE, _NN_NewCharacter); return; } if (pMob[conn].MOB.BaseScore.Level < TransLevel - 1) { SendClientMessage(npcId, TRUE, _NN_NeedMoreExp); return; } int archSlot = -1; int archClass = (((pMob[conn].MobFace / 10) * 4) + (pMob[conn].MOB.Equip[STONE].Index - 1760)) + 4; char archName[NAME_LENGTH]{}; sprintf_s(archName, "%s", pMob[conn].MOB.MobName); strupr(archName); int sameNameCount = 0; for (int i = 0; i < MOB_PER_ACCOUNT; i++) { if (!pUser[conn].SelChar.Name[i]) continue; char tmpName[NAME_LENGTH]{}; strcpy(tmpName, pUser[conn].SelChar.Name[i]); strupr(tmpName); if (!strcmp(tmpName, archName)) { sameNameCount++; if (sameNameCount >= 2) { SendClientMessage(conn, FALSE, _NN_SameCharAlready); return; } } } for (int i = 0; i < MOB_PER_ACCOUNT; i++) { if (pUser[conn].SelChar.Name[i]) continue; archSlot = i; break; } if (archSlot == -1) { SendClientMessage(conn, FALSE, _NN_NoEmptySlot); return; } sprintf_s(temp, "que,transchar: %s, class: %d, slot: %d", pMob[conn].MOB.MobName, archClass, archSlot); Log(temp, pUser[conn].AccountName, pUser[conn].IP); pMob[conn].MOB.Equip[ORB].Index = 0; pMob[conn].MOB.Equip[STONE].Index = 0; CharLogOut(conn); MSG_NewCharacter pNewChar{}; pNewChar.Header.Type = _MSG_DBNewCharacter; pNewChar.Header.Size = sizeof MSG_NewCharacter; pNewChar.Header.ID = conn; strncpy(pNewChar.MobName, pMob[conn].MOB.MobName, NAME_LENGTH); pNewChar.Slot = archSlot; pNewChar.Class = archClass; pUser[conn].Mode = USER_WAITDB; DBServerSocket.SendOneMessage((char*)&pNewChar, pNewChar.Header.Size); SendClientMessage(conn, FALSE, _NN_Congratulations_Trans); SendClientSignalParm2(conn, 0, _MSG_SendArchEffect, archSlot, 0); return; } //Criar a Ideal int secretStoneSlot[4]{ -1, -1, -1, -1 }; for (int i = 0; i < MAX_VISIBLE_INVENTORY; i++) { if (pMob[conn].MOB.Inventory[i].Index == 5334) secretStoneSlot[0] = i; else if (pMob[conn].MOB.Inventory[i].Index == 5335) secretStoneSlot[1] = i; else if (pMob[conn].MOB.Inventory[i].Index == 5336) secretStoneSlot[2] = i; else if (pMob[conn].MOB.Inventory[i].Index == 5337) secretStoneSlot[3] = i; } if (secretStoneSlot[0] == -1 || secretStoneSlot[1] == -1 || secretStoneSlot[2] == -1 || secretStoneSlot[3] == -1) return; if (SendPutItemInvCarry(conn, 5338, 0)) { for (int i = 0; i < 4; i++) { memset(&pMob[conn].MOB.Inventory[secretStoneSlot[i]], 0, sizeof STRUCT_ITEM); //ebp-0bc8 SendItem(conn, INVEN_TYPE, secretStoneSlot[i], &pMob[conn].MOB.Inventory[secretStoneSlot[i]]); } memset(&pMob[conn].MOB.Equip[ORB], 0, sizeof STRUCT_ITEM); SendItem(conn, EQUIP_TYPE, ORB, &pMob[conn].MOB.Equip[ORB]); memset(&pMob[conn].MOB.Equip[STONE], 0, sizeof STRUCT_ITEM); SendItem(conn, EQUIP_TYPE, STONE, &pMob[conn].MOB.Equip[STONE]); pMob[conn].GetCurrentScore(conn); SendScore(conn); } sprintf_s(temp, "que,transchar 2 make 5338: %s", pMob[conn].MOB.MobName); Log(temp, pUser[conn].AccountName, pUser[conn].IP); return; } //Capas int npcKingdom = pMob[npcId].MOB.Clan; int curLvl = pMob[conn].MOB.CurrentScore.Level; int capeLvl = 0; if (pMob[conn].CheckEvolution() == CELESTIAL) curLvl += MAX_LEVEL; int capeId = pMob[conn].MOB.Equip[CAPE].Index; int kingdomEmblem = FALSE; if (pMob[conn].MOB.Equip[PET].Index == 4081) kingdomEmblem = TRUE; int curKingdom = BASE_GetKingdom(capeId); if (capeId == 3197 || capeId == 3198 || capeId == 3199) //Mestre_de_Hekalotia - Mestre_de_Akelonia - Mestre_dos_Aventureiros capeLvl = 4; if (capeId == 3194 || capeId == 3195 || capeId == 3196) //Herói_de_Hekalotia - Herói_de_Akelonia - Herói_dos_Aventureiros capeLvl = 4; if (capeId == 3191 || capeId == 3192 || capeId == 3193) //Elite_de_Hekalotia - Elite_de_Akelonia - Elite_dos_Aventureiros capeLvl = 3; if (capeId == 543 //Manto_do_Guerreiro || capeId == 544 //Manto_de_Shiner || capeId == 1766 //Capa_dos_Campeões || capeId == 1767 //Capa_dos_Campeões || capeId == 1768 //Capa_dos_Campeões || capeId == 1769 //Capa_dos_Campeões || capeId == 1770 //Capa_dos_Campeões || capeId == 1771) //Capa_dos_Campeões { capeLvl = 2; } if (capeId == 545 || capeId == 546 || capeId == 549) //Manto_Hekalotia - Manto_Akelonia - Manto_do_Aventureiro capeLvl = 1; if (curKingdom == 6) curKingdom = 0; if (curKingdom && curKingdom != npcKingdom) return; if (Sapphire < 1) Sapphire = 1; int calcSapphireBlue = Sapphire / 100; int calcSapphireRed = 64 - calcSapphireBlue; if (calcSapphireBlue < 4) calcSapphireBlue = 4; if (calcSapphireRed < 4) calcSapphireRed = 4; int reqSapphire = 0; if (npcKingdom == KINGDOM_BLUE) reqSapphire = calcSapphireBlue; if (npcKingdom == KINGDOM_RED) reqSapphire = calcSapphireRed; if (confirm) { if (capeLvl >= 2 && curKingdom) { if (npcKingdom == KINGDOM_BLUE) { SendClientMessage(conn, FALSE, _NN_My_King_Bless1); return; } if (npcKingdom == KINGDOM_RED) { SendClientMessage(conn, FALSE, _NN_My_King_Bless2); return; } } if (curLvl < 219 || (capeLvl == 1 && curLvl < 255)) { SendClientMessage(conn, FALSE, _NN_Need_Level); return; } int unitSapphire = 0; int packSapphire = 0; if (!kingdomEmblem) { for (int i = 0; i < MAX_VISIBLE_INVENTORY; i++) { if (pMob[conn].MOB.Inventory[i].Index == 697 || pMob[conn].MOB.Inventory[i].Index == 4131) { int amount = BASE_GetItemAmount(&pMob[conn].MOB.Inventory[i]); if (amount == 0) unitSapphire++; if (amount > 0) { if (amount == 10) packSapphire = 1; unitSapphire += amount; } } } if (unitSapphire < reqSapphire) { sprintf(temp, "%d", reqSapphire); SendClientMessage(conn, FALSE, _DN_Need_D_Sapphire, temp); return; } if (unitSapphire > reqSapphire && packSapphire > 0) { SendClientMessage(conn, FALSE, _NN_NeedOverSapp); return; } } else { if (capeLvl == 1) return; if(curLvl < 220) { SendClientMessage(conn, FALSE, _NN_Level_Limit2); return; } if (BASE_CheckQuestBit(pMob[conn].Ext2.Quest[1], 7)) { SendClientMessage(conn, FALSE, _NN_Youve_Done_It_Already); return; } } int saveSapphire = reqSapphire; if (!kingdomEmblem) { for (int i = 0; i < MAX_VISIBLE_INVENTORY; i++) { if (pMob[conn].MOB.Inventory[i].Index == 697 || pMob[conn].MOB.Inventory[i].Index == 4131) { int amount = BASE_GetItemAmount(&pMob[conn].MOB.Inventory[i]); if (amount == 0) reqSapphire--; if (amount > 0) { if (amount == 10) packSapphire = 1; reqSapphire -= amount; } memset(&pMob[conn].MOB.Inventory[i], 0, sizeof STRUCT_ITEM); SendItem(conn, INVEN_TYPE, i, &pMob[conn].MOB.Inventory[i]); if (reqSapphire <= 0) break; } } } else { memset(&pMob[conn].MOB.Equip[PET], 0, sizeof STRUCT_ITEM); SendItem(conn, EQUIP_TYPE, PET, &pMob[conn].MOB.Equip[PET]); BASE_SetQuestBit(&pMob[conn].Ext2.Quest[1], 7); } if (capeId >= 3197 && capeId <= 3199 && npcKingdom == KINGDOM_BLUE) pMob[conn].MOB.Equip[CAPE].Index = 3197; else if (capeId >= 3197 && capeId <= 3199 && npcKingdom == KINGDOM_RED) pMob[conn].MOB.Equip[CAPE].Index = 3198; else if (capeId == 572 && npcKingdom == KINGDOM_BLUE) pMob[conn].MOB.Equip[CAPE].Index = 1766; else if (capeId == 572 && npcKingdom == KINGDOM_RED) pMob[conn].MOB.Equip[CAPE].Index = 1769; else if (capeId == 573 && npcKingdom == KINGDOM_BLUE) pMob[conn].MOB.Equip[CAPE].Index = 1767; else if (capeId == 573 && npcKingdom == KINGDOM_RED) pMob[conn].MOB.Equip[CAPE].Index = 1770; else if (capeId == 574 && npcKingdom == KINGDOM_BLUE) pMob[conn].MOB.Equip[CAPE].Index = 1768; else if (capeId == 574 && npcKingdom == KINGDOM_RED) pMob[conn].MOB.Equip[CAPE].Index = 1771; else if (capeId >= 3191 && capeId <= 3193 && npcKingdom == KINGDOM_BLUE) pMob[conn].MOB.Equip[CAPE].Index = 3191; else if (capeId >= 3191 && capeId <= 3193 && npcKingdom == KINGDOM_RED) pMob[conn].MOB.Equip[CAPE].Index = 3192; else if (capeId >= 3194 && capeId <= 3196 && npcKingdom == KINGDOM_BLUE) pMob[conn].MOB.Equip[CAPE].Index = 3194; else if (capeId >= 3194 && capeId <= 3196 && npcKingdom == KINGDOM_RED) pMob[conn].MOB.Equip[CAPE].Index = 3195; else { if (capeLvl == 1) { if (capeId != 549) memset(&pMob[conn].MOB.Equip[CAPE], 0, sizeof STRUCT_ITEM); if (npcKingdom == KINGDOM_BLUE) pMob[conn].MOB.Equip[CAPE].Index = 543; else pMob[conn].MOB.Equip[CAPE].Index = 544; } else { if (capeId != 548) memset(&pMob[conn].MOB.Equip[CAPE], 0, sizeof STRUCT_ITEM); if (npcKingdom == KINGDOM_BLUE) pMob[conn].MOB.Equip[CAPE].Index = 545; else pMob[conn].MOB.Equip[CAPE].Index = 546; } } SendItem(conn, EQUIP_TYPE, CAPE, &pMob[conn].MOB.Equip[CAPE]); if (npcKingdom == KINGDOM_BLUE) SendClientMessage(conn, FALSE, _NN_My_King_Bless1); else SendClientMessage(conn, FALSE, _NN_My_King_Bless2); sprintf(temp, "que,get mantle %d - sapphire:%d - newbie:%d", pMob[conn].MOB.Equip[CAPE].Index, saveSapphire, kingdomEmblem); Log(temp, pUser[conn].AccountName, pUser[conn].IP); SendEquip(conn, FALSE); pMob[conn].GetCurrentScore(conn); SendScore(conn); return; } if (!kingdomEmblem) { sprintf(temp, "%d", reqSapphire); SendClientMessage(conn, FALSE, _DN_Need_D_Sapphire, temp); } }