int_party.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752
  1. //
  2. // original code from athena
  3. // SQL conversion by hack
  4. //
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include "char.h"
  9. #include "../common/strlib.h"
  10. #include "socket.h"
  11. static struct party *party_pt;
  12. static int party_newid=100;
  13. int mapif_party_broken(int party_id,int flag);
  14. int party_check_empty(struct party *p);
  15. int mapif_parse_PartyLeave(int fd,int party_id,int account_id);
  16. #define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
  17. // Save party to mysql
  18. int inter_party_tosql(int party_id,struct party *p)
  19. {
  20. // 'party' ('party_id','name','exp','item','leader')
  21. char t_name[100];
  22. char t_member[24];
  23. int party_member = 0, party_online_member = 0;
  24. int party_exist = 0;
  25. int leader_id = 0;
  26. int i = 0;
  27. printf("(\033[1;64m%d\033[0m) Request save party - ",party_id);
  28. jstrescapecpy(t_name, p->name);
  29. if (p==NULL || party_id==0 || p->party_id ==0 || party_id!=p->party_id) {
  30. printf("- Party pointer or party_id error \n");
  31. return 0;
  32. }
  33. // Check if party exists
  34. sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `party_id`='%d'",party_db, party_id); // TBR
  35. if(mysql_query(&mysql_handle, tmp_sql) ) {
  36. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  37. return 0;
  38. }
  39. sql_res = mysql_store_result(&mysql_handle) ;
  40. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  41. sql_row = mysql_fetch_row(sql_res);
  42. party_exist = atoi (sql_row[0]);
  43. //printf("- Check if party %d exists : %s\n",party_id,party_exist==0?"No":"Yes");
  44. }
  45. mysql_free_result(sql_res) ; //resource free
  46. if (party_exist >0){
  47. // Check members in party
  48. sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `party_id`='%d'",char_db, party_id); // TBR
  49. if(mysql_query(&mysql_handle, tmp_sql) ) {
  50. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  51. return 0;
  52. }
  53. sql_res = mysql_store_result(&mysql_handle) ;
  54. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  55. sql_row = mysql_fetch_row(sql_res);
  56. party_member = atoi (sql_row[0]);
  57. // printf("- Check members in party %d : %d \n",party_id,party_member);
  58. }
  59. mysql_free_result(sql_res) ; //resource free
  60. party_online_member = 0;
  61. i=0;
  62. while (i<MAX_PARTY){
  63. if (p->member[i].account_id>0) party_online_member++;
  64. i++;
  65. }
  66. //if (party_online_member==0) printf("- No member online \n"); else printf("- Some member %d online \n", party_online_member);
  67. if (party_member <= 0 && party_online_member == 0) {
  68. // Delete the party, if has no member.
  69. sprintf(tmp_sql,"DELETE FROM `%s` WHERE `party_id`='%d'",party_db, party_id);
  70. if(mysql_query(&mysql_handle, tmp_sql) ) {
  71. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  72. }
  73. // printf("No member in party %d, break it \n",party_id);
  74. memset(p, 0, sizeof(struct party));
  75. return 0;
  76. } else {
  77. // Update party information, if exists
  78. int i=0;
  79. for (i=0;i<MAX_PARTY;i++){
  80. if (p->member[i].account_id>0){
  81. sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='%d' WHERE `account_id`='%d' AND `name`='%s'",
  82. char_db, party_id, p->member[i].account_id,jstrescapecpy(t_member,p->member[i].name));
  83. //printf("%s",tmp_sql);
  84. if(mysql_query(&mysql_handle, tmp_sql) ) {
  85. printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
  86. }
  87. }
  88. }
  89. sprintf(tmp_sql,"UPDATE `%s` SET `name`='%s', `exp`='%d', `item`='%d', `leader_id`=`leader_id` WHERE `party_id`='%d'",
  90. party_db, t_name,p->exp,p->item,party_id);
  91. if(mysql_query(&mysql_handle, tmp_sql) ) {
  92. printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) );
  93. }
  94. // printf("- Update party %d information \n",party_id);
  95. }
  96. } else {
  97. // Add new party, if not exist
  98. int i = 0;
  99. while (i<MAX_PARTY&&((p->member[i].account_id>0&&p->member[i].leader==0)||(p->member[i].account_id<0))) i++;
  100. if (i<MAX_PARTY) leader_id = p->member[i].account_id;
  101. sprintf(tmp_sql,"INSERT INTO `%s` (`party_id`, `name`, `exp`, `item`, `leader_id`) VALUES ('%d', '%s', '%d', '%d', '%d')",
  102. party_db, party_id, t_name, p->exp, p->item,leader_id);
  103. if(mysql_query(&mysql_handle, tmp_sql) ) {
  104. printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) );
  105. return 0;
  106. }
  107. sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='%d' WHERE `account_id`='%d' AND `name`='%s'",
  108. char_db, party_id,leader_id, jstrescapecpy(t_member,p->member[i].name));
  109. if(mysql_query(&mysql_handle, tmp_sql) ) {
  110. printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) );
  111. }
  112. //printf("- Insert new party %d \n",party_id);
  113. }
  114. printf("Party save success\n");
  115. return 0;
  116. }
  117. // Read party from mysql
  118. int inter_party_fromsql(int party_id,struct party *p)
  119. {
  120. int leader_id=0;
  121. printf("(\033[1;64m%d\033[0m) Request load party - ",party_id);
  122. memset(p, 0, sizeof(struct party));
  123. sprintf(tmp_sql,"SELECT `party_id`, `name`,`exp`,`item`, `leader_id` FROM `%s` WHERE `party_id`='%d'",party_db, party_id); // TBR
  124. if(mysql_query(&mysql_handle, tmp_sql) ) {
  125. printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
  126. return 0;
  127. }
  128. sql_res = mysql_store_result(&mysql_handle) ;
  129. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  130. sql_row = mysql_fetch_row(sql_res);
  131. // printf("- Read party %d from MySQL\n",party_id);
  132. p->party_id = party_id;
  133. strcpy(p->name, sql_row[1]);
  134. p->exp = atoi(sql_row[2]);
  135. p->item = atoi(sql_row[3]);
  136. leader_id = atoi(sql_row[4]);
  137. } else {
  138. mysql_free_result(sql_res);
  139. // printf("- Cannot find party %d \n",party_id);
  140. return 0;
  141. }
  142. mysql_free_result(sql_res);
  143. // Load members
  144. sprintf(tmp_sql,"SELECT `account_id`, `name`,`base_level`,`last_map`,`online` FROM `%s` WHERE `party_id`='%d'",char_db, party_id); // TBR
  145. if(mysql_query(&mysql_handle, tmp_sql) ) {
  146. printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
  147. return 0;
  148. }
  149. sql_res = mysql_store_result(&mysql_handle) ;
  150. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  151. int i;
  152. for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
  153. struct party_member *m = &p->member[i];
  154. m->account_id = atoi(sql_row[0]);
  155. if (m->account_id == leader_id) m->leader = 1; else m->leader = 0;
  156. strncpy(m->name,sql_row[1],sizeof(m->name));
  157. m->lv = atoi(sql_row[2]);
  158. strncpy(m->map,sql_row[3],sizeof(m->map));
  159. m->online = atoi(sql_row[4]);
  160. }
  161. // printf("- %d members found in party %d \n",i,party_id);
  162. }
  163. mysql_free_result(sql_res);
  164. printf("Party load success\n");
  165. return 0;
  166. }
  167. int inter_party_sql_init(){
  168. int i;
  169. //memory alloc
  170. printf("interserver party memory initialize.... (%d byte)\n",sizeof(struct party));
  171. party_pt = aCalloc(sizeof(struct party), 1);
  172. sprintf (tmp_sql , "SELECT count(*) FROM `%s`",party_db);
  173. if(mysql_query(&mysql_handle, tmp_sql) ) {
  174. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  175. }
  176. sql_res = mysql_store_result(&mysql_handle) ;
  177. sql_row = mysql_fetch_row(sql_res);
  178. printf("total party data -> '%s'.......\n",sql_row[0]);
  179. i = atoi (sql_row[0]);
  180. mysql_free_result(sql_res);
  181. if (i > 0) {
  182. //set party_newid
  183. sprintf (tmp_sql , "SELECT max(`party_id`) FROM `%s`", party_db);
  184. if(mysql_query(&mysql_handle, tmp_sql) ) {
  185. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  186. }
  187. sql_res = mysql_store_result(&mysql_handle) ;
  188. sql_row = mysql_fetch_row(sql_res);
  189. party_newid = atoi (sql_row[0])+1;
  190. mysql_free_result(sql_res);
  191. }
  192. printf("set party_newid: %d.......\n",party_newid);
  193. return 0;
  194. }
  195. // Search for the party according to its name
  196. struct party* search_partyname(char *str)
  197. {
  198. struct party *p=NULL;
  199. int leader_id = 0;
  200. char t_name[24];
  201. sprintf(tmp_sql,"SELECT `party_id`, `name`,`exp`,`item`,`leader_id` FROM `%s` WHERE `name`='%s'",party_db, jstrescapecpy(t_name,str));
  202. if(mysql_query(&mysql_handle, tmp_sql) ) {
  203. printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
  204. }
  205. sql_res = mysql_store_result(&mysql_handle) ;
  206. if (sql_res==NULL || mysql_num_rows(sql_res)<=0) { mysql_free_result(sql_res); return p; }
  207. sql_row = mysql_fetch_row(sql_res);
  208. p = party_pt;
  209. p->party_id = atoi(sql_row[0]);
  210. strcpy(p->name, sql_row[1]);
  211. p->exp = atoi(sql_row[2]);
  212. p->item = atoi(sql_row[3]);
  213. leader_id = atoi(sql_row[4]);
  214. mysql_free_result(sql_res);
  215. // Load members
  216. sprintf(tmp_sql,"SELECT `account_id`, `name`,`base_level`,`last_map`,`online` FROM `%s` WHERE `party_id`='%d'",char_db, p->party_id);
  217. if(mysql_query(&mysql_handle, tmp_sql) ) {
  218. printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
  219. return 0;
  220. }
  221. sql_res = mysql_store_result(&mysql_handle) ;
  222. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  223. int i;
  224. for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
  225. struct party_member *m = &p->member[i];
  226. m->account_id = atoi(sql_row[0]);
  227. if (m->account_id == leader_id) m->leader = 1; else m->leader = 0;
  228. strncpy(m->name,sql_row[1],sizeof(m->name));
  229. m->lv = atoi(sql_row[2]);
  230. strncpy(m->map,sql_row[3],sizeof(m->map));
  231. m->online = atoi(sql_row[4]);
  232. }
  233. printf("- %d members found in party %d \n",i,p->party_id);
  234. }
  235. mysql_free_result(sql_res);
  236. return p;
  237. }
  238. // EXP公平分配できるかチェック
  239. int party_check_exp_share(struct party *p)
  240. {
  241. int i;
  242. int maxlv=0,minlv=0x7fffffff;
  243. for(i=0;i<MAX_PARTY;i++){
  244. int lv=p->member[i].lv;
  245. if( p->member[i].online ){
  246. if( lv < minlv ) minlv=lv;
  247. if( maxlv < lv ) maxlv=lv;
  248. }
  249. }
  250. return (maxlv==0 || maxlv-minlv<=party_share_level);
  251. }
  252. // Is there any member in the party?
  253. int party_check_empty(struct party *p)
  254. {
  255. int i;
  256. if (p==NULL||p->party_id==0) return 1;
  257. // printf("party check empty %08X\n",(int)p);
  258. for(i=0;i<MAX_PARTY;i++){
  259. // printf("%d acc=%d\n",i,p->member[i].account_id);
  260. if(p->member[i].account_id>0){
  261. return 0;
  262. }
  263. }
  264. // If there is no member, then break the party
  265. mapif_party_broken(p->party_id,0);
  266. inter_party_tosql(p->party_id,p);
  267. return 1;
  268. }
  269. // Check if a member is in two party, not necessary :)
  270. int party_check_conflict(int party_id,int account_id,char *nick)
  271. {
  272. return 0;
  273. }
  274. //-------------------------------------------------------------------
  275. // map serverへの通信
  276. // パーティ作成可否
  277. int mapif_party_created(int fd,int account_id,struct party *p)
  278. {
  279. WFIFOW(fd,0)=0x3820;
  280. WFIFOL(fd,2)=account_id;
  281. if(p!=NULL){
  282. WFIFOB(fd,6)=0;
  283. WFIFOL(fd,7)=p->party_id;
  284. memcpy(WFIFOP(fd,11),p->name,24);
  285. printf("int_party: created! %d %s\n",p->party_id,p->name);
  286. }else{
  287. WFIFOB(fd,6)=1;
  288. WFIFOL(fd,7)=0;
  289. memcpy(WFIFOP(fd,11),"error",24);
  290. }
  291. WFIFOSET(fd,35);
  292. return 0;
  293. }
  294. // パーティ情報見つからず
  295. int mapif_party_noinfo(int fd,int party_id)
  296. {
  297. WFIFOW(fd,0)=0x3821;
  298. WFIFOW(fd,2)=8;
  299. WFIFOL(fd,4)=party_id;
  300. WFIFOSET(fd,8);
  301. printf("int_party: info not found %d\n",party_id);
  302. return 0;
  303. }
  304. // パーティ情報まとめ送り
  305. int mapif_party_info(int fd,struct party *p)
  306. {
  307. unsigned char buf[1024];
  308. WBUFW(buf,0)=0x3821;
  309. memcpy(buf+4,p,sizeof(struct party));
  310. WBUFW(buf,2)=4+sizeof(struct party);
  311. if(fd<0)
  312. mapif_sendall(buf,WBUFW(buf,2));
  313. else
  314. mapif_send(fd,buf,WBUFW(buf,2));
  315. // printf("int_party: info %d %s\n",p->party_id,p->name);
  316. return 0;
  317. }
  318. // パーティメンバ追加可否
  319. int mapif_party_memberadded(int fd,int party_id,int account_id,int flag)
  320. {
  321. WFIFOW(fd,0)=0x3822;
  322. WFIFOL(fd,2)=party_id;
  323. WFIFOL(fd,6)=account_id;
  324. WFIFOB(fd,10)=flag;
  325. WFIFOSET(fd,11);
  326. return 0;
  327. }
  328. // パーティ設定変更通知
  329. int mapif_party_optionchanged(int fd,struct party *p,int account_id,int flag)
  330. {
  331. unsigned char buf[16];
  332. WBUFW(buf,0)=0x3823;
  333. WBUFL(buf,2)=p->party_id;
  334. WBUFL(buf,6)=account_id;
  335. WBUFW(buf,10)=p->exp;
  336. WBUFW(buf,12)=p->item;
  337. WBUFB(buf,14)=flag;
  338. if(flag==0)
  339. mapif_sendall(buf,15);
  340. else
  341. mapif_send(fd,buf,15);
  342. //printf("int_party: option changed %d %d %d %d %d\n",p->party_id,account_id,p->exp,p->item,flag);
  343. return 0;
  344. }
  345. // パーティ脱退通知
  346. int mapif_party_leaved(int party_id,int account_id,char *name)
  347. {
  348. unsigned char buf[64];
  349. WBUFW(buf,0)=0x3824;
  350. WBUFL(buf,2)=party_id;
  351. WBUFL(buf,6)=account_id;
  352. memcpy(WBUFP(buf,10),name,24);
  353. mapif_sendall(buf,34);
  354. //printf("int_party: party leaved %d %d %s\n",party_id,account_id,name);
  355. return 0;
  356. }
  357. // パーティマップ更新通知
  358. int mapif_party_membermoved(struct party *p,int idx)
  359. {
  360. unsigned char buf[32];
  361. WBUFW(buf,0)=0x3825;
  362. WBUFL(buf,2)=p->party_id;
  363. WBUFL(buf,6)=p->member[idx].account_id;
  364. memcpy(WBUFP(buf,10),p->member[idx].map,16);
  365. WBUFB(buf,26)=p->member[idx].online;
  366. WBUFW(buf,27)=p->member[idx].lv;
  367. mapif_sendall(buf,29);
  368. return 0;
  369. }
  370. // パーティ解散通知
  371. int mapif_party_broken(int party_id,int flag)
  372. {
  373. unsigned char buf[16];
  374. WBUFW(buf,0)=0x3826;
  375. WBUFL(buf,2)=party_id;
  376. WBUFB(buf,6)=flag;
  377. mapif_sendall(buf,7);
  378. //printf("int_party: broken %d\n",party_id);
  379. return 0;
  380. }
  381. // パーティ内発言
  382. int mapif_party_message(int party_id,int account_id,char *mes,int len, int sfd)
  383. {
  384. unsigned char buf[512];
  385. WBUFW(buf,0)=0x3827;
  386. WBUFW(buf,2)=len+12;
  387. WBUFL(buf,4)=party_id;
  388. WBUFL(buf,8)=account_id;
  389. memcpy(WBUFP(buf,12),mes,len);
  390. mapif_sendallwos(sfd, buf,len+12);
  391. return 0;
  392. }
  393. //-------------------------------------------------------------------
  394. // map serverからの通信
  395. // Create Party
  396. int mapif_parse_CreateParty(int fd,int account_id,char *name,char *nick,char *map,int lv)
  397. {
  398. struct party *p;
  399. if( (p=search_partyname(name))!=NULL){
  400. // printf("int_party: same name party exists [%s]\n",name);
  401. mapif_party_created(fd,account_id,NULL);
  402. return 0;
  403. }
  404. p=party_pt;
  405. if(p==NULL){
  406. printf("int_party: out of memory !\n");
  407. mapif_party_created(fd,account_id,NULL);
  408. return 0;
  409. }
  410. memset(p,0,sizeof(struct party));
  411. p->party_id=party_newid++;
  412. memcpy(p->name,name,24);
  413. p->exp=0;
  414. p->item=0;
  415. p->member[0].account_id=account_id;
  416. memcpy(p->member[0].name,nick,24);
  417. memcpy(p->member[0].map,map,16);
  418. p->member[0].leader=1;
  419. p->member[0].online=1;
  420. p->member[0].lv=lv;
  421. inter_party_tosql(p->party_id,p);
  422. mapif_party_created(fd,account_id,p);
  423. mapif_party_info(fd,p);
  424. return 0;
  425. }
  426. // パーティ情報要求
  427. int mapif_parse_PartyInfo(int fd,int party_id)
  428. {
  429. struct party *p = party_pt;
  430. if(p==NULL){
  431. printf("int_party: out of memory !\n");
  432. return 0;
  433. }
  434. inter_party_fromsql(party_id, p);
  435. if(p->party_id >= 0)
  436. mapif_party_info(fd,p);
  437. else
  438. mapif_party_noinfo(fd,party_id);
  439. return 0;
  440. }
  441. // パーティ追加要求
  442. int mapif_parse_PartyAddMember(int fd,int party_id,int account_id,char *nick,char *map,int lv)
  443. {
  444. struct party *p;
  445. int i;
  446. p = party_pt;
  447. if(p==NULL){
  448. printf("int_party: out of memory !\n");
  449. return 0;
  450. }
  451. inter_party_fromsql(party_id, p);
  452. if(p->party_id <= 0){
  453. mapif_party_memberadded(fd,party_id,account_id,1);
  454. return 0;
  455. }
  456. for(i=0;i<MAX_PARTY;i++){
  457. if(p->member[i].account_id==0){
  458. int flag=0;
  459. p->member[i].account_id=account_id;
  460. memcpy(p->member[i].name,nick,24);
  461. memcpy(p->member[i].map,map,16);
  462. p->member[i].leader=0;
  463. p->member[i].online=1;
  464. p->member[i].lv=lv;
  465. mapif_party_memberadded(fd,party_id,account_id,0);
  466. mapif_party_info(-1,p);
  467. if( p->exp>0 && !party_check_exp_share(p) ){
  468. p->exp=0;
  469. flag=0x01;
  470. }
  471. if(flag)
  472. mapif_party_optionchanged(fd,p,0,0);
  473. inter_party_tosql(party_id, p);
  474. return 0;
  475. }
  476. }
  477. mapif_party_memberadded(fd,party_id,account_id,1);
  478. //inter_party_tosql(party_id, p);
  479. return 0;
  480. }
  481. // パーティー設定変更要求
  482. int mapif_parse_PartyChangeOption(int fd,int party_id,int account_id,int exp,int item)
  483. {
  484. struct party *p;
  485. int flag=0;
  486. p = party_pt;
  487. if(p==NULL){
  488. printf("int_party: out of memory !\n");
  489. return 0;
  490. }
  491. inter_party_fromsql(party_id, p);
  492. if(p->party_id <= 0){
  493. return 0;
  494. }
  495. p->exp=exp;
  496. if( exp>0 && !party_check_exp_share(p) ){
  497. flag|=0x01;
  498. p->exp=0;
  499. }
  500. p->item=item;
  501. mapif_party_optionchanged(fd,p,account_id,flag);
  502. inter_party_tosql(party_id, p);
  503. return 0;
  504. }
  505. // パーティ脱退要求
  506. int mapif_parse_PartyLeave(int fd,int party_id,int account_id)
  507. {
  508. char t_member[24];
  509. struct party *p = party_pt;
  510. if(p==NULL){
  511. printf("int_party: out of memory !\n");
  512. return 0;
  513. }
  514. inter_party_fromsql(party_id, p);
  515. if(p->party_id >= 0){
  516. int i,j;
  517. for(i=0;i<MAX_PARTY;i++){
  518. if(p->member[i].account_id==account_id){
  519. //printf("p->member[i].account_id = %d , account_id = %d \n",p->member[i].account_id,account_id);
  520. mapif_party_leaved(party_id,account_id,p->member[i].name);
  521. // Update char information, does the name need encoding?
  522. sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `name`='%s'",
  523. char_db, party_id, jstrescapecpy(t_member,p->member[i].name));
  524. if(mysql_query(&mysql_handle, tmp_sql) ) {
  525. printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
  526. }
  527. // printf("Delete member %s from MySQL \n", p->member[i].name);
  528. if (p->member[i].leader==1){
  529. for(j=0;j<MAX_PARTY;j++)
  530. {
  531. //printf("j = %d , p->member[j].account_id = %d , p->member[j].account_id = %d \n",j,p->member[j].account_id,p->member[j].account_id);
  532. if(p->member[j].account_id>0&&j!=i){
  533. mapif_party_leaved(party_id,p->member[j].account_id,p->member[j].name);
  534. // Update char information, does the name need encoding?
  535. sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `name`='%s'",
  536. char_db, party_id, jstrescapecpy(t_member,p->member[i].name));
  537. if(mysql_query(&mysql_handle, tmp_sql) ) {
  538. printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
  539. }
  540. // printf("Delete member %s from MySQL \n", p->member[j].name);
  541. }
  542. }
  543. // Delete the party, if has no member.
  544. sprintf(tmp_sql,"DELETE FROM `%s` WHERE `party_id`='%d'",party_db, party_id);
  545. if(mysql_query(&mysql_handle, tmp_sql) ) {
  546. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  547. }
  548. // printf("Leader breaks party %d \n",party_id);
  549. memset(p, 0, sizeof(struct party));
  550. }else memset(&p->member[i],0,sizeof(struct party_member));
  551. break;
  552. }
  553. }
  554. if( party_check_empty(p)==0 )
  555. mapif_party_info(-1,p);// まだ人がいるのでデータ送信
  556. /*
  557. else
  558. inter_party_tosql(party_id,p); // Break the party if no member
  559. */
  560. }else{
  561. sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `account_id`='%d' AND `online`='1'",
  562. char_db, party_id, account_id);
  563. if(mysql_query(&mysql_handle, tmp_sql) ) {
  564. printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
  565. }
  566. }
  567. return 0;
  568. }
  569. // When member goes to other map
  570. int mapif_parse_PartyChangeMap(int fd,int party_id,int account_id,char *map,int online,int lv)
  571. {
  572. struct party *p;
  573. int i;
  574. p = party_pt;
  575. if(p==NULL){
  576. printf("int_party: out of memory !\n");
  577. return 0;
  578. }
  579. inter_party_fromsql(party_id, p);
  580. if(p->party_id <= 0){
  581. return 0;
  582. }
  583. for(i=0;i<MAX_PARTY;i++){
  584. if(p->member[i].account_id==account_id){
  585. int flag=0;
  586. memcpy(p->member[i].map,map,16);
  587. p->member[i].online=online;
  588. p->member[i].lv=lv;
  589. mapif_party_membermoved(p,i);
  590. if( p->exp>0 && !party_check_exp_share(p) ){
  591. p->exp=0;
  592. flag=1;
  593. }
  594. if(flag)
  595. mapif_party_optionchanged(fd,p,0,0);
  596. break;
  597. }
  598. }
  599. inter_party_tosql(party_id, p);
  600. return 0;
  601. }
  602. // パーティ解散要求
  603. int mapif_parse_BreakParty(int fd,int party_id)
  604. {
  605. struct party *p;
  606. p = party_pt;
  607. if(p==NULL){
  608. printf("int_party: out of memory !\n");
  609. return 0;
  610. }
  611. inter_party_fromsql(party_id, p);
  612. if(p->party_id <= 0){
  613. return 0;
  614. }
  615. inter_party_tosql(party_id,p);
  616. mapif_party_broken(fd,party_id);
  617. return 0;
  618. }
  619. // パーティメッセージ送信
  620. int mapif_parse_PartyMessage(int fd,int party_id,int account_id,char *mes,int len)
  621. {
  622. return mapif_party_message(party_id,account_id,mes,len, fd);
  623. }
  624. // パーティチェック要求
  625. int mapif_parse_PartyCheck(int fd,int party_id,int account_id,char *nick)
  626. {
  627. return party_check_conflict(party_id,account_id,nick);
  628. }
  629. // map server からの通信
  630. // ・1パケットのみ解析すること
  631. // ・パケット長データはinter.cにセットしておくこと
  632. // ・パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない
  633. // ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない
  634. int inter_party_parse_frommap(int fd)
  635. {
  636. switch(RFIFOW(fd,0)){
  637. case 0x3020: mapif_parse_CreateParty(fd,RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,30),RFIFOP(fd,54),RFIFOW(fd,70)); break;
  638. case 0x3021: mapif_parse_PartyInfo(fd,RFIFOL(fd,2)); break;
  639. case 0x3022: mapif_parse_PartyAddMember(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOP(fd,34),RFIFOW(fd,50)); break;
  640. case 0x3023: mapif_parse_PartyChangeOption(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12)); break;
  641. case 0x3024: mapif_parse_PartyLeave(fd,RFIFOL(fd,2),RFIFOL(fd,6)); break;
  642. case 0x3025: mapif_parse_PartyChangeMap(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27)); break;
  643. case 0x3026: mapif_parse_BreakParty(fd,RFIFOL(fd,2)); break;
  644. case 0x3027: mapif_parse_PartyMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12); break;
  645. case 0x3028: mapif_parse_PartyCheck(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10)); break;
  646. default:
  647. return 0;
  648. }
  649. return 1;
  650. }
  651. // サーバーから脱退要求(キャラ削除用)
  652. int inter_party_leave(int party_id,int account_id)
  653. {
  654. return mapif_parse_PartyLeave(-1,party_id,account_id);
  655. }