// // CreateActor - Chapter 22, page 761 // int CreateActor( BSTR bstrActorXMLFile ) { std::string actorResource = ws2s(std::wstring(bstrActorXMLFile, SysStringLen(bstrActorXMLFile))); StrongActorPtr pActor = g_pApp->m_pGame->VCreateActor(actorResource, NULL); if (!pActor) return INVALID_ACTOR_ID; // fire an event letting everyone else know that we created a new actor shared_ptr<EvtData_New_Actor> pNewActorEvent(GCC_NEW EvtData_New_Actor(pActor->GetId())); IEventManager::Get()->VQueueEvent(pNewActorEvent); return pActor->GetId(); }
// // TeapotWarsLogic::VChangeState // void TeapotWarsLogic::VChangeState(BaseGameState newState) { BaseGameLogic::VChangeState(newState); switch(newState) { case BGS_WaitingForPlayers: { // spawn all local players (should only be one, though we might support more in the future) GCC_ASSERT(m_ExpectedPlayers == 1); for (int i = 0; i < m_ExpectedPlayers; ++i) { shared_ptr<IGameView> playersView(GCC_NEW TeapotWarsHumanView(g_pApp->m_Renderer)); VAddView(playersView); if (m_bProxy) { // if we are a remote player, all we have to do is spawn our view - the server will do the rest. return; } } // spawn all remote player's views on the game for (int i = 0; i < m_ExpectedRemotePlayers; ++i) { shared_ptr<IGameView> remoteGameView(GCC_NEW NetworkGameView); VAddView(remoteGameView); } // spawn all AI's views on the game for (int i = 0; i < m_ExpectedAI; ++i) { shared_ptr<IGameView> aiView(GCC_NEW AITeapotView(m_pPathingGraph)); VAddView(aiView); } break; } case BGS_SpawningPlayersActors: { if (m_bProxy) { // only the server needs to do this. return; } for (auto it = m_gameViews.begin(); it != m_gameViews.end(); ++it) { shared_ptr<IGameView> pView = *it; if (pView->VGetType() == GameView_Human) { StrongActorPtr pActor = VCreateActor("actors\\player_teapot.xml", NULL); if (pActor) { shared_ptr<EvtData_New_Actor> pNewActorEvent(GCC_NEW EvtData_New_Actor(pActor->GetId(), pView->VGetId())); IEventManager::Get()->VTriggerEvent(pNewActorEvent); // [rez] This needs to happen asap because the constructor function for Lua (which is called in through VCreateActor()) queues an event that expects this event to have been handled } } else if (pView->VGetType() == GameView_Remote) { shared_ptr<NetworkGameView> pNetworkGameView = static_pointer_cast<NetworkGameView, IGameView>(pView); StrongActorPtr pActor = VCreateActor("actors\\remote_teapot.xml", NULL); if (pActor) { shared_ptr<EvtData_New_Actor> pNewActorEvent(GCC_NEW EvtData_New_Actor(pActor->GetId(), pNetworkGameView->VGetId())); IEventManager::Get()->VQueueEvent(pNewActorEvent); } } else if (pView->VGetType() == GameView_AI) { shared_ptr<AITeapotView> pAiView = static_pointer_cast<AITeapotView, IGameView>(pView); StrongActorPtr pActor = VCreateActor("actors\\ai_teapot.xml", NULL); if (pActor) { shared_ptr<EvtData_New_Actor> pNewActorEvent(GCC_NEW EvtData_New_Actor(pActor->GetId(), pAiView->VGetId())); IEventManager::Get()->VQueueEvent(pNewActorEvent); } } } break; } } }
int InternalScriptExports::CreateActor(const char* actorArchetype, LuaPlus::LuaObject luaPosition, LuaPlus::LuaObject luaYawPitchRoll) { if (!luaPosition.IsTable()) { GCC_ERROR("Invalid object passed to CreateActor(); type = " + std::string(luaPosition.TypeName())); return INVALID_ACTOR_ID; } if (!luaYawPitchRoll.IsTable()) { GCC_ERROR("Invalid object passed to CreateActor(); type = " + std::string(luaYawPitchRoll.TypeName())); return INVALID_ACTOR_ID; } Vec3 pos(luaPosition["x"].GetFloat(), luaPosition["y"].GetFloat(), luaPosition["z"].GetFloat()); Vec3 ypr(luaYawPitchRoll["x"].GetFloat(), luaYawPitchRoll["y"].GetFloat(), luaYawPitchRoll["z"].GetFloat()); Mat4x4 initialTransform; initialTransform.BuildYawPitchRoll(ypr.x, ypr.y, ypr.z); initialTransform.SetPosition(pos); TiXmlElement *overloads = NULL; StrongActorPtr pActor = g_pApp->m_pGame->VCreateActor(actorArchetype, overloads, &initialTransform); if (pActor) { shared_ptr<EvtData_New_Actor> pNewActorEvent(GCC_NEW EvtData_New_Actor(pActor->GetId())); IEventManager::Get()->VQueueEvent(pNewActorEvent); return pActor->GetId(); } return INVALID_ACTOR_ID; }