* Added DUMP_ALL_PACKETS and moved dump packets code in clif_parse a bit to support it

* Added base code for Party Item Sharing

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@1009 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
(no author) 2005-01-28 18:46:43 +00:00
parent 78127bdcb5
commit 9fec5d1298
13 changed files with 167 additions and 86 deletions

View File

@ -1,6 +1,10 @@
Date Added Date Added
01/28 01/28
* Added DUMP_ALL_PACKETS and moved dump packets code in clif_parse a bit to
support it [celest]
* Added base code for Party Item Sharing -- still needs some work in client-
server support [celest]
* new GC link http://amber.stormbirds.org/~joshs/gc6.4.tar.gz * new GC link http://amber.stormbirds.org/~joshs/gc6.4.tar.gz
This fixes some issues... works better This fixes some issues... works better
* Added macros skill_chk and skill_get to check for out of bounds errors when * Added macros skill_chk and skill_get to check for out of bounds errors when

View File

@ -19,7 +19,7 @@ int mapif_party_broken(int party_id, int flag);
int party_check_empty(struct party *p); int party_check_empty(struct party *p);
int mapif_parse_PartyLeave(int fd, int party_id, int account_id); int mapif_parse_PartyLeave(int fd, int party_id, int account_id);
// パーティデータの文字列への変 // パ?ティデ?タの文字列への?
int inter_party_tostr(char *str, struct party *p) { int inter_party_tostr(char *str, struct party *p) {
int i, len; int i, len;
@ -32,7 +32,7 @@ int inter_party_tostr(char *str, struct party *p) {
return 0; return 0;
} }
// パーティデータの文字列からの変 // パ?ティデ?タの文字列からの?
int inter_party_fromstr(char *str, struct party *p) { int inter_party_fromstr(char *str, struct party *p) {
int i, j; int i, j;
int tmp_int[16]; int tmp_int[16];
@ -74,7 +74,7 @@ int inter_party_fromstr(char *str, struct party *p) {
return 0; return 0;
} }
// パーティデータのロー // パ?ティデ?タのロ?
int inter_party_init() { int inter_party_init() {
char line[8192]; char line[8192];
struct party *p; struct party *p;
@ -117,7 +117,7 @@ int inter_party_init() {
return 0; return 0;
} }
// パーティーデータのセーブ用 // パ?ティ?デ?タのセ?ブ用
int inter_party_save_sub(void *key, void *data, va_list ap) { int inter_party_save_sub(void *key, void *data, va_list ap) {
char line[8192]; char line[8192];
FILE *fp; FILE *fp;
@ -129,7 +129,7 @@ int inter_party_save_sub(void *key, void *data, va_list ap) {
return 0; return 0;
} }
// パーティーデータのセー // パ?ティ?デ?タのセ?
int inter_party_save() { int inter_party_save() {
FILE *fp; FILE *fp;
int lock; int lock;
@ -146,7 +146,7 @@ int inter_party_save() {
return 0; return 0;
} }
// パーティ名検索用 // パ?ティ名?索用
int search_partyname_sub(void *key,void *data,va_list ap) { int search_partyname_sub(void *key,void *data,va_list ap) {
struct party *p = (struct party *)data,**dst; struct party *p = (struct party *)data,**dst;
char *str; char *str;
@ -159,7 +159,7 @@ int search_partyname_sub(void *key,void *data,va_list ap) {
return 0; return 0;
} }
// パーティ名検 // パ?ティ名?
struct party* search_partyname(char *str) { struct party* search_partyname(char *str) {
struct party *p = NULL; struct party *p = NULL;
numdb_foreach(party_db, search_partyname_sub, str, &p); numdb_foreach(party_db, search_partyname_sub, str, &p);
@ -185,7 +185,7 @@ int party_check_exp_share(struct party *p) {
return (maxlv == 0 || maxlv-minlv <= party_share_level); return (maxlv == 0 || maxlv-minlv <= party_share_level);
} }
// パティが空かどうかチェック // パ?ティが空かどうかチェック
int party_check_empty(struct party *p) { int party_check_empty(struct party *p) {
int i; int i;
@ -214,12 +214,12 @@ int party_check_conflict_sub(void *key, void *data, va_list ap) {
account_id=va_arg(ap, int); account_id=va_arg(ap, int);
nick=va_arg(ap, char *); nick=va_arg(ap, char *);
if (p->party_id == party_id) // 本来の所属なので問題なし if (p->party_id == party_id) // 本?の所?なので問題なし
return 0; return 0;
for(i = 0; i < MAX_PARTY; i++) { for(i = 0; i < MAX_PARTY; i++) {
if (p->member[i].account_id == account_id && strcmp(p->member[i].name, nick) == 0) { 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); 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); mapif_parse_PartyLeave(-1, p->party_id, account_id);
} }
@ -238,7 +238,7 @@ int party_check_conflict(int party_id, int account_id, char *nick) {
//------------------------------------------------------------------- //-------------------------------------------------------------------
// map serverへの通信 // map serverへの通信
// パティ作成可否 // パ?ティ作成可否
int mapif_party_created(int fd,int account_id, struct party *p) { int mapif_party_created(int fd,int account_id, struct party *p) {
WFIFOW(fd,0) = 0x3820; WFIFOW(fd,0) = 0x3820;
WFIFOL(fd,2) = account_id; WFIFOL(fd,2) = account_id;
@ -257,7 +257,7 @@ int mapif_party_created(int fd,int account_id, struct party *p) {
return 0; return 0;
} }
// パティ情報見つからず // パ?ティ情報見つからず
int mapif_party_noinfo(int fd, int party_id) { int mapif_party_noinfo(int fd, int party_id) {
WFIFOW(fd,0) = 0x3821; WFIFOW(fd,0) = 0x3821;
WFIFOW(fd,2) = 8; WFIFOW(fd,2) = 8;
@ -268,7 +268,7 @@ int mapif_party_noinfo(int fd, int party_id) {
return 0; return 0;
} }
// パティ情報まとめ送り // パ?ティ情報まとめ送り
int mapif_party_info(int fd, struct party *p) { int mapif_party_info(int fd, struct party *p) {
unsigned char buf[4 + sizeof(struct party)]; unsigned char buf[4 + sizeof(struct party)];
@ -284,7 +284,7 @@ int mapif_party_info(int fd, struct party *p) {
return 0; return 0;
} }
// パティメンバ追加可否 // パ?ティメンバ追加可否
int mapif_party_memberadded(int fd, int party_id, int account_id, int flag) { int mapif_party_memberadded(int fd, int party_id, int account_id, int flag) {
WFIFOW(fd,0) = 0x3822; WFIFOW(fd,0) = 0x3822;
WFIFOL(fd,2) = party_id; WFIFOL(fd,2) = party_id;
@ -295,7 +295,7 @@ int mapif_party_memberadded(int fd, int party_id, int account_id, int flag) {
return 0; return 0;
} }
// パーティ設定変更通知 // パ?ティ設定?更通知
int mapif_party_optionchanged(int fd,struct party *p, int account_id, int flag) { int mapif_party_optionchanged(int fd,struct party *p, int account_id, int flag) {
unsigned char buf[15]; unsigned char buf[15];
@ -314,7 +314,7 @@ int mapif_party_optionchanged(int fd,struct party *p, int account_id, int flag)
return 0; return 0;
} }
// パーティ脱退通知 // パ?ティ?退通知
int mapif_party_leaved(int party_id,int account_id, char *name) { int mapif_party_leaved(int party_id,int account_id, char *name) {
unsigned char buf[34]; unsigned char buf[34];
@ -328,7 +328,7 @@ int mapif_party_leaved(int party_id,int account_id, char *name) {
return 0; return 0;
} }
// パティマップ更新通知 // パ?ティマップ更新通知
int mapif_party_membermoved(struct party *p, int idx) { int mapif_party_membermoved(struct party *p, int idx) {
unsigned char buf[29]; unsigned char buf[29];
@ -343,7 +343,7 @@ int mapif_party_membermoved(struct party *p, int idx) {
return 0; return 0;
} }
// パティ解散通知 // パ?ティ解散通知
int mapif_party_broken(int party_id, int flag) { int mapif_party_broken(int party_id, int flag) {
unsigned char buf[7]; unsigned char buf[7];
WBUFW(buf,0) = 0x3826; WBUFW(buf,0) = 0x3826;
@ -355,7 +355,7 @@ int mapif_party_broken(int party_id, int flag) {
return 0; return 0;
} }
// パーティ内発 // パ?ティ??
int mapif_party_message(int party_id, int account_id, char *mes, int len, int sfd) { int mapif_party_message(int party_id, int account_id, char *mes, int len, int sfd) {
unsigned char buf[len+12]; unsigned char buf[len+12];
@ -373,8 +373,8 @@ int mapif_party_message(int party_id, int account_id, char *mes, int len, int sf
// map serverからの通信 // 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; struct party *p;
int i; int i;
@ -401,7 +401,12 @@ int mapif_parse_CreateParty(int fd, int account_id, char *name, char *nick, char
p->party_id = party_newid++; p->party_id = party_newid++;
memcpy(p->name, name, 24); memcpy(p->name, name, 24);
p->exp = 0; 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; p->member[0].account_id = account_id;
memcpy(p->member[0].name, nick, 24); memcpy(p->member[0].name, nick, 24);
memcpy(p->member[0].map, map, 16); memcpy(p->member[0].map, map, 16);
@ -417,7 +422,7 @@ int mapif_parse_CreateParty(int fd, int account_id, char *name, char *nick, char
return 0; return 0;
} }
// パティ情報要求 // パ?ティ情報要求
int mapif_parse_PartyInfo(int fd, int party_id) { int mapif_parse_PartyInfo(int fd, int party_id) {
struct party *p; struct party *p;
@ -430,7 +435,7 @@ int mapif_parse_PartyInfo(int fd, int party_id) {
return 0; return 0;
} }
// パティ追加要求 // パ?ティ追加要求
int mapif_parse_PartyAddMember(int fd, int party_id, int account_id, char *nick, char *map, int lv) { int mapif_parse_PartyAddMember(int fd, int party_id, int account_id, char *nick, char *map, int lv) {
struct party *p; struct party *p;
int i; int i;
@ -468,7 +473,7 @@ int mapif_parse_PartyAddMember(int fd, int party_id, int account_id, char *nick,
return 0; return 0;
} }
// パーティー設定変更要求 // パ?ティ?設定?更要求
int mapif_parse_PartyChangeOption(int fd, int party_id, int account_id, int exp, int item) { int mapif_parse_PartyChangeOption(int fd, int party_id, int account_id, int exp, int item) {
struct party *p; struct party *p;
int flag = 0; int flag = 0;
@ -489,7 +494,7 @@ int mapif_parse_PartyChangeOption(int fd, int party_id, int account_id, int exp,
return 0; return 0;
} }
// パーティ脱退要求 // パ?ティ?退要求
int mapif_parse_PartyLeave(int fd, int party_id, int account_id) { int mapif_parse_PartyLeave(int fd, int party_id, int account_id) {
struct party *p; struct party *p;
int i; int i;
@ -502,7 +507,7 @@ int mapif_parse_PartyLeave(int fd, int party_id, int account_id) {
memset(&p->member[i], 0, sizeof(struct party_member)); memset(&p->member[i], 0, sizeof(struct party_member));
if (party_check_empty(p) == 0) if (party_check_empty(p) == 0)
mapif_party_info(-1, p);// まだ人がいるのでデタ送信 mapif_party_info(-1, p);// まだ人がいるのでデ?タ送信
return 0; return 0;
} }
} }
@ -511,7 +516,7 @@ int mapif_parse_PartyLeave(int fd, int party_id, int account_id) {
return 0; return 0;
} }
// パティマップ更新要求 // パ?ティマップ更新要求
int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, char *map, int online, int lv) { int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, char *map, int online, int lv) {
struct party *p; struct party *p;
int i; int i;
@ -542,7 +547,7 @@ int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, char *map,
return 0; return 0;
} }
// パティ解散要求 // パ?ティ解散要求
int mapif_parse_BreakParty(int fd, int party_id) { int mapif_parse_BreakParty(int fd, int party_id) {
struct party *p; struct party *p;
@ -556,23 +561,23 @@ int mapif_parse_BreakParty(int fd, int party_id) {
return 0; return 0;
} }
// パーティメッセージ送信 // パ?ティメッセ?ジ送信
int mapif_parse_PartyMessage(int fd, int party_id, int account_id, char *mes, int len) { 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, fd); 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) { int mapif_parse_PartyCheck(int fd, int party_id, int account_id, char *nick) {
return party_check_conflict(party_id, account_id, nick); return party_check_conflict(party_id, account_id, nick);
} }
// map server からの通信 // map server からの通信
// 1パケットのみ解析すること // ?1パケットのみ解析すること
// ・パケット長データはinter.cにセットしておくこと // ?パケット長デ?タはinter.cにセットしておくこと
// パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない // ?パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない
// ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない // ?エラ?なら0(false)、そうでないなら1(true)をかえさなければならない
int inter_party_parse_frommap(int fd) { int inter_party_parse_frommap(int fd) {
switch(RFIFOW(fd,0)) { switch(RFIFOW(fd,0)) {
case 0x3020: mapif_parse_CreateParty(fd, RFIFOL(fd,2), (char*)RFIFOP(fd,6), (char*)RFIFOP(fd,30), (char*)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 0x3021: mapif_parse_PartyInfo(fd, RFIFOL(fd,2)); 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 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 0x3023: mapif_parse_PartyChangeOption(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOW(fd,10), RFIFOW(fd,12)); break;
@ -588,7 +593,7 @@ int inter_party_parse_frommap(int fd) {
return 1; return 1;
} }
// サーバーから脱退要求(キャラ削除用) // サ?バ?から?退要求(キャラ削除用)
int inter_party_leave(int party_id, int account_id) { int inter_party_leave(int party_id, int account_id) {
return mapif_parse_PartyLeave(-1, party_id, account_id); return mapif_parse_PartyLeave(-1, party_id, account_id);
} }

View File

@ -47,7 +47,7 @@ int inter_send_packet_length[] = {
int inter_recv_packet_length[] = { int inter_recv_packet_length[] = {
-1,-1, 7,-1, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,-1, 7,-1, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0, 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0,
72, 6,52,14, 10,29, 6,-1, 34, 0, 0, 0, 0, 0, 0, 0, 74, 6,52,14, 10,29, 6,-1, 34, 0, 0, 0, 0, 0, 0, 0,
-1, 6,-1, 0, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1, -1, 6,-1, 0, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1,
5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

View File

@ -452,7 +452,7 @@ int mapif_party_message(int party_id,int account_id,char *mes,int len, int sfd)
// Create Party // Create Party
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; struct party *p;
if( (p=search_partyname(name))!=NULL){ if( (p=search_partyname(name))!=NULL){
@ -470,7 +470,12 @@ int mapif_parse_CreateParty(int fd,int account_id,char *name,char *nick,char *ma
p->party_id=party_newid++; p->party_id=party_newid++;
memcpy(p->name,name,24); memcpy(p->name,name,24);
p->exp=0; 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; p->member[0].account_id=account_id;
memcpy(p->member[0].name,nick,24); memcpy(p->member[0].name,nick,24);
memcpy(p->member[0].map,map,16); memcpy(p->member[0].map,map,16);
@ -727,7 +732,7 @@ int mapif_parse_PartyCheck(int fd,int party_id,int account_id,char *nick)
int inter_party_parse_frommap(int fd) int inter_party_parse_frommap(int fd)
{ {
switch(RFIFOW(fd,0)){ switch(RFIFOW(fd,0)){
case 0x3020: mapif_parse_CreateParty(fd,RFIFOL(fd,2),(char*)RFIFOP(fd,6),(char*)RFIFOP(fd,30),(char*)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 0x3021: mapif_parse_PartyInfo(fd,RFIFOL(fd,2)); 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 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 0x3023: mapif_parse_PartyChangeOption(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12)); break;

View File

@ -67,7 +67,7 @@ int inter_send_packet_length[]={
int inter_recv_packet_length[]={ int inter_recv_packet_length[]={
-1,-1, 7, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,-1, 7, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0, 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0,
72, 6,52,14, 10,29, 6,-1, 34, 0, 0, 0, 0, 0, 0, 0, 74, 6,52,14, 10,29, 6,-1, 34, 0, 0, 0, 0, 0, 0, 0,
-1, 6,-1, 0, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1, -1, 6,-1, 0, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1,
5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

View File

@ -198,7 +198,7 @@ struct party {
int party_id; int party_id;
char name[24]; char name[24];
int exp; int exp;
int item; int item, itemc;
struct party_member member[MAX_PARTY]; struct party_member member[MAX_PARTY];
}; };

View File

@ -5098,7 +5098,7 @@ int atcommand_party(
return -1; return -1;
} }
party_create(sd, party); party_create(sd, party, 0, 0);
return 0; return 0;
} }

View File

@ -1,6 +1,7 @@
// $Id: clif.c 2200 2004-11-07 11:49:58Z Yor $ // $Id: clif.c 2200 2004-11-07 11:49:58Z Yor $
#define DUMP_UNKNOWN_PACKET 1 #define DUMP_UNKNOWN_PACKET 1
#define DUMP_ALL_PACKETS 0
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
@ -9593,7 +9594,7 @@ void clif_parse_CloseKafra(int fd, struct map_session_data *sd) {
*/ */
void clif_parse_CreateParty(int fd, struct map_session_data *sd) { void clif_parse_CreateParty(int fd, struct map_session_data *sd) {
if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 7) { if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 7) {
party_create(sd,(char*)RFIFOP(fd,2)); party_create(sd,(char*)RFIFOP(fd,2),0,0);
} else } else
clif_skill_fail(sd,1,0,4); clif_skill_fail(sd,1,0,4);
} }
@ -9604,7 +9605,7 @@ void clif_parse_CreateParty(int fd, struct map_session_data *sd) {
*/ */
void clif_parse_CreateParty2(int fd, struct map_session_data *sd) { void clif_parse_CreateParty2(int fd, struct map_session_data *sd) {
if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 7){ if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 7){
party_create(sd,(char*)RFIFOP(fd,2)); party_create(sd,(char*)RFIFOP(fd,2),RFIFOB(fd,26),RFIFOB(fd,27));
} else } else
clif_skill_fail(sd,1,0,4); clif_skill_fail(sd,1,0,4);
} }
@ -10504,7 +10505,7 @@ static void (*clif_parse_func_table[MAX_PACKET_DB])(int, struct map_session_data
*------------------------------------------ *------------------------------------------
*/ */
static int clif_parse(int fd) { static int clif_parse(int fd) {
int packet_len = 0, cmd, packet_ver; int packet_len = 0, cmd, packet_ver, dump = 0;
struct map_session_data *sd; struct map_session_data *sd;
sd = (struct map_session_data*)session[fd]->session_data; sd = (struct map_session_data*)session[fd]->session_data;
@ -10672,6 +10673,10 @@ static int clif_parse(int fd) {
if (RFIFOREST(fd) < packet_len) if (RFIFOREST(fd) < packet_len)
return 0; // まだ1パケット分データが揃ってない return 0; // まだ1パケット分データが揃ってない
#if DUMP_ALL_PACKETS
dump = 1;
#endif
if (sd && sd->state.auth == 1 && sd->state.waitingdisconnect == 1) { // 切断待ちの場合パケットを処理しない if (sd && sd->state.auth == 1 && sd->state.waitingdisconnect == 1) { // 切断待ちの場合パケットを処理しない
} else if (packet_db[packet_ver][cmd].func) { // packet version 5-6-7 use same functions, but size are different } else if (packet_db[packet_ver][cmd].func) { // packet version 5-6-7 use same functions, but size are different
@ -10680,28 +10685,13 @@ static int clif_parse(int fd) {
} else { } else {
// 不明なパケット // 不明なパケット
if (battle_config.error_log) { if (battle_config.error_log) {
if (fd) #if DUMP_UNKNOWN_PACKET
printf("\nclif_parse: session #%d, packet 0x%x, lenght %d\n", fd, cmd, packet_len);
#ifdef DUMP_UNKNOWN_PACKET
{ {
int i; int i;
FILE *fp; FILE *fp;
char packet_txt[256] = "save/packet.txt"; char packet_txt[256] = "save/packet.txt";
time_t now; time_t now;
printf("---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F"); dump = 1;
for(i = 0; i < packet_len; i++) {
if ((i & 15) == 0)
printf("\n%04X ",i);
printf("%02X ", RFIFOB(fd,i));
}
if (sd && sd->state.auth) {
if (sd->status.name != NULL)
printf("\nAccount ID %d, character ID %d, player name %s.\n",
sd->status.account_id, sd->status.char_id, sd->status.name);
else
printf("\nAccount ID %d.\n", sd->bl.id);
} else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified)
printf("\nAccount ID %d.\n", sd->bl.id);
if ((fp = fopen(packet_txt, "a")) == NULL) { if ((fp = fopen(packet_txt, "a")) == NULL) {
printf("clif.c: cant write [%s] !!! data is lost !!!\n", packet_txt); printf("clif.c: cant write [%s] !!! data is lost !!!\n", packet_txt);
@ -10730,6 +10720,27 @@ static int clif_parse(int fd) {
#endif #endif
} }
} }
if (dump) {
int i;
if (fd)
printf("\nclif_parse: session #%d, packet 0x%x, lenght %d\n", fd, cmd, packet_len);
printf("---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F");
for(i = 0; i < packet_len; i++) {
if ((i & 15) == 0)
printf("\n%04X ",i);
printf("%02X ", RFIFOB(fd,i));
}
if (sd && sd->state.auth) {
if (sd->status.name != NULL)
printf("\nAccount ID %d, character ID %d, player name %s.\n",
sd->status.account_id, sd->status.char_id, sd->status.name);
else
printf("\nAccount ID %d.\n", sd->bl.id);
} else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified)
printf("\nAccount ID %d.\n", sd->bl.id);
}
RFIFOSKIP(fd, packet_len); RFIFOSKIP(fd, packet_len);
return 0; return 0;

View File

@ -273,7 +273,7 @@ int intif_send_guild_storage(int account_id,struct guild_storage *gstor)
} }
// パーティ作成要求 // パーティ作成要求
int intif_create_party(struct map_session_data *sd,char *name) int intif_create_party(struct map_session_data *sd,char *name,int item,int item2)
{ {
if (CheckForCharServer()) if (CheckForCharServer())
return 0; return 0;
@ -285,7 +285,9 @@ int intif_create_party(struct map_session_data *sd,char *name)
memcpy(WFIFOP(inter_fd,30),sd->status.name,24); memcpy(WFIFOP(inter_fd,30),sd->status.name,24);
memcpy(WFIFOP(inter_fd,54),map[sd->bl.m].name,16); memcpy(WFIFOP(inter_fd,54),map[sd->bl.m].name,16);
WFIFOW(inter_fd,70)= sd->status.base_level; WFIFOW(inter_fd,70)= sd->status.base_level;
WFIFOSET(inter_fd,72); WFIFOB(inter_fd,72)= item;
WFIFOB(inter_fd,73)= item2;
WFIFOSET(inter_fd,74);
// if(battle_config.etc_log) // if(battle_config.etc_log)
// printf("intif: create party\n"); // printf("intif: create party\n");
return 0; return 0;

View File

@ -18,7 +18,7 @@ int intif_request_guild_storage(int account_id, int guild_id);
int intif_send_guild_storage(int account_id, struct guild_storage *gstor); int intif_send_guild_storage(int account_id, struct guild_storage *gstor);
int intif_create_party(struct map_session_data *sd,char *name); int intif_create_party(struct map_session_data *sd,char *name,int item,int item2);
int intif_request_partyinfo(int party_id); int intif_request_partyinfo(int party_id);
int intif_party_addmember(int party_id, int account_id); int intif_party_addmember(int party_id, int account_id);
int intif_party_changeoption(int party_id, int account_id, int exp, int item); int intif_party_changeoption(int party_id, int account_id, int exp, int item);

View File

@ -1960,7 +1960,7 @@ static int mob_delay_item_drop(int tid,unsigned int tick,int id,int data)
{ {
struct delay_item_drop *ditem; struct delay_item_drop *ditem;
struct item temp_item; struct item temp_item;
int flag; int flag, drop_flag = 1;
nullpo_retr(0, ditem=(struct delay_item_drop *)id); nullpo_retr(0, ditem=(struct delay_item_drop *)id);
@ -1969,16 +1969,43 @@ static int mob_delay_item_drop(int tid,unsigned int tick,int id,int data)
temp_item.amount = ditem->amount; temp_item.amount = ditem->amount;
temp_item.identify = !itemdb_isequip3(temp_item.nameid); temp_item.identify = !itemdb_isequip3(temp_item.nameid);
if(battle_config.item_auto_get){ if (ditem->first_sd){
if(ditem->first_sd && (flag = pc_additem(ditem->first_sd,&temp_item,ditem->amount))){ #if 0
clif_additem(ditem->first_sd,0,0,flag); if (ditem->first_sd->status.party_id > 0){
map_addflooritem(&temp_item,1,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0); struct party *p;
if((p=party_search(ditem->first_sd->status.party_id)) && p->item){
struct map_session_data *sd = NULL;
int i;
for (i = p->itemc + 1; i!=p->itemc; i++) { // initialise counter and loop through the party
if (i >= MAX_PARTY)
i = 0; // reset counter to 1st person in party so it'll stop when it reaches "itemc"
if ((sd=p->member[i].sd)!=NULL && sd->bl.m == ditem->first_sd->bl.m)
break;
}
if (sd){ // if an appropiate party member was found
drop_flag = 0;
if ((p->itemc++) >= MAX_PARTY)
p->itemc = 0;
if ((flag = pc_additem(ditem->first_sd,&temp_item,ditem->amount))) {
clif_additem(ditem->first_sd,0,0,flag);
drop_flag = 1;
}
}
}
} else
#endif
if(battle_config.item_auto_get){
drop_flag = 0;
if((flag = pc_additem(ditem->first_sd,&temp_item,ditem->amount))){
clif_additem(ditem->first_sd,0,0,flag);
drop_flag = 1;
}
} }
aFree(ditem);
return 0;
} }
map_addflooritem(&temp_item,1,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0); if (drop_flag) {
map_addflooritem(&temp_item,1,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
}
aFree(ditem); aFree(ditem);
return 0; return 0;
@ -1991,20 +2018,47 @@ static int mob_delay_item_drop(int tid,unsigned int tick,int id,int data)
static int mob_delay_item_drop2(int tid,unsigned int tick,int id,int data) static int mob_delay_item_drop2(int tid,unsigned int tick,int id,int data)
{ {
struct delay_item_drop2 *ditem; struct delay_item_drop2 *ditem;
int flag; int flag, drop_flag = 1;
nullpo_retr(0, ditem=(struct delay_item_drop2 *)id); nullpo_retr(0, ditem=(struct delay_item_drop2 *)id);
if(battle_config.item_auto_get){ if (ditem->first_sd){
if(ditem->first_sd && (flag = pc_additem(ditem->first_sd,&ditem->item_data,ditem->item_data.amount))){ #if 0
clif_additem(ditem->first_sd,0,0,flag); if (ditem->first_sd->status.party_id > 0){
map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0); struct party *p;
if((p=party_search(ditem->first_sd->status.party_id)) && p->item){
struct map_session_data *sd = NULL;
int i;
for (i = p->itemc + 1; i!=p->itemc; i++) { // initialise counter and loop through the party
if (i >= MAX_PARTY)
i = 0; // reset counter to 1st person in party so it'll stop when it reaches "itemc"
if ((sd=p->member[i].sd)!=NULL && sd->bl.m == ditem->first_sd->bl.m)
break;
}
if (sd){ // if an appropiate party member was found
drop_flag = 0;
if ((p->itemc++) >= MAX_PARTY)
p->itemc = 0;
if((flag = pc_additem(ditem->first_sd,&ditem->item_data,ditem->item_data.amount))){
clif_additem(ditem->first_sd,0,0,flag);
drop_flag = 1;
}
}
}
} else
#endif
if(battle_config.item_auto_get){
drop_flag = 0;
if((flag = pc_additem(ditem->first_sd,&ditem->item_data,ditem->item_data.amount))){
clif_additem(ditem->first_sd,0,0,flag);
drop_flag = 1;
}
} }
aFree(ditem);
return 0;
} }
map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0); if (drop_flag) {
map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
}
aFree(ditem); aFree(ditem);
return 0; return 0;

View File

@ -69,12 +69,12 @@ struct party* party_searchname(char *str)
return p; return p;
} }
// <20>ì<EFBFBD>¬—v<76> // <20>ì<EFBFBD>¬—v<76>
int party_create(struct map_session_data *sd,char *name) int party_create(struct map_session_data *sd,char *name,int item,int item2)
{ {
nullpo_retr(0, sd); nullpo_retr(0, sd);
if(sd->status.party_id==0) if(sd->status.party_id==0)
intif_create_party(sd,name); intif_create_party(sd,name,item,item2);
else else
clif_party_created(sd,2); clif_party_created(sd,2);
return 0; return 0;

View File

@ -13,7 +13,7 @@ void do_final_party(void);
struct party *party_search(int party_id); struct party *party_search(int party_id);
struct party* party_searchname(char *str); struct party* party_searchname(char *str);
int party_create(struct map_session_data *sd,char *name); int party_create(struct map_session_data *sd,char *name, int item, int item2);
int party_created(int account_id,int fail,int party_id,char *name); int party_created(int account_id,int fail,int party_id,char *name);
int party_request_info(int party_id); int party_request_info(int party_id);
int party_invite(struct map_session_data *sd,int account_id); int party_invite(struct map_session_data *sd,int account_id);