Просмотр исходного кода

- Small fix to prevent killer/killable states from allowing you to target yourself.
- Added Explosion Spirits to list of effects that dispel on logout.
- Fixed handling of guild skills by pc_blockskill_start, renamed it to skill_blockpc_start as it needs some constants available only in skill.c
- Fixed autoguard icon showing with stun.
- Fixed splash area of Ganbantein
- Fixed acid demonstration breaking shield instead of armor.
- Fixed Slim Pitcher crashing server ocassionally.
- Hopefully fixed Ankle Snare lasting the whole trap's duration
- Added sc_start(SC_ENDURE) on infinite endure bonus.
- Fixed Berserk Pitcher consuming required items twice.


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

skotlex 19 лет назад
Родитель
Сommit
5cc553de0f
11 измененных файлов с 69 добавлено и 44 удалено
  1. 14 0
      Changelog-Trunk.txt
  2. 2 0
      db/Changelog.txt
  3. 1 1
      db/skill_db.txt
  4. 2 2
      src/map/battle.c
  5. 1 1
      src/map/guild.c
  6. 2 0
      src/map/map.c
  7. 3 29
      src/map/pc.c
  8. 0 2
      src/map/pc.h
  9. 41 8
      src/map/skill.c
  10. 2 0
      src/map/skill.h
  11. 1 1
      src/map/status.c

+ 14 - 0
Changelog-Trunk.txt

@@ -4,6 +4,20 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.  EVERYTHING ELSE
 GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALARIS
 
+
+2006/03/18
+	* Small fix to prevent killer/killable states from allowing you to target
+	  yourself. [Skotlex]
+	* Added Explosion Spirits to list of effects that dispel on logout.
+	  [Skotlex]
+	* Fixed handling of guild skills by pc_blockskill_start, moved it to
+	  skill.c [Skotlex]
+	* Fixed autoguard icon showing with stun. [Skotlex]
+	* Fixed acid demonstration breaking shield instead of armor. [Skotlex]
+	* Fixed Slim Pitcher crashing server ocassionally. [Skotlex]
+	* Hopefully fixed Ankle Snare lasting the whole trap's duration [Skotlex]
+	* Added sc_start(SC_ENDURE) on infinite endure bonus. [Skotlex]
+	* Fixed Berserk Pitcher consuming required items twice. [Skotlex]
 2006/03/18
 	* Fixed BA_DISSONANCE and DC_UGLYDANCE not working. status_check_skilluse was blocking
 	  them due to the lack of an exception like BA_MUSICALSTRIKE has it. [blackhole89]

+ 2 - 0
db/Changelog.txt

@@ -25,7 +25,9 @@
 	-----
 
 =========================
+
 03/20
+	* Fixed splash area of Ganbantein [Skotlex]
 	* Updated atk,def,mdef of NJ/GS items, thanks to Haplo [Lupus]
 	- also re-fixed few blackhole89 (def, atk) values
 	* Uploaded Kargha's updated item_db.txt with the Gunslinger/Ninja usage bits set.

+ 1 - 1
db/skill_db.txt

@@ -502,7 +502,7 @@
 480,4,8,1,0,0,0,5,5,no,0,0,0,weapon,0	//PA_SHIELDCHAIN#Shield Chain#
 481,0,0,0,0,0,0,5,0,no,0,0,0,none,0	//HP_MANARECHARGE#Mana Recharge#
 482,0,6,4,0,1,0,5,1,no,0,0,0,magic,0	//PF_DOUBLECASTING#Double Casting#
-483,9,6,2,0,1,0,1,1,no,0,0,0,none,0	//HW_GANBANTEIN#Ganbantein#
+483,9,6,2,0,1,1,1,1,no,0,0,0,none,0	//HW_GANBANTEIN#Ganbantein#
 484,9,6,2,2,1,0,5,1,yes,0,0,0,magic,0	//HW_GRAVITATION#Gravity Field#
 485,-2,6,1,-1,0,0,10,1,no,0,0,0,weapon,0	//WS_CARTTERMINATION#Cart Termination#
 486,0,6,4,0,1,0,5,1,no,0,0,0,weapon,0	//WS_OVERTHRUSTMAX#Maximum Power Thrust#

+ 2 - 2
src/map/battle.c

@@ -3489,7 +3489,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
 				return -1; //Cannot be targeted yet.
 			if (sd->state.monster_ignore && src->type == BL_MOB)
 				return 0; //option to have monsters ignore GMs [Valaris]
-			if (sd->special_state.killable)
+			if (sd->special_state.killable && t_bl != s_bl)
 			{
 				state |= BCT_ENEMY; //Universal Victim
 				strip_enemy = 0;
@@ -3544,7 +3544,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
 		case BL_PC:
 		{
 			struct map_session_data *sd = (struct map_session_data *) s_bl;
-			if (sd->special_state.killer)
+			if (sd->special_state.killer && s_bl != t_bl)
 			{
 				state |= BCT_ENEMY; //Is on a killing rampage :O
 				strip_enemy = 0;

+ 1 - 1
src/map/guild.c

@@ -1225,7 +1225,7 @@ void guild_block_skill(struct map_session_data *sd, int time) {
 	int skill_num[] = { GD_BATTLEORDER, GD_REGENERATION, GD_RESTORE, GD_EMERGENCYCALL };
 	int i;
 	for (i = 0; i < 4; i++)
-		pc_blockskill_start(sd, skill_num[i], time);
+		skill_blockpc_start(sd, skill_num[i], time);
 }
 
 // 同盟関係かどうかチェック

+ 2 - 0
src/map/map.c

@@ -1586,6 +1586,8 @@ int map_quit(struct map_session_data *sd) {
 					status_change_end(&sd->bl,SC_STRIPHELM,-1);
 				if(sd->sc.data[SC_EXTREMITYFIST].timer!=-1)
 					status_change_end(&sd->bl,SC_EXTREMITYFIST,-1);
+				if(sd->sc.data[SC_EXPLOSIONSPIRITS].timer!=-1)
+					status_change_end(&sd->bl,SC_EXPLOSIONSPIRITS,-1);
 			}
 		}
 		skill_clear_unitgroup(&sd->bl);	// スキルユニットグル?プの削除

+ 3 - 29
src/map/pc.c

@@ -1519,8 +1519,10 @@ int pc_bonus(struct map_session_data *sd,int type,int val)
 			sd->special_state.no_gemstone = 1;
 		break;
 	case SP_INFINITE_ENDURE:
-		if(sd->state.lr_flag != 2)
+		if(sd->state.lr_flag != 2) {
 			sd->special_state.infinite_endure = 1;
+			sc_start(&sd->bl, SC_ENDURE,100,1,0);
+		}
 		break;
 	case SP_INTRAVISION: // Maya Purple Card effect allowing to see Hiding/Cloaking people [DracoRPG]
 		if(sd->state.lr_flag != 2)
@@ -2189,33 +2191,6 @@ int pc_skill(struct map_session_data *sd,int id,int level,int flag)
 
 	return 0;
 }
-
-/*==========================================
- *
- *------------------------------------------
- */
-int pc_blockskill_end(int tid,unsigned int tick,int id,int data)
-{
-	struct map_session_data *sd = map_id2sd(id);
-	if (data <= 0 || data >= MAX_SKILL)
-		return 0;
-	if (sd) sd->blockskill[data] = 0;
-	
-	return 1;
-}
-int pc_blockskill_start (struct map_session_data *sd, int skillid, int tick)
-{
-	nullpo_retr (-1, sd);
-
-	if (skillid >= 10000 && skillid < 10015)
-		skillid -= 9500;
-	else if (skillid < 1 || skillid > MAX_SKILL)
-		return -1;
-
-	sd->blockskill[skillid] = 1;
-	return add_timer(gettick()+tick,pc_blockskill_end,sd->bl.id,skillid);
-}
-
 /*==========================================
  * ƒJ?ƒh?“ü
  *------------------------------------------
@@ -8276,7 +8251,6 @@ int do_init_pc(void) {
 	add_timer_func_list(pc_calc_pvprank_timer, "pc_calc_pvprank_timer");
 	add_timer_func_list(pc_autosave, "pc_autosave");
 	add_timer_func_list(pc_spiritball_timer, "pc_spiritball_timer");
-	add_timer_func_list(pc_blockskill_end, "pc_blockskill_end");
 	add_timer_func_list(pc_follow_timer, "pc_follow_timer");
 	natural_heal_prev_tick = gettick();
 	add_timer_interval(natural_heal_prev_tick + NATURAL_HEAL_INTERVAL, pc_natural_heal, 0, 0, NATURAL_HEAL_INTERVAL);

+ 0 - 2
src/map/pc.h

@@ -94,8 +94,6 @@ int pc_bonus3(struct map_session_data *sd,int,int,int,int);
 int pc_bonus4(struct map_session_data *sd,int,int,int,int,int);
 int pc_skill(struct map_session_data*,int,int,int);
 
-int 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_steal_item(struct map_session_data *sd,struct block_list *bl);

+ 41 - 8
src/map/skill.c

@@ -1211,7 +1211,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 		break;
 
 	case CR_ACIDDEMONSTRATION:
-		skill_break_equip(bl, EQP_WEAPON|EQP_SHIELD, 100*skilllv, BCT_ENEMY);
+		skill_break_equip(bl, EQP_WEAPON|EQP_ARMOR, 100*skilllv, BCT_ENEMY);
 		break;
 
 	case TK_DOWNKICK:
@@ -2816,7 +2816,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl,int s
 			clif_skill_nodamage (src,bl,skillid,skilllv,
 				sc_start4(src,SC_WATK_ELEMENT,100,
 					3,20,0,0,skill_get_time2(skillid, skilllv)));
-			if (sd) pc_blockskill_start (sd, skillid, skill_get_time(skillid, skilllv));
+			if (sd) skill_blockpc_start (sd, skillid, skill_get_time(skillid, skilllv));
 		}
 		break;
 
@@ -3057,7 +3057,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl,int s
 				clif_updatestatus(sd,SP_SP);
 			}
 		}		
-		if (sd) pc_blockskill_start (sd, skillid, (skilllv < 5 ? 10000: 15000));
+		if (sd) skill_blockpc_start (sd, skillid, (skilllv < 5 ? 10000: 15000));
 		break;
 
 	/* HP吸?/HP吸?魔法 */
@@ -3711,7 +3711,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
  //Initiate 10% of your damage becomes fire element.
 		clif_skill_nodamage (src,src,skillid,skilllv,
 			sc_start4(src,SC_WATK_ELEMENT,100,3,20,0,0,skill_get_time2(skillid, skilllv)));
-		if (sd) pc_blockskill_start (sd, skillid, skill_get_time(skillid, skilllv));
+		if (sd) skill_blockpc_start (sd, skillid, skill_get_time(skillid, skilllv));
 		break;
 	case LK_BERSERK:		/* バ?サ?ク */
 	case KN_AUTOCOUNTER:		/* オ?トカウンタ? */
@@ -3784,7 +3784,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 		clif_skill_nodamage(src,bl,skillid,skilllv,
 			sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));
 		if (sd)
-			pc_blockskill_start (sd, skillid, skill_get_time2(skillid,skilllv));
+			skill_blockpc_start (sd, skillid, skill_get_time2(skillid,skilllv));
 		break;
 
 	case AS_ENCHANTPOISON: // Prevent spamming [Valaris]
@@ -5282,6 +5282,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 				hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10)/100;
 			}
 			tbl.id = 0;
+			tbl.type = BL_NUL;
 			tbl.m = src->m;
 			tbl.x = src->x;
 			tbl.y = src->y;
@@ -6062,7 +6063,7 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil
 	case MO_BODYRELOCATION:
 		if (sd) {
 			pc_movepos(sd, x, y, 1);
-			pc_blockskill_start (sd, MO_EXTREMITYFIST, 2000);
+			skill_blockpc_start (sd, MO_EXTREMITYFIST, 2000);
 		} else if (src->type == BL_MOB) {
 			struct mob_data *md = (struct mob_data *)src;
 			mob_warp(md, -1, x, y, 0);
@@ -6935,14 +6936,17 @@ int skill_unit_onplace_timer(struct skill_unit *src,struct block_list *bl,unsign
 
 	case UNT_SPIDERWEB:
 	case UNT_ANKLESNARE:
-		if(sg->val2==0 && (!tsc || tsc->data[type].timer==-1 )){
+		if(sg->val2==0 && tsc && tsc->data[type].timer==-1){
 		 	int sec = skill_get_time2(sg->skill_id,sg->skill_lv);
 			if (sc_start(bl,type,100,sg->skill_lv,sec))
 			{
+				struct TimerData* td = get_timer(tsc->data[type].timer); 
+				if (td) sec = DIFF_TICK(td->tick, tick);
 				map_moveblock(bl, src->bl.x, src->bl.y, tick);
  				clif_fixpos(bl);
 				sg->val2=bl->id;
-			}
+			} else
+				sec = 3000; //Couldn't trap it?
 			//clif_01ac(&src->bl); //Removed? Check the openkore description of this packet: [Skotlex]
 			// 01AC: long ID
 			// Indicates that an object is trapped, but ID is not a
@@ -8005,6 +8009,7 @@ int skill_check_condition(struct map_session_data *sd,int type)
 	case HW_GANBANTEIN:
 		force_gem_flag = 1;
 		break;
+	case AM_BERSERKPITCHER:
 	case AM_POTIONPITCHER:
 	case CR_SLIMPITCHER:
 	case MG_STONECURSE:
@@ -10926,6 +10931,33 @@ int skill_arrow_create( struct map_session_data *sd,int nameid)
 	return 0;
 }
 
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int skill_blockpc_end(int tid,unsigned int tick,int id,int data)
+{
+	struct map_session_data *sd = map_id2sd(id);
+	if (data <= 0 || data >= MAX_SKILL)
+		return 0;
+	if (sd) sd->blockskill[data] = 0;
+	
+	return 1;
+}
+int skill_blockpc_start(struct map_session_data *sd, int skillid, int tick)
+{
+	nullpo_retr (-1, sd);
+
+	if (skillid >= GD_SKILLBASE)
+		skillid = GD_SKILLRANGEMIN + skillid - GD_SKILLBASE;
+	if (skillid < 1 || skillid > MAX_SKILL)
+		return -1;
+
+	sd->blockskill[skillid] = 1;
+	return add_timer(gettick()+tick,skill_blockpc_end,sd->bl.id,skillid);
+}
+
+
 /*----------------------------------------------------------------------------
  * ?炎匀サ系
  */
@@ -11661,6 +11693,7 @@ int do_init_skill(void)
 	add_timer_func_list(skill_castend_id,"skill_castend_id");
 	add_timer_func_list(skill_castend_pos,"skill_castend_pos");
 	add_timer_func_list(skill_timerskill,"skill_timerskill");
+	add_timer_func_list(skill_blockpc_end, "skill_blockpc_end");
 	
 	add_timer_interval(gettick()+SKILLUNITTIMER_INVERVAL,skill_unit_timer,0,0,SKILLUNITTIMER_INVERVAL);
 

+ 2 - 0
src/map/skill.h

@@ -241,6 +241,8 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
 int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skilllv,unsigned int tick,int flag);
 
+int skill_blockpc_start (struct map_session_data*,int,int);	// [celest]
+
 // ƒXƒLƒ‹�U?ˆêЇ?—�
 int skill_attack( int attack_type, struct block_list* src, struct block_list *dsrc,
 	 struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );

+ 1 - 1
src/map/status.c

@@ -156,7 +156,7 @@ void initChangeTables(void) {
 	set_sc(AM_CP_ARMOR,             SC_CP_ARMOR,            SI_CP_ARMOR);
 	set_sc(AM_CP_HELM,              SC_CP_HELM,             SI_CP_HELM);
 	set_sc(CR_AUTOGUARD,            SC_AUTOGUARD,           SI_AUTOGUARD);
-	set_sc(CR_SHIELDCHARGE,         SC_STUN,                SI_AUTOGUARD);
+	set_sc(CR_SHIELDCHARGE,         SC_STUN,                SI_BLANK);
 	set_sc(CR_REFLECTSHIELD,        SC_REFLECTSHIELD,       SI_REFLECTSHIELD);
 	set_sc(CR_HOLYCROSS,            SC_BLIND,               SI_BLANK);
 	set_sc(CR_GRANDCROSS,           SC_BLIND,               SI_BLANK);