clan.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. // Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
  2. // For more information, see LICENCE in the main folder
  3. #include "clan.hpp"
  4. #include <string.h> //memset
  5. #include "../common/cbasetypes.hpp"
  6. #include "../common/malloc.hpp"
  7. #include "../common/mmo.hpp"
  8. #include "../common/nullpo.hpp"
  9. #include "../common/showmsg.hpp"
  10. #include "clif.hpp"
  11. #include "instance.hpp"
  12. #include "intif.hpp"
  13. #include "log.hpp"
  14. #include "pc.hpp"
  15. #include "script.hpp"
  16. #include "status.hpp"
  17. static DBMap* clan_db; // int clan_id -> struct clan*
  18. void do_init_clan(){
  19. clan_db = idb_alloc(DB_OPT_RELEASE_DATA);
  20. }
  21. void do_final_clan(){
  22. db_destroy(clan_db);
  23. }
  24. void clan_load_clandata( int count, struct clan* clans ){
  25. int i,j;
  26. nullpo_retv( clans );
  27. for( i = 0, j = 0; i < count; i++, clans++ ){
  28. struct clan* clan = clans;
  29. struct clan* clanCopy;
  30. clanCopy = (struct clan*)aMalloc( sizeof( struct clan ) );
  31. if( clanCopy == NULL ){
  32. ShowError("Memory could not be allocated for a clan.\n");
  33. break;
  34. }
  35. memcpy( clanCopy, clan, sizeof( struct clan ) );
  36. memset( clanCopy->members, 0, sizeof( clanCopy->members ) );
  37. idb_put( clan_db, clanCopy->id, clanCopy );
  38. j++;
  39. }
  40. ShowStatus( "Received '" CL_WHITE "%d" CL_RESET "' clans from char-server.\n", j );
  41. }
  42. struct clan* clan_search( int id ){
  43. return (struct clan*)idb_get(clan_db,id);
  44. }
  45. struct clan* clan_searchname( const char* name ){
  46. struct clan* c;
  47. DBIterator *iter = db_iterator(clan_db);
  48. for( c = (struct clan*)dbi_first(iter); dbi_exists(iter); c = (struct clan*)dbi_next(iter) ){
  49. if( strncmpi( c->name, name, NAME_LENGTH ) == 0 ){
  50. break;
  51. }
  52. }
  53. dbi_destroy(iter);
  54. return c;
  55. }
  56. struct map_session_data* clan_getavailablesd( struct clan* clan ){
  57. int i;
  58. nullpo_retr(NULL, clan);
  59. ARR_FIND( 0, clan->max_member, i, clan->members[i] != NULL );
  60. return ( i < clan->max_member ) ? clan->members[i] : NULL;
  61. }
  62. int clan_getMemberIndex( struct clan* clan, uint32 account_id ){
  63. int i;
  64. nullpo_retr(-1,clan);
  65. ARR_FIND( 0, clan->max_member, i, clan->members[i] != NULL && clan->members[i]->status.account_id == account_id );
  66. if( i == clan->max_member ){
  67. return -1;
  68. }else{
  69. return i;
  70. }
  71. }
  72. int clan_getNextFreeMemberIndex( struct clan* clan ){
  73. int i;
  74. nullpo_retr(-1,clan);
  75. ARR_FIND( 0, clan->max_member, i, clan->members[i] == NULL );
  76. if( i == clan->max_member ){
  77. return -1;
  78. }else{
  79. return i;
  80. }
  81. }
  82. void clan_member_joined( struct map_session_data* sd ){
  83. struct clan* clan;
  84. int index;
  85. nullpo_retv(sd);
  86. clan = clan_search(sd->status.clan_id);
  87. nullpo_retv(clan);
  88. if( ( index = clan_getNextFreeMemberIndex(clan) ) >= 0 ){
  89. sd->clan = clan;
  90. clan->members[index] = sd;
  91. clan->connect_member++;
  92. clif_clan_basicinfo(sd);
  93. intif_clan_member_joined(clan->id);
  94. clif_clan_onlinecount(clan);
  95. if (clan->instance_id > 0)
  96. instance_reqinfo(sd, clan->instance_id);
  97. }
  98. }
  99. void clan_member_left( struct map_session_data* sd ){
  100. int index;
  101. struct clan* clan;
  102. nullpo_retv(sd);
  103. nullpo_retv(clan = sd->clan);
  104. if( ( index = clan_getMemberIndex(clan,sd->status.account_id) ) >= 0 ){
  105. clan->members[index] = NULL;
  106. clan->connect_member--;
  107. intif_clan_member_left(clan->id);
  108. clif_clan_onlinecount(clan);
  109. }
  110. }
  111. bool clan_member_join( struct map_session_data *sd, int clan_id, uint32 account_id, uint32 char_id ){
  112. struct clan *clan;
  113. nullpo_ret(sd);
  114. if( ( clan = clan_search( clan_id ) ) == NULL ){
  115. return false;
  116. }
  117. if( sd->status.account_id != account_id || sd->status.char_id != char_id || sd->status.clan_id != 0 ){
  118. return false;
  119. }
  120. sd->status.clan_id = clan->id;
  121. clan_member_joined(sd);
  122. return true;
  123. }
  124. bool clan_member_leave( struct map_session_data* sd, int clan_id, uint32 account_id, uint32 char_id ){
  125. struct clan *clan;
  126. nullpo_ret(sd);
  127. if( sd->status.account_id != account_id || sd->status.char_id != char_id || sd->status.clan_id != clan_id || ( clan = sd->clan ) == NULL ){
  128. return false;
  129. }
  130. clan_member_left(sd);
  131. sd->clan = NULL;
  132. sd->status.clan_id = 0;
  133. clif_clan_leave(sd);
  134. return true;
  135. }
  136. void clan_recv_message(int clan_id,uint32 account_id,const char *mes,int len) {
  137. struct clan *clan;
  138. nullpo_retv( clan = clan_search(clan_id) );
  139. clif_clan_message(clan,mes,len);
  140. }
  141. void clan_send_message( struct map_session_data *sd, const char *mes, int len ){
  142. nullpo_retv(sd);
  143. nullpo_retv(sd->clan);
  144. intif_clan_message(sd->status.clan_id,sd->status.account_id,mes,len);
  145. clan_recv_message(sd->status.clan_id,sd->status.account_id,mes,len);
  146. log_chat( LOG_CHAT_CLAN, sd->status.clan_id, sd->status.char_id, sd->status.account_id, mapindex_id2name( sd->mapindex ), sd->bl.x, sd->bl.y, NULL, mes );
  147. }
  148. int clan_get_alliance_count( struct clan *clan, int flag ){
  149. int i, count;
  150. nullpo_ret(clan);
  151. for( i = 0, count = 0; i < MAX_CLANALLIANCE; i++ ){
  152. if( clan->alliance[i].clan_id > 0 && clan->alliance[i].opposition == flag ){
  153. count++;
  154. }
  155. }
  156. return count;
  157. }