* Added experimental code to generate a stack dump when it segfaults
git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@1108 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
d68621fd8c
commit
e35474dbaa
@ -1,6 +1,9 @@
|
|||||||
Date Added
|
Date Added
|
||||||
|
|
||||||
02/15
|
02/15
|
||||||
|
* Rewrote skill blocking system that was allowing people to bypass blocking
|
||||||
|
time simply by casting a different skill [celest]
|
||||||
|
* Edited out some inconsistencies with skillnotok [celest]
|
||||||
* Corrected Investigate's damage calculation, thanks to matthias [celest]
|
* Corrected Investigate's damage calculation, thanks to matthias [celest]
|
||||||
* Generate the remaining entries of the stat point DB if the number of
|
* Generate the remaining entries of the stat point DB if the number of
|
||||||
entries in db/statuspoints.txt is less than MAX_LEVEL, or statuspoints.txt
|
entries in db/statuspoints.txt is less than MAX_LEVEL, or statuspoints.txt
|
||||||
|
@ -215,6 +215,7 @@ struct map_session_data {
|
|||||||
struct skill_unit_group skillunit[MAX_SKILLUNITGROUP];
|
struct skill_unit_group skillunit[MAX_SKILLUNITGROUP];
|
||||||
struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
|
struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
|
||||||
struct skill_timerskill skilltimerskill[MAX_SKILLTIMERSKILL];
|
struct skill_timerskill skilltimerskill[MAX_SKILLTIMERSKILL];
|
||||||
|
char blockskill[MAX_SKILL]; // [celest]
|
||||||
unsigned short timerskill_count; // [celest]
|
unsigned short timerskill_count; // [celest]
|
||||||
int cloneskill_id;
|
int cloneskill_id;
|
||||||
int potion_hp,potion_sp,potion_per_hp,potion_per_sp;
|
int potion_hp,potion_sp,potion_per_hp,potion_per_sp;
|
||||||
|
30
src/map/pc.c
30
src/map/pc.c
@ -706,6 +706,9 @@ int pc_authok(int id, int login_id2, time_t connect_until_time, struct mmo_chars
|
|||||||
sd->skilltimerskill[i].timer = -1;
|
sd->skilltimerskill[i].timer = -1;
|
||||||
sd->timerskill_count=0;
|
sd->timerskill_count=0;
|
||||||
|
|
||||||
|
for (i=0; i<MAX_SKILL; i++)
|
||||||
|
sd->blockskill[i]=0;
|
||||||
|
|
||||||
memset(&sd->dev,0,sizeof(struct square));
|
memset(&sd->dev,0,sizeof(struct square));
|
||||||
for(i = 0; i < 5; i++) {
|
for(i = 0; i < 5; i++) {
|
||||||
sd->dev.val1[i] = 0;
|
sd->dev.val1[i] = 0;
|
||||||
@ -1832,6 +1835,33 @@ int pc_skill(struct map_session_data *sd,int id,int level,int flag)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*==========================================
|
||||||
|
*
|
||||||
|
*------------------------------------------
|
||||||
|
*/
|
||||||
|
int pc_blockskill_end(int tid,unsigned int tick,int id,int data)
|
||||||
|
{
|
||||||
|
struct map_session_data *sd;
|
||||||
|
|
||||||
|
nullpo_retr (-1, sd = map_id2sd(id));
|
||||||
|
sd->blockskill[data] = 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
void pc_blockskill_start (struct map_session_data *sd, int skillid, int tick)
|
||||||
|
{
|
||||||
|
nullpo_retv(sd);
|
||||||
|
|
||||||
|
if (skillid >= 10000 && skillid < 10015)
|
||||||
|
skillid -= 9500;
|
||||||
|
else if (skillid < 1 || skillid > MAX_SKILL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sd->blockskill[skillid] = 1;
|
||||||
|
add_timer(gettick()+tick,pc_blockskill_end,sd->bl.id,skillid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
* ƒJ?ƒh?“ü
|
* ƒJ?ƒh?“ü
|
||||||
*------------------------------------------
|
*------------------------------------------
|
||||||
|
@ -91,6 +91,8 @@ int pc_bonus2(struct map_session_data *sd,int,int,int);
|
|||||||
int pc_bonus3(struct map_session_data *sd,int,int,int,int);
|
int pc_bonus3(struct map_session_data *sd,int,int,int,int);
|
||||||
int pc_skill(struct map_session_data*,int,int,int);
|
int pc_skill(struct map_session_data*,int,int,int);
|
||||||
|
|
||||||
|
void pc_blockskill_start (struct map_session_data*,int,int); // [celest]
|
||||||
|
|
||||||
int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip);
|
int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip);
|
||||||
|
|
||||||
int pc_item_identify(struct map_session_data *sd,int idx);
|
int pc_item_identify(struct map_session_data *sd,int idx);
|
||||||
|
@ -810,17 +810,26 @@ int skill_trap_splash(struct block_list *bl, va_list ap );
|
|||||||
int skill_count_target(struct block_list *bl, va_list ap );
|
int skill_count_target(struct block_list *bl, va_list ap );
|
||||||
|
|
||||||
// [MouseJstr] - skill ok to cast? and when?
|
// [MouseJstr] - skill ok to cast? and when?
|
||||||
int skillnotok(int skillid, struct map_session_data *sd) {
|
int skillnotok(int skillid, struct map_session_data *sd)
|
||||||
|
{
|
||||||
if (sd == 0)
|
nullpo_retr (1, sd);
|
||||||
|
//if (sd == 0)
|
||||||
//return 0;
|
//return 0;
|
||||||
return 1;
|
//return 1;
|
||||||
// I think it was meant to be "no skills allowed when not a valid sd"
|
// I think it was meant to be "no skills allowed when not a valid sd"
|
||||||
|
|
||||||
if (!(skillid >= 10000 && skillid < 10015))
|
if (!(skillid >= 10000 && skillid < 10015))
|
||||||
if ((skillid > MAX_SKILL) || (skillid < 0))
|
if ((skillid > MAX_SKILL) || (skillid < 0))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
{
|
||||||
|
int i = skillid;
|
||||||
|
if (i >= 10000 && i < 10015)
|
||||||
|
i -= 9500;
|
||||||
|
if (sd->blockskill[i] > 0)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (pc_isGM(sd) >= 20)
|
if (pc_isGM(sd) >= 20)
|
||||||
return 0; // gm's can do anything damn thing they want
|
return 0; // gm's can do anything damn thing they want
|
||||||
|
|
||||||
@ -2784,7 +2793,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
|
|||||||
clif_updatestatus(sd,SP_SP);
|
clif_updatestatus(sd,SP_SP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
status_change_start(src,SC_BLOCKSKILL,skilllv,0,skillid,0, (skilllv < 5 ? 10000: 15000),0 );
|
pc_blockskill_start (sd, skillid, (skilllv < 5 ? 10000: 15000));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -2924,7 +2933,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
|
|||||||
return 1;
|
return 1;
|
||||||
if(status_get_class(bl) == 1288)
|
if(status_get_class(bl) == 1288)
|
||||||
return 1;
|
return 1;
|
||||||
if (skillnotok(skillid, (struct map_session_data *)bl)) // [MouseJstr]
|
if (sd && skillnotok(skillid, sd)) // [MouseJstr]
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
map_freeblock_lock();
|
map_freeblock_lock();
|
||||||
@ -3266,7 +3275,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
|
|||||||
case SM_ENDURE: /* インデュア */
|
case SM_ENDURE: /* インデュア */
|
||||||
clif_skill_nodamage(src,bl,skillid,skilllv,1);
|
clif_skill_nodamage(src,bl,skillid,skilllv,1);
|
||||||
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
|
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
|
||||||
status_change_start(src,SC_BLOCKSKILL,skilllv,0,skillid,0,10000,0 );
|
pc_blockskill_start (sd, skillid, 10000);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SM_AUTOBERSERK: // Celest
|
case SM_AUTOBERSERK: // Celest
|
||||||
@ -4609,7 +4618,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
|
|||||||
src->m,src->x-15,src->y-15,src->x+15,src->y+15,0,
|
src->m,src->x-15,src->y-15,src->x+15,src->y+15,0,
|
||||||
src,skillid,skilllv,tick, flag|BCT_ALL|1,
|
src,skillid,skilllv,tick, flag|BCT_ALL|1,
|
||||||
skill_castend_nodamage_id);
|
skill_castend_nodamage_id);
|
||||||
status_change_start(src,SC_BLOCKSKILL,skilllv,0,skillid,0,300000,0 );
|
pc_blockskill_start (sd, skillid, 300000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -4634,7 +4643,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
|
|||||||
src->m,src->x-15,src->y-15,src->x+15,src->y+15,0,
|
src->m,src->x-15,src->y-15,src->x+15,src->y+15,0,
|
||||||
src,skillid,skilllv,tick, flag|BCT_ALL|1,
|
src,skillid,skilllv,tick, flag|BCT_ALL|1,
|
||||||
skill_castend_nodamage_id);
|
skill_castend_nodamage_id);
|
||||||
status_change_start(src,SC_BLOCKSKILL,skilllv,0,skillid,0,300000,0 );
|
pc_blockskill_start (sd, skillid, 300000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -4664,7 +4673,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
|
|||||||
src->m,src->x-15,src->y-15,src->x+15,src->y+15,0,
|
src->m,src->x-15,src->y-15,src->x+15,src->y+15,0,
|
||||||
src,skillid,skilllv,tick, flag|BCT_ALL|1,
|
src,skillid,skilllv,tick, flag|BCT_ALL|1,
|
||||||
skill_castend_nodamage_id);
|
skill_castend_nodamage_id);
|
||||||
status_change_start(src,SC_BLOCKSKILL,skilllv,0,skillid,0,300000,0 );
|
pc_blockskill_start (sd, skillid, 300000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -4693,7 +4702,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
|
|||||||
pc_setpos(dstsd, sd->mapname, sd->bl.x+dx[j], sd->bl.y+dy[j], 2);
|
pc_setpos(dstsd, sd->mapname, sd->bl.x+dx[j], sd->bl.y+dy[j], 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
status_change_start(src,SC_BLOCKSKILL,skilllv,0,skillid,0,300000,0 );
|
pc_blockskill_start (sd, skillid, 300000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -4868,7 +4877,7 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil
|
|||||||
skillid != AM_SPHEREMINE)
|
skillid != AM_SPHEREMINE)
|
||||||
clif_skill_poseffect(src,skillid,skilllv,x,y,tick);
|
clif_skill_poseffect(src,skillid,skilllv,x,y,tick);
|
||||||
|
|
||||||
if (skillnotok(skillid, sd)) // [MouseJstr]
|
if (sd && skillnotok(skillid, sd)) // [MouseJstr]
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
switch(skillid)
|
switch(skillid)
|
||||||
@ -5002,7 +5011,7 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil
|
|||||||
pc_movepos(sd,x,y);
|
pc_movepos(sd,x,y);
|
||||||
}else if( src->type==BL_MOB )
|
}else if( src->type==BL_MOB )
|
||||||
mob_warp((struct mob_data *)src,-1,x,y,0);
|
mob_warp((struct mob_data *)src,-1,x,y,0);
|
||||||
status_change_start(src,SC_BLOCKSKILL,skilllv,0,MO_EXTREMITYFIST,0,2000,0 );
|
pc_blockskill_start (sd, MO_EXTREMITYFIST, 2000);
|
||||||
break;
|
break;
|
||||||
case AM_CANNIBALIZE: // バイオプラント
|
case AM_CANNIBALIZE: // バイオプラント
|
||||||
if(sd){
|
if(sd){
|
||||||
@ -5100,10 +5109,6 @@ int skill_castend_map( struct map_session_data *sd,int skill_num, const char *ma
|
|||||||
sd->sc_data[SC_BERSERK].timer != -1 ||
|
sd->sc_data[SC_BERSERK].timer != -1 ||
|
||||||
sd->sc_data[SC_MARIONETTE].timer != -1)
|
sd->sc_data[SC_MARIONETTE].timer != -1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (sd->sc_data[SC_BLOCKSKILL].timer!=-1)
|
|
||||||
if (skill_num == sd->sc_data[SC_BLOCKSKILL].val3)
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( skill_num != sd->skillid) /* 不正パケットらしい */
|
if( skill_num != sd->skillid) /* 不正パケットらしい */
|
||||||
@ -7474,10 +7479,6 @@ int skill_use_id( struct map_session_data *sd, int target_id,
|
|||||||
if(lv==5 && skill_num!=MO_FINGEROFFENSIVE && skill_num!=MO_INVESTIGATE && skill_num!=MO_CHAINCOMBO && skill_num!=MO_EXTREMITYFIST) return 0;
|
if(lv==5 && skill_num!=MO_FINGEROFFENSIVE && skill_num!=MO_INVESTIGATE && skill_num!=MO_CHAINCOMBO && skill_num!=MO_EXTREMITYFIST) return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sc_data[SC_BLOCKSKILL].timer!=-1)
|
|
||||||
if (skill_num == sc_data[SC_BLOCKSKILL].val3)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (sc_data[SC_BASILICA].timer != -1) { // Disallow all other skills in Basilica [celest]
|
if (sc_data[SC_BASILICA].timer != -1) { // Disallow all other skills in Basilica [celest]
|
||||||
struct skill_unit *su;
|
struct skill_unit *su;
|
||||||
if ((su = (struct skill_unit *)sc_data[SC_BASILICA].val4)) {
|
if ((su = (struct skill_unit *)sc_data[SC_BASILICA].val4)) {
|
||||||
@ -7822,10 +7823,6 @@ int skill_use_pos( struct map_session_data *sd,
|
|||||||
sc_data[SC_MARIONETTE].timer != -1)
|
sc_data[SC_MARIONETTE].timer != -1)
|
||||||
return 0; /* ?態異常や沈?など */
|
return 0; /* ?態異常や沈?など */
|
||||||
|
|
||||||
if (sc_data[SC_BLOCKSKILL].timer!=-1)
|
|
||||||
if (skill_num == sd->sc_data[SC_BLOCKSKILL].val3)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (sc_data[SC_BASILICA].timer != -1) { // Basilica cancels if caster moves [celest]
|
if (sc_data[SC_BASILICA].timer != -1) { // Basilica cancels if caster moves [celest]
|
||||||
struct skill_unit *su;
|
struct skill_unit *su;
|
||||||
if ((su = (struct skill_unit *)sc_data[SC_BASILICA].val4)) {
|
if ((su = (struct skill_unit *)sc_data[SC_BASILICA].val4)) {
|
||||||
|
@ -353,10 +353,9 @@ enum { // struct map_session_data
|
|||||||
SC_MINDBREAKER =191,
|
SC_MINDBREAKER =191,
|
||||||
SC_SPELLBREAKER =192,
|
SC_SPELLBREAKER =192,
|
||||||
SC_LANDPROTECTOR =193,
|
SC_LANDPROTECTOR =193,
|
||||||
SC_BLOCKSKILL =194, // for disallowing the use of a skill for a time period
|
SC_ADAPTATION =194,
|
||||||
SC_ADAPTATION =195,
|
SC_CHASEWALK =195,
|
||||||
SC_CHASEWALK =196,
|
SC_REGENERATION =196,
|
||||||
SC_REGENERATION =201,
|
|
||||||
|
|
||||||
|
|
||||||
// [Celest]
|
// [Celest]
|
||||||
|
@ -3489,11 +3489,6 @@ int status_change_start(struct block_list *bl,int type,int val1,int val2,int val
|
|||||||
case SC_PRESERVE:
|
case SC_PRESERVE:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SC_BLOCKSKILL:
|
|
||||||
if (!tick) tick = 60000;
|
|
||||||
if (!val3) val3 = -1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SC_SLOWDOWN:
|
case SC_SLOWDOWN:
|
||||||
case SC_SPEEDUP0:
|
case SC_SPEEDUP0:
|
||||||
calc_flag = 1;
|
calc_flag = 1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user