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::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::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;
}
示例#5
0
void Input::processSetupLine(std::vector<int> *token_array) {
    if(token_array->size() == 1) {
        if(this->expected_rooms == -1) {
            this->expected_rooms = token_array->at(0);
            std::cout << "DEBUG - Input - Expecting  " << this->expected_rooms << " rooms." << std::endl;
        } else if(this->expected_creatures == -1) {
            this->expected_creatures = token_array->at(0);
            std::cout << "DEBUG - Input - Expecting " << this->expected_creatures << " creatures." << std::endl;
        } else {
            std::cerr << "Bad Input. Rooms and Creatures have already been set.";
            exit(1);
        }
    } else if(token_array->size() == 2) {
        //std::cout << "DEBUG - Input - Calling Create Creature" << std::endl;
        createCreature(token_array);
    } else if(token_array->size() == 5) {
        //std::cout << "DEBUG - Input - Calling Create Room " << std::endl;
        createRoom(token_array);
    }
}
std::shared_ptr<Creature> ObjectFactory::createCreature(std::string id, std::string rarity){
	return createCreature(engine::objectLibrary.creaturePresetTemplates[id], *engine::raritySystem.getRarityType(rarity));
}
示例#7
0
static Creature *initCreature(CreatureParsed *creatureParsed) {

   int i;
   GList *nextEventHandler;
   Creature *creature = createCreature(FALSE);
   GArray *objectNames = creatureParsed->objects;

   creature->name = creatureParsed->name;
   creature->title = creatureParsed->title;
   creature->description = creatureParsed->description;
   creature->messages = creatureParsed->messages;
   creature->attackable = creatureParsed->attackable;
   creature->woundRate = creatureParsed->woundRate;
   creature->counterattack = creatureParsed->counterattack;

   /* creature's attributes */
   creature->attributes.strength = creatureParsed->attributes.strength;
   creature->attributes.dexterity = creatureParsed->attributes.dexterity;
   creature->attributes.intelligence = creatureParsed->attributes.intelligence;
   creature->attributes.initialTotal = creature->attributes.strength +
      creature->attributes.dexterity + creature->attributes.intelligence;

   /* health settings */
   creature->maxHealth = creatureParsed->maxHealth;
   creature->state.health = creatureParsed->health;
   creature->state.alive = creatureParsed->alive;

   if (NULL != creatureParsed->allegiance) {

      if (0 == strcmp(dstrview(creatureParsed->allegiance), "neutral")) {
         creature->allegiance = CREATURE_ALLEGIANCE_NEUTRAL;
      }
      
      else if (0 == strcmp(dstrview(creatureParsed->allegiance), "friend")) {
         creature->allegiance = CREATURE_ALLEGIANCE_FRIEND;
      }
      
      else if (0 == strcmp(dstrview(creatureParsed->allegiance), "enemy")) {
         creature->allegiance = CREATURE_ALLEGIANCE_ENEMY;
      }
      
      else {
         g_outputError("%s is not a valid allegiance for creature '%s'!\n",
            dstrview(creatureParsed->allegiance),
            dstrview(creatureParsed->name));
         exit(EXIT_FAILURE);
      }
   }

   /* initialize lua state for creature */
   creature->L = initLuaState(creatureParsed->scripts);

   /* initialize entity-specific event handlers */
   nextEventHandler = creatureParsed->eventHandlers;
   while (NULL != nextEventHandler) {
      EventHandlerParsed *handler = (EventHandlerParsed *)nextEventHandler->data;
      addLuaEventHandler(dstrview(handler->event), creature->events,
         dstrview(handler->function), creature->L);
      nextEventHandler = g_list_next(nextEventHandler);
   }

   /* add objects to the creature's inventory */
   for (i = 0; i < objectNames->len; i++) {

      dstring_t *objectName = g_array_index(objectNames, dstring_t, i);
      Object *object = g_hash_table_lookup(g_objects, (char *)dstrview(objectName));

      creature->inventory.list = addObject(creature->inventory.list,
         creature->inventory.byName, objectName);
      object->state.owner.entity = creature;
      object->state.owner.type = entity_creature;
   }

   return creature;
}