Amalleus Posted June 15, 2015 Share Posted June 15, 2015 Hello!I read tutorials about LUA about how to modify weapon stats, f.e. set max uses, damage of item and even player stats, but in real time this is possible only on events OnEquip and OnUnequip etc. But i want to make it like while it IsEquipped, but it didn't work.So straigt to the code which i want to add:if ((GetPlayer().components.sanity:GetPercent() * 100) > 90) thenGetPlayer().components.combat.damagemultiplier = 1.25elseif ((GetPlayer().components.sanity:GetPercent() * 100) > 90) thenGetPlayer().components.combat.damagemultiplier = 1.2elseif ((GetPlayer().components.sanity:GetPercent() * 100) > 90) thenGetPlayer().components.combat.damagemultiplier = 1.15else GetPlayer().components.combat.damagemultiplier = 1.1and this code must work in real time, so if my sanity dropped down to 179 from 180 while the thing is equipped, my walkspeed will drop down too, like in code. Didn't find any examples in game files how to implement it. It's pretty hard for me in LUA. Help! Link to comment Share on other sites More sharing options...
Blueberrys Posted June 15, 2015 Share Posted June 15, 2015 @AmalleusFirstly, a few things..You should try to minimize how much you call functions (GetPlayer) or use deep indexed variables (inst.components...)Your code is checking for the percentage above 90 multiple times. It never gets to any other elseif statement.There's no need to multiply the value of the percentage, just use decimals. You can use the sanitydelta event which is passed from "..\scripts\components\sanity.lua". -- where inst is the player's instance-- if you aren't sure, uncomment the line below-- inst = GetPlayer()inst:ListenForEvent("sanitydelta", function(inst, data) local percent = data.newpercent if (percent > 0.9) then -- More than 90% inst.components.combat.damagemultiplier = 1.25 elseif (percent > 0.8) then -- More than 80% inst.components.combat.damagemultiplier = 1.2 else -- Less than 80% inst.components.combat.damagemultiplier = 1.15 endend) Link to comment Share on other sites More sharing options...
Amalleus Posted June 15, 2015 Author Share Posted June 15, 2015 @AmalleusFirstly, a few things..You should try to minimize how much you call functions (GetPlayer) or use deep indexed variables (inst.components...)Your code is checking for the percentage above 90 multiple times. It never gets to any other elseif statement.There's no need to multiply the value of the percentage, just use decimals.You can use the sanitydelta event which is passed from "..\scripts\components\sanity.lua".-- where inst is the player's instance-- if you aren't sure, uncomment the line below-- inst = GetPlayer()inst:ListenForEvent("sanitydelta", function(inst, data) local percent = data.newpercent if (percent > 0.9) then -- More than 90% inst.components.combat.damagemultiplier = 1.25 elseif (percent > 0.8) then -- More than 80% inst.components.combat.damagemultiplier = 1.2 else -- Less than 80% inst.components.combat.damagemultiplier = 1.15 endend)i know about 90% multiple times. i just weren't able to edit it to change mistake. i wrote it in fast Link to comment Share on other sites More sharing options...
Amalleus Posted June 15, 2015 Author Share Posted June 15, 2015 @[member=Blueberrys] i'll test it tomorrow. And as i said, im pretty new to lua. Where should i post this code? It seems like inst variable was already taken by equippable item. Can't attach file, so here's text...local assets={ Asset("ANIM", "anim/steel.zip"), Asset("ANIM", "anim/swap_steel.zip"), Asset("ATLAS", "images/inventoryimages/steel.xml"), Asset("IMAGE", "images/inventoryimages/steel.tex"),}local prefabs = {}local function fn(colour) --local function UpdateBoost(inst) --if inst.components.equippable:IsEquipped() then --works only once -- if ((GetPlayer().components.sanity:GetPercent() * 100) > 90) then -- GetPlayer().components.combat.damagemultiplier = 1.25 -- elseif ((GetPlayer().components.sanity:GetPercent() * 100) > 80) then -- GetPlayer().components.combat.damagemultiplier = 1.2 -- elseif ((GetPlayer().components.sanity:GetPercent() * 100) > 70) then -- GetPlayer().components.combat.damagemultiplier = 1.15 -- else GetPlayer().components.combat.damagemultiplier = 1.1 --end local function OnEquip(inst, owner) --owner.AnimState:OverrideSymbol("swap_object", "swap_steel", "purplestaff") owner.AnimState:OverrideSymbol("swap_object", "swap_steel", "steel") owner.AnimState:Show("ARM_carry") owner.AnimState:Hide("ARM_normal") --UpdateBoost(inst) end local function OnUnequip(inst, owner) owner.AnimState:Hide("ARM_carry") owner.AnimState:Show("ARM_normal") --testing.... works once --owner.components.sanity:SetMax(400) end local function onfinished(inst) inst:Remove() end local inst = CreateEntity() local trans = inst.entity:AddTransform() local anim = inst.entity:AddAnimState() MakeInventoryPhysics(inst) anim:SetBank("steel") anim:SetBuild("steel") anim:PlayAnimation("idle") inst:AddComponent("inventoryitem") inst.components.inventoryitem.keepondeath = true inst.components.inventoryitem.imagename = "steel" inst.components.inventoryitem.atlasname = "images/inventoryimages/steel.xml" inst:AddComponent("equippable") inst.components.equippable:SetOnEquip( OnEquip ) inst.components.equippable:SetOnUnequip( OnUnequip ) --inst.components.equippable.walkspeedmult = 1.15 inst.components.inventoryitem.keepondeath = true inst:AddComponent("inspectable") inst:AddTag("sword") inst:AddComponent("weapon") inst.components.weapon:SetDamage(57) inst.components.weapon:SetRange(0.4, 0.4) inst:AddComponent("finiteuses") inst.components.finiteuses:SetMaxUses(150) inst.components.finiteuses:SetUses(150) inst.components.finiteuses:SetOnFinished( onfinished ) return instendreturn Prefab("common/inventory/steel", fn, assets, prefabs) Link to comment Share on other sites More sharing options...
Amalleus Posted June 16, 2015 Author Share Posted June 16, 2015 seems like i made it to work through Event ListenForEvent("sanitydelta", StatBoost)where i have local function StatBoost(inst) local percent = inst.components.sanity:GetPercent() if (percent > 0.9) then -- More than 90% inst.components.combat.damagemultiplier = 3 elseif (percent > 0.8) then -- More than 80% inst.components.combat.damagemultiplier = 2 else -- Less than 80% inst.components.combat.damagemultiplier = 1 endend;BUT! This event works everytime while i have an item in inventory, equipped - so if i have it. But i need to make this code work only if it's equipped. If i will post next code in function StatBoost(inst):if (IsEquipped() == true) thenThen i need to paste also instance of this equippable before IsEquipped. But how to get instance of equippable? Link to comment Share on other sites More sharing options...
Blueberrys Posted June 16, 2015 Share Posted June 16, 2015 @Amalleus You don't need to do that, just disable the event listener on UnEquip. See this post, it's almost the exact same thing you need. Link to comment Share on other sites More sharing options...
Amalleus Posted June 16, 2015 Author Share Posted June 16, 2015 @Amalleus You don't need to do that, just disable the event listener on UnEquip. See this post, it's almost the exact same thing you need.Yes, I think it will work. Didn't know about function like stop listening. Thanks Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.
Please be aware that the content of this thread may be outdated and no longer applicable.