Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

Bom, estou criando esse tópico (que eu queria ter feito em vídeo no começo do ano) para contar-lhes um dos maiores bugs que existem nos otservs.

 

Como alguns sabem eu participei da equipe do CaterOT e lá descobri muitas falhas em servidores e até dentro da equipe já tive a ideia de publicar estes problemas.

 

Talvez o problema que mais dá dor de cabeça nos servidores é a clonagem de dinheiro... Como aquele player ficou rico?!

Basicamente o problema consiste em duas funções (removeMoney e removeItem), quando elas são executadas, é retornado um booleano (verdadeiro ou falso) para saber se o item/dinheiro foi removido ou não. Mas se essa função não está dentro de um verificador (IF) mesmo que ela seja falsa ela irá funcionar e entregar o dinheiro/o item comprado sem verificar nada.

 

Aos que conhecem C++, leia esse código e me diga se ele retorna algum nil caso o dinheiro não for encontrado:

TFS 1.3: https://github.com/otland/forgottenserver/blob/master/src/luascript.cpp#L8487

Base TFS 0.3: https://github.com/mattyx14/otxserver/blob/otxserv2/path_8_6x/sources/luascript.cpp#L5550

 

Verifiquei vários servidores disponíveis no github e vi que vários tem esse problema. Um dos exemplos é o Otxserver-New do malucooo.

Com uma unica pesquisa fl5bXUb.png, vemos tudo o que há no código.

E assim encontramos vários NPCs, Actions e Moveevents que não tem esse cuidado de verificar se o dinheiro foi realmente removido. Um exemplo é o NPC Black Bert

mvPubb0.png

Ai você me fala: Ah Bruno, mas não tem como dar erro por que ele já utiliza o getMoney ali em cima...

 

NÃO ADIANTA USAR O GETMONEY, VOCÊ SÓ USA ELE SE PRECISAR VERIFICAR MAIS DE DOIS ITENS (EM BAIXO MAIS EXPLICAÇÕES).

 

Basicamente as pessoas que fazem esse bug utilizam programas que colocam para o npc comprar/vender o item tendo o dinheiro/item e removem o item do personagem em fração de milésimos após clicar, assim o sistema "buga" (não é um bug, ele somente retorna falso no código pelo fato de o player “não ter“ o item, passando pelo verificador (getItem e getMoney) sem dar erro... O único verificador que funciona é o que diz se o item foi realmente removido.

 

Antes/Depois

Spoiler

Antes:

EuYuCVW.png

(Não quero nem comentar os erros amadores que há neste código)

 

Depois:

qnhjIKd.png

 

Mas ai surge o problema de: Ah, e quando há mais de um item para ser removido (ou um item junto com dinheiro)?

Dai você usa o getItem/getMoney e abaixo dele utiliza a função de remoção, para evitar que um item seja removido do player caso ele não houver o segundo item necessário.

 

Exemplo:

YbMySMO.png

 

Exemplo 2:

ReVXQYa.png

 

Este é um exemplo de como verificar se há mais de um item necessário. E ainda depois do segundo if poderia ser colocado um else alertando aos administradores o nome do player que está tentando bugar, pois se o player não fez nada de errado esse fator nunca irá acontecer.

 

Ainda duvidam de mim?

Você que usa TFS 1.2+ execute esse código em uma talkaction, tendo o item 2160 ou não.

function onSay(player, words, param)
	if not player:getGroup():getAccess() then
		return true
	end

	if player:getAccountType() < ACCOUNT_TYPE_GOD then
		return false
	end

	player:removeItem(2160, 1)
	player:sendTextMessage(MESSAGE_INFO_DESCR, "Item removido!")
end

 

Isto serve para qualquer distribuição/versão de servidor.

Não é um bug de distribuição, é um erro cometido por quase todos os SCRIPTERS.

Editado por Comedinha (veja o histórico de edições)

Bruno Carvalho / Ex-Administrador TibiaKing

[email protected]

 

Em 26/12/2016 em 03:47, Spraypaint disse:

A força da alienação vem dessa fragilidade dos indivíduos, quando apenas conseguem identificar o que os separa e não o que os une.

-miltinho

 

wMwSJFE.png?1

 

  • Respostas 13
  • Visualizações 6.3k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • Weslley Kiyo
    Weslley Kiyo

    Nesse caso, qual seria o correto?   elseif msgcontains(msg, "yes") then if npcHandler.topic[cid] == 1 then if getPlayerItemCount(cid, 2677) >= 5 then -- blueberries npcHandler:sa

  • Bruno Carvalho
    Bruno Carvalho

    @Weslley Kiyo O segundo modo está correto. Mas não precisaria nem do getPlayerItemCount pois ele já faz isso ao remover... O porém o sistema que você fez seria a maneira mais segura.

Postado

realmente esse bug é muito chato -.-' quando eu estava com meu server online tinha muito desse problema nele e não era só com dinheiro mas com item também isso me faz pensar se o problema de clonar item também é feito usando o mesmo método ou algum parecido

Compre seus Scripts Agora totalmente seguro e de forma rápida, aceitamos também encomendas.

discord.gg/phJZeHa2k4

 

Projeto ATS (Naruto)

Informações Abaixo

Facebook

Youtube
Discord

 

Tutoriais / Conteúdos

Clique Aqui

Postado
  • Autor
Agora, Brunds disse:

realmente esse bug é muito chato -.-' quando eu estava com meu server online tinha muito desse problema nele e não era só com dinheiro mas com item também isso me faz pensar se o problema de clonar item também é feito usando o mesmo método ou algum parecido

 

Clonar item tem esse método ou bugar alguma coisa com conexões inter tabelas (bando de dados), assim que o servidor cai ele surge em 2 lugares... Mas isso vou explicar melhor em um outro dia.

Bruno Carvalho / Ex-Administrador TibiaKing

[email protected]

 

Em 26/12/2016 em 03:47, Spraypaint disse:

A força da alienação vem dessa fragilidade dos indivíduos, quando apenas conseguem identificar o que os separa e não o que os une.

-miltinho

 

wMwSJFE.png?1

 

Postado

>> Não quero nem comentar os erros amadores que há neste código

lul.

 

Obrigado por ter reportado Bruno. Talvez deveríamos levar esse bug para o GitHub e fazermos uma fix em C++?

discord.pngDiscord: vankk #7765

Precisando de ajuda? Entre em contato comigo via Discord.

 

Muitos vêm seus muitos dias de glória, mas poucos vêm seus muitos dias de luta.

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo