Bug Fixes:

* Fixed some Manhole skill related:
  * Shouldn't be removed by Crazy Weed, Fixed #580
  * Hell's Plant should ignores target under Manhole effect, Fixed #566.
* Fixed #536, Neutral Barrier shouldn't miss magic attack and ranged attack that ignores flee.
* Fixed #522, Change Material always check the first produce line that matches the item/product requested. Also removed some reduntant checks.
* Fixed #568, Gentletouch Cure shouldn't heal Emperium and BG's Barricades.
* (Attempt to) Fixed #533 and fixed #212, Ground Drift damage calculation.

Signed-off-by: Cydh Ramdh <cydh@pservero.com>
This commit is contained in:
Cydh Ramdh
2015-08-18 22:11:41 +07:00
parent 01a93723c9
commit feec60e8c8
10 changed files with 119 additions and 81 deletions

View File

@@ -122,10 +122,10 @@
2253,0xd6, , 0, 1,1000,enemy, 0x8002 //RA_FIRINGTRAP
2254,0xd7, , 0, 1,1000,enemy, 0x8002 //RA_ICEBOUNDTRAP
2273,0xe2, , 2, 0, 500,all, 0x000 //NC_NEUTRALBARRIER
2274,0xe3, , 2, 0, 500,friend,0x000 //NC_STEALTHFIELD
2273,0xe2, , 2, 0, -1,all, 0x000 //NC_NEUTRALBARRIER
2274,0xe3, , 2, 0, -1,friend,0x000 //NC_STEALTHFIELD
2299,0xcc, , 0, 1,1000,all, 0xC006 //SC_MANHOLE
2299,0xcc, , 0, 1,1000,all, 0x8006 //SC_MANHOLE
2300,0xcd, , 0, 0,1000,all, 0xC006 //SC_DIMENSIONDOOR
2301,0xce, , 2, 0,1000,all, 0xE00E //SC_CHAOSPANIC
2302,0xcf, , 2, 0, -1,all, 0xE002 //SC_MAELSTROM

View File

@@ -6744,7 +6744,7 @@
12884,Infinite_Concentration_Potion,Infinite Concentration Potion,11,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION0,1800000,4; },{},{}
12885,Infinite_Awakening_Potion,Infinite Awakening Potion,11,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION1,1800000,6; },{},{}
12886,Infinite_Berserk_Potion,Infinite Berserk Potion,11,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION2,1800000,9; },{},{}
12887,C_Wing_Of_Fly,Infinite Flywing,11,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ itemskill "AL_TELEPORT",1; },{},{}
12887,C_Wing_Of_Fly,Infinite Flywing,11,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ unitskilluseid getcharid(3),"AL_TELEPORT",1; },{},{}
12889,Weapon_Box(Spear),Weapon Box(Spear),2,10,,200,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{}
12890,Weapon_Box(Mace),Weapon Box(Mace),2,10,,200,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{}
12891,Weapon_Box(Dagger),Weapon Box(Dagger),2,10,,200,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{}
@@ -9909,7 +9909,7 @@
22064,Thorny_Shoes,Thorny Shoes,4,0,,1000,,25,,1,0xFFFFFFFF,63,2,64,,,1,,{ bonus bShortWeaponDamageReturn,getrefine()/2; },{},{}
22067,Shoe_of_Witch,Shoe of Witch,4,10,,400,,10,,0,0xFFFFFFFE,63,2,64,,1,1,,{ skill "ALL_CATCRY",1,1; },{},{}
//
22508,Para_Team_Mark_,Eden Group Mark,11,0,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ /*itemskill "AL_TELEPORT",3;*/ unitskilluseid getcharid(3),"AL_TELEPORT",3; },{},{}
22508,Para_Team_Mark_,Eden Group Mark,11,0,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ unitskilluseid getcharid(3),"AL_TELEPORT",3; },{},{}
22507,Worn-Out-Scroll,Worn-Out-Scroll,3,10,,10,,,,0,,,,,,,,,{},{},{}
22510,King_Wolf_Scroll,King Wolf Scroll,2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ /*TODO, confirm the rates*/ getitem callfunc("F_Rand",6635,19598,5658,6238,6239),1; },{},{}
22513,King_of_Gift_Box,King of Gift Box,2,10,,100,,,,0,0xFFFFFFFF,63,2,,,,,,{ /*TODO, confirm the rates*/ getitem callfunc("F_Rand",12817,4403,14512),1; },{},{}

View File

@@ -124,10 +124,10 @@
2253,0xd6, , 0, 1,1000,enemy, 0x8002 //RA_FIRINGTRAP
2254,0xd7, , 0, 1,1000,enemy, 0x8002 //RA_ICEBOUNDTRAP
2273,0xe2, , 2, 0, 500,all, 0x000 //NC_NEUTRALBARRIER
2274,0xe3, , 2, 0, 500,friend,0x000 //NC_STEALTHFIELD
2273,0xe2, , 2, 0, -1,all, 0x000 //NC_NEUTRALBARRIER
2274,0xe3, , 2, 0, -1,friend,0x000 //NC_STEALTHFIELD
2299,0xcc, , 0, 1,1000,all, 0xC006 //SC_MANHOLE
2299,0xcc, , 0, 1,1000,all, 0x8006 //SC_MANHOLE
2300,0xcd, , 0, 0,1000,all, 0xC006 //SC_DIMENSIONDOOR
2301,0xce, , 2, 0,1000,all, 0xE00E //SC_CHAOSPANIC
2302,0xcf, , 2, 0, -1,all, 0xE002 //SC_MAELSTROM

View File

@@ -6775,7 +6775,7 @@ REPLACE INTO `item_db_re` VALUES (12883,'Almighty','Almighty',2,20,NULL,10,NULL,
REPLACE INTO `item_db_re` VALUES (12884,'Infinite_Concentration_Potion','Infinite Concentration Potion',11,10,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_ASPDPOTION0,1800000,4;',NULL,NULL);
REPLACE INTO `item_db_re` VALUES (12885,'Infinite_Awakening_Potion','Infinite Awakening Potion',11,10,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_ASPDPOTION1,1800000,6;',NULL,NULL);
REPLACE INTO `item_db_re` VALUES (12886,'Infinite_Berserk_Potion','Infinite Berserk Potion',11,10,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_ASPDPOTION2,1800000,9;',NULL,NULL);
REPLACE INTO `item_db_re` VALUES (12887,'C_Wing_Of_Fly','Infinite Flywing',11,0,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'itemskill "AL_TELEPORT",1;',NULL,NULL);
REPLACE INTO `item_db_re` VALUES (12887,'C_Wing_Of_Fly','Infinite Flywing',11,0,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'unitskilluseid getcharid(3),"AL_TELEPORT",1;',NULL,NULL);
REPLACE INTO `item_db_re` VALUES (12889,'Weapon_Box(Spear)','Weapon Box(Spear)',2,10,NULL,200,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
REPLACE INTO `item_db_re` VALUES (12890,'Weapon_Box(Mace)','Weapon Box(Mace)',2,10,NULL,200,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
REPLACE INTO `item_db_re` VALUES (12891,'Weapon_Box(Dagger)','Weapon Box(Dagger)',2,10,NULL,200,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
@@ -9940,7 +9940,7 @@ REPLACE INTO `item_db_re` VALUES (22059,'Aegir_Shoes','Aegir Shoes',4,10,NULL,30
REPLACE INTO `item_db_re` VALUES (22064,'Thorny_Shoes','Thorny Shoes',4,0,NULL,1000,NULL,25,NULL,1,0xFFFFFFFF,63,2,64,NULL,NULL,1,NULL,'bonus bShortWeaponDamageReturn,getrefine()/2;',NULL,NULL);
REPLACE INTO `item_db_re` VALUES (22067,'Shoe_of_Witch','Shoe of Witch',4,10,NULL,400,NULL,10,NULL,0,0xFFFFFFFE,63,2,64,NULL,'1',1,NULL,'skill "ALL_CATCRY",1,1;',NULL,NULL);
#
REPLACE INTO `item_db_re` VALUES (22508,'Para_Team_Mark_','Eden Group Mark',11,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/*itemskill "AL_TELEPORT",3;*/ unitskilluseid getcharid(3),"AL_TELEPORT",3;',NULL,NULL);
REPLACE INTO `item_db_re` VALUES (22508,'Para_Team_Mark_','Eden Group Mark',11,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'unitskilluseid getcharid(3),"AL_TELEPORT",3;',NULL,NULL);
REPLACE INTO `item_db_re` VALUES (22507,'Worn-Out-Scroll','Worn-Out-Scroll',3,10,NULL,10,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
REPLACE INTO `item_db_re` VALUES (22510,'King_Wolf_Scroll','King Wolf Scroll',2,10,NULL,10,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/*TODO, confirm the rates*/ getitem callfunc("F_Rand",6635,19598,5658,6238,6239),1;',NULL,NULL);
REPLACE INTO `item_db_re` VALUES (22513,'King_of_Gift_Box','King of Gift Box',2,10,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/*TODO, confirm the rates*/ getitem callfunc("F_Rand",12817,4403,14512),1;',NULL,NULL);

View File

@@ -930,6 +930,13 @@ bool battle_check_sc(struct block_list *src, struct block_list *target, struct s
status_change_end(target, SC_SAFETYWALL, INVALID_TIMER);
}
if( (sc->data[SC_NEUTRALBARRIER] || sc->data[SC_NEUTRALBARRIER_MASTER]) && !(skill_get_nk(skill_id)&NK_IGNORE_FLEE) &&
(skill_id == NPC_EARTHQUAKE || (d->flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) )
{
d->dmg_lv = ATK_MISS;
return false;
}
if( sc->data[SC_PNEUMA] && (d->flag&(BF_MAGIC|BF_LONG)) == BF_LONG ) {
d->dmg_lv = ATK_BLOCK;
skill_blown(src,target,skill_get_blewcount(skill_id,skill_lv),-1,0);
@@ -1104,11 +1111,6 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
if(sc->data[SC_TATAMIGAESHI] && (flag&(BF_MAGIC|BF_LONG)) == BF_LONG)
return 0;
if( sc->data[SC_NEUTRALBARRIER] && (skill_id == NPC_EARTHQUAKE || (flag&(BF_LONG|BF_MAGIC)) == BF_LONG) ) {
d->dmg_lv = ATK_MISS;
return 0;
}
//Kaupe blocks damage (skill or otherwise) from players, mobs, homuns, mercenaries.
if ((sce = sc->data[SC_KAUPE]) && rnd()%100 < sce->val2) {
clif_specialeffect(bl, 462, AREA);
@@ -2418,7 +2420,7 @@ static bool is_attack_hitting(struct Damage wd, struct block_list *src, struct b
else if (nk&NK_IGNORE_FLEE)
return true;
if( sc && (sc->data[SC_NEUTRALBARRIER] || sc->data[SC_NEUTRALBARRIER_MASTER]) && (wd.flag&(BF_LONG|BF_MAGIC)) == BF_LONG )
if( sc && (sc->data[SC_NEUTRALBARRIER] || sc->data[SC_NEUTRALBARRIER_MASTER]) && (wd.flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON) )
return false;
flee = tstatus->flee;
@@ -2743,10 +2745,6 @@ static struct Damage battle_calc_element_damage(struct Damage wd, struct block_l
//Forced to neutral element
wd.damage = battle_attr_fix(src, target, wd.damage, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv);
break;
case GS_GROUNDDRIFT:
//Additional 50 * lv neutral damage
wd.damage += battle_attr_fix(src, target, 50 * skill_lv, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv);
break;
case GN_CARTCANNON:
case KO_HAPPOKUNAI:
//Forced to ammo's element
@@ -6438,10 +6436,9 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
break;
case GS_GROUNDDRIFT:
// Official formula [helvetica]
// damage = 50 * skill level
// fixed damage, ignores DEF and benefits from weapon +%ATK cards
md.damage = 50 * skill_lv;
md.damage += battle_calc_cardfix(BF_WEAPON, src, target, nk, s_ele, 0, md.damage, 0, md.flag|NK_NO_CARDFIX_DEF); // ground drift benefits from weapon atk cards, ignore DEF cards so we don't apply twice
// bonus damage = 50 * skill level (fixed damage)
s_ele = ELE_NEUTRAL;
md.damage = battle_attr_fix(src, target, 50 * skill_lv, s_ele, tstatus->def_ele, tstatus->ele_lv);
break;
case HVAN_EXPLOSION: //[orn]
md.damage = (int64)sstatus->max_hp * (50 + 50 * skill_lv) / 100;
@@ -6577,6 +6574,17 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
pc_payzeny(sd,(int)cap_value(md.damage, INT_MIN, INT_MAX),LOG_TYPE_STEAL,NULL);
}
break;
case GS_GROUNDDRIFT:
{
struct Damage wd = battle_calc_weapon_attack(src,target,skill_id,skill_lv,mflag);
int blewcount = skill_get_blewcount(skill_id, skill_lv);
md.damage += wd.damage;
// Knockback only from Fire Element (except from bonuses?)
if (mflag != ELE_FIRE && md.blewcount >= blewcount)
md.blewcount -= blewcount;
}
break;
}
switch(skill_id) {

View File

@@ -11831,6 +11831,8 @@ void clif_parse_ProduceMix(int fd,struct map_session_data *sd){
int slot1 = RFIFOW(fd,info->pos[1]);
int slot2 = RFIFOW(fd,info->pos[2]);
int slot3 = RFIFOW(fd,info->pos[3]);
short produce_idx = -1;
switch( sd->menuskill_id ) {
case -1:
case AM_PHARMACY:
@@ -11846,8 +11848,8 @@ void clif_parse_ProduceMix(int fd,struct map_session_data *sd){
clif_menuskill_clear(sd);
return;
}
if( skill_can_produce_mix(sd,nameid,sd->menuskill_val, 1) )
skill_produce_mix(sd,0,nameid,slot1,slot2,slot3, 1);
if( (produce_idx = skill_can_produce_mix(sd,nameid,sd->menuskill_val, 1)) )
skill_produce_mix(sd,0,nameid,slot1,slot2,slot3,1,produce_idx-1);
clif_menuskill_clear(sd);
}
@@ -11866,6 +11868,8 @@ void clif_parse_Cooking(int fd,struct map_session_data *sd) {
int type = RFIFOW(fd,info->pos[0]);
unsigned short nameid = RFIFOW(fd,info->pos[1]);
int amount = sd->menuskill_val2 ? sd->menuskill_val2 : 1;
short food_idx = -1;
if( type == 6 && sd->menuskill_id != GN_MIX_COOKING && sd->menuskill_id != GN_S_PHARMACY )
return;
@@ -11875,8 +11879,8 @@ void clif_parse_Cooking(int fd,struct map_session_data *sd) {
clif_menuskill_clear(sd);
return;
}
if( skill_can_produce_mix(sd,nameid,sd->menuskill_val, amount) )
skill_produce_mix(sd,(type>1?sd->menuskill_id:0),nameid,0,0,0,amount);
if( (food_idx = skill_can_produce_mix(sd,nameid,sd->menuskill_val, amount)) )
skill_produce_mix(sd,(type>1?sd->menuskill_id:0),nameid,0,0,0,amount,food_idx-1);
clif_menuskill_clear(sd);
}
@@ -12033,7 +12037,7 @@ void clif_parse_SelectArrow(int fd,struct map_session_data *sd){
skill_arrow_create(sd,nameid);
break;
case SA_CREATECON:
skill_produce_mix(sd,SA_CREATECON,nameid,0,0,0, 1);
skill_produce_mix(sd,SA_CREATECON,nameid,0,0,0,1,-1);
break;
case WL_READING_SB:
skill_spellbook(sd,nameid);

View File

@@ -52,6 +52,7 @@ enum item_itemid
ITEMID_WING_OF_BUTTERFLY = 602,
ITEMID_ANODYNE = 605,
ITEMID_ALOEBERA = 606,
ITEMID_POISON_BOTTLE = 678,
ITEMID_EMPTY_BOTTLE = 713,
ITEMID_EMPERIUM = 714,
ITEMID_YELLOW_GEMSTONE = 715,

View File

@@ -309,6 +309,7 @@ int skill_tree_get_max(uint16 skill_id, int b_class)
else
return skill_get_max(skill_id);
}
int skill_frostjoke_scream(struct block_list *bl,va_list ap);
int skill_attack_area(struct block_list *bl,va_list ap);
struct skill_unit_group *skill_locate_element_field(struct block_list *bl); // [Skotlex]
@@ -7110,7 +7111,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case AL_HOLYWATER:
if(sd) {
if (skill_produce_mix(sd, skill_id, ITEMID_HOLY_WATER, 0, 0, 0, 1))
if (skill_produce_mix(sd, skill_id, ITEMID_HOLY_WATER, 0, 0, 0, 1, -1))
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
else
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
@@ -7142,7 +7143,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case ASC_CDP:
if(sd) {
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
skill_produce_mix(sd, skill_id, 678, 0, 0, 0, 1); //Produce a Deadly Poison Bottle.
skill_produce_mix(sd, skill_id, ITEMID_POISON_BOTTLE, 0, 0, 0, 1, -1); //Produce a Poison Bottle.
}
break;
@@ -7349,7 +7350,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
if (sd) {
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
//Prepare 200 White Potions.
if (!skill_produce_mix(sd, skill_id, ITEMID_WHITE_POTION, 0, 0, 0, 200))
if (!skill_produce_mix(sd, skill_id, ITEMID_WHITE_POTION, 0, 0, 0, 200, -1))
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
}
break;
@@ -7357,28 +7358,29 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
if (sd) {
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
//Prepare 200 Slim White Potions.
if (!skill_produce_mix(sd, skill_id, ITEMID_WHITE_SLIM_POTION, 0, 0, 0, 200))
if (!skill_produce_mix(sd, skill_id, ITEMID_WHITE_SLIM_POTION, 0, 0, 0, 200, -1))
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
}
break;
case AM_TWILIGHT3:
if (sd) {
int ebottle = pc_search_inventory(sd,ITEMID_EMPTY_BOTTLE);
short alcohol_idx = -1, acid_idx = -1, fire_idx = -1;
if( ebottle >= 0 )
ebottle = sd->status.inventory[ebottle].amount;
//check if you can produce all three, if not, then fail:
if (!skill_can_produce_mix(sd,ITEMID_ALCOHOL,-1, 100) //100 Alcohol
|| !skill_can_produce_mix(sd,ITEMID_ACID_BOTTLE,-1, 50) //50 Acid Bottle
|| !skill_can_produce_mix(sd,ITEMID_FIRE_BOTTLE,-1, 50) //50 Flame Bottle
if (!(alcohol_idx = skill_can_produce_mix(sd,ITEMID_ALCOHOL,-1, 100)) //100 Alcohol
|| !(acid_idx = skill_can_produce_mix(sd,ITEMID_ACID_BOTTLE,-1, 50)) //50 Acid Bottle
|| !(fire_idx = skill_can_produce_mix(sd,ITEMID_FIRE_BOTTLE,-1, 50)) //50 Flame Bottle
|| ebottle < 200 //200 empty bottle are required at total.
) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
break;
}
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
skill_produce_mix(sd, skill_id, ITEMID_ALCOHOL, 0, 0, 0, 100);
skill_produce_mix(sd, skill_id, ITEMID_ACID_BOTTLE, 0, 0, 0, 50);
skill_produce_mix(sd, skill_id, ITEMID_FIRE_BOTTLE, 0, 0, 0, 50);
skill_produce_mix(sd, skill_id, ITEMID_ALCOHOL, 0, 0, 0, 100, alcohol_idx-1);
skill_produce_mix(sd, skill_id, ITEMID_ACID_BOTTLE, 0, 0, 0, 50, acid_idx-1);
skill_produce_mix(sd, skill_id, ITEMID_FIRE_BOTTLE, 0, 0, 0, 50, fire_idx-1);
}
break;
case SA_DISPELL:
@@ -8779,7 +8781,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case AB_ANCILLA:
if( sd ) {
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
skill_produce_mix(sd, skill_id, ITEMID_ANCILLA, 0, 0, 0, 1);
skill_produce_mix(sd, skill_id, ITEMID_ANCILLA, 0, 0, 0, 1, -1);
}
break;
@@ -9557,8 +9559,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
{
int heal;
heal = (120 * skill_lv) + (status_get_max_hp(bl) * skill_lv / 100);
status_heal(bl, heal, 0, 0);
if (!dstmd || dstmd->mob_id != MOBID_EMPERIUM || !mob_is_battleground(dstmd)) {
heal = (120 * skill_lv) + (status_get_max_hp(bl) * skill_lv / 100);
status_heal(bl, heal, 0, 0);
}
if( (tsc && tsc->opt1) && (rnd()%100 < ((skill_lv * 5) + (status_get_dex(src) + status_get_lv(src)) / 4) - (1 + (rnd() % 10))) ) {
status_change_end(bl, SC_STONE, INVALID_TIMER);
@@ -10925,7 +10929,7 @@ int skill_castend_pos(int tid, unsigned int tick, int id, intptr_t data)
skill_check_unit_range(src,ud->skillx,ud->skilly,ud->skill_id,ud->skill_lv)
)
{
if (sd) clif_skill_fail(sd,ud->skill_id,USESKILL_FAIL_LEVEL,0);
if (sd) clif_skill_fail(sd,ud->skill_id,USESKILL_FAIL_DUPLICATE_RANGEIN,0);
break;
}
if( src->type&battle_config.skill_nofootset &&
@@ -12331,30 +12335,37 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_
case GS_GROUNDDRIFT:
{
int element[5]={ELE_WIND,ELE_DARK,ELE_POISON,ELE_WATER,ELE_FIRE};
// Ground Drift Element is decided when it's placed.
int ele = skill_get_ele(skill_id, skill_lv);
int element[5] = { ELE_WIND, ELE_DARK, ELE_POISON, ELE_WATER, ELE_FIRE };
val1 = status->rhw.ele;
if (!val1)
val1=element[rnd()%5];
if (ele == -3)
val1 = element[rnd()%5]; // Use random from available unit visual?
else if (ele == -2)
val1 = status_get_attack_sc_element(src,sc);
else if (ele == -1) {
val1 = status->rhw.ele;
if (sc && sc->data[SC_ENCHANTARMS])
val1 = sc->data[SC_ENCHANTARMS]->val2;
}
switch (val1)
{
case ELE_FIRE:
subunt++;
case ELE_WATER:
subunt++;
case ELE_POISON:
subunt++;
case ELE_DARK:
subunt++;
case ELE_WIND:
break;
default:
subunt=rnd()%5;
break;
}
switch (val1) {
case ELE_FIRE:
subunt++;
case ELE_WATER:
subunt++;
case ELE_POISON:
subunt++;
case ELE_DARK:
subunt++;
case ELE_WIND:
break;
default:
subunt = rnd()%5;
break;
}
break;
break;
}
case GC_POISONSMOKE:
if( !(sc && sc->data[SC_POISONINGWEAPON]) )
@@ -12861,6 +12872,14 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, un
}
break;
case UNT_STEALTHFIELD:
if( bl->id == sg->src_id )
break; // Dont work on Self (video shows that)
case UNT_NEUTRALBARRIER:
if (!sce)
sc_start(ss, bl,type,100,sg->skill_lv,sg->limit);
break;
case UNT_GD_LEADERSHIP:
case UNT_GD_GLORYWOUNDS:
case UNT_GD_SOULCOLD:
@@ -13397,13 +13416,6 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, uns
skill_castend_damage_id(&src->bl, bl, sg->skill_id, sg->skill_lv, 0, 0);*/
break;
case UNT_STEALTHFIELD:
if( bl->id == sg->src_id )
break; // Dont work on Self (video shows that)
case UNT_NEUTRALBARRIER:
sc_start(ss, bl,type,100,sg->skill_lv,sg->interval + 100);
break;
case UNT_DIMENSIONDOOR:
if( tsd && !map[bl->m].flag.noteleport )
pc_randomwarp(tsd,CLR_TELEPORT);
@@ -13470,6 +13482,8 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, uns
break;
case UNT_HELLS_PLANT:
if (tsc && tsc->data[SC__MANHOLE])
break;
if( battle_check_target(&unit->bl,bl,BCT_ENEMY) > 0 )
skill_attack(skill_get_type(GN_HELLS_PLANT_ATK), ss, &unit->bl, bl, GN_HELLS_PLANT_ATK, sg->skill_lv, tick, SCSTART_NONE);
if( ss != bl) // The caster is the only one who can step on the Plants without destroying them
@@ -13658,8 +13672,6 @@ int skill_unit_onout(struct skill_unit *src, struct block_list *bl, unsigned int
case UNT_SAFETYWALL:
case UNT_PNEUMA:
case UNT_EPICLESIS://Arch Bishop
case UNT_NEUTRALBARRIER:
case UNT_STEALTHFIELD:
if (sce)
status_change_end(bl, type, INVALID_TIMER);
break;
@@ -13768,6 +13780,8 @@ int skill_unit_onleft(uint16 skill_id, struct block_list *bl, unsigned int tick)
case GN_FIRE_EXPANSION_SMOKE_POWDER:
case GN_FIRE_EXPANSION_TEAR_GAS:
case LG_KINGS_GRACE:
case NC_STEALTHFIELD:
case NC_NEUTRALBARRIER:
if (sce)
status_change_end(bl, type, INVALID_TIMER);
break;
@@ -17842,6 +17856,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
return 0;
}
/*==========================================
* Executes on all skill units every SKILLUNITTIMER_INTERVAL miliseconds.
*------------------------------------------*/
@@ -18203,9 +18218,10 @@ short skill_can_produce_mix(struct map_session_data *sd, unsigned short nameid,
* @param slot2
* @param slot3
* @param qty Amount of requested item
* @param produce_idx Index of produce entry in skill_produce_db[]. (Optional. Assumed the requirements are complete, checked somewhere)
* @return True is success, False if failed
*/
bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned short nameid, int slot1, int slot2, int slot3, int qty)
bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned short nameid, int slot1, int slot2, int slot3, int qty, short produce_idx)
{
int slot[3];
int i, sc, ele, idx, equip, wlv, make_per = 0, flag = 0, skill_lv = 0;
@@ -18220,9 +18236,14 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh
if( sd->skill_id_old == skill_id )
skill_lv = sd->skill_lv_old;
if( !(idx = skill_can_produce_mix(sd,nameid,-1, qty)) )
return false;
idx--;
if (produce_idx == -1) {
if( !(idx = skill_can_produce_mix(sd,nameid,-1, qty)) )
return false;
idx--;
}
else
idx = produce_idx;
if (qty < 1)
qty = 1;
@@ -19166,7 +19187,7 @@ int skill_changematerial(struct map_session_data *sd, int n, unsigned short *ite
} while(n == j && c == n);
p--;
if ( p > 0 ) {
skill_produce_mix(sd,GN_CHANGEMATERIAL,skill_produce_db[i].nameid,0,0,0,p);
skill_produce_mix(sd,GN_CHANGEMATERIAL,skill_produce_db[i].nameid,0,0,0,p,i);
return 1;
}
}

View File

@@ -487,7 +487,7 @@ bool skill_isNotOk_npcRange(struct block_list *src, uint16 skill_id, uint16 skil
// Item creation
short skill_can_produce_mix( struct map_session_data *sd, unsigned short nameid, int trigger, int qty);
bool skill_produce_mix( struct map_session_data *sd, uint16 skill_id, unsigned short nameid, int slot1, int slot2, int slot3, int qty );
bool skill_produce_mix( struct map_session_data *sd, uint16 skill_id, unsigned short nameid, int slot1, int slot2, int slot3, int qty, short produce_idx );
bool skill_arrow_create( struct map_session_data *sd, unsigned short nameid);

View File

@@ -5886,7 +5886,7 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc,
if( sc->data[SC_ANALYZE] )
def -= def * (14 * sc->data[SC_ANALYZE]->val1) / 100;
if( sc->data[SC_NEUTRALBARRIER] )
def += def * (10 + sc->data[SC_NEUTRALBARRIER]->val1 * 5) / 100;
def += def * sc->data[SC_NEUTRALBARRIER]->val2 / 100;
if( sc->data[SC_SHIELDSPELL_REF] && sc->data[SC_SHIELDSPELL_REF]->val1 == 2 )
def += sc->data[SC_SHIELDSPELL_REF]->val2;
if( sc->data[SC_PRESTIGE] )
@@ -6021,7 +6021,7 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc,
if(sc->data[SC_BURNING])
mdef -= 25 * mdef / 100;
if( sc->data[SC_NEUTRALBARRIER] )
mdef += mdef * (10 + sc->data[SC_NEUTRALBARRIER]->val1 * 5) / 100;
mdef += mdef * sc->data[SC_NEUTRALBARRIER]->val3 / 100;
if(sc->data[SC_ANALYZE])
mdef -= mdef * ( 14 * sc->data[SC_ANALYZE]->val1 ) / 100;
if(sc->data[SC_SYMPHONYOFLOVER])
@@ -10175,6 +10175,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
else
val4 = 0;
break;
case SC_NEUTRALBARRIER:
val2 = 10 + val1 * 5; // Def
val3 = 10 + val1 * 5; // Mdef
break;
/* Rebellion */
case SC_B_TRAP: