Postado Agosto 12, 2020 4 anos Este é um post popular. Fiz esse script, pra tentar "balancear" as vocations de uma maneira diferente: Melhorar oque eu acho fraco, sem piorar oque está "forte". Por exemplo: Sorcerers que deveriam ser a vocation de dano, bate menos que um druid, visto que ele tem o exevo gran frigo hur, então ao invés de eu editar o gran frigo hur, ou adicionar um "exevo gran flam hur", eu fiz com que os sorceres tenham uma % de chance de dar burn/electrify/curse quando bater com fire, energy e death (respectivamente). Aí deixei varias possibilidades de configurações, e cada um vai editando oq achar necessario até achar um ponto de "equilibrio" ? Oque cada vocation pode fazer: Spoiler Knights: Podem dar Bleed (x Vezes, com intervalo t, variando de y% a z% do dano) Podem dar Block (variando de x a y % do dano recebido) Paladins: Podem dar Headshot (x% de chance de dar de y a z vezes a mais de dano) Podem dar Bleed (x Vezes, com intervalo t, variando de y% a z% do dano) Sorceres: Podem dar Burn, curse, ou eletrify(x Vezes, com intervalo t, variando de y% a z% do dano) Druids podem dar Paralyze (quando bate com terra) podem dar Freeze( quando bate com ice) Adicionando o Script em data/creaturescripts/creaturescripts.xml adicione a tag: <event type="healthchange" name="balancevoc" script="vocation_balance.lua"/> em data/creaturescript/scripts/login.lua (ou login_events, depende do teu sv) coloque a tag: player:registerEvent("balancevoc) em data/creaturescript/scripts adicione o arquivo vocation_balance.lua, abra-o e coloque o seguinte script: Spoiler local balance = { --All timesRepeatCondition = 3 intervalCondition = 900 --Knight canBlock = true, canBleed = true, blockChance = 10, bleedChance = 10, blockMaxEffect = 70, -- % blockMinEffect = 20, -- % bleedMaxDmg = 60, -- this means the percent of the atk dmg =) bleedMinDmg = 20, -- this means the percent of the atk dmg =) --Paladin canHeadShot = true, -- like a critical canBleedRP = false, -- headshootChance = 1, bleedChanceRP = 15, headshootMaxMultiplier = 1.3, -- 2.5x dmg (less than 1 means a dmg reduction instead of a bonus!) headshootMinMultiplier = 1.0, -- 1.1x dmg (less than 1 means a dmg reduction instead of a bonus!) bleedMaxDmgRP = 50, -- this means the percent of the atk dmg =) bleedMinDmgRP = 10, -- this means the percent of the atk dmg =) --Sorcerer canBurn = true, -- true or false canEletrify = true, -- true or false canCurse = true, -- true or false burnChance = 10, eletrifyChance = 10, curseChance = 10, burnMaxDmg = 60, -- this means the percent of the atk dmg =) eletrifyMaxDmg = 60, -- this means the percent of the atk dmg =) curseMaxDmg = 60, -- this means the percent of the atk dmg =) burnMinDmg = 20, -- this means the percent of the atk dmg =) eletrifyMinDmg = 20, -- this means the percent of the atk dmg =) curseMinDmg = 20, -- this means the percent of the atk dmg =) --Druid canParalyze = true, -- true or false canFreeze = false, -- true or false paralyzeChance = 10, freezeChance = 10, paralyzeMaxEffect = 750, -- for example: 100 = ingame speed 50 paralyzeMinEffect = 350, freezeMaxDmg = 60, -- this means the percent of the atk dmg =) freezeMinDmg = 20, -- this means the percent of the atk dmg =) } function onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin) if primaryType == COMBAT_HEALING then return primaryDamage, primaryType, secondaryDamage, secondaryType end if not attacker then return primaryDamage, primaryType, secondaryDamage, secondaryType end local dmg = 0 local block = math.random(100) local headshot = math.random(100) local rand = math.random(100) local atacado = creature:getMonster() if not atacado then atacado = creature end if attacker:isPlayer() then -- KNIGHTS if attacker:getVocation():getClientId() == 1 then if balance.canBleed == true then if rand <= balance.bleedChance then dmg = primaryDamage * math.random(balance.bleedMinDmg, balance.bleedMaxDmg)/100 local condition = Condition(CONDITION_BLEEDING) condition:setParameter(CONDITION_PARAM_DELAYED, 1) condition:addDamage(balance.timesRepeatCondition, balance.intervalCondition, -dmg) atacado:addCondition(condition) end end end -- PALADINS if attacker:getVocation():getClientId() == 2 then if balance.canBleedRP == true then if primaryType == COMBAT_PHYSICALDAMAGE then if rand <= balance.bleedChanceRP then dmg = primaryDamage * math.random(balance.bleedMinDmgRP, balance.bleedMaxDmgRP)/100 local condition = Condition(CONDITION_BLEEDING) condition:setParameter(CONDITION_PARAM_DELAYED, 1) condition:addDamage(balance.timesRepeatCondition, balance.intervalCondition, -dmg) atacado:addCondition(condition) end end end if balance.canHeadShot == true then local hs = (math.random(balance.headshootMinMultiplier, balance.headshootMaxMultiplier)) if headshot <= balance.headshootChance then if primaryDamage > 0 then primaryDamage = primaryDamage * hs creature:say("HEADSHOT!", TALKTYPE_MONSTER_SAY) end end end end -- SORCERERS if attacker:getVocation():getClientId() == 3 then if balance.canBurn == true then if primaryType == COMBAT_FIREDAMAGE then if rand <= balance.burnChance then dmg = primaryDamage * math.random(balance.burnMinDmg, balance.burnMaxDmg)/100 local condition = Condition(CONDITION_FIRE) condition:setParameter(CONDITION_PARAM_DELAYED, 1) condition:addDamage(balance.timesRepeatCondition, balance.intervalCondition, -dmg) atacado:addCondition(condition) end end end if balance.canEletrify == true then if primaryType == COMBAT_ENERGYDAMAGE then if rand <= balance.eletrifyChance then dmg = primaryDamage * math.random(balance.eletrifyMinDmg, balance.eletrifyMaxDmg)/100 local condition = Condition(CONDITION_ENERGY) condition:setParameter(CONDITION_PARAM_DELAYED, 1) condition:addDamage(balance.timesRepeatCondition, balance.intervalCondition, -dmg) atacado:addCondition(condition) end end end if balance.canCurse == true then if primaryType == COMBAT_DEATHDAMAGE then if rand <= balance.curseChance then dmg = primaryDamage * math.random(balance.curseMinDmg, balance.curseMaxDmg)/100 local condition = Condition(CONDITION_CURSED) condition:setParameter(CONDITION_PARAM_DELAYED, 1) condition:addDamage(balance.timesRepeatCondition, balance.intervalCondition, -dmg) atacado:addCondition(condition) end end end end -- DRUIDS if attacker:getVocation():getClientId() == 4 then if balance.canParalyze == true then if primaryType == COMBAT_EARTHDAMAGE then if rand <= balance.paralyzeChance then local para = math.random(balance.paralyzeMinEffect, balance.paralyzeMaxEffect) local condition = Condition(CONDITION_PARALYZE) condition:setParameter(CONDITION_PARAM_TICKS, 500) condition:setFormula(-1, para, -1, para) atacado:addCondition(condition) end end end if balance.canFreeze == true then if primaryType == COMBAT_ICEDAMAGE then if rand <= balance.freezeChance then dmg = primaryDamage * math.random(balance.freezeMinDmg, balance.freezeMaxDmg)/100 local condition = Condition(CONDITION_FREEZING) condition:setParameter(CONDITION_PARAM_DELAYED, 1) condition:addDamage(balance.timesRepeatCondition, balance.intervalCondition, -dmg) atacado:addCondition(condition) end end end end end -- KNIGHT BLOCK if creature:isPlayer() and (creature:getVocation():getClientId()) == 1 then if balance.canBlock == true then if block <= balance.blockChance then local blockpercent = math.random(balance.blockMinEffect, balance.blockMaxEffect) creature:say("BLOCK!", TALKTYPE_MONSTER_SAY) if primaryDamage > 0 then primaryDamage = primaryDamage * (blockpercent)/100 end if secondaryDamage > 0 then secondaryDamage = secondaryDamage * (blockpercent)/100 end end end end return primaryDamage, primaryType, secondaryDamage, secondaryType end Então vá até data/events/events.xml, procure por: <event class="Creature" method="onTargetCombat" enabled="0" /> E mude enabled="0" para enabled="1" Aí abra data/events/scripts/creature.lua, procure por function Creature:onTargetCombat(target) e abaixo, coloque a tag: target:registerEvent("balancevoc") E pronto, tá feito o sorvetinho ? MEUS POSTS: [Source] Sistema Anti-PVP ~~ PvP on/off por comando [CreatureScript] Sugestão de balanceamento ~~ Uma pequena sugestão de balanceamento das vocations ? [NPC] Daily Task ~~ Daily Task com 4 opções diarias Contador de Monstros ~~Sistema pra contar quantos monstros tem no sv, e uma melhoria pro sistema de Daily Tasks Calma, por enquanto é só, e em breve mais coisas ;} SE AJUDEI, DÁ O REP+, ESQUECE NÃO, VLW BB
Postado Agosto 12, 2020 4 anos Só uma observação, mas nada demais... Esse tipo de verificação não é necessária if balance.canBlock == true then Você pode fazer apenas if balance.canBlock then Caso seja true, ele vai passar normalmente, caso for false ele para ali e nem termina de executar o código. Baiak Thunder New TFS Downgrade [TFS 1.5 - 8.60] Gesior Ferobra Downgrade Evento Monster Hunt [TFS 1.X] Evento SafeZone [TFS 1.X] Online Bonus System [TFS 1.X] Dodge & Critical [TFS 1.X] Nova moeda, funcionando com NPCs [TFS 1.X] Square System [TFS 1.X] Loot Channel [TFS 1.X] Gerenciador de Quests [All TFS] NPCs comprando vial/flasks por storage [TFS 1.X] AntiBot [TFS 1.X] Como compilar TFS 0.X
Postado Agosto 12, 2020 4 anos Autor 9 horas atrás, Movie disse: Só uma observação, mas nada demais... Esse tipo de verificação não é necessária if balance.canBlock == true then Você pode fazer apenas if balance.canBlock then Caso seja true, ele vai passar normalmente, caso for false ele para ali e nem termina de executar o código. Humm.. nao sabia, mas estranho, pq as vezes qd vou checar storages, se a storage é 0, ela passa do mesmo jeito, teoricamente isso deveria ter o mesmo efeito que true e false, nao? mas de qualquer forma, bom saber xD MEUS POSTS: [Source] Sistema Anti-PVP ~~ PvP on/off por comando [CreatureScript] Sugestão de balanceamento ~~ Uma pequena sugestão de balanceamento das vocations ? [NPC] Daily Task ~~ Daily Task com 4 opções diarias Contador de Monstros ~~Sistema pra contar quantos monstros tem no sv, e uma melhoria pro sistema de Daily Tasks Calma, por enquanto é só, e em breve mais coisas ;} SE AJUDEI, DÁ O REP+, ESQUECE NÃO, VLW BB
Postado Agosto 12, 2020 4 anos 1 hora atrás, Mor3nao disse: Humm.. nao sabia, mas estranho, pq as vezes qd vou checar storages, se a storage é 0, ela passa do mesmo jeito, teoricamente isso deveria ter o mesmo efeito que true e false, nao? mas de qualquer forma, bom saber xD Quando você usa com storage, você precisa comparar, porque a storage pode assumir diversos valores. Por exemplo, se você tentar fazer isso, você vai comparar o valor com o que? Isso o lua não entende if player:getStorageValue(1771) then O certo seria if player:getStorageValue(1771) == (valor) then Não sei se conseguiu entender.. caso não tenha entendido me avisa. Baiak Thunder New TFS Downgrade [TFS 1.5 - 8.60] Gesior Ferobra Downgrade Evento Monster Hunt [TFS 1.X] Evento SafeZone [TFS 1.X] Online Bonus System [TFS 1.X] Dodge & Critical [TFS 1.X] Nova moeda, funcionando com NPCs [TFS 1.X] Square System [TFS 1.X] Loot Channel [TFS 1.X] Gerenciador de Quests [All TFS] NPCs comprando vial/flasks por storage [TFS 1.X] AntiBot [TFS 1.X] Como compilar TFS 0.X
Postado Agosto 12, 2020 4 anos 1 hora atrás, Mor3nao disse: pq as vezes qd vou checar storages, se a storage é 0, ela passa do mesmo jeito, teoricamente isso deveria ter o mesmo efeito que true e false, nao? Apenas complementando a explicação do @Movie, a função que busca o valor de uma storage pode retornar tanto nil (nulo) ou -1 quando o jogador não possui essa storage, e qualquer valor que não seja nulo vai fazer o if retornar verdadeiro, seja esse valor 0 ou até mesmo valores negativos. Nós somos aquilo que fazemos repetidamente. Excelência, não é um modo de agir, mas um hábito. Aristóteles
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.