Ir para conteúdo

El Rusher

Cavaleiro
  • Total de itens

    174
  • Registro em

  • Última visita

  • Dias Ganhos

    20

El Rusher venceu a última vez em Novembro 13

El Rusher had the most liked content!

3 Seguidores

Sobre El Rusher

Perfil

  • Gênero
    Masculino

Informações

  • Forma que conheci o xTibia
    Outros Sites
  • Sou
    Programador

Últimos Visitantes

2694 visualizações

El Rusher's Achievements

  1. acho que nao compreendi direito oq vc quer que aconteceça, poderia explicar melhor por gentileza
  2. local BOOSTED_MONSTER = 56404 local boostedMonstersList = {"rat"} local experienceBonus = 8.0 function onDeath(cid, corpse, deathList) local master = getCreatureMaster(cid) if (master and master ~= cid) then return true end local boostedMonster = boostedMonstersList[getGlobalStorageValue(BOOSTED_MONSTER)] if getCreatureName(cid):lower() == boostedMonster then -- Inicializa a mensagem de loot local lootMessage = "Loot of " .. getCreatureName(cid):lower() .. ": " local lootList = getMonsterLootList(getCreatureName(cid)) local firstLoot = true for _, loot in pairs(lootList) do if loot.count > 1 then local numb = math.random(1, loot.count) doAddContainerItem(corpse.uid, loot.id, numb) if firstLoot then lootMessage = lootMessage .. numb .. " " .. getItemNameById(loot.id) firstLoot = false else lootMessage = lootMessage .. ", " .. numb .. " " .. getItemNameById(loot.id) end elseif math.random(1, 100000) <= loot.chance then doAddContainerItem(corpse.uid, loot.id, 1) if firstLoot then lootMessage = lootMessage .. getItemNameById(loot.id) firstLoot = false else lootMessage = lootMessage .. ", " .. getItemNameById(loot.id) end end end -- Adiciona "(boosted loot)" ao final da mensagem lootMessage = lootMessage .. ". (boosted loot)" -- Envia a mensagem de loot para todos os jogadores for i = 1, #deathList do doPlayerSendTextMessage(deathList[i], MESSAGE_INFO_DESCR, lootMessage) end end return true end
  3. local Snowtalk = TalkAction("!snowball") function Snowtalk.onSay(cid, words, param, channel) local k = string.split(param, ",") if k[1] ~= nil then if string.upper(k[1]) == 'INFO' then local score = {} local output = "Você tem " .. getPlayerStorageValue(cid, SBW_SCORE) .. " pontos.\nVocê tem " .. getPlayerStorageValue(cid, SBW_AMMO) .. "x munições.\n------------------\nO maior matador:\n" for _, pid in ipairs(getOnlinePlayers()) do if getPlayerStorageValue(pid, SBW_INEVENT) then table.insert(score, {getCreatureName(pid), getPlayerStorageValue(pid, SBW_SCORE)}) end end local lx = #score if lx > 3 then lx = 3 end table.sort(score, function(a, b) return a[2] > b[2] end) for i = 1, lx do output = output .. i .. ". " .. score[i][1] .. " [" .. score[i][2] .. "].\n" end doPlayerPopupFYI(cid, output) elseif string.upper(k[1]) == 'ATIRAR' then if getPlayerStorageValue(cid, SBW_INEVENT) == 1 and not getTileInfo(getThingPos(cid)).protection then if getPlayerStorageValue(cid, SBW_EXAUSTHED) <= 1 then if getPlayerStorageValue(cid, SBW_AMMO) > 0 then if SBW_STATUS == 'on' then if not SBW_AMMOINFI then setGlobalStorageValue(cid, SBW_AMMO, getPlayerStorageValue(cid, SBW_AMMO) - 1) end setGlobalStorageValue(cid, SBW_EXAUSTHED, 2) lineAnimation(getCreatureDirection(cid), getCreaturePosition(cid), 13, cid, 1, 1, 1, 1, 1, 1, 1, 1) addEvent(setGlobalStorageValue, SBW_SHOOTEXAUSTHED, cid, SBW_EXAUSTHED, 1) if getPlayerStorageValue(cid, SBW_AMMO) ~= 1 then doPlayerSendTextMessage(cid, 27, "Restam " .. getPlayerStorageValue(cid, SBW_AMMO) .. "x bolas de neve.") else doPlayerSendTextMessage(cid, 27, "Usando sua última bola de neve, recarregue.") end end else doPlayerSendCancel(cid, "Você está sem bolas de neve, recarregue no centro do campo ou mate um inimigo.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) end else doPlayerPopupFYI(cid, "Acalme-se, você deve esperar para atirar novamente.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) return false end else doPlayerPopupFYI(cid, "Você precisa estar dentro do evento ou fora da área protegida.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) end end end return true end function lineAnimation(lookDir, playerPos, effect, cid, fvar, fpos, ffound, fposV, fcheck, fvcid, floopCounter, fvpid) local var = fvar local pos = playerPos local found = ffound local posV = fposV local check = fcheck local vcid = fvcid local loopCounter = floopCounter local vpid = fvpid if var < 2 then vcid = cid end pos = playerPos if not isInWallArray(convert(lookDir, pos)) then doSendDistanceShoot(pos, convert(lookDir, pos), effect) pos = convert(lookDir, pos) var = var + 1 posV = convertV(lookDir, playerPos) for _, pid in ipairs(getOnlinePlayers()) do if getCreaturePosition(pid).x == pos.x and getCreaturePosition(pid).y == pos.y and getCreaturePosition(pid).z == pos.z then vpid = pid if vpid ~= vcid then if var > 2 then if getCreaturePosition(pid).x == posV.x and getCreaturePosition(pid).y == posV.y and getCreaturePosition(pid).z == posV.z then killPlayer(pid, pos, vcid) if lookDir == 0 or lookDir == 2 then var = 6 else var = 8 end end end killPlayer(pid, pos, vcid) if lookDir == 0 or lookDir == 2 then var = 6 else var = 8 end end end loopCounter = loopCounter + 1 end if (lookDir == 0 or lookDir == 2) and var ~= 6 then addEvent(lineAnimation, SBW_BALLSPEED, lookDir, pos, effect, nil, var, pos, found, posV, check, vcid, loopCounter, vpid) elseif (lookDir == 1 or lookDir == 3) and var ~= 8 then addEvent(lineAnimation, SBW_BALLSPEED, lookDir, pos, effect, nil, var, pos, found, posV, check, vcid, loopCounter, vpid) else var = 1 end else doSendMagicEffect(convert(lookDir, pos), 2) var = 1 end end function convert(lookDir, pos) local positions = { [0] = {x = pos.x, y = pos.y - 1, z = pos.z}, [1] = {x = pos.x + 1, y = pos.y, z = pos.z}, [2] = {x = pos.x, y = pos.y + 1, z = pos.z}, [3] = {x = pos.x - 1, y = pos.y, z = pos.z}, } return positions[lookDir] end function convertV(lookDir, pos) local positions = { [0] = {x = pos.x, y = pos.y + 1, z = pos.z}, [1] = {x = pos.x - 1, y = pos.y, z = pos.z}, [2] = {x = pos.x, y = pos.y - 1, z = pos.z}, [3] = {x = pos.x + 1, y = pos.y, z = pos.z}, } return positions[lookDir] end function isInWallArray(pos) for _, wallId in ipairs(SBW_WALLSID) do if getTileItemById(pos, wallId).itemid == wallId then return true end end return false end function killPlayer(cid, pos, killer) local tl = SBW_AREA[1] local br = SBW_AREA[2] local posti local isPossibleToTeleportPlayer = false while not isPossibleToTeleportPlayer do posti = Position(math.random(tl.x, br.x), math.random(tl.y, br.y), 7) if not isInWallArray(posti) then isPossibleToTeleportPlayer = true end end doTeleportThing(cid, posti) doSendMagicEffect(pos, 2) doSendMagicEffect(posti, 6) doSendAnimatedText(pos, getCreatureName(killer), 55) doPlayerSendTextMessage(cid, 27, "Você morreu para " .. getCreatureName(killer) .. ".") setGlobalStorageValue(killer, SBW_SCORE, getPlayerStorageValue(killer, SBW_SCORE) + SBW_POINTSKILL) doPlayerSendTextMessage(killer, 27, "Você matou " .. getCreatureName(cid) .. ".") if SBW_LOSTSCORE then setGlobalStorageValue(cid, SBW_SCORE, getPlayerStorageValue(cid, SBW_SCORE) - 1) end if SBW_RESETAMMO then setGlobalStorageValue(cid, SBW_AMMO, SBW_MINAMMO) end end Snowtalk:separator(" ") Snowtalk:register() testa assim colega
  4. El Rusher

    Ajuda com SCRIPT.

    poe cid nesses parenteses ai
  5. El Rusher

    Ajuda com SCRIPT.

    local regenEvent = {} -- Tabela para armazenar os identificadores de eventos por jogador. function onEquip(cid, item, position, fromPosition) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, "Activated Strength Blessing.") doSendAnimatedText(getPlayerPosition(cid), "Reloading!!", 210) doPlayerSay(cid, "POWER-UP!", 16) doSendMagicEffect(getPlayerPosition(cid), 95) local function regenVida(cid) if isPlayer(cid) and getPlayerAccess(cid) > 0 then -- Verifica se o jogador ainda é válido. doPlayerAddHealth(cid, 1000) regenEvent[cid] = addEvent(regenVida, 1000, cid) -- Reagendar o evento. else regenEvent[cid] = nil -- Limpa o evento se o jogador não estiver mais online. end end regenEvent[cid] = addEvent(regenVida, 1000, cid) -- Inicializa o evento com o `cid`. return TRUE end function onDeEquip(cid, item, position, fromPosition) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, "Strength Blessing Disabled.") doSendAnimatedText(getPlayerPosition(cid), "Weakening!!", 210) doPlayerSay(cid, "Losing Strength!", 16) doSendMagicEffect(getPlayerPosition(cid), 95) -- Parar o evento associado ao jogador. if regenEvent[cid] then stopEvent(regenEvent[cid]) -- Cancela o evento em execução. regenEvent[cid] = nil -- Remove o identificador para evitar uso futuro. end return TRUE end "Player not found", sugere que a função luaDoPlayerAddMana está sendo chamada para um jogador que não existe mais no jogo. Isso pode acontecer se um jogador se desconectar enquanto o evento regenVida ainda está rodando. Para corrigir isso, adiciona uma verificação extra se o jogador ainda está conectado antes de executar doPlayerAddHealth:
  6. El Rusher

    Ajuda com SCRIPT.

    opa, bom dia, tenta assim entao por gentileza local regenEvent = {} -- Tabela para armazenar os identificadores de eventos por jogador. function onEquip(cid, item, position, fromPosition) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, "Activated Strength Blessing.") doSendAnimatedText(getPlayerPosition(cid), "Reloading!!", 210) doPlayerSay(cid, "POWER-UP!", 16) doSendMagicEffect(getPlayerPosition(cid), 95) local function regenVida(cid) if isPlayer(cid) then doPlayerAddHealth(cid, 1000) -- Adiciona vida ao jogador. regenEvent[cid] = addEvent(regenVida, 1000, cid) -- Reagendar o evento com o `cid`. end end regenEvent[cid] = addEvent(regenVida, 1000, cid) -- Inicializa o evento com o `cid`. return TRUE end function onDeEquip(cid, item, position, fromPosition) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, "Strength Blessing Disabled.") doSendAnimatedText(getPlayerPosition(cid), "Weakening!!", 210) doPlayerSay(cid, "Losing Strength!", 16) doSendMagicEffect(getPlayerPosition(cid), 95) -- Parar o evento associado ao jogador. if regenEvent[cid] then stopEvent(regenEvent[cid]) -- Cancela o evento em execução. regenEvent[cid] = nil -- Remove o identificador para evitar uso futuro. end return TRUE end
  7. El Rusher

    Ajuda com SCRIPT.

    local regenEvent = {} -- Tabela para armazenar os identificadores de eventos por jogador. function onEquip(cid, item, position, fromPosition) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, "Activated Strength Blessing.") doSendAnimatedText(getPlayerPosition(cid), "Reloading!!", 210) doPlayerSay(cid, "POWER-UP!", 16) doSendMagicEffect(getPlayerPosition(cid), 95) local function regenVida() if isPlayer(cid) then doPlayerAddHealth(cid, 1000) -- Adiciona vida ao jogador. regenEvent[cid] = addEvent(regenVida, 1 * 1000) -- Reagendar o evento. end end regenEvent[cid] = addEvent(regenVida, 1 * 1000) -- Inicializa o evento. return TRUE end function onDeEquip(cid, item, position, fromPosition) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, "Strength Blessing Disabled.") doSendAnimatedText(getPlayerPosition(cid), "Weakening!!", 210) doPlayerSay(cid, "Losing Strength!", 16) doSendMagicEffect(getPlayerPosition(cid), 95) -- Parar o evento associado ao jogador. if regenEvent[cid] then stopEvent(regenEvent[cid]) -- Cancela o evento em execução. regenEvent[cid] = nil -- Remove o identificador para evitar uso futuro. end return TRUE end
  8. 1.Adicione um comando para escolher o Pokémon: Digamos que você adicione !choosepokemon para configurar o Pokémon que o jogador deseja derrotar. 2.Adapte a função resetDailyKill para usar essa escolha: function choosePokemon(cid, pokemonName) if isPlayer(cid) then local mode = killModes[(getCatchMode(cid))] local pokemons = mode.pokemons if table.contains(pokemons, pokemonName) then local count = math.random(getPlayerLevel(cid) * 2) local day = tostring(""..getNumberDay().."-"..getNumberMonth().."-"..getNumberYear().."") setPlayerStorageValue(cid, killModes.storage, "|"..getCatchMode(cid).."|"..day.."|"..pokemonName.."|false|"..count) setPlayerStorageValue(cid, killModes.storage2, -1) setPlayerStorageValue(cid, 24003, 0) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You have chosen: " .. pokemonName .. " as your daily kill target.") else doPlayerSendCancel(cid, "Invalid Pokémon. Choose from the list.") end end end 3.Implementar comando para escolha: function onSay(cid, words, param) if param == "" then doPlayerSendCancel(cid, "Use: !choosepokemon <pokemon_name>") return true end choosePokemon(cid, param:trim()) return true end
  9. Para o comando !sell: function onSay(cid, words, param) local config = { levelNeeded = 8, muteTime = 120, -- tempo em segundos storage = 7896 } if param == "" then doPlayerPopupFYI(cid, "Use: !sell itemName, price in GP") return true end local t = string.explode(param, ",") if not(t[1]) or not(t[2]) then doPlayerSendCancel(cid, "Command requires more than one parameter.") return true end if getPlayerLevel(cid) >= config.levelNeeded then if getPlayerStorageValue(cid, config.storage) == -1 then setPlayerStorageValue(cid, config.storage, os.time()) elseif getPlayerStorageValue(cid, config.storage) > os.time() then doPlayerSendCancel(cid, "You can only place one offer in " .. config.muteTime .. " seconds.") return true else local itemName = t[1]:trim() local price = tonumber(t[2]) if price <= 0 then doPlayerSendCancel(cid, "Invalid price.") return true end local itemId = getItemIdByName(itemName) if getPlayerItemCount(cid, itemId) > 0 then doBroadcastMessage("Player " .. getPlayerName(cid) .. " is selling " .. itemName .. " for " .. price .. " gold coins.") setPlayerStorageValue(cid, config.storage, (os.time() + config.muteTime)) else doPlayerSendCancel(cid, "You don't have the item '" .. itemName .. "' to sell.") end end else doPlayerSendCancel(cid, "Only players with level " .. config.levelNeeded .. " can broadcast an offer.") end return true end Para o comando !buy: function onSay(cid, words, param) local config = { levelNeeded = 8, muteTime = 120, storage = 7896 } if param == "" then doPlayerPopupFYI(cid, "Use: !buy itemName, price in GP") return true end local t = string.explode(param, ",") if not(t[1]) or not(t[2]) then doPlayerSendCancel(cid, "Command requires more than one parameter.") return true end if getPlayerLevel(cid) >= config.levelNeeded then if getPlayerStorageValue(cid, config.storage) == -1 then setPlayerStorageValue(cid, config.storage, os.time()) elseif getPlayerStorageValue(cid, config.storage) > os.time() then doPlayerSendCancel(cid, "You can only place one offer in " .. config.muteTime .. " seconds.") return true else local itemName = t[1]:trim() local price = tonumber(t[2]) if price <= 0 then doPlayerSendCancel(cid, "Invalid price.") return true end -- Logica de compra do item: verificar se algum jogador está vendendo o item -- e o preço condiz com a oferta. Se sim, retirar o item do vendedor e -- transferir para o comprador doBroadcastMessage("Player " .. getPlayerName(cid) .. " is buying " .. itemName .. " for " .. price .. " gold coins.") setPlayerStorageValue(cid, config.storage, (os.time() + config.muteTime)) end else doPlayerSendCancel(cid, "Only players with level " .. config.levelNeeded .. " can broadcast an offer.") end return true end
  10. -- Inicializar as tabelas globais para compras e vendas ativas activeBuys = activeBuys or {} activeSells = activeSells or {} -- Configuração local config = { validCurrencies = {9971, 2160, 2148, 2152, 2157, 2159}, -- Moedas válidas maxPrice = 1000000000, -- Preço máximo permitido } -- Função para verificar se uma moeda é válida local function isValidCurrency(currencyId) for _, validId in ipairs(config.validCurrencies) do if validId == currencyId then return true end end return false end -- Função para listar itens à venda function listItems(cid) if #activeSells == 0 then doPlayerSendCancel(cid, "No items are currently being sold.") return true end local message = "Items available for sale:\n" for i, sell in ipairs(activeSells) do message = message .. i .. ". " .. sell.itemName .. " (" .. sell.quantity .. "x) - Price: " .. sell.price .. " gold coins - Seller: " .. sell.seller .. "\n" end doPlayerPopupFYI(cid, message) return true end -- Função para comprar o item function buyItem(cid, itemName, quantity, price, currencyId, sellerName) -- Verificar se o item está à venda for i, sell in ipairs(activeSells) do if sell.itemName == itemName and sell.seller == sellerName then -- Calcular o preço total pelo número de itens local totalPrice = sell.price * quantity -- Verificar se o jogador tem moeda suficiente if getPlayerItemCount(cid, currencyId) < totalPrice then doPlayerSendCancel(cid, "You don't have enough currency to buy this item.") return true end -- Verificar se há quantidade suficiente do item if sell.quantity < quantity then doPlayerSendCancel(cid, "Not enough items in stock.") return true end -- Realizar a compra -- Remover o dinheiro do comprador doPlayerRemoveItem(cid, currencyId, totalPrice) -- Adicionar o item ao comprador doPlayerAddItem(cid, getItemIdByName(itemName), quantity) -- Atualizar a quantidade do item à venda activeSells[i].quantity = activeSells[i].quantity - quantity -- Informar ao jogador sobre a compra doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You have successfully bought " .. quantity .. "x " .. itemName .. " from " .. sellerName .. " for " .. totalPrice .. " currency.") -- Caso o item tenha acabado, remover a venda if activeSells[i].quantity <= 0 then table.remove(activeSells, i) end return true end end doPlayerSendCancel(cid, "Item not found in the market.") return true end -- Função para vender o item function sellItem(cid, itemName, quantity, price, currencyId) -- Verificar se o jogador tem o item suficiente local itemId = getItemIdByName(itemName) if itemId == 0 or getPlayerItemCount(cid, itemId) < quantity then doPlayerSendCancel(cid, "You don't have enough of the item '" .. itemName .. "' to sell.") return true end -- Remover os itens do inventário do vendedor doPlayerRemoveItem(cid, itemId, quantity) -- Registrar a venda table.insert(activeSells, { itemName = itemName, quantity = quantity, price = price, currencyId = currencyId, seller = getPlayerName(cid), }) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your item '" .. itemName .. "' has been listed for sale.") return true end -- Função principal para lidar com os comandos function onSay(cid, words, param) if words == "!sell" then if param == "" then doPlayerSendCancel(cid, "Use: !sell itemName, quantity, price, currencyId") return true end local t = string.explode(param, ",") if #t ~= 4 then doPlayerSendCancel(cid, "Invalid parameters. Use: !sell itemName, quantity, price, currencyId") return true end local itemName = t[1]:trim() local quantity = tonumber(t[2]) local price = tonumber(t[3]) local currencyId = tonumber(t[4]) -- Chama a função para vender o item return sellItem(cid, itemName, quantity, price, currencyId) elseif words == "!buy" then if param == "" then doPlayerSendCancel(cid, "Use: !buy itemName, quantity, price, ID's 9971 - 2160 - 2148 - 2152 - 2157 - 2159, sellerName") return true end -- Separar os parâmetros fornecidos local t = string.explode(param, ",") if #t ~= 5 then doPlayerSendCancel(cid, "Invalid parameters. Use: !buy itemName, quantity, price, ID's 9971 - 2160 - 2148 - 2152 - 2157 - 2159, sellerName") return true end local itemName = t[1]:trim() local quantity = tonumber(t[2]) local price = tonumber(t[3]) local currencyId = tonumber(t[4]) local sellerName = t[5]:trim() -- Chama a função para comprar o item return buyItem(cid, itemName, quantity, price, currencyId, sellerName) elseif words == "!list" then -- Exibe os itens à venda return listItems(cid) end return false end
  11. local UPGRADE_ITEM_ID = 5902 -- Item para ativar leech local LIFE_LEECH_INCREMENT = 1 -- Incremento de Life Leech local MANA_LEECH_INCREMENT = 1 -- Incremento de Mana Leech local MAX_LEECH_PERCENT = 100 -- Máximo de leech permitido function onUse(cid, item, fromPosition, itemEx, toPosition) if not isPlayer(cid) then return false end local weapon = getPlayerSlotItem(cid, CONST_SLOT_LEFT) if weapon.itemid == 0 then weapon = getPlayerSlotItem(cid, CONST_SLOT_RIGHT) end if weapon.itemid == 0 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, "You need to be holding a weapon to upgrade it.") return false end local currentLifeLeech = tonumber(getItemAttribute(weapon.uid, "lifeLeech")) or 0 local currentManaLeech = tonumber(getItemAttribute(weapon.uid, "manaLeech")) or 0 local newLifeLeech = math.min(currentLifeLeech + LIFE_LEECH_INCREMENT, MAX_LEECH_PERCENT) local newManaLeech = math.min(currentManaLeech + MANA_LEECH_INCREMENT, MAX_LEECH_PERCENT) doItemSetAttribute(weapon.uid, "lifeLeech", newLifeLeech) doItemSetAttribute(weapon.uid, "manaLeech", newManaLeech) local description = "This weapon now has " .. newLifeLeech .. "% Life Leech and " .. newManaLeech .. "% Mana Leech. The maximum is 100%." doItemSetAttribute(weapon.uid, "description", description) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your weapon has been upgraded with " .. newLifeLeech .. "% Life Leech and " .. newManaLeech .. "% Mana Leech.") local position = getCreaturePosition(cid) doSendAnimatedText(position, "+Leech!!!", 35) return true end Agora, configure o dano e o leech para funcionar sempre que a arma equipada atingir uma criatura. Este script pode ser adicionado ao creature scripts do servidor, ativando o leech no evento onAttack. Adicione este código no arquivo de creature scripts: function onAttack(cid, target) if not isPlayer(cid) or not isCreature(target) then return true end local weapon = getPlayerSlotItem(cid, CONST_SLOT_LEFT) if weapon.itemid == 0 then weapon = getPlayerSlotItem(cid, CONST_SLOT_RIGHT) end local lifeLeech = tonumber(getItemAttribute(weapon.uid, "lifeLeech")) or 0 local manaLeech = tonumber(getItemAttribute(weapon.uid, "manaLeech")) or 0 if lifeLeech > 0 or manaLeech > 0 then local damage = math.random(50, 150) -- Dano variável para cada ataque (ajuste conforme necessário) doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, -damage, -damage, CONST_ME_EXPLOSIONHIT) -- Calcula o leech local lifeSteal = math.floor((damage * lifeLeech) / 100) local manaSteal = math.floor((damage * manaLeech) / 100) doCreatureAddHealth(cid, lifeSteal) doPlayerAddMana(cid, manaSteal) -- Mensagem opcional para mostrar o leech doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Life Leech: " .. lifeSteal .. " | Mana Leech: " .. manaSteal) end return true end 2.Atualize o arquivo creaturescripts.xml para adicionar o novo script: <event type="attack" name="WeaponLeech" script="leechAttack.lua"/> 3.No arquivo login.lua, adicione uma linha para registrar o evento onAttack: registerCreatureEvent(cid, "WeaponLeech")
  12. local combat = Combat() combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) -- Tipo de dano físico para simular spear combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITAREA) -- Efeito visual combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SPEAR) -- Animação da spear arremessada -- Configurações de ricochete local bounceCount = 2 -- Número de ricochetes local bounceRange = 5 -- Alcance de cada ricochete function onCastSpell(creature, var) local target = creature:getTarget() -- Obtém o alvo principal if not target or target:getHealth() <= 0 then creature:sendCancelMessage("Você precisa de um alvo válido para essa magia!") return false end -- Confirma que o jogador está usando uma spear local weapon = creature:getSlotItem(CONST_SLOT_LEFT) if not weapon or weapon:getType():getName():lower() ~= "spear" then creature:sendCancelMessage("Você precisa estar usando uma spear para lançar esta magia.") return false end -- Aplica dano no alvo principal combat:execute(creature, var) -- Função para encontrar alvos adicionais para o ricochete local function getNearbyTarget(currentTarget, excludeList) local spectators = Game.getSpectators(currentTarget:getPosition(), false, true, bounceRange, bounceRange, bounceRange, bounceRange) for _, spectator in ipairs(spectators) do if spectator:isMonster() and spectator ~= currentTarget and not excludeList[spectator:getId()] then return spectator end end return nil end -- Aplica ricochete nos alvos próximos local ricochetTarget = target local excludeList = {[target:getId()] = true} for i = 1, bounceCount do ricochetTarget = getNearbyTarget(ricochetTarget, excludeList) if not ricochetTarget then break end -- Para o ricochete se não houver alvo próximo -- Atualiza a variável de alvo para o próximo ricochete local bounceVar = Position(ricochetTarget:getPosition()) combat:execute(creature, Variant(bounceVar)) -- Adiciona o alvo à lista de excluídos para não ser alvo novamente excludeList[ricochetTarget:getId()] = true end return true end
  13. El Rusher

    Canary 3.2.1 13.40

    local portalId, t = 25058, { ["glacius death"] = { message = "You have defeated Glacius Death!", config = { createPos = {}, -- O portal será criado onde o monstro morrer. toPos = {x = 32202, y = 31863, z = 13}, -- Posição onde o portal irá teleportar portalTime = 1, -- Duração do portal em minutos } }, } --------------------------------------------------------------------------------------- -- Fim da Configuração --------------------------------------------------------------------------------------- local function spectatorStartCountdown(time, position) local spectators = Game.getSpectators(position, false, false, 5, 5, 5, 5) if #spectators > 0 then for i = 1, #spectators do if time > 1 then spectators:say("" .. time .. "", TALKTYPE_MONSTER_SAY, false, spectators, position) else spectators:say("Time out!", TALKTYPE_MONSTER_SAY, false, spectators, position) break end end end local portal = Tile(position):getItemById(portalId) if portal then addEvent(spectatorStartCountdown, 1000, time - 1, position) end end local function removePortal(position) local portal = Tile(position):getItemById(portalId) if portal then portal:remove() end end local deathMonsterCreatePortal = CreatureEvent("deathMonsterCreatePortal") function deathMonsterCreatePortal.onDeath(creature, corpse, killer, mostDamageKiller) if not creature:isMonster() or creature:getMaster() then return true end -- Debug para ver se a criatura correta foi detectada print("A criatura morreu: " .. creature:getName()) local k = t[creature:getName():lower()] if not k then print("A criatura " .. creature:getName() .. " não está na lista de criação de portais.") return true end print("Criando portal para a criatura: " .. creature:getName()) local pos = creature:getPosition() local cPos = k.config.createPos if next(cPos) == nil then cPos = pos end if Tile(cPos):getItemById(portalId) then print("Portal já existente na posição: " .. cPos.x .. ", " .. cPos.y .. ", " .. cPos.z) return true end local item = Game.createItem(portalId, 1, cPos) if item:isTeleport() then item:setDestination(k.config.toPos) print("Portal criado com sucesso na posição: " .. cPos.x .. ", " .. cPos.y .. ", " .. cPos.z) else print("Erro ao criar o portal.") end local pt = k.config.portalTime addEvent(spectatorStartCountdown, 500, pt * 60, cPos) addEvent(removePortal, pt * 60 * 1000, cPos) return true end deathMonsterCreatePortal:type("death") deathMonsterCreatePortal:register() --------------------------------------------------------------------------------------- -- Registrar script onLogin --------------------------------------------------------------------------------------- local monsterDeathLogin = CreatureEvent("monsterDeathLogin") function monsterDeathLogin.onLogin(player) player:registerEvent("deathMonsterCreatePortal") return true end monsterDeathLogin:type("login") monsterDeathLogin:register() Ao matar o monstro glacius death, veja no console as mensagens de debug. Elas ajudarão a identificar se o problema está na identificação do monstro ou na criação do portal. Verifique se a posição do portal (onde o monstro morre) é adequada e acessível para criar o item. Certifique-se de que o portalId (25058) corresponde ao item do portal correto.
  14. El Rusher

    Canary 3.2.1 13.40

    local portalId, t = 25058, { ["glacius death"] = { message = "You have defeated Glacius Death!", config = { createPos = {}, -- O portal será criado onde o monstro morrer. toPos = {x = 32202, y = 31863, z = 13}, -- Posição onde o portal irá teleportar portalTime = 1, -- Duração do portal em minutos } }, } --------------------------------------------------------------------------------------- -- Fim da Configuração --------------------------------------------------------------------------------------- local function spectatorStartCountdown(time, position) local spectators = Game.getSpectators(position, false, false, 5, 5, 5, 5) if #spectators > 0 then for i = 1, #spectators do if time > 1 then spectators:say("" .. time .. "", TALKTYPE_MONSTER_SAY, false, spectators, position) else spectators:say("Time out!", TALKTYPE_MONSTER_SAY, false, spectators, position) break end end end local portal = Tile(position):getItemById(portalId) if portal then addEvent(spectatorStartCountdown, 1000, time - 1, position) end end local function removePortal(position) local portal = Tile(position):getItemById(portalId) if portal then portal:remove() end end local deathMonsterCreatePortal = CreatureEvent("deathMonsterCreatePortal") function deathMonsterCreatePortal.onDeath(creature, corpse, killer, mostDamageKiller) if not creature:isMonster() or creature:getMaster() then return true end local k = t[creature:getName():lower()] if not k then return true end local pos = creature:getPosition() local cPos = k.config.createPos if next(cPos) == nil then cPos = pos end if Tile(cPos):getItemById(portalId) then return true end local item = Game.createItem(portalId, 1, cPos) if item:isTeleport() then item:setDestination(k.config.toPos) end local pt = k.config.portalTime addEvent(spectatorStartCountdown, 500, pt * 60, cPos) addEvent(removePortal, pt * 60 * 1000, cPos) return true end deathMonsterCreatePortal:type("death") deathMonsterCreatePortal:register() --------------------------------------------------------------------------------------- -- Registrar script onLogin --------------------------------------------------------------------------------------- local monsterDeathLogin = CreatureEvent("monsterDeathLogin") function monsterDeathLogin.onLogin(player) player:registerEvent("deathMonsterCreatePortal") return true end monsterDeathLogin:type("login") monsterDeathLogin:register()
  15. El Rusher

    Sala Boss!

    Esse script define a dungeon na qual o jogador entrou e armazena essa informação na storage do player. Ele também teleporta o jogador para a posição inicial da dungeon.(Action 17003) function onUse(player, item, fromPosition, target, toPosition) local dungeonId = 1 -- ID da dungeon, altere conforme a dungeon específica local dungeonEntryPosition = Position(100, 100, 7) -- Defina a posição da entrada da dungeon (x, y, z) -- Armazena o ID da dungeon no storage do player player:setStorageValue(12345, dungeonId) -- 12345 é o storage para a dungeon atual -- Teleporta o player para a posição inicial da dungeon player:teleportTo(dungeonEntryPosition) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Você entrou na Dungeon " .. dungeonId .. ".") return true end Esse script verifica qual dungeon o jogador entrou, e com base nisso, ele spawna o boss correspondente à dungeon naquela sala, se ela estiver disponível. (Action 14400) function onUse(player, item, fromPosition, target, toPosition) local dungeonId = player:getStorageValue(12345) -- Recupera o ID da dungeon do player local bossPosition = Position(105, 105, 7) -- Posição onde o boss vai ser spawnado (x, y, z) local playerBossRoomPosition = Position(110, 110, 7) -- Posição para onde o player será teleportado na sala do boss local bossId -- Verifica se o jogador tem um dungeonId válido if dungeonId == -1 then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Você não entrou em nenhuma dungeon.") return false end -- Define o boss de acordo com o ID da dungeon if dungeonId == 1 then bossId = "Boss1" -- Nome do Boss 1 elseif dungeonId == 2 then bossId = "Boss2" -- Nome do Boss 2 elseif dungeonId == 3 then bossId = "Boss3" -- Nome do Boss 3 else player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Dungeon inválida.") return false end -- Checa se a sala do boss está disponível (sem criaturas) if not Tile(bossPosition):getTopCreature() then -- Spawna o boss na posição definida Game.createMonster(bossId, bossPosition) player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, bossId .. " apareceu!") -- Teleporta o player para a sala do boss player:teleportTo(playerBossRoomPosition) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) else player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "A sala do boss já está ocupada.") end return true end Explicação dos Scripts: Entrada na Dungeon (17003): Armazena o ID da dungeon na storage 12345 do player. Teleporta o player para a posição inicial da dungeon. Exibe uma mensagem informando que ele entrou na dungeon. Entrada na sala do Boss (14400): Verifica qual dungeon o jogador entrou usando o valor armazenado na storage 12345. Com base no ID da dungeon, seleciona o boss correto e tenta spawná-lo na sala do boss. Se a sala estiver disponível (sem criaturas), spawna o boss e teleporta o jogador para a sala. Se a sala estiver ocupada, exibe uma mensagem de erro. Modificações que você pode fazer: IDs de Dungeon e Boss: Altere os IDs das dungeons e os nomes dos bosses de acordo com o que você quiser. Posições: Ajuste as posições de entrada da dungeon, sala do boss, e local de teleporte para o que for necessário no seu mapa. Cooldown ou reset: Se precisar de um cooldown para respawnar o boss ou resetar a sala, esse sistema pode ser facilmente estendido.
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...