summaryrefslogtreecommitdiff
path: root/src/char/int_party.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/char/int_party.c')
-rw-r--r--src/char/int_party.c148
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);
}