浏览代码

Fixed bugreport:5821 GN_SLINGITEM item requirements(item throwables) should now works normally.
Fixed bugreport:5223 GN_BLOOD_SUCKER should now work like official behavior.
Fixed part of bugreport:5674 Spiral Pierce is now in RE.
Fixed setmadogear now it accepts optional parameter(0=unmount 1=mount).

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

rud0lp20 13 年之前
父节点
当前提交
1d43091f5b
共有 6 个文件被更改,包括 73 次插入21 次删除
  1. 38 7
      src/map/battle.c
  2. 1 0
      src/map/itemdb.h
  3. 1 1
      src/map/script.c
  4. 16 8
      src/map/skill.c
  5. 16 5
      src/map/status.c
  6. 1 0
      src/map/status.h

+ 38 - 7
src/map/battle.c

@@ -1596,6 +1596,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 				wd.damage = sstatus->max_hp* 9/100;
 				wd.damage2 = 0;
 				break;
+#ifndef RENEWAL
 			case LK_SPIRALPIERCE:
 			case ML_SPIRALPIERCE:
 				if (sd) {
@@ -1622,6 +1623,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 						break;
 				}
 				break;
+#endif
 			case CR_SHIELDBOOMERANG:
 			case PA_SHIELDCHAIN:
 			case LG_SHIELDPRESS:
@@ -2419,6 +2421,9 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 			}
 		}
 		//Div fix.
+#ifdef RENEWAL
+		if( skill_num != LK_SPIRALPIERCE && skill_num != ML_SPIRALPIERCE)
+#endif
 		damage_div_fix(wd.damage, wd.div_);
 
 		//The following are applied on top of current damage and are stackable.
@@ -2590,12 +2595,41 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 				flag.idef2||flag.pdef2?0:-vit_def
 			);
 		}
-
+#ifdef RENEWAL
+		/**
+		* Racial/Size and etc modifications should not work with this formula(only the ATK is affected w/ mods) except for now, since RE ATK formula is not yet fully implemented in rA. [malufett]
+		* Formula: Floor[Floor(Weapon Weight/2)*skill level + ATK ]*(100%+50%*s.lvl) * 5 multi-hits
+		**/
+		if( skill_num == LK_SPIRALPIERCE || skill_num == ML_SPIRALPIERCE)
+		{
+			short index = sd?sd->equip_index[EQI_HAND_R]:0;
+			int weight = sstatus->rhw.atk2;
+
+			if (sd && index >= 0 &&
+				sd->inventory_data[index] &&
+				sd->inventory_data[index]->type == IT_WEAPON)
+				weight = sd->inventory_data[index]->weight/20;
+							
+			ATK_ADD(weight * skill_lv);
+			ATK_RATE(100+50*skill_lv);
+
+			damage_div_fix(wd.damage, wd.div_);
+		}
+#endif
 		//Post skill/vit reduction damage increases
-		if( sc && skill_num != LK_SPIRALPIERCE && skill_num != ML_SPIRALPIERCE )
+		if( sc )
 		{	//SC skill damages
-			if(sc->data[SC_AURABLADE]) 
-				ATK_ADD(20*sc->data[SC_AURABLADE]->val1);
+			if(sc->data[SC_AURABLADE]
+#ifndef RENEWAL
+					&& skill_num != LK_SPIRALPIERCE && skill_num != ML_SPIRALPIERCE
+#endif
+			){ 
+				int lv = sc->data[SC_AURABLADE]->val1;
+#ifdef RENEWAL
+				lv *= ((skill_num == LK_SPIRALPIERCE || skill_num == ML_SPIRALPIERCE)?wd.div_:1); // +100 per hit in lv 5
+#endif
+				ATK_ADD(20*lv);
+			}
 		}
 
 		//Refine bonus
@@ -3913,9 +3947,6 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
 	case GN_THORNS_TRAP:
 		md.damage = 100 + 200 * skill_lv + sstatus->int_;
 		break;
-	case GN_BLOOD_SUCKER:
-		md.damage = 200 + 100 * skill_lv + sstatus->int_;
-		break;
 	case GN_HELLS_PLANT_ATK:
 		md.damage = sstatus->int_ * 4 * skill_lv * (10 / (10 - pc_checkskill(sd,AM_CANNIBALIZE)));//Need accurate official formula. [Rytech]
 		break;

+ 1 - 0
src/map/itemdb.h

@@ -161,6 +161,7 @@ struct item_data* itemdb_exists(int nameid);
 #define itemid_isgemstone(id) ( (id) >= ITEMID_YELLOW_GEMSTONE && (id) <= ITEMID_BLUE_GEMSTONE )
 #define itemdb_iscashfood(id) ( (id) >= 12202 && (id) <= 12207 )
 #define itemdb_is_GNbomb(n) (n >= 13260 && n <= 13267)
+#define itemdb_is_GNthrowable(n) (n >= 13268 && n <= 13290)
 const char* itemdb_typename(int type);
 
 int itemdb_group_bonus(struct map_session_data* sd, int itemid);

+ 1 - 1
src/map/script.c

@@ -16380,7 +16380,7 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(checkriding,""),
 	BUILDIN_DEF(checkwug,""),
 	BUILDIN_DEF(checkmadogear,""),
-	BUILDIN_DEF(setmadogear,""),
+	BUILDIN_DEF(setmadogear,"?"),
 	BUILDIN_DEF2(savepoint,"save","sii"),
 	BUILDIN_DEF(savepoint,"sii"),
 	BUILDIN_DEF(gettimetick,"i"),

+ 16 - 8
src/map/skill.c

@@ -3885,7 +3885,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 	case GS_FLING:
 	case NJ_ZENYNAGE:
 	case GN_THORNS_TRAP:
-	case GN_BLOOD_SUCKER:
 	case GN_HELLS_PLANT_ATK:			
 		skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag);
 		break;
@@ -8424,12 +8423,21 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 		break;
 		
 	case GN_BLOOD_SUCKER:
-		if( skill_unitsetting(src, skillid, skilllv, bl->x, bl->y, 0) ) { // Do we need this unit setting? [Xazax]
-			clif_skill_nodamage(src, bl, skillid, skilllv, 1);
-			sc_start2(bl, type, 100, skilllv, src->id, skill_get_time(skillid,skilllv));
-		} else if( sd ) {
-			clif_skill_fail(sd, skillid, USESKILL_FAIL_LEVEL, 0);
-			break;
+		{
+			struct status_change *sc = status_get_sc(src);
+					
+			if( sc && sc->bs_counter < skill_get_maxcount( skillid , skilllv) ) {
+				if( tsc && tsc->data[type] ){
+					(sc->bs_counter)--;
+					status_change_end(src, type, INVALID_TIMER); // the first one cancels and the last one will take effect resetting the timer
+				}
+				clif_skill_nodamage(src, bl, skillid, skilllv, 1);
+				sc_start2(bl, type, 100, skilllv, src->id, skill_get_time(skillid,skilllv));
+				(sc->bs_counter)++;
+			} else if( sd ) {
+				clif_skill_fail(sd, skillid, USESKILL_FAIL_LEVEL, 0);
+				break;
+			}
 		}
 		break;
 		
@@ -8461,7 +8469,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 						skill_attack(BF_WEAPON,src,src,bl,GN_SLINGITEM_RANGEMELEEATK,skilllv,tick,flag);
 				} else //Otherwise, it fails, shows animation and removes items.
 					clif_skill_fail(sd,GN_SLINGITEM_RANGEMELEEATK,0xa,0);
-			} else {
+			} else if( itemdb_is_GNthrowable(ammo_id) ){
 				struct script_code *script = sd->inventory_data[i]->script;
 				if( !script )
 					break;

+ 16 - 5
src/map/status.c

@@ -669,7 +669,7 @@ void initChangeTables(void)
 	 **/
 	set_sc( GN_CARTBOOST                  , SC_GN_CARTBOOST, SI_CARTSBOOST                 , SCB_SPEED );
 	set_sc( GN_THORNS_TRAP                , SC_THORNSTRAP  , SI_THORNTRAP                  , SCB_NONE );
-	set_sc( GN_BLOOD_SUCKER               , SC_BLOODSUCKER , SI_BLOODSUCKER                , SCB_NONE );
+	set_sc_with_vfx( GN_BLOOD_SUCKER      , SC_BLOODSUCKER , SI_BLOODSUCKER                , SCB_NONE );
 	set_sc( GN_WALLOFTHORN                , SC_STOP        , SI_BLANK                      , SCB_NONE );
 	set_sc( GN_FIRE_EXPANSION_SMOKE_POWDER, SC_SMOKEPOWDER , SI_FIRE_EXPANSION_SMOKE_POWDER, SCB_NONE );
 	set_sc( GN_FIRE_EXPANSION_TEAR_GAS    , SC_TEARGAS     , SI_FIRE_EXPANSION_TEAR_GAS    , SCB_NONE );
@@ -2472,7 +2472,8 @@ int status_calc_pc_(struct map_session_data* sd, bool first)
 		if(sd->inventory_data[index]){		// Arrows
 			sd->arrow_atk += sd->inventory_data[index]->atk;
 			sd->state.lr_flag = 2;
-			run_script(sd->inventory_data[index]->script,0,sd->bl.id,0);
+			if( !itemdb_is_GNthrowable(sd->inventory_data[index]->nameid) ) //don't run scripts on throwable items
+				run_script(sd->inventory_data[index]->script,0,sd->bl.id,0);
 			sd->state.lr_flag = 0;
 			if (!calculating) //Abort, run_script retriggered status_calc_pc. [Skotlex]
 				return 1;
@@ -8809,6 +8810,15 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
 		case SC_CURSEDCIRCLE_TARGET:		
 			clif_bladestop(bl, sce->val2, 0);
 			break;
+		case SC_BLOODSUCKER:
+			if( sce->val2 ){
+				struct block_list *src = map_id2bl(sce->val2);
+				if(src){
+					struct status_change *sc = status_get_sc(src);
+					sc->bs_counter--;
+				}
+			}
+			break;
 		}
 
 	opt_flag = 1;
@@ -9615,13 +9625,14 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
 			if( !src || (src && (status_isdead(src) || src->m != bl->m || distance_bl(src, bl) >= 12)) )
 				break;
 			map_freeblock_lock();
-			damage = skill_attack(skill_get_type(GN_BLOOD_SUCKER), src, src, bl, GN_BLOOD_SUCKER, sce->val1, tick, 0);
+			damage =  200 + 100 * sce->val1 + status_get_int(src);
+			status_damage(src, bl, damage, 0, clif_damage(bl,bl,tick,status->amotion,status->dmotion+200,damage,1,0,0), 1);
+			unit_skillcastcancel(bl,1);
 			if ( sc->data[type] ) {
 				sc_timer_next(1000 + tick, status_change_timer, bl->id, data);
 			}
 			map_freeblock_unlock();
-			status_heal(src, damage, 0, 0);
-			clif_skill_nodamage(src, bl, GN_BLOOD_SUCKER, 0, 1);
+			status_heal(src, damage*(5 + 5 * sce->val1)/100, 0, 0); // 5 + 5% per level
 			return 0;
 		}
 		break;

+ 1 - 0
src/map/status.h

@@ -1564,6 +1564,7 @@ struct status_change {
 #ifndef RENEWAL
 	unsigned char sg_counter; //Storm gust counter (previous hits from storm gust)
 #endif
+	unsigned char bs_counter; // Blood Sucker counter
 	struct status_change_entry *data[SC_MAX];
 };