Estou recomeçando a aprender Lua, vou postar alguns scripts que fizer, aqui
Quem quiser me dar dicas de como melhorar os códigos, a vontade
1º - Mudança na Spell que cria comida: exevo pan
O tipo do item é entregue de acordo com o ML, e a quantidade de acordo com o Lv.
local food = { {0, 2684}, -- meat {6, 2684}, -- meat {13, 2689}, -- bread {20, 2666}, -- meat {33, 2682}, -- melon {53, 2671}, -- ham {86, 2795}, -- fire mushroom {100, 2672} -- dragon ham } local lv = 30 function onCastSpell(creature, var) if not creature:isPlayer() then return false end local mo for k=1, #food do if (getPlayerMagLevel(creature) >= food[k][1]) then mo = food[k][2] end end creature:addItem(mo,math.random(1, math.ceil(getPlayerLevel(creature)/lv))) creature:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN) return true end
2º - Lenhador
A ideia desse é poder usar os machados (estava pensando em qualquer arma) e definir uma chance que o item tem de derrubar a árvore, como não sei os IDs de cor ainda, peguei esses pra testar.
function onUse(cid, item, fromPosition, itemEx, toPosition, isHotkey) local chance = true --sera 100%? local axes = { [2386] = {tax = 1}, [2388] = {tax = 50}, [2380] = {tax = 20} } local trees = { [2702] = {qnt_madeira = 2}, [2703] = {qnt_madeira = 4}, [2704] = {qnt_madeira = 8} } if trees[itemEx.itemid] == nil then return true else local wood = 2148 --gold coin local taxa = axes[item.itemid].tax local qnt = math.random((trees[itemEx.itemid].qnt_madeira)/2,trees[itemEx.itemid].qnt_madeira) if chance == false then if (math.random(1,100) <= axes[item.itemid].tax) then Item(itemEx.uid):transform(2768) doSendMagicEffect(toPosition, 4) Player(cid):addItem(wood,qnt) else doSendMagicEffect(toPosition, 3) end else Item(itemEx.uid):transform(2768) doSendMagicEffect(toPosition, 4) Player(cid):addItem(wood,qnt) end end end
3º - Auto-completion TÓPICO SOBRE ISSO
https://github.com/felzan/TFSLua_npp
Este não é bem um script, mas ajuda na hora de escrever.
É uma biblioteca de funções que são apresentadas ao longo que vou escrevendo. Quero completar, adicionar mais funções e seus parâmetros.
Ele mostra uma lista de funções (a partir das letras já inseridas) e os parâmetros necessários para a função, e uma descrição.
4º - Explosion Arrow
Se é uma flecha explosiva, POR QUE ELA EXPLODE QUANDO É LANÇADA?!!?
A ideia dessa modificação é fazer com que a explosão aconteça quando a flecha atingir o alvo.
Como é:
Como ficou:
Se for uma "flecha explosiva com timer (1s)":
local combatExplosion = createCombatObject() setCombatParam(combatExplosion, COMBAT_PARAM_BLOCKARMOR, 0) setCombatParam(combatExplosion, COMBAT_PARAM_BLOCKSHIELD, 0) setCombatParam(combatExplosion, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatFormula(combatExplosion, COMBAT_FORMULA_SKILL, 1, 0, 1, 0) local area = createCombatArea( { {1, 1, 1}, {1, 3, 1}, {1, 1, 1} } ) setCombatArea(combatExplosion, area) local combatArrow = createCombatObject() setCombatParam(combatArrow, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combatArrow, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combatArrow, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combatArrow, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_BURSTARROW) setCombatFormula(combatArrow, COMBAT_FORMULA_SKILL, 1, 0, 1, 0) local function onUseWeaponExplosion(player, var) doCombat(player, combatExplosion, var) end function onUseWeapon(player, var) local name = player:getName() local playerPosition = player:getPosition() local targetPosition = player:getTarget():getPosition() local distance = getDistanceBetween(playerPosition, targetPosition) local waitTimeAfterHit = 0 doPlayerSendTextMessage(player, MESSAGE_EVENT_ORANGE, targetPosition.x) doCombat(player, combatArrow, var) addEvent(onUseWeaponExplosion, (distance*95+waitTimeAfterHit*1000), player, var) return true end
5º - Poison Arrow
Só alterei o jeito que o hp é removido, antes era em rounds com dano único. Agora da dano baseado na porcentagem de hp do alvo, mas vai decaindo.
local combatArrow = Combat() combatArrow:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_POISONARROW) combatArrow:setParameter(COMBAT_PARAM_TYPE, COMBAT_POISONDAMAGE) combatArrow:setFormula(COMBAT_FORMULA_SKILL, 1, 0, 1, 0) local function onUseWeaponPoison(parameters, rounds) if parameters.target == nil then return true else local conditionPoison = Condition(CONDITION_POISON) conditionPoison:setParameter(CONDITION_PARAM_DELAYED, true) for i = rounds, 1,-1 do local hp = getCreatureHealth(parameters.target) print(rounds) local hpp = .001 conditionPoison:addDamage(1, 1000, -hp*hpp*i) end combatArrow:setCondition(conditionPoison) end end function onUseWeapon(player, var) local rounds = 10 local cid = player:getId() parameters = {cid = player, target = Creature(var:getNumber())} combatArrow:execute(player, var) addEvent(onUseWeaponPoison, 1000, parameters, rounds) return true end
6º - Debuff spell
Fiz essa spell pra esse pedido
Faz com que o player debuffado sofra mais dano.
Add no final do creaturescripts\scripts\login.lua
player:registerEvent("Debuff")creaturescripts.xml
<event type="healthchange" name="Debuff" script="debuff.lua"/>Exemplo de spells.xml
<instant group="attack" spellid="61" name="Debuff" words="debuff" lvl="1" mana="0" prem="0" range="4" needtarget="1" blockwalls="1" needweapon="0" exhaustion="6000" groupcooldown="2000" needlearn="0" script="debuff.lua"> </instant>spells\scripts\debuff.lua
local combat = Combat() combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_SKULLVERTICAL) local conditionDebuff = Condition(CONDITION_PARALYZE) conditionDebuff:setParameter(CONDITION_PARAM_TICKS, 10000) conditionDebuff:setFormula(0, 0, 0, 0) combat:setCondition(conditionDebuff) local function removeDebuff(parameters) parameters.target:setStorageValue(parameters.key, parameters.value) end function onCastSpell(creature, var) local cid = creature:getId() parameters = {target = Creature(var:getNumber()), key = 99881, value = 0} parameters.target:setStorageValue(parameters.key, 1) addEvent(removeDebuff, 10000, parameters) return combat:execute(creature, var) endcreaturescripts\scripts\debuff.lua
function onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin) local hasdebuff = creature:getStorageValue(99881) --storage dada na debuff spell local percent = 2 -- dobro (50% seria 1.5) local tipoDano = COMBAT_FIREDAMAGE if hasdebuff > 0 then return primaryDamage*percent, tipoDano, secondaryDamage, secondaryType else return primaryDamage, primaryType, secondaryDamage, secondaryType end end