Если посмотреть файл констант (types.h), то увидишь, что все константы на события - это степень двойки.
Можно использовать и "+" вместо операции "|" (побитовое или). Результат будет такой же.
Я вообще скольняюсь к разработке некоторых стандартных решений "на все случаи жизни".
Например, для квест-мастера можно завести триггер, который реагирует на события:
- персонаж вошел
- персонаж что-то сказал
- персонаж дал предмет (деньги, как вариант, но это еще + событие)
для мобов такого типа определяем класс триггеров, например так:
Код:
class MobTrigger {
public:
// Метод обработки события на вход лидера.
virtual int onIncomingLeader(CIncomingLeaderMobTriggerData* data) { return 0; }
// Аналогичные методы на другие события.
// Процедура обработки триггера.
int processTrigger(CMobTriggerData* data) {
// Тут надо позоботиться об удалении данных,
// но некоторые события требуют не удалять их.
// Можно воспользоваться классом std::auto_ptr, подробнее в MSDN.
switch (data->m_type) {
case MTRG_INCOMING_LEADER:
return onIncomingLeader(
(CIncomingLeaderMobTriggerData*) data
);
// Удаление data будет сделано в деструкторе переменной std::auto_ptr
// другие case для триггеров моба.
}
// Необязательно делать сдесь return, можно ипользовать default в операторе switch
return 0;
}
// Метод возвращает флаги обработчика
// второй пареметр для g_trgMng.LoadMobTrigger
virtual int getTriggerFlags() { return 0; }
// Статический метод обработки триггера, обеспечивает вызов метода processTrigger
// третий пареметр для g_trgMng.LoadMobTrigger
static int callTrigger(CMobTriggerData* data) {
// Тут не скажу ... возможно потом
}
};
class QuestMasterTrigger : public MobTrigger {
public:
int onIncomingLeader(CIncomingLeaderMobTriggerData* data) {
// Логика триггера.
return 0;
}
int onSpeak(CSpeakMobTriggerData* data) {
// Логика триггера.
return 0;
}
int onGiveObject(CGiveObjMobTriggerData* data) {
// Логика триггера.
return 0;
}
int getTriggerFlags() {
return (MTRG_INCOMING_LEADER | MTRG_SPEAK | MTRG_GIVE_OBJ);
}
};
Как прикрепить эти методы к мобу я не скажу, думайте сами
Ну или скажу, потом...
Используйте наследование и получите отличный механизм написания триггеров.
А так же, значительно более понятный и читаемый код.
Таких шаблонов я насчитал как минимум 10, и привел один из них в качестве примера.