diff --git a/documentation/mods_by_id.txt b/documentation/mods_by_id.txt index 424e7384877..e3d204dc2c5 100644 --- a/documentation/mods_by_id.txt +++ b/documentation/mods_by_id.txt @@ -486,7 +486,7 @@ TRICK_ATK_AGI = 520, // % AGI boost to Trick Attack (if gear mod, needs to be equipped on hit) AUGMENTS_ABSORB = 521, // Direct Absorb spell increase while Liberator is equipped (percentage based) NIN_NUKE_BONUS = 522, // magic attack bonus for NIN nukes - AMMO_SWING = 523, // Extra swing rate w/ ammo (ie. Jailer weapons). Use gearsets, and does nothing for non-players. + AMMO_SWING = 523, // Follow-up swing rate w/ virtue stone ammo (Jailer weapons). Does nothing for non-players. AOE_NA = 524, // Set to 1 to make -na spells/erase always AoE w/ Divine Veil AUGMENTS_CONVERT = 525, // Convert HP to MP Ratio Multiplier. Value = MP multiplier rate. AUGMENTS_SA = 526, // Adds Critical Attack Bonus to Sneak Attack, percentage based. @@ -536,8 +536,8 @@ WEAPONSKILL_DAMAGE_BASE = 570, // IDs from 571 to 825 are not listed but are used. More info below. - - AMMO_SWING_TYPE = 826, // For the handedness of the weapon - 1h (1) vs. 2h/h2h (2). h2h can safely use the same function as 2h. + // SPARE ID 826 + BARSPELL_MDEF_BONUS = 827, // Extra magic defense bonus granted to the bar- spell effect FORCE_JUMP_CRIT = 828, // Critical hit rate bonus for jump and high jump WYVERN_EFFECTIVE_BREATH = 829, // Increases the threshold for triggering healing breath/offensive breath more inclined to pick elemental weakness diff --git a/scripts/enum/mod.lua b/scripts/enum/mod.lua index ea04fbdebf9..a34e9b00691 100644 --- a/scripts/enum/mod.lua +++ b/scripts/enum/mod.lua @@ -762,8 +762,7 @@ xi.mod = NIN_NUKE_BONUS_INNIN = 223, -- Ninjutsu damage multiplier from Innin. NIN_NUKE_BONUS_GEAR = 522, -- Ninjutsu damage multiplier from gear. Ex: Koga Hatsuburi. DAKEN = 911, -- Chance to throw shuriken on attack - AMMO_SWING = 523, -- Extra swing rate w/ ammo (ie. Jailer weapons). Use gearsets, and does nothing for non-players. - AMMO_SWING_TYPE = 826, -- For the handedness of the weapon - 1h (1) vs. 2h/h2h (2). h2h can safely use the same function as 2h. + AMMO_SWING = 523, -- Follow-up swing rate w/ virtue stone ammo (Jailer weapons). Does nothing for non-players. ROLL_RANGE = 528, -- Additional range for COR roll abilities. PHANTOM_ROLL = 881, -- Phantom Roll+ Effect from SOA Rings. PHANTOM_DURATION = 882, -- Phantom Roll Duration +. diff --git a/scripts/globals/gear_sets.lua b/scripts/globals/gear_sets.lua index d6c2f024c1e..4ff2c6bb27e 100644 --- a/scripts/globals/gear_sets.lua +++ b/scripts/globals/gear_sets.lua @@ -812,104 +812,6 @@ local gearSets = }, }, - [47] = -- Begin Jailer weapons: Set is weapon + Virtue stone, bonus 50% extra melee swing. - { - items = - { - xi.item.VIRTUE_STONE, - xi.item.HOPE_STAFF, - }, - minEquipped = 2, - mods = - { - { xi.mod.AMMO_SWING, 50 }, - }, - }, - - [48] = - { - items = - { - xi.item.VIRTUE_STONE, - xi.item.JUSTICE_SWORD, - }, - minEquipped = 2, - mods = - { - { xi.mod.AMMO_SWING, 50 }, - }, - }, - - [49] = - { - items = - { - xi.item.VIRTUE_STONE, - xi.item.TEMPERANCE_AXE, - }, - minEquipped = 2, - mods = - { - { xi.mod.AMMO_SWING, 50 }, - }, - }, - - [50] = - { - items = - { - xi.item.VIRTUE_STONE, - xi.item.LOVE_HALBERD, - }, - minEquipped = 2, - mods = - { - { xi.mod.AMMO_SWING, 50 }, - }, - }, - - [51] = - { - items = - { - xi.item.VIRTUE_STONE, - xi.item.FORTITUDE_AXE, - }, - minEquipped = 2, - mods = - { - { xi.mod.AMMO_SWING, 50 }, - }, - }, - - [52] = - { - items = - { - xi.item.VIRTUE_STONE, - xi.item.FAITH_BAGHNAKHS, - }, - minEquipped = 2, - mods = - { - { xi.mod.AMMO_SWING, 50 }, - }, - }, - - [53] = -- End Jailer weapons - { - items = - { - xi.item.VIRTUE_STONE, - xi.item.PRUDENCE_ROD, - }, - minEquipped = 2, - mods = - { - { xi.mod.AMMO_SWING, 50 }, - }, - }, - [54] = -- Bladeborn/Steelflash Earrings { items = diff --git a/sql/item_mods.sql b/sql/item_mods.sql index 0e0ab5e1ed9..e1bcd786a90 100644 --- a/sql/item_mods.sql +++ b/sql/item_mods.sql @@ -35016,7 +35016,7 @@ INSERT INTO `item_mods` VALUES (17594,72,4); -- HPHEAL: 4 -- Hope Staff INSERT INTO `item_mods` VALUES (17595,11,7); -- AGI: 7 -INSERT INTO `item_mods` VALUES (17595,826,2); -- AMMO_SWING_TYPE: 2 +INSERT INTO `item_mods` VALUES (17595,523,50); -- AMMO_SWING -- Steel-Splitter INSERT INTO `item_mods` VALUES (17596,9,2); -- DEX: 2 @@ -35373,7 +35373,7 @@ INSERT INTO `item_mods` VALUES (17709,25,4); -- ACC: 4 -- Justice Sword INSERT INTO `item_mods` VALUES (17710,8,7); -- STR: 7 -INSERT INTO `item_mods` VALUES (17710,826,1); -- AMMO_SWING_TYPE: 1 +INSERT INTO `item_mods` VALUES (17710,523,50); -- AMMO_SWING -- Shivas Shotel INSERT INTO `item_mods` VALUES (17711,12,4); -- INT: 4 @@ -35897,7 +35897,7 @@ INSERT INTO `item_mods` VALUES (17945,345,1000); -- TP_BONUS: 1000 -- Temperance Axe INSERT INTO `item_mods` VALUES (17948,14,7); -- CHR: 7 -INSERT INTO `item_mods` VALUES (17948,826,1); -- AMMO_SWING_TYPE: 1 +INSERT INTO `item_mods` VALUES (17948,523,50); -- AMMO_SWING -- Furnace Tabarzin INSERT INTO `item_mods` VALUES (17949,2,10); -- HP: 10 @@ -36297,7 +36297,7 @@ INSERT INTO `item_mods` VALUES (18098,345,1000); -- TP_BONUS: 1000 -- Love Halberd INSERT INTO `item_mods` VALUES (18100,9,7); -- DEX: 7 -INSERT INTO `item_mods` VALUES (18100,826,2); -- AMMO_SWING_TYPE: 2 +INSERT INTO `item_mods` VALUES (18100,523,50); -- AMMO_SWING -- Fuscina INSERT INTO `item_mods` VALUES (18104,431,1); -- ITEM_ADDEFFECT_TYPE: DAMAGE @@ -36736,7 +36736,7 @@ INSERT INTO `item_mods` VALUES (18221,345,1000); -- TP_BONUS: 1000 -- Fortitude Axe INSERT INTO `item_mods` VALUES (18222,10,7); -- VIT: 7 -INSERT INTO `item_mods` VALUES (18222,826,2); -- AMMO_SWING_TYPE: 2 +INSERT INTO `item_mods` VALUES (18222,523,50); -- AMMO_SWING -- Toporok INSERT INTO `item_mods` VALUES (18223,2,10); -- HP: 10 @@ -37196,7 +37196,7 @@ INSERT INTO `item_mods` VALUES (18359,950,3); -- ITEM_ADDEFFECT_ELEMENT: 3 -- Faith Baghnakhs INSERT INTO `item_mods` VALUES (18360,13,7); -- MND: 7 -INSERT INTO `item_mods` VALUES (18360,826,2); -- AMMO_SWING_TYPE: 1. - HtH are treated like 1H and can proc on both hands. +INSERT INTO `item_mods` VALUES (18360,523,50); -- AMMO_SWING -- Ponderous Manoples INSERT INTO `item_mods` VALUES (18361,10,2); -- VIT: 2 @@ -37294,7 +37294,7 @@ INSERT INTO `item_mods` VALUES (18396,25,-5); -- ACC: -5 -- Prudence Rod INSERT INTO `item_mods` VALUES (18397,12,7); -- INT: 7 -INSERT INTO `item_mods` VALUES (18397,826,1); -- AMMO_SWING_TYPE: 1 +INSERT INTO `item_mods` VALUES (18397,523,50); -- AMMO_SWING -- Mana Wand INSERT INTO `item_mods` VALUES (18402,12,2); -- INT: 2 diff --git a/src/map/attack.h b/src/map/attack.h index 38ee5e743fd..6cbb3fe2dd6 100644 --- a/src/map/attack.h +++ b/src/map/attack.h @@ -39,7 +39,8 @@ enum class PHYSICAL_ATTACK_TYPE RAPID_SHOT = 6, SAMBA = 7, QUAD = 8, - DAKEN = 9 + DAKEN = 9, + FOLLOWUP = 10, }; enum PHYSICAL_ATTACK_DIRECTION diff --git a/src/map/attackround.cpp b/src/map/attackround.cpp index a8fe1815534..19ec34ac5c7 100644 --- a/src/map/attackround.cpp +++ b/src/map/attackround.cpp @@ -51,27 +51,36 @@ CAttackRound::CAttackRound(CBattleEntity* attacker, CBattleEntity* defender) m_coverAbilityUserEntity = nullptr; } - // Build main weapon attacks. - CreateAttacks(dynamic_cast(attacker->m_Weapons[SLOT_MAIN]), RIGHTATTACK); + auto* PMain = dynamic_cast(attacker->m_Weapons[SLOT_MAIN]); + auto* PSub = dynamic_cast(attacker->m_Weapons[SLOT_SUB]); - // Build dual wield off hand weapon attacks. - if (IsH2H()) + if (PMain) { - // Build left hand H2H attacks. - CreateAttacks(dynamic_cast(attacker->m_Weapons[SLOT_MAIN]), LEFTATTACK); - - // Build kick attacks. - CreateKickAttacks(); + if (IsH2H()) // Build H2H attacks. + { + CreateAttacks(PMain, LEFTATTACK); + CreateAttacks(PMain, LEFTATTACK); + } + else // Build main weapon attacks. + { + CreateAttacks(PMain, RIGHTATTACK); + } } - else if (attacker->m_dualWield) + if (PSub && attacker->m_dualWield) { - CreateAttacks(dynamic_cast(attacker->m_Weapons[SLOT_SUB]), LEFTATTACK); + CreateAttacks(PSub, LEFTATTACK); } + // Build kick attacks. + CreateKickAttacks(); + // Build Daken throw CreateDakenAttack(); + // Append follow-up attacks + ProcFollowUpAttacks(); + // Set the first attack flag m_attackSwings[0].SetAsFirstSwing(); @@ -182,10 +191,17 @@ void CAttackRound::AddAttackSwing(PHYSICAL_ATTACK_TYPE type, PHYSICAL_ATTACK_DIR { if (m_attackSwings.size() < MAX_ATTACKS) { - for (uint8 i = 0; i < count; ++i) + for (size_t i = 0; i < count; ++i) { - CAttack attack(m_attacker, m_defender, type, direction, this); - m_attackSwings.emplace_back(attack); + // Flip direction of second H2H swing + if (IsH2H() && m_attackSwings.size() == 1) + { + m_attackSwings.emplace_back(m_attacker, m_defender, type, RIGHTATTACK, this); + } + else + { + m_attackSwings.emplace_back(m_attacker, m_defender, type, direction, this); + } if (m_attackSwings.size() == MAX_ATTACKS) { @@ -250,6 +266,7 @@ void CAttackRound::CreateAttacks(CItemWeapon* PWeapon, PHYSICAL_ATTACK_DIRECTION int16 doubleAttack = m_attacker->getMod(Mod::DOUBLE_ATTACK); int16 quadAttack = m_attacker->getMod(Mod::QUAD_ATTACK); bool multiHitOccurred = false; + bool isMainHand = (IsH2H() && !m_attackSwings.empty()) || direction == RIGHTATTACK; // Checking for Mythic Weapon Aftermath int16 occAttThriceRate = std::clamp(m_attacker->getMod(Mod::MYTHIC_OCC_ATT_THRICE), 0, 100); @@ -278,13 +295,21 @@ void CAttackRound::CreateAttacks(CItemWeapon* PWeapon, PHYSICAL_ATTACK_DIRECTION doubleAttack += PChar->PMeritPoints->GetMeritValue(MERIT_DOUBLE_ATTACK_RATE, PChar); } // TODO: Quadruple attack merits when SE release them. + + // Iga Garb +2 Set augment: possibility to add another swing while using Dual Wield + // TODO: Double check correct priority for Empyrian armor modifiers? Outsource? Lua function? + if (!isMainHand) + { + doubleAttack += m_attacker->getMod(Mod::EXTRA_DUAL_WIELD_ATTACK); + } } + quadAttack = std::clamp(quadAttack, 0, 100); doubleAttack = std::clamp(doubleAttack, 0, 100); tripleAttack = std::clamp(tripleAttack, 0, 100); // Preference matters! The following are additional hits to the default hit that don't stack up - // Mikage > Quad > Triple > Double > Mythic Aftermath > Occasionally Attacks > Dynamis [D] Follow-Up > Hasso + Zanshin + // Mikage > Quad > Triple > Double > Mythic Aftermath > Occasionally Attacks > Hasso + Zanshin // Daken is handled separately in CreateDakenAttack() and Zanshin in src/map/entities/battleentity.cpp#L1768 // Checking Mikage Effect - Hits Vary With Num of Utsusemi Shadows for Main Weapon @@ -310,27 +335,20 @@ void CAttackRound::CreateAttacks(CItemWeapon* PWeapon, PHYSICAL_ATTACK_DIRECTION multiHitOccurred = true; } // Mythic Weapons Aftermath, only main hand - else if (direction == PHYSICAL_ATTACK_DIRECTION::RIGHTATTACK && xirand::GetRandomNumber(100) < occAttThriceRate) + else if (isMainHand && xirand::GetRandomNumber(100) < occAttThriceRate) { AddAttackSwing(PHYSICAL_ATTACK_TYPE::NORMAL, direction, 2); } - else if (direction == PHYSICAL_ATTACK_DIRECTION::RIGHTATTACK && xirand::GetRandomNumber(100) < occAttTwiceRate) + else if (isMainHand && xirand::GetRandomNumber(100) < occAttTwiceRate) { AddAttackSwing(PHYSICAL_ATTACK_TYPE::NORMAL, direction, 1); } - // Iga Garb +2 Set augment: possibility to add another swing while using Dual Wield - // TODO: Double check correct priority for Empyrian armor modifiers? Outsource? Lua function? - else if (direction == LEFTATTACK && xirand::GetRandomNumber(100) < m_attacker->getMod(Mod::EXTRA_DUAL_WIELD_ATTACK)) - { - AddAttackSwing(PHYSICAL_ATTACK_TYPE::NORMAL, RIGHTATTACK, 1); - } // "Occasionally attacks X times" and regular multiple hits else if (num > 1) { // Deduct the final default hit! AddAttackSwing(PHYSICAL_ATTACK_TYPE::NORMAL, direction, (num - 1)); } - // TODO: Dynamis [D] weapons Follow-Up attack chance // Additional swing modifier (stacks!), mostly for Amood weapons if (isPC && xirand::GetRandomNumber(100) < m_attacker->getMod(Mod::ADDITIONAL_SWING_CHANCE)) @@ -338,61 +356,129 @@ void CAttackRound::CreateAttacks(CItemWeapon* PWeapon, PHYSICAL_ATTACK_DIRECTION AddAttackSwing(PHYSICAL_ATTACK_TYPE::NORMAL, direction, 1); } - // Ammunition provoked additional swing (stacks!), mostly for Virtue Stone weapons - if (isPC && m_attacker->getMod(Mod::AMMO_SWING) > 0) + // Default hit, necessary to check for multi hits as the hits are assigned as PHYSICAL_ATTACK_TYPE + // Double and Triple Attack Damage + mods are assigned to hits based on attack type + if (multiHitOccurred == false) { - // Check for ammo - CCharEntity* PChar = (CCharEntity*)m_attacker; - CItemEquipment* PAmmo = PChar->getEquip(SLOT_AMMO); - CItemEquipment* PMain = PChar->getEquip(SLOT_MAIN); - CItemEquipment* PSub = PChar->getEquip(SLOT_SUB); - uint8 slot = PChar->equip[SLOT_AMMO]; - uint8 loc = PChar->equipLoc[SLOT_AMMO]; - uint8 ammoCount = 0; - - // Two handed - if (battleutils::GetScaledItemModifier(PChar, PMain, Mod::AMMO_SWING_TYPE) == 2 && - xirand::GetRandomNumber(100) < m_attacker->getMod(Mod::AMMO_SWING) && PAmmo != nullptr && ammoCount < PAmmo->getQuantity()) - { - AddAttackSwing(PHYSICAL_ATTACK_TYPE::NORMAL, direction, 1); - ammoCount += 1; - } - // One handed and Hand-to-Hand - else + AddAttackSwing(PHYSICAL_ATTACK_TYPE::NORMAL, direction, 1); + } +} + +/************************************************************************ + * IsAttackTypeEligibleForFollowUp() + * Return true if the attackType attack swing eligible to proc followUpType + * Virtue Stone, TODO Raetic, TODO Dynamis [D] + ************************************************************************/ +bool CAttackRound::IsAttackTypeEligibleForFollowUp(Mod followUpType, PHYSICAL_ATTACK_TYPE attackType) +{ + switch (followUpType) + { + case Mod::AMMO_SWING: { - if (direction == RIGHTATTACK && battleutils::GetScaledItemModifier(PChar, PMain, Mod::AMMO_SWING_TYPE) == 1 && - xirand::GetRandomNumber(100) < m_attacker->getMod(Mod::AMMO_SWING) && PAmmo != nullptr && ammoCount < PAmmo->getQuantity()) + switch (attackType) { - AddAttackSwing(PHYSICAL_ATTACK_TYPE::NORMAL, RIGHTATTACK, 1); - ammoCount += 1; + case PHYSICAL_ATTACK_TYPE::NORMAL: + case PHYSICAL_ATTACK_TYPE::DOUBLE: + case PHYSICAL_ATTACK_TYPE::TRIPLE: + case PHYSICAL_ATTACK_TYPE::SAMBA: + case PHYSICAL_ATTACK_TYPE::QUAD: + return true; + default: + return false; } - if (direction == LEFTATTACK && battleutils::GetScaledItemModifier(PChar, IsH2H() ? PMain : PSub, Mod::AMMO_SWING_TYPE) == 1 && - xirand::GetRandomNumber(100) < m_attacker->getMod(Mod::AMMO_SWING) && PAmmo != nullptr && ammoCount < PAmmo->getQuantity()) + } + + default: + return false; + } +} + +/************************************************************************ + * ProcFollowUpAttacks() - Players only + * Attempt to proc follow-up attacks and append them to the attack round + * Virtue Stone, TODO Raetic, TODO Dynamis [D] + ************************************************************************/ +void CAttackRound::ProcFollowUpAttacks() +{ + if (CCharEntity* PChar = dynamic_cast(m_attacker)) + { + if (PChar->getMod(Mod::AMMO_SWING)) + { + // iterate through attackSwings and attempt to proc and store a follow-up swing + for (auto& attack : m_attackSwings) { - AddAttackSwing(PHYSICAL_ATTACK_TYPE::NORMAL, LEFTATTACK, 1); - ammoCount += 1; + PHYSICAL_ATTACK_DIRECTION direction = attack.GetAttackDirection(); + PHYSICAL_ATTACK_TYPE type = attack.GetAttackType(); + CItemEquipment* PWeapon = nullptr; + + if (IsAttackTypeEligibleForFollowUp(Mod::AMMO_SWING, type)) + { + if (IsH2H() || direction == RIGHTATTACK) + { + PWeapon = PChar->getEquip(SLOT_MAIN); + } + else if (direction == LEFTATTACK) + { + PWeapon = PChar->getEquip(SLOT_SUB); + } + + if (PWeapon && xirand::GetRandomNumber(100) < battleutils::GetScaledItemModifier(PChar, PWeapon, Mod::AMMO_SWING)) + { + CItemEquipment* PAmmo = PChar->getEquip(SLOT_AMMO); + static const uint16 virtueStone = 18244; + + if (PAmmo && PAmmo->getID() == virtueStone && PAmmo->getQuantity() > 0) + { + uint8 loc = PChar->equipLoc[SLOT_AMMO]; + uint8 slot = PChar->equip[SLOT_AMMO]; + + if (AddFollowUpAttack(direction)) + { + if (PAmmo->getQuantity() == 1) + { + charutils::UnequipItem(PChar, SLOT_AMMO); + PChar->RequestPersist(CHAR_PERSIST::EQUIP); + } + + charutils::UpdateItem(PChar, loc, slot, -1); + PChar->pushPacket(new CInventoryFinishPacket()); + } + } + } + } } } + // TODO: else if (Raetic) {}; + // TODO: else if (Dynamis [D]) {}; - // Deduct ammo - if (PAmmo != nullptr) + // Append any swings stored in m_followUpSwings to the attack round + if (!m_followUpSwings.empty()) { - if (PAmmo->getQuantity() == ammoCount) + for (size_t i = 0; i < m_followUpSwings.size(); i++) { - charutils::UnequipItem(PChar, SLOT_AMMO); - PChar->RequestPersist(CHAR_PERSIST::EQUIP); + AddAttackSwing(PHYSICAL_ATTACK_TYPE::FOLLOWUP, m_followUpSwings[i], 1); } - charutils::UpdateItem(PChar, loc, slot, -ammoCount); - PChar->pushPacket(); } } +} - // Default hit, necessary to check for multi hits as the hits are assigned as PHYSICAL_ATTACK_TYPE - // Double and Triple Attack Damage + mods are assigned to hits based on attack type - if (multiHitOccurred == false) +/************************************************************************ + * AddFollowUpAttack() - (Virtue Stone, Raetic, Dynamis [D]) + * Attempt to store a follow-up swing. Return true if swing is stored. + * Ensure that one follow-up per hand is stored, in order + ************************************************************************/ +bool CAttackRound::AddFollowUpAttack(PHYSICAL_ATTACK_DIRECTION direction) +{ + if (m_followUpSwings.size() < 2) { - AddAttackSwing(PHYSICAL_ATTACK_TYPE::NORMAL, direction, 1); + if (m_followUpSwings.empty() || m_followUpSwings.back() != direction) + { + m_followUpSwings.push_back(direction); + return true; + } } + + return false; } /************************************************************************ @@ -402,7 +488,7 @@ void CAttackRound::CreateAttacks(CItemWeapon* PWeapon, PHYSICAL_ATTACK_DIRECTION ************************************************************************/ void CAttackRound::CreateKickAttacks() { - if (m_attacker->objtype == TYPE_PC) + if (m_attacker->objtype == TYPE_PC && IsH2H()) { // kick attack mod (All jobs) uint16 kickAttack = m_attacker->getMod(Mod::KICK_ATTACK_RATE); diff --git a/src/map/attackround.h b/src/map/attackround.h index 0b8d3743391..87cdaf1532a 100644 --- a/src/map/attackround.h +++ b/src/map/attackround.h @@ -50,6 +50,10 @@ class CAttackRound void CreateKickAttacks(); // Creates kick attacks for the round. void CreateDakenAttack(); // Adds daken attacks + bool IsAttackTypeEligibleForFollowUp(Mod followUpType, PHYSICAL_ATTACK_TYPE attackType); // Is attack type eligible for follow-up? + void ProcFollowUpAttacks(); // Attempt to proc follow-up attacks. + bool AddFollowUpAttack(PHYSICAL_ATTACK_DIRECTION direction); // Attempt to store a follow-up swing. Return true if swing is stored. + uint8 GetAttackSwingCount(); // Returns the attack list count. bool IsH2H(); // Flag: Is the attacker using H2H? CAttack& GetAttack(uint8); // Returns an attack object. @@ -67,6 +71,8 @@ class CAttackRound std::vector m_attackSwings; // The list of attacks for this round. bool m_sataOccured; // Flag: Did SATA occur during the round? bool m_kickAttackOccured; // Flag: Did a kick attack occur during the round? + + std::vector m_followUpSwings; // The list of follow-up attacks for this round. }; #endif diff --git a/src/map/modifier.h b/src/map/modifier.h index f9231ec4d48..8930a0980d6 100644 --- a/src/map/modifier.h +++ b/src/map/modifier.h @@ -906,8 +906,7 @@ enum class Mod DIA_DOT = 313, // Increases the DoT damage of Dia ENH_DRAIN_ASPIR = 315, // % damage boost to Drain and Aspir AUGMENTS_ABSORB = 521, // Direct Absorb spell increase while Liberator is equipped (percentage based) - AMMO_SWING = 523, // Extra swing rate w/ ammo (ie. Jailer weapons). Use gearsets, and does nothing for non-players. - AMMO_SWING_TYPE = 826, // For the handedness of the weapon - 1h (1) vs. 2h/h2h (2). h2h can safely use the same function as 2h. + AMMO_SWING = 523, // Follow-up swing rate w/ virtue stone ammo (Jailer weapons). Does nothing for non-players. AUGMENTS_CONVERT = 525, // Convert HP to MP Ratio Multiplier. Value = MP multiplier rate. AUGMENTS_SA = 526, // Adds Critical Attack Bonus to Sneak Attack, percentage based. AUGMENTS_TA = 527, // Adds Critical Attack Bonus to Trick Attack, percentage based. @@ -1073,6 +1072,7 @@ enum class Mod // The spares take care of finding the next ID to use so long as we don't forget to list IDs that have been freed up by refactoring. // 570 through 825 used by WS DMG mods these are not spares. // + // SPARE ID: 826 // SPARE IDs: 1132 and onward };