- Added a column in skill_cast_db for specifying can't walk delays.

- Removed the apply walk-delay entry from skill_cast_nodex
- Fixed autoloot dropping the item to the ground even when it was autolooted.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@5450 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
skotlex 2006-03-03 18:46:51 +00:00
parent d4ccec0203
commit 2558edf496
6 changed files with 352 additions and 354 deletions

View File

@ -5,6 +5,12 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. EV
GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALARIS
2006/03/03
* Added a column in skill_cast_db for specifying can't walk delays. It's
all set to 0 currently, so someone get updating them! [Skotlex]
* Removed the apply walk-delay entry from skill_cast_nodex as the new walk
delay column handles this now. [Skotlex]
* Fixed autoloot dropping the item to the ground even when it was
autolooted. [Skotlex]
* Fixed character deletion working on SQL without an email address (Thanks to Valaris) [Zephiris]
* Added event 8 for mobspawns that should spawn with special ai set. This
means that now in the mob_spawn files if you use 8 as the last entry, the

File diff suppressed because it is too large Load Diff

View File

@ -1,18 +1,14 @@
//<Skill id>,<Cast: 1 or 0>,<Delay (Optional): 1 or 0>,<Walk Delay(Optional): 1 or 0>
//<Skill id>,<Cast: 1 or 0>,<Delay (Optional): 1 or 0>
// Cast: With 1, dex does not affect the skill's cast rate
// Cast: With 0, dex affects the skill's cast rate
// Delay: With 1, dex does not affect the skill's delay rate
// Delay: With 0, dex affects the skill's delay rate
// Walk Delay: With 1, characters can't move while the skill's delay is active.
// Walk Delay: With 0, characters can move as soon as the spell finishes casting.
// Example - 46,1,1 = Double Strafe's casting time and delay is not affected by dex.
// By default, dex NEVER affects after-cast delay, so no need of putting 'x,0,1' in this file
136,0,0,1 //AS_SONICBLOW
336,1 //WE_CALLPARTNER
366,1 //HW_MAGICPOWER
370,1 //CH_PALMSTRIKE
394,0,0,1 //CG_ARROWVULCAN
403,1 //PF_MEMORIZE
408,1 //WE_BABY
409,1 //WE_CALLPARENT

View File

@ -2095,7 +2095,7 @@ static void mob_item_drop(struct mob_data *md, unsigned int tick, struct delay_i
ditem->first_sd->status.party_id?
party_search(ditem->first_sd->status.party_id):
NULL,
ditem->first_sd,&ditem->item_data)
ditem->first_sd,&ditem->item_data) == 0
) {
aFree(ditem);
return;

View File

@ -597,6 +597,7 @@ int skill_get_zeny( int id ,int lv ){ skill_get (skill_db[id].zeny[lv-1], id, lv
int skill_get_num( int id ,int lv ){ skill_get (skill_db[id].num[lv-1], id, lv); }
int skill_get_cast( int id ,int lv ){ skill_get (skill_db[id].cast[lv-1], id, lv); }
int skill_get_delay( int id ,int lv ){ skill_get (skill_db[id].delay[lv-1], id, lv); }
int skill_get_walkdelay( int id ,int lv ){ skill_get (skill_db[id].walkdelay[lv-1], id, lv); }
int skill_get_time( int id ,int lv ){ skill_get (skill_db[id].upkeep_time[lv-1], id, lv); }
int skill_get_time2( int id ,int lv ){ skill_get (skill_db[id].upkeep_time2[lv-1], id, lv); }
int skill_get_castdef( int id ){ skill_get (skill_db[id].cast_def_rate, id, 1); }
@ -608,7 +609,6 @@ int skill_get_blewcount( int id ,int lv ){ skill_get (skill_db[id].blewcount[lv-
int skill_get_mhp( int id ,int lv ){ skill_get (skill_db[id].mhp[lv-1], id, lv); }
int skill_get_castnodex( int id ,int lv ){ skill_get (skill_db[id].castnodex[lv-1], id, lv); }
int skill_get_delaynodex( int id ,int lv ){ skill_get (skill_db[id].delaynodex[lv-1], id, lv); }
int skill_get_delaynowalk( int id ,int lv ){ skill_get (skill_db[id].delaynowalk[lv-1], id, lv); }
int skill_get_nocast ( int id ){ skill_get (skill_db[id].nocast, id, 1); }
int skill_get_type( int id ){ skill_get (skill_db[id].skill_type, id, 1); }
int skill_get_unit_id ( int id, int flag ){ skill_get (skill_db[id].unit_id[flag], id, 1); }
@ -5651,7 +5651,7 @@ int skill_castend_id( int tid, unsigned int tick, int id,int data )
{
struct map_session_data* sd = map_id2sd(id)/*,*target_sd=NULL*/;
struct block_list *bl;
int delay,inf2;
int inf2;
nullpo_retr(0, sd);
@ -5672,8 +5672,8 @@ int skill_castend_id( int tid, unsigned int tick, int id,int data )
return 0;
}
if(sd->skillid != SA_CASTCANCEL && sd->skilltimer != -1 && (delay = pc_checkskill(sd,SA_FREECAST) > 0)) //Hope ya don't mind me borrowing delay :X
status_quick_recalc_speed(sd, SA_FREECAST, delay, 0);
if(sd->skillid != SA_CASTCANCEL && sd->skilltimer != -1 && (inf2 = pc_checkskill(sd,SA_FREECAST) > 0)) //Hope ya don't mind me borrowing inf2 :X
status_quick_recalc_speed(sd, SA_FREECAST, inf2, 0);
if(sd->skillid != SA_CASTCANCEL)
sd->skilltimer=-1;
@ -5760,13 +5760,10 @@ int skill_castend_id( int tid, unsigned int tick, int id,int data )
pc_stop_walking(sd,0);
if (sd->skillid == SA_MAGICROD)
delay = 0;
sd->canact_tick = tick;
else
delay = skill_delayfix(&sd->bl, sd->skillid, sd->skilllv, 0);
sd->canact_tick = tick + delay;
if (skill_get_delaynowalk(sd->skillid, sd->skilllv)) //Skills that block you from moving until delay ends. [Skotlex]
sd->canmove_tick = tick + delay;
sd->canact_tick = tick + skill_delayfix(&sd->bl, sd->skillid, sd->skilllv, 0);
sd->canmove_tick = tick + skill_get_walkdelay(sd->skillid, sd->skilllv);
if (skill_get_casttype(sd->skillid) == CAST_NODAMAGE)
skill_castend_nodamage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0);
else
@ -5793,7 +5790,7 @@ int skill_castend_id( int tid, unsigned int tick, int id,int data )
int skill_castend_pos( int tid, unsigned int tick, int id,int data )
{
struct map_session_data* sd=map_id2sd(id)/*,*target_sd=NULL*/;
int delay,maxcount;
int maxcount;
nullpo_retr(0, sd);
@ -5807,8 +5804,8 @@ int skill_castend_pos( int tid, unsigned int tick, int id,int data )
return 0;
}
if(sd->skillid != SA_CASTCANCEL && sd->skilltimer != -1 && (delay = pc_checkskill(sd,SA_FREECAST) > 0)) //Hope ya don't mind me borrowing delay :X
status_quick_recalc_speed(sd, SA_FREECAST, delay, 0);
if(sd->skillid != SA_CASTCANCEL && sd->skilltimer != -1 && (maxcount = pc_checkskill(sd,SA_FREECAST) > 0)) //Hope ya don't mind me borrowing maxcount :X
status_quick_recalc_speed(sd, SA_FREECAST, maxcount, 0);
sd->skilltimer=-1;
if (sd->bl.prev == NULL || sd->skillid == -1 || sd->skilllv <= 0)
@ -5872,10 +5869,8 @@ int skill_castend_pos( int tid, unsigned int tick, int id,int data )
ShowInfo("PC %d skill castend skill=%d\n",sd->bl.id,sd->skillid);
pc_stop_walking(sd,0);
delay = skill_delayfix(&sd->bl, sd->skillid, sd->skilllv, 0);
sd->canact_tick = tick + delay;
if (skill_get_delaynowalk(sd->skillid, sd->skilllv)) //Skills that block you from moving until delay ends. [Skotlex]
sd->canmove_tick = tick + delay;
sd->canact_tick = tick + skill_delayfix(&sd->bl, sd->skillid, sd->skilllv, 0);
sd->canmove_tick = tick + skill_get_walkdelay(sd->skillid, sd->skilllv);
skill_castend_pos2(&sd->bl,sd->skillx,sd->skilly,sd->skillid,sd->skilllv,tick,0);
@ -11251,15 +11246,21 @@ int skill_readdb(void)
ShowError("can't read %s\n", path);
return 1;
}
l=0;
while(fgets(line,1020,fp)){
l++;
char *split[50];
memset(split,0,sizeof(split)); // [Valaris] thanks to fov
if(line[0]=='/' && line[1]=='/')
continue;
j = skill_split_str(line,split,5);
if(split[4]==NULL || j<5)
j = skill_split_str(line,split,6);
if(split[0]==NULL || j<2)
continue; //Blank line.
if(split[5]==NULL || j<6) {
ShowWarning("skill_cast_db.txt: Insufficient number of fields at line %d\n", l);
continue;
}
i=atoi(split[0]);
if (i>=10000 && i<10015) // for guild skills [Celest]
i -= 9500;
@ -11268,8 +11269,9 @@ int skill_readdb(void)
skill_split_atoi(split[1],skill_db[i].cast);
skill_split_atoi(split[2],skill_db[i].delay);
skill_split_atoi(split[3],skill_db[i].upkeep_time);
skill_split_atoi(split[4],skill_db[i].upkeep_time2);
skill_split_atoi(split[3],skill_db[i].walkdelay);
skill_split_atoi(split[4],skill_db[i].upkeep_time);
skill_split_atoi(split[5],skill_db[i].upkeep_time2);
}
fclose(fp);
ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n",path);
@ -11447,7 +11449,7 @@ int skill_readdb(void)
if(line[0]=='/' && line[1]=='/')
continue;
memset(split,0,sizeof(split));
j = skill_split_str(line,split,4);
j = skill_split_str(line,split,3);
if(split[0]==0) //fixed by Lupus
continue;
i=atoi(split[0]);
@ -11460,9 +11462,6 @@ int skill_readdb(void)
if (!split[2])
continue;
skill_split_atoi(split[2],skill_db[i].delaynodex);
if(!split[3])
continue;
skill_split_atoi(split[3],skill_db[i].delaynowalk);
}
fclose(fp);
ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n",path);

View File

@ -48,7 +48,7 @@ struct skill_db {
char *desc;
int range[MAX_SKILL_LEVEL],hit,inf,pl,nk,splash[MAX_SKILL_LEVEL],max;
int num[MAX_SKILL_LEVEL];
int cast[MAX_SKILL_LEVEL],delay[MAX_SKILL_LEVEL];
int cast[MAX_SKILL_LEVEL],walkdelay[MAX_SKILL_LEVEL],delay[MAX_SKILL_LEVEL];
int upkeep_time[MAX_SKILL_LEVEL],upkeep_time2[MAX_SKILL_LEVEL];
int castcancel,cast_def_rate;
int inf2,maxcount,skill_type;
@ -58,7 +58,6 @@ struct skill_db {
int itemid[10],amount[10];
int castnodex[MAX_SKILL_LEVEL];
int delaynodex[MAX_SKILL_LEVEL];
int delaynowalk[MAX_SKILL_LEVEL];
int nocast;
int unit_id[2];
int unit_layout_type[MAX_SKILL_LEVEL];
@ -150,6 +149,7 @@ int skill_get_zeny( int id ,int lv );
int skill_get_num( int id ,int lv );
int skill_get_cast( int id ,int lv );
int skill_get_delay( int id ,int lv );
int skill_get_walkdelay( int id ,int lv );
int skill_get_time( int id ,int lv );
int skill_get_time2( int id ,int lv );
int skill_get_castdef( int id );