Ir para conteúdo

El Rusher

Cavaleiro
  • Total de itens

    174
  • Registro em

  • Última visita

  • Dias Ganhos

    20

Tudo que El Rusher postou

  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.
  16. podemos remover a parte do código que está verificando e consumindo o item de aprimoramento e ajustar o cálculo do dano para depender exclusivamente do nível de lifeLeech do item. local LIFE_LEECH_INCREMENT = 10 -- Porcentagem a ser adicionada ao Life Leech a cada uso local MANA_LEECH_INCREMENT = 10 -- Porcentagem a ser adicionada ao Mana Leech a cada uso local MAX_LEECH_PERCENT = 100 -- Limite máximo para Life Leech e Mana Leech local BASE_DAMAGE = 100000000000 -- Dano base da arma local STORAGE_KEY = 10000 -- Chave de armazenamento para o nível de aprimoramento function onUse(cid, item, fromPosition, itemEx, toPosition) -- Verifica se o jogador é válido if not isPlayer(cid) then return false end -- Obtém a arma que o jogador está segurando (mão esquerda ou direita) local weapon = getPlayerSlotItem(cid, CONST_SLOT_LEFT) if weapon.itemid == 0 then weapon = getPlayerSlotItem(cid, CONST_SLOT_RIGHT) end -- Verifica se o jogador está segurando uma arma if weapon.itemid == 0 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, "Você precisa estar segurando uma arma para aprimorá-la.") return false end -- Obtém os valores atuais de Life Leech e Mana Leech (se existirem) local currentLifeLeech = tonumber(getItemAttribute(weapon.uid, "lifeLeech")) or 0 local currentManaLeech = tonumber(getItemAttribute(weapon.uid, "manaLeech")) or 0 -- Acumula novos valores de leech, limitados pelo máximo local newLifeLeech = math.min(currentLifeLeech + LIFE_LEECH_INCREMENT, MAX_LEECH_PERCENT) local newManaLeech = math.min(currentManaLeech + MANA_LEECH_INCREMENT, MAX_LEECH_PERCENT) -- Aplica os novos valores de Life Leech e Mana Leech à arma doItemSetAttribute(weapon.uid, "lifeLeech", newLifeLeech) doItemSetAttribute(weapon.uid, "manaLeech", newManaLeech) -- Modifica a descrição da arma para exibir os novos valores de leech local description = getItemAttribute(weapon.uid, "description") or "" description = "Esta arma agora tem " .. newLifeLeech .. "% de Life Leech e " .. newManaLeech .. "% de Mana Leech. O máximo é 100%." doItemSetAttribute(weapon.uid, "description", description) -- Envia uma mensagem para o jogador informando sobre o aprimoramento doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Sua arma foi aprimorada! Agora tem " .. newLifeLeech .. "% de Life Leech e " .. newManaLeech .. "% de Mana Leech. O máximo é 100%.") -- Exibe um texto animado "+Leech!!!" em verde (cor 35) local position = getCreaturePosition(cid) doSendAnimatedText(position, "+Leech!!!", 35) -- Armazena o novo nível de aprimoramento da arma setPlayerStorageValue(cid, STORAGE_KEY, newLifeLeech) -- Obtém o alvo atual do jogador local target = getCreatureTarget(cid) -- Verifica se há um alvo válido if isCreature(target) then -- Calcula o dano proporcional ao nível de aprimoramento da arma local damage = (newLifeLeech / 100) * BASE_DAMAGE -- Dano proporcional ao nível de leech doTargetCombatHealth(cid, target, COMBAT_UNDEFINEDDAMAGE, -damage, -damage, CONST_ME_HITAREA) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você realizou um ataque poderoso com sua arma aprimorada! Causou " .. damage .. " de dano.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, "Você não tem um alvo válido para atacar.") end return true end
  17. local LEACH_WEAPON_STORAGE = 47892 -- Armazenamento para a arma sanguessuga local FIXED_DAMAGE = 100000000000 -- Um valor de dano razoável local LEECH_PERCENT = 100 -- Porcentagem de sanguessuga para vida e mana local MAX_LEECH = 100 -- Máximo de 100% de sanguessuga para evitar sobrepujar -- Função para calcular e aplicar sanguessuga function applyLeech(cid, target, damage) -- Verifica se o alvo é uma criatura válida e se o jogador tem habilidade de sanguessuga if not isCreature(target) or getPlayerStorageValue(cid, LEACH_WEAPON_STORAGE) <= 0 then return end -- Garante que o valor do dano seja razoável if damage <= 0 then return end -- Calcula as quantidades de sanguessuga local lifeLeech = math.floor(damage * math.min(LEECH_PERCENT, MAX_LEECH) / 100) local manaLeech = math.floor(damage * math.min(LEECH_PERCENT, MAX_LEECH) / 100) -- Aplica sanguessuga à saúde e mana do jogador doCreatureAddHealth(cid, lifeLeech) doCreatureAddMana(cid, manaLeech) -- Envia efeito e feedback ao jogador doSendMagicEffect(getCreaturePosition(cid), CONST_ME_MAGIC_BLUE) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você sugou " .. lifeLeech .. " saúde e " .. manaLeech .. " mana.") end -- Função principal de combate function onCombat(cid, target) -- Aplica um valor de dano fixo local fixedDamage = FIXED_DAMAGE -- Causa dano fixo ao alvo if isCreature(target) then doTargetCombatHealth(cid, target, COMBAT_UNDEFINEDDAMAGE, -fixedDamage, -fixedDamage, CONST_ME_FIREATTACK) -- Aplica sanguessuga com base no dano fixo causado applyLeech(cid, target, fixedDamage) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, "Você não tem um alvo válido para atacar.") end return true end Correções: A função applyLeech não chama recursivamente a si mesma, prevenindo assim o erro de overflow. Certificamos que o alvo seja válido e que o dano aplicado seja positivo antes de proceder com o cálculo de leech.
  18. local UPGRADE_ITEM_ID = 5902 -- O item de melhoria, ex: "spooky blue eye" local LIFE_LEECH_INCREMENT = 1 -- Porcentagem a ser adicionada ao Life Leech local MANA_LEECH_INCREMENT = 1 -- Porcentagem a ser adicionada ao Mana Leech local MAX_LEECH_PERCENT = 100 -- Limite máximo para Life Leech e Mana Leech local FIXED_DAMAGE = 100000000 -- Dano fixo que será causado à criatura e ao jogador function onUse(cid, item, fromPosition, itemEx, toPosition) -- Verifica se o jogador é válido if not isPlayer(cid) then return false end -- Obtém a arma que o jogador está segurando (mão esquerda ou direita) local weapon = getPlayerSlotItem(cid, CONST_SLOT_LEFT) if weapon.itemid == 0 then weapon = getPlayerSlotItem(cid, CONST_SLOT_RIGHT) end -- Verifica se o jogador está segurando uma arma if weapon.itemid == 0 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, "Você precisa estar segurando uma arma para melhorá-la.") return false end -- Obtém os valores atuais de Life Leech e Mana Leech (se houver) local currentLifeLeech = tonumber(getItemAttribute(weapon.uid, "lifeLeech")) or 0 local currentManaLeech = tonumber(getItemAttribute(weapon.uid, "manaLeech")) or 0 -- Acumula novos valores de leech local newLifeLeech = math.min(currentLifeLeech + LIFE_LEECH_INCREMENT, MAX_LEECH_PERCENT) local newManaLeech = math.min(currentManaLeech + MANA_LEECH_INCREMENT, MAX_LEECH_PERCENT) -- Aplica os novos valores de Life Leech e Mana Leech à arma doItemSetAttribute(weapon.uid, "lifeLeech", newLifeLeech) doItemSetAttribute(weapon.uid, "manaLeech", newManaLeech) -- Modifica a descrição da arma para mostrar os novos valores de leech local description = getItemAttribute(weapon.uid, "description") or "" description = "Esta arma agora tem " .. newLifeLeech .. "% de Life Leech e " .. newManaLeech .. "% de Mana Leech." doItemSetAttribute(weapon.uid, "description", description) -- Mensagens e efeitos doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Sua arma foi melhorada! Agora ela tem " .. newLifeLeech .. "% de Life Leech e " .. newManaLeech .. "% de Mana Leech.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_FIREATTACK) -- Exibe texto animado local position = getCreaturePosition(cid) -- Define a posição para o texto animado doSendAnimatedText(position, "+Leech", 35) -- Exibe o texto animado com a cor 35 (verde) -- Remove o item de melhoria doRemoveItem(item.uid, 1) -- Verifica se o jogador tem mana suficiente local maxMana = getCreatureMaxMana(cid) if getCreatureMana(cid) < maxMana then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você não tem mana suficiente para realizar o ataque!") return false end -- Obtém o alvo e verifica se é válido local target = getCreatureTarget(cid) if not isCreature(target) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, "Você não tem um alvo válido para atacar.") return false end -- Causa dano fixo à criatura alvo doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, -FIXED_DAMAGE, -FIXED_DAMAGE, CONST_ME_SOUND_WHITE) -- Reduz a mana do jogador doCreatureAddMana(cid, -maxMana) -- Envia uma mensagem sobre o ataque doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você usou toda sua mana para atacar! Dano causado: " .. FIXED_DAMAGE .. " ao seu alvo.") return true end Reduzi o valor de FIXED_DAMAGE para um número mais razoável (100000000). Coloquei as verificações de alvo e mana no lugar correto para evitar erros de execução. Simplifiquei o sistema de dano e remoção de mana para ser mais direto, garantindo que as operações funcionem como esperado. Teste o script novamente com essas modificações para ver se ele resolve o problema de não causar dano.
  19. Soul System: ok!, action: ok!, auras: ok!, creaturescript: ok!, soul: ok! conclusao: Certifique-se de que o item que você está tentando encantar está listado em L_Soul.enchant.weapons. Cada item deve ter o ID correto correspondente. Atributos do Item: Verifique se os atributos como "Soul" estão sendo corretamente definidos no item durante o processo de encantamento. Pode haver um problema de manipulação de atributos. Tipos de Danos e Efeitos: Confira se os tipos de danos e efeitos estão definidos corretamente em L_Soul.souls para garantir que o encantamento aplique o efeito esperado. Garanta que as funções externas, como L_Soul.souls, L_Soul.creatures, L_Soul.lang, e L_Soul.language, estejam devidamente carregadas e acessíveis.
  20. Esse erro indica que o sistema está tentando executar a função onUse, mas não consegue encontrá-la corretamente.. Verifique a função onUse: Certifique-se de que a função onUse está corretamente definida no seu arquivo scripts/water action.lua. Deve estar assim: function onUse(player, item, fromPosition, target, toPosition, isHotkey) -- Seu código aqui return true end Verifique a configuração do arquivo actions.xml: No arquivo actions.xml (localizado na pasta data/actions), certifique-se de que o caminho para o script está correto. Deve parecer algo como: <action itemid="XXXX" script="water action.lua"/> Certifique-se de que o script está na pasta correta: Verifique se o arquivo water action.lua está realmente localizado na pasta scripts dentro de data/actions.
  21. esse login e senha geralmente fica em baixo ou atras do seu roteador, caso nao tiver, solicite a provedora da sua internet
  22. Procure o arquivo CSS do seu site: Normalmente, o arquivo CSS está na pasta layouts, css, ou styles do seu site. O nome do arquivo pode ser algo como styles.css, main.css, ou similar. Abra o arquivo CSS e localize a seção correspondente ao Highscore Box: Use um editor de texto (como Notepad++ ou VSCode) e procure por classes ou IDs relacionados ao Highscore Box, como .highscore, #highscore, ou algo similar. Ajuste a fonte: Adicione ou modifique a propriedade font-family. Por exemplo: .highscore { font-family: Arial, sans-serif; /* Ou a fonte de sua preferência */ }
  23. -- kills.lua function onSay(cid, words, param) if not isPlayer(cid) then return false end -- Obtém o GUID do jogador local playerGUID = getPlayerGUID(cid) local resultId = db.storeQuery("SELECT unjustified_frags_day, unjustified_frags_week, unjustified_frags_month FROM player_kills WHERE player_id = " .. playerGUID) if resultId ~= false then -- Recupera os frags injustificados local unjustifiedKillsDay = result.getDataInt(resultId, "unjustified_frags_day") or 0 local unjustifiedKillsWeek = result.getDataInt(resultId, "unjustified_frags_week") or 0 local unjustifiedKillsMonth = result.getDataInt(resultId, "unjustified_frags_month") or 0 -- Configuração de quantos frags são necessários para obter red skull ou ban local dailyFragLimit = getConfigValue("dailyFragsToRedSkull") or 3 local weeklyFragLimit = getConfigValue("weeklyFragsToRedSkull") or 5 local monthlyFragLimit = getConfigValue("monthlyFragsToRedSkull") or 10 -- Envia as informações ao jogador doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você tem " .. unjustifiedKillsDay .. " mortes injustificadas nas últimas 24 horas.") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você tem " .. unjustifiedKillsWeek .. " mortes injustificadas nos últimos 7 dias.") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você tem " .. unjustifiedKillsMonth .. " mortes injustificadas nos últimos 30 dias.") -- Informar se está perto de obter red skull ou ban if unjustifiedKillsDay >= dailyFragLimit or unjustifiedKillsWeek >= weeklyFragLimit or unjustifiedKillsMonth >= monthlyFragLimit then doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Cuidado! Você está próximo de obter uma Red Skull ou ser banido!") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você ainda está seguro, mas continue atento às suas mortes injustificadas.") end result.free(resultId) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Não foi possível recuperar suas mortes injustificadas.") end return true end Certifique-se de que o banco de dados contém as colunas unjustified_frags_day, unjustified_frags_week e unjustified_frags_month na tabela player_kills. Além disso, ajuste os valores de configuração dailyFragsToRedSkull, weeklyFragsToRedSkull, e monthlyFragsToRedSkull para se alinhar ao que você deseja no arquivo de configuração do servidor.
  24. em data/actions/scripts/water_action.lua: local waterOutfit = {lookType = 134} -- ID da outfit para o navio local originalVoc = 1 -- Vocação original que o player retorna ao sair da água function onStepIn(creature, item, position, fromPosition) local player = creature:getPlayer() if not player then return true end -- Verifica se o jogador já está na outfit de navio if player:getOutfit().lookType ~= waterOutfit.lookType then player:setStorageValue(12345, player:getVocation():getId()) -- Salva a vocação original do jogador player:setOutfit(waterOutfit) -- Altera para a outfit de navio player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Você entrou na água e agora está em modo de navegação!") end return true end function onStepOut(creature, item, position, fromPosition) local player = creature:getPlayer() if not player then return true end local originalVocationId = player:getStorageValue(12345) if originalVocationId > 0 then player:setVocation(Vocation(originalVocationId)) -- Retorna à vocação original player:setOutfit({lookType = player:getSex() == PLAYERSEX_FEMALE and 136 or 128}) -- Outfit padrão baseado no sexo do jogador player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Você saiu da água e voltou ao modo normal.") end return true end Adicione o seguinte ao seu arquivo actions.xml que fica em data/actions/actions.xml: <action actionid="1001" script="water_action.lua"/> No seu editor de mapas, configure os tiles da área de água que o jogador vai entrar para a ActionID 1001. Observações A waterOutfit pode ser alterada para qualquer ID de outfit que você deseja usar para o "modo navio". Lembre-se de ajustar os IDs de acordo com as vocações e outfits que você quer utilizar. Ao pisar na água, a outfit do jogador mudará, e ao sair, ele retornará à sua vocação e outfit originais. Isso deve lhe dar uma base para começar a implementar a funcionalidade de navegação que você deseja!
  25. 1. Criar um comando para CTRL + Z (reportar bugs) No TFS, crie um comando que simule a função de CTRL + Z, que vai gerar um arquivo de log específico para bugs. Arquivo: talkactions/scripts/report_bug.lua function onSay(player, words, param) local reportText = param if reportText == "" then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Você precisa especificar um relatório de bug.") return false end local file = io.open("data/logs/bug_reports.log", "a") file:write("Player: " .. player:getName() .. " reported: " .. reportText .. "\n") file:close() player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Bug reportado com sucesso.") return true end 2. Criar um comando para CTRL + J (log de players) Em seguida, crie um comando que simule a função de CTRL + J, para criar logs de atividades de jogadores. Arquivo: talkactions/scripts/log_player.lua function onSay(player, words, param) local logMessage = param if logMessage == "" then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Você precisa especificar o log.") return false end local file = io.open("data/logs/player_logs.log", "a") file:write("Player: " .. player:getName() .. " log message: " .. logMessage .. "\n") file:close() player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Log gravado com sucesso.") return true end 3. Configurar talkactions.xml Agora, adicione os comandos ctrlz e ctrlj no arquivo talkactions.xml para associar os scripts que você criou: Arquivo: talkactions.xml <talkaction words="/ctrlz" script="report_bug.lua"/> <talkaction words="/ctrlj" script="log_player.lua"/> 4. Como Usar Para reportar um bug (equivalente ao CTRL + Z), o jogador digita no chat: /ctrlz [descrição do bug] Para registrar um log de jogador (equivalente ao CTRL + J), o jogador digita no chat: /ctrlj [mensagem de log]
  • Quem Está Navegando   0 membros estão online

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