void ServerApplication::hRegionRequest(RegionPacket* const argPacket) { //get the region object, send a rejection on error RoomData* room = roomMgr.Get(argPacket->roomIndex); if (!room) { //build the error message std::ostringstream msg; msg << "Failed to find Region (" << argPacket->roomIndex << "," << argPacket->x << "," << argPacket->y << "); "; msg << "Room " << argPacket->roomIndex << " does not exist"; //build the packet TextPacket newPacket; newPacket.type = SerialPacketType::REGION_REJECTION; strncpy(newPacket.text, msg.str().c_str(), PACKET_STRING_SIZE); network.SendTo(argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket)); //log the error std::cerr << "Error message sent: " << newPacket.text << std::endl; return; } Region* region = room->GetPager()->GetRegion(argPacket->x, argPacket->y); //send the content RegionPacket newPacket; newPacket.type = SerialPacketType::REGION_CONTENT; newPacket.roomIndex = argPacket->roomIndex; newPacket.x = argPacket->x; newPacket.y = argPacket->y; newPacket.region = region; network.SendTo(argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket)); }
static int initialize(lua_State* L) { RoomData* room = static_cast<RoomData*>(lua_touserdata(L, 1)); //set the refs of these parameters (backwards, since it pops from the top of the stack) room->GetPager()->SetUnloadReference(luaL_ref(L, LUA_REGISTRYINDEX)); room->GetPager()->SetCreateReference(luaL_ref(L, LUA_REGISTRYINDEX)); room->GetPager()->SetSaveReference(luaL_ref(L, LUA_REGISTRYINDEX)); room->GetPager()->SetLoadReference(luaL_ref(L, LUA_REGISTRYINDEX)); //more parameters can be added here later return 0; }
static int forEachCharacter(lua_State* L) { RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1)); //pass each character to the given function for (auto& it : *room->GetCharacterList()) { lua_pushvalue(L, -1); lua_pushlightuserdata(L, static_cast<void*>(it)); //call each iteration, throwing an exception if something happened if (lua_pcall(L, 1, 0, 0) != LUA_OK) { std::ostringstream os; os << "Lua error: "; os << lua_tostring(L, -1); throw(std::runtime_error(os.str())); } } return 0; }
static int forEachCreature(lua_State* L) { RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1)); CreatureManager* creatureMgr = room->GetCreatureMgr(); //pass each creature to the given function for (auto& it : *creatureMgr->GetContainer()) { lua_pushvalue(L, -1); lua_pushlightuserdata(L, static_cast<void*>(&it.second)); //call each iteration, throwing an exception if something happened if (lua_pcall(L, 1, 0, 0) != LUA_OK) { std::ostringstream os; os << "Lua error: "; os << lua_tostring(L, -1); throw(std::runtime_error(os.str())); } } return 0; }
void pumpPacketProximity(SerialPacket* const argPacket, int roomIndex, Vector2 position, int distance) { RoomData* roomData = RoomManager::GetSingleton().Get(roomIndex); if (!roomData) { throw(std::runtime_error("Failed to pump to a non-existant room")); } AccountData* accountData = nullptr; ClientData* clientData = nullptr; for (auto& characterIt : *roomData->GetCharacterList()) { if (distance == -1 || (characterIt->GetOrigin() - position).Length() <= distance) { accountData = AccountManager::GetSingleton().Get(characterIt->GetOwner()); clientData = ClientManager::GetSingleton().Get(accountData->GetClientIndex()); UDPNetworkUtility::GetSingleton().SendTo(clientData->GetAddress(), argPacket); } } }
void ScreenNetRoom::HandleScreenMessage( const ScreenMessage SM ) { if( SM == SM_GoToPrevScreen ) { SCREENMAN->SetNewScreen( THEME->GetMetric (m_sName, "PrevScreen") ); } else if( SM == SM_GoToNextScreen ) { SCREENMAN->SetNewScreen( THEME->GetMetric (m_sName, "NextScreen") ); } else if( SM == SM_BackFromReqPass ) { if ( !ScreenTextEntry::s_bCancelledLast ) { NSMAN->m_SMOnlinePacket.ClearPacket(); NSMAN->m_SMOnlinePacket.Write1( 1 ); NSMAN->m_SMOnlinePacket.Write1( 1 ); //Type (enter a room) NSMAN->m_SMOnlinePacket.WriteNT( m_sLastPickedRoom ); NSMAN->m_SMOnlinePacket.WriteNT( ScreenTextEntry::s_sLastAnswer ); NSMAN->SendSMOnline( ); } } else if( SM == SM_SMOnlinePack ) { switch( NSMAN->m_SMOnlinePacket.Read1() ) { case 1: switch ( NSMAN->m_SMOnlinePacket.Read1() ) { case 0: //Room title Change { RString title, subtitle; title = NSMAN->m_SMOnlinePacket.ReadNT(); subtitle = NSMAN->m_SMOnlinePacket.ReadNT(); Message msg( MessageIDToString(Message_UpdateScreenHeader) ); msg.SetParam( "Header", title ); msg.SetParam( "Subheader", subtitle ); MESSAGEMAN->Broadcast( msg ); if ( NSMAN->m_SMOnlinePacket.Read1() != 0 ) { RString SMOnlineSelectScreen = THEME->GetMetric( m_sName, "MusicSelectScreen" ); SCREENMAN->SetNewScreen( SMOnlineSelectScreen ); } } case 1: //Rooms list change { int numRooms = NSMAN->m_SMOnlinePacket.Read1(); m_Rooms.clear(); for( int i=0; i<numRooms; ++i ) { RoomData tmpRoomData; tmpRoomData.SetName( NSMAN->m_SMOnlinePacket.ReadNT() ); tmpRoomData.SetDescription( NSMAN->m_SMOnlinePacket.ReadNT() ); m_Rooms.push_back( tmpRoomData ); } //Abide by protocol and read room status for( int i=0; i<numRooms; ++i ) m_Rooms[i].SetState( NSMAN->m_SMOnlinePacket.Read1() ); for( int i=0; i<numRooms; ++i ) m_Rooms[i].SetFlags( NSMAN->m_SMOnlinePacket.Read1() ); if( m_iRoomPlace<0 ) m_iRoomPlace=0; if( m_iRoomPlace >= (int) m_Rooms.size() ) m_iRoomPlace=m_Rooms.size()-1; UpdateRoomsList(); } } break; case 3: RoomInfo info; info.songTitle = NSMAN->m_SMOnlinePacket.ReadNT(); info.songSubTitle = NSMAN->m_SMOnlinePacket.ReadNT(); info.songArtist = NSMAN->m_SMOnlinePacket.ReadNT(); info.numPlayers = NSMAN->m_SMOnlinePacket.Read1(); info.maxPlayers = NSMAN->m_SMOnlinePacket.Read1(); info.players.resize( info.numPlayers ); for( int i = 0; i < info.numPlayers; ++i ) info.players[i] = NSMAN->m_SMOnlinePacket.ReadNT(); m_roomInfo.SetRoomInfo( info ); break; } } else if ( SM == SM_BackFromRoomName ) { if ( !ScreenTextEntry::s_bCancelledLast ) { m_newRoomName = ScreenTextEntry::s_sLastAnswer; ScreenTextEntry::TextEntry( SM_BackFromRoomDesc, ENTER_ROOM_DESCRIPTION, "", 255 ); } } else if( SM == SM_BackFromRoomDesc ) { if ( !ScreenTextEntry::s_bCancelledLast ) { m_newRoomDesc = ScreenTextEntry::s_sLastAnswer; ScreenTextEntry::TextEntry( SM_BackFromRoomPass, ENTER_ROOM_PASSWORD, "", 255 ); } } else if( SM == SM_BackFromRoomPass ) { if ( !ScreenTextEntry::s_bCancelledLast ) { m_newRoomPass = ScreenTextEntry::s_sLastAnswer; CreateNewRoom( m_newRoomName, m_newRoomDesc, m_newRoomPass); } } else if ( SM == SM_RoomInfoRetract ) { m_roomInfo.RetractInfoBox(); } else if ( SM == SM_RoomInfoDeploy ) { int i = m_RoomWheel.GetCurrentIndex() - m_RoomWheel.GetPerminateOffset(); const RoomWheelItemData* data = m_RoomWheel.GetItem(i); if( data != NULL ) m_roomInfo.SetRoom( data ); } ScreenNetSelectBase::HandleScreenMessage( SM ); }
static int getTriggerMgr(lua_State* L) { RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1)); lua_pushlightuserdata(L, reinterpret_cast<void*>(room->GetTriggerMgr()) ); return 1; }
static int getTilesetName(lua_State* L) { RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1)); lua_pushstring(L, room->GetTileset().c_str()); return 1; }
static int setTilesetName(lua_State* L) { RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1)); room->SetTileset(lua_tostring(L, 2)); return 0; }
static int getTag(lua_State* L) { RoomData* room = static_cast<RoomData*>(lua_touserdata(L, 1)); lua_pushstring(L, room->GetTag(lua_tostring(L, 2)).c_str()); return 1; }
//TODO: autogen docs static int setTag(lua_State* L) { RoomData* room = static_cast<RoomData*>(lua_touserdata(L, 1)); room->SetTag(lua_tostring(L, 2), lua_tostring(L, 3)); return 0; }
static int getOnTick(lua_State* L) { RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1)); lua_rawgeti(L, LUA_REGISTRYINDEX, room->GetTickReference()); return 1; }
static int setOnTick(lua_State* L) { RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1)); luaL_unref(L, LUA_REGISTRYINDEX, room->GetTickReference()); room->SetTickReference(luaL_ref(L, LUA_REGISTRYINDEX)); return 0; }
void ScreenNetRoom::HandleScreenMessage( const ScreenMessage SM ) { if( SM == SM_GoToPrevScreen ) { SCREENMAN->SetNewScreen( THEME->GetMetric (m_sName, "PrevScreen") ); } else if( SM == SM_GoToNextScreen ) { SCREENMAN->SetNewScreen( THEME->GetMetric (m_sName, "NextScreen") ); } else if( SM == SM_SMOnlinePack ) { if ( NSMAN->m_SMOnlinePacket.Read1() == 1 ) { switch ( NSMAN->m_SMOnlinePacket.Read1() ) { case 0: //Room title Change { CString titleSub; titleSub = NSMAN->m_SMOnlinePacket.ReadNT() + "\n"; titleSub += NSMAN->m_SMOnlinePacket.ReadNT(); m_textTitle.SetText( titleSub ); if ( NSMAN->m_SMOnlinePacket.Read1() != 0 ) { CString SMOnlineSelectScreen; THEME->GetMetric( m_sName, "MusicSelectScreen", SMOnlineSelectScreen ); SCREENMAN->SetNewScreen( SMOnlineSelectScreen ); } } case 1: //Rooms list change { int numRooms = NSMAN->m_SMOnlinePacket.Read1(); m_Rooms.clear(); for (int i=0;i<numRooms;i++) { RoomData tmpRoomData; tmpRoomData.SetName(NSMAN->m_SMOnlinePacket.ReadNT()); tmpRoomData.SetDescription(NSMAN->m_SMOnlinePacket.ReadNT()); m_Rooms.push_back( tmpRoomData ); } //Abide by protocol and read room status for (int i=0;i<numRooms;i++) m_Rooms[i].SetState(NSMAN->m_SMOnlinePacket.Read1()); if (m_iRoomPlace<0) m_iRoomPlace=0; if( m_iRoomPlace >= (int) m_Rooms.size() ) m_iRoomPlace=m_Rooms.size()-1; UpdateRoomsList(); } } } } else if ( SM == SM_BackFromRoomName ) { if ( !ScreenTextEntry::s_bCancelledLast ) { m_newRoomName = ScreenTextEntry::s_sLastAnswer; SCREENMAN->TextEntry( SM_BackFromRoomDesc, "Enter Room Description:", "", 255 ); } } else if( SM == SM_BackFromRoomDesc ) { if ( !ScreenTextEntry::s_bCancelledLast ) { m_newRoomDesc = ScreenTextEntry::s_sLastAnswer; CreateNewRoom( m_newRoomName, m_newRoomDesc); } } ScreenNetSelectBase::HandleScreenMessage( SM ); }