Selaa lähdekoodia

- Silence will only block skills when they have begun casting, not when the cast bar is done.
- opt1 status will block skills when they are done casting only if the sc_castcancel option is set.
- strcharinfo now returns blank instead of crashing the map server when there's no player attached.


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

skotlex 19 vuotta sitten
vanhempi
commit
b7ebda3ccd
4 muutettua tiedostoa jossa 27 lisäystä ja 8 poistoa
  1. 7 0
      Changelog-Trunk.txt
  2. 4 0
      src/map/script.c
  3. 12 5
      src/map/skill.c
  4. 4 3
      src/map/status.c

+ 7 - 0
Changelog-Trunk.txt

@@ -5,6 +5,13 @@ 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/01
+	* Silence will only block skills when they have begun casting, not when the
+	  cast bar is done. This also means that auto-spells will likely come-out
+	  even when silenced. [Skotlex]
+	* opt1 status will block skills when they are done casting only if the
+	  sc_castcancel option is set. [Skotlex]
+	* strcharinfo now returns blank instead of crashing the map server when
+	  there's no player attached. [Skotlex]
 	* Added a missing mysql_init call to the mapreg sql handle. [Skotlex]
 	* Checked and fixed the script engine barking when you try to have a label
 	  with the same name as a const.txt defined parameter. [Skotlex]

+ 4 - 0
src/map/script.c

@@ -4293,6 +4293,10 @@ int buildin_strcharinfo(struct script_state *st)
 
 	sd=script_rid2sd(st);
 	num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+	if (!sd) { //Avoid crashing....
+		push_str(st->stack,C_CONSTSTR,(unsigned char *) "");
+		return 0;
+	}
 	if(num==0){
 		char *buf;
 		buf=(char *)aCallocA(NAME_LENGTH,sizeof(char));

+ 12 - 5
src/map/skill.c

@@ -6780,11 +6780,18 @@ int skill_unit_onplace_timer(struct skill_unit *src,struct block_list *bl,unsign
 	tsc = status_get_sc(bl);
 	type = SkillStatusChangeTable[sg->skill_id];
 
-	if (sg->interval == -1 && (sg->unit_id == UNT_ANKLESNARE || sg->unit_id == UNT_SPIDERWEB || sg->unit_id == UNT_FIREPILLAR_ACTIVE))
-		//Ok, this case only happens with Ankle Snare/Spider Web (only skills that sets its interval to -1), 
-		//and only happens when more than one target is stepping on the trap at the moment it was triggered
-		//(yet only the first mob standing on the trap will be captured) [Skotlex]
-		return 0;
+	if (sg->interval == -1) {
+		switch (sg->unit_id) {
+			case UNT_ANKLESNARE: //These happen when a trap is splash-triggered by multiple targets on the same cell.
+			case UNT_SPIDERWEB:
+			case UNT_FIREPILLAR_ACTIVE:
+				return 0;
+			default:
+				if (battle_config.error_log)
+					ShowError("skill_unit_onplace_timer: interval error (unit id %x)\n", sg->unit_id);
+				return 0;
+		}
+	}
 
 	if ((ts = skill_unitgrouptickset_search(bl,sg,tick)))
 	{	//Not all have it, eg: Traps don't have it even though they can be hit by Heaven's Drive [Skotlex]

+ 4 - 3
src/map/status.c

@@ -376,7 +376,7 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int
 
 	if (src) sc = status_get_sc(src);
 	
-	if(sc && sc->opt1 >0)
+	if(sc && sc->opt1 >0 && (!flag || battle_config.sc_castcancel))
 		return 0;
 	
 	if(sc && sc->count)
@@ -407,7 +407,8 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int
 				(sc->data[SC_MARIONETTE].timer != -1 && skill_num != CG_MARIONETTE) ||
 				(sc->data[SC_MARIONETTE2].timer != -1 && skill_num == CG_MARIONETTE) ||
 				(sc->data[SC_HERMODE].timer != -1 && skill_get_inf(skill_num) & INF_SUPPORT_SKILL) ||
-				sc->data[SC_SILENCE].timer != -1 || sc->data[SC_STEELBODY].timer != -1 ||
+				(sc->data[SC_SILENCE].timer != -1 && !flag) || //Silence only blocks initial casting of skills.
+				sc->data[SC_STEELBODY].timer != -1 ||
 				sc->data[SC_BERSERK].timer != -1 || sc->data[SC_SKA].timer != -1 ||
 				sc->data[SC_NOCHAT].timer != -1
 			)
@@ -4188,7 +4189,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 
 		case SC_COMA: //Coma. Sends a char to 1HP
 			battle_damage(NULL, bl, status_get_hp(bl)-1, 0);
-			return 0;
+			return 1;
 
 		case SC_CARTBOOST:		/* ƒJ?ƒgƒu?ƒXƒg */
 			if(sc->data[SC_DECREASEAGI].timer!=-1 )