int_guild.c 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584
  1. //
  2. // original code from athena
  3. // SQL conversion by hack
  4. //
  5. #include "char.h"
  6. #include "strlib.h"
  7. #include "int_storage.h"
  8. #include "inter.h"
  9. #include "int_guild.h"
  10. #include "int_storage.h"
  11. #include "mmo.h"
  12. #include "socket.h"
  13. #include "db.h"
  14. #include "utils.h"
  15. #include <string.h>
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. static struct dbt *guild_db_;
  19. static struct dbt *castle_db_;
  20. static struct dbt *guild_expcache_db_;
  21. static struct dbt *guild_infoevent_db_;
  22. static struct dbt *guild_castleinfoevent_db_;
  23. static struct guild *guild_pt;
  24. static struct guild *guild_pt2;
  25. static struct guild_castle * guildcastle_pt;
  26. static int guild_newid=10000;
  27. static int guild_exp[100];
  28. int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int flag,const char *mes);
  29. int mapif_guild_broken(int guild_id,int flag);
  30. int guild_check_empty(struct guild *g);
  31. int guild_calcinfo(struct guild *g);
  32. int mapif_guild_basicinfochanged(int guild_id,int type,const void *data,int len);
  33. int mapif_guild_info(int fd,struct guild *g);
  34. int guild_break_sub(void *key,void *data,va_list ap);
  35. // Save guild into sql
  36. int inter_guild_tosql(struct guild *g,int flag)
  37. {
  38. // 1 `guild` (`guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data`)
  39. // 2 `guild_member` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`)
  40. // 4 `guild_position` (`guild_id`,`position`,`name`,`mode`,`exp_mode`)
  41. // 8 `guild_alliance` (`guild_id`,`opposition`,`alliance_id`,`name`)
  42. // 16 `guild_expulsion` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`)
  43. // 32 `guild_skill` (`guild_id`,`id`,`lv`)
  44. char t_name[100],t_master[24],t_mes1[60],t_mes2[120],t_member[24],t_position[24],t_alliance[24]; // temporay storage for str convertion;
  45. char t_ename[24],t_emes[40];
  46. char emblem_data[4096];
  47. int first = 1, i=0;
  48. int guild_member=0,guild_online_member=0;
  49. struct StringBuf sbuf;
  50. StringBuf_Init(&sbuf);
  51. if (g->guild_id<=0) return -1;
  52. printf("(\033[1;35m%d\033[0m) Request save guild - ",g->guild_id);
  53. jstrescapecpy(t_name, g->name);
  54. guild_member = 0;
  55. i = 0;
  56. while (i<g->max_member) {
  57. if (g->member[i].account_id>0) guild_member++;
  58. i++;
  59. }
  60. // Delete old guild from sql
  61. if (flag&1||guild_member==0){
  62. StringBuf_Printf(&sbuf, "DELETE FROM `%s` WHERE `guild_id`='%d';\n",guild_db, g->guild_id);
  63. }
  64. if (flag&2||guild_member==0){
  65. // printf("- Delete guild %d from guild_member\n",g->guild_id);
  66. StringBuf_Printf(&sbuf, "DELETE FROM `%s` WHERE `guild_id`='%d';\n",guild_member_db, g->guild_id);
  67. StringBuf_Printf(&sbuf, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d';\n",char_db, g->guild_id);
  68. }
  69. if (flag&32||guild_member==0){
  70. // printf("- Delete guild %d from guild_skill\n",g->guild_id);
  71. StringBuf_Printf(&sbuf, "DELETE FROM `%s` WHERE `guild_id`='%d';\n",guild_skill_db, g->guild_id);
  72. }
  73. if (flag&4||guild_member==0){
  74. // printf("- Delete guild %d from guild_position\n",g->guild_id);
  75. StringBuf_Printf(&sbuf, "DELETE FROM `%s` WHERE `guild_id`='%d';\n",guild_position_db, g->guild_id);
  76. }
  77. if (flag&16||guild_member==0){
  78. // printf("- Delete guild %d from guild_expulsion\n",g->guild_id);
  79. StringBuf_Printf(&sbuf, "DELETE FROM `%s` WHERE `guild_id`='%d';\n",guild_expulsion_db, g->guild_id);
  80. }
  81. if (flag&8||guild_member==0){
  82. // printf("- Delete guild %d from guild_alliance\n",g->guild_id);
  83. StringBuf_Printf(&sbuf, "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d';\n",guild_alliance_db, g->guild_id,g->guild_id);
  84. }
  85. if (flag&2||guild_member==0){
  86. // printf("- Delete guild %d from char\n",g->guild_id);
  87. StringBuf_Printf(&sbuf, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d';\n",char_db, g->guild_id);
  88. }
  89. if (guild_member==0){
  90. // printf("- Delete guild %d from guild_castle\n",g->guild_id);
  91. StringBuf_Printf(&sbuf, "DELETE FROM `%s` WHERE `guild_id`='%d';\n",guild_castle_db, g->guild_id);
  92. }
  93. #if 0
  94. }
  95. #endif
  96. guild_online_member = 0;
  97. i=0;
  98. while (i<g->max_member) {
  99. if (g->member[i].account_id>0) guild_online_member++;
  100. i++;
  101. }
  102. // No member in guild , no need to create it in sql
  103. if (guild_member <= 0 && guild_online_member <=0) {
  104. inter_guild_storage_delete(g->guild_id);
  105. printf("No member in guild %d , break it! \n",g->guild_id);
  106. if(mysql_query(&mysql_handle, StringBuf_Value(&sbuf)) )
  107. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  108. return -2;
  109. }
  110. // Insert new guild to sqlserver
  111. if (flag&1||guild_member==0){
  112. int len=0;
  113. //printf("- Insert guild %d to guild\n",g->guild_id);
  114. for(i=0;i<g->emblem_len;i++){
  115. len+=sprintf(emblem_data+len,"%02x",(unsigned char)(g->emblem_data[i]));
  116. //printf("%02x",(unsigned char)(g->emblem_data[i]));
  117. }
  118. emblem_data[len] = '\0';
  119. //printf("- emblem_len = %d \n",g->emblem_len);
  120. StringBuf_Printf(&sbuf, "INSERT INTO `%s` "
  121. "(`guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data`) "
  122. "VALUES ('%d', '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%s', '%d', '%d', '%s');",
  123. guild_db, g->guild_id,t_name,jstrescapecpy(t_master,g->master),
  124. g->guild_lv,g->connect_member,g->max_member,g->average_lv,g->exp,g->next_exp,g->skill_point,g->castle_id,
  125. jstrescapecpy(t_mes1,g->mes1),jstrescapecpy(t_mes2,g->mes2),g->emblem_len,g->emblem_id,emblem_data);
  126. //printf(" %s\n",tmp_sql);
  127. }
  128. if (flag&2||guild_member==0){
  129. struct StringBuf sbuf2;
  130. StringBuf_Init(&sbuf2);
  131. first = 1;
  132. StringBuf_Printf(&sbuf,"REPLACE `%s` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`) VALUES \n", guild_member_db);
  133. StringBuf_Printf(&sbuf2, "UPDATE `%s` SET `guild_id`='%d' WHERE `char_id` IN (",char_db, g->guild_id);
  134. //printf("- Insert guild %d to guild_member\n",g->guild_id);
  135. for(i=0;i<g->max_member;i++){
  136. if (g->member[i].account_id>0){
  137. struct guild_member *m = &g->member[i];
  138. if (first == 0) {
  139. StringBuf_Printf(&sbuf , ", ");
  140. StringBuf_Printf(&sbuf2, ", ");
  141. } else
  142. first = 0;
  143. StringBuf_Printf(&sbuf, "('%d','%d','%d','%d','%d', '%d','%d','%d','%d','%d','%d','%d','%d','%d','%s')\n",
  144. g->guild_id,
  145. m->account_id,m->char_id,
  146. m->hair,m->hair_color,m->gender,
  147. m->class,m->lv,m->exp,m->exp_payper,m->online,m->position,
  148. 0,0,
  149. jstrescapecpy(t_member,m->name));
  150. StringBuf_Printf(&sbuf2, "'%d'", m->char_id);
  151. }
  152. }
  153. StringBuf_Printf(&sbuf, ";\n");
  154. StringBuf_Printf(&sbuf2,");\n");
  155. StringBuf_Append(&sbuf, &sbuf2);
  156. StringBuf_Destroy(&sbuf2);
  157. }
  158. if (flag&4||guild_member==0){
  159. first = 1;
  160. //printf("- Insert guild %d to guild_position\n",g->guild_id);
  161. StringBuf_Printf(&sbuf ,"INSERT INTO `%s` (`guild_id`,`position`,`name`,`mode`,`exp_mode`) VALUES ", guild_position_db);
  162. for(i=0;i<MAX_GUILDPOSITION;i++){
  163. if (first == 0)
  164. StringBuf_Printf(&sbuf , ", ");
  165. else
  166. first = 0;
  167. struct guild_position *p = &g->position[i];
  168. StringBuf_Printf(&sbuf , "('%d','%d', '%s','%d','%d')",
  169. g->guild_id, i, jstrescapecpy(t_position,p->name),p->mode,p->exp_mode);
  170. }
  171. StringBuf_Printf(&sbuf ,";\n");
  172. }
  173. if (flag&8||guild_member==0){
  174. first = 1;
  175. StringBuf_Printf(&sbuf , "INSERT INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) VALUES ", guild_alliance_db);
  176. //printf("- Insert guild %d to guild_alliance\n",g->guild_id);
  177. for(i=0;i<MAX_GUILDALLIANCE;i++){
  178. struct guild_alliance *a=&g->alliance[i];
  179. if(a->guild_id>0){
  180. if (first == 0)
  181. StringBuf_Printf(&sbuf , ", ");
  182. else
  183. first = 0;
  184. StringBuf_Printf(&sbuf , "('%d','%d','%d','%s')",
  185. g->guild_id,a->opposition,a->guild_id,jstrescapecpy(t_alliance,a->name));
  186. StringBuf_Printf(&sbuf , ", ('%d','%d','%d','%s')",
  187. a->guild_id,a->opposition,g->guild_id,t_name);
  188. //printf(" %s\n",tmp_sql);
  189. }
  190. }
  191. StringBuf_Printf(&sbuf ,";\n");
  192. }
  193. if (flag&16||guild_member==0){
  194. first = 1;
  195. //printf("- Insert guild %d to guild_expulsion\n",g->guild_id);
  196. StringBuf_Printf(&sbuf, "INSERT INTO `%s` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`) VALUES ",
  197. guild_expulsion_db);
  198. for(i=0;i<MAX_GUILDEXPLUSION;i++){
  199. struct guild_explusion *e=&g->explusion[i];
  200. if(e->account_id>0){
  201. if (first == 0)
  202. StringBuf_Printf(&sbuf , ", ");
  203. else
  204. first = 0;
  205. StringBuf_Printf(&sbuf, "('%d','%s','%s','%s','%d','%d','%d','%d')",
  206. g->guild_id, jstrescapecpy(t_ename,e->name),jstrescapecpy(t_emes,e->mes),e->acc,e->account_id,e->rsv1,e->rsv2,e->rsv3 );
  207. //printf(" %s\n",tmp_sql);
  208. }
  209. }
  210. StringBuf_Printf(&sbuf ,";\n");
  211. }
  212. if (flag&32||guild_member==0){
  213. first = 1;
  214. //printf("- Insert guild %d to guild_skill\n",g->guild_id);
  215. StringBuf_Printf(&sbuf,"INSERT INTO `%s` (`guild_id`,`id`,`lv`) VALUES ", guild_skill_db);
  216. for(i=0;i<MAX_GUILDSKILL;i++){
  217. if (g->skill[i].id>0){
  218. if (first == 0)
  219. StringBuf_Printf(&sbuf , ", ");
  220. else
  221. first = 0;
  222. StringBuf_Printf(&sbuf, "('%d','%d','%d')",
  223. g->guild_id,g->skill[i].id,g->skill[i].lv);
  224. }
  225. }
  226. StringBuf_Printf(&sbuf ,";\n");
  227. }
  228. if(mysql_query(&mysql_handle, StringBuf_Value(&sbuf)))
  229. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  230. StringBuf_Destroy(&sbuf);
  231. printf("Save guild done\n");
  232. return 0;
  233. }
  234. // Read guild from sql
  235. struct guild * inter_guild_fromsql(int guild_id)
  236. {
  237. int i;
  238. char emblem_data[4096];
  239. char *pstr;
  240. struct guild *g;
  241. if (guild_id==0) return 0;
  242. g = numdb_search(guild_db_,guild_id);
  243. if (g != NULL)
  244. return g;
  245. g = (struct guild *) malloc(sizeof(struct guild));
  246. memset(g,0,sizeof(struct guild));
  247. // printf("Retrieve guild information from sql ......\n");
  248. // printf("- Read guild %d from sql \n",guild_id);
  249. sprintf(tmp_sql,"SELECT `guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data` "
  250. "FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
  251. //printf(" %s\n",tmp_sql);
  252. if(mysql_query(&mysql_handle, tmp_sql) ) {
  253. printf("DB server Error (select `guild`)- %s\n", mysql_error(&mysql_handle) );
  254. free(g);
  255. return 0;
  256. }
  257. sql_res = mysql_store_result(&mysql_handle) ;
  258. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  259. sql_row = mysql_fetch_row(sql_res);
  260. if (sql_row==NULL) {
  261. mysql_free_result(sql_res);
  262. free(g);
  263. return 0;
  264. }
  265. g->guild_id=atoi(sql_row[0]);
  266. strncpy(g->name,sql_row[1],24);
  267. strncpy(g->master,sql_row[2],24);
  268. g->guild_lv=atoi(sql_row[3]);
  269. g->connect_member=atoi(sql_row[4]);
  270. g->max_member=atoi(sql_row[5]);
  271. g->average_lv=atoi(sql_row[6]);
  272. g->exp=atoi(sql_row[7]);
  273. g->next_exp=atoi(sql_row[8]);
  274. g->skill_point=atoi(sql_row[9]);
  275. g->castle_id=atoi(sql_row[10]);
  276. strncpy(g->mes1,sql_row[11],60);
  277. strncpy(g->mes2,sql_row[12],120);
  278. g->emblem_len=atoi(sql_row[13]);
  279. g->emblem_id=atoi(sql_row[14]);
  280. strncpy(emblem_data,sql_row[15],4096);
  281. for(i=0,pstr=emblem_data;i<g->emblem_len;i++,pstr+=2){
  282. int c1=pstr[0],c2=pstr[1],x1=0,x2=0;
  283. if(c1>='0' && c1<='9')x1=c1-'0';
  284. if(c1>='a' && c1<='f')x1=c1-'a'+10;
  285. if(c1>='A' && c1<='F')x1=c1-'A'+10;
  286. if(c2>='0' && c2<='9')x2=c2-'0';
  287. if(c2>='a' && c2<='f')x2=c2-'a'+10;
  288. if(c2>='A' && c2<='F')x2=c2-'A'+10;
  289. g->emblem_data[i]=(x1<<4)|x2;
  290. }
  291. }
  292. mysql_free_result(sql_res);
  293. //printf("- Read guild_member %d from sql \n",guild_id);
  294. sprintf(tmp_sql,"SELECT `guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name` "
  295. "FROM `%s` WHERE `guild_id`='%d' ORDER BY `position`", guild_member_db, guild_id);
  296. //printf(" %s\n",tmp_sql);
  297. if(mysql_query(&mysql_handle, tmp_sql) ) {
  298. printf("DB server Error (select `guild_member`)- %s\n", mysql_error(&mysql_handle) );
  299. free(g);
  300. return 0;
  301. }
  302. sql_res = mysql_store_result(&mysql_handle) ;
  303. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  304. int i;
  305. for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<g->max_member);i++){
  306. struct guild_member *m = &g->member[i];
  307. m->account_id=atoi(sql_row[1]);
  308. m->char_id=atoi(sql_row[2]);
  309. m->hair=atoi(sql_row[3]);
  310. m->hair_color=atoi(sql_row[4]);
  311. m->gender=atoi(sql_row[5]);
  312. m->class=atoi(sql_row[6]);
  313. m->lv=atoi(sql_row[7]);
  314. m->exp=atoi(sql_row[8]);
  315. m->exp_payper=atoi(sql_row[9]);
  316. m->online=atoi(sql_row[10]);
  317. m->position=atoi(sql_row[11]);
  318. strncpy(m->name,sql_row[14],24);
  319. }
  320. }
  321. mysql_free_result(sql_res);
  322. //printf("- Read guild_position %d from sql \n",guild_id);
  323. sprintf(tmp_sql,"SELECT `guild_id`,`position`,`name`,`mode`,`exp_mode` FROM `%s` WHERE `guild_id`='%d'",guild_position_db, guild_id);
  324. //printf(" %s\n",tmp_sql);
  325. if(mysql_query(&mysql_handle, tmp_sql) ) {
  326. printf("DB server Error (select `guild_position`)- %s\n", mysql_error(&mysql_handle) );
  327. free(g);
  328. return 0;
  329. }
  330. sql_res = mysql_store_result(&mysql_handle) ;
  331. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  332. int i;
  333. for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDPOSITION);i++){
  334. int position = atoi(sql_row[1]);
  335. struct guild_position *p = &g->position[position];
  336. strncpy(p->name,sql_row[2],24);
  337. p->mode=atoi(sql_row[3]);
  338. p->exp_mode=atoi(sql_row[4]);
  339. }
  340. }
  341. mysql_free_result(sql_res);
  342. //printf("- Read guild_alliance %d from sql \n",guild_id);
  343. sprintf(tmp_sql,"SELECT `guild_id`,`opposition`,`alliance_id`,`name` FROM `%s` WHERE `guild_id`='%d'",guild_alliance_db, guild_id);
  344. if(mysql_query(&mysql_handle, tmp_sql) ) {
  345. printf("DB server Error (select `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
  346. free(g);
  347. return 0;
  348. }
  349. sql_res = mysql_store_result(&mysql_handle) ;
  350. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  351. int i;
  352. for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDALLIANCE);i++){
  353. struct guild_alliance *a = &g->alliance[i];
  354. a->opposition=atoi(sql_row[1]);
  355. a->guild_id=atoi(sql_row[2]);
  356. strncpy(a->name,sql_row[3],24);
  357. }
  358. }
  359. mysql_free_result(sql_res);
  360. //printf("- Read guild_expulsion %d from sql \n",guild_id);
  361. sprintf(tmp_sql,"SELECT `guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3` FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, guild_id);
  362. if(mysql_query(&mysql_handle, tmp_sql) ) {
  363. printf("DB server Error (select `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) );
  364. free(g);
  365. return 0;
  366. }
  367. sql_res = mysql_store_result(&mysql_handle) ;
  368. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  369. int i;
  370. for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDEXPLUSION);i++){
  371. struct guild_explusion *e = &g->explusion[i];
  372. strncpy(e->name,sql_row[1],24);
  373. strncpy(e->mes,sql_row[2],40);
  374. strncpy(e->acc,sql_row[3],24);
  375. e->account_id=atoi(sql_row[4]);
  376. e->rsv1=atoi(sql_row[5]);
  377. e->rsv2=atoi(sql_row[6]);
  378. e->rsv3=atoi(sql_row[7]);
  379. }
  380. }
  381. mysql_free_result(sql_res);
  382. //printf("- Read guild_skill %d from sql \n",guild_id);
  383. sprintf(tmp_sql,"SELECT `guild_id`,`id`,`lv` FROM `%s` WHERE `guild_id`='%d' ORDER BY `id`",guild_skill_db, guild_id);
  384. if(mysql_query(&mysql_handle, tmp_sql) ) {
  385. printf("DB server Error (select `guild_skill`)- %s\n", mysql_error(&mysql_handle) );
  386. free(g);
  387. return 0;
  388. }
  389. sql_res = mysql_store_result(&mysql_handle) ;
  390. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  391. int i;
  392. for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDSKILL);i++){
  393. g->skill[i].id=atoi(sql_row[1]);
  394. g->skill[i].lv=atoi(sql_row[2]);
  395. }
  396. }
  397. mysql_free_result(sql_res);
  398. // printf("Successfully retrieve guild information from sql!\n");
  399. numdb_insert(guild_db_, guild_id,g);
  400. return g;
  401. }
  402. // Save guild_castle to sql
  403. int inter_guildcastle_tosql(struct guild_castle *gc)
  404. {
  405. // `guild_castle` (`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, `visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`)
  406. if (gc==NULL) return 0;
  407. //printf("Save to guild_castle\n");
  408. sprintf(tmp_sql,"DELETE FROM `%s` WHERE `castle_id`='%d'",guild_castle_db, gc->castle_id);
  409. //printf(" %s\n",tmp_sql);
  410. if(mysql_query(&mysql_handle, tmp_sql) ) {
  411. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  412. return 0;
  413. }
  414. sprintf(tmp_sql,"INSERT INTO `%s` "
  415. "(`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`,"
  416. "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`,"
  417. "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`)"
  418. "VALUES ('%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d')",
  419. guild_castle_db, gc->castle_id, gc->guild_id, gc->economy, gc->defense, gc->triggerE, gc->triggerD, gc->nextTime, gc->payTime,
  420. gc->createTime, gc->visibleC, gc->visibleG0, gc->visibleG1, gc->visibleG2, gc->visibleG3, gc->visibleG4, gc->visibleG5,
  421. gc->visibleG6, gc->visibleG7, gc->Ghp0, gc->Ghp1, gc->Ghp2, gc->Ghp3, gc->Ghp4, gc->Ghp5, gc->Ghp6, gc->Ghp7);
  422. //printf(" %s\n",tmp_sql);
  423. if(mysql_query(&mysql_handle, tmp_sql) ) {
  424. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  425. return 0;
  426. }
  427. sprintf(tmp_sql,"UPDATE `%s` SET `castle_id`='-1' WHERE `castle_id`='%d'",guild_db, gc->castle_id);
  428. //printf(" %s\n",tmp_sql);
  429. if(mysql_query(&mysql_handle, tmp_sql) ) {
  430. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  431. return 0;
  432. }
  433. sprintf(tmp_sql,"UPDATE `%s` SET `castle_id`='%d' WHERE `guild_id`='%d'",guild_db, gc->castle_id,gc->guild_id);
  434. //printf(" %s\n",tmp_sql);
  435. if(mysql_query(&mysql_handle, tmp_sql) ) {
  436. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  437. return 0;
  438. }
  439. return 0;
  440. }
  441. // Read guild_castle from sql
  442. int inter_guildcastle_fromsql(int castle_id,struct guild_castle *gc)
  443. {
  444. if (gc==NULL) return 0;
  445. //printf("Read from guild_castle\n");
  446. memset(gc,0,sizeof(struct guild_castle));
  447. gc->castle_id=castle_id;
  448. if (castle_id==-1) return 0;
  449. sprintf(tmp_sql,"SELECT `castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, "
  450. "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`,"
  451. "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`"
  452. " FROM `%s` WHERE `castle_id`='%d'",guild_castle_db, castle_id);
  453. if(mysql_query(&mysql_handle, tmp_sql) ) {
  454. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  455. return 0;
  456. }
  457. sql_res = mysql_store_result(&mysql_handle) ;
  458. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  459. sql_row = mysql_fetch_row(sql_res);
  460. if (sql_row==NULL){
  461. mysql_free_result(sql_res);
  462. return 0;
  463. }
  464. gc->guild_id = atoi (sql_row[1]);
  465. gc->economy = atoi (sql_row[2]);
  466. gc->defense = atoi (sql_row[3]);
  467. gc->triggerE = atoi (sql_row[4]);
  468. gc->triggerD = atoi (sql_row[5]);
  469. gc->nextTime = atoi (sql_row[6]);
  470. gc->payTime = atoi (sql_row[7]);
  471. gc->createTime = atoi (sql_row[8]);
  472. gc->visibleC = atoi (sql_row[9]);
  473. gc->visibleG0 = atoi (sql_row[10]);
  474. gc->visibleG1 = atoi (sql_row[11]);
  475. gc->visibleG2 = atoi (sql_row[12]);
  476. gc->visibleG3 = atoi (sql_row[13]);
  477. gc->visibleG4 = atoi (sql_row[14]);
  478. gc->visibleG5 = atoi (sql_row[15]);
  479. gc->visibleG6 = atoi (sql_row[16]);
  480. gc->visibleG7 = atoi (sql_row[17]);
  481. gc->Ghp0 = atoi (sql_row[18]);
  482. gc->Ghp1 = atoi (sql_row[19]);
  483. gc->Ghp2 = atoi (sql_row[20]);
  484. gc->Ghp3 = atoi (sql_row[21]);
  485. gc->Ghp4 = atoi (sql_row[22]);
  486. gc->Ghp5 = atoi (sql_row[23]);
  487. gc->Ghp6 = atoi (sql_row[24]);
  488. gc->Ghp7 = atoi (sql_row[25]);
  489. //printf("Read Castle %d of guild %d from sql \n",castle_id,gc->guild_id);
  490. }
  491. mysql_free_result(sql_res) ; //resource free
  492. return 0;
  493. }
  494. // Read exp_guild.txt
  495. int inter_guild_readdb()
  496. {
  497. int i;
  498. FILE *fp;
  499. char line[1024];
  500. for (i=0;i<100;i++) guild_exp[i]=0;
  501. fp=fopen("db/exp_guild.txt","r");
  502. if(fp==NULL){
  503. printf("can't read db/exp_guild.txt\n");
  504. return 1;
  505. }
  506. i=0;
  507. while(fgets(line,256,fp) && i<100){
  508. if(line[0]=='/' && line[1]=='/')
  509. continue;
  510. guild_exp[i]=atoi(line);
  511. i++;
  512. }
  513. fclose(fp);
  514. return 0;
  515. }
  516. // Initialize guild sql
  517. int inter_guild_sql_init()
  518. {
  519. int i;
  520. guild_db_=numdb_init();
  521. castle_db_=numdb_init();
  522. guild_expcache_db_=numdb_init();
  523. guild_infoevent_db_=numdb_init();
  524. guild_castleinfoevent_db_=numdb_init();
  525. printf("interserver guild memory initialize.... (%d byte)\n",sizeof(struct guild));
  526. guild_pt = calloc(sizeof(struct guild), 1);
  527. guild_pt2= calloc(sizeof(struct guild), 1);
  528. guildcastle_pt=calloc(sizeof(struct guild_castle), 1);
  529. inter_guild_readdb(); // Read exp
  530. sprintf (tmp_sql , "SELECT count(*) FROM `%s`",guild_db);
  531. if(mysql_query(&mysql_handle, tmp_sql) ) {
  532. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  533. exit(0);
  534. }
  535. sql_res = mysql_store_result(&mysql_handle) ;
  536. sql_row = mysql_fetch_row(sql_res);
  537. printf("total guild data -> '%s'.......\n",sql_row[0]);
  538. i = atoi (sql_row[0]);
  539. mysql_free_result(sql_res);
  540. if (i > 0) {
  541. //set party_newid
  542. sprintf (tmp_sql , "SELECT max(`guild_id`) FROM `%s`",guild_db);
  543. if(mysql_query(&mysql_handle, tmp_sql) ) {
  544. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  545. exit(0);
  546. }
  547. sql_res = mysql_store_result(&mysql_handle) ;
  548. sql_row = mysql_fetch_row(sql_res);
  549. guild_newid = atoi(sql_row[0])+1;
  550. mysql_free_result(sql_res);
  551. }
  552. printf("set guild_newid: %d.......\n",guild_newid);
  553. return 0;
  554. }
  555. // Get guild by its name
  556. struct guild* search_guildname(char *str)
  557. {
  558. char t_name[24];
  559. int guild_id=0;
  560. printf("search_guildname\n");
  561. sprintf (tmp_sql , "SELECT `guild_id` FROM `%s` WHERE `name`='%s'",guild_db, jstrescapecpy(t_name,str));
  562. if(mysql_query(&mysql_handle, tmp_sql) ) {
  563. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  564. }
  565. sql_res = mysql_store_result(&mysql_handle) ;
  566. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  567. sql_row = mysql_fetch_row(sql_res);
  568. guild_id = atoi (sql_row[0]);
  569. }
  570. mysql_free_result(sql_res);
  571. return inter_guild_fromsql(guild_id);
  572. }
  573. // Check if guild is empty
  574. int guild_check_empty(struct guild *g)
  575. {
  576. int i;
  577. for(i=0;i<g->max_member;i++){
  578. if(g->member[i].account_id>0){
  579. return 0;
  580. }
  581. }
  582. // 誰もいないので解散
  583. mapif_guild_broken(g->guild_id,0);
  584. inter_guild_storage_delete(g->guild_id);
  585. inter_guild_tosql(g,255);
  586. memset(g,0,sizeof(struct guild));
  587. return 1;
  588. }
  589. int guild_nextexp(int level)
  590. {
  591. if(level < 100 && level >0) // Change by hack
  592. return guild_exp[level-1];
  593. return 0;
  594. }
  595. // ギルドスキルがあるか確認
  596. int guild_checkskill(struct guild *g,int id) {
  597. int idx = id - GD_SKILLBASE;
  598. if(idx < 0 || idx >= MAX_GUILDSKILL)
  599. return 0;
  600. return g->skill[idx].lv;
  601. }
  602. // ギルドの情報の再計算
  603. int guild_calcinfo(struct guild *g)
  604. {
  605. int i,c,nextexp;
  606. struct guild before=*g;
  607. // スキルIDの設定
  608. for(i=0;i<MAX_GUILDSKILL;i++)
  609. g->skill[i].id=i+GD_SKILLBASE;
  610. // ギルドレベル
  611. if(g->guild_lv<=0) g->guild_lv=1;
  612. nextexp = guild_nextexp(g->guild_lv);
  613. if(nextexp > 0) {
  614. while(g->exp >= nextexp && nextexp>0){ // Change by hack
  615. g->exp-=nextexp;
  616. g->guild_lv++;
  617. g->skill_point++;
  618. nextexp = guild_nextexp(g->guild_lv);
  619. }
  620. }
  621. // ギルドの次の経験値
  622. g->next_exp = guild_nextexp(g->guild_lv);
  623. // メンバ上限(ギルド拡張適用)
  624. g->max_member = 16 + guild_checkskill(g, GD_EXTENSION) * 6; // Guild Extention skill - adds by 6 people per level to Max Member [Lupus]
  625. // 平均レベルとオンライン人数
  626. g->average_lv=0;
  627. g->connect_member=0;
  628. for(i=c=0;i<g->max_member;i++){
  629. if(g->member[i].account_id>0){
  630. g->average_lv+=g->member[i].lv;
  631. c++;
  632. if(g->member[i].online>0)
  633. g->connect_member++;
  634. }
  635. }
  636. if(c) g->average_lv/=c;
  637. // 全データを送る必要がありそう
  638. if( g->max_member!=before.max_member ||
  639. g->guild_lv!=before.guild_lv ||
  640. g->skill_point!=before.skill_point ){
  641. mapif_guild_info(-1,g);
  642. return 1;
  643. }
  644. return 0;
  645. }
  646. //-------------------------------------------------------------------
  647. // map serverへの通信
  648. // ギルド作成可否
  649. int mapif_guild_created(int fd,int account_id,struct guild *g)
  650. {
  651. WFIFOW(fd,0)=0x3830;
  652. WFIFOL(fd,2)=account_id;
  653. if(g!=NULL){
  654. WFIFOL(fd,6)=g->guild_id;
  655. printf("int_guild: created! %d %s\n",g->guild_id,g->name);
  656. }else{
  657. WFIFOL(fd,6)=0;
  658. }
  659. WFIFOSET(fd,10);
  660. return 0;
  661. }
  662. // ギルド情報見つからず
  663. int mapif_guild_noinfo(int fd,int guild_id)
  664. {
  665. WFIFOW(fd,0)=0x3831;
  666. WFIFOW(fd,2)=8;
  667. WFIFOL(fd,4)=guild_id;
  668. WFIFOSET(fd,8);
  669. printf("int_guild: info not found %d\n",guild_id);
  670. return 0;
  671. }
  672. // ギルド情報まとめ送り
  673. int mapif_guild_info(int fd,struct guild *g)
  674. {
  675. unsigned char buf[16384];
  676. WBUFW(buf,0)=0x3831;
  677. memcpy(buf+4,g,sizeof(struct guild));
  678. WBUFW(buf,2)=4+sizeof(struct guild);
  679. // printf("int_guild: sizeof(guild)=%d\n",sizeof(struct guild));
  680. if(fd<0)
  681. mapif_sendall(buf,WBUFW(buf,2));
  682. else
  683. mapif_send(fd,buf,WBUFW(buf,2));
  684. // printf("int_guild: info %d %s\n",p->guild_id,p->name);
  685. return 0;
  686. }
  687. // メンバ追加可否
  688. int mapif_guild_memberadded(int fd,int guild_id,int account_id,int char_id,int flag)
  689. {
  690. WFIFOW(fd,0)=0x3832;
  691. WFIFOL(fd,2)=guild_id;
  692. WFIFOL(fd,6)=account_id;
  693. WFIFOL(fd,10)=char_id;
  694. WFIFOB(fd,14)=flag;
  695. WFIFOSET(fd,15);
  696. return 0;
  697. }
  698. // 脱退/追放通知
  699. int mapif_guild_leaved(int guild_id,int account_id,int char_id,int flag,
  700. const char *name,const char *mes)
  701. {
  702. unsigned char buf[128];
  703. WBUFW(buf, 0)=0x3834;
  704. WBUFL(buf, 2)=guild_id;
  705. WBUFL(buf, 6)=account_id;
  706. WBUFL(buf,10)=char_id;
  707. WBUFB(buf,14)=flag;
  708. memcpy(WBUFP(buf,15),mes,40);
  709. memcpy(WBUFP(buf,55),name,24);
  710. mapif_sendall(buf,79);
  711. printf("int_guild: guild leaved %d %d %s %s\n",guild_id,account_id,name,mes);
  712. return 0;
  713. }
  714. // オンライン状態とLv更新通知
  715. int mapif_guild_memberinfoshort(struct guild *g,int idx)
  716. {
  717. unsigned char buf[32];
  718. WBUFW(buf, 0)=0x3835;
  719. WBUFL(buf, 2)=g->guild_id;
  720. WBUFL(buf, 6)=g->member[idx].account_id;
  721. WBUFL(buf,10)=g->member[idx].char_id;
  722. WBUFB(buf,14)=g->member[idx].online;
  723. WBUFW(buf,15)=g->member[idx].lv;
  724. WBUFW(buf,17)=g->member[idx].class;
  725. mapif_sendall(buf,19);
  726. return 0;
  727. }
  728. // 解散通知
  729. int mapif_guild_broken(int guild_id,int flag)
  730. {
  731. unsigned char buf[16];
  732. WBUFW(buf,0)=0x3836;
  733. WBUFL(buf,2)=guild_id;
  734. WBUFB(buf,6)=flag;
  735. mapif_sendall(buf,7);
  736. printf("int_guild: broken %d\n",guild_id);
  737. return 0;
  738. }
  739. // ギルド内発言
  740. int mapif_guild_message(int guild_id,int account_id,char *mes,int len)
  741. {
  742. unsigned char buf[512];
  743. WBUFW(buf,0)=0x3837;
  744. WBUFW(buf,2)=len+12;
  745. WBUFL(buf,4)=guild_id;
  746. WBUFL(buf,8)=account_id;
  747. memcpy(WBUFP(buf,12),mes,len);
  748. mapif_sendall(buf,len+12);
  749. return 0;
  750. }
  751. // ギルド基本情報変更通知
  752. int mapif_guild_basicinfochanged(int guild_id,int type,const void *data,int len)
  753. {
  754. unsigned char buf[2048];
  755. WBUFW(buf, 0)=0x3839;
  756. WBUFW(buf, 2)=len+10;
  757. WBUFL(buf, 4)=guild_id;
  758. WBUFW(buf, 8)=type;
  759. memcpy(WBUFP(buf,10),data,len);
  760. mapif_sendall(buf,len+10);
  761. return 0;
  762. }
  763. // ギルドメンバ情報変更通知
  764. int mapif_guild_memberinfochanged(int guild_id,int account_id,int char_id,
  765. int type,const void *data,int len)
  766. {
  767. unsigned char buf[2048];
  768. WBUFW(buf, 0)=0x383a;
  769. WBUFW(buf, 2)=len+18;
  770. WBUFL(buf, 4)=guild_id;
  771. WBUFL(buf, 8)=account_id;
  772. WBUFL(buf,12)=char_id;
  773. WBUFW(buf,16)=type;
  774. memcpy(WBUFP(buf,18),data,len);
  775. mapif_sendall(buf,len+18);
  776. return 0;
  777. }
  778. // ギルドスキルアップ通知
  779. int mapif_guild_skillupack(int guild_id,int skill_num,int account_id)
  780. {
  781. unsigned char buf[16];
  782. WBUFW(buf, 0)=0x383c;
  783. WBUFL(buf, 2)=guild_id;
  784. WBUFL(buf, 6)=skill_num;
  785. WBUFL(buf,10)=account_id;
  786. mapif_sendall(buf,14);
  787. return 0;
  788. }
  789. // ギルド同盟/敵対通知
  790. int mapif_guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2,
  791. int flag,const char *name1,const char *name2)
  792. {
  793. unsigned char buf[128];
  794. WBUFW(buf, 0)=0x383d;
  795. WBUFL(buf, 2)=guild_id1;
  796. WBUFL(buf, 6)=guild_id2;
  797. WBUFL(buf,10)=account_id1;
  798. WBUFL(buf,14)=account_id2;
  799. WBUFB(buf,18)=flag;
  800. memcpy(WBUFP(buf,19),name1,24);
  801. memcpy(WBUFP(buf,43),name2,24);
  802. mapif_sendall(buf,67);
  803. return 0;
  804. }
  805. // ギルド役職変更通知
  806. int mapif_guild_position(struct guild *g,int idx)
  807. {
  808. unsigned char buf[128];
  809. WBUFW(buf,0)=0x383b;
  810. WBUFW(buf,2)=sizeof(struct guild_position)+12;
  811. WBUFL(buf,4)=g->guild_id;
  812. WBUFL(buf,8)=idx;
  813. memcpy(WBUFP(buf,12),&g->position[idx],sizeof(struct guild_position));
  814. mapif_sendall(buf,WBUFW(buf,2));
  815. return 0;
  816. }
  817. // ギルド告知変更通知
  818. int mapif_guild_notice(struct guild *g)
  819. {
  820. unsigned char buf[256];
  821. WBUFW(buf,0)=0x383e;
  822. WBUFL(buf,2)=g->guild_id;
  823. memcpy(WBUFP(buf,6),g->mes1,60);
  824. memcpy(WBUFP(buf,66),g->mes2,120);
  825. mapif_sendall(buf,186);
  826. return 0;
  827. }
  828. // ギルドエンブレム変更通知
  829. int mapif_guild_emblem(struct guild *g)
  830. {
  831. unsigned char buf[2048];
  832. WBUFW(buf,0)=0x383f;
  833. WBUFW(buf,2)=g->emblem_len+12;
  834. WBUFL(buf,4)=g->guild_id;
  835. WBUFL(buf,8)=g->emblem_id;
  836. memcpy(WBUFP(buf,12),g->emblem_data,g->emblem_len);
  837. mapif_sendall(buf,WBUFW(buf,2));
  838. return 0;
  839. }
  840. int mapif_guild_castle_dataload(int castle_id,int index,int value) // <Agit>
  841. {
  842. unsigned char buf[16];
  843. WBUFW(buf, 0)=0x3840;
  844. WBUFW(buf, 2)=castle_id;
  845. WBUFB(buf, 4)=index;
  846. WBUFL(buf, 5)=value;
  847. mapif_sendall(buf,9);
  848. return 0;
  849. }
  850. int mapif_guild_castle_datasave(int castle_id,int index,int value) // <Agit>
  851. {
  852. unsigned char buf[16];
  853. WBUFW(buf, 0)=0x3841;
  854. WBUFW(buf, 2)=castle_id;
  855. WBUFB(buf, 4)=index;
  856. WBUFL(buf, 5)=value;
  857. mapif_sendall(buf,9);
  858. return 0;
  859. }
  860. int mapif_guild_castle_alldataload(int fd) {
  861. struct guild_castle* gc = guildcastle_pt;
  862. int i, len = 4;
  863. WFIFOW(fd,0) = 0x3842;
  864. sprintf(tmp_sql, "SELECT * FROM `%s` ORDER BY `castle_id`", guild_castle_db);
  865. if (mysql_query(&mysql_handle, tmp_sql)) {
  866. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  867. }
  868. sql_res = mysql_store_result(&mysql_handle);
  869. if (sql_res != NULL && mysql_num_rows(sql_res) > 0) {
  870. for(i = 0; ((sql_row = mysql_fetch_row(sql_res)) && i < MAX_GUILDCASTLE); i++) {
  871. memset(gc, 0, sizeof(struct guild_castle));
  872. gc->castle_id = atoi(sql_row[0]);
  873. gc->guild_id = atoi(sql_row[1]);
  874. gc->economy = atoi(sql_row[2]);
  875. gc->defense = atoi(sql_row[3]);
  876. gc->triggerE = atoi(sql_row[4]);
  877. gc->triggerD = atoi(sql_row[5]);
  878. gc->nextTime = atoi(sql_row[6]);
  879. gc->payTime = atoi(sql_row[7]);
  880. gc->createTime = atoi(sql_row[8]);
  881. gc->visibleC = atoi(sql_row[9]);
  882. gc->visibleG0 = atoi(sql_row[10]);
  883. gc->visibleG1 = atoi(sql_row[11]);
  884. gc->visibleG2 = atoi(sql_row[12]);
  885. gc->visibleG3 = atoi(sql_row[13]);
  886. gc->visibleG4 = atoi(sql_row[14]);
  887. gc->visibleG5 = atoi(sql_row[15]);
  888. gc->visibleG6 = atoi(sql_row[16]);
  889. gc->visibleG7 = atoi(sql_row[17]);
  890. gc->Ghp0 = atoi(sql_row[18]);
  891. gc->Ghp1 = atoi(sql_row[19]);
  892. gc->Ghp2 = atoi(sql_row[20]);
  893. gc->Ghp3 = atoi(sql_row[21]);
  894. gc->Ghp4 = atoi(sql_row[22]);
  895. gc->Ghp5 = atoi(sql_row[23]);
  896. gc->Ghp6 = atoi(sql_row[24]);
  897. gc->Ghp7 = atoi(sql_row[25]);
  898. memcpy(WFIFOP(fd,len), gc, sizeof(struct guild_castle));
  899. len += sizeof(struct guild_castle);
  900. }
  901. }
  902. mysql_free_result(sql_res);
  903. WFIFOW(fd,2) = len;
  904. WFIFOSET(fd,len);
  905. return 0;
  906. }
  907. //-------------------------------------------------------------------
  908. // map serverからの通信
  909. // ギルド作成要求
  910. int mapif_parse_CreateGuild(int fd,int account_id,char *name,struct guild_member *master)
  911. {
  912. struct guild *g;
  913. int i;
  914. printf("CreateGuild\n");
  915. g=search_guildname(name);
  916. if(g!=NULL&&g->guild_id>0){
  917. printf("int_guild: same name guild exists [%s]\n",name);
  918. mapif_guild_created(fd,account_id,NULL);
  919. return 0;
  920. }
  921. g=guild_pt;
  922. memset(g,0,sizeof(struct guild));
  923. g->guild_id=guild_newid++;
  924. memcpy(g->name,name,24);
  925. memcpy(g->master,master->name,24);
  926. memcpy(&g->member[0],master,sizeof(struct guild_member));
  927. g->position[0].mode=0x11;
  928. strcpy(g->position[ 0].name,"GuildMaster");
  929. strcpy(g->position[MAX_GUILDPOSITION-1].name,"Newbie");
  930. for(i=1;i<MAX_GUILDPOSITION-1;i++)
  931. sprintf(g->position[i].name,"Position %d",i+1);
  932. // Initialize guild property
  933. g->max_member=16;
  934. g->average_lv=master->lv;
  935. g->castle_id=-1;
  936. for(i=0;i<MAX_GUILDSKILL;i++)
  937. g->skill[i].id=i + GD_SKILLBASE;
  938. // Save to sql
  939. printf("Create initialize OK!\n");
  940. i=inter_guild_tosql(g,255);
  941. if (i<0) {
  942. mapif_guild_created(fd,account_id,NULL);
  943. return 0;
  944. }
  945. // Report to client
  946. mapif_guild_created(fd,account_id,g);
  947. mapif_guild_info(fd,g);
  948. if(log_inter)
  949. inter_log("guild %s (id=%d) created by master %s (id=%d)" RETCODE,
  950. name, g->guild_id, master->name, master->account_id );
  951. return 0;
  952. }
  953. // Return guild info to client
  954. int mapif_parse_GuildInfo(int fd,int guild_id)
  955. {
  956. struct guild * g = inter_guild_fromsql(guild_id);
  957. if(g!=NULL&&g->guild_id>0){
  958. guild_calcinfo(g);
  959. mapif_guild_info(fd,g);
  960. //inter_guild_tosql(g,1); // Change guild
  961. }else
  962. mapif_guild_noinfo(fd,guild_id);
  963. return 0;
  964. }
  965. // Add member to guild
  966. int mapif_parse_GuildAddMember(int fd,int guild_id,struct guild_member *m)
  967. {
  968. struct guild *g = inter_guild_fromsql(guild_id);
  969. int i;
  970. if(g==NULL||g->guild_id<=0){
  971. mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,1);
  972. return 0;
  973. }
  974. for(i=0;i<g->max_member;i++){
  975. if(g->member[i].account_id==0){
  976. memcpy(&g->member[i],m,sizeof(struct guild_member));
  977. mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,0);
  978. guild_calcinfo(g);
  979. mapif_guild_info(-1,g);
  980. inter_guild_tosql(g,3); // Change guild & guild_member
  981. return 0;
  982. }
  983. }
  984. mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,1);
  985. //inter_guild_tosql(g,3); // Change guild & guild_member
  986. return 0;
  987. }
  988. // Delete member from guild
  989. int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int flag,const char *mes)
  990. {
  991. struct guild *g= inter_guild_fromsql(guild_id);
  992. if(g!=NULL&&g->guild_id>0){
  993. int i;
  994. for(i=0;i<g->max_member;i++){
  995. if( g->member[i].account_id==account_id &&
  996. g->member[i].char_id==char_id){
  997. printf("%d %d\n",i, (int)(&g->member[i]));
  998. printf("%d %s\n",i, g->member[i].name);
  999. if(flag){ // 追放の場合追放リストに入れる
  1000. int j;
  1001. for(j=0;j<MAX_GUILDEXPLUSION;j++){
  1002. if(g->explusion[j].account_id==0)
  1003. break;
  1004. }
  1005. if(j==MAX_GUILDEXPLUSION){ // 一杯なので古いのを消す
  1006. for(j=0;j<MAX_GUILDEXPLUSION-1;j++)
  1007. g->explusion[j]=g->explusion[j+1];
  1008. j=MAX_GUILDEXPLUSION-1;
  1009. }
  1010. g->explusion[j].account_id=account_id;
  1011. memcpy(g->explusion[j].acc,"dummy",24);
  1012. memcpy(g->explusion[j].name,g->member[i].name,24);
  1013. memcpy(g->explusion[j].mes,mes,40);
  1014. }
  1015. mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes);
  1016. printf("%d %d\n",i, (int)(&g->member[i]));
  1017. printf("%d %s\n",i, (&g->member[i])->name);
  1018. memset(&g->member[i],0,sizeof(struct guild_member));
  1019. if( guild_check_empty(g)==0 )
  1020. mapif_guild_info(-1,g);// まだ人がいるのでデータ送信
  1021. /*
  1022. else
  1023. inter_guild_save(); // 解散したので一応セーブ
  1024. return 0;*/
  1025. }
  1026. }
  1027. guild_calcinfo(g);
  1028. inter_guild_tosql(g,19); // Change guild & guild_member & guild_expulsion
  1029. }else{
  1030. sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `account_id`='%d' AND `char_id`='%d'",char_db, account_id,char_id);
  1031. if(mysql_query(&mysql_handle, tmp_sql) ) {
  1032. printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
  1033. }
  1034. /* mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes); */
  1035. }
  1036. return 0;
  1037. }
  1038. // Change member info
  1039. int mapif_parse_GuildChangeMemberInfoShort(int fd,int guild_id,
  1040. int account_id,int char_id,int online,int lv,int class)
  1041. {
  1042. // Could speed up by manipulating only guild_member
  1043. struct guild * g= inter_guild_fromsql(guild_id);
  1044. int i,alv,c;
  1045. if(g==NULL||g->guild_id<=0)
  1046. return 0;
  1047. g->connect_member=0;
  1048. for(i=0,alv=0,c=0;i<g->max_member;i++){
  1049. if( g->member[i].account_id==account_id &&
  1050. g->member[i].char_id==char_id){
  1051. g->member[i].online=online;
  1052. g->member[i].lv=lv;
  1053. g->member[i].class=class;
  1054. mapif_guild_memberinfoshort(g,i);
  1055. }
  1056. if( g->member[i].account_id>0 ){
  1057. alv+=g->member[i].lv;
  1058. c++;
  1059. }
  1060. if( g->member[i].online )
  1061. g->connect_member++;
  1062. }
  1063. // 平均レベル
  1064. g->average_lv=alv/c;
  1065. inter_guild_tosql(g,3); // Change guild & guild_member
  1066. return 0;
  1067. }
  1068. // BreakGuild
  1069. int mapif_parse_BreakGuild(int fd,int guild_id)
  1070. {
  1071. struct guild *g= inter_guild_fromsql(guild_id);
  1072. if(g==NULL)
  1073. return 0;
  1074. // Delete guild from sql
  1075. //printf("- Delete guild %d from guild\n",guild_id);
  1076. sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
  1077. if(mysql_query(&mysql_handle, tmp_sql) ) {
  1078. printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
  1079. }
  1080. //printf("- Delete guild %d from guild_member\n",guild_id);
  1081. sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_member_db, guild_id);
  1082. if(mysql_query(&mysql_handle, tmp_sql) ) {
  1083. printf("DB server Error (delete `guild_member`)- %s\n", mysql_error(&mysql_handle) );
  1084. }
  1085. //printf("- Delete guild %d from guild_skill\n",guild_id);
  1086. sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_skill_db, guild_id);
  1087. if(mysql_query(&mysql_handle, tmp_sql) ) {
  1088. printf("DB server Error (delete `guild_skill`)- %s\n", mysql_error(&mysql_handle) );
  1089. }
  1090. //printf("- Delete guild %d from guild_position\n",guild_id);
  1091. sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_position_db, guild_id);
  1092. if(mysql_query(&mysql_handle, tmp_sql) ) {
  1093. printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
  1094. }
  1095. //printf("- Delete guild %d from guild_expulsion\n",guild_id);
  1096. sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, guild_id);
  1097. if(mysql_query(&mysql_handle, tmp_sql) ) {
  1098. printf("DB server Error (delete `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) );
  1099. }
  1100. //printf("- Delete guild %d from guild_alliance\n",guild_id);
  1101. sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'",guild_alliance_db, guild_id,guild_id);
  1102. if(mysql_query(&mysql_handle, tmp_sql) ) {
  1103. printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
  1104. }
  1105. //printf("- Delete guild %d from guild_castle\n",guild_id);
  1106. sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_castle_db, guild_id);
  1107. if(mysql_query(&mysql_handle, tmp_sql) ) {
  1108. printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
  1109. }
  1110. //printf("- Update guild %d of char\n",guild_id);
  1111. sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, guild_id);
  1112. if(mysql_query(&mysql_handle, tmp_sql) ) {
  1113. printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
  1114. }
  1115. inter_guild_storage_delete(guild_id);
  1116. mapif_guild_broken(guild_id,0);
  1117. if(log_inter)
  1118. inter_log("guild %s (id=%d) broken" RETCODE,g->name,guild_id);
  1119. return 0;
  1120. }
  1121. // ギルドメッセージ送信
  1122. int mapif_parse_GuildMessage(int fd,int guild_id,int account_id,char *mes,int len)
  1123. {
  1124. return mapif_guild_message(guild_id,account_id,mes,len);
  1125. }
  1126. // ギルド基本データ変更要求
  1127. int mapif_parse_GuildBasicInfoChange(int fd,int guild_id,
  1128. int type,const char *data,int len)
  1129. {
  1130. struct guild * g = inter_guild_fromsql(guild_id);
  1131. // int dd=*((int *)data);
  1132. short dw=*((short *)data);
  1133. if(g==NULL||g->guild_id<=0)
  1134. return 0;
  1135. switch(type){
  1136. case GBI_GUILDLV: {
  1137. printf("GBI_GUILDLV\n");
  1138. if(dw>0 && g->guild_lv+dw<=50){
  1139. g->guild_lv+=dw;
  1140. g->skill_point+=dw;
  1141. }else if(dw<0 && g->guild_lv+dw>=1)
  1142. g->guild_lv+=dw;
  1143. mapif_guild_info(-1,g);
  1144. inter_guild_tosql(g,1);
  1145. } return 0;
  1146. default:
  1147. printf("int_guild: GuildBasicInfoChange: Unknown type %d\n",type);
  1148. break;
  1149. }
  1150. mapif_guild_basicinfochanged(guild_id,type,data,len);
  1151. //inter_guild_tosql(g,1); // Change guild
  1152. return 0;
  1153. }
  1154. // ギルドメンバデータ変更要求
  1155. int mapif_parse_GuildMemberInfoChange(int fd,int guild_id,int account_id,int char_id,
  1156. int type,const char *data,int len)
  1157. {
  1158. // Could make some improvement in speed, because only change guild_member
  1159. int i;
  1160. struct guild * g = inter_guild_fromsql(guild_id);
  1161. //printf("GuildMemberInfoChange %s \n",(type==GMI_EXP)?"GMI_EXP":"OTHER");
  1162. if(g==NULL){
  1163. return 0;
  1164. }
  1165. for(i=0;i<g->max_member;i++)
  1166. if( g->member[i].account_id==account_id &&
  1167. g->member[i].char_id==char_id )
  1168. break;
  1169. if(i==g->max_member){
  1170. printf("int_guild: GuildMemberChange: Not found %d,%d in %d[%s]\n",
  1171. account_id,char_id,guild_id,g->name);
  1172. return 0;
  1173. }
  1174. switch(type){
  1175. case GMI_POSITION: // 役職
  1176. g->member[i].position=*((int *)data);
  1177. break;
  1178. case GMI_EXP: { // EXP
  1179. int exp,oldexp=g->member[i].exp;
  1180. exp=g->member[i].exp=*((unsigned int *)data);
  1181. g->exp+=(exp-oldexp);
  1182. guild_calcinfo(g); // Lvアップ判断
  1183. mapif_guild_basicinfochanged(guild_id,GBI_EXP,&g->exp,4);
  1184. }break;
  1185. default:
  1186. printf("int_guild: GuildMemberInfoChange: Unknown type %d\n",type);
  1187. break;
  1188. }
  1189. mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
  1190. inter_guild_tosql(g,3); // Change guild & guild_member
  1191. return 0;
  1192. }
  1193. // ギルド役職名変更要求
  1194. int mapif_parse_GuildPosition(int fd,int guild_id,int idx,struct guild_position *p)
  1195. {
  1196. // Could make some improvement in speed, because only change guild_position
  1197. struct guild * g = inter_guild_fromsql(guild_id);
  1198. if(g==NULL || idx<0 || idx>=MAX_GUILDPOSITION){
  1199. return 0;
  1200. }
  1201. memcpy(&g->position[idx],p,sizeof(struct guild_position));
  1202. mapif_guild_position(g,idx);
  1203. printf("int_guild: position changed %d\n",idx);
  1204. inter_guild_tosql(g,4); // Change guild_position
  1205. return 0;
  1206. }
  1207. // ギルドスキルアップ要求
  1208. int mapif_parse_GuildSkillUp(int fd,int guild_id,int skill_num,int account_id)
  1209. {
  1210. // Could make some improvement in speed, because only change guild_position
  1211. struct guild *g = inter_guild_fromsql(guild_id);
  1212. int idx = skill_num - GD_SKILLBASE;
  1213. if(g == NULL || idx < 0 || idx >= MAX_GUILDSKILL)
  1214. return 0;
  1215. //printf("GuildSkillUp\n");
  1216. if( g->skill_point>0 && g->skill[idx].id>0 &&
  1217. g->skill[idx].lv<10 ){
  1218. g->skill[idx].lv++;
  1219. g->skill_point--;
  1220. if(guild_calcinfo(g)==0)
  1221. mapif_guild_info(-1,g);
  1222. mapif_guild_skillupack(guild_id,skill_num,account_id);
  1223. printf("int_guild: skill %d up\n",skill_num);
  1224. inter_guild_tosql(g,33); // Change guild & guild_skill
  1225. }
  1226. return 0;
  1227. }
  1228. // ギルド同盟要求
  1229. int mapif_parse_GuildAlliance(int fd,int guild_id1,int guild_id2,
  1230. int account_id1,int account_id2,int flag)
  1231. {
  1232. // Could speed up
  1233. struct guild *g[2];
  1234. int j,i;
  1235. g[0]= inter_guild_fromsql(guild_id1);
  1236. g[1]= inter_guild_fromsql(guild_id2);
  1237. if(g[0]==NULL || g[1]==NULL || g[0]->guild_id ==0 || g[1]->guild_id==0)
  1238. return 0;
  1239. if(!(flag&0x8)){
  1240. for(i=0;i<2-(flag&1);i++){
  1241. for(j=0;j<MAX_GUILDALLIANCE;j++)
  1242. if(g[i]->alliance[j].guild_id==0){
  1243. g[i]->alliance[j].guild_id=g[1-i]->guild_id;
  1244. memcpy(g[i]->alliance[j].name,g[1-i]->name,24);
  1245. g[i]->alliance[j].opposition=flag&1;
  1246. break;
  1247. }
  1248. }
  1249. }else{ // 関係解消
  1250. for(i=0;i<2-(flag&1);i++){
  1251. for(j=0;j<MAX_GUILDALLIANCE;j++)
  1252. if( g[i]->alliance[j].guild_id==g[1-i]->guild_id &&
  1253. g[i]->alliance[j].opposition==(flag&1)){
  1254. g[i]->alliance[j].guild_id=0;
  1255. break;
  1256. }
  1257. }
  1258. }
  1259. mapif_guild_alliance(guild_id1,guild_id2,account_id1,account_id2,flag,
  1260. g[0]->name,g[1]->name);
  1261. inter_guild_tosql(g[0],8); // Change guild_alliance
  1262. inter_guild_tosql(g[1],8); // Change guild_alliance
  1263. return 0;
  1264. }
  1265. // ギルド告知変更要求
  1266. int mapif_parse_GuildNotice(int fd,int guild_id,const char *mes1,const char *mes2)
  1267. {
  1268. struct guild *g= inter_guild_fromsql(guild_id);
  1269. if(g==NULL||g->guild_id<=0)
  1270. return 0;
  1271. memcpy(g->mes1,mes1,60);
  1272. memcpy(g->mes2,mes2,120);
  1273. inter_guild_tosql(g,1); // Change mes of guild
  1274. return mapif_guild_notice(g);
  1275. }
  1276. // ギルドエンブレム変更要求
  1277. int mapif_parse_GuildEmblem(int fd,int len,int guild_id,int dummy,const char *data)
  1278. {
  1279. struct guild * g= inter_guild_fromsql(guild_id);
  1280. if(g==NULL||g->guild_id<=0)
  1281. return 0;
  1282. memcpy(g->emblem_data,data,len);
  1283. g->emblem_len=len;
  1284. g->emblem_id++;
  1285. inter_guild_tosql(g,1); // Change guild
  1286. return mapif_guild_emblem(g);
  1287. }
  1288. int mapif_parse_GuildCastleDataLoad(int fd,int castle_id,int index) // <Agit>
  1289. {
  1290. struct guild_castle *gc=guildcastle_pt;
  1291. inter_guildcastle_fromsql(castle_id, gc);
  1292. if(gc==NULL||gc->castle_id==-1){
  1293. return mapif_guild_castle_dataload(castle_id,0,0);
  1294. }
  1295. switch(index){
  1296. case 1: return mapif_guild_castle_dataload(gc->castle_id,index,gc->guild_id); break;
  1297. case 2: return mapif_guild_castle_dataload(gc->castle_id,index,gc->economy); break;
  1298. case 3: return mapif_guild_castle_dataload(gc->castle_id,index,gc->defense); break;
  1299. case 4: return mapif_guild_castle_dataload(gc->castle_id,index,gc->triggerE); break;
  1300. case 5: return mapif_guild_castle_dataload(gc->castle_id,index,gc->triggerD); break;
  1301. case 6: return mapif_guild_castle_dataload(gc->castle_id,index,gc->nextTime); break;
  1302. case 7: return mapif_guild_castle_dataload(gc->castle_id,index,gc->payTime); break;
  1303. case 8: return mapif_guild_castle_dataload(gc->castle_id,index,gc->createTime); break;
  1304. case 9: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleC); break;
  1305. case 10: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG0); break;
  1306. case 11: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG1); break;
  1307. case 12: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG2); break;
  1308. case 13: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG3); break;
  1309. case 14: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG4); break;
  1310. case 15: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG5); break;
  1311. case 16: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG6); break;
  1312. case 17: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG7); break;
  1313. case 18: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp0); break; // guardian HP [Valaris]
  1314. case 19: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp1); break;
  1315. case 20: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp2); break;
  1316. case 21: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp3); break;
  1317. case 22: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp4); break;
  1318. case 23: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp5); break;
  1319. case 24: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp6); break;
  1320. case 25: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp7); break; // end additions [Valaris]
  1321. default:
  1322. printf("mapif_parse_GuildCastleDataLoad ERROR!! (Not found index=%d)\n", index);
  1323. return 0;
  1324. }
  1325. }
  1326. int mapif_parse_GuildCastleDataSave(int fd,int castle_id,int index,int value) // <Agit>
  1327. {
  1328. struct guild_castle *gc=guildcastle_pt;
  1329. inter_guildcastle_fromsql(castle_id, gc);
  1330. if(gc==NULL||gc->castle_id==-1){
  1331. return mapif_guild_castle_datasave(castle_id,index,value);
  1332. }
  1333. switch(index){
  1334. case 1:
  1335. if( gc->guild_id!=value ){
  1336. int gid=(value)?value:gc->guild_id;
  1337. struct guild *g=inter_guild_fromsql(gid);
  1338. if(log_inter)
  1339. inter_log("guild %s (id=%d) %s castle id=%d" RETCODE,
  1340. (g)?g->name:"??" ,gid, (value)?"occupy":"abandon", index);
  1341. }
  1342. gc->guild_id = value;
  1343. break;
  1344. case 2: gc->economy = value; break;
  1345. case 3: gc->defense = value; break;
  1346. case 4: gc->triggerE = value; break;
  1347. case 5: gc->triggerD = value; break;
  1348. case 6: gc->nextTime = value; break;
  1349. case 7: gc->payTime = value; break;
  1350. case 8: gc->createTime = value; break;
  1351. case 9: gc->visibleC = value; break;
  1352. case 10: gc->visibleG0 = value; break;
  1353. case 11: gc->visibleG1 = value; break;
  1354. case 12: gc->visibleG2 = value; break;
  1355. case 13: gc->visibleG3 = value; break;
  1356. case 14: gc->visibleG4 = value; break;
  1357. case 15: gc->visibleG5 = value; break;
  1358. case 16: gc->visibleG6 = value; break;
  1359. case 17: gc->visibleG7 = value; break;
  1360. case 18: gc->Ghp0 = value; break; // guardian HP [Valaris]
  1361. case 19: gc->Ghp1 = value; break;
  1362. case 20: gc->Ghp2 = value; break;
  1363. case 21: gc->Ghp3 = value; break;
  1364. case 22: gc->Ghp4 = value; break;
  1365. case 23: gc->Ghp5 = value; break;
  1366. case 24: gc->Ghp6 = value; break;
  1367. case 25: gc->Ghp7 = value; break; // end additions [Valaris]
  1368. default:
  1369. printf("mapif_parse_GuildCastleDataSave ERROR!! (Not found index=%d)\n", index);
  1370. return 0;
  1371. }
  1372. inter_guildcastle_tosql(gc);
  1373. return mapif_guild_castle_datasave(gc->castle_id,index,value);
  1374. }
  1375. // ギルドチェック要求
  1376. int mapif_parse_GuildCheck(int fd,int guild_id,int account_id,int char_id)
  1377. {
  1378. // What does this mean? Check if belong to another guild?
  1379. return 0;
  1380. }
  1381. // map server からの通信
  1382. // ・1パケットのみ解析すること
  1383. // ・パケット長データはinter.cにセットしておくこと
  1384. // ・パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない
  1385. // ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない
  1386. int inter_guild_parse_frommap(int fd)
  1387. {
  1388. switch(RFIFOW(fd,0)){
  1389. case 0x3030: mapif_parse_CreateGuild(fd,RFIFOL(fd,4),RFIFOP(fd,8),(struct guild_member *)RFIFOP(fd,32)); break;
  1390. case 0x3031: mapif_parse_GuildInfo(fd,RFIFOL(fd,2)); break;
  1391. case 0x3032: mapif_parse_GuildAddMember(fd,RFIFOL(fd,4),(struct guild_member *)RFIFOP(fd,8)); break;
  1392. case 0x3034: mapif_parse_GuildLeave(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOP(fd,15)); break;
  1393. case 0x3035: mapif_parse_GuildChangeMemberInfoShort(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOW(fd,15),RFIFOW(fd,17)); break;
  1394. case 0x3036: mapif_parse_BreakGuild(fd,RFIFOL(fd,2)); break;
  1395. case 0x3037: mapif_parse_GuildMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12); break;
  1396. case 0x3038: mapif_parse_GuildCheck(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10)); break;
  1397. case 0x3039: mapif_parse_GuildBasicInfoChange(fd,RFIFOL(fd,4),RFIFOW(fd,8),RFIFOP(fd,10),RFIFOW(fd,2)-10); break;
  1398. case 0x303A: mapif_parse_GuildMemberInfoChange(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOL(fd,12),RFIFOW(fd,16),RFIFOP(fd,18),RFIFOW(fd,2)-18); break;
  1399. case 0x303B: mapif_parse_GuildPosition(fd,RFIFOL(fd,4),RFIFOL(fd,8),(struct guild_position *)RFIFOP(fd,12)); break;
  1400. case 0x303C: mapif_parse_GuildSkillUp(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10)); break;
  1401. case 0x303D: mapif_parse_GuildAlliance(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOL(fd,14),RFIFOB(fd,18)); break;
  1402. case 0x303E: mapif_parse_GuildNotice(fd,RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,66)); break;
  1403. case 0x303F: mapif_parse_GuildEmblem(fd,RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12)); break;
  1404. case 0x3040: mapif_parse_GuildCastleDataLoad(fd,RFIFOW(fd,2),RFIFOB(fd,4)); break;
  1405. case 0x3041: mapif_parse_GuildCastleDataSave(fd,RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5)); break;
  1406. default:
  1407. return 0;
  1408. }
  1409. return 1;
  1410. }
  1411. int inter_guild_mapif_init(int fd)
  1412. {
  1413. return mapif_guild_castle_alldataload(fd);
  1414. }
  1415. // サーバーから脱退要求(キャラ削除用)
  1416. int inter_guild_leave(int guild_id,int account_id,int char_id)
  1417. {
  1418. return mapif_parse_GuildLeave(-1,guild_id,account_id,char_id,0,"**サーバー命令**");
  1419. }