Exemplo n.º 1
0
void Creature::equipItem(Common::UString tag, InventorySlot slot, CreatureInfo &invOwner, bool updateModel) {
	if (_info.isInventorySlotEquipped(slot)) {
		Common::UString equippedItem = _info.getEquippedItem(slot);
		_info.unequipInventorySlot(slot);
		invOwner.addInventoryItem(equippedItem);
		_equipment.erase(slot);
	}

	if (!tag.empty() && addItemToEquipment(tag, slot)) {
		invOwner.removeInventoryItem(tag);
		_info.equipItem(tag, slot);
	}

	if (!updateModel)
		return;

	switch (slot) {
		case kInventorySlotBody:
			loadEquippedModel();
			break;
		case kInventorySlotLeftWeapon:
		case kInventorySlotRightWeapon:
			attachWeaponModel(slot);
			break;
		default:
			break;
	}
}
Exemplo n.º 2
0
Creature * MapScriptInterface::SpawnCreature(CreatureSpawn * sp, bool AddToWorld)
{
	if(!sp)
		return NULL;

	if( mapMgr._shutdown == true )
		return NULL;

	CreatureProto * proto = CreatureProtoStorage.LookupEntry(sp->entry);
	CreatureInfo * info = CreatureNameStorage.LookupEntry(sp->entry);
	if(proto == 0 || info == 0)
	{
		return 0;
	}

	uint32 Gender = info->GenerateModelId(&sp->displayid);
	Creature * p = this->mapMgr.CreateCreature(sp->entry);
	ASSERT(p);
	p->Load(sp, (uint32)NULL, NULL);
	p->setGender(Gender);
	p->spawnid = 0;
	p->m_spawn = 0;
	if (AddToWorld)
		p->PushToWorld(&mapMgr);
	return p;
}
Exemplo n.º 3
0
Creature* MapScriptInterface::SpawnCreature(uint32 Entry, float cX, float cY, float cZ, float cO, bool AddToWorld, bool tmplate, uint32 Misc1, uint32 Misc2, uint32 phase)
{
	CreatureProto* proto = CreatureProtoStorage.LookupEntry(Entry);
	CreatureInfo* info = CreatureNameStorage.LookupEntry(Entry);
	if(proto == NULL || info == NULL)
	{
		return 0;
	}

	CreatureSpawn* sp = new CreatureSpawn;
	sp->entry = Entry;
	uint32 DisplayID = 0;
	uint8 Gender = info->GenerateModelId(&DisplayID);
	sp->displayid = DisplayID;
	sp->form = 0;
	sp->id = 0;
	sp->movetype = 0;
	sp->x = cX;
	sp->y = cY;
	sp->z = cZ;
	sp->o = cO;
	sp->emote_state = 0;
	sp->flags = 0;
	sp->factionid = proto->Faction;
	sp->bytes0 = 0;
	sp->bytes1 = 0;
	sp->bytes2 = 0;
	//sp->respawnNpcLink = 0;
	sp->stand_state = 0;
	sp->death_state = 0;
	sp->channel_target_creature = sp->channel_target_go = sp->channel_spell = 0;
	sp->MountedDisplayID = 0;
	sp->Item1SlotDisplay = 0;
	sp->Item2SlotDisplay = 0;
	sp->Item3SlotDisplay = 0;
	sp->CanFly = 0;
	sp->phase = phase;

	Creature* p = this->mapMgr.CreateCreature(Entry);
	ARCEMU_ASSERT(p != NULL);
	p->Load(sp, (uint32)NULL, NULL);
	p->setGender(Gender);
	p->spawnid = 0;
	p->m_spawn = 0;
	delete sp;
	if(AddToWorld)
		p->PushToWorld(&mapMgr);
	return p;
}
Exemplo n.º 4
0
int CreatureInfoMgr::LoadCreatureInfo()
{
	int ret = 0;
	xmlDocPtr doc;
	xmlNodePtr root;
	xmlNodePtr nodeCreature;
	int creatureCount = 0;
	char file[] = "./conf/angelfight/monsterinfo.xml";

	doc = xmlParseFile(file);
	if (!doc)
	{
		ERROR_RETURN( ( "CreatureInfoMgr::LoadCreatureInfo() Open [%s] Failed", file ), -1 );
	}

	root = xmlDocGetRootElement(doc);
	if ( !root )
	{
		ERROR_LOG("xmlDocGetRootElement error");
		ret = -1;
		goto exit;
	}
	//怪物总数
	DECODE_XML_PROP_INT( creatureCount, root, "Count" );
	if( creatureCount <= 0 )
	{
		goto exit;
	}

	m_vecCreatureInfo.clear();
	m_vecCreatureInfo.reserve(creatureCount);

	//获取子节点
	nodeCreature= root->xmlChildrenNode;
	while( nodeCreature )
	{
		CreatureInfo* pCreateure = NULL;
		if ( 0 == xmlStrcmp( nodeCreature->name, BAD_CAST"Monster" ) )
		{
			pCreateure = new CreatureInfo();
			pCreateure->m_nCreatureID = m_vecCreatureInfo.size();
			m_vecCreatureInfo.push_back(pCreateure);

			xmlChar* str;

			int ID;

			DECODE_XML_PROP_INT( ID, nodeCreature, "ID" );
			if( ID != pCreateure->m_nCreatureID )
			{
				ERROR_LOG( "Creature ID Invalid The Value is:[%d] Expect:[%u]", ID, pCreateure->m_nCreatureID );
			}

			str = xmlGetProp( nodeCreature, BAD_CAST"Level" );
			pCreateure->XmlSetLevel( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Str" );
			pCreateure->XmlSetStr( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Int" );
			pCreateure->XmlSetInt( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Hab" );
			pCreateure->XmlSetHabitus( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Ali" );
			pCreateure->XmlSetAgile( (char*)str );
			xmlFree(str);

			str = xmlGetProp( nodeCreature, BAD_CAST"Atk" );
			pCreateure->XmlSetAtk( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Aspd" );
			pCreateure->XmlSetAspd( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Evad" );
			pCreateure->XmlSetEvad( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Block" );
			pCreateure->XmlSetBlock( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Crit" );
			pCreateure->XmlSetCrit( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Hit" );
			pCreateure->XmlSetHit( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Combo" );
			pCreateure->XmlSetCombo( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Def" );
			pCreateure->XmlSetDef( (char*)str );
			xmlFree(str);

			str = xmlGetProp( nodeCreature, BAD_CAST"IsBoss" );
			pCreateure->XmlSetIsBoss( (char*)str );
			xmlFree(str);

			xmlNodePtr child = nodeCreature->xmlChildrenNode;
			while( child )
			{
				if( 0 == xmlStrcmp( child->name, BAD_CAST"Skill" ) )
				{
					str = xmlGetProp( child, BAD_CAST"ID" );
					pCreateure->XmlAddSkill( (char*)str );
				}
				else if( 0 == xmlStrcmp( child->name, BAD_CAST"Drop" ) )
				{
					str = xmlGetProp( child, BAD_CAST"ID" );
					pCreateure->XmlAddItem( (char*)str );
				}
				child = child->next;
			}
		}
		nodeCreature = nodeCreature->next;
	}
exit:
	xmlFreeDoc(doc);

	DEBUG_LOG( "Load Creature Info Over Creature Size Is:[%lu]", m_vecCreatureInfo.size() );
	return ret;
}
Exemplo n.º 5
0
bool ChatHandler::HandleVehicleSpawn(const char * args, WorldSession * m_session)
{
	uint32 entry = atol(args);
	uint8 gender = 0; 

	if(entry == 0)
		return false;

	CreatureProto * proto = CreatureProtoStorage.LookupEntry(entry);
	CreatureInfo * info = CreatureNameStorage.LookupEntry(entry);
	if(proto == 0 || info == 0)
	{
		RedSystemMessage(m_session, "Invalid entry id.");
		return true;
	}

	CreatureSpawn * sp = new CreatureSpawn;
	gender = info->GenerateModelId(&sp->displayid);
 	sp->entry = entry; 
	sp->entry = entry;
	sp->form = 0;
	sp->id = objmgr.GenerateCreatureSpawnID();
	sp->movetype = 0;
	sp->x = m_session->GetPlayer()->GetPositionX();
	sp->y = m_session->GetPlayer()->GetPositionY();
	sp->z = m_session->GetPlayer()->GetPositionZ();
	sp->o = m_session->GetPlayer()->GetOrientation();
	sp->emote_state = 0;
	sp->flags = 0;
	sp->factionid = proto->Faction;
	sp->bytes0 = sp->setbyte(0,2,gender);
	sp->bytes1 = 0;
	sp->bytes2 = 0;
	//sp->respawnNpcLink = 0;
	sp->stand_state = 0;
	sp->channel_target_creature = sp->channel_target_go = sp->channel_spell = 0;
	sp->MountedDisplayID = 0;
	sp->Item1SlotDisplay = 0;
	sp->Item2SlotDisplay = 0;
	sp->Item3SlotDisplay = 0;


	Creature * p = m_session->GetPlayer()->GetMapMgr()->CreateCreature(entry, true);
	Arcemu::Util::ARCEMU_ASSERT(   p != NULL );
	p->Load(sp, (uint32)NULL, NULL);
	p->m_loadedFromDB = true;
	p->PushToWorld(m_session->GetPlayer()->GetMapMgr());
	
	uint32 x = m_session->GetPlayer()->GetMapMgr()->GetPosX(m_session->GetPlayer()->GetPositionX());
	uint32 y = m_session->GetPlayer()->GetMapMgr()->GetPosY(m_session->GetPlayer()->GetPositionY());

	// Add spawn to map
	m_session->GetPlayer()->GetMapMgr()->GetBaseMap()->GetSpawnsListAndCreate(
		x,
		y)->CreatureSpawns.push_back(sp);

	MapCell * mCell = m_session->GetPlayer()->GetMapMgr()->GetCell( x, y );

	if( mCell != NULL )
		mCell->SetLoaded();

	BlueSystemMessage(m_session, "Spawned a vehicle `%s` with entry %u at %f %f %f on map %u", info->Name, 
		entry, sp->x, sp->y, sp->z, m_session->GetPlayer()->GetMapId());

	sGMLog.writefromsession(m_session, "spawned a %s at %u %f %f %f", info->Name, m_session->GetPlayer()->GetMapId(),sp->x,sp->y,sp->z);

	return true;
}