- Added handling of type BL_PET to skill_unitgrouptickset_search. I know pets normally aren't affected by skills, but their structure already had support for this, so....
- Rewrote/simplified functions skill_addtimerskill/skill_cleartimerskill - Fixed SC_DANCING for non players (was making dances only last 1 second for them) - Modified map_moveblock to handle calls to skill_unit_move_unit_group and cancelling of Close Confine effects, removed these checks from the walk functions and skill_blown functions. git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@5262 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
7d88ebe2fb
commit
62fb6045d4
@ -4,6 +4,12 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
|
||||
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. EVERYTHING ELSE
|
||||
GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALARIS
|
||||
|
||||
2006/02/12
|
||||
* Optimized functions skill_addtimerskill/skill_cleartimerskill [Skotlex]
|
||||
* Fixed SC_DANCING for non players (was making dances only last 1 second
|
||||
for them) [Skotlex]
|
||||
* Modified map_moveblock to handle updating dance's position as well as
|
||||
ending close confine status effects. [Skotlex]
|
||||
2006/02/10
|
||||
* Fixed Sonic Blow's damage for lvl 1~9 [Vicious]
|
||||
* The status window will now show the total power of both weapons instead
|
||||
|
@ -501,7 +501,6 @@ int map_moveblock(struct block_list *bl, int x1, int y1, unsigned int tick) {
|
||||
//TODO: Perhaps some outs of bounds checking should be placed here?
|
||||
if (bl->type&BL_CHAR)
|
||||
skill_unit_move(bl,tick,2);
|
||||
|
||||
if (moveblock) map_delblock_sub(bl,0);
|
||||
#ifdef CELL_NOSTACK
|
||||
else map_delblcell(bl);
|
||||
@ -512,8 +511,26 @@ int map_moveblock(struct block_list *bl, int x1, int y1, unsigned int tick) {
|
||||
#ifdef CELL_NOSTACK
|
||||
else map_addblcell(bl);
|
||||
#endif
|
||||
if (bl->type&BL_CHAR)
|
||||
if (bl->type&BL_CHAR) {
|
||||
struct status_change *sc = status_get_sc(bl);
|
||||
skill_unit_move(bl,tick,3);
|
||||
if (sc) {
|
||||
if (sc->option&OPTION_CLOAK)
|
||||
skill_check_cloaking(bl);
|
||||
if (sc->count) {
|
||||
if (sc->data[SC_DANCING].timer != -1) {
|
||||
if (sc->data[SC_DANCING].val1 == CG_MOONLIT) //Cancel Moonlight Petals if moved from casting position. [Skotlex]
|
||||
skill_stop_dancing(bl);
|
||||
else
|
||||
skill_unit_move_unit_group((struct skill_unit_group *)sc->data[SC_DANCING].val2, bl->m, x1-x0, y1-y0);
|
||||
}
|
||||
if (sc->data[SC_CLOSECONFINE].timer != -1)
|
||||
status_change_end(bl, SC_CLOSECONFINE, -1);
|
||||
if (sc->data[SC_CLOSECONFINE2].timer != -1)
|
||||
status_change_end(bl, SC_CLOSECONFINE2, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -570,8 +570,6 @@ static int mob_walk(struct mob_data *md,unsigned int tick,int data)
|
||||
map_foreachinmovearea(clif_mobinsight,md->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,md);
|
||||
md->state.state=MS_IDLE;
|
||||
|
||||
if(md->sc.option&OPTION_CLOAK)
|
||||
skill_check_cloaking(&md->bl);
|
||||
}
|
||||
if((i=calc_next_walk_step(md))>0){
|
||||
i = i>>1;
|
||||
|
@ -3634,13 +3634,6 @@ static int pc_walk(int tid,unsigned int tick,int id,int data)
|
||||
-dx, -dy, BL_ALL, sd);
|
||||
sd->walktimer = -1; // set back so not to disturb future pc_stop_walking calls
|
||||
|
||||
if (pc_iscloaking(sd)) // クロ?キングの消滅?査
|
||||
skill_check_cloaking(&sd->bl);
|
||||
/* 被ディボ?ション?査 */
|
||||
if (sd->sc.count) {
|
||||
if (sd->sc.data[SC_DANCING].timer != -1)
|
||||
skill_unit_move_unit_group((struct skill_unit_group *)sd->sc.data[SC_DANCING].val2, sd->bl.m, dx, dy);
|
||||
}
|
||||
if (map_getcell(sd->bl.m,x,y,CELL_CHKNPC))
|
||||
npc_touch_areanpc(sd,sd->bl.m,x,y);
|
||||
else
|
||||
|
203
src/map/skill.c
203
src/map/skill.c
@ -1427,7 +1427,6 @@ int skill_blown( struct block_list *src, struct block_list *target,int count)
|
||||
struct mob_data *md=NULL;
|
||||
struct pet_data *pd=NULL;
|
||||
struct skill_unit *su=NULL;
|
||||
struct status_change* sc=NULL;
|
||||
|
||||
nullpo_retr(0, src);
|
||||
nullpo_retr(0, target);
|
||||
@ -1451,8 +1450,6 @@ int skill_blown( struct block_list *src, struct block_list *target,int count)
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
if (target->type != BL_SKILL)
|
||||
sc = status_get_sc(target);
|
||||
|
||||
if (count&0xf00000)
|
||||
dir = (count>>20)&0xf;
|
||||
@ -1480,19 +1477,6 @@ int skill_blown( struct block_list *src, struct block_list *target,int count)
|
||||
map_foreachinmovearea(clif_moboutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,md);
|
||||
else if(pd)
|
||||
map_foreachinmovearea(clif_petoutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,pd);
|
||||
|
||||
if (sc && sc->count) {
|
||||
if (sc->data[SC_DANCING].timer != -1) { //Move the song/dance [Skotlex]
|
||||
if (sc->data[SC_DANCING].val1 == CG_MOONLIT) //Cancel Moonlight Petals if moved from casting position. [Skotlex]
|
||||
skill_stop_dancing(target);
|
||||
else
|
||||
skill_unit_move_unit_group((struct skill_unit_group *)sc->data[SC_DANCING].val2, target->m, dx, dy);
|
||||
}
|
||||
if (sc->data[SC_CLOSECONFINE].timer != -1)
|
||||
status_change_end(target, SC_CLOSECONFINE, -1);
|
||||
if (sc->data[SC_CLOSECONFINE2].timer != -1)
|
||||
status_change_end(target, SC_CLOSECONFINE2, -1);
|
||||
}
|
||||
|
||||
if(su){
|
||||
skill_unit_move_unit_group(su->group,target->m,dx,dy);
|
||||
@ -2321,75 +2305,42 @@ static int skill_timerskill(int tid, unsigned int tick, int id,int data )
|
||||
*/
|
||||
int skill_addtimerskill(struct block_list *src,unsigned int tick,int target,int x,int y,int skill_id,int skill_lv,int type,int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
int i, max;
|
||||
unsigned short *count=NULL;;
|
||||
struct skill_timerskill *sts = NULL;
|
||||
nullpo_retr(1, src);
|
||||
|
||||
if(src->type == BL_PC) {
|
||||
struct map_session_data *sd = (struct map_session_data *)src;
|
||||
nullpo_retr(1, sd);
|
||||
for(i=0;i<MAX_SKILLTIMERSKILL;i++) {
|
||||
if(sd->skilltimerskill[i].timer == -1) {
|
||||
sd->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
|
||||
sd->skilltimerskill[i].src_id = src->id;
|
||||
sd->skilltimerskill[i].target_id = target;
|
||||
sd->skilltimerskill[i].skill_id = skill_id;
|
||||
sd->skilltimerskill[i].skill_lv = skill_lv;
|
||||
sd->skilltimerskill[i].map = src->m;
|
||||
sd->skilltimerskill[i].x = x;
|
||||
sd->skilltimerskill[i].y = y;
|
||||
sd->skilltimerskill[i].type = type;
|
||||
sd->skilltimerskill[i].flag = flag;
|
||||
sd->timerskill_count++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
switch (src->type) {
|
||||
case BL_PC:
|
||||
sts = ((struct map_session_data *)src)->skilltimerskill;
|
||||
max = MAX_SKILLTIMERSKILL;
|
||||
count = &((struct map_session_data *)src)->timerskill_count;
|
||||
break;
|
||||
case BL_MOB:
|
||||
sts = ((struct mob_data *)src)->skilltimerskill;
|
||||
max = MAX_MOBSKILLTIMERSKILL;
|
||||
break;
|
||||
case BL_PET:
|
||||
sts = ((struct pet_data *)src)->skilltimerskill;
|
||||
max = MAX_MOBSKILLTIMERSKILL;
|
||||
break;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
else if(src->type == BL_MOB) {
|
||||
struct mob_data *md = (struct mob_data *)src;
|
||||
nullpo_retr(1, md);
|
||||
for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
|
||||
if(md->skilltimerskill[i].timer == -1) {
|
||||
md->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
|
||||
md->skilltimerskill[i].src_id = src->id;
|
||||
md->skilltimerskill[i].target_id = target;
|
||||
md->skilltimerskill[i].skill_id = skill_id;
|
||||
md->skilltimerskill[i].skill_lv = skill_lv;
|
||||
md->skilltimerskill[i].map = src->m;
|
||||
md->skilltimerskill[i].x = x;
|
||||
md->skilltimerskill[i].y = y;
|
||||
md->skilltimerskill[i].type = type;
|
||||
md->skilltimerskill[i].flag = flag;
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
else if(src->type == BL_PET) { // [Valaris]
|
||||
struct pet_data *pd = (struct pet_data *)src;
|
||||
nullpo_retr(1, pd);
|
||||
for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
|
||||
if(pd->skilltimerskill[i].timer == -1) {
|
||||
pd->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
|
||||
pd->skilltimerskill[i].src_id = src->id;
|
||||
pd->skilltimerskill[i].target_id = target;
|
||||
pd->skilltimerskill[i].skill_id = skill_id;
|
||||
pd->skilltimerskill[i].skill_lv = skill_lv;
|
||||
pd->skilltimerskill[i].map = src->m;
|
||||
pd->skilltimerskill[i].x = x;
|
||||
pd->skilltimerskill[i].y = y;
|
||||
pd->skilltimerskill[i].type = type;
|
||||
pd->skilltimerskill[i].flag = flag;
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 1;
|
||||
for(i=0;i<max && sts[i].timer != -1;i++);
|
||||
if (i>=max) return 1;
|
||||
|
||||
sts[i].timer = add_timer(tick, skill_timerskill, src->id, i);
|
||||
sts[i].src_id = src->id;
|
||||
sts[i].target_id = target;
|
||||
sts[i].skill_id = skill_id;
|
||||
sts[i].skill_lv = skill_lv;
|
||||
sts[i].map = src->m;
|
||||
sts[i].x = x;
|
||||
sts[i].y = y;
|
||||
sts[i].flag = flag;
|
||||
if (count)
|
||||
(*count)++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
@ -2398,42 +2349,42 @@ int skill_addtimerskill(struct block_list *src,unsigned int tick,int target,int
|
||||
*/
|
||||
int skill_cleartimerskill(struct block_list *src)
|
||||
{
|
||||
int i;
|
||||
int i, max;
|
||||
unsigned short *count=NULL;
|
||||
struct skill_timerskill *sts = NULL;
|
||||
|
||||
nullpo_retr(0, src);
|
||||
|
||||
if(src->type == BL_PC) {
|
||||
struct map_session_data *sd = (struct map_session_data *)src;
|
||||
nullpo_retr(0, sd);
|
||||
|
||||
if (sd->timerskill_count <= 0)
|
||||
switch (src->type) {
|
||||
case BL_PC:
|
||||
sts = ((struct map_session_data *)src)->skilltimerskill;
|
||||
max = MAX_SKILLTIMERSKILL;
|
||||
count = &((struct map_session_data *)src)->timerskill_count;
|
||||
break;
|
||||
case BL_MOB:
|
||||
sts = ((struct mob_data *)src)->skilltimerskill;
|
||||
max = MAX_MOBSKILLTIMERSKILL;
|
||||
break;
|
||||
case BL_PET:
|
||||
sts = ((struct pet_data *)src)->skilltimerskill;
|
||||
max = MAX_MOBSKILLTIMERSKILL;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
|
||||
for(i=0;i<MAX_SKILLTIMERSKILL && sd->timerskill_count > 0;i++) {
|
||||
if(sd->skilltimerskill[i].timer != -1) {
|
||||
delete_timer(sd->skilltimerskill[i].timer, skill_timerskill);
|
||||
sd->skilltimerskill[i].timer = -1;
|
||||
sd->timerskill_count--;
|
||||
}
|
||||
|
||||
if (count) {
|
||||
for(i=0;i<max && *count > 0;i++) {
|
||||
if(sts[i].timer != -1) {
|
||||
delete_timer(sts[i].timer, skill_timerskill);
|
||||
sts[i].timer = -1;
|
||||
(*count)--;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(src->type == BL_MOB) {
|
||||
struct mob_data *md = (struct mob_data *)src;
|
||||
nullpo_retr(0, md);
|
||||
for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
|
||||
if(md->skilltimerskill[i].timer != -1) {
|
||||
delete_timer(md->skilltimerskill[i].timer, skill_timerskill);
|
||||
md->skilltimerskill[i].timer = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(src->type == BL_PET) { // Ya forgot this one, Valaris. [Skotlex]
|
||||
struct pet_data *pd = (struct pet_data *)src;
|
||||
nullpo_retr(1, pd);
|
||||
for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
|
||||
if(pd->skilltimerskill[i].timer != -1) {
|
||||
delete_timer(pd->skilltimerskill[i].timer, skill_timerskill);
|
||||
pd->skilltimerskill[i].timer = -1;
|
||||
} else {
|
||||
for(i=0;i<max;i++) {
|
||||
if(sts[i].timer != -1) {
|
||||
delete_timer(sts[i].timer, skill_timerskill);
|
||||
sts[i].timer = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -9630,31 +9581,27 @@ int skill_attack_area(struct block_list *bl,va_list ap)
|
||||
*/
|
||||
int skill_clear_element_field(struct block_list *bl)
|
||||
{
|
||||
struct mob_data *md=NULL;
|
||||
struct map_session_data *sd=NULL;
|
||||
struct skill_unit_group *ug=NULL;
|
||||
int i,max,skillid;
|
||||
|
||||
nullpo_retr(0, bl);
|
||||
|
||||
if (bl->type==BL_MOB) {
|
||||
max = MAX_MOBSKILLUNITGROUP;
|
||||
md = (struct mob_data *)bl;
|
||||
ug = ((struct mob_data *)bl)->skillunit;
|
||||
} else if(bl->type==BL_PC) {
|
||||
max = MAX_SKILLUNITGROUP;
|
||||
sd = (struct map_session_data *)bl;
|
||||
ug = ((struct map_session_data *)bl)->skillunit;
|
||||
} else if(bl->type==BL_PET) {
|
||||
max = MAX_MOBSKILLUNITGROUP;
|
||||
ug = ((struct pet_data*)bl)->skillunit;
|
||||
} else
|
||||
return 0;
|
||||
|
||||
for (i=0;i<max;i++) {
|
||||
if(sd){
|
||||
skillid=sd->skillunit[i].skill_id;
|
||||
if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
|
||||
skill_delunitgroup(&sd->skillunit[i]);
|
||||
}else if(md){
|
||||
skillid=md->skillunit[i].skill_id;
|
||||
if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
|
||||
skill_delunitgroup(&md->skillunit[i]);
|
||||
}
|
||||
skillid=ug[i].skill_id;
|
||||
if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
|
||||
skill_delunitgroup(&ug[i]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -10274,6 +10221,8 @@ struct skill_unit_group_tickset *skill_unitgrouptickset_search(
|
||||
set = ((struct map_session_data *)bl)->skillunittick;
|
||||
else if (bl->type == BL_MOB)
|
||||
set = ((struct mob_data *)bl)->skillunittick;
|
||||
else if (bl->type == BL_PET)
|
||||
set = ((struct pet_data *)bl)->skillunittick;
|
||||
else
|
||||
return 0;
|
||||
|
||||
|
@ -5545,7 +5545,9 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
|
||||
{
|
||||
int s = 0;
|
||||
int sp = 1;
|
||||
if(sd && (--sc->data[type].val3) > 0) {
|
||||
if (--sc->data[type].val3 <= 0)
|
||||
break;
|
||||
if(sd) {
|
||||
switch(sc->data[type].val1){
|
||||
case BD_RICHMANKIM: /* ニヨルドの宴 3秒にSP1 */
|
||||
case BD_DRUMBATTLEFIELD: /* ?太鼓の響き 3秒にSP1 */
|
||||
@ -5591,11 +5593,11 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
|
||||
if (sd->status.sp <= 0)
|
||||
break;
|
||||
}
|
||||
sc->data[type].timer=add_timer( /* タイマ?再設定 */
|
||||
1000+tick, status_change_timer,
|
||||
bl->id, data);
|
||||
return 0;
|
||||
}
|
||||
sc->data[type].timer=add_timer( /* タイマ?再設定 */
|
||||
1000+tick, status_change_timer,
|
||||
bl->id, data);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user