void Level::swapCreatures(Creature* c1, Creature* c2) { Vec2 pos1 = c1->getPosition().getCoord(); Vec2 pos2 = c2->getPosition().getCoord(); unplaceCreature(c1, pos1); unplaceCreature(c2, pos2); placeCreature(c1, pos2); placeCreature(c2, pos1); }
CreatureObject* CreatureManagerImplementation::spawnCreature(uint32 templateCRC, float x, float z, float y, uint64 parentID) { CreatureObject* creature = createCreature(templateCRC); placeCreature(creature, x, z, y, parentID); return creature; }
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::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; }
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; }
void Level::putCreature(Vec2 position, Creature* c) { CHECK(inBounds(position)); creatures.push_back(c); if (c->isPlayer()) { player = c; if (entryMessage != "") { c->playerMessage(entryMessage); entryMessage = ""; } } CHECK(getSafeSquare(position)->getCreature() == nullptr); placeCreature(c, position); }
void CreatureManagerImplementation::spawnRandomCreature(int number, float x, float z, float y, uint64 parentID) { Locker locker(_this.get()); if (reservePool.size() != 0) { int id = System::random(reservePool.size() - 1); ManagedReference<AiAgent*> aiAgent = reservePool.get(id); reservePool.remove(id); locker.release(); placeCreature(aiAgent, x, z, y, parentID); //aiAgent->info("respawning from reserve Pool", true); ++spawnedRandomCreatures; return; } locker.release(); if (creatureTemplateManager->size() == 0) return; int max = creatureTemplateManager->size() - 1; uint32 randomCreature = System::random(max); uint32 randomTemplate = 0; Reference<CreatureTemplate*> creoTempl = NULL; HashTableIterator<uint32, Reference<CreatureTemplate*> > iterator = creatureTemplateManager->iterator(); for (int i = 0; i < randomCreature; ++i) { iterator.getNextKeyAndValue(randomTemplate, creoTempl); //randomTemplate = iterator.getNextKey(); } if (creoTempl == NULL || creoTempl->getLevel() > 100) return; for (int i = 0; i < number; ++i) { if (spawnCreature(randomTemplate, 0, x, z, y, parentID) != NULL) ++spawnedRandomCreatures; } }
void Level::moveCreature(Creature* creature, Vec2 direction) { CHECK(canMoveCreature(creature, direction)); Vec2 position = creature->getPosition().getCoord(); unplaceCreature(creature, position); placeCreature(creature, position + direction); }