bool CreatureEvents::registerEvent(Event_ptr event, const pugi::xml_node&) { CreatureEvent_ptr creatureEvent{static_cast<CreatureEvent*>(event.release())}; //event is guaranteed to be a CreatureEvent if (creatureEvent->getEventType() == CREATURE_EVENT_NONE) { std::cout << "Error: [CreatureEvents::registerEvent] Trying to register event without type!" << std::endl; return false; } CreatureEvent* oldEvent = getEventByName(creatureEvent->getName(), false); if (oldEvent) { //if there was an event with the same that is not loaded //(happens when realoading), it is reused if (!oldEvent->isLoaded() && oldEvent->getEventType() == creatureEvent->getEventType()) { oldEvent->copyEvent(creatureEvent.get()); } return false; } else { //if not, register it normally auto it = creatureEvents.find(creatureEvent->getName()); if (it != creatureEvents.end()) { it->second = *creatureEvent; } else { creatureEvents.emplace(creatureEvent->getName(), std::move(*creatureEvent)); } return true; } }
bool GlobalEvents::registerEvent(Event_ptr event, const pugi::xml_node&) { GlobalEvent_ptr globalEvent{static_cast<GlobalEvent*>(event.release())}; //event is guaranteed to be a GlobalEvent if (globalEvent->getEventType() == GLOBALEVENT_TIMER) { auto result = timerMap.emplace(globalEvent->getName(), std::move(*globalEvent)); if (result.second) { if (timerEventId == 0) { timerEventId = g_scheduler.addEvent(createSchedulerTask(SCHEDULER_MINTICKS, std::bind(&GlobalEvents::timer, this))); } return true; } } else if (globalEvent->getEventType() != GLOBALEVENT_NONE) { auto result = serverMap.emplace(globalEvent->getName(), std::move(*globalEvent)); if (result.second) { return true; } } else { // think event auto result = thinkMap.emplace(globalEvent->getName(), std::move(*globalEvent)); if (result.second) { if (thinkEventId == 0) { thinkEventId = g_scheduler.addEvent(createSchedulerTask(SCHEDULER_MINTICKS, std::bind(&GlobalEvents::think, this))); } return true; } } std::cout << "[Warning - GlobalEvents::configureEvent] Duplicate registered globalevent with name: " << globalEvent->getName() << std::endl; return false; }
bool Weapons::registerEvent(Event_ptr event, const pugi::xml_node&) { Weapon* weapon = static_cast<Weapon*>(event.release()); //event is guaranteed to be a Weapon auto result = weapons.emplace(weapon->getID(), weapon); if (!result.second) { std::cout << "[Warning - Weapons::registerEvent] Duplicate registered item with id: " << weapon->getID() << std::endl; } return result.second; }
bool Spells::registerEvent(Event_ptr event, const pugi::xml_node&) { InstantSpell* instant = dynamic_cast<InstantSpell*>(event.get()); if (instant) { auto result = instants.emplace(instant->getWords(), std::move(*instant)); if (!result.second) { std::cout << "[Warning - Spells::registerEvent] Duplicate registered instant spell with words: " << instant->getWords() << std::endl; } return result.second; } RuneSpell* rune = dynamic_cast<RuneSpell*>(event.get()); if (rune) { auto result = runes.emplace(rune->getRuneItemId(), std::move(*rune)); if (!result.second) { std::cout << "[Warning - Spells::registerEvent] Duplicate registered rune with id: " << rune->getRuneItemId() << std::endl; } return result.second; } return false; }
bool CreatureEvents::registerEvent(Event_ptr event, const pugi::xml_node&) { CreatureEvent_ptr creatureEvent{static_cast<CreatureEvent*>(event.release())}; //event is guaranteed to be a CreatureEvent if (creatureEvent->getEventType() == CREATURE_EVENT_NONE) { std::cout << "Error: [CreatureEvents::registerEvent] Trying to register event without type!" << std::endl; return false; } auto result = creatureEvents.emplace(creatureEvent->getName(), std::move(*creatureEvent)); if (!result.second) { std::cout << "[Warning - CreatureEvents::registerEvent] Duplicate registered creature event with name: " << creatureEvent->getName() << std::endl; } return result.second; }
bool Actions::registerEvent(Event_ptr event, const pugi::xml_node& node) { Action_ptr action{static_cast<Action*>(event.release())}; //event is guaranteed to be an Action pugi::xml_attribute attr; if ((attr = node.attribute("itemid"))) { uint16_t id = pugi::cast<uint16_t>(attr.value()); auto result = useItemMap.emplace(id, std::move(*action)); if (!result.second) { std::cout << "[Warning - Actions::registerEvent] Duplicate registered item with id: " << id << std::endl; } return result.second; } else if ((attr = node.attribute("fromid"))) { pugi::xml_attribute toIdAttribute = node.attribute("toid"); if (!toIdAttribute) { std::cout << "[Warning - Actions::registerEvent] Missing toid in fromid: " << attr.as_string() << std::endl; return false; } uint16_t fromId = pugi::cast<uint16_t>(attr.value()); uint16_t iterId = fromId; uint16_t toId = pugi::cast<uint16_t>(toIdAttribute.value()); auto result = useItemMap.emplace(iterId, *action); if (!result.second) { std::cout << "[Warning - Actions::registerEvent] Duplicate registered item with id: " << iterId << " in fromid: " << fromId << ", toid: " << toId << std::endl; } bool success = result.second; while (++iterId <= toId) { result = useItemMap.emplace(iterId, *action); if (!result.second) { std::cout << "[Warning - Actions::registerEvent] Duplicate registered item with id: " << iterId << " in fromid: " << fromId << ", toid: " << toId << std::endl; continue; } success = true; } return success; } else if ((attr = node.attribute("uniqueid"))) { uint16_t uid = pugi::cast<uint16_t>(attr.value()); auto result = uniqueItemMap.emplace(uid, std::move(*action)); if (!result.second) { std::cout << "[Warning - Actions::registerEvent] Duplicate registered item with uniqueid: " << uid << std::endl; } return result.second; } else if ((attr = node.attribute("fromuid"))) { pugi::xml_attribute toUidAttribute = node.attribute("touid"); if (!toUidAttribute) { std::cout << "[Warning - Actions::registerEvent] Missing touid in fromuid: " << attr.as_string() << std::endl; return false; } uint16_t fromUid = pugi::cast<uint16_t>(attr.value()); uint16_t iterUid = fromUid; uint16_t toUid = pugi::cast<uint16_t>(toUidAttribute.value()); auto result = uniqueItemMap.emplace(iterUid, *action); if (!result.second) { std::cout << "[Warning - Actions::registerEvent] Duplicate registered item with unique id: " << iterUid << " in fromuid: " << fromUid << ", touid: " << toUid << std::endl; } bool success = result.second; while (++iterUid <= toUid) { result = uniqueItemMap.emplace(iterUid, *action); if (!result.second) { std::cout << "[Warning - Actions::registerEvent] Duplicate registered item with unique id: " << iterUid << " in fromuid: " << fromUid << ", touid: " << toUid << std::endl; continue; } success = true; } return success; } else if ((attr = node.attribute("actionid"))) { uint16_t aid = pugi::cast<uint16_t>(attr.value()); auto result = actionItemMap.emplace(aid, std::move(*action)); if (!result.second) { std::cout << "[Warning - Actions::registerEvent] Duplicate registered item with actionid: " << aid << std::endl; } return result.second; } else if ((attr = node.attribute("fromaid"))) { pugi::xml_attribute toAidAttribute = node.attribute("toaid"); if (!toAidAttribute) { std::cout << "[Warning - Actions::registerEvent] Missing toaid in fromaid: " << attr.as_string() << std::endl; return false; } uint16_t fromAid = pugi::cast<uint16_t>(attr.value()); uint16_t iterAid = fromAid; uint16_t toAid = pugi::cast<uint16_t>(toAidAttribute.value()); auto result = actionItemMap.emplace(iterAid, *action); if (!result.second) { std::cout << "[Warning - Actions::registerEvent] Duplicate registered item with action id: " << iterAid << " in fromaid: " << fromAid << ", toaid: " << toAid << std::endl; } bool success = result.second; while (++iterAid <= toAid) { result = actionItemMap.emplace(iterAid, *action); if (!result.second) { std::cout << "[Warning - Actions::registerEvent] Duplicate registered item with action id: " << iterAid << " in fromaid: " << fromAid << ", toaid: " << toAid << std::endl; continue; } success = true; } return success; } return false; }
bool TalkActions::registerEvent(Event_ptr event, const pugi::xml_node&) { TalkAction_ptr talkAction{static_cast<TalkAction*>(event.release())}; // event is guaranteed to be a TalkAction talkActions.emplace(talkAction->getWords(), std::move(*talkAction)); return true; }