فهرست منبع

- The rate passed to status_change_start must now be in 0->10000 range.
- Added macros sc_start and sc_start4 to simplify invocation of status_change_start.
- Cleaned the active guild skills, requirements moved to skill_check_require, should now be usable by non-players as well (pets/mobs).
- Updated skill_cast_db time info. Magnum's time2 is skill-block time, St. Recovery/ Cure's time2 is the confuse/blind duration, added NPC_POWERUP/NPC_AGIUP durations, Napalm Vulcan's time2 is curse length, and most of Tarot Card's effects last time2 as well.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@5454 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex 19 سال پیش
والد
کامیت
db973e2998
14فایلهای تغییر یافته به همراه207 افزوده شده و 289 حذف شده
  1. 5 0
      Changelog-Trunk.txt
  2. 7 0
      db/Changelog.txt
  3. 9 5
      db/skill_cast_db.txt
  4. 2 2
      src/map/atcommand.c
  5. 4 4
      src/map/battle.c
  6. 1 1
      src/map/charsave.c
  7. 1 1
      src/map/chrif.c
  8. 7 35
      src/map/clif.c
  9. 2 2
      src/map/party.c
  10. 14 15
      src/map/pc.c
  11. 3 3
      src/map/script.c
  12. 137 198
      src/map/skill.c
  13. 11 22
      src/map/status.c
  14. 4 1
      src/map/status.h

+ 5 - 0
Changelog-Trunk.txt

@@ -5,6 +5,11 @@ 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
+	* status_change_start now checks on a 0->10000 scale, should fix sc-cards
+	  with very low rates never triggering (eg: some coma-inducing cards).
+	  [Skotlex]
+	* Cleaned up the active guild skills. They should be usable now by
+	  non-players as well. [Skotlex]
 	* Fixed crash on the NPC whisper system when the message's size was 1.
 	  [Skotlex]
 	* Strip status changes are now removed on logout. [Skotlex]

+ 7 - 0
db/Changelog.txt

@@ -26,6 +26,13 @@
 
 =========================
 
+03/03
+	* Updated skill_cast_db time info for some skills: [Skotlex]
+	- Magnum's time2 is skill-block time
+	- St. Recovery/ Cure's time2 is the confuse/blind duration
+	- added NPC_POWERUP/NPC_AGIUP durations
+	- Napalm Vulcan's time2 is curse length
+	- Most of Tarot Card's effects last time2
 	* Adjusted SC durations for Meteor Assault [Skotlex]
 03/02
 	* Temp Plugs for NJ and GS items [Poki#3]

+ 9 - 5
db/skill_cast_db.txt

@@ -36,7 +36,7 @@
 //-- SM_MAGNUM
 7,0,0,0,2000,10000
 //-- SM_ENDURE
-8,0,0,0,10000:13000:16000:19000:22000:25000:28000:31000:34000:37000,0
+8,0,0,0,10000:13000:16000:19000:22000:25000:28000:31000:34000:37000,10000
 //==========================================
 
 
@@ -92,7 +92,7 @@
 //-- AL_BLESSING
 34,0,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0
 //-- AL_CURE
-35,0,1000,0,0,0
+35,0,1000,0,0,6000
 //==========================================
 
 
@@ -149,7 +149,7 @@
 //-- PR_SLOWPOISON
 71,0,0,0,10000:20000:30000:40000,0
 //-- PR_STRECOVERY
-72,0,2000,0,0,0
+72,0,2000,0,0,30000
 //-- PR_KYRIE
 73,2000,2000,0,120000,0
 //-- PR_MAGNIFICAT
@@ -508,6 +508,10 @@
 339,2000,1500,0,900,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
 //-- NPC_STOP
 340,0,0,0,10000,0
+//-- NPC_POWERUP
+349,0,0,0,60000:120000:180000:240000:300000,0
+//-- NPC_AGIUP
+350,0,0,0,60000:120000:180000:240000:300000,0
 //==========================================
 
 
@@ -627,7 +631,7 @@
 //-- LK_JOINTBEAT
 399,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0,30000
 //-- HW_NAPALMVULCAN
-400,1700,1000,0,0,0,0
+400,1700,1000,0,0,0,45000
 //-- CH_SOULCOLLECT
 401,2000,0,0,600000,0
 //-- PF_MINDBREAKER
@@ -779,7 +783,7 @@
 //-- CG_HERMODE
 488,0,0,0,10000:15000:20000:25000:30000,10000:15000:20000:25000:30000
 //-- CG_TAROTCARD
-489,1000,3000,0,0,0
+489,1000,3000,0,0,30000
 //-- CR_ACIDDEMONSTRATION
 490,1000,1000,0,0,0
 //==========================================

+ 2 - 2
src/map/atcommand.c

@@ -8383,7 +8383,7 @@ int atcommand_mute(
 		clif_GM_silence(sd, pl_sd, 0);
 		pl_sd->status.manner -= manner;
 		if(pl_sd->status.manner < 0)
-			status_change_start(&pl_sd->bl,SC_NOCHAT,100,0,0,0,0,0,0);
+			sc_start(&pl_sd->bl,SC_NOCHAT,100,0,0);
 	}
 	else {
 		clif_displaymessage(fd, msg_table[3]); // Character not found.
@@ -9478,7 +9478,7 @@ static int atcommand_mutearea_sub(struct block_list *bl,va_list ap)
 	if (id != bl->id && !pc_isGM(pl_sd)) {
 		pl_sd->status.manner -= time;
 		if (pl_sd->status.manner < 0)
-			status_change_start(&pl_sd->bl,SC_NOCHAT,100,0,0,0,0,0,0);
+			sc_start(&pl_sd->bl,SC_NOCHAT,100,0,0);
 	}
 	return 0;
 }

+ 4 - 4
src/map/battle.c

@@ -604,7 +604,7 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 			if (sd && pc_issit(sd)) pc_setstand(sd); //Stand it to dodge.
 			clif_skill_nodamage(bl,bl,TK_DODGE,1,1);
 			if (sc->data[SC_COMBO].timer == -1)
-				status_change_start(bl, SC_COMBO, 100, TK_JUMPKICK, src->id, 0, 0, 2000, 0);
+				sc_start4(bl, SC_COMBO, 100, TK_JUMPKICK, src->id, 0, 0, 2000);
 			return 0;
 		}
 
@@ -3041,9 +3041,9 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
 			int duration = skill_get_time2(MO_BLADESTOP,skilllv);
 			status_change_end(target, SC_BLADESTOP_WAIT, -1);
 			clif_damage(src, target, tick, status_get_amotion(src), 1, 0, 1, 0, 0); //Display MISS.
-			status_change_start(target, SC_BLADESTOP, 100, skilllv, 2, (int)target, (int)src, duration, 0);
+			sc_start4(target, SC_BLADESTOP, 100, skilllv, 2, (int)target, (int)src, duration);
 			skilllv = sd?pc_checkskill(sd, MO_BLADESTOP):1;
-			status_change_start(src, SC_BLADESTOP, 100, skilllv, 1, (int)src, (int)target, duration, 0);
+			sc_start4(src, SC_BLADESTOP, 100, skilllv, 1, (int)src, (int)target, duration);
 			return 0;
 		}
 
@@ -3098,7 +3098,7 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
 			if (sd->weapon_coma_race[boss?10:11] > 0)
 				rate += sd->weapon_coma_race[boss?10:11];
 			if (rate)
-				status_change_start(target, SC_COMA, rate/100, 0, 0, 0, 0, 0, 0);
+				status_change_start(target, SC_COMA, rate, 0, 0, 0, 0, 0, 0);
 		}
 	}
 

+ 1 - 1
src/map/charsave.c

@@ -467,7 +467,7 @@ int charsave_load_scdata(int account_id, int char_id)
 				continue;
 			}
 
-			status_change_start(&sd->bl, atoi(sql_row[0]), 100, atoi(sql_row[2]), atoi(sql_row[3]),
+			status_change_start(&sd->bl, atoi(sql_row[0]), 10000, atoi(sql_row[2]), atoi(sql_row[3]),
 				atoi(sql_row[4]), atoi(sql_row[5]), atoi(sql_row[1]), 15);
 		}
 	}

+ 1 - 1
src/map/chrif.c

@@ -1227,7 +1227,7 @@ int chrif_load_scdata(int fd)
 			ShowWarning("chrif_load_scdata: Received invalid duration (%d ms) for status change %d (character %s)\n", data.tick, data.type, sd->status.name);
 			continue;
 		}
-		status_change_start(&sd->bl, data.type, 100, data.val1, data.val2, data.val3, data.val4, data.tick, 15);
+		status_change_start(&sd->bl, data.type, 10000, data.val1, data.val2, data.val3, data.val4, data.tick, 15);
 	}
 #endif
 	return 0;

+ 7 - 35
src/map/clif.c

@@ -8823,7 +8823,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
 		clif_changelook(&sd->bl,LOOK_CLOTHES_COLOR,sd->status.clothes_color);
 
 	if(battle_config.muting_players && sd->status.manner < 0 && battle_config.manner_system)
-		status_change_start(&sd->bl,SC_NOCHAT,100,0,0,0,0,0,0);
+		sc_start(&sd->bl,SC_NOCHAT,100,0,0);
 
 // Lance
 	if (script_config.event_script_type == 0) {
@@ -8836,34 +8836,6 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
 		ShowStatus("%d '"CL_WHITE"%s"CL_RESET"' events executed.\n",
 			npc_event_doall_id(script_config.loadmap_event_name, sd->bl.id), script_config.loadmap_event_name);
 	}
-/* These should not be needed anymore. [Skotlex]
- * - the option is sent on every player packet, why send it?
- * - There should be no need to do a signum check on map change, it is done on equipment change.
- * - Trick-dead is finished on pc_setpos
- * - Night effect is handled on clif_spawnpc
-	// option
-	clif_changeoption(&sd->bl);
-	if(sd->sc_data[SC_TRICKDEAD].timer != -1)
-		status_change_end(&sd->bl,SC_TRICKDEAD,-1);
-	if(sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele))
-		status_change_end(&sd->bl,SC_SIGNUMCRUCIS,-1);
-	if(sd->special_state.infinite_endure && sd->sc_data[SC_ENDURE].timer == -1)
-		status_change_start(&sd->bl,SC_ENDURE,100,10,1,0,0,0,0);
-
-	// Required to eliminate glow bugs because it's executed before clif_changeoption [Lance]
-	//New 'night' effect by dynamix [Skotlex]
-	if (night_flag && map[sd->bl.m].flag.nightenabled)
-	{	//Display night.
-		if (sd->state.night) //It must be resent because otherwise players get this annoying aura...
-			clif_status_load(&sd->bl, SI_NIGHT, 0);
-		else
-			sd->state.night = 1;
-		clif_status_load(&sd->bl, SI_NIGHT, 1);
-	} else if (sd->state.night) { //Clear night display.
-		clif_status_load(&sd->bl, SI_NIGHT, 0);
-		sd->state.night = 0;
-	}
-*/
 	if (pc_checkskill(sd,SG_KNOWLEDGE)    || 
 	    pc_checkskill(sd,SG_SUN_COMFORT)  ||
 	    pc_checkskill(sd,SG_MOON_COMFORT) ||
@@ -9161,8 +9133,8 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data *sd) { // S 008c <
 				if (skillnotok(MO_EXPLOSIONSPIRITS,sd))
 					break; //Do not override the noskill mapflag. [Skotlex]
 				clif_skill_nodamage(&sd->bl,&sd->bl,MO_EXPLOSIONSPIRITS,-1,
-					status_change_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],100,
-						17,0,0,0,skill_get_time(MO_EXPLOSIONSPIRITS,1),0 )); //Lv17-> +50 critical (noted by Poki) [Skotlex]
+					sc_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],100,
+						17,skill_get_time(MO_EXPLOSIONSPIRITS,1))); //Lv17-> +50 critical (noted by Poki) [Skotlex]
 				sd->state.snovice_flag = 0;
 				break;
 			}
@@ -11103,7 +11075,7 @@ void clif_parse_GMReqNoChat(int fd,struct map_session_data *sd)
 		{
 			dstsd->status.manner -= limit;
 			if(dstsd->status.manner < 0)
-				status_change_start(bl,SC_NOCHAT,100,0,0,0,0,0,0);
+				sc_start(bl,SC_NOCHAT,100,0,0);
 			else
 			{
 				dstsd->status.manner = 0;
@@ -11300,7 +11272,7 @@ void clif_parse_NoviceDoriDori(int fd, struct map_session_data *sd) {
 	sd->doridori_counter = 1;
 	if ((sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON
 		&& sd->state.rest && (level = pc_checkskill(sd,TK_SPTIME)))
-		status_change_start(&sd->bl,SkillStatusChangeTable[TK_SPTIME],100,level,0,0,0,skill_get_time(TK_SPTIME, level),0);
+		sc_start(&sd->bl,SkillStatusChangeTable[TK_SPTIME],100,level,skill_get_time(TK_SPTIME, level));
 	return;
 }
 /*==========================================
@@ -11319,8 +11291,8 @@ void clif_parse_NoviceExplosionSpirits(int fd, struct map_session_data *sd)
 		}
 		if((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && sd->status.base_exp > 0 && nextbaseexp > 0 && (int)((double)1000*sd->status.base_exp/nextbaseexp)%100==0){
 			clif_skill_nodamage(&sd->bl,&sd->bl,MO_EXPLOSIONSPIRITS,5,
-				status_change_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],100,
-					5,0,0,0,skill_get_time(MO_EXPLOSIONSPIRITS,5),0));
+				sc_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],100,
+					5,skill_get_time(MO_EXPLOSIONSPIRITS,5)));
 		}
 	}
 	return;

+ 2 - 2
src/map/party.c

@@ -582,7 +582,7 @@ int party_skill_check(struct map_session_data *sd, int party_id, int skillid, in
 					&& sd->bl.m == p_sd->bl.m
 					&& pc_checkskill(p_sd,MO_TRIPLEATTACK)) {
 					int rate = 50 +50*skilllv; //+100/150/200% success rate
-					status_change_start(&p_sd->bl,SC_SKILLRATE_UP,100,MO_TRIPLEATTACK,rate,0,0,skill_get_time(SG_FRIEND, 1),0);
+					sc_start4(&p_sd->bl,SC_SKILLRATE_UP,100,MO_TRIPLEATTACK,rate,0,0,skill_get_time(SG_FRIEND, 1));
 				}
 				break;
 			case MO_TRIPLEATTACK: //Increase Counter rate of Star Gladiators
@@ -590,7 +590,7 @@ int party_skill_check(struct map_session_data *sd, int party_id, int skillid, in
 					&& sd->bl.m == p_sd->bl.m
 					&& pc_checkskill(p_sd,TK_COUNTER)) {
 					int rate = 50 +50*pc_checkskill(p_sd,TK_COUNTER); //+100/150/200% success rate
-					status_change_start(&p_sd->bl,SC_SKILLRATE_UP,100,TK_COUNTER,rate,0,0,skill_get_time(SG_FRIEND, 1),0);
+					sc_start4(&p_sd->bl,SC_SKILLRATE_UP,100,TK_COUNTER,rate,0,0,skill_get_time(SG_FRIEND, 1));
 				}
 				break;
 			case AM_TWILIGHT2: //Twilight Pharmacy, requires Super Novice

+ 14 - 15
src/map/pc.c

@@ -307,7 +307,7 @@ int pc_setrestartvalue(struct map_session_data *sd,int type) {
 		sd->status.sp=sd->status.max_sp;
 		if (sd->state.snovice_flag == 4) {
 			sd->state.snovice_flag = 0;
-			status_change_start(&sd->bl,SkillStatusChangeTable[MO_STEELBODY],100,1,0,0,0,skill_get_time(MO_STEELBODY,1),0 );
+			sc_start(&sd->bl,SkillStatusChangeTable[MO_STEELBODY],100,1,skill_get_time(MO_STEELBODY,1));
 		}
 	}
 	else {
@@ -846,7 +846,7 @@ int pc_authok(struct map_session_data *sd, int login_id2, time_t connect_until_t
 	}
 
 	if(sd->status.manner < 0) //Needed or manner will always be negative.
-		status_change_start(&sd->bl,SC_NOCHAT,100,0,0,0,0,0,0);
+		sc_start(&sd->bl,SC_NOCHAT,100,0,0);
 	return 0;
 }
 
@@ -1113,14 +1113,14 @@ int pc_checkweighticon(struct map_session_data *sd)
 
 	if(flag==1){
 		if(sd->sc.data[SC_WEIGHT50].timer==-1)
-			status_change_start(&sd->bl,SC_WEIGHT50,100,0,0,0,0,0,1);
+			sc_start(&sd->bl,SC_WEIGHT50,100,0,0);
 	}else{
 		if(sd->sc.data[SC_WEIGHT50].timer!=-1)
 			status_change_end(&sd->bl,SC_WEIGHT50,-1);
 	} 
 	if(flag==2){
 		if(sd->sc.data[SC_WEIGHT90].timer==-1)
-			status_change_start(&sd->bl,SC_WEIGHT90,100,0,0,0,0,0,1);
+			sc_start(&sd->bl,SC_WEIGHT90,100,0,0);
 	}else{
 		if(sd->sc.data[SC_WEIGHT90].timer!=-1)
 			status_change_end(&sd->bl,SC_WEIGHT90,-1);
@@ -3609,8 +3609,7 @@ int pc_walktoxy (struct map_session_data *sd, int x, int y)
 	if (sd->sc.data && sd->sc.data[SC_MIRACLE].timer==-1 && ((sd->status.class_==JOB_STAR_GLADIATOR) || (sd->status.class_==JOB_STAR_GLADIATOR2)) && (rand()%10000 < battle_config.sg_miracle_skill_ratio) )
 	{
 		clif_displaymessage(sd->fd,"[Miracle of the Sun, Moon and Stars]");
-		status_change_start(&sd->bl,SC_MIRACLE,100,
-				1,0,0,0,battle_config.sg_miracle_skill_duration,0);
+		sc_start(&sd->bl,SC_MIRACLE,100,1,battle_config.sg_miracle_skill_duration);
 	}
 
 	return 0;
@@ -4513,11 +4512,11 @@ int pc_checkbaselevelup(struct map_session_data *sd)
 
 		//スパノビはキリエ、イムポ、マニピ、グロ、サフラLv1がかかる
 		if((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE || (sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON){
-			status_change_start(&sd->bl,SkillStatusChangeTable[PR_KYRIE],100,1,0,0,0,skill_get_time(PR_KYRIE,1),0 );
-			status_change_start(&sd->bl,SkillStatusChangeTable[PR_IMPOSITIO],100,1,0,0,0,skill_get_time(PR_IMPOSITIO,1),0 );
-			status_change_start(&sd->bl,SkillStatusChangeTable[PR_MAGNIFICAT],100,1,0,0,0,skill_get_time(PR_MAGNIFICAT,1),0 );
-			status_change_start(&sd->bl,SkillStatusChangeTable[PR_GLORIA],100,1,0,0,0,skill_get_time(PR_GLORIA,1),0 );
-			status_change_start(&sd->bl,SkillStatusChangeTable[PR_SUFFRAGIUM],100,1,0,0,0,skill_get_time(PR_SUFFRAGIUM,1),0 );
+			sc_start(&sd->bl,SkillStatusChangeTable[PR_KYRIE],100,1,skill_get_time(PR_KYRIE,1));
+			sc_start(&sd->bl,SkillStatusChangeTable[PR_IMPOSITIO],100,1,skill_get_time(PR_IMPOSITIO,1));
+			sc_start(&sd->bl,SkillStatusChangeTable[PR_MAGNIFICAT],100,1,skill_get_time(PR_MAGNIFICAT,1));
+			sc_start(&sd->bl,SkillStatusChangeTable[PR_GLORIA],100,1,skill_get_time(PR_GLORIA,1));
+			sc_start(&sd->bl,SkillStatusChangeTable[PR_SUFFRAGIUM],100,1,skill_get_time(PR_SUFFRAGIUM,1));
 		}
 
 		clif_misceffect(&sd->bl,0);
@@ -5270,7 +5269,7 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
 		if(sd->status.hp<sd->status.max_hp>>2 && sd->sc.data[SC_AUTOBERSERK].timer != -1 &&
 			(sd->sc.data[SC_PROVOKE].timer==-1 || sd->sc.data[SC_PROVOKE].val2==0 ))
 			// オ?トバ?サ?ク?動
-			status_change_start(&sd->bl,SC_PROVOKE,100,10,1,0,0,0,0);
+			sc_start4(&sd->bl,SC_PROVOKE,100,10,1,0,0,0);
 
 		sd->canlog_tick = gettick();
 
@@ -5329,7 +5328,7 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
 			if (battle_config.pk_mode && ssd->status.manner >= 0 && battle_config.manner_system) {
 				ssd->status.manner -= 5;
 				if(ssd->status.manner < 0)
-					status_change_start(src,SC_NOCHAT,100,0,0,0,0,0,0);
+					sc_start(src,SC_NOCHAT,100,0,0);
 
 			// PK/Karma system code (not enabled yet) [celest]
 			// originally from Kade Online, so i don't know if any of these is correct ^^;
@@ -5585,9 +5584,9 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
 		if(battle_config.pc_invincible_time)
 			pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
 		if (resurrect_flag)
-			status_change_start(&sd->bl,SkillStatusChangeTable[PR_KYRIE],100,10,0,0,0,skill_get_time2(SL_KAIZEL, resurrect_flag),0);
+			sc_start(&sd->bl,SkillStatusChangeTable[PR_KYRIE],100,10,skill_get_time2(SL_KAIZEL, resurrect_flag));
 		else
-			status_change_start(&sd->bl,SkillStatusChangeTable[MO_STEELBODY],100,1,0,0,0,skill_get_time(MO_STEELBODY,1),0 );
+			sc_start(&sd->bl,SkillStatusChangeTable[MO_STEELBODY],100,1,skill_get_time(MO_STEELBODY,1));
 		return 0;
 	}
 

+ 3 - 3
src/map/script.c

@@ -6082,7 +6082,7 @@ int buildin_sc_start(struct script_state *st)
 		val4 = 1; //Mark that this was a thrown sc_effect
 	}
 	if (bl)
-		status_change_start(bl,type,100,val1,0,0,val4,tick,0);
+		sc_start4(bl,type,100,val1,0,0,val4,tick);
 	return 0;
 }
 
@@ -6110,7 +6110,7 @@ int buildin_sc_start2(struct script_state *st)
 	}
 
 	if(bl)
-		status_change_start(bl,type,per/100,val1,0,0,val4,tick,0);
+		status_change_start(bl,type,per,val1,0,0,val4,tick,0);
 	return 0;
 }
 
@@ -6140,7 +6140,7 @@ int buildin_sc_start4(struct script_state *st)
 		tick/=2;
 	}
 	if (bl)
-		status_change_start(bl,type,100,val1,val2,val3,val4,tick,0);
+		sc_start4(bl,type,100,val1,val2,val3,val4,tick);
 	return 0;
 }
 

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 137 - 198
src/map/skill.c


+ 11 - 22
src/map/status.c

@@ -1630,11 +1630,6 @@ int status_calc_pc(struct map_session_data* sd,int first)
 	if(b_sp != sd->status.sp)
 		clif_updatestatus(sd,SP_SP);
 
-	/* I don't think there's a need for this here. It should be handled in pc_damage and pc_heal. [Skotlex]
-	if(sd->status.hp<sd->status.max_hp>>2 && sd->sc.data[SC_AUTOBERSERK].timer!=-1 &&
-		(sd->sc.data[SC_PROVOKE].timer==-1 || sd->sc.data[SC_PROVOKE].val2==0) && !pc_isdead(sd))
-		status_change_start(&sd->bl,SC_PROVOKE,100,10,1,0,0,0,0);
-	*/
 	calculating = 0;
 	return 0;
 }
@@ -3435,7 +3430,7 @@ int status_get_sc_tick(struct block_list *bl, int type, int tick)
 /*==========================================
  * Starts a status change.
  * type = type, val1~4 depend on the type.
- * rate = base success rate. 100 = 100%
+ * rate = base success rate. 10000 = 100%
  * Tick is base duration
  * flag:
  * &1: Cannot be avoided (it has to start)
@@ -3475,7 +3470,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 
 	//Check rate
 	if (!(flag&(4|1))) {
-		rate*=100; //Pass to 10000 = 100%
 		if (rate > 10000) //Shouldn't let this go above 100%
 			rate = 10000;
 		race = flag&8?0:status_get_sc_def(bl, type); //recycling race to store the sc_def value.
@@ -3657,7 +3651,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 					tick = 60*1000;
 				if (sd && sd->status.hp<sd->status.max_hp>>2 &&
 					(sc->data[SC_PROVOKE].timer==-1 || sc->data[SC_PROVOKE].val2==0))
-					status_change_start(bl,SC_PROVOKE,10,100,1,0,0,0,0);
+					sc_start4(bl,SC_PROVOKE,100,10,1,0,0,0);
 			}
 			break;
 		
@@ -4036,7 +4030,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 					for (i = 0; i < 5; i++)
 					{	//Pass the status to the other affected chars. [Skotlex]
 						if (sd->devotion[i] && (tsd = map_id2sd(sd->devotion[i])))
-							status_change_start(&tsd->bl,SC_AUTOGUARD,100,val1,val2,0,0,tick,1);
+							status_change_start(&tsd->bl,SC_AUTOGUARD,10000,val1,val2,0,0,tick,1);
 					}
 			}
 			break;
@@ -4052,7 +4046,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 					for (i = 0; i < 5; i++)
 					{	//See if there are devoted characters, and pass the status to them. [Skotlex]
 						if (sd->devotion[i] && (tsd = map_id2sd(sd->devotion[i])))
-							status_change_start(&tsd->bl,SC_DEFENDER,100,val1,val2,0,0,tick,1);
+							status_change_start(&tsd->bl,SC_DEFENDER,10000,val1,val2,0,0,tick,1);
 					}
 			}
 			break;
@@ -4077,7 +4071,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 		case SC_JOINTBEAT: // Random break [DracoRPG]
 			calc_flag = 1;
 			val2 = rand()%6;
-			if (val2 == 5) status_change_start(bl,SC_BLEEDING,100,val1,0,0,0,skill_get_time2(StatusSkillChangeTable[type],val1),0);
+			if (val2 == 5) sc_start(bl,SC_BLEEDING,100,val1,skill_get_time2(StatusSkillChangeTable[type],val1));
 			break;
 
 		case SC_BERSERK:		/* ƒo?ƒT?ƒN */
@@ -4186,14 +4180,10 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 			//once the Crusader's status changes, it will reflect on the others. 
 				int type2 = SC_AUTOGUARD;
 				if (src->sc.data[type2].timer != -1)
-					status_change_start(bl,type2,100,
-						src->sc.data[type2].val1,0,0,0,
-						skill_get_time(StatusSkillChangeTable[type2],src->sc.data[type2].val1),0);
+					sc_start(bl,type2,100,src->sc.data[type2].val1,skill_get_time(StatusSkillChangeTable[type2],src->sc.data[type2].val1));
 				type2 = SC_DEFENDER;
 				if (src->sc.data[type2].timer != -1)
-					status_change_start(bl,type2,100,
-						src->sc.data[type2].val1,0,0,0,
-						skill_get_time(StatusSkillChangeTable[type2],src->sc.data[type2].val1),0);
+					sc_start(bl,type2,100,src->sc.data[type2].val1,skill_get_time(StatusSkillChangeTable[type2],src->sc.data[type2].val1));
 			}
 			break;
 		}
@@ -4217,7 +4207,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 				struct status_change *sc2 = src?status_get_sc(src):NULL;
 				if (src && sc2 && sc2->count) {
 					if (sc2->data[SC_CLOSECONFINE].timer == -1) //Start lock on caster.
-						status_change_start(src,SC_CLOSECONFINE,100,sc->data[type].val1,1,0,0,tick+1000,0);
+						sc_start4(src,SC_CLOSECONFINE,100,sc->data[type].val1,1,0,0,tick+1000);
 					else { //Increase count of locked enemies and refresh time.
 						sc2->data[SC_CLOSECONFINE].val2++;
 						delete_timer(sc2->data[SC_CLOSECONFINE].timer, status_change_timer);
@@ -4784,7 +4774,7 @@ int status_change_end( struct block_list* bl , int type,int tid )
 					DIFF_TICK(gettick(), sc->data[type].val4) <= 1000 &&
 					(!sd || (sd->weapontype1 == 0 && sd->weapontype2 == 0))
 				)
-					status_change_start(bl,SC_SPURT,100,sc->data[type].val1,0,0,0,skill_get_time2(StatusSkillChangeTable[type], sc->data[type].val1),0);
+					sc_start(bl,SC_SPURT,100,sc->data[type].val1,skill_get_time2(StatusSkillChangeTable[type], sc->data[type].val1));
 				calc_flag = 1;
 			break;
 			case SC_AUTOBERSERK:
@@ -5134,10 +5124,9 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
 			if (map_flag_gvg(sd->bl.m)) sp *= 5;
 			if (pc_damage_sp(sd, sp, 0) > 0) {
 				if ((++sc->data[type].val4) == 1) {
-					status_change_start(bl, SC_INCSTR,100,
-						1<<(sc->data[type].val1-1), 0, 0, 0,
+					sc_start(bl, SC_INCSTR,100,1<<(sc->data[type].val1-1),
 						(sc->data[SC_SPIRIT].timer != -1 && sc->data[SC_SPIRIT].val2 == SL_ROGUE?10:1) //SL bonus -> x10 duration
-						*skill_get_time2(StatusSkillChangeTable[type],sc->data[type].val1), 0);
+						*skill_get_time2(StatusSkillChangeTable[type],sc->data[type].val1));
 				}
 				sc->data[type].timer = add_timer( /* ƒ^ƒCƒ}?�Ä�Ý’è */
 					sc->data[type].val2+tick, status_change_timer, bl->id, data);

+ 4 - 1
src/map/status.h

@@ -481,7 +481,10 @@ int status_get_sc_def(struct block_list *bl, int type);
 #define status_get_sc_def_int(bl)	(status_get_sc_def(bl, SP_MDEF2))
 #define status_get_sc_def_luk(bl)	(status_get_sc_def(bl, SP_LUK))
 
-// �ó‘ÔˆÙ�íŠÖ˜A skill.c ‚æ‚èˆÚ“®
+//Short version, receives rate in 1->100 range, and does not uses a flag setting.
+#define sc_start(bl, type, rate, val1, tick) status_change_start(bl,type,100*(rate),val1,0,0,0,tick,0)
+#define sc_start4(bl, type, rate, val1, val2, val3, val4, tick) status_change_start(bl,type,100*(rate),val1,val2,val3,val4,tick,0)
+
 int status_change_start(struct block_list *bl,int type,int rate,int val1,int val2,int val3,int val4,int tick,int flag);
 int status_change_end( struct block_list* bl , int type,int tid );
 int status_change_timer(int tid, unsigned int tick, int id, int data);

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است