Ir para conteúdo
  • 0

Monster só ataca se player tiver X storage


rorix

Pergunta

essas função faz com que o monstro só ataque o player que tenha determinada storage:

 

função:

Player* player = attackedCreature->getPlayer();    std::string value;    std::string check = "1";    if (getName() == "Rat" && player && ( !(player->getStorage("400",value)) || check != value ) )    {        setFollowCreature(NULL);        setAttackedCreature(NULL);        searchTarget(TARGETSEARCH_NEAREST);            }

 

Porém o monstro está atacando o Summon do jogador também!
Como eu faço para o monstro não atacar nenhum summon, e só atacar o player que tem a storage determinada?

por ex: no caso do script acima, o rat só vai atacar o player que tem a storage 400 de valor 1... porém se o player passar com summon, o rato irá atacar esse summon... como resolver isso?

Editado por Ed'Specter
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0
Spoiler

o sistema é esse:

 

em monster.cpp

procure

void Monster::doAttacking(uint32_t interval){    if(!attackedCreature || (isSummon() && attackedCreature == this))        return;

abaixo coloque

Player* player = attackedCreature->getPlayer();    std::string value;    std::string check = "15";    if (getName() == "Rat" && player && ( !(player->getStorage("8000",value)) || check != value ) )    {        setFollowCreature(NULL);        setAttackedCreature(NULL);        searchTarget(TARGETSEARCH_NEAREST);            }

 

agora substitua essa funçao

bool Monster::selectTarget(Creature* creature){#ifdef __DEBUG__    std::cout << "Selecting target... " << std::endl;#endif    if(!isTarget(creature))        return false;    CreatureList::iterator it = std::find(targetList.begin(), targetList.end(), creature);    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;    }    if((isHostile() || isSummon()) && setAttackedCreature(creature) && !isSummon())        Dispatcher::getInstance().addTask(createTask(            boost::bind(&Game::checkCreatureAttack, &g_game, getID())));    return setFollowCreature(creature, true);}

por essa

bool Monster::selectTarget(Creature* creature){#ifdef __DEBUG__    std::cout << "Selecting target... " << std::endl;#endif    if(!isTarget(creature))        return false;    CreatureList::iterator it = std::find(targetList.begin(), targetList.end(), creature);    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;    }    Player* player = creature->getPlayer();    std::string value;    std::string check = "15";      if (getName() == "Rat" && player && ( !(player->getStorage("8000",value)) || check != value ) )        return false;    if((isHostile() || isSummon()) && setAttackedCreature(creature) && !isSummon())        Dispatcher::getInstance().addTask(createTask(            boost::bind(&Game::checkCreatureAttack, &g_game, getID())));    return setFollowCreature(creature, true);}

 

se der erro na hora de compilar, é poque a source é mais antiga, ai vc tira as aspas "8000", e deixa apenas 8000

 

vamos lá, estou começando em c++ agora, e acredito que o código poderia ficar menor, mas também não é algo absurdo.
Com os testes que eu fiz funcionou perfeitamente, caso venha a dar algum bug, é só avisar..

em monster.cpp encontre -  bool Monster::selectTarget(Creature* creature) -- e substitua

por essa:
 

bool MonsterselectTarget(Creature* creature){#ifdef __DEBUG__    stdcout << "Selecting target... " << stdendl;#endif    if(!isTarget(creature))        return false;    CreatureListiterator it = stdfind(targetList.begin(), targetList.end(), creature);    if(it == targetList.end())    {        //Target not found in our target list.#ifdef __DEBUG__        stdcout << "Target not found in targetList." << stdendl;#endif        return false;    }    Player* player = creature->getPlayer();    Monster* monster = creature->getMonster();    stdstring value;     stdstring check = "1";    if (getName() == "Rat")        {           if (player && ( !(player->getStorage("400",value)) || check != value ) )              return false;           else if (monster && ( monster->isSummon() ) )                {                monster->getMaster()->getStorage("400",value);                if(!value.empty() && value != check)                   return false;                }        }          if((isHostile() || isSummon()) && setAttackedCreature(creature) && !isSummon())        DispatchergetInstance().addTask(createTask(            boostbind(&GamecheckCreatureAttack, &g_game, getID())));    return setFollowCreature(creature, true);}

 

ainda em monster.cpp encontre:

void MonsterdoAttacking(uint32_t interval){	if(!attackedCreature || (isSummon() && attackedCreature == this))		return;

abaixo coloque:
 

    Player* player = attackedCreature->getPlayer();    Monster* monster = attackedCreature->getMonster();    stdstring value;    stdstring check = "1";    if (getName() == "Rat")    {        if (player && ( !(player->getStorage("400",value)) || check != value ) )        {           setFollowCreature(NULL);           setAttackedCreature(NULL);           searchTarget(TARGETSEARCH_NEAREST);        }        else if (monster && ( monster->isSummon() ) )        {          monster->getMaster()->getStorage("400",value);          if(!value.empty() && value != check)          {             setFollowCreature(NULL);             setAttackedCreature(NULL);             searchTarget(TARGETSEARCH_NEAREST);          }        }    }

 

 

Link para o comentário
Compartilhar em outros sites

  • 0
5 minutos atrás, rorix disse:

essas função faz com que o monstro só ataque o player que tenha determinada storage:

 

função:

Player* player = attackedCreature->getPlayer();    std::string value;    std::string check = "1";    if (getName() == "Rat" && player && ( !(player->getStorage("400",value)) || check != value ) )    {        setFollowCreature(NULL);        setAttackedCreature(NULL);        searchTarget(TARGETSEARCH_NEAREST);            }

 

Porém o monstro está atacando o Summon do jogador também!

Como eu faço para o monstro não atacar nenhum summon, e só atacar o player que tem a storage determinada?

por ex: no caso do script acima, o rat só vai atacar o player que tem a storage 400 de valor 1... porém se o player passar com summon, o rato irá atacar esse summon... como resolver isso?

 

Qual tal acrescentar um if que vai determinar se é player ?

 

if isPlayer() then

lembre de colocar algo entre os parenteses , não sei se é cid ou target ou outra coisa

Link para o comentário
Compartilhar em outros sites

  • 0
2 horas atrás, PedroHL disse:

 

Qual tal acrescentar um if que vai determinar se é player ?

 

if isPlayer() then

lembre de colocar algo entre os parenteses , não sei se é cid ou target ou outra coisa

 

mas isso que vc postou é em lua... o script que postei é em C++

Link para o comentário
Compartilhar em outros sites

  • 0
11 horas atrás, rorix disse:

 

mas isso que vc postou é em lua... o script que postei é em C++

 

Sim , como eu disse , tente fazer algo parecido com isso 

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...