2017-02-07 3 views
-4

Я новичок в C++, и я попытался создать сценарий для частного сервера Trinity Core World of Warcraft, но кажется, что некоторые из кодов успешно выполнялись, а другие экранированы для причина неизвестна ..Некоторые из этих кодов не запускаются

вот код

#include "ScriptPCH.h" 
#include "DisableMgr.h" 

class LearnSpellsOnLevelUp : public PlayerScript 
{ 
public: 
    LearnSpellsOnLevelUp() 
     : PlayerScript("LearnSpellsOnLevelUp"){}; 

    void OnLevelChanged(Player* player, uint8 oldLevel) 
    { 
     if (player->getClass() == 3 && player->getLevel() >= 12) // ran 
     { 
      if (player->HasSpell(23356)) // ran 
       return; // ran 
      else // ran 
       player->LearnSpell(23356, false); // ran 
      player->GetSession()->SendAreaTriggerMessage("|cff00FF00You Learnt new Spell [Taming Lesson]!|r"); // ran 
     } 

     if (player->getClass() == 9) // Warlock // ran 
     { 
      if (player->getLevel() >= 2) // ran 
      { 
       if (player->HasSpell(44163)) // ran 
        return; 
       else 
        player->LearnSpell(44163, false); // ran 
       player->GetSession()->SendAreaTriggerMessage("|cff00FF00You Learnt new Spell [Summon Imp]!|r"); // ran 
      } 
      else if (player->getLevel() >= 10) 
      { 
       if (player->HasSpell(25112)) 
        return; 
       else 
        player->LearnSpell(25112, false); 
       player->GetSession()->SendAreaTriggerMessage("|cff00FF00You Learnt new Spell [Summon Voidwalker]!|r"); 
      } 
      else if (player->getLevel() >= 20) 
      { 
       if (player->HasSpell(712)) 
        return; 
       else 
        player->LearnSpell(712, false); 
       player->GetSession()->SendAreaTriggerMessage("|cff00FF00You Learnt new Spell [Summon Succubus]!|r"); 
      } 
      else if (player->getLevel() >= 30) 
      { 
       if (player->HasSpell(691)) 
        return; 
       else 
        player->LearnSpell(691, false); 
       player->GetSession()->SendAreaTriggerMessage("|cff00FF00You Learnt new Spell [Summon Felhunter]!|r"); 
      } 
      else 
       return; 
     } 
    } 
}; 

void AddSC_LearnSpellsOnLevelUp() 
{ 
    new LearnSpellsOnLevelUp(); 
} 

я написал рядом с кодами, которые бежали успешно // побежал

+2

Возможно, у вас нет Чернокнижника с уровнем> = 10. | Отладчик - ваш друг – Nils

+1

Итак, следующее, что вам нужно узнать, это использовать ваш отладчик. Взгляните на эту ссылку https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – UKMonkey

+1

IMHO, вам не нужно использовать 'else if' в вашем случае. Действительно, 32 больше 2, поэтому вы входите в первое условие. Поскольку вы используете 'else if' для другого случая, это нормально, что вы никогда не входите в него. Попробуйте заменить 'else if' простым' if' – Garf365

ответ

1

Обратите пристальное внимание на порядок ваших getLevel условий.

if (player->getLevel() >= 2) 
{ 
} 
// Here, it's certain that the level is < 2, since it wasn't >= 2. 
// Thus, none of these following tests will be true. 
else if (player->getLevel() >= 10) 
{ 
} 
else if (player->getLevel() >= 20) 
{ 
} 
else if (player->getLevel() >= 30) 
{ 
} 
else 
    return; 

Вы должны протестировать уровни, начиная с самого большого и работать по-своему.

if (player->getLevel() >= 30) 
{ 
} 
// The level is less than 30. Is it greater than 20? 
else if (player->getLevel() >= 20) 
{ 
} 
// The level is less than 20. Is it greater than 10? 
else if (player->getLevel() >= 10) 
{ 
} 
// The level is less than 10. Is it greater than 2? 
else if (player->getLevel() >= 2) 
{ 
} 
else 
    return; 
+0

Работал! спасибо большое – MiDo

0

Похоже, что есть просто логическая ошибка. Давайте посмотрим на это заявление:

if (player->getLevel() >= 2) // ran - нормально до сих пор

И теперь многое из этого:

else if (player->getLevel() >= 10) - и другие (по сравнению с 20, 30)

Теперь предположим, что ваш «игрока 'имеет 15 уровень - выглядит намерение было запустить второй if блок (например, если вы сравните с >= 10)

Но есть проблема: если уровень равен 15, то каждый раз только первыйif -block выполняется (потому что, очевидно, 15> = 2).

Решение: сравните диапазон, например:

if ((player->getLevel() >= 2) && (player->getLevel() < 10)) 
... 
else if ((player->getLevel() >= 10) && (player->getLevel() < 20)) 
... 

И так далее.

+0

Я получил это сейчас, спасибо – MiDo

Смежные вопросы