20 unsigned short ZoneInfo::next_zonenum = 0;
33 Systems.insert( sysname, system );
38 return Systems.get( name );
50 cout<<
"\'"<<callsign<<
"\' (dead)"<<endl;
60 if ( !callsign.empty() && (!fg || callsign != fg->
name) )
61 cout<<
", callsign \'"<<callsign<<
"\'";
72 string savestr, xmlstr;
75 std::set< ObjSerial >activeObjects;
78 COUT<<
"\t>>> WARNING: Did not send info about "<<nbclients<<
" other ships because of empty (inconsistent?) zone"<<endl;
81 for (k = lst->begin(); k != lst->end(); k++) {
86 Unit *un = kp->game_unit.GetUnit();
87 if (un->
hull < 0 || !un)
114 if ( activeObjects.find( ser ) == activeObjects.end() ) {
122 COUT<<
"\t>>> GOT INFO ABOUT "<<nbclients<<
" OTHER SHIPS"<<endl;
129 string sysfile = starsys+
".system";
131 cerr<<
"--== STAR SYSTEM "<<starsys<<
" ALREADY EXISTS ==--"<<endl;
137 COUT<<
"--== STAR SYSTEM NOT FOUND - GENERATING ==--"<<endl;
141 string starsysfile = starsys+
".system";
147 bool newSystem =
true;
155 printf(
"newSystem is somehow true!!!" );
168 unsigned short zone = ZoneInfo::next_zonenum;
169 zones.insert( ZoneMap::value_type( zone,
ZoneInfo( sts ) ) );
184 ZoneMap::iterator iter =
zones.find( serial );
185 if ( iter ==
zones.end() )
188 return &( (*iter).second );
196 return &zi->zone_list;
253 if (!zi)
return NULL;
273 sts = this->
addZone( starsys );
278 COUT<<
">> ADDING CLIENT IN ZONE # "<<num_zone<<endl;
284 lst->push_back( cltw );
287 cerr<<zi->zone_clients<<
" clients now in zone "<<num_zone<<endl;
290 Unit *addun = clt->game_unit.GetUnit();
297 cerr<<
"dead client attempted to be added to system: refusing\n";
312 Unit *un = clt->game_unit.GetUnit();
319 for (ZoneMap::iterator iter =
zones.begin(); iter !=
zones.end(); ++iter) {
321 ClientList *lst = &( (*iter).second.zone_list );
322 for (ClientList::iterator
q = lst->begin();
q != lst->end();) {
325 if ( ( !(cwp < ocwp) ) && !(ocwp < cwp) ) {
327 zonenum = (*iter).first;
339 cerr<<
"Client "<<clt->callsign<<
" not found in any zone when attempting to remove it"<<endl;
346 cerr<<zi->zone_clients<<
" clients left in zone "<<zonenum<<endl;
349 sts = zi->star_system;
351 un->
Kill(
true,
true );
371 Unit *un = fromclt->game_unit.GetUnit();
373 cerr<<
"Trying to broadcast information with dead client unit"<<pckt->
getCommand()<<endl;
379 cerr<<
"Trying to send update to nonexistant zone "<<zonenum<<pckt->
getCommand()<<endl;
382 for (
LI i = lst->begin();
i != lst->end();
i++) {
384 Unit *un2 = clt->game_unit.GetUnit();
386 if ( (isTcp || clt->ingame) && clt->netversion >= minver && clt->netversion <= maxver
396 pckt->
bc_send( clt->cltadr, clt->tcp_sock );
398 pckt->
bc_send( clt->cltudpadr, *clt->lossy_socket );
413 if (lst == NULL)
return;
414 for (
LI i = lst->begin();
i != lst->end();
i++) {
418 if ( (isTcp || clt->ingame) && clt->netversion >= minver && clt->netversion <= maxver
422 pckt->
bc_send( clt->cltadr, clt->tcp_sock );
424 pckt->
bc_send( clt->cltudpadr, *clt->lossy_socket );
433 if (lst == NULL)
return;
434 for (
LI i = lst->begin();
i != lst->end();
i++) {
436 Unit *broadcastTo = clt->game_unit.GetUnit();
438 if ( (isTcp || clt->ingame) && ( (!broadcastTo) || broadcastTo->
GetSerial() != serial ) ) {
440 pckt->
bc_send( clt->cltadr, clt->tcp_sock );
442 pckt->
bc_send( clt->cltudpadr, *clt->lossy_socket );
459 if (lst == NULL)
return;
460 for (
LI i = lst->begin();
i != lst->end();
i++) {
462 un = clt->game_unit.GetUnit();
466 if ( clt->ingame && clt->comm_freq != -1 && clt->portaudio && clt->comm_freq == frequency
467 && ( (!un) || (un->
GetSerial() != serial) ) )
468 pckt->
bc_send( clt->cltadr, clt->tcp_sock );
484 if (lst == NULL)
return;
485 for (
LI i = lst->begin();
i != lst->end();
i++) {
487 un = clt->game_unit.GetUnit();
491 if ( clt->ingame && clt->comm_freq != -1 && ( (!un) || (un->
GetSerial() != serial) ) )
492 pckt->
bc_send( clt->cltadr, clt->tcp_sock );
513 for (ZoneMap::iterator iter =
zones.begin(); iter !=
zones.end(); ++iter) {
520 for (k = zi->zone_list.begin(); k != zi->zone_list.end(); ++k) {
530 cltk->versionBuf( netbuf );
540 netbuf.
addFloat( cltk->getDeltatime() );
543 for (; (unit = *iter) != NULL; ++iter) {
544 if ( netbuf.
getOffset() > (504-108) && (&cltk->tcp_sock != cltk->lossy_socket) )
548 if ( unit->
GetSerial() != 0 && unit != cltk->game_unit.GetUnit() ) {
562 bool added =
addPosition( cltk, netbuf, unit, cs );
579 if ( ( unit = cltk->game_unit.GetUnit() ) != NULL ) {
584 if ( !unit->
InRange( targ,
false ) )
593 for (
un_iter iter = ( zi->star_system->
getUnitList() ).createIterator(); (unit = *iter) != NULL; ++iter) {
598 for (k = zi->zone_list.begin(); k != zi->zone_list.end(); k++) {
602 cltk->versionBuf( netbuf );
603 netbuf.
addFloat( cltk->getDeltatime() );
621 Unit *parent = clt->game_unit.GetUnit();
623 if (un == parent)
return true;
625 if ( !parent->
InRange( un, mm,
false,
false,
true ) ) {
626 static double always_send_range =
632 if (dist.Dot( dist ) >= always_send_range*always_send_range)
639 }
else {
return false; }
return true;
643 bool dodamage =
false;
659 if (client->netversion > 4960)
692 if ( (i++)%8192 == 0 )
693 COUT<<
"PosUpdate not sent (too far away) "<<un->
name<<
" #"<<un->
GetSerial()<<endl;
697 COUT<<
"Client counted but not sent because of distance!"<<endl;
701 COUT<<
"Client counted but not sent because of position/orientation test!"<<endl;
722 for (ZoneMap::iterator iter =
zones.begin(); iter !=
zones.end(); ++iter) {
735 for (k = zi->zone_list.begin(); k != zi->zone_list.end(); k++) {
739 cp->versionBuf( netbuf );
743 for (
un_iter iter = ( zi->star_system->
getUnitList() ).createIterator(); (unit = *iter) != NULL; ++iter)
766 for (
un_iter iter = ( zi->star_system->
getUnitList() ).createIterator(); (unit = *iter) != NULL; ++iter) {
782 unsigned short damages = un->
damages;
784 damages &= (~
Unit::MOUNT_DAMAGED);
787 damages &= (~
Unit::COMPUTER_DAMAGED);
797 if (damages&Unit::COMPUTER_DAMAGED) {
807 for (it = 0; it <
c; it++)
813 for (it = 0; it < un->
mounts.size(); it++) {
844 if (damages&Unit::LIMITS_DAMAGED) {
872 src_tar = tar_pos-src_pos;
880 cout<<star_system->
getFileName()<<
"(zone "<<zonenum<<
")"<<endl;
881 for (ClientList::iterator ci = zone_list.begin(); ci != zone_list.end(); ++ci) {
882 Client *clt = (*ci).get();
889 while (
Unit*un = *iter) {
890 char name[15] =
" NPC ";
894 sprintf( name,
"*Plr% 3d ", cp );
903 cout<<
"----- Active Systems:"<<endl;
904 for (ZoneMap::iterator iter =
zones.begin(); iter !=
zones.end(); ++iter) {
914 sprintf( name,
"*Plr% 3d ",
i );
929 cout<<
"\tStar system stats"<<endl;
930 cout<<
"\t-----------------"<<endl;
931 for (ZoneMap::const_iterator iter =
zones.begin(); iter !=
zones.end(); ++iter) {
932 const ZoneInfo *zi = &( (*iter).second );
933 cout<<
"\t\tStar system "<<(zi->zonenum)<<
" = "<<zi->star_system->
getName()<<endl;
934 cout<<
"\t\t\tNumber of clients :\t"<<zi->zone_clients<<endl;
973 std::string ZoneMgr::Systems::insert( std::string sysname, std::string system )
975 if (sysname !=
"" && system !=
"")
980 std::string ZoneMgr::Systems::get( std::string sysname )
983 if ( it == _map.end() )
return string(
"" );
987 bool ZoneMgr::Systems::remove( std::string sysname )
989 size_t s = _map.erase( sysname );
990 if (s == 0)
return false;