onTarget também executado por monstros

zipter98
em Linguagens de Programação
  • 1
  • 2

zipter98

avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 20/09/12Posts: 2553Gênero: Masculino

Serei breve: com esta pequena modificação, o creatureevent onTarget poderá ser executado por monstros.

Nas sources do seu servidor, abra o arquivo monster.cpp e procure por:

if(it == targetList.end())
{
    //Target not found in our target list.
#ifdef __DEBUG__
    std::cout << "Target not found in targetList." << std::endl;
#endif
    return false;
}
Abaixo deste bloco de código, coloque:
CreatureEventList targetEvents = getCreatureEvents(CREATURE_EVENT_TARGET);
for(CreatureEventList::iterator it = targetEvents.begin(); it != targetEvents.end(); ++it)
{
    if(!(*it)->executeTarget(this, creature))
        return false;
}
Depois, no código da função:
void Monster::doAttacking(uint32_t interval)
Abaixo de:
if(!attackedCreature || (isSummon() && attackedCreature == this))
    return;
coloque:
if(Creature* creature = attackedCreature->getCreature())
{
    CreatureEventList targetEvents = getCreatureEvents(CREATURE_EVENT_TARGET);
    for(CreatureEventList::iterator it = targetEvents.begin(); it != targetEvents.end(); ++it)
    {
        if(!(*it)->executeTarget(this, creature))
        {
            setFollowCreature(NULL);
            setAttackedCreature(NULL);
            searchTarget(TARGETSEARCH_NEAREST);
            break;
        }
    }
}
Exemplo do que pode ser feito com esta alteração:
  • Monstro não atacando jogador com X storage

data/creaturescripts/scripts:

local storage = xxx
function onTarget(cid, target)
    if isMonster(cid) and isPlayer(target) and getPlayerStorageValue(target, storage) > -1 then
        return false
    end
    return true
end
Tag:
<event type="target" name="blockTarget" event="script" value="nome_do_arquivo.lua"/>
No arquivo .XML do monstro, acima de:
</monster>
coloque:
<script>
    <event name="blockTarget"/>
</script>

 

Não respondo PMs solicitando suporte. Já existem seções no fórum para isto.

nociam

avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 04/02/13Posts: 541Gênero: Masculino

posso usar pra fazer pra que um monstro ataque apenas certo monstro com tal storage, tb tipo o target fica sempre num monstro?

 

edit erro nessa linha

 

if(Creature* creature = attackedCreature->getCreature();)

 

não seria

if(Creature* creature = attackedCreature->getCreature())​

zipter98

avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 20/09/12Posts: 2553Gênero: Masculino

Para fazer isso seriam necessárias outras alterações. Retornando falso você vai impedir com que monstros ataquem summons e/ou players, e retornando verdadeiro a ação será realizada normalmente.

E obrigado pela observação. Falta de atenção minha.

Não respondo PMs solicitando suporte. Já existem seções no fórum para isto.

Felipe Moraes

Java Developer
avatar
Grão-Duque
Grão-Duque

INFOS

Grupo: Grão-DuqueRegistrado: 02/10/06Posts: 3285Gênero: Masculino

Muito bom man, obrigado por compartilhar conosco.

Certamente é muito útil.

~A nossa maior glória não reside no fato de nunca cairmos, mas sim em levantarmo-nos sempre depois de cada queda.~

 

 

 

 

Clique aqui para ver meus tutoriais !

 

 

 

Gamertag: cpmoraes

 

 

gonorreiaswat

I'm AdrianøØ SwaTT
avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 16/09/07Posts: 600Gênero: MasculinoChar no Tibia: NãoJogoMais

Muito bom @zipter98, pelo visto continuou os estudos em programação hein;

 

 

Abraços.

Atenciosamente,
Adriano Swatt'

Xtudomuito

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 14/04/15Posts: 191

Obrigado! Tem como deixa o monster parado.

zipter98

avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 20/09/12Posts: 2553Gênero: Masculino

Obrigado pelos comentários, pessoal.

 

@Xtudomuito

Basta deixar a speed dele igual a 0 (arquivo .XML do monstro).

Não respondo PMs solicitando suporte. Já existem seções no fórum para isto.

ManoTobira

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 20/10/12Posts: 18

to com um problema que quando eu mato o bixo se tiver mais de 1 da erro e o server para de responde só nao sei se é no meu codigo ou na sources

 

meu codigo:

local config = {
name = "Mizuki", --nome do monstro
storage = 3, --storage id
}
function onTarget(cid, target)
if isMonster(cid) and isPlayer(target) then
if getPlayerStorageValue(target, 8000) ~= config.storage then
return false
end
elseif isPlayer(cid) and isMonster(target) then
if getCreatureName(target) == config.name and getPlayerStorageValue(cid, 8000) ~= config.storage then
return doPlayerSendCancel(cid, "You cannot attack this monster now.") and false
end
end
return true
end
function onStatsChange(cid, attacker, type, combat, value)
if isMonster(attacker) and getCreatureName(attacker) == config.name and isPlayer(cid) then
if getPlayerStorageValue(cid, 8000) ~= config.storage then
return false
end
elseif isPlayer(attacker) and isMonster(cid) and type == STATSCHANGE_HEALTHLOSS then
if getCreatureName(cid) == config.name and getPlayerStorageValue(attacker, 8000) ~= config.storage then
return doPlayerSendCancel(attacker, "You cannot attack this monster now.") and false
end
end
return true
end
function onKill(cid, target)
if isMonster(target) and getCreatureName(target) == config.name and getPlayerStorageValue(cid, 8000) == config.storage then
doPlayerAddExperience(cid,6200)
setPlayerStorageValue(cid, 8000, config.storage+1)
end
return true
end

zipter98

avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 20/09/12Posts: 2553Gênero: Masculino

Qual o erro que aparece?

Para todo caso, teste aquele código que exemplifiquei no tópico e informe se ele funciona adequadamente no seu servidor ou não. Se funcionar, é problema no código lua. Se não, o erro encontra-se na instalação da modificação nas sources.

Não respondo PMs solicitando suporte. Já existem seções no fórum para isto.

Xtudomuito

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 14/04/15Posts: 191

Sim amigo como eu faria pra quando monster ver o player que tem a storage certa ele corre atras.

zipter98

avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 20/09/12Posts: 2553Gênero: Masculino
data/creaturescripts/scripts:
local storage = xxx
function onTarget(cid, target)
    if isMonster(cid) and isPlayer(target) and getPlayerStorageValue(target, storage) > -1 then
        return true
    end
    return false
end
Tag:
<event type="target" name="allowTarget" event="script" value="nome_do_arquivo.lua"/>
No arquivo .XML do monstro, acima de:
</monster>
coloque:
<script>
    <event name="allowTarget"/>
</script>

 

Não respondo PMs solicitando suporte. Já existem seções no fórum para isto.

Xtudomuito

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 14/04/15Posts: 191

Então deixa eu ver seu entendi. Eu coloco no monster xml speed 0. Aí eu uso esse seu script quando o monster ver o player ele vai corre atrás do player.

zipter98

avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 20/09/12Posts: 2553Gênero: Masculino

Se a speed do monstro for igual a 0, ele não irá se mover em ocasião alguma. Logo, para fazer o que você quer, seriam necessárias outras modificações.

Em monster.cpp:

No código da função:

void Monster::onThink(uint32_t interval)

Abaixo de:

updateIdleStatus();
if(isIdle)
    return;
coloque:
if(Creature* creature = static_cast<Creature*>(this))
{
    if(!attackedCreature && !isSummon() && creature->getNoMove())
        creature->setNoMove(true);
}
Depois, abaixo de:
//We just spawned lets look around to see who is there.
if(isSummon())
    isMasterInRange = canSee(getMaster()->getPosition());
coloque:
creature->setNoMove(true);
Código lua:
local storage = xxx
function onTarget(cid, target)
    if isMonster(cid) and isPlayer(target) and getPlayerStorageValue(target, storage) > -1 then
        doCreatureSetNoMove(cid, false)
        return true
    end
    return false
end

 

Não respondo PMs solicitando suporte. Já existem seções no fórum para isto.

Xtudomuito

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 14/04/15Posts: 191

Obrigado Amigo! Realmente ocorreu esse erro do amigo ae PTDG quando tem dois monster com a msm storage atacando o player. quando o player mata um. o server fecha.

zipter98

avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 20/09/12Posts: 2553Gênero: Masculino

Fiz uma pequena correção nos códigos que postei anteriormente. Se possível, atualizem-nos.

Realizei inúmeros testes a procura deste erro que vocês encontraram, porém não o enfrentei em ocasião alguma. O servidor não fechou nem nada.

Não respondo PMs solicitando suporte. Já existem seções no fórum para isto.

  • 1
  • 2