ON

Monstros Passivos

Por Oneshot, 18 de set. de 2013 em Linguagens de Programação

script
51
10.1k
OneshotO
18 de setembro de 2013 às 09:36

Monstros Passivos

Muito bom dia, galera.

Sabe, eu estava estudando como funcionam os servidores de pokémons, aqueles que ainda estão começando, embriões de bons servidores, não grandes servidores como o Poke Brasil Online (PokeBro). O problema de todos esses servidores, é que todos são dependentes de sistemas criados pelo brun123 (se não me engano) dentro das sources, ou seja, esses servidores são dependentes do executável compilado do PDA, entre outros.

A pedido de um amigo, eu desenvolvi o sistema de monstros passivos. Sim aquele sistema que dá um upgrade na inteligência artificial das criaturas, onde algumas podem atacar o jogador assim que o ver, outras podem atacar apenas quando for atacadas.

É um sistema muito básico mesmo, eu fiz com C++ e Lua por puro comodismo, e pretendo deixar mais avançado apenas com C++ e uso de flags nos XMLs.

Se você quiser usar, sinta-se a vontade.

No seu arquivo monster.h, procure por:

bool isHostile() {return mType->isHostile;}

Substitua por:

bool isHostile() const {
             std::string value;
             if(!getStorage("hostile", value))
                 return mType->isHostile;
            
             return booleanString(value);
        }

No seu arquivo monster.cpp, procure por:

Monster::selectTarget

Dentro da função, procure por:

if(!isTarget(creature))
    return false; 

Adicione abaixo:

if(!isHostile())
   return false;

No diretório creaturescripts/scripts, crie um novo arquivo com nome passive.lua e adicione:

PASSIVE_BEHAVIOR = {"Deer", "Rabbit"} -- Aqui ficam os monstros que não atacam, mesmo que atacados.
function onCombat(cid, target)
    if isMonster(target) then
        if not isInArray(PASSIVE_BEHAVIOR, getCreatureName(target)) then
            doCreatureSetStorage(target, "hostile", 1)
        end
        doMonsterSetTarget(target, cid)
    end
    return true
end

No mesmo diretório, abra o arquivo login.lua e adicione:

registerCreatureEvent(cid, "PassiveSystem")

No diretório creaturescripts/, abra o arquivo creaturescripts.xml e adicione:

<event type="combat" name="PassiveSystem" event="script" value="passive.lua"/>

Agora é só compilar seu servidor, sem a pasta obj, ou seja, dê um Rebuild All e correr pro abraço com seu sistema de monstros passivos.

 

Abraços,

Oneshot.

TonynhT
18 de setembro de 2013 às 09:53

Incrível como sempre Bruno!

Parabéns pelo belo code, e mais uma vez, bem vindo de volta! ^^

GabrieltxuG
18 de setembro de 2013 às 10:41

Muito bom maninho. rep++.

Editado Setembro 18 por Gabrieltxu

Nu77N
18 de setembro de 2013 às 17:59

Oneshot e seus grandes codigos, muito bom!!

Bem vindo de volta, o xtibia precisava de pessoas como você.

:D

BananaFightB
21 de setembro de 2013 às 22:13

Tem certeza que funciona ?

 

no getStorage o primeiro argumento é um 'uint32', um numero, e você esta tentando mandar "hostile", Só isso já causaria um bug na hora da compilação.

 

Depois disso no creaturescript, só usando setTarget não é o suficiente para fazer com que um monstro como Rabbit ataque um player ou um summon.

 

E se mesmo assim funcionasse, Caso duas pessoas ataquem o mesmo monstro ele iria sempre setar o target no ultimo que atacou ele, ou seja, ia ficar mudando o target, Sem contar que se sair da tela da target lost, e ele voltaria a ser passivo, Você precisaria criar uma lista com todos as criaturas que atacaram o monstro e fazer ela atacar 1 por 1 caso ainda estejam na tela, e só parar quando estiverem mortos ou tiverem re-logado.

Editado Setembro 21 por BananaFight

OneshotO
21 de setembro de 2013 às 22:22

Compile e teste, abraços ;)

 

Você pode manjar de OTClient, mas eu manjo de OpenTibia, BananaLutador :)

Editado Setembro 21 por Oneshot

LuckOakeL
21 de setembro de 2013 às 22:33

Oneshot 1x0

 

BananaFight, getStorage é string nas versões 8.6++

 

Já em 8.54, por exemplo, é int.

 

E sim, o setTarget é suficiente, e o monstro não fica mudando de alvo. Tudo já foi testado e está funcionando sem problemas.

Editado Setembro 21 por LuckOake

BananaFightB
22 de setembro de 2013 às 01:27

Entendo, Você poderia ao menos mostrar o versão testada no tópico para evitar esse tipo de confusão ?

Gabriel CoutoG
22 de setembro de 2013 às 01:45

Muito bom, como sempre Oneshot!

 

Não estou por dentro dos OTServers mais, principalmente derivados, então é uma novidade pra mim. Ótima ideia passar para nós! :D

BananaFightB
22 de setembro de 2013 às 04:31

Tentei compilar em uma rev 3887, foi sem problemas, Então instalei o creaturescripts e o onlogin no meu server 8.6, porem ainda sim o rabbit não me ataca.

PASSIVE_BEHAVIOR = {"Deer", "Rabbit"} -- Aqui ficam os monstros que não atacam, mesmo que atacados.
function onCombat(cid, target)
print("X")
    if isMonster(target) then
print("Y")
        if not isInArray(PASSIVE_BEHAVIOR, getCreatureName(target)) then
print("hostile")
            doCreatureSetStorage(target, "hostile", 1)
        end
print("Z")
        doMonsterSetTarget(target, cid)
    end
    return true
end

Resultado

 

Quando ataca rabbit:

X
Y
Z

Quando ataca rat:

X
Y
hostile
Z

Editado Setembro 22 por BananaFight

OneshotO
22 de setembro de 2013 às 09:39

Mas no caso o array PASSIVE_BEHAVIOR são os monstros que não irão atacar mesmo que você ataque eles, BananaFight.

Todos os outros monstros que não estejam nesse array e tenham inicialmente flag hostile igual a 0, começam a atacar depois de atacados.

 

Eu tenho a leve impressão que você está tentando achar qualquer defeito pra falar "ó como você não sabe programar", desculpe, amigo, mas você não vai conseguir.

 

Todavia, irei baixar o Camtasia e gravar um vídeo.

Editado Setembro 22 por Oneshot

kttallanK
22 de setembro de 2013 às 11:00

Boaa manow agr os cara vão ter vontade de fazer um servidor do zero deixando de tras o pda :)

caoticC
22 de setembro de 2013 às 11:29

mesma que tenha limitações no sistema não é o motivo das criticas do banana.

 

Do mais.

É bem legal

BananaFightB
22 de setembro de 2013 às 16:07

Nossa, Porque diabos vocês pensam isso de mim, eu fiquei mega feliz quando vi este tópico, foi uma confusão minha que entendi errado o seu script, e OneShot, eu sou seu FAN, Nunca tentarei te atacar de qualquer modo, Levei até ban chingando o gustavo quando ele te deu ban.

 

Edit: Eu não entendo, mesmo tirando o rabbit da table, ele ainda não me ataca, mesmo printando todos os if.

 

Tentei printar o target dele

 

print(getCreatureTarget(target))

 

e retorna 0 sempre.

Editado Setembro 22 por BananaFight

StrogmanS
22 de setembro de 2013 às 16:25

boa rep+