--//============================================== --// Data Tables __DATA_TABLE = { WEAPON_OFFSET = { -- CORE IDENTIFIERS DISABLE_NT = 0x0, SORT_ID = 0x8, WANDERING_EQUIP_ID = 0xC, ACHIEVEMENT_ID_A = 0xDC, ACHIEVEMENT_ID_B = 0xDE, -- BEHAVIOR & MOTION BEHAVIOR_VAR_ID = 0x4, SWORD_ARTS_PARAM_ID = 0x198, WEP_MOTION_CAT = 0xE7, GUARD_MOTION_CAT = 0xE8, WEP_MOTION_1H = 0xF0, WEP_MOTION_2H = 0xF1, WEP_MOTION_SP = 0xEE, -- MODEL & VISUALS EQUIP_MODEL_ID = 0xBC, ICON_ID = 0xBE, EQUIP_MODEL_CAT = 0xE4, EQUIP_MODEL_GENDER = 0xE5, WEP_TYPE = 0x1A6, WEP_CATEGORY = 0xE6, WEP_SHEATH = 0X174, -- DAMAGE TYPE DISPLAY FLAGS DMG_TYPE_DISPLAY = { BASE = 0x106, NORMAL = {offset = 0x106, bit = 3}, STRIKE = {offset = 0x106, bit = 4}, SLASH = {offset = 0x106, bit = 5}, THRUST = {offset = 0x106, bit = 6} }, -- STATS WEIGHT = 0x10, WEAPON_WEIGHT_RATE = 0x14, DURABILITY = 0xC0, DURABILITY_MAX = 0xC2, SA_DURABILITY = 0xD4, -- ECONOMY FIX_PRICE = 0x18, SELL_VALUE = 0x20, SALE_VALUE = 0x230, AFFINITY_PRICE = 0x238, -- REINFORCEMENT REINFORCE_PRICE = 0x1C, MATERIAL_SET_ID = 0x5C, REINFORCE_TYPE_ID = 0xDA, REINFORCE_SHOP_CAT = 0x234, GEM_MOUNT_TYPE = 0x241, -- ATTRIBUTE SCALING PROPER_STR = 0xF2, PROPER_AGI = 0xF3, PROPER_MAG = 0xF4, PROPER_FAI = 0xF5, PROPER_ARC = 0x195, OVER_STR = 0xF6, -- ATTACK VALUES ATK_PHYS = 0xC8, ATK_MAGIC = 0xCA, ATK_FIRE = 0xCC, ATK_THUNDER = 0xCE, ATK_HOLY = 0x18C, ATK_STAMINA = 0xD0, SA_DAMAGE = 0xB8, -- CORRECTIONS (Scaling) CORRECT_STR = 0x24, CORRECT_AGI = 0x28, CORRECT_MAG = 0x2C, CORRECT_FAI = 0x30, CORRECT_ARC = 0x19C, -- DAMAGE TYPE CORRECTIONS CORRECT_TYPE_PHYS = 0xEC, CORRECT_TYPE_MAGIC = 0x17D, CORRECT_TYPE_FIRE = 0x17E, CORRECT_TYPE_THUNDER = 0x17F, CORRECT_TYPE_HOLY = 0x18E, CORRECT_TYPE_POISON = 0x18F, CORRECT_TYPE_BLOOD = 0x194, CORRECT_TYPE_SLEEP = 0x23E, CORRECT_TYPE_MADNESS = 0x23F, -- SPECIAL EFFECTS SP_EFFECT = { BEHAVIOR = { [0] = 0x44, [1] = 0x48, [2] = 0x4C }, RESIDENT = { [0] = 0x50, [1] = 0x54, [2] = 0x58 }, MESSAGE = { [0] = 0x244, [1] = 0x248, [2] = 0x24C } }, -- WEAKNESSES WEAKNESS = { A = 0xA0, B = 0xA4, C = 0xA8, D = 0xAC, E = 0x180, F = 0x184 }, STEALTH_ATK_RATE = 0x286, -- GUARD VALUES GUARD = { PHYS = 0x34, MAGIC = 0x38, FIRE = 0x3C, THUNDER = 0x40, HOLY = 0x188, POISON = 0x100, DISEASE = 0x101, BLOOD = 0x102, CURSE = 0x103, FREEZE = 0x196, SLEEP = 0x192, MADNESS = 0x193, STABILITY = 0xD8, ANGLE = 0xD2, REPEL = 0xF9, CANCEL_RATE = 0xFB, LEVEL = 0xFC }, -- MAX GUARD CORRECTIONS GUARD_MAX = { PHYS = 0x1A8, MAGIC = 0x1AC, FIRE = 0x1B0, THUNDER = 0x1B4, HOLY = 0x1B8, POISON = 0x1BC, DISEASE = 0x1C0, BLOOD = 0x1C4, CURSE = 0x1C8, FREEZE = 0x1CC, SLEEP = 0xB0, MADNESS = 0xB4, STABILITY = 0x1D0 }, -- ORIGIN EQUIP REFERENCES (25 slots) ORIGIN_EQUIP_WEP = { BASE = 0x60, [0] = 0x60, [1] = 0x64, [2] = 0x68, [3] = 0x6C, [4] = 0x70, [5] = 0x74, [6] = 0x78, [7] = 0x7C, [8] = 0x80, [9] = 0x84, [10] = 0x88, [11] = 0x8C, [12] = 0x90, [13] = 0x94, [14] = 0x98, [15] = 0x9C, [16] = 0x250,[17] = 0x254,[18] = 0x258,[19] = 0x25C, [20] = 0x260,[21] = 0x264,[22] = 0x268,[23] = 0x26C,[24] = 0x270, [25] = 0x274 }, -- THROW PROPERTIES THROW = { ATK_RATE = 0xE0, ESCAPE_DIST = 0xC4, PARRY_DMG = 0xC6, BOW_DIST_RATE = 0xE2 }, -- MATERIAL PROPERTIES MATERIAL = { ATK = 0xE9, DEF_SE = { [0] = 0xEA, [1] = 0x172 }, DEF_SFX = { [0] = 0x10A, [1] = 0x170 }, VARIATION = 0x284 }, -- ATTRIBUTES ATK_ATTRIBUTE = 0x104, SP_ATTRIBUTE = 0xED, SP_ATK_CATEGORY = 0xEE, -- MISC PROPERTIES TOUGHNESS = { BASE = 0x17C, CORRECT_RATE = 0x178, VALID = {offset = 0x17C, bit = 0}, EMERGENCY_STEP = {offset = 0x17C, bit = 3}, HIDE_IN_CUTSCENE = {offset = 0x17C, bit = 4}, DUAL_WIELD = {offset = 0x17C, bit = 1}, AUTO_EQUIP = {offset = 0x17C, bit = 2}, QUICKMATCH = {offset = 0x17C, bit = 6}, WEP_CATALYST = {offset = 0x17C, bit = 7}, UNKNOWN_5 = {offset = 0x17C, bit = 5} }, SORT_GROUP_ID = 0x190, ATK_ATTRIBUTE_SECONDARY = 0x191, AUTO_REPLENISH_TYPE = 0x197, AMMO_REF_ID = 0x1A0, MAX_AMMO = 0x235, DERIVATION_LEVEL_TYPE = 0x1A4, ENCHANT_SFX_SIZE = 0x1A5, -- RESIDENT EFFECTS RESIDENT_SFX = { [0] = {id = 0x1D4, dmy = 0x1E4}, [1] = {id = 0x1D8, dmy = 0x1E8}, [2] = {id = 0x1DC, dmy = 0x1EC}, [3] = {id = 0x1E0, dmy = 0x1F0} }, -- SFX VISIBILITY (bitfield at 0x236) SFX_VISIBILITY = { BASE = 0x236, HIDE = { [0] = {offset = 0x236, bit = 0}, [1] = {offset = 0x236, bit = 1}, [2] = {offset = 0x236, bit = 2}, [3] = {offset = 0x236, bit = 3} }, APPLY = { [0] = {offset = 0x236, bit = 4}, [1] = {offset = 0x236, bit = 5}, [2] = {offset = 0x236, bit = 6}, [3] = {offset = 0x236, bit = 7} } }, -- MISC 2 STAMINA_CONSUMPTION = 0x1F4, WEP_SE_ID = 0x237, LEVEL_SYNC_CORRECT_ID = 0x23C, RARITY = 0x240, HP_REGAIN = 0x242, POISE_DAMAGE = 0x280, SP_ATTR_VARIATION = 0x285, -- PARRY PARRY = { ATK_BASE = 0xF7, DEF_BASE = 0xF8 }, -- GUARD DAMAGE TYPES GUARD_DMG_TYPE = { SLASH = 0xFD, BLOW = 0xFE, THRUST = 0xFF }, -- VS PLAYER DAMAGE VS_PLAYER = { PHYS = 0x1F8, MAGIC = 0x1FC, FIRE = 0x200, THUNDER = 0x204, HOLY = 0x208, POISON = 0x20C, BLOOD = 0x210, DISEASE = 0x288, CURSE = 0x28C, FREEZE = 0x214, SLEEP = 0x278, MADNESS = 0x27C }, -- UNIQUE ATTACK REQUIREMENTS UNIQUE_ATK_REQ = { STR = 0x218, DEX = 0x21C, INT = 0x220, FAI = 0x224, ARC = 0x228 }, -- WEAPON CONFIG FLAGS CONFIG = { -- Wield flags (bitfield at 0x105) WIELD = { BASE = 0x105, RIGHT_HAND = {offset = 0x105, bit = 0}, LEFT_HAND = {offset = 0x105, bit = 1}, BOTH_HANDS = {offset = 0x105, bit = 2}, ARROW_SLOT = {offset = 0x105, bit = 3}, BOLT_SLOT = {offset = 0x105, bit = 4}, ENABLE_GUARD = {offset = 0x105, bit = 5}, ENABLE_PARRY = {offset = 0x105, bit = 6}, ENABLE_SORCERY = {offset = 0x105, bit = 7} }, -- Magic flags (bitfield at 0x106) MAGIC = { BASE = 0x106, ENABLE_PYROMANCY = {offset = 0x106, bit = 0}, ENABLE_INCANTATIONS = {offset = 0x106, bit = 1}, ENABLE_VOW = {offset = 0x106, bit = 2}, ENABLE_BUFFABLE = {offset = 0x106, bit = 7} }, -- Custom flags (bitfield at 0x107) CUSTOM = { BASE = 0x107, ENABLE_ARC_CORRECT = {offset = 0x107, bit = 0}, IS_CUSTOM = {offset = 0x107, bit = 1}, DISABLE_BASE_CHANGE = {offset = 0x107, bit = 2}, DISABLE_REPAIR = {offset = 0x107, bit = 3}, ENABLE_DARKHAND = {offset = 0x107, bit = 4}, ENABLE_DLC_MODEL = {offset = 0x107, bit = 5}, ENABLE_LIGHT = {offset = 0x107, bit = 6}, ENABLE_GHOST_HIT = {offset = 0x107, bit = 7} }, -- Base change flags (bitfield at 0x108) BASE_CHANGE = { BASE = 0x108, CATEGORY = {offset = 0x108, bits = {0,1,2,3,4,5}}, -- 6 bits DRAGONSLAYER = {offset = 0x108, bit = 6}, ENABLE_DEPOSIT = {offset = 0x108, bit = 7} }, -- Online flags (bitfield at 0x109) ONLINE = { BASE = 0x109, DISABLE_DROP = {offset = 0x109, bit = 0}, ENABLE_DISCARD = {offset = 0x109, bit = 1}, ENABLE_DROP = {offset = 0x109, bit = 2}, ACQUISITION_LOG = {offset = 0x109, bit = 3}, ENABLE_THROW = {offset = 0x109, bit = 4}, ACQUISITION_DIALOG = {offset = 0x109, bits = {5,6}}, -- 2 bits PREVENT_AFFINITY_CHANGE = {offset = 0x109, bit = 7} } }, -- COLLISION COLLISION = { TYPE_A = 0x10C, TYPE_B = 0x10D, POSTURE = { RIGHT = 0x10E, LEFT = 0x10F } }, -- TRACE EFFECTS (7 slots) TRACE = { [0] = {sfx = 0x110, head = 0x114, tail = 0x118}, [1] = {sfx = 0x11C, head = 0x120, tail = 0x124}, [2] = {sfx = 0x128, head = 0x12C, tail = 0x130}, [3] = {sfx = 0x134, head = 0x138, tail = 0x13C}, [4] = {sfx = 0x140, head = 0x144, tail = 0x148}, [5] = {sfx = 0x14C, head = 0x150, tail = 0x154}, [6] = {sfx = 0x158, head = 0x15C, tail = 0x160}, [7] = {sfx = 0x164, head = 0x168, tail = 0x16C} }, -- RESTRICTIONS RESTRICT_ASH_OF_WAR = 0x290 }, WEAPON_STANCE = { DreamShadow = { WEAPONID = 220020000, Regular = { MAX_COMBO_OVERRIDE = false, BEHAVIOR = 1900, AOW = 5802, SPMOTION = 727, MOTION1H = 140, MOTION2H = 141, PASSIVEEFFECT_A = -1, PASSIVEEFFECT_B = -1, PASSIVEEFFECT_C = -1, RESIDENTSFX_A = -1, RESIDENTSFX_B = 1700773, RESIDENTSFX_C = -1, RESIDENTSFX_D = -1, DUMMYPOLY_A = -1, DUMMYPOLY_B = 560, DUMMYPOLY_C = -1, DUMMYPOLY_D = -1, REQUIRED_STR = 25, REQUIRED_DEX = 25, REQUIRED_INT = 25, REQUIRED_FTH = 25, REQUIRED_ARC = 25, SCALE_STR = 304.000, SCALE_DEX = 304.000, SCALE_INT = 304.000, SCALE_FTH = 304.000, SCALE_ARC = 304.000, DAMAGE_PHYS = 99, DAMAGE_MAGIC = 99, DAMAGE_FIRE = 99, DAMAGE_THUNDER = 99, DAMAGE_HOLY = 99, DAMAGE_STAMINA = 99, STAMINA_CONSUME = 1.060, POISE_DAMAGE = 5.000 }, Fast = { MAX_COMBO_OVERRIDE = false, BEHAVIOR = 1900, AOW = 5801, SPMOTION = 728, MOTION1H = 140, MOTION2H = 141, ATTACK_MAX = 6, PASSIVEEFFECT_A = -1, PASSIVEEFFECT_B = -1, PASSIVEEFFECT_C = -1, RESIDENTSFX_A = 1700772, RESIDENTSFX_B = 1700773, RESIDENTSFX_C = -1, RESIDENTSFX_D = -1, DUMMYPOLY_A = 120, DUMMYPOLY_B = 560, DUMMYPOLY_C = -1, DUMMYPOLY_D = -1, REQUIRED_STR = 25, REQUIRED_DEX = 25, REQUIRED_INT = 25, REQUIRED_FTH = 25, REQUIRED_ARC = 25, SCALE_STR = 304.000, SCALE_DEX = 304.000, SCALE_INT = 304.000, SCALE_FTH = 304.000, SCALE_ARC = 304.000, DAMAGE_PHYS = 144, DAMAGE_MAGIC = 0, DAMAGE_FIRE = 0, DAMAGE_THUNDER = 0, DAMAGE_HOLY = 0, DAMAGE_STAMINA = 60, STAMINA_CONSUME = 1.060, POISE_DAMAGE = 5.000 }, Slow = { MAX_COMBO_OVERRIDE = false, BEHAVIOR = 1900, AOW = 5800, SPMOTION = 729, MOTION1H = 140, MOTION2H = 141, ATTACK_MAX = 4, PASSIVEEFFECT_A = -1, PASSIVEEFFECT_B = -1, PASSIVEEFFECT_C = -1, RESIDENTSFX_A = 1700774, RESIDENTSFX_B = 1700773, RESIDENTSFX_C = -1, RESIDENTSFX_D = -1, DUMMYPOLY_A = 300, DUMMYPOLY_B = 560, DUMMYPOLY_C = -1, DUMMYPOLY_D = -1, REQUIRED_STR = 25, REQUIRED_DEX = 25, REQUIRED_INT = 25, REQUIRED_FTH = 25, REQUIRED_ARC = 25, SCALE_STR = 304.000, SCALE_DEX = 304.000, SCALE_INT = 304.000, SCALE_FTH = 304.000, SCALE_ARC = 304.000, DAMAGE_PHYS = 144, DAMAGE_MAGIC = 0, DAMAGE_FIRE = 0, DAMAGE_THUNDER = 0, DAMAGE_HOLY = 0, DAMAGE_STAMINA = 60, STAMINA_CONSUME = 1.060, POISE_DAMAGE = 5.000 } }, }, PRISMA_SWITCH = { PRISMALightning = { 550001, 5541, 130, 0, 0, 100, 0, 45, 54, 0, 0, 29, 30, 20, 0, 0, 25}, PRISMAFrost = { 550002, 5542, 130, 100, 0, 0, 0, 45, 45, 9, 0, 29, 30, 20, 0, 0, 25}, PRISMAFire = { 550003, 5543, 130, 0, 100, 0, 0, 54, 45, 0, 0, 29, 30, 20, 0, 0, 25}, PRISMAHoly = { 550004, 5544, 130, 0, 0, 0, 100, 45, 45, 0, 9, 29, 30, 20, 0, 0, 25}, PRISMABase = { 550000, 5549, 150, 10, 10, 10, 10, 45, 45, 0, 0, 29, 30, 20, 0, 0, 25} }, DUSKBREAKER_SWITCH = { -- SpEffectID, SwordArt, Physical, Magic, Fire, Lightning, Holy, Scaling: str,dex,int,fth,arc, Tae, 1h idle, 2h idle, posparam, icon DuskBase = { 2606, 22032, 108, 0, 28, 0, 20, 14, 60, 0, 25, 120, 632, 3, 10, 750, 22170}, DuskTrans = { 2607, 22033, 108, 0, 40, 0, 40, 14, 60, 0, 60, 160, 633, 3, 10, 751, 22180} }, } --//============================================== --// Meta Tables __META_TABLE = { -- ========================================================================= -- FUNÇÕES AUXILIARES PARA WEAPON STANCE -- ========================================================================= -- Detecta input GetStanceInput = function() if env(ActionRequest, ACTION_ARM_R2) == TRUE and env(ActionDuration, 4) > 0 then return "R2" elseif env(ActionRequest, ACTION_ARM_L2) == TRUE and env(ActionDuration, 4) > 0 then return "L2" end return nil end, -- Obtem próxima stance GetNextStance = function(currentStance, inputType) if inputType == "R2" then if currentStance == "Regular" then return "Fast", "W_StanceTransition02" elseif currentStance == "Fast" then return "Regular", "W_StanceTransition01" elseif currentStance == "Slow" then return "Fast", "W_StanceTransition02" end elseif inputType == "L2" then if currentStance == "Regular" then return "Slow", "W_StanceTransition03" elseif currentStance == "Slow" then return "Regular", "W_StanceTransition01" elseif currentStance == "Fast" then return "Slow", "W_StanceTransition03" end end return nil, nil end, -- Aplicar mudanças de stance ApplyStanceChanges = function(weaponBase, stanceData) local offsets = __DATA_TABLE.WEAPON_OFFSET SetWeaponParamField(weaponBase, offsets.BEHAVIOR_VAR_ID, stanceData.BEHAVIOR, SIGNED_INT) SetWeaponParamField(weaponBase, offsets.SWORD_ARTS_PARAM_ID, stanceData.AOW, SIGNED_INT) SetWeaponParamField(weaponBase, offsets.WEP_MOTION_SP, stanceData.SPMOTION, SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.WEP_MOTION_1H, stanceData.MOTION1H, SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.WEP_MOTION_2H, stanceData.MOTION2H, SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.SP_EFFECT.RESIDENT[0], stanceData.PASSIVEEFFECT_A, SIGNED_INT) SetWeaponParamField(weaponBase, offsets.SP_EFFECT.RESIDENT[1], stanceData.PASSIVEEFFECT_B, SIGNED_INT) SetWeaponParamField(weaponBase, offsets.SP_EFFECT.RESIDENT[2], stanceData.PASSIVEEFFECT_C, SIGNED_INT) SetWeaponParamField(weaponBase, offsets.RESIDENT_SFX[0].id, stanceData.RESIDENTSFX_A, SIGNED_INT) SetWeaponParamField(weaponBase, offsets.RESIDENT_SFX[1].id, stanceData.RESIDENTSFX_B, SIGNED_INT) SetWeaponParamField(weaponBase, offsets.RESIDENT_SFX[2].id, stanceData.RESIDENTSFX_C, SIGNED_INT) SetWeaponParamField(weaponBase, offsets.RESIDENT_SFX[3].id, stanceData.RESIDENTSFX_D, SIGNED_INT) SetWeaponParamField(weaponBase, offsets.RESIDENT_SFX[0].dmy, stanceData.DUMMYPOLY_A, SIGNED_INT) SetWeaponParamField(weaponBase, offsets.RESIDENT_SFX[1].dmy, stanceData.DUMMYPOLY_B, SIGNED_INT) SetWeaponParamField(weaponBase, offsets.RESIDENT_SFX[2].dmy, stanceData.DUMMYPOLY_C, SIGNED_INT) SetWeaponParamField(weaponBase, offsets.RESIDENT_SFX[3].dmy, stanceData.DUMMYPOLY_D, SIGNED_INT) SetWeaponParamField(weaponBase, offsets.PROPER_STR, stanceData.REQUIRED_STR, SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.PROPER_AGI, stanceData.REQUIRED_DEX, SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.PROPER_MAG, stanceData.REQUIRED_INT, SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.PROPER_FAI, stanceData.REQUIRED_FTH, SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.PROPER_ARC, stanceData.REQUIRED_ARC, SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.CORRECT_STR, stanceData.SCALE_STR, FLOAT) SetWeaponParamField(weaponBase, offsets.CORRECT_AGI, stanceData.SCALE_DEX, FLOAT) SetWeaponParamField(weaponBase, offsets.CORRECT_MAG, stanceData.SCALE_INT, FLOAT) SetWeaponParamField(weaponBase, offsets.CORRECT_FAI, stanceData.SCALE_FTH, FLOAT) SetWeaponParamField(weaponBase, offsets.CORRECT_ARC, stanceData.SCALE_ARC, FLOAT) SetWeaponParamField(weaponBase, offsets.ATK_PHYS, stanceData.DAMAGE_PHYS, SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.ATK_MAGIC, stanceData.DAMAGE_MAGIC, SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.ATK_FIRE, stanceData.DAMAGE_FIRE, SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.ATK_THUNDER, stanceData.DAMAGE_THUNDER, SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.ATK_HOLY, stanceData.DAMAGE_HOLY, SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.ATK_STAMINA, stanceData.DAMAGE_STAMINA, SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.STAMINA_CONSUMPTION, stanceData.STAMINA_CONSUME, FLOAT) SetWeaponParamField(weaponBase, offsets.POISE_DAMAGE, stanceData.POISE_DAMAGE, FLOAT) end, -- Verifica ID de arma FindWeaponByBaseID = function(weaponBase, weaponStanceList) for weaponName, weaponData in pairs(weaponStanceList) do if weaponBase == weaponData.WEAPONID then return weaponName, weaponData end end return nil, nil end, -- ========================================================================= -- FUNÇÕES AUXILIARES PARA PRISMA ELEMENT -- ========================================================================= -- Verifica se está trocando de arma IsChangingWeapon = function() if IsNodeActive("WeaponChangeStart_Selector00") == TRUE or IsNodeActive("WeaponChangeEnd_Selector00") == TRUE or IsNodeActive("WeaponChangeStart_Selector01") == TRUE or IsNodeActive("WeaponChangeEnd_Selector01") == TRUE or IsNodeActive("RideWeaponChangeStart_Selector") == TRUE or IsNodeActive("RideWeaponChangeEnd_Selector") == TRUE then if GetVariable("WeaponChangeType") <= WEAPON_CHANGE_REQUEST_RIGHT_SPEAR and GetVariable("WeaponChangeType") ~= WEAPON_CHANGE_REQUEST_INVALID then return true, false -- isChangingWeaponRight, isChangingWeaponLeft else return false, true end end return false, false end, IsPrismaWeapon = function(weaponId) local base = weaponId - (weaponId % 100) return base == 1770000 end, -- Obtém o elemento atual GetCurrentPrismaElement = function() local weaponParams = __DATA_TABLE.PRISMA_SWITCH if env(GetSpEffectID, weaponParams.PRISMABase[1]) == TRUE or (env(GetSpEffectID, weaponParams.PRISMALightning[1]) == FALSE and env(GetSpEffectID, weaponParams.PRISMAFrost[1]) == FALSE and env(GetSpEffectID, weaponParams.PRISMAFire[1]) == FALSE and env(GetSpEffectID, weaponParams.PRISMAHoly[1]) == FALSE) then return "PRISMABase" elseif env(GetSpEffectID, weaponParams.PRISMAFrost[1]) == TRUE then return "PRISMAFrost" elseif env(GetSpEffectID, weaponParams.PRISMAFire[1]) == TRUE then return "PRISMAFire" elseif env(GetSpEffectID, weaponParams.PRISMALightning[1]) == TRUE then return "PRISMALightning" elseif env(GetSpEffectID, weaponParams.PRISMAHoly[1]) == TRUE then return "PRISMAHoly" end return "PRISMABase" end, -- Obtém o próximo elemento no ciclo GetNextPrismaElement = function(currentElement) local cycle = { PRISMABase = "PRISMAFrost", PRISMAFrost = "PRISMAFire", PRISMAFire = "PRISMALightning", PRISMALightning = "PRISMAHoly", PRISMAHoly = "PRISMABase" } return cycle[currentElement] or "PRISMABase" end, -- Aplica as mudanças de elemento ApplyPrismaElementChanges = function(weaponBase, elementName) local weaponParams = __DATA_TABLE.PRISMA_SWITCH local offsets = __DATA_TABLE.WEAPON_OFFSET local params = weaponParams[elementName] if not params then return end SetWeaponParamField(weaponBase, offsets.SWORD_ARTS_PARAM_ID, params[2], SIGNED_INT) -- AOW switching SetWeaponParamField(weaponBase, offsets.PROPER_STR, params[13], SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.PROPER_AGI, params[14], SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.PROPER_MAG, params[15], SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.PROPER_FAI, params[16], SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.PROPER_ARC, params[17], SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.ATK_PHYS, params[3], UNSIGNED_INT) SetWeaponParamField(weaponBase, offsets.ATK_MAGIC, params[4], UNSIGNED_INT) SetWeaponParamField(weaponBase, offsets.ATK_FIRE, params[5], UNSIGNED_INT) SetWeaponParamField(weaponBase, offsets.ATK_THUNDER, params[6], UNSIGNED_INT) SetWeaponParamField(weaponBase, offsets.ATK_HOLY, params[7], UNSIGNED_INT) SetWeaponParamField(weaponBase, offsets.CORRECT_STR, params[8], FLOAT) SetWeaponParamField(weaponBase, offsets.CORRECT_AGI, params[9], FLOAT) SetWeaponParamField(weaponBase, offsets.CORRECT_MAG, params[10], FLOAT) SetWeaponParamField(weaponBase, offsets.CORRECT_FAI, params[11], FLOAT) SetWeaponParamField(weaponBase, offsets.CORRECT_ARC, params[12], FLOAT) end, -- Atualiza variáveis UpdatePrismaGlobalVariables = function(elementName) PRISMANoElement = (elementName == "PRISMABase") PRISMALightning = (elementName == "PRISMALightning") PRISMAFrost = (elementName == "PRISMAFrost") PRISMAFire = (elementName == "PRISMAFire") PRISMAHoly = (elementName == "PRISMAHoly") end, -- Obtém elemento GetElementFromSwordArt = function(swordArt) local weaponParams = __DATA_TABLE.PRISMA_SWITCH if swordArt == weaponParams.PRISMALightning[2] then return "PRISMALightning" end if swordArt == weaponParams.PRISMAFrost[2] then return "PRISMAFrost" end if swordArt == weaponParams.PRISMAFire[2] then return "PRISMAFire" end if swordArt == weaponParams.PRISMAHoly[2] then return "PRISMAHoly" end if swordArt == weaponParams.PRISMABase[2] then return "PRISMABase" end return nil end, IsPrismaAOW = function(artsId) local weaponParams = __DATA_TABLE.PRISMA_SWITCH return artsId == weaponParams.PRISMALightning[2] or artsId == weaponParams.PRISMAFrost[2] or artsId == weaponParams.PRISMAFire[2] or artsId == weaponParams.PRISMAHoly[2] end, -- ========================================================================= -- FUNÇÕES AUXILIARES PARA DUSKBREAKER -- ========================================================================= -- Aplicação de stats otimizada ApplyWeaponStats = function(weaponBase, params) if not params then return end -- Aplicar todas as mudanças de uma vez local offsets = __DATA_TABLE.WEAPON_OFFSET SetWeaponParamField(weaponBase, offsets.SWORD_ARTS_PARAM_ID, params[2], SIGNED_INT) SetWeaponParamField(weaponBase, offsets.WEP_MOTION_SP, params[13], SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.WEP_MOTION_1H, params[14], SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.WEP_MOTION_2H, params[15], SIGNED_SHORT) SetWeaponParamField(weaponBase, offsets.ICON_ID, params[17], UNSIGNED_INT) SetWeaponParamField(weaponBase, offsets.ATK_PHYS, params[3], UNSIGNED_INT) SetWeaponParamField(weaponBase, offsets.ATK_MAGIC, params[4], UNSIGNED_INT) SetWeaponParamField(weaponBase, offsets.ATK_FIRE, params[5], UNSIGNED_INT) SetWeaponParamField(weaponBase, offsets.ATK_THUNDER, params[6], UNSIGNED_INT) SetWeaponParamField(weaponBase, offsets.ATK_HOLY, params[7], UNSIGNED_INT) SetWeaponParamField(weaponBase, offsets.CORRECT_STR, params[8], FLOAT) SetWeaponParamField(weaponBase, offsets.CORRECT_AGI, params[9], FLOAT) SetWeaponParamField(weaponBase, offsets.CORRECT_MAG, params[10], FLOAT) SetWeaponParamField(weaponBase, offsets.CORRECT_FAI, params[11], FLOAT) SetWeaponParamField(weaponBase, offsets.CORRECT_ARC, params[12], FLOAT) SetWeaponParamField(weaponBase, offsets.WEP_SHEATH, params[16], SIGNED_INT) end, -- ========================================================================= -- FUNÇÕES PARA OTIMIZAÇÃO -- ========================================================================= -- Função genérica para detecção de troca de arma GetWeaponChangeStatus = function() local isChangingWeaponRight = FALSE local isChangingWeaponLeft = FALSE if IsNodeActive("WeaponChangeStart_Selector00") == TRUE or IsNodeActive("WeaponChangeEnd_Selector00") == TRUE or IsNodeActive("WeaponChangeStart_Selector01") == TRUE or IsNodeActive("WeaponChangeEnd_Selector01") == TRUE or IsNodeActive("RideWeaponChangeStart_Selector") == TRUE or IsNodeActive("RideWeaponChangeEnd_Selector") == TRUE then if GetVariable("WeaponChangeType") <= WEAPON_CHANGE_REQUEST_RIGHT_SPEAR and GetVariable("WeaponChangeType") ~= WEAPON_CHANGE_REQUEST_INVALID then isChangingWeaponRight = TRUE else isChangingWeaponLeft = TRUE end end return isChangingWeaponRight, isChangingWeaponLeft end, -- }