void Vehicle::InstallAccessories() { CreatureProtoVehicle* acc = CreatureProtoVehicleStorage.LookupEntry(GetEntry()); if(acc == NULL) { sLog.outDetail("Vehicle %u has no accessories.", GetEntry()); return; } MapMgr* map = (GetMapMgr() ? GetMapMgr() : sInstanceMgr.GetMapMgr(GetMapId())); if(map == NULL) // Shouldn't ever really happen. return; for(int i = 0; i < 8; i++) { SeatInfo seatinfo = acc->seats[i]; if(!seatinfo.accessoryentry || (seatinfo.accessoryentry == GetEntry())) continue; if(m_vehicleSeats[i] == NULL) { sLog.outDetail("No seatmap for selected seat.\n"); continue; } // Load the Proto CreatureProto* proto = CreatureProtoStorage.LookupEntry(seatinfo.accessoryentry); CreatureInfo* info = CreatureNameStorage.LookupEntry(seatinfo.accessoryentry); if(!proto || !info) { sLog.outError("No proto/info for vehicle accessory %u in vehicle %u", seatinfo.accessoryentry, GetEntry()); continue; } // Remove any passengers. if(m_passengers[i]) RemovePassenger(m_passengers[i]); if(proto->vehicle_entry > 0) { // Create the Vehicle! Vehicle* pass = map->CreateVehicle(seatinfo.accessoryentry); if(pass != NULL && pass) { pass->Load(proto, (IsInInstance() ? map->iInstanceMode : MODE_5PLAYER_NORMAL), GetPositionX()+m_vehicleSeats[i]->m_attachmentOffsetX, GetPositionY()+m_vehicleSeats[i]->m_attachmentOffsetY, GetPositionZ()+m_vehicleSeats[i]->m_attachmentOffsetZ); pass->Init(); pass->m_TransporterGUID = GetGUID(); pass->InitSeats(proto->vehicle_entry); if(pass->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK)) pass->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); // Accessory AddPassenger(pass, i, true); pass->PushToWorld(map); } } else { // Create the Unit! Creature* pass = map->CreateCreature(seatinfo.accessoryentry); if(pass != NULL) { pass->Load(proto, map->iInstanceMode, GetPositionX()+m_vehicleSeats[i]->m_attachmentOffsetX, GetPositionY()+m_vehicleSeats[i]->m_attachmentOffsetY, GetPositionZ()+m_vehicleSeats[i]->m_attachmentOffsetZ); pass->Init(); pass->m_TransporterGUID = GetGUID(); AddPassenger(pass, i, true); pass->PushToWorld(map); } } } }
int LuaGlobalFunctions_PerformIngameSpawn(lua_State * L) { uint32 spawntype = luaL_checkint(L, 1); uint32 entry = luaL_checkint(L, 2); uint32 map = luaL_checkint(L, 3); float x = CHECK_FLOAT(L, 4); float y = CHECK_FLOAT(L, 5); float z = CHECK_FLOAT(L, 6); float o = CHECK_FLOAT(L, 7); uint32 faction = luaL_checkint(L, 8); //also scale as percentage uint32 duration = luaL_checkint(L, 9); uint32 equip1 = luaL_optint(L, 10, 1); uint32 equip2 = luaL_optint(L, 11, 1); uint32 equip3 = luaL_optint(L, 12, 1); //13: instance id uint32 save = luaL_optint(L, 14, 0); if(x && y && z && entry) { if (spawntype == 1) //Unit { CreatureProto *p = CreatureProtoStorage.LookupEntry(entry); CreatureInfo *i = CreatureNameStorage.LookupEntry(entry); if (p == NULL || i == NULL) RET_NIL(true); MapMgr *mapMgr = sInstanceMgr.GetMapMgr(map); if (mapMgr == NULL) RET_NIL(true); int32 instanceid = luaL_optint(L, 13, mapMgr->GetInstanceID()); CreatureSpawn * sp = new CreatureSpawn(); sp->entry = entry; sp->id = objmgr.GenerateCreatureSpawnID(); sp->x = x; sp->y = y; sp->z = z; sp->o = o; sp->emote_state = 0; sp->flags = 0; sp->factionid = faction; sp->stand_state = 0; sp->phase = 1; sp->vehicle = p->vehicle_entry > 0 ? true : false; sp->Bytes = NULL; sp->ChannelData = NULL; sp->MountedDisplay = NULL; Creature * pCreature = NULL; if(sp->vehicle) { pCreature = TO_CREATURE(mapMgr->CreateVehicle(entry)); TO_VEHICLE(pCreature)->Load(sp, mapMgr->iInstanceMode, NULL); } else { pCreature = mapMgr->CreateCreature(entry); pCreature->Load(sp, mapMgr->iInstanceMode, NULL); } pCreature->m_loadedFromDB = true; pCreature->SetFaction(faction); pCreature->SetInstanceID(instanceid); pCreature->SetMapId(map); pCreature->m_noRespawn = true; pCreature->PushToWorld(mapMgr); if (duration>0) pCreature->Despawn(duration,0); if (save) pCreature->SaveToDB(); Lunar<Unit>::push(L,TO_UNIT(pCreature)); } else if (spawntype == 2) //GO { GameObjectInfo *n = GameObjectNameStorage.LookupEntry(entry); if (n == NULL) RET_NIL(true); MapMgr *mapMgr = sInstanceMgr.GetMapMgr(map); if (mapMgr == NULL) RET_NIL(true); int32 instanceid = luaL_optint(L, 13, mapMgr->GetInstanceID()); GameObject *go = mapMgr->CreateGameObject(entry); go->SetInstanceID(instanceid); go->CreateFromProto(entry,map,x,y,z,o); // Create spawn instance GOSpawn * gs = new GOSpawn; gs->entry = go->GetEntry(); gs->facing = go->GetOrientation(); gs->faction = go->GetFaction(); gs->flags = go->GetUInt32Value(GAMEOBJECT_FLAGS); gs->id = objmgr.GenerateGameObjectSpawnID(); gs->scale = go->GetUInt32Value(OBJECT_FIELD_SCALE_X); gs->x = go->GetPositionX(); gs->y = go->GetPositionY(); gs->z = go->GetPositionZ(); gs->state = go->GetByte(GAMEOBJECT_BYTES_1, 0); gs->phase = 0; go->m_spawn = gs; go->PushToWorld(mapMgr); if (duration) sEventMgr.AddEvent(go,&GameObject::ExpireAndDelete,EVENT_GAMEOBJECT_UPDATE,duration,1,EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); if (save) go->SaveToDB(); Lunar<GameObject>::push(L,go); } else RET_NIL(true); } else RET_NIL(true); return 1; }