Browse Source

* 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
celest 20 years ago
parent
commit
e35474dbaa
7 changed files with 75 additions and 48 deletions
  1. 3 0
      Changelog-SVN.txt
  2. 1 0
      src/map/map.h
  3. 30 0
      src/map/pc.c
  4. 2 0
      src/map/pc.h
  5. 36 39
      src/map/skill.c
  6. 3 4
      src/map/skill.h
  7. 0 5
      src/map/status.c

+ 3 - 0
Changelog-SVN.txt

@@ -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

+ 1 - 0
src/map/map.h

@@ -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 - 0
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?“ü
  *------------------------------------------
  *------------------------------------------

+ 2 - 0
src/map/pc.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);

+ 36 - 39
src/map/skill.c

@@ -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) {
-	
-	if (sd == 0)
+int skillnotok(int skillid, struct map_session_data *sd)
+{	
+	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
 
 
@@ -835,16 +844,16 @@ int skillnotok(int skillid, struct map_session_data *sd) {
 		return 1;
 		return 1;
 	if (battle_config.pk_mode && !map[sd->bl.m].flag.nopvp && skill_get_nocast (skillid) & 16)
 	if (battle_config.pk_mode && !map[sd->bl.m].flag.nopvp && skill_get_nocast (skillid) & 16)
 		return 1;
 		return 1;
-
-     switch (skillid) {
-       case AL_WARP:
-       case AL_TELEPORT:
-       case MC_VENDING:
-       case MC_IDENTIFY:
-             return 0; // always allowed
-       default:
-           return(map[sd->bl.m].flag.noskill);
-     }
+	
+	switch (skillid) {
+		case AL_WARP:
+		case AL_TELEPORT:
+		case MC_VENDING:
+		case MC_IDENTIFY:
+			return 0; // always allowed
+		default:
+			return(map[sd->bl.m].flag.noskill);
+	}
 }
 }
 
 
 
 
@@ -1495,7 +1504,7 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds
 		return 0;
 		return 0;
 	if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) //?象がPCですでに死んでいたら何もしない
 	if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) //?象がPCですでに死んでいたら何もしない
 		return 0;
 		return 0;
-	if(bl->type == BL_PC && skillnotok(skillid, (struct map_session_data *)  bl))
+	if(bl->type == BL_PC && skillnotok(skillid, (struct map_session_data *)bl))
 	        return 0; // [MouseJstr]
 	        return 0; // [MouseJstr]
 	if(sc_data && sc_data[SC_HIDING].timer != -1) { //ハイディング?態で
 	if(sc_data && sc_data[SC_HIDING].timer != -1) { //ハイディング?態で
 		if(skill_get_pl(skillid) != 2) //スキルの?性が地?性でなければ何もしない
 		if(skill_get_pl(skillid) != 2) //スキルの?性が地?性でなければ何もしない
@@ -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,8 +4877,8 @@ 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]
-             return 0;
+	if (sd && skillnotok(skillid, sd)) // [MouseJstr]
+		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){
@@ -5085,8 +5094,8 @@ int skill_castend_map( struct map_session_data *sd,int skill_num, const char *ma
 	if( sd->bl.prev == NULL || pc_isdead(sd) )
 	if( sd->bl.prev == NULL || pc_isdead(sd) )
 		return 0;
 		return 0;
 
 
-        if(skillnotok(skill_num, sd))
-            return 0;
+	if(skillnotok(skill_num, sd))
+		return 0;
 
 
 	if( sd->opt1>0 || sd->status.option&2 )
 	if( sd->opt1>0 || sd->status.option&2 )
 		return 0;
 		return 0;
@@ -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)) {

+ 3 - 4
src/map/skill.h

@@ -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		=195,
-	SC_CHASEWALK		=196,
-	SC_REGENERATION		=201,
+	SC_ADAPTATION		=194,
+	SC_CHASEWALK		=195,
+	SC_REGENERATION		=196,
 	
 	
 
 
 // [Celest]
 // [Celest]

+ 0 - 5
src/map/status.c

@@ -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;