SK

[OTC]Callbacks dos Modules

Por Skulls, 24 de jan. de 2016 em Clients

14
3.2k
SkullsS
24 de janeiro de 2016 às 11:54

Bom dia galera,

 

Estou querendo fazer um modulo que faz o player dizer algo quando ele recebe uma msg X.
Infelizmente, estou tendo um erro quando faço isso dentro de client_textmessages. Fala que o bot barrou, algo assim.

Alguém sabe me dizer quais os callbacks que existem no init do OTC e se há algum que é referente a receber mensagens?

E como eu poderia fazer isso de receber uma mensagem e disparar uma ação g_game.talk.

 

@@Aberos

@@BananaFight

 

Valeu.

Abraços,


Achei o callback de text, mas continua dando erro "caught a lua call to a bot protected game function, the call was cancelled"
E eu ja desabilitei a porra do bot protection no Cmake D:

Editado Janeiro 24 por Skulls

AberosA
24 de janeiro de 2016 às 12:00

o init nao recebe nenhum callback , pra vc receber uma msg do server aconselho usar opcode, para enviar msg por opcode vc prescisa adicionar a funcao nas suas sources do server.

 

para enviar do server para o client vc usa a funcao

exemplo:

doSendPlayerExtendedOpcode(cid, 101, "msg")

para receber no client vc primeiro registra no init e no terminate

init:

ProtocolGame.registerExtendedOpcode(101, teste)

terminate:

ProtocolGame.unregisterExtendedOpcode(101)

entao vc cria a funcao q vc registrou no init que no caso foi a teste:

function teste(player, opcode, buffer)
print(buffer)
end

no caso a msg q vc enviou vai esta no buffer

SkullsS
24 de janeiro de 2016 às 12:05

o init nao recebe nenhum callback , pra vc receber uma msg do server aconselho usar opcode, para enviar msg por opcode vc prescisa adicionar a funcao nas suas sources do server.

 

Cara, tem callback sim. A função "connect()" recebe funções de callback como parametro.

onTalk, onHealthChange, onManaChange, onTextMessage e por ai vai.

 

O meu problema ai é que tem um tal de bot protection que impede que uma ação de usuário seja feita dentro de determinados callbacks. Já tentei desativar essa botprotection, mas sem sucesso.

Alguma ideia?

AberosA
24 de janeiro de 2016 às 12:09

Cara, tem callback sim. A função "connect()" recebe funções de callback como parametro.

onTalk, onHealthChange, onManaChange, onTextMessage e por ai vai.

 

O meu problema ai é que tem um tal de bot protection que impede que uma ação de usuário seja feita dentro de determinados callbacks. Já tentei desativar essa botprotection, mas sem sucesso.

Alguma ideia?

sim , mas essa funcoes sao do client em geral , nao nescessariamente o init recebe ela de callback, e sobre o bot protection vc desativa ele no cmake pra quem compila pelo metodo do codeblocks na primeira opção desmarcando o checkbox

Xd32KEN.png

SkullsS
24 de janeiro de 2016 às 12:12

A entendi, então eu queria saber eram os callbacks de connect() xD. Mas, ja consegui isso, o bot que ta fodendo.

Eu compilo pelo VS2013. Mas eu editei o Cmake e coloquei botprotection OFF, mas ainda sim ele fica aparecendo.

 

Alguma ideia? Tem algum outro lugarq ue tem que mudar alem do client/CMake?

AberosA
24 de janeiro de 2016 às 12:17

Eu consegui desativar so por ae, desmarquei por ali e compilei pelo codeblocks , agora acho q o seu nao funfou pq o visual studio nao deve usar as configurações do cmake , so o codeblocks usa as configurações do cmake

SkullsS
24 de janeiro de 2016 às 12:18

Eu consegui desativar so por ae, desmarquei por ali e compilei pelo codeblocks , agora acho q o seu nao funfou pq o visual studio nao deve usar as configurações do cmake , so o codeblocks usa as configurações do cmake

Faz sentido. Alguma ideia de onde isso pode ser mudado no vs2013?

dalvorsnD
24 de janeiro de 2016 às 12:19


function init()

connect(g_game, {onTextMessage = parseTextMessage})

end

 

function terminate()

disconnect(g_game)

end

 

function parseTextMessage(mode, text)

print("onTextMessage:")

print(mode)

print(text)

g_game.talk("Chegou")

end

 

Editado Janeiro 24 por dalvorsn

AberosA
24 de janeiro de 2016 às 12:30

Project properties -> Configuration properties -> C/C++ -> Preprocessor -> Preprocessor definitions -> e remove "BOT_PROTECTION". deve funcionarFvDZxQp.png


tem o metodo do @dalvorsn por sendcancel que funciona perfeitamente tbm

̶S̶A̶L̶V̶E̶ ̶P̶R̶O̶F̶E̶S̶S̶O̶R̶ ̶D̶U̶D̶U̶

BananaFightB
24 de janeiro de 2016 às 12:36

Nesse caso especifico acho que o mais simples seria fazer como foi dito ( Remover o BotProtection ), mas tenha em mente que pessoas mal intencionadas poderão abusar dessa brecha que você abriu, eu sinceramente não entendo o porque fazer isso ( Receber uma mensagem e falar X Coisa), isso pode ser feito diretamente server side...



Uma coisa que você pode tentar fazer é, criar um método especifico para o player falar que não tenha a verificação de BotProtection, Basicamente seria uma cópia do talk, porem sem a verificação de proteção, assim você atinge seu resultado, e mantem um pouco da defesa ant-bot no seu cliente.



dalvorsnD
24 de janeiro de 2016 às 12:40

Eu uso o esse g_game.talk pra executar talkactions e não vejo erros com bot protection, mesmo estando habilitado

SkullsS
24 de janeiro de 2016 às 12:51

Project properties -> Configuration properties -> C/C++ -> Preprocessor -> Preprocessor definitions -> e remove "BOT_PROTECTION". deve funcionarFvDZxQp.png

tem o metodo do @@dalvorsn por sendcancel que funciona perfeitamente tbm

̶S̶A̶L̶V̶E̶ ̶P̶R̶O̶F̶E̶S̶S̶O̶R̶ ̶D̶U̶D̶U̶

 

Muito obrigado, funcionou perfeitamente aqui essa mudança.

Eu tentei usar um tutorial de op_mode via send cancel, mas ta dando erro aqui e ele é compilado, então não consigo editar. Por isso resolvi criar o meu proprio baseado na ideia dele.

Muito obrigado.

 

Resolvido.

 

Aqui ele dava erro @@dalvorsn.

 

@@BananaFight

Então, eu queria fazer um opcode via codigo, alguma ideia de como fazer isso? O codigo que existia estava quebrado.

Editado Janeiro 24 por Skulls

BananaFightB
24 de janeiro de 2016 às 13:08

Se você tem a source do OTC e Server, é só usar o código que ja existe hoje ( EXTENDED Opcode ), uma cosia que causa muita confusão quando se vai usar o opcode para passar informações adicionais no server / client, é enviar um extended opcode, e tentar receber um opcode normal, você precisa ver se não esta fazendo isso. enviando 1 tipo e recebendo outro...



Se você instalou o extended opcode no servidor certo ele vai funcionar sem problemas.



Minha primeira sugestão é essa, tentar usar os extendeds opcodes, caso isso não resolva seu problema, ai precisaria buscar uma pessoa com conhecimentos sólidos em C++ para criar uma ponte usando os protocolos que existem no server / client para passar informações.



Agora caso você não tem a source do servidor, o jeito mais simples seria usar as mensagens de sendCancel concatenadas com um identificador que faz o client esconder elas, como o dalvorsn mostrou no exemplo.



Por exemplo, você cria uma chave de identificação "%inf%" e usa ela para executar suas ações especificas para cara key, e ao invés de mostrar ela para o player, você esconde.


SkullsS
24 de janeiro de 2016 às 17:35

 

Se você tem a source do OTC e Server, é só usar o código que ja existe hoje ( EXTENDED Opcode ), uma cosia que causa muita confusão quando se vai usar o opcode para passar informações adicionais no server / client, é enviar um extended opcode, e tentar receber um opcode normal, você precisa ver se não esta fazendo isso. enviando 1 tipo e recebendo outro...

Se você instalou o extended opcode no servidor certo ele vai funcionar sem problemas.

Minha primeira sugestão é essa, tentar usar os extendeds opcodes, caso isso não resolva seu problema, ai precisaria buscar uma pessoa com conhecimentos sólidos em C++ para criar uma ponte usando os protocolos que existem no server / client para passar informações.

Agora caso você não tem a source do servidor, o jeito mais simples seria usar as mensagens de sendCancel concatenadas com um identificador que faz o client esconder elas, como o dalvorsn mostrou no exemplo.

Por exemplo, você cria uma chave de identificação "%inf%" e usa ela para executar suas ações especificas para cara key, e ao invés de mostrar ela para o player, você esconde.

 

Sim, são exatamente os dois caminhos que tentei.

 

1. Usar opcode, recebo esse erro ERROR: Unable to send extended opcode 1, extended opcodes are not enabled. Acredito que seja por nao conter opcode no servidor, caso saiba resolve-lo ficarei grato.

 

2. Eu estou usando o sendcancel, mas eu gostaria que ao receber uma mensagem do tipo %inf%, por exemplo, o cliente printasse para o jogador uma informação dele. Porem, ao fazer isso dentro de uma ação onTextMessage o bot bloqueia, por isso a duvida sobre o bot. Tentei o exemplo do dalvorsn com o bot funcionando e recebo o mesmo erro.

 

Bom de qualquer forma, muito obrigado.

Resolvido, pode fechar