diff options
Diffstat (limited to 'src/char/int_party.c')
-rw-r--r-- | src/char/int_party.c | 148 |
1 files changed, 89 insertions, 59 deletions
diff --git a/src/char/int_party.c b/src/char/int_party.c index 0fd58fa14..299a75135 100644 --- a/src/char/int_party.c +++ b/src/char/int_party.c @@ -19,7 +19,7 @@ int mapif_party_broken(int party_id, int flag); int party_check_empty(struct party *p); int mapif_parse_PartyLeave(int fd, int party_id, int account_id); -// パーティデータの文字列への変換 +// パ?ティデ?タの文字列への?換 int inter_party_tostr(char *str, struct party *p) { int i, len; @@ -32,7 +32,7 @@ int inter_party_tostr(char *str, struct party *p) { return 0; } -// パーティデータの文字列からの変換 +// パ?ティデ?タの文字列からの?換 int inter_party_fromstr(char *str, struct party *p) { int i, j; int tmp_int[16]; @@ -74,7 +74,7 @@ int inter_party_fromstr(char *str, struct party *p) { return 0; } -// パーティデータのロード +// パ?ティデ?タのロ?ド int inter_party_init() { char line[8192]; struct party *p; @@ -94,7 +94,7 @@ int inter_party_init() { continue; } - p = calloc(sizeof(struct party), 1); + p = (struct party*)aCalloc(sizeof(struct party), 1); if (p == NULL){ printf("int_party: out of memory!\n"); exit(0); @@ -107,7 +107,7 @@ int inter_party_init() { party_check_empty(p); } else { printf("int_party: broken data [%s] line %d\n", party_txt, c + 1); - free(p); + aFree(p); } c++; } @@ -117,7 +117,18 @@ int inter_party_init() { return 0; } -// パーティーデータのセーブ用 +int party_db_final (void *k, void *data, va_list ap) { + struct party *p = (struct party *) data; + if (p) aFree(p); + return 0; +} +void inter_party_final() +{ + numdb_final(party_db, party_db_final); + return; +} + +// パ?ティ?デ?タのセ?ブ用 int inter_party_save_sub(void *key, void *data, va_list ap) { char line[8192]; FILE *fp; @@ -129,7 +140,7 @@ int inter_party_save_sub(void *key, void *data, va_list ap) { return 0; } -// パーティーデータのセーブ +// パ?ティ?デ?タのセ?ブ int inter_party_save() { FILE *fp; int lock; @@ -146,7 +157,7 @@ int inter_party_save() { return 0; } -// パーティ名検索用 +// パ?ティ名?索用 int search_partyname_sub(void *key,void *data,va_list ap) { struct party *p = (struct party *)data,**dst; char *str; @@ -159,7 +170,7 @@ int search_partyname_sub(void *key,void *data,va_list ap) { return 0; } -// パーティ名検索 +// パ?ティ名?索 struct party* search_partyname(char *str) { struct party *p = NULL; numdb_foreach(party_db, search_partyname_sub, str, &p); @@ -169,7 +180,8 @@ struct party* search_partyname(char *str) { // EXP公平分配できるかチェック int party_check_exp_share(struct party *p) { - int i; + int i, dudes=0; + int pl1=0,pl2=0,pl3=0; int maxlv = 0, minlv = 0x7fffffff; for(i = 0; i < MAX_PARTY; i++) { @@ -179,13 +191,26 @@ int party_check_exp_share(struct party *p) { minlv = lv; if (maxlv < lv) maxlv = lv; + if( lv >= 70 ) dudes+=1000; + dudes++; } } - - return (maxlv == 0 || maxlv-minlv <= party_share_level); + if((dudes/1000 >= 2) && (dudes%1000 == 3) && (!strcmp(p->member[0].map,p->member[1].map)) && (!strcmp(p->member[1].map,p->member[2].map))) { + pl1=search_character_index(p->member[0].name); + pl2=search_character_index(p->member[1].name); + pl3=search_character_index(p->member[2].name); + printf("PARTY: group of 3 Id1 %d lv %d name %s Id2 %d lv %d name %s Id3 %d lv %d name %s\n",pl1,p->member[0].lv,p->member[0].name,pl2,p->member[1].lv,p->member[1].name,pl3,p->member[2].lv,p->member[2].name); + if (char_married(pl1,pl2) && char_child(pl1,pl3)) + return 1; + if (char_married(pl1,pl3) && char_child(pl1,pl2)) + return 1; + if (char_married(pl2,pl3) && char_child(pl2,pl1)) + return 1; + } + return (maxlv==0 || maxlv-minlv<=party_share_level); } -// パーティが空かどうかチェック +// パ?ティが空かどうかチェック int party_check_empty(struct party *p) { int i; @@ -199,7 +224,7 @@ int party_check_empty(struct party *p) { // 誰もいないので解散 mapif_party_broken(p->party_id, 0); numdb_erase(party_db, p->party_id); - free(p); + aFree(p); return 1; } @@ -214,12 +239,12 @@ int party_check_conflict_sub(void *key, void *data, va_list ap) { account_id=va_arg(ap, int); nick=va_arg(ap, char *); - if (p->party_id == party_id) // 本来の所属なので問題なし + if (p->party_id == party_id) // 本?の所?なので問題なし return 0; for(i = 0; i < MAX_PARTY; i++) { if (p->member[i].account_id == account_id && strcmp(p->member[i].name, nick) == 0) { - // 別のパーティに偽の所属データがあるので脱退 + // 別のパ?ティに?の所?デ?タがあるので?退 printf("int_party: party conflict! %d %d %d\n", account_id, party_id, p->party_id); mapif_parse_PartyLeave(-1, p->party_id, account_id); } @@ -238,7 +263,7 @@ int party_check_conflict(int party_id, int account_id, char *nick) { //------------------------------------------------------------------- // map serverへの通信 -// パーティ作成可否 +// パ?ティ作成可否 int mapif_party_created(int fd,int account_id, struct party *p) { WFIFOW(fd,0) = 0x3820; WFIFOL(fd,2) = account_id; @@ -257,7 +282,7 @@ int mapif_party_created(int fd,int account_id, struct party *p) { return 0; } -// パーティ情報見つからず +// パ?ティ情報見つからず int mapif_party_noinfo(int fd, int party_id) { WFIFOW(fd,0) = 0x3821; WFIFOW(fd,2) = 8; @@ -268,9 +293,9 @@ int mapif_party_noinfo(int fd, int party_id) { return 0; } -// パーティ情報まとめ送り +// パ?ティ情報まとめ送り int mapif_party_info(int fd, struct party *p) { - unsigned char buf[4 + sizeof(struct party)]; + unsigned char buf[2048]; WBUFW(buf,0) = 0x3821; memcpy(buf + 4, p, sizeof(struct party)); @@ -284,7 +309,7 @@ int mapif_party_info(int fd, struct party *p) { return 0; } -// パーティメンバ追加可否 +// パ?ティメンバ追加可否 int mapif_party_memberadded(int fd, int party_id, int account_id, int flag) { WFIFOW(fd,0) = 0x3822; WFIFOL(fd,2) = party_id; @@ -295,7 +320,7 @@ int mapif_party_memberadded(int fd, int party_id, int account_id, int flag) { return 0; } -// パーティ設定変更通知 +// パ?ティ設定?更通知 int mapif_party_optionchanged(int fd,struct party *p, int account_id, int flag) { unsigned char buf[15]; @@ -314,7 +339,7 @@ int mapif_party_optionchanged(int fd,struct party *p, int account_id, int flag) return 0; } -// パーティ脱退通知 +// パ?ティ?退通知 int mapif_party_leaved(int party_id,int account_id, char *name) { unsigned char buf[34]; @@ -328,7 +353,7 @@ int mapif_party_leaved(int party_id,int account_id, char *name) { return 0; } -// パーティマップ更新通知 +// パ?ティマップ更新通知 int mapif_party_membermoved(struct party *p, int idx) { unsigned char buf[29]; @@ -343,7 +368,7 @@ int mapif_party_membermoved(struct party *p, int idx) { return 0; } -// パーティ解散通知 +// パ?ティ解散通知 int mapif_party_broken(int party_id, int flag) { unsigned char buf[7]; WBUFW(buf,0) = 0x3826; @@ -355,16 +380,16 @@ int mapif_party_broken(int party_id, int flag) { return 0; } -// パーティ内発言 -int mapif_party_message(int party_id, int account_id, char *mes, int len) { - unsigned char buf[len+12]; +// パ?ティ??言 +int mapif_party_message(int party_id, int account_id, char *mes, int len, int sfd) { + unsigned char buf[2048]; WBUFW(buf,0) = 0x3827; WBUFW(buf,2) = len + 12; WBUFL(buf,4) = party_id; WBUFL(buf,8) = account_id; memcpy(WBUFP(buf,12), mes, len); - mapif_sendall(buf,len + 12); + mapif_sendallwos(sfd, buf,len + 12); return 0; } @@ -373,8 +398,8 @@ int mapif_party_message(int party_id, int account_id, char *mes, int len) { // map serverからの通信 -// パーティ -int mapif_parse_CreateParty(int fd, int account_id, char *name, char *nick, char *map, int lv) { +// パ?ティ +int mapif_parse_CreateParty(int fd, int account_id, char *name, char *nick, char *map, int lv, int item, int item2) { struct party *p; int i; @@ -391,7 +416,7 @@ int mapif_parse_CreateParty(int fd, int account_id, char *name, char *nick, char mapif_party_created(fd, account_id, NULL); return 0; } - p = calloc(sizeof(struct party), 1); + p = (struct party *) aCalloc(sizeof(struct party), 1); if (p == NULL) { printf("int_party: out of memory !\n"); mapif_party_created(fd,account_id,NULL); @@ -401,7 +426,12 @@ int mapif_parse_CreateParty(int fd, int account_id, char *name, char *nick, char p->party_id = party_newid++; memcpy(p->name, name, 24); p->exp = 0; - p->item = 0; + p->item = item; + //<item1>アイテム?集方法。0で個人別、1でパ?ティ公有 + //<item2>アイテム分配方法。0で個人別、1でパ?ティに均等分配 + //difference between "collection" and "distribution" is...? ^^; + p->itemc = 0; + p->member[0].account_id = account_id; memcpy(p->member[0].name, nick, 24); memcpy(p->member[0].map, map, 16); @@ -417,11 +447,11 @@ int mapif_parse_CreateParty(int fd, int account_id, char *name, char *nick, char return 0; } -// パーティ情報要求 +// パ?ティ情報要求 int mapif_parse_PartyInfo(int fd, int party_id) { struct party *p; - p = numdb_search(party_db, party_id); + p = (struct party *) numdb_search(party_db, party_id); if (p != NULL) mapif_party_info(fd, p); else @@ -430,12 +460,12 @@ int mapif_parse_PartyInfo(int fd, int party_id) { return 0; } -// パーティ追加要求 +// パ?ティ追加要求 int mapif_parse_PartyAddMember(int fd, int party_id, int account_id, char *nick, char *map, int lv) { struct party *p; int i; - p = numdb_search(party_db, party_id); + p = (struct party *) numdb_search(party_db, party_id); if (p == NULL) { mapif_party_memberadded(fd, party_id, account_id, 1); return 0; @@ -468,12 +498,12 @@ int mapif_parse_PartyAddMember(int fd, int party_id, int account_id, char *nick, return 0; } -// パーティー設定変更要求 +// パ?ティ?設定?更要求 int mapif_parse_PartyChangeOption(int fd, int party_id, int account_id, int exp, int item) { struct party *p; int flag = 0; - p = numdb_search(party_db, party_id); + p = (struct party *) numdb_search(party_db, party_id); if (p == NULL) return 0; @@ -489,12 +519,12 @@ int mapif_parse_PartyChangeOption(int fd, int party_id, int account_id, int exp, return 0; } -// パーティ脱退要求 +// パ?ティ?退要求 int mapif_parse_PartyLeave(int fd, int party_id, int account_id) { struct party *p; int i; - p = numdb_search(party_db, party_id); + p = (struct party *) numdb_search(party_db, party_id); if (p != NULL) { for(i = 0; i < MAX_PARTY; i++) { if (p->member[i].account_id == account_id) { @@ -502,7 +532,7 @@ int mapif_parse_PartyLeave(int fd, int party_id, int account_id) { memset(&p->member[i], 0, sizeof(struct party_member)); if (party_check_empty(p) == 0) - mapif_party_info(-1, p);// まだ人がいるのでデータ送信 + mapif_party_info(-1, p);// まだ人がいるのでデ?タ送信 return 0; } } @@ -511,12 +541,12 @@ int mapif_parse_PartyLeave(int fd, int party_id, int account_id) { return 0; } -// パーティマップ更新要求 +// パ?ティマップ更新要求 int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, char *map, int online, int lv) { struct party *p; int i; - p = numdb_search(party_db, party_id); + p = (struct party *) numdb_search(party_db, party_id); if (p == NULL) return 0; @@ -542,11 +572,11 @@ int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, char *map, return 0; } -// パーティ解散要求 +// パ?ティ解散要求 int mapif_parse_BreakParty(int fd, int party_id) { struct party *p; - p = numdb_search(party_db, party_id); + p = (struct party *) numdb_search(party_db, party_id); if (p == NULL) return 0; @@ -556,31 +586,31 @@ int mapif_parse_BreakParty(int fd, int party_id) { return 0; } -// パーティメッセージ送信 +// パ?ティメッセ?ジ送信 int mapif_parse_PartyMessage(int fd, int party_id, int account_id, char *mes, int len) { - return mapif_party_message(party_id, account_id, mes, len); + return mapif_party_message(party_id, account_id, mes, len, fd); } -// パーティチェック要求 +// パ?ティチェック要求 int mapif_parse_PartyCheck(int fd, int party_id, int account_id, char *nick) { return party_check_conflict(party_id, account_id, nick); } // map server からの通信 -// ・1パケットのみ解析すること -// ・パケット長データはinter.cにセットしておくこと -// ・パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない -// ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない +// ?1パケットのみ解析すること +// ?パケット長デ?タはinter.cにセットしておくこと +// ?パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない +// ?エラ?なら0(false)、そうでないなら1(true)をかえさなければならない int inter_party_parse_frommap(int fd) { switch(RFIFOW(fd,0)) { - case 0x3020: mapif_parse_CreateParty(fd, RFIFOL(fd,2), RFIFOP(fd,6), RFIFOP(fd,30), RFIFOP(fd,54), RFIFOW(fd,70)); break; + case 0x3020: mapif_parse_CreateParty(fd, RFIFOL(fd,2), (char*)RFIFOP(fd,6), (char*)RFIFOP(fd,30), (char*)RFIFOP(fd,54), RFIFOW(fd,70), RFIFOB(fd,72), RFIFOB(fd,73)); break; case 0x3021: mapif_parse_PartyInfo(fd, RFIFOL(fd,2)); break; - case 0x3022: mapif_parse_PartyAddMember(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10), RFIFOP(fd,34), RFIFOW(fd,50)); break; + case 0x3022: mapif_parse_PartyAddMember(fd, RFIFOL(fd,2), RFIFOL(fd,6), (char*)RFIFOP(fd,10), (char*)RFIFOP(fd,34), RFIFOW(fd,50)); break; case 0x3023: mapif_parse_PartyChangeOption(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOW(fd,10), RFIFOW(fd,12)); break; case 0x3024: mapif_parse_PartyLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6)); break; - case 0x3025: mapif_parse_PartyChangeMap(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10), RFIFOB(fd,26), RFIFOW(fd,27)); break; + case 0x3025: mapif_parse_PartyChangeMap(fd, RFIFOL(fd,2), RFIFOL(fd,6), (char*)RFIFOP(fd,10), RFIFOB(fd,26), RFIFOW(fd,27)); break; case 0x3026: mapif_parse_BreakParty(fd, RFIFOL(fd,2)); break; - case 0x3027: mapif_parse_PartyMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOP(fd,12), RFIFOW(fd,2)-12); break; - case 0x3028: mapif_parse_PartyCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10)); break; + case 0x3027: mapif_parse_PartyMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), (char*)RFIFOP(fd,12), RFIFOW(fd,2)-12); break; + case 0x3028: mapif_parse_PartyCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), (char*)RFIFOP(fd,10)); break; default: return 0; } @@ -588,7 +618,7 @@ int inter_party_parse_frommap(int fd) { return 1; } -// サーバーから脱退要求(キャラ削除用) +// サ?バ?から?退要求(キャラ削除用) int inter_party_leave(int party_id, int account_id) { return mapif_parse_PartyLeave(-1, party_id, account_id); } |