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; } }
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; }
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; }
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; }
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; }