ON

Doplayersendchannelsdialog(Cid)

Por Oneshot, 14 de jul. de 2012 em Linguagens de Programação

script
5
1.3k
OneshotO
14 de julho de 2012 às 12:45

Nome: doPlayerSendChannelsDialog(cid)

Tipo: Função LUA

Autor: Oneshot

 


 

Fala, bandiputa!

 

Recentemente baixei um servidor de Pokémon pela primeira vez para ver como funcionavam os sistemas lá dentro e fiquei impressionado com o sistema de clicar no computador e abrir a janela de canais.

 

E então eu pensei comigo - "Vou ver como é que eles fizeram, né." - Fucei as pastas e não tinha nada e então a realidade me bateu na cara. Sim, aquela era uma função programada diretamente no código fonte do servidor e mais uma vez a realidade me bateu denovo - Ninguém disponibiliza as sources de servidores de Pokémon.

 

Então o que eu fiz? Simples, desenvolvi minha própria função de abrir a janela de canais e ela é realmente simples, vocês mesmos irão ver.

 


 

Em luascript.h, procure por:

 

static int32_t luaGetChannelList(lua_State* L);

 

Logo após, adicione:

 

static int32_t luaDoPlayerSendChannelsDialog(lua_State* L);

 

Em luascript.cpp, procure por:

 

lua_register(m_luaState, "getChannelList", LuaInterface::luaGetChannelList);

 

Logo após, adicione:

 

lua_register(m_luaState, "doPlayerSendChannelsDialog", LuaInterface::luaDoPlayerSendChannelsDialog);

 

Ainda em luascript.cpp, procure por:

 

int32_t LuaInterface::luaGetChannelList(lua_State* L)
{
//getChannelList()
lua_newtable(L);
ChannelList list = g_chat.getPublicChannels();

ChannelList::const_iterator it = list.begin();
for(uint32_t i = 1; it != list.end(); ++it, ++i)
{
	createTable(L, i);
	setField(L, "id", (*it)->getId());
	setField(L, "name", (*it)->getName());

	setField(L, "flags", (*it)->getFlags());
	setField(L, "level", (*it)->getLevel());
	setField(L, "access", (*it)->getAccess());
	pushTable(L);
}

return 1;
}

 

E logo após, adicione:

 

int32_t LuaInterface::luaDoPlayerSendChannelsDialog(lua_State* L)
{
//doPlayerSendChannelsDialog(uid)
ScriptEnviroment* env = getEnv();
if(Player* player = env->getPlayerByUID(popNumber(L)))
{
	player->sendChannelsDialog();
	lua_pushboolean(L, true);
}
else
{
	errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
	lua_pushboolean(L, false);
}

return 1;
}

 

Agora é só compilar seu servidor no IDE de sua preferência.

 

Exemplo de Uso:

 

function onUse(cid, item, fromPosition, itemEx, toPosition)
return doPlayerSendChannelsDialog(cid)
end

 

Se o nome estiver muito grande é só adicionar isso no 100-compat.lua

 

sendChannelsDialog = doPlayerSendChannelsDialog


 

Vale lembrar que isso é feito nas sources, no código-fonte do seu servidor.

 

Abração \o/

Editado Julho 14 por Oneshot

2 semanas depois...
LeoxtibiaL
21 de julho de 2012 às 19:05

Cara, juro que esses dias estava procurando exatamente isso, como que funcionava. Muito bom.

1 mês depois...
JoseAngel18J
02 de agosto de 2012 às 20:37

muito bom mano, você pode ajudar com esse código: http://www.xtibia.com/forum/topic/190881-funcao-getdirectiontowalk-pda/? é necessário pra order system o sistema de PDA

2 semanas depois...
13 de agosto de 2012 às 16:02

como eu faço para colocar uma storage no channel? só mostrar o canal help por exemplo se o player tiver a storage 1070?

OneshotO
13 de agosto de 2012 às 19:38

Você teria que editar seu chat.cpp e adicionar esse recurso.