Ir para conteúdo

onTarget também executado por monstros


zipter98

Posts Recomendados

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>

 

Editado por zipter98
Link para o comentário
Compartilhar em outros sites

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())​

Editado por nociam
Link para o comentário
Compartilhar em outros sites

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.

Editado por zipter98
Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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.

Editado por zipter98
Link para o comentário
Compartilhar em outros sites

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>

 

Editado por zipter98
Link para o comentário
Compartilhar em outros sites

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

 

Editado por zipter98
Link para o comentário
Compartilhar em outros sites

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.

Editado por Xtudomuito
Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...