fenix2009 Posted March 11, 2018 at 11:46 PM Share Posted March 11, 2018 at 11:46 PM Boas amiguinhos, Venho pedir se alguem conheçe um TuT em que dé pra criar um channel em que so os GM´s, quem tem na db a conta como GM consiga logar nesse channel, e que dé pra ter um core diferente dos restantes... Link to comment Share on other sites More sharing options...
Mário. Posted March 12, 2018 at 01:06 AM Share Posted March 12, 2018 at 01:06 AM (edited) Bem, não durmo há quase 2 dias por isso desculpa se isto não é propriamente a solução que tu queres. O pensamento lógico que estou a seguir agora é de entrares num core público (vamos imaginar, o 1) e quereres ir para um core privado que só os GMs consigam ter acesso. A forma lógica será mais ou menos isto: core1 <- core privado <- core 1 <- core privado Ou seja, sais de um core para ires para o outro e assim sucessivamente. Para tal, é necessário que cries ou dediques um dos cores que já tens disponível para isso acontecer, depois disso terás que inserir um mapa no mesmo (MAP_INDEX no CONFIG) pois será utilizado como um ponto de partida entre os dois cores. Pronto, a partir daí segue o tutorial: Adiciona o seguinte logo na primeira linha do questlua_pc.cpp: #include "desc_manager.h" Procura por: int pc_give_award(lua_State* L) Adiciona em baixo: int pc_disconnect(lua_State* L) { if (!lua_isstring(L, 1)) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); LPDESC d = DESC_MANAGER::instance().FindByCharacterName(ch->GetName()); DESC_MANAGER::instance().DestroyDesc(d); } else { LPDESC d = DESC_MANAGER::instance().FindByCharacterName(lua_tostring(L, 1)); LPCHARACTER tch = d ? d->GetCharacter() : NULL; if (!tch) { lua_pushnumber(L, 0); return 0; } DESC_MANAGER::instance().DestroyDesc(d); } return 1; } Procura por: { "give_award", pc_give_award }, Adiciona em baixo: { "disconnect", pc_disconnect }, Adiciona no quest_function: pc.disconnect Agora utiliza a seguinte quest: quest core1_core2 begin state begin when login with pc.get_map_index() == ID_INDEX begin if pc.is_gm() then return else pc.disconnect() end end -- when 9003.chat."Core Privado" begin -- if pc.is_gm() then -- say_title("Core Privado:") -- say("Queres teleportar para um core privado?") -- if select("Sim","Não") != 2 then -- pc.warp(x,y) -- end -- else -- local pw = "12345" -- say_title("Core Privado:") -- say("Insere a palavra-passe para entrares no core privado.") -- local tlthings = input() -- say_title("Core Privado:") -- if tlthings != pw then -- say("A palavra-passe está incorreta.") -- return -- else -- pc.warp(x,y) -- end -- end -- end when 9003.chat."Core Privado" with pc.is_gm() begin -- Só irá aparecer para os GMs say_title("Core Privado:") say("Queres teleportar para um core privado?") if select("Sim","Não") != 2 then pc.warp(x,y) end end end end ID_INDEX -> ID do mapa que inseriste no CONFIG; pc.warp(x,y) -> Coordenadas para o mapa. Tudo que está comentado é só em caso de quereres levar alguém que não seja GM para esse core (para testes, etc.) desde que a pessoa saiba o código. PS: Li de novo o teu tópico e percebi que querias era criar um canal lmao, isso é totalmente possível mas mais complexo, terias que criar uma nova dict no intrologin, assegurar que o mesmo fosse igual com o da base de dados e torna-lo eficiente, algo como isto: if not self.__isGameMaster(): self.PopupNotifyMessage("Não podes entrar no canal porque não és membro da equipa") return Mas de qualquer forma, o tudo o que está feito acima também pode servir como solução. Edited March 12, 2018 at 01:17 AM by Mário. Link to comment Share on other sites More sharing options...
xkillmt2 Posted March 12, 2018 at 11:13 PM Share Posted March 12, 2018 at 11:13 PM Bem, deixo aqui a minha solução pra isso. Vá em game/src/input_login.cpp e pesquise por: static bool FN_is_battle_zone(LPCHARACTER ch) Adicione abaixo: static bool IsGMLogin(const char * m_szAccount) { char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "SELECT mAuthority FROM common.gmlist WHERE mAccount='%s'", m_szAccount); std::unique_ptr<SQLMsg> msg(DBManager::instance().DirectQuery(szQuery)); if (msg->Get()->uiNumRows == 0) { return false; } MYSQL_ROW row = mysql_fetch_row(msg->Get()->pSQLResult); std::string stAuth = row[0]; if (!stAuth.compare("PLAYER")) return false; return true; } Pesquise por: void CInputLogin::Login(LPDESC d, const char * data) Adicione acima da condição: if (g_bNoMoreClient) if(!IsGMLogin(login) && g_bChannel == 2) { failurePacket.header = HEADER_GC_LOGIN_FAILURE; strlcpy(failurePacket.szStatus, "DEVCORE", sizeof(failurePacket.szStatus)); d->Packet(&failurePacket, sizeof(TPacketGCLoginFailure)); return; } Pesquise por: void CInputLogin::LoginByKey(LPDESC d, const char * data) Adicione acima da condição: if (g_bNoMoreClient) if (!IsGMLogin(login) && g_bChannel == 2) { TPacketGCLoginFailure failurePacket; failurePacket.header = HEADER_GC_LOGIN_FAILURE; strlcpy(failurePacket.szStatus, "DEVCORE", sizeof(failurePacket.szStatus)); d->Packet(&failurePacket, sizeof(TPacketGCLoginFailure)); return; } Parte Cliente: Vá em root->intrologin.py e pesquise por: "AGELIMIT" : localeInfo.LOGIN_FAILURE_SHUTDOWN_TIME, Adicione abaixo: "DEVCORE" : localeInfo.LOGIN_FAILURE_DEVCORE, Agora pesquise em locale/xx/locale_game.txt por: LOGIN_PROCESSING Adicione abaixo: LOGIN_FAILURE_DEVCORE Canal exclusivo para Administrador. Configurei para o channel2(g_bChannel == 2) ser exclusivo para administradores. input_login.cpp Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now