• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

polserver / polserver / 21066490217

16 Jan 2026 12:22PM UTC coverage: 60.507%. Remained the same
21066490217

push

github

web-flow
misc clang-tidy (#853)

* trigger tidy

* Automated clang-tidy change: modernize-use-equals-delete,modernize-make-shared,modernize-make-unique,modernize-use-constraints,readability-container-size-empty,modernize-redundant-void-arg,modernize-use-emplace

* removed non needed macros

* missed to disable tidy build

---------

Co-authored-by: Clang Tidy <clang-tidy@users.noreply.github.com>

174 of 248 new or added lines in 74 files covered. (70.16%)

2 existing lines in 2 files now uncovered.

44459 of 73477 relevant lines covered (60.51%)

515895.79 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

47.98
/pol-core/pol/module/guildmod.cpp
1
/** @file
2
 *
3
 * @par History
4
 * - 2005/11/26 Shinigami: changed "strcmp" into "stricmp" to suppress Script Errors
5
 * - 2006/09/27 Shinigami: GCC 3.4.x fix - added "template<>" to TmplExecutorModule
6
 * - 2007/06/17 Shinigami: added config.world_data_path
7
 * - 2009/12/21 Turley:    ._method() call fix
8
 */
9

10

11
#include "guildmod.h"
12
#include <stddef.h>
13

14
#include "../../bscript/berror.h"
15
#include "../../bscript/executor.h"
16
#include "../../bscript/objmembers.h"
17
#include "../../bscript/objmethods.h"
18
#include "../../clib/rawtypes.h"
19
#include "../../clib/stlutil.h"
20
#include "../fnsearch.h"
21
#include "../globals/uvars.h"
22
#include "../guilds.h"
23
#include "../guildscrobj.h"
24
#include "../mobile/charactr.h"
25
#include "../polobject.h"
26
#include "../uoexec.h"
27
#include "../uoscrobj.h"
28
#include <module_defs/guilds.h>
29

30
#include <memory>
31

32
namespace Pol
33
{
34
namespace Module
35
{
36
using namespace Bscript;
37
using UOExecutor = Core::UOExecutor;
38
/// Guild Object
39
///  Properties:
40
///   guild.guildid : integer
41
///   guild.members : array of offline mobilerefs
42
///   guild.allyguilds  : array of allied guilds
43
///   guild.enemyguilds : array of enemy guilds
44
///
45
///  Methods:
46
///   guild.ismember( who )
47
///   guild.isallyguild( guild )
48
///   guild.isenemyguild(guild)
49
///
50
///   guild.addmember( who )
51
///   guild.addallyguild( guild )
52
///   guild.addenemyguild( guild )
53
///
54
///   guild.removemember( who )
55
///   guild.removeallyguild( guild )
56
///   guild.removeenemyguild( guild )
57
///
58
///   guild.getprop( propname )
59
///   guild.setprop( propname, propvalue )
60
///   guild.eraseprop( propname )
61
///
62

63
BObjectImp* GuildExecutorModule::CreateGuildRefObjImp( Core::Guild* guild )
×
64
{
65
  return new EGuildRefObjImp( ref_ptr<Core::Guild>( guild ) );
×
66
}
67

68
bool getGuildParam( Executor& exec, unsigned param, Core::Guild*& guild, BError*& err )
2✔
69
{
70
  BApplicObjBase* aob = nullptr;
2✔
71
  if ( exec.hasParams( param + 1 ) )
2✔
72
    aob = exec.getApplicObjParam( param, &guild_type );
2✔
73

74
  if ( aob == nullptr )
2✔
75
  {
76
    err = new BError( "Invalid parameter type" );
×
77
    return false;
×
78
  }
79

80
  EGuildRefObjImp* gr = static_cast<EGuildRefObjImp*>( aob );
2✔
81
  guild = gr->value().get();
2✔
82
  if ( guild->disbanded() )
2✔
83
  {
84
    err = new BError( "Guild has disbanded" );
×
85
    return false;
×
86
  }
87
  return true;
2✔
88
}
89

90
BObjectRef EGuildRefObjImp::get_member_id( const int id )  // id test
3✔
91
{
92
  if ( obj_->_disbanded )
3✔
93
    return BObjectRef( new BError( "Guild has disbanded" ) );
×
94

95
  switch ( id )
3✔
96
  {
97
  case MBR_MEMBERS:
1✔
98
  {
99
    std::unique_ptr<ObjArray> arr;
1✔
100
    arr = std::make_unique<ObjArray>();
1✔
101
    for ( Core::SerialSet::iterator itr = obj_->_member_serials.begin();
1✔
102
          itr != obj_->_member_serials.end();
3✔
103
          /* do this earlier */ )
104
    {
105
      unsigned int mserial = ( *itr );
2✔
106
      Core::SerialSet::iterator last_itr = itr;
2✔
107
      ++itr;
2✔
108

109
      Mobile::Character* chr = Core::system_find_mobile( mserial );
2✔
110
      if ( chr != nullptr )
2✔
111
      {
112
        arr->addElement( new EOfflineCharacterRefObjImp( chr ) );
2✔
113
      }
114
      else
115
      {
116
        obj_->_member_serials.erase( last_itr );
×
117
      }
118
    }
119
    return BObjectRef( arr.release() );
1✔
120
  }
1✔
121

122
  case MBR_ALLYGUILDS:
1✔
123
  {
124
    std::unique_ptr<ObjArray> arr;
1✔
125
    arr = std::make_unique<ObjArray>();
1✔
126
    for ( Core::SerialSet::iterator itr = obj_->_allyguild_serials.begin();
1✔
127
          itr != obj_->_allyguild_serials.end();
2✔
128
          /* do this earlier */ )
129
    {
130
      unsigned int gserial = ( *itr );
1✔
131
      Core::SerialSet::iterator last_itr = itr;
1✔
132
      ++itr;
1✔
133

134
      Core::Guild* guild = Core::Guild::FindGuild( gserial );
1✔
135

136
      if ( guild != nullptr )
1✔
137
      {
138
        arr->addElement( new EGuildRefObjImp( ref_ptr<Core::Guild>( guild ) ) );
1✔
139
      }
140
      else
141
      {
142
        obj_->_allyguild_serials.erase( last_itr );
×
143
      }
144
    }
145
    return BObjectRef( arr.release() );
1✔
146
  }
1✔
147

148
  case MBR_ENEMYGUILDS:
1✔
149
  {
150
    std::unique_ptr<ObjArray> arr;
1✔
151
    arr = std::make_unique<ObjArray>();
1✔
152
    for ( Core::SerialSet::iterator itr = obj_->_enemyguild_serials.begin();
1✔
153
          itr != obj_->_enemyguild_serials.end();
2✔
154
          /* do this earlier */ )
155
    {
156
      unsigned int gserial = ( *itr );
1✔
157
      Core::SerialSet::iterator last_itr = itr;
1✔
158
      ++itr;
1✔
159

160
      Core::Guild* guild = Core::Guild::FindGuild( gserial );
1✔
161

162
      if ( guild != nullptr )
1✔
163
      {
164
        arr->addElement( new EGuildRefObjImp( ref_ptr<Core::Guild>( guild ) ) );
1✔
165
      }
166
      else
167
      {
168
        obj_->_enemyguild_serials.erase( last_itr );
×
169
      }
170
    }
171
    return BObjectRef( arr.release() );
1✔
172
  }
1✔
173

174
  case MBR_GUILDID:
×
175
    return BObjectRef( new BLong( obj_->_guildid ) );
×
176
  default:
×
177
    return BObjectRef( UninitObject::create() );
×
178
  }
179
}
180
BObjectRef EGuildRefObjImp::get_member( const char* membername )
×
181
{
182
  if ( obj_->_disbanded )
×
183
    return BObjectRef( new BError( "Guild has disbanded" ) );
×
184

185
  ObjMember* objmember = getKnownObjMember( membername );
×
186
  if ( objmember != nullptr )
×
187
    return this->get_member_id( objmember->id );
×
188
  else
189
    return BObjectRef( UninitObject::create() );
×
190
}
191

192
BObjectImp* EGuildRefObjImp::call_polmethod_id( const int id, UOExecutor& ex, bool forcebuiltin )
14✔
193
{
194
  if ( obj_->_disbanded )
14✔
195
    return new BError( "Guild has disbanded" );
×
196
  ObjMethod* mth = getObjMethod( id );
14✔
197
  if ( mth->overridden && !forcebuiltin )
14✔
198
  {
199
    auto* result = Core::gamestate.system_hooks.call_script_method( mth->code, &ex, this );
×
200
    if ( result )
×
201
      return result;
×
202
  }
203

204
  switch ( id )
14✔
205
  {
206
  case MTH_ISMEMBER:
2✔
207
  {
208
    if ( !ex.hasParams( 1 ) )
2✔
209
      return new BError( "Not enough parameters" );
×
210
    Mobile::Character* chr;
211
    if ( !ex.getCharacterParam( 0, chr ) )
2✔
212
      return new BError( "Invalid parameter type" );
×
213

214
    return new BLong( static_cast<int>( obj_->_member_serials.count( chr->serial ) ) );
2✔
215
  }
216

217
  case MTH_ISALLYGUILD:
×
218
  {
219
    if ( !ex.hasParams( 1 ) )
×
220
      return new BError( "Not enough parameters" );
×
221
    Core::Guild* allyguild;
222
    BError* err;
223
    if ( getGuildParam( ex, 0, allyguild, err ) )
×
224
      return new BLong(
225
          static_cast<int>( obj_->_allyguild_serials.count( allyguild->guildid() ) ) );
×
226
    else
227
      return err;
×
228
  }
229

230
  case MTH_ISENEMYGUILD:
×
231
  {
232
    if ( !ex.hasParams( 1 ) )
×
233
      return new BError( "Not enough parameters" );
×
234
    Core::Guild* enemyguild;
235
    BError* err;
236
    if ( getGuildParam( ex, 0, enemyguild, err ) )
×
237
      return new BLong(
238
          static_cast<int>( obj_->_enemyguild_serials.count( enemyguild->guildid() ) ) );
×
239
    else
240
      return err;
×
241
  }
242

243
  case MTH_ADDMEMBER:
2✔
244
  {
245
    if ( !ex.hasParams( 1 ) )
2✔
246
      return new BError( "Not enough parameters" );
×
247
    Mobile::Character* chr;
248
    if ( !ex.getCharacterParam( 0, chr ) )
2✔
249
      return new BError( "Invalid parameter type" );
×
250
    if ( chr->guildid() )
2✔
251
      return new BError( "Character already belongs to a guild" );
×
252

253
    chr->guild( obj_.get() );
2✔
254
    obj_->_member_serials.insert( chr->serial );
2✔
255

256
    // MuadDib Added to update online members when status changes.
257
    obj_->update_online_members();
2✔
258

259
    return new BLong( 1 );
2✔
260
  }
261

262
  case MTH_ADDALLYGUILD:
1✔
263
  {
264
    if ( !ex.hasParams( 1 ) )
1✔
265
      return new BError( "Not enough parameters" );
×
266
    Core::Guild* allyguild;
267
    BError* err;
268
    if ( getGuildParam( ex, 0, allyguild, err ) )
1✔
269
    {
270
      if ( obj_->_enemyguild_serials.count( allyguild->guildid() ) )
1✔
271
        return new BError( "That is an enemy guild" );
×
272
      if ( allyguild->guildid() == obj_->guildid() )
1✔
273
        return new BError( "Passed self as new ally guild" );
×
274

275
      obj_->_allyguild_serials.insert( allyguild->guildid() );
1✔
276
      allyguild->_allyguild_serials.insert( obj_->_guildid );
1✔
277

278
      // MuadDib Added to update online members when status changes.
279
      obj_->update_online_members();
1✔
280
      allyguild->update_online_members();
1✔
281

282
      return new BLong( 1 );
1✔
283
    }
284
    else
285
      return err;
×
286
  }
287

288
  case MTH_ADDENEMYGUILD:
1✔
289
  {
290
    if ( !ex.hasParams( 1 ) )
1✔
291
      return new BError( "Not enough parameters" );
×
292
    Core::Guild* enemyguild;
293
    BError* err;
294
    if ( getGuildParam( ex, 0, enemyguild, err ) )
1✔
295
    {
296
      if ( obj_->_allyguild_serials.count( enemyguild->guildid() ) )
1✔
297
        return new BError( "That is an ally guild" );
×
298
      if ( enemyguild->guildid() == obj_->guildid() )
1✔
299
        return new BError( "Passed self as new enemy guild" );
×
300

301
      obj_->_enemyguild_serials.insert( enemyguild->guildid() );
1✔
302
      enemyguild->_enemyguild_serials.insert( obj_->_guildid );
1✔
303

304
      // MuadDib Added to update online members when status changes.
305
      obj_->update_online_members();
1✔
306
      enemyguild->update_online_members();
1✔
307

308
      return new BLong( 1 );
1✔
309
    }
310
    else
311
      return err;
×
312
  }
313

314
  case MTH_REMOVEMEMBER:
×
315
  {
316
    if ( !ex.hasParams( 1 ) )
×
317
      return new BError( "Not enough parameters" );
×
318
    Mobile::Character* chr;
319
    if ( !ex.getCharacterParam( 0, chr ) )
×
320
      return new BError( "Invalid parameter type" );
×
321
    if ( chr->guildid() != obj_->_guildid )
×
322
      return new BError( "Character does not belong to this guild" );
×
323

324
    chr->guild( nullptr );
×
325
    obj_->_member_serials.erase( chr->serial );
×
326

327
    // MuadDib Added to update online members when status changes.
328
    obj_->update_online_members_remove( chr );
×
329

330
    return new BLong( 1 );
×
331
  }
332

333
  case MTH_REMOVEALLYGUILD:
×
334
  {
335
    if ( !ex.hasParams( 1 ) )
×
336
      return new BError( "Not enough parameters" );
×
337
    Core::Guild* allyguild;
338
    BError* err;
339
    if ( getGuildParam( ex, 0, allyguild, err ) )
×
340
    {
341
      if ( !obj_->_allyguild_serials.count( allyguild->guildid() ) )
×
342
        return new BError( "That is not an ally guild" );
×
343

344
      obj_->_allyguild_serials.erase( allyguild->guildid() );
×
345
      allyguild->_allyguild_serials.erase( obj_->_guildid );
×
346

347
      // MuadDib Added to update online members when status changes.
348
      obj_->update_online_members();
×
349
      allyguild->update_online_members();
×
350

351
      return new BLong( 1 );
×
352
    }
353
    else
354
      return err;
×
355
  }
356

357
  case MTH_REMOVEENEMYGUILD:
×
358
  {
359
    if ( !ex.hasParams( 1 ) )
×
360
      return new BError( "Not enough parameters" );
×
361
    Core::Guild* enemyguild;
362
    BError* err;
363
    if ( getGuildParam( ex, 0, enemyguild, err ) )
×
364
    {
365
      if ( !obj_->_enemyguild_serials.count( enemyguild->guildid() ) )
×
366
        return new BError( "That is not an enemy guild" );
×
367

368
      obj_->_enemyguild_serials.erase( enemyguild->guildid() );
×
369
      enemyguild->_enemyguild_serials.erase( obj_->_guildid );
×
370

371
      // MuadDib Added to update online members when status changes.
372
      obj_->update_online_members();
×
373
      enemyguild->update_online_members();
×
374

375
      return new BLong( 1 );
×
376
    }
377
    else
378
      return err;
×
379
  }
380
  default:
8✔
381
  {
382
    bool changed = false;
8✔
383
    return CallPropertyListMethod_id( obj_->_proplist, id, ex, changed );
8✔
384
  }
385
  }
386
}
387

388
BObjectImp* EGuildRefObjImp::call_polmethod( const char* methodname, UOExecutor& ex )
×
389
{
390
  if ( obj_->_disbanded )
×
391
    return new BError( "Guild has disbanded" );
×
NEW
392
  bool forcebuiltin{ Executor::builtinMethodForced( methodname ) };
×
393
  Bscript::ObjMethod* objmethod = Bscript::getKnownObjMethod( methodname );
×
394
  if ( objmethod != nullptr )
×
395
    return call_polmethod_id( objmethod->id, ex, forcebuiltin );
×
396
  auto* res = Core::gamestate.system_hooks.call_script_method( methodname, &ex, this );
×
397
  if ( res )
×
398
    return res;
×
399

400
  bool changed = false;
×
401
  return CallPropertyListMethod( obj_->_proplist, methodname, ex, changed );
×
402
}
403

404

405
GuildExecutorModule::GuildExecutorModule( Bscript::Executor& exec )
371✔
406
    : TmplExecutorModule<GuildExecutorModule, Core::PolModule>( exec )
371✔
407
{
408
}
371✔
409

410
///  ListGuilds returns an array of Guild objects
411
BObjectImp* GuildExecutorModule::mf_ListGuilds()
1✔
412
{
413
  std::unique_ptr<ObjArray> result( new ObjArray );
1✔
414
  for ( Core::Guilds::iterator itr = Core::gamestate.guilds.begin(),
2✔
415
                               end = Core::gamestate.guilds.end();
1✔
416
        itr != end; ++itr )
4✔
417
  {
418
    Core::Guild* guild = ( *itr ).second.get();
3✔
419
    result->addElement( new EGuildRefObjImp( Core::GuildRef( guild ) ) );
3✔
420
  }
421
  return result.release();
2✔
422
}
1✔
423

424
///  CreateGuild returns a new Guild object
425
BObjectImp* GuildExecutorModule::mf_CreateGuild()
3✔
426
{
427
  Core::Guild* guild = new Core::Guild( Core::gamestate.nextguildid++ );
3✔
428

429
  Core::gamestate.guilds[guild->guildid()].set( guild );
3✔
430

431
  return new EGuildRefObjImp( ref_ptr<Core::Guild>( guild ) );
3✔
432
}
433

434
BObjectImp* GuildExecutorModule::mf_DestroyGuild()
×
435
{
436
  Core::Guild* guild;
437
  BError* err;
438
  if ( getGuildParam( exec, 0, guild, err ) )
×
439
  {
440
    if ( guild->hasMembers() )
×
441
      return new BError( "Guild has members" );
×
442
    if ( guild->hasAllies() )
×
443
      return new BError( "Guild has allies" );
×
444
    if ( guild->hasEnemies() )
×
445
      return new BError( "Guild has enemies" );
×
446

447
    guild->disband();
×
448
    Core::gamestate.guilds.erase( guild->guildid() );
×
449
    return new BLong( 1 );
×
450
  }
451
  else
452
  {
453
    return err;
×
454
  }
455
}
456

457
///  FindGuild( guildid );
458
BObjectImp* GuildExecutorModule::mf_FindGuild()
×
459
{
460
  int guildid;
461
  if ( getParam( 0, guildid ) )
×
462
  {
463
    Core::Guilds::iterator itr = Core::gamestate.guilds.find( guildid );
×
464
    if ( itr != Core::gamestate.guilds.end() )
×
465
      return new EGuildRefObjImp( ref_ptr<Core::Guild>( ( *itr ).second.get() ) );
×
466
    else
467
      return new BError( "Guild not found" );
×
468
  }
469
  else
470
  {
471
    return new BError( "Invalid parameter type" );
×
472
  }
473
}
474
}  // namespace Module
475
}  // namespace Pol
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc