int_guild.c 52 KB

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