Monstros Passivos

Oneshot
em Linguagens de Programação

Oneshot

avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 05/07/09Posts: 1347

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.

Tonynh

Miau! É isso ai!
avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 07/01/08Posts: 2282Gênero: MasculinoChar no Tibia: Tonynh

Incrível como sempre Bruno!

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

Gabrieltxu

O Héroi
avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 12/06/12Posts: 2180Gênero: MasculinoChar no Tibia: Supreme Player

Muito bom maninho. rep++.

Canal do facebook de lives!! cola la galera me ajudar seguindo a pagina hehe ! ❤️

 

               https://www.facebook.com/Tuxao0

Nu77

avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 29/11/07Posts: 496

Oneshot e seus grandes codigos, muito bom!!

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

:D

BananaFight

Allahu Akbar
avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 14/02/13Posts: 702Gênero: Masculino

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.

Oneshot

avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 05/07/09Posts: 1347

Compile e teste, abraços ;)

 

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

LuckOake

avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 23/07/12Posts: 1104Gênero: MasculinoChar no Tibia: Luck Oake

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.

BananaFight

Allahu Akbar
avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 14/02/13Posts: 702Gênero: Masculino

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

Gabriel Couto

Anyur
avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 22/04/11Posts: 2455Gênero: MasculinoChar no Tibia: Thyn Zare

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

Gabriel Couto, 23 anos. Acadêmico de Medicina.

Ex-Diretor Geral do XTibia.

 

www.tibiatv.com.br

 

 

BananaFight

Allahu Akbar
avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 14/02/13Posts: 702Gênero: Masculino

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

Oneshot

avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 05/07/09Posts: 1347

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.

kttallan

Lord Sorte
avatar
Infante
Infante

INFOS

Grupo: InfanteRegistrado: 06/03/13Posts: 1574Gênero: MasculinoChar no Tibia: Lord Sorte

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

                                                                Scripter em Treinamento

 

Codigos

 

Simples Pet Sistema < New

 

Assim que possivel mais codigos, com criatividade.

caotic

Afinal de contas,sou um mordomo e tanto
avatar
Infante
Infante

INFOS

Grupo: InfanteRegistrado: 04/03/11Posts: 1599Char no Tibia: No Have

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

 

Do mais.

É bem legal

BananaFight

Allahu Akbar
avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 14/02/13Posts: 702Gênero: Masculino

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.

Strogman

avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 04/11/12Posts: 464Gênero: MasculinoChar no Tibia: Lysty Of Death

boa rep+

 

                                 logo_full_1600.png.f8d0c5d8ba71c660bad630b327c3e64d.png

                                                              htps://www.facebook.com/PokemonOnlineSVKE

                                                                                                                       PokeSvke