Compare commits
3 Commits
hotfix/iss
...
update/4th
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2f6c4d20de | ||
|
|
c8db7d3aa1 | ||
|
|
f4410fba6b |
@@ -67,14 +67,12 @@
|
||||
# Rate Drop rate of item. (Default: 1)
|
||||
# RandomOptionGroup Random Option Group applied to item on drop. (Default: None)
|
||||
# Index Index used for overwriting item. (Optional)
|
||||
# Clear If an index is given only the specific drop is cleared otherwise all drops are cleared. (Optional)
|
||||
# Drops: List of possible normal item drops. Max of MAX_MOB_DROP. (Optional)
|
||||
# - Item Item name.
|
||||
# Rate Drop rate of item. (Default: 1)
|
||||
# StealProtected If the item is shielded from TF_STEAL. (Default: false)
|
||||
# RandomOptionGroup Random Option Group applied to item on drop. (Default: None)
|
||||
# Index Index used for overwriting item. (Optional)
|
||||
# Clear If an index is given only the specific drop is cleared otherwise all drops are cleared. (Optional)
|
||||
###########################################################################
|
||||
|
||||
Header:
|
||||
|
||||
@@ -67,14 +67,12 @@
|
||||
# Rate Drop rate of item. (Default: 1)
|
||||
# RandomOptionGroup Random Option Group applied to item on drop. (Default: None)
|
||||
# Index Index used for overwriting item. (Optional)
|
||||
# Clear If an index is given only the specific drop is cleared otherwise all drops are cleared. (Optional)
|
||||
# Drops: List of possible normal item drops. Max of MAX_MOB_DROP. (Optional)
|
||||
# - Item Item name.
|
||||
# Rate Drop rate of item. (Default: 1)
|
||||
# StealProtected If the item is shielded from TF_STEAL. (Default: false)
|
||||
# RandomOptionGroup Random Option Group applied to item on drop. (Default: None)
|
||||
# Index Index used for overwriting item. (Optional)
|
||||
# Clear If an index is given only the specific drop is cleared otherwise all drops are cleared. (Optional)
|
||||
###########################################################################
|
||||
|
||||
Header:
|
||||
|
||||
@@ -67,14 +67,12 @@
|
||||
# Rate Drop rate of item.
|
||||
# RandomOptionGroup Random Option Group applied to item on drop. (Default: None)
|
||||
# Index Index used for overwriting item. (Optional)
|
||||
# Clear If an index is given only the specific drop is cleared otherwise all drops are cleared. (Optional)
|
||||
# Drops: List of possible normal item drops. Max of MAX_MOB_DROP. (Optional)
|
||||
# - Item Item name.
|
||||
# Rate Drop rate of item.
|
||||
# StealProtected If the item is shielded from TF_STEAL. (Default: false)
|
||||
# RandomOptionGroup Random Option Group applied to item on drop. (Default: None)
|
||||
# Index Index used for overwriting item. (Optional)
|
||||
# Clear If an index is given only the specific drop is cleared otherwise all drops are cleared. (Optional)
|
||||
###########################################################################
|
||||
|
||||
Header:
|
||||
|
||||
@@ -67,14 +67,12 @@
|
||||
# Rate Drop rate of item.
|
||||
# RandomOptionGroup Random Option Group applied to item on drop. (Default: None)
|
||||
# Index Index used for overwriting item. (Optional)
|
||||
# Clear If an index is given only the specific drop is cleared otherwise all drops are cleared. (Optional)
|
||||
# Drops: List of possible normal item drops. Max of MAX_MOB_DROP. (Optional)
|
||||
# - Item Item name.
|
||||
# Rate Drop rate of item.
|
||||
# StealProtected If the item is shielded from TF_STEAL. (Default: false)
|
||||
# RandomOptionGroup Random Option Group applied to item on drop. (Default: None)
|
||||
# Index Index used for overwriting item. (Optional)
|
||||
# Clear If an index is given only the specific drop is cleared otherwise all drops are cleared. (Optional)
|
||||
###########################################################################
|
||||
|
||||
Header:
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7764,7 +7764,8 @@ Body:
|
||||
Icon: EFST_ATTACK_STANCE
|
||||
DurationLookup: IG_ATTACK_STANCE
|
||||
CalcFlags:
|
||||
Watk: true
|
||||
Patk: true
|
||||
Smatk: true
|
||||
Def: true
|
||||
Flags:
|
||||
NoRemoveOnDead: true
|
||||
@@ -8109,3 +8110,11 @@ Body:
|
||||
All: true
|
||||
Flags:
|
||||
RemoveElementalOption: true
|
||||
- Status: Rush_Quake1
|
||||
Icon: EFST_RUSH_QUAKE1
|
||||
DurationLookup: MT_RUSH_QUAKE
|
||||
Flags:
|
||||
BlEffect: true
|
||||
- Status: Rush_Quake2
|
||||
Icon: EFST_RUSH_QUAKE2
|
||||
DurationLookup: MT_RUSH_QUAKE
|
||||
|
||||
@@ -8099,6 +8099,14 @@ This feature requires packet version 2017-07-26 or newer.
|
||||
|
||||
This function is intended for use in item scripts.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
*openbank({<char id>})
|
||||
|
||||
Opens the Bank UI for the attached player or the given character ID.
|
||||
|
||||
This command requires packet version 2015-01-28 or newer.
|
||||
|
||||
---------------------------------------
|
||||
\\
|
||||
6,1.- Unit-related commands
|
||||
|
||||
@@ -50,12 +50,10 @@
|
||||
# Rate Drop rate of item.
|
||||
# RandomOptionGroup Random Option Group applied to item on drop. (Default: None)
|
||||
# Index Index used for overwriting item. (Optional)
|
||||
# Clear If an index is given only the specific drop is cleared otherwise all drops are cleared. (Optional)
|
||||
# Drops: List of possible normal item drops. Max of MAX_MOB_DROP. (Optional)
|
||||
# - Item Item name.
|
||||
# Rate Drop rate of item.
|
||||
# StealProtected If the item is shielded from TF_STEAL. (Default: false)
|
||||
# RandomOptionGroup Random Option Group applied to item on drop. (Default: None)
|
||||
# Index Index used for overwriting item. (Optional)
|
||||
# Clear If an index is given only the specific drop is cleared otherwise all drops are cleared. (Optional)
|
||||
###########################################################################
|
||||
|
||||
@@ -149,11 +149,7 @@ void YamlDatabase::parse( const ryml::Tree& tree ){
|
||||
const char* fileName = this->currentFile.c_str();
|
||||
|
||||
for( const ryml::NodeRef &node : bodyNode ){
|
||||
if( this->nodeExists( node, "Remove" ) ){
|
||||
this->removeBodyNode( node );
|
||||
}else{
|
||||
count += this->parseBodyNode( node );
|
||||
}
|
||||
count += this->parseBodyNode( node );
|
||||
|
||||
ShowStatus( "Loading [%" PRIdPTR "/%" PRIdPTR "] entries from '" CL_WHITE "%s" CL_RESET "'" CL_CLL "\r", ++childNodesProgressed, childNodesCount, fileName );
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ private:
|
||||
bool load( const std::string& path );
|
||||
void parse( const ryml::Tree& rootNode );
|
||||
void parseImports( const ryml::Tree& rootNode );
|
||||
template <typename R> bool asType( const ryml::NodeRef& node, const std::string& name, R& out );
|
||||
|
||||
// These should be visible/usable by the implementation provider
|
||||
protected:
|
||||
@@ -42,7 +43,6 @@ protected:
|
||||
std::string getCurrentFile();
|
||||
|
||||
// Conversion functions
|
||||
template <typename R> bool asType( const ryml::NodeRef& node, const std::string& name, R& out );
|
||||
bool asBool(const ryml::NodeRef& node, const std::string &name, bool &out);
|
||||
bool asInt16(const ryml::NodeRef& node, const std::string& name, int16& out );
|
||||
bool asUInt16(const ryml::NodeRef& node, const std::string& name, uint16& out);
|
||||
@@ -76,7 +76,6 @@ public:
|
||||
virtual void clear() = 0;
|
||||
virtual const std::string getDefaultLocation() = 0;
|
||||
virtual uint64 parseBodyNode( const ryml::NodeRef& node ) = 0;
|
||||
virtual void removeBodyNode( const ryml::NodeRef& node ) = 0;
|
||||
};
|
||||
|
||||
template <typename keytype, typename datatype> class TypesafeYamlDatabase : public YamlDatabase{
|
||||
@@ -139,14 +138,6 @@ public:
|
||||
void erase(keytype key) {
|
||||
this->data.erase(key);
|
||||
}
|
||||
|
||||
void removeBodyNode( const ryml::NodeRef& node ){
|
||||
keytype key;
|
||||
|
||||
if( this->asType<keytype>( node, "Remove", key ) ){
|
||||
this->data.erase( key );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template <typename keytype, typename datatype> class TypesafeCachedYamlDatabase : public TypesafeYamlDatabase<keytype, datatype>{
|
||||
|
||||
@@ -693,8 +693,6 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
|
||||
}
|
||||
cardfix = cardfix * (100 + sd->indexed_bonus.magic_addsize[tstatus->size] + sd->indexed_bonus.magic_addsize[SZ_ALL]) / 100;
|
||||
cardfix = cardfix * (100 + sd->indexed_bonus.magic_addclass[tstatus->class_] + sd->indexed_bonus.magic_addclass[CLASS_ALL]) / 100;
|
||||
if (sd->status.weapon == W_2HSTAFF)// 2-Handed Staff Mastery
|
||||
cardfix = cardfix * (100 + pc_checkskill(sd, AG_TWOHANDSTAFF)) / 100;
|
||||
for (const auto &it : sd->add_mdmg) {
|
||||
if (it.id == t_class) {
|
||||
cardfix = cardfix * (100 + it.val) / 100;
|
||||
@@ -1537,6 +1535,9 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
||||
if (sc->data[SC_SHADOW_SCAR])// Need official adjustment for this too.
|
||||
damage += damage * (10 * sc->data[SC_SHADOW_SCAR]->val1) / 100;
|
||||
|
||||
if (sc->data[SC_RUSH_QUAKE1] && (flag & BF_WEAPONMASK) == BF_WEAPON)
|
||||
damage += damage * 50 / 100;
|
||||
|
||||
// Damage reductions
|
||||
// Assumptio increases DEF on RE mode, otherwise gives a reduction on the final damage. [Igniz]
|
||||
#ifndef RENEWAL
|
||||
@@ -1805,6 +1806,18 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
||||
pc_addsoulball(tsd, 5 + 3 * pc_checkskill(tsd, SP_SOULENERGY));
|
||||
}
|
||||
}
|
||||
|
||||
if (sc->data[SC_RUSH_QUAKE2] && (flag & BF_WEAPONMASK) == BF_WEAPON)
|
||||
damage += damage * (5 * sc->data[SC_RUSH_QUAKE2]->val1) / 100;
|
||||
|
||||
if (sc->data[SC_SHADOW_EXCEED]) {
|
||||
switch (skill_id) {
|
||||
case SHC_ETERNAL_SLASH:
|
||||
case SHC_SAVAGE_IMPACT:
|
||||
damage += damage / 4; // !TODO: What's the damage increase?
|
||||
break;
|
||||
}
|
||||
}
|
||||
} //End of caster SC_ check
|
||||
|
||||
//PK damage rates
|
||||
@@ -2446,7 +2459,6 @@ static int battle_range_type(struct block_list *src, struct block_list *target,
|
||||
// Renewal changes to ranged physical damage
|
||||
#endif
|
||||
case SR_RAMPAGEBLASTER:
|
||||
case DK_HACKANDSLASHER_ATK: // 2 cell cast range.
|
||||
return BF_LONG;
|
||||
case NJ_KIRIKAGE: // Cast range mimics NJ_SHADOWJUMP but damage is considered melee
|
||||
case GC_CROSSIMPACT: // Cast range is 7 cells and player jumps to target but skill is considered melee
|
||||
@@ -2463,6 +2475,17 @@ static int battle_range_type(struct block_list *src, struct block_list *target,
|
||||
if (sd && (sd->status.weapon == W_MACE || sd->status.weapon == W_2HMACE))
|
||||
return BF_LONG;
|
||||
}
|
||||
case DK_HACKANDSLASHER:
|
||||
case DK_HACKANDSLASHER_ATK: { // Range depends on weapon type.
|
||||
map_session_data *sd = BL_CAST(BL_PC, src);
|
||||
|
||||
if (sd) {
|
||||
if (sd->status.weapon == W_2HSWORD)
|
||||
return BF_SHORT;
|
||||
if (sd->status.weapon == W_2HSPEAR)
|
||||
return BF_LONG;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Skill Range Criteria
|
||||
@@ -2799,7 +2822,6 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
|
||||
#ifdef RENEWAL
|
||||
case ASC_BREAKER:
|
||||
#endif
|
||||
case LG_CANNONSPEAR:
|
||||
case GC_CROSSIMPACT:
|
||||
case SHC_SAVAGE_IMPACT:
|
||||
case SHC_ETERNAL_SLASH:
|
||||
@@ -3012,7 +3034,7 @@ static bool is_attack_hitting(struct Damage* wd, struct block_list *src, struct
|
||||
hitrate += pc_checkskill(sd, GN_REMODELING_CART) * 4;
|
||||
break;
|
||||
case LG_BANISHINGPOINT:
|
||||
hitrate += 3 * skill_lv;
|
||||
hitrate += 5 * skill_lv;
|
||||
break;
|
||||
case GC_VENOMPRESSURE:
|
||||
hitrate += 10 + 4 * skill_lv;
|
||||
@@ -3611,6 +3633,8 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list *
|
||||
damagevalue = damagevalue * (90 + 10 * pc_checkskill(sd, RK_DRAGONTRAINING)) / 100;
|
||||
if (sc && sc->data[SC_DRAGONIC_AURA])// Need official damage increase. [Rytech]
|
||||
damagevalue += damagevalue * 50 / 100;
|
||||
if (pc_checkskill(sd, DK_DRAGONIC_AURA)) // !TODO: Confirm
|
||||
damagevalue += damagevalue * (sstatus->patk + sstatus->pow) / 500;
|
||||
ATK_ADD(wd->damage, wd->damage2, damagevalue);
|
||||
#ifdef RENEWAL
|
||||
ATK_ADD(wd->weaponAtk, wd->weaponAtk2, damagevalue);
|
||||
@@ -4271,8 +4295,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
#else
|
||||
skillratio += 30 * skill_lv;
|
||||
#endif
|
||||
if (sc && sc->data[SC_SHIELD_POWER])// Whats the official increase? [Rytech]
|
||||
skillratio += skillratio * 50 / 100;
|
||||
if (sc && sc->data[SC_SHIELD_POWER])
|
||||
skillratio += 50 + ((sd) ? pc_checkskill(sd, IG_SHIELD_MASTERY) * 60 : 0);
|
||||
break;
|
||||
case WS_CARTTERMINATION:
|
||||
i = 10 * (16 - skill_lv);
|
||||
@@ -4437,7 +4461,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
if (sc->data[SC_CHARGINGPIERCE_COUNT] && sc->data[SC_CHARGINGPIERCE_COUNT]->val1 >= 10)
|
||||
skillratio *= 2;
|
||||
if (sc->data[SC_DRAGONIC_AURA])// Need official damage increase. [Rytech]
|
||||
skillratio += skillratio * 50 / 100;
|
||||
skillratio += 280 * skill_lv;
|
||||
}
|
||||
break;
|
||||
case RK_WINDCUTTER:
|
||||
@@ -4552,7 +4576,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
skillratio += 50 * skill_lv;
|
||||
break;
|
||||
case NC_BOOSTKNUCKLE:
|
||||
skillratio += 200 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus?
|
||||
skillratio += 240 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus?
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case NC_PILEBUNKER:
|
||||
@@ -4560,7 +4584,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case NC_VULCANARM:
|
||||
skillratio += -100 + 140 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus?
|
||||
skillratio += -100 + 230 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus?
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case NC_FLAMELAUNCHER:
|
||||
@@ -4569,7 +4593,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
RE_LVL_DMOD(150);
|
||||
break;
|
||||
case NC_ARMSCANNON:
|
||||
skillratio += -100 + 400 + 300 * skill_lv;
|
||||
skillratio += -100 + 400 + 350 * skill_lv;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case NC_AXEBOOMERANG:
|
||||
@@ -4594,14 +4618,14 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
case NC_AXETORNADO:
|
||||
skillratio += -100 + 200 + 180 * skill_lv + sstatus->vit / 6; // !TODO: What's the VIT bonus?
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_AXE_STOMP])// Whats the official increase? [Rytech]
|
||||
skillratio += skillratio * 50 / 100;
|
||||
if (sc && sc->data[SC_AXE_STOMP])
|
||||
skillratio += 120 * skill_lv;
|
||||
break;
|
||||
case SC_FATALMENACE:
|
||||
skillratio += 120 * skill_lv + sstatus->agi / 6; // !TODO: What's the AGI bonus?
|
||||
skillratio += -100 + 120 * skill_lv + sstatus->agi / 6; // !TODO: What's the AGI bonus?
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_ABYSS_DAGGER])
|
||||
skillratio += skillratio * 50 / 100;
|
||||
skillratio += 300;
|
||||
break;
|
||||
case SC_TRIANGLESHOT:
|
||||
skillratio += -100 + 230 * skill_lv + 3 * sstatus->agi;
|
||||
@@ -4612,19 +4636,19 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
RE_LVL_DMOD(120);
|
||||
break;
|
||||
case LG_CANNONSPEAR:
|
||||
skillratio += -100 + skill_lv * (50 + sstatus->str);
|
||||
skillratio += -100 + 120 * skill_lv + (skill_lv * sstatus->str);
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_SPEAR_SCAR])// Whats the official increase? [Rytech]
|
||||
skillratio += skillratio * 50 / 100;
|
||||
break;
|
||||
case LG_BANISHINGPOINT:
|
||||
skillratio += -100 + (80 * skill_lv) + ((sd) ? pc_checkskill(sd,SM_BASH) * 30 : 0);
|
||||
skillratio += -100 + (100 * skill_lv) + ((sd) ? pc_checkskill(sd,SM_BASH) * 70 : 0);
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_SPEAR_SCAR])// Whats the official increase? [Rytech]
|
||||
skillratio += skillratio * 50 / 100;
|
||||
break;
|
||||
case LG_SHIELDPRESS:
|
||||
skillratio += -100 + 200 * skill_lv + sstatus->str;
|
||||
skillratio += -100 + 200 * skill_lv + sstatus->str + sstatus->vit; // !TODO: What's the STR/VIT bonus?
|
||||
if (sd) {
|
||||
short index = sd->equip_index[EQI_HAND_L];
|
||||
|
||||
@@ -4632,8 +4656,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
skillratio += sd->inventory_data[index]->weight / 10;
|
||||
}
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_SHIELD_POWER])// Whats the official increase? [Rytech]
|
||||
skillratio += skillratio * 50 / 100;
|
||||
if (sc && sc->data[SC_SHIELD_POWER])
|
||||
skillratio += 100 + ((sd) ? pc_checkskill(sd, IG_SHIELD_MASTERY) * 200 : 0);
|
||||
break;
|
||||
case LG_PINPOINTATTACK:
|
||||
skillratio += -100 + 100 * skill_lv + 5 * status_get_agi(src);
|
||||
@@ -4652,17 +4676,18 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
break;
|
||||
case LG_OVERBRAND:
|
||||
if(sc && sc->data[SC_OVERBRANDREADY])
|
||||
skillratio += -100 + 450 * skill_lv;
|
||||
skillratio += -100 + 500 * skill_lv;
|
||||
else
|
||||
skillratio += -100 + 300 * skill_lv;
|
||||
skillratio += sstatus->dex / 2 + sstatus->str / 2; // !TODO: What's the STR/DEX bonus?
|
||||
skillratio += ((sd) ? pc_checkskill(sd, CR_SPEARQUICKEN) * 50 : 0);
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case LG_EARTHDRIVE:
|
||||
skillratio += -100 + 380 * skill_lv + ((sstatus->str + sstatus->vit) / 6); // !TODO: What's the STR/VIT bonus?
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_SHIELD_POWER])// Whats the official increase? [Rytech]
|
||||
skillratio += skillratio * 50 / 100;
|
||||
if (sc && sc->data[SC_SHIELD_POWER])
|
||||
skillratio += 150 + ((sd) ? pc_checkskill(sd, IG_SHIELD_MASTERY) * 180 : 0);
|
||||
break;
|
||||
case LG_HESPERUSLIT:
|
||||
if (sc && sc->data[SC_INSPIRATION])
|
||||
@@ -5041,7 +5066,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
skillratio += skillratio * sc->data[SC_LIGHTOFSTAR]->val2 / 100;
|
||||
break;
|
||||
case DK_SERVANTWEAPON_ATK:
|
||||
skillratio += 50 + 50 * skill_lv + 5 * sstatus->pow;
|
||||
skillratio += 100 + 50 * skill_lv + 5 * sstatus->pow;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case DK_SERVANT_W_PHANTOM:
|
||||
@@ -5072,11 +5097,19 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
skillratio += 450 * skill_lv;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case DK_MADNESS_CRUSHER:// How does weight affect the damage? [Rytech]
|
||||
skillratio += -100 + 450 * skill_lv + 5 * sstatus->pow;
|
||||
case DK_MADNESS_CRUSHER:
|
||||
skillratio += -100 + 600 * skill_lv + 5 * sstatus->pow;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_CHARGINGPIERCE_COUNT] && sc->data[SC_CHARGINGPIERCE_COUNT]->val1 >= 10)
|
||||
skillratio *= 2;
|
||||
if (sd && (sd->status.weapon == W_2HSWORD || sd->status.weapon == W_2HSPEAR)) {
|
||||
short index = sd->equip_index[EQI_HAND_L];
|
||||
|
||||
if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON) {
|
||||
skillratio += sd->inventory_data[index]->weight / 10; // !TODO: What's the bonus?
|
||||
skillratio += sd->inventory_data[index]->weapon_level * 50; // !TODO: What's the bonus?
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DK_STORMSLASH:
|
||||
skillratio += -100 + 120 * skill_lv + 5 * sstatus->pow;
|
||||
@@ -5095,10 +5128,10 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case IQ_EXPOSION_BLASTER:
|
||||
skillratio += -100 + 450 * skill_lv + 5 * sstatus->pow;
|
||||
skillratio += -100 + 650 * skill_lv + 5 * sstatus->pow;
|
||||
RE_LVL_DMOD(100);
|
||||
if (tsc && tsc->data[SC_HOLY_OIL])
|
||||
skillratio += skillratio * 50 / 100;
|
||||
skillratio += 200 * skill_lv;
|
||||
break;
|
||||
case IQ_FIRST_BRAND:
|
||||
skillratio += -100 + 450 * skill_lv + 5 * sstatus->pow;
|
||||
@@ -5117,11 +5150,12 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case IQ_THIRD_PUNISH:
|
||||
skillratio += -100 + 550 * skill_lv + 5 * sstatus->pow;
|
||||
skillratio += -100 + 650 * skill_lv + 5 * sstatus->pow;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case IQ_THIRD_FLAME_BOMB:
|
||||
skillratio += -100 + 650 * skill_lv + 5 * sstatus->pow;
|
||||
skillratio += sstatus->max_hp * 20 / 100;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case IQ_THIRD_CONSECRATION:
|
||||
@@ -5145,8 +5179,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
skillratio += sd->inventory_data[index]->weight / 20 * sd->inventory.u.items_inventory[index].refine;
|
||||
}
|
||||
RE_LVL_DMOD(100);
|
||||
if ((i = pc_checkskill_imperial_guard(sd, 3)) > 0)
|
||||
skillratio += skillratio * i / 100;
|
||||
if ((i = pc_checkskill_imperial_guard(sd, 1)) > 0)
|
||||
skillratio += skill_lv * i * 15;
|
||||
break;
|
||||
case IG_OVERSLASH:
|
||||
skillratio += -100 + 60 * skill_lv + 5 * sstatus->pow;
|
||||
@@ -5169,7 +5203,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case SHC_SAVAGE_IMPACT:
|
||||
skillratio += -100 + 350 * skill_lv + 5 * sstatus->pow;
|
||||
skillratio += -100 + 60 * skill_lv + 5 * sstatus->pow;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case SHC_ETERNAL_SLASH:
|
||||
@@ -5191,7 +5225,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case MT_AXE_STOMP:
|
||||
skillratio += -100 + 350 * skill_lv + 5 * sstatus->pow;
|
||||
skillratio += -100 + 400 * skill_lv + 5 * sstatus->pow;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case MT_RUSH_QUAKE:
|
||||
@@ -5205,18 +5239,21 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case ABC_ABYSS_DAGGER:
|
||||
skillratio += -100 + 550 * skill_lv + 5 * sstatus->pow;
|
||||
skillratio += -100 + 350 * skill_lv + 5 * sstatus->pow;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case ABC_UNLUCKY_RUSH:
|
||||
skillratio += -100 + 500 * skill_lv + 5 * sstatus->crt;
|
||||
skillratio += -100 + 100 + 300 * skill_lv + 5 * sstatus->pow;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case ABC_CHAIN_REACTION_SHOT:
|
||||
case ABC_CHAIN_REACTION_SHOT_ATK:// Same damage formula? [Rytech]
|
||||
skillratio += -100 + 600 * skill_lv + 5 * sstatus->con;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case ABC_CHAIN_REACTION_SHOT_ATK:
|
||||
skillratio += -100 + 950 * skill_lv + 5 * sstatus->con;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case ABC_DEFT_STAB:
|
||||
skillratio += -100 + 360 * skill_lv + 5 * sstatus->pow;
|
||||
RE_LVL_DMOD(100);
|
||||
@@ -5226,7 +5263,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case WH_HAWKRUSH:
|
||||
skillratio += -100 + 100 * skill_lv + 5 * sstatus->con;
|
||||
skillratio += -100 + 200 * skill_lv + 5 * sstatus->con;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case WH_HAWKBOOMERANG:// Affected by trait stats??? CON for sure but the other one unknown. Likely POW. [Rytech]
|
||||
@@ -5236,7 +5273,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case WH_GALESTORM:
|
||||
skillratio += -100 + 250 * skill_lv + 5 * sstatus->con;
|
||||
skillratio += -100 + 250 * skill_lv + 7 * sstatus->con;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_CALAMITYGALE] && (tstatus->race == RC_BRUTE || tstatus->race == RC_FISH))
|
||||
skillratio += skillratio * 50 / 100;
|
||||
@@ -5272,7 +5309,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
case BO_ACIDIFIED_ZONE_GROUND_ATK:
|
||||
case BO_ACIDIFIED_ZONE_WIND_ATK:
|
||||
case BO_ACIDIFIED_ZONE_FIRE_ATK:
|
||||
skillratio += -100 + 250 * skill_lv + 5 * sstatus->pow;
|
||||
skillratio += -100 + 400 * skill_lv + 5 * sstatus->pow;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_RESEARCHREPORT]) { // Does this also affect skills like acid demo? [Rytech]
|
||||
skillratio += skillratio * 50 / 100;
|
||||
@@ -5287,23 +5324,34 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
}
|
||||
break;
|
||||
case TR_ROSEBLOSSOM:
|
||||
case TR_ROSEBLOSSOM_ATK:// Same damage formula? [Rytech]
|
||||
skillratio += -100 + 500 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con;
|
||||
skillratio += -100 + 750 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_MYSTIC_SYMPHONY]) {
|
||||
skillratio += skillratio * 40 / 100;
|
||||
skillratio *= 2;
|
||||
|
||||
if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
|
||||
skillratio += skillratio * 50 / 100;
|
||||
}
|
||||
if (tsc && tsc->data[SC_SOUNDBLEND])
|
||||
skillratio += skillratio * 50 / 100;
|
||||
skillratio += 250 * skill_lv;
|
||||
break;
|
||||
case TR_ROSEBLOSSOM_ATK:
|
||||
skillratio += -100 + 350 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_MYSTIC_SYMPHONY]) {
|
||||
skillratio *= 2;
|
||||
|
||||
if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
|
||||
skillratio += skillratio * 50 / 100;
|
||||
}
|
||||
if (tsc && tsc->data[SC_SOUNDBLEND])
|
||||
skillratio += 400 * skill_lv;
|
||||
break;
|
||||
case TR_RHYTHMSHOOTING:
|
||||
skillratio += -100 + 120 * skill_lv + (sd ? pc_checkskill(sd, TR_STAGE_MANNER) : 5) * sstatus->con;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_MYSTIC_SYMPHONY]) {
|
||||
skillratio += skillratio * 40 / 100;
|
||||
skillratio *= 2;
|
||||
|
||||
if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
|
||||
skillratio += skillratio * 50 / 100;
|
||||
@@ -6219,7 +6267,11 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block
|
||||
wd.div_ = min(wd.div_ + wd.miscflag, 3); // Number of hits doesn't go above 3.
|
||||
break;
|
||||
case IG_OVERSLASH:
|
||||
wd.div_ = min(wd.div_ + wd.miscflag, 5); // Number of hits doesn't appear to go above 5.
|
||||
wd.div_ = min(wd.div_ + wd.miscflag, 7); // Number of hits doesn't appear to go above 5.
|
||||
break;
|
||||
case SHC_SAVAGE_IMPACT:
|
||||
if (sc && sc->data[SC_CLOAKINGEXCEED])
|
||||
wd.div_ = 5;
|
||||
break;
|
||||
case SHC_ETERNAL_SLASH:
|
||||
if (sc && sc->data[SC_E_SLASH_COUNT])
|
||||
@@ -6235,7 +6287,11 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block
|
||||
break;
|
||||
case MT_AXE_STOMP:
|
||||
if (sd && sd->status.weapon == W_2HAXE)
|
||||
wd.div_ = 2;
|
||||
wd.div_ = 3;
|
||||
break;
|
||||
case ABC_FRENZY_SHOT:
|
||||
if (rnd() % 100 < 5 * skill_lv)
|
||||
wd.div_ = 3;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
@@ -7172,7 +7228,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
||||
RE_LVL_DMOD(100); // ! TODO: Confirm new formula
|
||||
break;
|
||||
case LG_RAYOFGENESIS:
|
||||
skillratio += -100 + 230 * skill_lv + sstatus->int_ / 6; // !TODO: What's the INT bonus?
|
||||
skillratio += -100 + 350 * skill_lv + sstatus->int_ / 6; // !TODO: What's the INT bonus?
|
||||
if (sc && sc->data[SC_INSPIRATION])
|
||||
skillratio += 70 * skill_lv;
|
||||
RE_LVL_DMOD(100);
|
||||
@@ -7372,7 +7428,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case AG_MYSTERY_ILLUSION:
|
||||
skillratio += -100 + 250 * skill_lv + 5 * sstatus->spl;
|
||||
skillratio += -100 + 500 * skill_lv + 5 * sstatus->spl;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case AG_VIOLENT_QUAKE_ATK:
|
||||
@@ -7447,21 +7503,22 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case AG_ROCK_DOWN:
|
||||
skillratio += -100 + 750 * skill_lv + 5 * sstatus->spl;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case AG_STORM_CANNON:
|
||||
case AG_FROZEN_SLASH:
|
||||
skillratio += -100 + 600 * skill_lv + 5 * sstatus->spl;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_CLIMAX])
|
||||
skillratio += 250 * skill_lv;
|
||||
break;
|
||||
case AG_CRIMSON_ARROW:
|
||||
case AG_CRIMSON_ARROW_ATK:
|
||||
skillratio += -100 + 300 * skill_lv + 5 * sstatus->spl;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case AG_FROZEN_SLASH:
|
||||
skillratio += -100 + 750 * skill_lv + 5 * sstatus->spl;
|
||||
case AG_CRIMSON_ARROW_ATK:
|
||||
skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_CLIMAX])
|
||||
skillratio *= 2;
|
||||
break;
|
||||
case IG_JUDGEMENT_CROSS:
|
||||
skillratio += -100 + 750 * skill_lv + 10 * sstatus->spl;
|
||||
@@ -7471,17 +7528,24 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
||||
if ((i = pc_checkskill_imperial_guard(sd, 3)) > 0)
|
||||
skillratio += skillratio * i / 100;
|
||||
break;
|
||||
case IG_CROSS_RAIN:// Need official damage increase from Spear and Sword Mastery. [Rytech]
|
||||
skillratio += -100 + 30 * skill_lv + 5 * sstatus->spl + 5 * pc_checkskill(sd, IG_SPEAR_SWORD_M);
|
||||
case IG_CROSS_RAIN:
|
||||
skillratio += -100 + 30 * skill_lv + 5 * sstatus->spl + (skill_lv * 5 * pc_checkskill(sd, IG_SPEAR_SWORD_M));
|
||||
RE_LVL_DMOD(100);
|
||||
if ((i = pc_checkskill_imperial_guard(sd, 3)) > 0)
|
||||
skillratio += skillratio * i / 100;
|
||||
if (sc && sc->data[SC_HOLY_S])
|
||||
skillratio += 20 * skill_lv;
|
||||
skillratio += 20 * skill_lv + (skill_lv * 5 * pc_checkskill(sd, IG_SPEAR_SWORD_M));
|
||||
break;
|
||||
case CD_ARBITRIUM:
|
||||
skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl;
|
||||
if (sd)
|
||||
skillratio += 100 * pc_checkskill(sd, CD_FIDUS_ANIMUS);
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case CD_ARBITRIUM_ATK:
|
||||
skillratio += -100 + 200 * skill_lv + 5 * sstatus->spl;
|
||||
skillratio += -100 + 550 * skill_lv + 5 * sstatus->spl;
|
||||
if (sd)
|
||||
skillratio += 100 * pc_checkskill(sd, CD_FIDUS_ANIMUS);
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case CD_PNEUMATICUS_PROCELLA:
|
||||
@@ -7508,51 +7572,53 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
||||
break;
|
||||
case ABC_ABYSS_SQUARE:
|
||||
skillratio += -100 + 140 * skill_lv + 5 * sstatus->spl;
|
||||
if (sd)
|
||||
skillratio += pc_checkskill(sd, ABC_MAGIC_SWORD_M) * 130;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case TR_METALIC_FURY:
|
||||
skillratio += -100 + 600 * skill_lv + 5 * sstatus->spl;
|
||||
skillratio += -100 + 900 * skill_lv + 5 * sstatus->spl;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case TR_SOUNDBLEND:
|
||||
skillratio += -100 + 120 * skill_lv + 5 * sstatus->spl;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_MYSTIC_SYMPHONY]) {
|
||||
skillratio += skillratio * 40 / 100;
|
||||
skillratio *= 2;
|
||||
|
||||
if (tstatus->race == RC_FISH || tstatus->race == RC_DEMIHUMAN)
|
||||
skillratio += skillratio * 50 / 100;
|
||||
}
|
||||
break;
|
||||
case EM_DIAMOND_STORM:
|
||||
skillratio += -100 + 700 * skill_lv + 5 * sstatus->spl;
|
||||
skillratio += -100 + 1250 * skill_lv + 5 * sstatus->spl;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_SUMMON_ELEMENTAL_DILUVIO])
|
||||
skillratio += skillratio * 30 / 100;
|
||||
skillratio += 3500 + 500 * skill_lv;
|
||||
break;
|
||||
case EM_LIGHTNING_LAND:
|
||||
skillratio += -100 + 150 * skill_lv + 5 * sstatus->spl;
|
||||
skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_SUMMON_ELEMENTAL_PROCELLA])
|
||||
skillratio += skillratio * 30 / 100;
|
||||
skillratio += 400 * skill_lv;
|
||||
break;
|
||||
case EM_VENOM_SWAMP:
|
||||
skillratio += -100 + 150 * skill_lv + 5 * sstatus->spl;
|
||||
skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_SUMMON_ELEMENTAL_SERPENS])
|
||||
skillratio += skillratio * 30 / 100;
|
||||
skillratio += 400 * skill_lv;
|
||||
break;
|
||||
case EM_CONFLAGRATION:
|
||||
skillratio += -100 + 150 * skill_lv + 5 * sstatus->spl;
|
||||
skillratio += -100 + 400 * skill_lv + 5 * sstatus->spl;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_SUMMON_ELEMENTAL_ARDOR])
|
||||
skillratio += skillratio * 30 / 100;
|
||||
skillratio += 400 * skill_lv;
|
||||
break;
|
||||
case EM_TERRA_DRIVE:
|
||||
skillratio += -100 + 700 * skill_lv + 5 * sstatus->spl;
|
||||
skillratio += -100 + 1250 * skill_lv + 5 * sstatus->spl;
|
||||
RE_LVL_DMOD(100);
|
||||
if (sc && sc->data[SC_SUMMON_ELEMENTAL_TERREMOTUS])
|
||||
skillratio += skillratio * 30 / 100;
|
||||
skillratio += 3500 + 500 * skill_lv;
|
||||
break;
|
||||
case ABC_FROM_THE_ABYSS_ATK:
|
||||
skillratio += 50 + 70 * skill_lv + 5 * sstatus->spl;
|
||||
@@ -8968,9 +9034,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
}
|
||||
|
||||
if( sc ){
|
||||
// It has a success chance of triggering even tho the description says nothing about it.
|
||||
// TODO: Need to find out what the official success chance is. [Rytech]
|
||||
if( sc->data[SC_SERVANTWEAPON] && sd->servantball > 0 && rnd() % 100 < 20 ){
|
||||
if( sc->data[SC_SERVANTWEAPON] && sd->servantball > 0 && rnd() % 100 < 15) {
|
||||
uint16 skill_id = DK_SERVANTWEAPON_ATK;
|
||||
uint16 skill_lv = sc->data[SC_SERVANTWEAPON]->val1;
|
||||
|
||||
@@ -8992,9 +9056,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
|
||||
sd->state.autocast = 0;
|
||||
}
|
||||
|
||||
// It has a success chance of triggering even tho the description says nothing about it.
|
||||
// TODO: Need to find out what the official success chance is. [Rytech]
|
||||
if( sc->data[SC_ABYSSFORCEWEAPON] && sd->abyssball > 0 && rnd() % 100 < 20 ){
|
||||
if( sc->data[SC_ABYSSFORCEWEAPON] && sd->abyssball > 0 && rnd() % 100 < 15 ){
|
||||
uint16 skill_id = ABC_FROM_THE_ABYSS_ATK;
|
||||
uint16 skill_lv = sc->data[SC_ABYSSFORCEWEAPON]->val1;
|
||||
|
||||
|
||||
@@ -1159,7 +1159,8 @@ enum in_ui_type : int8 {
|
||||
};
|
||||
|
||||
enum out_ui_type : int8 {
|
||||
OUT_UI_STYLIST = 1,
|
||||
OUT_UI_BANK = 0,
|
||||
OUT_UI_STYLIST,
|
||||
OUT_UI_QUEST = 6,
|
||||
OUT_UI_ATTENDANCE = 7
|
||||
};
|
||||
|
||||
@@ -4205,62 +4205,12 @@ bool MobDatabase::parseDropNode(std::string nodeName, const ryml::NodeRef& node,
|
||||
this->invalidWarning(dropit["Index"], "Invalid monster %s index %hu. Must be between 0~%hu, skipping.\n", nodeName.c_str(), index, max - 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
if( this->nodeExists( dropit, "Clear" ) ){
|
||||
bool clear;
|
||||
|
||||
if( !this->asBool( dropit, "Clear", clear ) ){
|
||||
return false;
|
||||
}
|
||||
|
||||
if( clear ){
|
||||
// Clear specific index
|
||||
drops[index] = {};
|
||||
|
||||
if( !this->nodeExists( dropit, "Item" ) ){
|
||||
// Continue with next yaml node
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Find next empty slot
|
||||
for( ; i < max; i++ ){
|
||||
if( drops[i].nameid == 0 ){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// No empty slots anymore
|
||||
if (i >= max) {
|
||||
this->invalidWarning(dropit, "Maximum of %d monster %s met, skipping.\n", max, nodeName.c_str());
|
||||
continue;
|
||||
}
|
||||
|
||||
// Use free index and increment it for the next entry
|
||||
index = i++;
|
||||
|
||||
if( this->nodeExists( dropit, "Clear" ) ){
|
||||
bool clear;
|
||||
|
||||
if( !this->asBool( dropit, "Clear", clear ) ){
|
||||
return false;
|
||||
}
|
||||
|
||||
if( clear ){
|
||||
// Clear all
|
||||
for( uint8 j = 0; j < max; j++ ){
|
||||
drops[j] = {};
|
||||
}
|
||||
|
||||
// Reset current index for next entry
|
||||
i = 0;
|
||||
|
||||
if( !this->nodeExists( dropit, "Item" ) ){
|
||||
// Continue with next yaml node
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (index >= max) {
|
||||
this->invalidWarning(dropit, "Maximum of %d monster %s met, skipping.\n", max, nodeName.c_str());
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -362,9 +362,8 @@ public:
|
||||
}
|
||||
|
||||
void clear() override{ };
|
||||
void removeBodyNode(const ryml::NodeRef& node) override{ };
|
||||
const std::string getDefaultLocation();
|
||||
uint64 parseBodyNode(const ryml::NodeRef& node);
|
||||
const std::string getDefaultLocation() override;
|
||||
uint64 parseBodyNode(const ryml::NodeRef& node) override;
|
||||
};
|
||||
|
||||
struct s_randomsummon_entry {
|
||||
|
||||
@@ -25840,6 +25840,27 @@ BUILDIN_FUNC( open_quest_ui ){
|
||||
return SCRIPT_CMD_SUCCESS;
|
||||
}
|
||||
|
||||
BUILDIN_FUNC(openbank){
|
||||
#if PACKETVER < 20150128
|
||||
ShowError( "buildin_openbank: This command requires PACKETVER 20150128 or newer.\n" );
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
#else
|
||||
struct map_session_data* sd = nullptr;
|
||||
|
||||
if (!script_charid2sd(2, sd)) {
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
}
|
||||
|
||||
if( !battle_config.feature_banking ){
|
||||
ShowError( "buildin_openbank: banking is disabled.\n" );
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
}
|
||||
|
||||
clif_ui_open( sd, OUT_UI_BANK, 0 );
|
||||
return SCRIPT_CMD_SUCCESS;
|
||||
#endif
|
||||
}
|
||||
|
||||
#include "../custom/script.inc"
|
||||
|
||||
// declarations that were supposed to be exported from npc_chat.cpp
|
||||
@@ -26553,6 +26574,7 @@ struct script_function buildin_func[] = {
|
||||
BUILDIN_DEF(laphine_upgrade, ""),
|
||||
BUILDIN_DEF(randomoptgroup,"i"),
|
||||
BUILDIN_DEF(open_quest_ui, "??"),
|
||||
BUILDIN_DEF(openbank,"?"),
|
||||
#include "../custom/script_def.inc"
|
||||
|
||||
{NULL,NULL,NULL},
|
||||
|
||||
@@ -2078,7 +2078,6 @@ public:
|
||||
void clear() override{ }
|
||||
const std::string getDefaultLocation() override;
|
||||
uint64 parseBodyNode(const ryml::NodeRef& node) override;
|
||||
void removeBodyNode( const ryml::NodeRef& node ) override { };
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -1839,6 +1839,8 @@
|
||||
export_constant(SC_DEEP_POISONING_OPTION);
|
||||
export_constant(SC_POISON_SHIELD);
|
||||
export_constant(SC_POISON_SHIELD_OPTION);
|
||||
export_constant(SC_RUSH_QUAKE1);
|
||||
export_constant(SC_RUSH_QUAKE2);
|
||||
|
||||
#ifdef RENEWAL
|
||||
export_constant(SC_EXTREMITYFIST2);
|
||||
|
||||
@@ -2119,6 +2119,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
||||
case AG_CRYSTAL_IMPACT:// Targets hit are dealt aftershock damage.
|
||||
skill_castend_damage_id(src, bl, AG_CRYSTAL_IMPACT_ATK, skill_lv, tick, SD_LEVEL);
|
||||
break;
|
||||
case AG_CRIMSON_ARROW:
|
||||
skill_castend_damage_id(src, bl, AG_CRIMSON_ARROW_ATK, skill_lv, tick, SD_LEVEL);
|
||||
break;
|
||||
case IQ_OLEUM_SANCTUM:
|
||||
sc_start(src, bl, SC_HOLY_OIL, 100, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||
break;
|
||||
@@ -2183,6 +2186,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
||||
case EM_TERRA_DRIVE:
|
||||
sc_start(src, bl, SC_HANDICAPSTATE_CRYSTALLIZATION, 40 + 10 * skill_lv, skill_lv, skill_get_time2(skill_id, skill_lv));
|
||||
break;
|
||||
case MT_RUSH_QUAKE:
|
||||
sc_start(src, bl, SC_RUSH_QUAKE1, 100, skill_lv, skill_get_time2(skill_id, skill_lv));
|
||||
break;
|
||||
} //end switch skill_id
|
||||
|
||||
if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai && md->special_state.ai != AI_ABR && md->special_state.ai != AI_BIONIC)
|
||||
@@ -4014,10 +4020,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
||||
if (skill_area_temp[1] == bl->id && rnd()%100 < 4 * skill_lv)// Need official autocast chance. [Rytech]
|
||||
skill_addtimerskill(src, tick + dmg.amotion, bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, 2);
|
||||
break;
|
||||
case ABC_FRENZY_SHOT:
|
||||
if (rnd()%100 < 4 * skill_lv)// Need official autocast chance. [Rytech]
|
||||
skill_addtimerskill(src, tick + dmg.amotion, bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, 2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4603,11 +4605,8 @@ static TIMER_FUNC(skill_timerskill){
|
||||
}
|
||||
break;
|
||||
case NPC_PULSESTRIKE2:
|
||||
skill_castend_damage_id(src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
|
||||
break;
|
||||
case ABC_DEFT_STAB:
|
||||
case ABC_FRENZY_SHOT:
|
||||
skill_castend_damage_id(src, target, skl->skill_id, skl->skill_lv, tick, skl->flag);
|
||||
skill_castend_damage_id(src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
|
||||
break;
|
||||
default:
|
||||
skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
|
||||
@@ -5258,8 +5257,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
skill_get_splash(skill_id, skill_lv), skill_get_maxcount(skill_id, skill_lv), splash_target(src),
|
||||
skill_get_type(skill_id), src, src, skill_id, skill_lv, tick, flag, BCT_ENEMY);
|
||||
}
|
||||
if (skill_id == AG_CRIMSON_ARROW)
|
||||
skill_attack(skill_get_type(AG_CRIMSON_ARROW_ATK), src, src, bl, AG_CRIMSON_ARROW_ATK, skill_lv, tick, flag|SD_LEVEL|SD_ANIMATION);
|
||||
break;
|
||||
|
||||
case MO_INVESTIGATE:
|
||||
@@ -5480,6 +5477,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
case AG_SOUL_VC_STRIKE:
|
||||
case AG_CRYSTAL_IMPACT:
|
||||
case AG_CRYSTAL_IMPACT_ATK:
|
||||
case AG_CRIMSON_ARROW_ATK:
|
||||
case AG_ROCK_DOWN:
|
||||
case AG_FROZEN_SLASH:
|
||||
case IQ_OLEUM_SANCTUM:
|
||||
@@ -5539,6 +5537,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
if (skill_id == DK_SERVANT_W_DEMOL && !(tsc && tsc->data[SC_SERVANT_SIGN] && tsc->data[SC_SERVANT_SIGN]->val1 == src->id))
|
||||
break;
|
||||
|
||||
// Over Slash - Appears to deal a number of hits equal to 2 + Number of Enemys In AoE. Max of 7 hits.
|
||||
if (skill_id == IG_OVERSLASH)
|
||||
sflag |= skill_area_temp[0];
|
||||
|
||||
// Deft Stab - Make sure the flag of 2 is passed on when the skill is double casted.
|
||||
if (skill_id == ABC_DEFT_STAB && flag&2)
|
||||
sflag |= 2;
|
||||
@@ -5612,10 +5614,12 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
if (sd && pc_search_inventory(sd, skill_db.find(SU_LUNATICCARROTBEAT)->require.itemid[0]) >= 0)
|
||||
skill_id = SU_LUNATICCARROTBEAT2;
|
||||
break;
|
||||
case MT_RUSH_QUAKE:
|
||||
sc_start(src, src, SC_RUSH_QUAKE2, 100, skill_lv, skill_get_time(skill_id, skill_lv));
|
||||
// Fallthrough
|
||||
case DK_SERVANT_W_PHANTOM:
|
||||
case SHC_SAVAGE_IMPACT:
|
||||
case SHC_FATAL_SHADOW_CROW:
|
||||
case MT_RUSH_QUAKE:
|
||||
// Jump to the target before attacking.
|
||||
if (skill_check_unit_movepos(5, src, bl->x, bl->y, 0, 1))
|
||||
skill_blown(src, src, 1, (map_calc_dir(bl, src->x, src->y) + 4) % 8, BLOWN_NONE);
|
||||
@@ -7768,7 +7772,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case EM_INCREASING_ACTIVITY:
|
||||
if (bl->type == BL_PC) {
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
||||
status_heal(bl, 0, 0, 20 + 5 * skill_lv, 0);
|
||||
status_heal(bl, 0, 0, 10 + 10 * skill_lv, 0);
|
||||
} else
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
break;
|
||||
|
||||
@@ -2365,9 +2365,9 @@ int status_calc_mob_(struct mob_data* md, uint8 opt)
|
||||
// Its unknown how the summoner's stats affects the ABR's stats.
|
||||
// I decided to do something similar to elementals for now until I know.
|
||||
// Also added hit increase from ABR-Mastery for balance reasons. [Rytech]
|
||||
status->max_hp = (5000 + 2000 * abr_mastery) * mstatus->vit / 100;
|
||||
status->rhw.atk = (2 * mstatus->batk + 500 + 200 * abr_mastery) * 70 / 100;
|
||||
status->rhw.atk2 = 2 * mstatus->batk + 500 + 200 * abr_mastery;
|
||||
status->max_hp = (5000 + 40000 * abr_mastery) * mstatus->vit / 100;
|
||||
status->rhw.atk = (2 * mstatus->batk + 200 + 600 * abr_mastery) * 70 / 100;
|
||||
status->rhw.atk2 = 2 * mstatus->batk + 200 + 600 * abr_mastery;
|
||||
status->def = mstatus->def + 20 * abr_mastery;
|
||||
status->mdef = mstatus->mdef + 4 * abr_mastery;
|
||||
status->hit = mstatus->hit + 5 * abr_mastery / 2;
|
||||
@@ -2400,10 +2400,10 @@ int status_calc_mob_(struct mob_data* md, uint8 opt)
|
||||
// Its unknown how the summoner's stats affects the bionic's stats.
|
||||
// I decided to do something similar to elementals for now until I know.
|
||||
// Also added hit increase from Bionic-Mastery for balance reasons. [Rytech]
|
||||
status->max_hp = (5000 + 2000 * bionic_mastery) * mstatus->vit / 100;
|
||||
status->max_hp = (5000 + 40000 * bionic_mastery) * mstatus->vit / 100;
|
||||
//status->max_sp = (50 + 20 * bionic_mastery) * mstatus->int_ / 100;// Wait what??? Bionic Mastery increases MaxSP? They have SP???
|
||||
status->rhw.atk = (2 * mstatus->batk + 200 * bionic_mastery) * 70 / 100;
|
||||
status->rhw.atk2 = 2 * mstatus->batk + 200 * bionic_mastery;
|
||||
status->rhw.atk = (2 * mstatus->batk + 600 * bionic_mastery) * 70 / 100;
|
||||
status->rhw.atk2 = 2 * mstatus->batk + 600 * bionic_mastery;
|
||||
status->def = mstatus->def + 20 * bionic_mastery;
|
||||
status->mdef = mstatus->mdef + 4 * bionic_mastery;
|
||||
status->hit = mstatus->hit + 5 * bionic_mastery / 2;
|
||||
@@ -2415,7 +2415,7 @@ int status_calc_mob_(struct mob_data* md, uint8 opt)
|
||||
// costing summon. [Rytech]
|
||||
if (ud->skill_id == BO_HELLTREE) {
|
||||
status->max_hp += 20000;
|
||||
status->rhw.atk += 1400; // 70% of 2000
|
||||
status->rhw.atk += 5600; // 70% of 2000
|
||||
status->rhw.atk2 += 2000;
|
||||
}
|
||||
}
|
||||
@@ -3827,6 +3827,8 @@ int status_calc_pc_sub(struct map_session_data* sd, uint8 opt)
|
||||
base_status->patk += skill * 3;
|
||||
base_status->smatk += skill * 3;
|
||||
}
|
||||
if (sd->status.weapon == W_2HSTAFF && (skill = pc_checkskill(sd, AG_TWOHANDSTAFF)) > 0)
|
||||
base_status->smatk += skill * 2;
|
||||
|
||||
// ----- PHYSICAL RESISTANCE CALCULATION -----
|
||||
if ((skill = pc_checkskill_imperial_guard(sd, 1)) > 0)// IG_SHIELD_MASTERY
|
||||
@@ -6488,8 +6490,6 @@ static unsigned short status_calc_watk(struct block_list *bl, struct status_chan
|
||||
watk += sc->data[SC_POWERFUL_FAITH]->val2;
|
||||
if (sc->data[SC_GUARD_STANCE])
|
||||
watk -= sc->data[SC_GUARD_STANCE]->val3;
|
||||
if (sc->data[SC_ATTACK_STANCE])
|
||||
watk += sc->data[SC_ATTACK_STANCE]->val3;
|
||||
|
||||
return (unsigned short)cap_value(watk,0,USHRT_MAX);
|
||||
}
|
||||
@@ -7762,6 +7762,8 @@ static signed short status_calc_patk(struct block_list *bl, struct status_change
|
||||
patk += sc->data[SC_ABYSS_SLAYER]->val2;
|
||||
if (sc->data[SC_PRON_MARCH])
|
||||
patk += sc->data[SC_PRON_MARCH]->val2;
|
||||
if (sc->data[SC_ATTACK_STANCE])
|
||||
patk += sc->data[SC_ATTACK_STANCE]->val3;
|
||||
|
||||
return (short)cap_value(patk, 0, SHRT_MAX);
|
||||
}
|
||||
@@ -7786,6 +7788,8 @@ static signed short status_calc_smatk(struct block_list *bl, struct status_chang
|
||||
smatk += sc->data[SC_JAWAII_SERENADE]->val2;
|
||||
if (sc->data[SC_SPELL_ENCHANTING])
|
||||
smatk += sc->data[SC_SPELL_ENCHANTING]->val2;
|
||||
if (sc->data[SC_ATTACK_STANCE])
|
||||
smatk += sc->data[SC_ATTACK_STANCE]->val3;
|
||||
|
||||
return (short)cap_value(smatk, 0, SHRT_MAX);
|
||||
}
|
||||
@@ -11764,7 +11768,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
tick = INFINITE_TICK;
|
||||
break;
|
||||
case SC_GUARDIAN_S:
|
||||
val2 = status->max_hp * (50 * val1) / 100;// Barrier HP
|
||||
val2 = (status->max_hp / 2) * (50 * val1 + status_get_lv(src) + status->sta * 15) / 100;// Barrier HP
|
||||
break;
|
||||
case SC_REBOUND_S:
|
||||
val2 = 10 * val1;// Reduced Damage From Devotion
|
||||
@@ -11773,7 +11777,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
break;
|
||||
case SC_ATTACK_STANCE:
|
||||
val2 = 40 * val1;// DEF Decrease
|
||||
val3 = 5 + 5 * val1;// ATK Increase
|
||||
val3 = 3 * val1;// P.ATK/S.MATK Increase
|
||||
tick = INFINITE_TICK;
|
||||
break;
|
||||
case SC_HOLY_S:
|
||||
@@ -14628,21 +14632,6 @@ uint64 AttributeDatabase::parseBodyNode(const ryml::NodeRef& node) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
void AttributeDatabase::removeBodyNode( const ryml::NodeRef& node ){
|
||||
uint16 level;
|
||||
|
||||
if( !this->asUInt16( node, "Level", level ) ){
|
||||
return;
|
||||
}
|
||||
|
||||
if( !CHK_ELEMENT_LEVEL( level ) ){
|
||||
this->invalidWarning( node["Level"], "Invalid element level %hu.\n", level );
|
||||
return;
|
||||
}
|
||||
|
||||
std::fill_n( &attr_fix_table[level - 1][0][0], ELE_MAX * ELE_MAX, 100 );
|
||||
}
|
||||
|
||||
AttributeDatabase elemental_attribute_db;
|
||||
|
||||
/**
|
||||
|
||||
@@ -137,7 +137,6 @@ public:
|
||||
}
|
||||
const std::string getDefaultLocation() override;
|
||||
uint64 parseBodyNode(const ryml::NodeRef& node) override;
|
||||
void removeBodyNode( const ryml::NodeRef& node ) override;
|
||||
|
||||
// Additional
|
||||
int16 getAttribute(uint16 level, uint16 atk_ele, uint16 def_ele);
|
||||
@@ -1175,6 +1174,9 @@ enum sc_type : int16 {
|
||||
SC_POISON_SHIELD,
|
||||
SC_POISON_SHIELD_OPTION,
|
||||
|
||||
SC_RUSH_QUAKE1,
|
||||
SC_RUSH_QUAKE2,
|
||||
|
||||
#ifdef RENEWAL
|
||||
SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user