Pol  Revision:cb584c9
guilds.cpp
Go to the documentation of this file.
1 
2 #include "guilds.h"
3 
4 #include <stddef.h>
5 #include <string>
6 
7 #include "../clib/cfgelem.h"
8 #include "../clib/cfgfile.h"
9 #include "../clib/cfgsect.h"
10 #include "../clib/fileutil.h"
11 #include "../clib/streamsaver.h"
12 #include "../plib/systemstate.h"
13 #include "fnsearch.h"
14 #include "globals/uvars.h"
15 #include "mobile/charactr.h"
16 #include "ufunc.h"
17 #include "uobject.h"
18 
19 namespace Pol
20 {
21 namespace Core
22 {
23 SerialSet::SerialSet( Clib::ConfigElem& elem, const char* tag )
24 {
25  unsigned int tmp;
26  while ( elem.remove_prop( tag, &tmp ) )
27  {
28  insert( tmp );
29  }
30 }
31 
32 void SerialSet::writeOn( Clib::StreamWriter& os, const char* tag ) const
33 {
34  for ( const_iterator citr = begin(), citrend = end(); citr != citrend; ++citr )
35  {
36  os() << "\t" << tag << "\t0x" << fmt::hex( *citr ) << pf_endl;
37  }
38 }
39 
41  : _guildid( elem.remove_ushort( "GUILDID" ) ),
42  _member_serials( elem, "MEMBER" ),
43  _allyguild_serials( elem, "ALLYGUILD" ),
44  _enemyguild_serials( elem, "ENEMYGUILD" ),
45  _proplist( Core::CPropProfiler::Type::GUILD ),
46  _disbanded( false )
47 {
48  _proplist.readProperties( elem );
49 }
50 
51 Guild::Guild( unsigned int guildid )
52  : _guildid( guildid ),
56  _proplist( Core::CPropProfiler::Type::GUILD ),
57  _disbanded( false )
58 {
59  if ( _guildid >= Core::gamestate.nextguildid )
61 }
62 
64 {
65  for ( SerialSet::iterator itr = _member_serials.begin(); itr != _member_serials.end(); /* */ )
66  {
67  unsigned int mserial = ( *itr );
68  SerialSet::iterator last_itr = itr;
69  ++itr;
70 
71  Mobile::Character* chr = system_find_mobile( mserial );
72  if ( chr != nullptr )
73  {
74  chr->guild( this );
75  }
76  else
77  {
78  _member_serials.erase( last_itr );
79  }
80  }
81 }
82 
84 {
85  // FIXME : All of guilds.cpp iterator's need rewritten. Turley found a much better method
86  // used in the party system.
87  // NOTE: stlport seems to not return save itr on erase, but with a list container the iterator
88  // should stay valid
89  for ( SerialSet::iterator itr = _member_serials.begin(), end = _member_serials.end(); itr != end;
90  /* */ )
91  {
92  unsigned int mserial = ( *itr );
93  SerialSet::iterator last_itr = itr;
94  ++itr;
95 
97  if ( chr != nullptr )
98  {
99  if ( chr->client )
100  {
101  send_move( chr->client, chr );
104  }
105  }
106  else
107  {
108  _member_serials.erase( last_itr );
109  }
110  }
111 }
112 
114 {
115  if ( chr->client )
116  {
117  send_move( chr->client, chr );
120  }
121 }
122 
123 unsigned int Guild::guildid() const
124 {
125  return _guildid;
126 }
127 
128 bool Guild::disbanded() const
129 {
130  return _disbanded;
131 }
132 
134 {
135  _disbanded = true;
136 }
137 
138 bool Guild::hasMembers() const
139 {
140  return !_member_serials.empty();
141 }
142 
143 bool Guild::hasAllies() const
144 {
145  return !_allyguild_serials.empty();
146 }
147 bool Guild::hasAlly( const Guild* g2 ) const
148 {
149  return _allyguild_serials.count( g2->guildid() ) != 0;
150 }
151 
152 bool Guild::hasEnemies() const
153 {
154  return !_enemyguild_serials.empty();
155 }
156 bool Guild::hasEnemy( const Guild* g2 ) const
157 {
158  return _enemyguild_serials.count( g2->guildid() ) != 0;
159 }
160 
161 
163 {
164  sw() << "Guild" << pf_endl << "{" << pf_endl << "\tGuildId\t" << _guildid << pf_endl;
165  _member_serials.writeOn( sw, "Member" );
166  _allyguild_serials.writeOn( sw, "AllyGuild" );
167  _enemyguild_serials.writeOn( sw, "EnemyGuild" );
169  sw() << "}" << pf_endl << pf_endl;
170  // sw.flush();
171 }
172 
173 void Guild::addMember( unsigned int serial )
174 {
175  _member_serials.insert( serial );
176 }
177 
178 bool Guild::AreAllies( Guild* g1, Guild* g2 )
179 {
180  return ( g1 == g2 || g1->hasAlly( g2 ) );
181 }
182 bool Guild::AreEnemies( Guild* g1, Guild* g2 )
183 {
184  return g1->hasEnemy( g2 );
185 }
186 
188 {
189  for ( Guilds::iterator itr = Core::gamestate.guilds.begin(); itr != Core::gamestate.guilds.end();
190  ++itr )
191  {
192  Guild* guild = ( *itr ).second.get();
193  guild->registerWithMembers();
194  }
195 }
196 
198 {
199  std::string guildsfile = Plib::systemstate.config.world_data_path + "guilds.txt";
200 
201  if ( !Clib::FileExists( guildsfile ) )
202  return;
203 
204  Clib::ConfigFile cf( guildsfile );
205  Clib::ConfigSection sect_general( cf, "GENERAL", Clib::CST_UNIQUE );
206  Clib::ConfigSection sect_guild( cf, "GUILD", Clib::CST_NORMAL );
207  Clib::ConfigElem elem;
208  while ( cf.read( elem ) )
209  {
210  if ( sect_general.matches( elem ) )
211  {
212  Core::gamestate.nextguildid = elem.remove_ulong( "NEXTGUILDID", 1 );
213  }
214  else if ( sect_guild.matches( elem ) )
215  {
216  Guild* guild = new Guild( elem );
217  Core::gamestate.guilds[guild->guildid()].set( guild );
218  }
219  }
220 
221  register_guilds();
222 }
223 
225 {
226  sw() << "General" << pf_endl << "{" << pf_endl << "\tNextGuildId\t" << Core::gamestate.nextguildid
227  << pf_endl << "}" << pf_endl << pf_endl;
228 
229  for ( const auto& _guild : Core::gamestate.guilds )
230  {
231  const Guild* guild = _guild.second.get();
232  guild->printOn( sw );
233  }
234 }
235 
236 Guild* Guild::FindOrCreateGuild( unsigned int guildid, unsigned int memberserial )
237 {
238  Guilds::iterator itr = Core::gamestate.guilds.find( guildid );
239  Guild* guild = nullptr;
240  if ( itr != Core::gamestate.guilds.end() )
241  guild = ( *itr ).second.get();
242  else
243  {
244  guild = new Guild( guildid );
245  Core::gamestate.guilds[guildid].set( guild );
246  }
247 
248  // this is called from Character::readCommonProperties, which assigns
249  // chr->guild (so we don't do it here)
250  guild->addMember( memberserial );
251 
252  return guild;
253 }
255 {
256  Guilds::iterator itr = Core::gamestate.guilds.find( guildid );
257  Guild* guild = nullptr;
258 
259  if ( itr != Core::gamestate.guilds.end() )
260  guild = ( *itr ).second.get();
261 
262  return guild;
263 }
264 
265 size_t Guild::estimateSize() const
266 {
267  return sizeof( unsigned int ) /*_guildid*/
268  + 3 * sizeof( void* ) +
269  _member_serials.size() * ( sizeof( unsigned int ) + 3 * sizeof( void* ) ) +
270  3 * sizeof( void* ) +
271  _allyguild_serials.size() * ( sizeof( unsigned int ) + 3 * sizeof( void* ) ) +
272  3 * sizeof( void* ) +
273  _enemyguild_serials.size() * ( sizeof( unsigned int ) + 3 * sizeof( void* ) ) +
274  _proplist.estimatedSize() + sizeof( bool ); /*_disbanded*/
275 }
276 }
277 }
static Guild * FindGuild(unsigned int guildid)
Definition: guilds.cpp:254
void printProperties(Clib::StreamWriter &sw) const
Definition: proplist.cpp:429
bool _disbanded
Definition: guilds.h:71
Guild(Clib::ConfigElem &elem)
Definition: guilds.cpp:40
size_t estimateSize() const
Definition: guilds.cpp:265
SystemState systemstate
Definition: systemstate.cpp:12
Network::Client * client
Definition: charactr.h:871
Core::PolConfig config
Definition: systemstate.h:43
std::string world_data_path
Definition: polcfg.h:28
static bool AreAllies(Guild *g1, Guild *g2)
Definition: guilds.cpp:178
unsigned int _guildid
Definition: guilds.h:66
static bool AreEnemies(Guild *g1, Guild *g2)
Definition: guilds.cpp:182
void addMember(unsigned int serial)
Definition: guilds.cpp:173
unsigned int remove_ulong(const char *propname)
Definition: cfgfile.cpp:461
unsigned int guildid() const
Definition: guilds.cpp:123
size_t estimatedSize() const
Definition: proplist.cpp:362
void writeOn(Clib::StreamWriter &sw, const char *tag) const
Definition: guilds.cpp:32
void read_guilds_dat()
Definition: guilds.cpp:197
SerialSet _member_serials
Definition: guilds.h:67
bool matches(const ConfigElem &elem)
Definition: cfgsect.cpp:32
void register_guilds()
Definition: guilds.cpp:187
unsigned int nextguildid
Definition: uvars.h:160
void registerWithMembers()
Definition: guilds.cpp:63
bool hasEnemies() const
Definition: guilds.cpp:152
bool disbanded() const
Definition: guilds.cpp:128
PropertyList _proplist
Definition: guilds.h:70
void send_move(Client *client, const Character *chr)
Definition: ufunc.cpp:174
const unsigned CST_NORMAL
Definition: cfgsect.h:19
SerialSet _allyguild_serials
Definition: guilds.h:68
bool hasAllies() const
Definition: guilds.cpp:143
const unsigned CST_UNIQUE
Definition: cfgsect.h:21
void readProperties(Clib::ConfigElem &elem)
Definition: proplist.cpp:464
GameState gamestate
Definition: uvars.cpp:74
Mobile::Character * system_find_mobile(u32 serial)
Definition: fnsearch.cpp:32
void update_online_members()
Definition: guilds.cpp:83
bool remove_prop(const char *propname, std::string *value)
Definition: cfgfile.cpp:128
static Guild * FindOrCreateGuild(unsigned int guildid, unsigned int memberserial)
Definition: guilds.cpp:236
bool hasMembers() const
Definition: guilds.cpp:138
void disband()
Definition: guilds.cpp:133
static void update_online_members_remove(Mobile::Character *chr)
Definition: guilds.cpp:113
SerialSet _enemyguild_serials
Definition: guilds.h:69
void write_guilds(Clib::StreamWriter &sw)
Definition: guilds.cpp:224
bool hasEnemy(const Guild *g2) const
Definition: guilds.cpp:156
bool hasAlly(const Guild *g2) const
Definition: guilds.cpp:147
bool FileExists(const char *filename)
Definition: fileutil.cpp:118
void printOn(Clib::StreamWriter &sw) const
Definition: guilds.cpp:162
void send_remove_character_to_nearby_cansee(const Character *chr)
Definition: ufunc.cpp:400
bool read(ConfigElem &elem)
Definition: cfgfile.cpp:1015
#define pf_endl
Definition: proplist.cpp:25
void send_create_mobile_to_nearby_cansee(const Character *chr)
Definition: ufunc.cpp:1895
Definition: berror.cpp:12