LU

Usando registerExtendedOpcode

Por LuckOake, 31 de mar. de 2013 em Clients

9
2.3k
LuckOakeL
31 de março de 2013 às 19:01

Olá.

 

Comecei a mexer no otclient e achei interessante o uso desses opcodes, mas ainda não consegui entender a parte do client de receber os dados.

 

Como eu utilizo o registerExtendedOpcode?

BaxnieB
31 de março de 2013 às 19:18

Em modules/gamelib/protocolgame.lua existe essa função:

 

function ProtocolGame.registerExtendedOpcode(opcode, callback)

 

Um exemplo de como utiliza-la:

 

local function test(protocol, opcode, buffer)
 print('received something from server!')
end

ProtocolGame.registerExtendedOpcode(100, test)

Editado Março 31 por Baxnie

LuckOakeL
31 de março de 2013 às 19:23

Ou seja, com essa função, ao receber o OPCode 100 vai printar "received something from server!"?

rDs7008R
31 de março de 2013 às 20:47

Isso :D

BananaFightB
31 de março de 2013 às 20:54

function onExtendedOpcode(cid, opcode, buffer)
       if opcode == OPCODE_LANGUAGE then
               -- otclient language
               if buffer == 'en' or buffer == 'pt' then
                       -- example, setting player language, because otclient is multi-language...
                       --doCreatureSetStorage(cid, CREATURE_STORAGE_LANGUAGE, buffer)
               end
       elseif opcode == OPCODE_PRINT then
               print(buffer)

       else
               -- other opcodes can be ignored, and the server will just work fine...
       end
end

 

quando a função "onExtendedOpcode(cid, opcode, buffer)" for usada ele vai te que ter os 2 valores preenchidos opcode, buffer

 

opcode, seria como o id da mensagem que você esta reçebendo/enviando, e buffer é o valor dessa mensagem

 

como nesse exemplo :

 

local function test(protocol, opcode, buffer)
 print('received something from server!')
end

ProtocolGame.registerExtendedOpcode(100, test)

 

o valor do "ID" do opcode é 100, e "test" é a mensagem que estamos enviando, sendo assim quando o opcode numero 100 for usado ele vai retornar o que a função test esta armazenando.

dalvorsnD
01 de abril de 2013 às 02:35

function onExtendedOpcode(cid, opcode, buffer)
	if opcode == OPCODE_LANGUAGE then
			-- otclient language
			if buffer == 'en' or buffer == 'pt' then
					-- example, setting player language, because otclient is multi-language...
					--doCreatureSetStorage(cid, CREATURE_STORAGE_LANGUAGE, buffer)
			end
	elseif opcode == OPCODE_PRINT then
			print(buffer)

	else
			-- other opcodes can be ignored, and the server will just work fine...
	end
end

 

quando a função "onExtendedOpcode(cid, opcode, buffer)" for usada ele vai te que ter os 2 valores preenchidos opcode, buffer

 

opcode, seria como o id da mensagem que você esta reçebendo/enviando, e buffer é o valor dessa mensagem

 

como nesse exemplo :

 

local function test(protocol, opcode, buffer)
 print('received something from server!')
end

ProtocolGame.registerExtendedOpcode(100, test)

 

o valor do "ID" do opcode é 100, e "test" é a mensagem que estamos enviando, sendo assim quando o opcode numero 100 for usado ele vai retornar o que a função test esta armazenando.

 

Ele perguntou no cliente, a primeira parte que voce postou, é a callback do server, ela é chamada quando o server recebe algum opcode.

 

E na segunda explicação, tem uma incoerência quanto ao uso da função de registrar os opcodes

 

Os opcodes são registrados através da função

ProtocolGame.registerExtendedOpcode(opcode, callback)

 

Onde o primeiro parametro é o valor do opcode(numero referente, como no exemplo do baxnie era 100), e o segunda parametro que é a callback, que nada mais é que o nome da função que será chamada quando receber o opcode 100.

BananaFightB
01 de abril de 2013 às 12:27

Bom, sobre a 1° parte era só um exemplo de uso.

 

E na 2° parte eu só dei um exemplo simples de como registrar o valor do opcode que como no exemplo ele era chamado de "test".

 

do mesmo modo que se eu tentar fazer

 

print(test) ele me retorna "received something from server!", Agora quando eu registro o opcode 100, o que eu estou registrando é "received something from server!", então quando eu retornar o opcode 100 vou ter esse resultado "received something from server!" certo ?

dalvorsnD
01 de abril de 2013 às 12:46

Bom, sobre a 1° parte era só um exemplo de uso.

 

E na 2° parte eu só dei um exemplo simples de como registrar o valor do opcode que como no exemplo ele era chamado de "test".

 

do mesmo modo que se eu tentar fazer

 

print(test) ele me retorna "received something from server!", Agora quando eu registro o opcode 100, o que eu estou registrando é "received something from server!", então quando eu retornar o opcode 100 vou ter esse resultado "received something from server!" certo ?

A função test não tem retorno, e printar apenas o nome dela, vai mostrar 'function: 0x00algo', e se printar print(test()) vai printar o print da função teste, e nil que é o retorno dela.

A questão é que o modo que você falou, pode confundir as pessoas, pareceu que o nome da função é a mensagem a ser printada, e não é assim.

Quando receber o opcode ele vai executar a função determinada, no caso do baxnie ali a função test, se fosse outra função qualquer, executaria também da mesma forma e não precisa ter uma mensagem, nem printar nada, pode ser apenas uma função para setar algo, definir alguma coisa.

Editado Abril 1 por dalvorsn

BananaFightB
01 de abril de 2013 às 15:41

Bom, mais foi isso que eu tentei me referir, ele vai executar o que estiver programado não necessariamente precisa ser uma mensagem.