CreatureObject* CreatureManagerImplementation::spawnCreatureAsEventMob(uint32 templateCRC, float x, float z, float y, uint64 parentID) { CreatureTemplate* creoTempl = creatureTemplateManager->getTemplate(templateCRC); if (creoTempl == NULL) return NULL; CreatureObject* creo = NULL; String templateToSpawn = getTemplateToSpawn(templateCRC); uint32 objectCRC = templateToSpawn.hashCode(); creo = createCreature(objectCRC, false, templateCRC); if (creo != NULL && creo->isAiAgent()) { AiAgent* creature = cast<AiAgent*>(creo); creature->loadTemplateData(creoTempl); UnicodeString eventName; eventName = creature->getDisplayedName() + " (event)"; creature->setCustomObjectName(eventName, false); } else if (creo == NULL) { error("could not spawn template " + templateToSpawn); } placeCreature(creo, x, z, y, parentID); if (creo != NULL && creo->isAiAgent()) cast<AiAgent*>(creo)->activateLoad(""); return creo; }
void LairObserverImplementation::notifyDestruction(TangibleObject* lair, TangibleObject* attacker, int condition) { ThreatMap* threatMap = lair->getThreatMap(); Reference<DisseminateExperienceTask*> deTask = new DisseminateExperienceTask(lair, threatMap, &spawnedCreatures); deTask->execute(); threatMap->removeObservers(); threatMap->removeAll(); // we can clear the original one if (lair->getZone() == NULL) { spawnedCreatures.removeAll(); return; } PlayClientEffectObjectMessage* explode = new PlayClientEffectObjectMessage(lair, "clienteffect/lair_damage_heavy.cef", ""); lair->broadcastMessage(explode, false); PlayClientEffectLoc* explodeLoc = new PlayClientEffectLoc("clienteffect/lair_damage_heavy.cef", lair->getZone()->getZoneName(), lair->getPositionX(), lair->getPositionZ(), lair->getPositionY()); lair->broadcastMessage(explodeLoc, false); lair->destroyObjectFromWorld(true); for (int i = 0; i < spawnedCreatures.size(); ++i) { CreatureObject* obj = spawnedCreatures.get(i); if (obj->isAiAgent()) (cast<AiAgent*>(obj))->setDespawnOnNoPlayerInRange(true); } spawnedCreatures.removeAll(); }
CreatureObject* CreatureManagerImplementation::spawnCreature(uint32 templateCRC, uint32 objectCRC, float x, float z, float y, uint64 parentID, bool persistent) { CreatureTemplate* creoTempl = creatureTemplateManager->getTemplate(templateCRC); if (creoTempl == NULL) return spawnCreature(objectCRC, x, z, y, parentID); CreatureObject* creature = NULL; String templateToSpawn; if (objectCRC == 0) { templateToSpawn = getTemplateToSpawn(templateCRC); objectCRC = templateToSpawn.hashCode(); } creature = createCreature(objectCRC, persistent, templateCRC); if (creature != NULL && creature->isAiAgent()) { AiAgent* npc = cast<AiAgent*>(creature); npc->loadTemplateData(creoTempl); } else if (creature == NULL) { error("could not spawn template " + templateToSpawn); } placeCreature(creature, x, z, y, parentID); return creature; }
CreatureObject* CreatureManagerImplementation::spawnCreatureAsBaby(uint32 templateCRC, float x, float z, float y, uint64 parentID) { CreatureTemplate* creoTempl = creatureTemplateManager->getTemplate(templateCRC); if (creoTempl == NULL || creoTempl->getTame() <= 0) return NULL; CreatureObject* creo = NULL; String templateToSpawn = getTemplateToSpawn(templateCRC); uint32 objectCRC = templateToSpawn.hashCode(); creo = createCreature(objectCRC, false, templateCRC); if (creo != NULL && creo->isCreature()) { Creature* creature = cast<Creature*>(creo); creature->loadTemplateDataForBaby(creoTempl); } else { error("could not spawn template " + templateToSpawn + " as baby."); creo = NULL; } placeCreature(creo, x, z, y, parentID); if (creo != NULL && creo->isAiAgent()) cast<AiAgent*>(creo)->activateLoad(""); else { error("could not spawn template " + templateToSpawn + " as baby with AI."); creo = NULL; } return creo; }
CreatureObject* CreatureManagerImplementation::spawnCreatureWithAi(uint32 templateCRC, float x, float z, float y, uint64 parentID, bool persistent) { CreatureObject* creature = spawnCreature(templateCRC, 0, x, z, y, parentID, persistent); if (creature != NULL && creature->isAiAgent()) cast<AiAgent*>(creature)->activateLoad(""); else { error("could not spawn template " + String::valueOf(templateCRC) + " with AI."); creature = NULL; } return creature; }
void SpawnObserverImplementation::despawnSpawns() { for (int i = 0; i < spawnedCreatures.size(); ++i) { CreatureObject* obj = spawnedCreatures.get(i); if (obj->isAiAgent()) { AiAgent* aiObj = cast<AiAgent*>(obj); Locker locker(aiObj); aiObj->setDespawnOnNoPlayerInRange(true); } } spawnedCreatures.removeAll(); }
void LairObserverImplementation::doAggro(TangibleObject* lair, TangibleObject* attacker, bool allAttack){ for (int i = 0; i < spawnedCreatures.size() ; ++i) { CreatureObject* creo = spawnedCreatures.get(i); if (creo->isDead() || creo->getZone() == NULL) continue; if (creo->isAiAgent() && attacker != NULL && (allAttack || (System::random(1) == 1))) { // TODO: only set defender if needed AiAgent* ai = cast<AiAgent*>( creo); Locker clocker(creo, lair); creo->setDefender(attacker); } } }