Ir para conteúdo

Monstros Passivos


Oneshot

Posts Recomendados

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.

Link para o comentário
Compartilhar em outros sites

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 por BananaFight
Link para o comentário
Compartilhar em outros sites

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 por LuckOake
Link para o comentário
Compartilhar em outros sites

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 por BananaFight
Link para o comentário
Compartilhar em outros sites

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 por Oneshot
Link para o comentário
Compartilhar em outros sites

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 por BananaFight
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...