From: Christian S. <blu...@us...> - 2005-05-19 18:58:10
|
Update of /cvsroot/planeshift/planeshift/src/server In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22939/src/server Modified Files: authentserver.cpp entitymanager.cpp weathermanager.cpp weathermanager.h Log Message: - Improved the weather controlls and made client recieve weather upon connect Index: authentserver.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/authentserver.cpp,v retrieving revision 1.135 retrieving revision 1.136 diff -C2 -d -r1.135 -r1.136 *** authentserver.cpp 14 May 2005 04:55:39 -0000 1.135 --- authentserver.cpp 19 May 2005 18:57:28 -0000 1.136 *************** *** 145,150 **** psCharacterApprovedMessage out( me->clientnum ); out.SendMessage(); - - psserver->GetWeatherManager()->SendClientCurrentTime( me->clientnum ); return; } --- 145,148 ---- Index: entitymanager.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/entitymanager.cpp,v retrieving revision 1.89 retrieving revision 1.90 diff -C2 -d -r1.89 -r1.90 *** entitymanager.cpp 5 May 2005 01:20:25 -0000 1.89 --- entitymanager.cpp 19 May 2005 18:57:28 -0000 1.90 *************** *** 520,523 **** --- 520,526 ---- psPersistWorld mesg( me->clientnum, isector->QueryObject()->GetName() ); msghandler->SendMessage( mesg.msg ); + + // Send the world time and weather here too + psserver->GetWeatherManager()->UpdateClient(client->GetClientNum()); } Index: weathermanager.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/weathermanager.cpp,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** weathermanager.cpp 14 Feb 2005 14:58:40 -0000 1.25 --- weathermanager.cpp 19 May 2005 18:57:28 -0000 1.26 *************** *** 24,30 **** --- 24,35 ---- #include "cachemanager.h" #include "globals.h" + #include "netmanager.h" + #include "client.h" + #include "gem.h" #define GAME_HOUR (10*60*1000) + //#define WEATHER_DEBUG + WeatherManager::WeatherManager(MsgHandler *msghand, EventManager *eventmgr) *************** *** 63,66 **** --- 68,119 ---- } + void WeatherManager::UpdateClient(uint32_t cnum,psSectorInfo* si) + { + if(!si) + return; + + // Update weather + psWeatherMessage rain( + cnum, + psWeatherMessage::RAIN, + si->current_rain_drops, + si->name + ); + + // Update time + psWeatherMessage time( + cnum, + psWeatherMessage::DAYNIGHT, + current_daynight, + "" + ); + + // Send + #ifdef WEATHER_DEBUG + printf("Sending weather and time updates to client %u (Rain drops: %u, time is %d)\n",cnum,si->current_rain_drops,current_daynight); + #endif + time.SendMessage(); + rain.SendMessage(); + + } + + void WeatherManager::UpdateClient(uint32_t cnum) + { + // Send the time and weather to the client + Client* client = psserver->GetNetManager()->GetAnyClient(cnum); + if(!client) + return; + + csVector3 pos; + iSector* sect; + client->GetActor()->GetPosition(pos,sect); + + if(sect) + { + psSectorInfo *sectorinfo = psServer::cachemanager.GetSectorInfoByName( sect->QueryObject()->GetName() ); + UpdateClient(cnum,sectorinfo); + } + } + void WeatherManager::QueueNextEvent(int delayticks, int eventtype, *************** *** 80,83 **** --- 133,137 ---- si); + events.Push(event); eventmanager->Push(event); } *************** *** 91,98 **** --- 145,168 ---- void WeatherManager::HandleWeatherEvent(psWeatherGameEvent *event) { + events.Delete(event); // Delete this from our "db" + + // See if we want to ignore this event + for(size_t i = 0; i < ignored.Length();i++) + { + if( event == ignored[i] ) + { + ignored.DeleteIndex(i); + return; + } + } + switch (event->type) { case psWeatherMessage::RAIN: { + event->si->current_rain_drops = event->value; + #ifdef WEATHER_DEBUG + printf("New rain in sector '%s': %d\n",event->si->name.GetData(),event->value); + #endif psWeatherMessage rain(0,event->type,event->value,event->sector); if (rain.valid) *************** *** 103,107 **** } ! // CPrintf(CON_DEBUG, "Rain message: Sector %s with %d drops.\n",(const char *)event->sector,event->value); if (event->value) // if this has drops, then queue event to turn off rain { --- 173,191 ---- } ! // Make sure we don't have any other events in this sector that will disturb ! for(size_t i = 0; i < events.Length();i++) ! { ! psWeatherGameEvent* evt = events[i]; ! if(evt->sector == event->sector && evt->type == psWeatherMessage::RAIN) ! { ! ignored.Push(evt); // Ignore when the eventmanager handles the event ! events.DeleteIndex(i); ! i--; ! #ifdef WEATHER_DEBUG ! printf("Removed disturbing event for sector '%s' (%d,%d)\n",evt->sector.GetData(),evt->value,evt->duration); ! #endif ! } ! } ! if (event->value) // if this has drops, then queue event to turn off rain { *************** *** 119,135 **** } if (event->duration == 0) QueueNextEvent(randomgen->Get(event->si->rain_max_duration - event->si->rain_min_duration) + event->si->rain_min_duration, ! psWeatherMessage::RAIN, ! 0, ! 0, ! event->si->name, ! event->si); else QueueNextEvent(event->duration, ! psWeatherMessage::RAIN, ! 0, ! 0, ! event->si->name, ! event->si); } else // if this is event to turn off rain, queue event to turn on again later --- 203,223 ---- } if (event->duration == 0) + { QueueNextEvent(randomgen->Get(event->si->rain_max_duration - event->si->rain_min_duration) + event->si->rain_min_duration, ! psWeatherMessage::RAIN, ! 0, ! 0, ! event->si->name, ! event->si); ! } else + { QueueNextEvent(event->duration, ! psWeatherMessage::RAIN, ! 0, ! 0, ! event->si->name, ! event->si); ! } } else // if this is event to turn off rain, queue event to turn on again later *************** *** 150,153 **** --- 238,244 ---- case psWeatherMessage::LIGHTNING: { + #ifdef WEATHER_DEBUG + printf("Lightning in sector '%s'\n",event->sector.GetData()); + #endif if (event->si->is_raining) { *************** *** 161,170 **** } ! QueueNextEvent(randomgen->Get(event->si->lightning_max_gap - event->si->lightning_min_gap) + event->si->lightning_min_gap, ! psWeatherMessage::LIGHTNING, ! 0, ! 0, ! event->si->name, ! event->si); } break; --- 252,265 ---- } ! if (event->si->rain_max_duration != 0 && ! event->si->lightning_max_gap != 0) ! { ! QueueNextEvent(randomgen->Get(event->si->lightning_max_gap - event->si->lightning_min_gap) + event->si->lightning_min_gap, ! psWeatherMessage::LIGHTNING, ! 0, ! 0, ! event->si->name, ! event->si); ! } } break; Index: weathermanager.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/weathermanager.h,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** weathermanager.h 4 Apr 2004 22:16:59 -0000 1.11 --- weathermanager.h 19 May 2005 18:57:28 -0000 1.12 *************** *** 46,49 **** --- 46,52 ---- int current_daynight; + csArray<psWeatherGameEvent*> ignored; // Used for overriding commands like /rain + csArray<psWeatherGameEvent*> events; // Ugly, but we need a copy of our events + public: WeatherManager(MsgHandler *msghand, *************** *** 62,65 **** --- 65,71 ---- void HandleWeatherEvent(psWeatherGameEvent *event); void SendClientCurrentTime(int cnum); + void UpdateClient(uint32_t cnum,psSectorInfo* si); + + void UpdateClient(uint32_t cnum); }; |