From cdb9971c1511c4732ce08f0cb1c411a21abe8d77 Mon Sep 17 00:00:00 2001 From: skotlex Date: Mon, 7 Aug 2006 16:19:42 +0000 Subject: - Adjusted the order in which option/sc change packets are sent to match Aegis's - Added script command getpartyleader through which you can retrieve various information of a party's leader. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@8162 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/script.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/map/status.c | 15 +++++++++------ 2 files changed, 62 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/map/script.c b/src/map/script.c index ff5795939..2b0585b18 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -3293,6 +3293,7 @@ int buildin_readparam(struct script_state *st); int buildin_getcharid(struct script_state *st); int buildin_getpartyname(struct script_state *st); int buildin_getpartymember(struct script_state *st); +int buildin_getpartyleader(struct script_state *st); int buildin_getguildname(struct script_state *st); int buildin_getguildmaster(struct script_state *st); int buildin_getguildmasterid(struct script_state *st); @@ -3619,6 +3620,7 @@ struct script_function buildin_func[] = { {buildin_getcharid,"getcharid","i*"}, {buildin_getpartyname,"getpartyname","i"}, {buildin_getpartymember,"getpartymember","i*"}, + {buildin_getpartyleader,"getpartyleader","i*"}, {buildin_getguildname,"getguildname","i"}, {buildin_getguildmaster,"getguildmaster","i"}, {buildin_getguildmasterid,"getguildmasterid","i"}, @@ -5691,6 +5693,57 @@ int buildin_getpartymember(struct script_state *st) return 0; } + +/*========================================== + * Retrieves party leader. if flag is specified, + * return some of the leader data. Otherwise, return name. + *------------------------------------------ + */ +int buildin_getpartyleader(struct script_state *st) +{ + int party_id, type = 0, i; + struct party_data *p; + + party_id=conv_num(st,& (st->stack->stack_data[st->start+2])); + if( st->end>st->start+3 ) + type=conv_num(st,& (st->stack->stack_data[st->start+3])); + + p=party_search(party_id); + + if (p) //Search leader + for(i = 0; i < MAX_PARTY && !p->party.member[i].leader; i++); + + if (!p || i == MAX_PARTY) { //leader not found + if (type) + push_val(st->stack,C_INT,-1); + else + push_str(st->stack,C_CONSTSTR, (unsigned char *) "null"); + return 0; + } + + switch (type) { + case 1: + push_val(st->stack,C_INT,p->party.member[i].account_id); + break; + case 2: + push_val(st->stack,C_INT,p->party.member[i].char_id); + break; + case 3: + push_val(st->stack,C_INT,p->party.member[i].class_); + break; + case 4: + push_val(st->stack,C_INT,p->party.member[i].map); + break; + case 5: + push_val(st->stack,C_INT,p->party.member[i].lv); + break; + default: + push_str(st->stack,C_STR,(unsigned char *)p->party.member[i].name); + break; + } + return 0; +} + /*========================================== *指定IDのギルド名取得 *------------------------------------------ diff --git a/src/map/status.c b/src/map/status.c index 9d8d5ac29..a762da8de 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -5469,9 +5469,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val break; } - if (vd && pcdb_checkid(vd->class_)) //Only for players sprites, client crashes if they receive this for a mob o.O [Skotlex] - clif_status_change(bl,StatusIconChangeTable[type],1); - // Set option as needed. opt_flag = 1; switch(type){ @@ -5590,9 +5587,13 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val opt_flag = 0; } + //On Aegis, when turning on a status change, first goes the option packet, + // then the sc packet. if(opt_flag) clif_changeoption(bl); + if (vd && pcdb_checkid(vd->class_)) //Only for players sprites, client crashes if they receive this for a mob o.O [Skotlex] + clif_status_change(bl,StatusIconChangeTable[type],1); (sc->count)++; sc->data[type].val1 = val1; @@ -5603,6 +5604,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val sc->data[type].timer = add_timer( gettick() + tick, status_change_timer, bl->id, type); + if (calc_flag) status_calc_bl(bl,calc_flag); @@ -5960,9 +5962,6 @@ int status_change_end( struct block_list* bl , int type,int tid ) break; //guess hes not in jail :P } - if (vd && pcdb_checkid(vd->class_)) - clif_status_change(bl,StatusIconChangeTable[type],0); - opt_flag = 1; switch(type){ case SC_STONE: @@ -6077,6 +6076,10 @@ int status_change_end( struct block_list* bl , int type,int tid ) opt_flag = 0; } + //On Aegis, when turning off a status change, first goes the sc packet, then the option packet. + if (vd && pcdb_checkid(vd->class_)) + clif_status_change(bl,StatusIconChangeTable[type],0); + if(opt_flag) clif_changeoption(bl); -- cgit v1.2.3-70-g09d2