Jump to content

Channel em que so Staff entra


fenix2009

Recommended Posts

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 by Mário.
Link to comment

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.

info-canal.jpg?1520895830

input_login.cpp

Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...