Ir para conteúdo

Muvukaa

Membro
  • Registro em

  • Última visita

Tudo que Muvukaa postou

  1. O Windows requer C++ ou Lua 0.3.6 8.60 A cada 1 hora ou 60 segundos Limpar log MENUITEM "&Limpar log", ID_MENU_MAIN_CLEARLOG eu quero sistema que limpe log a cada 1 minuto pode ser globalevents onThink ou pela SOURCE
  2. IMORTALIDADE local config = { storage = 13546, effect1 = 2 --- efeito ao ser atacado estando invulnerável } function onStatsChange(cid, attacker, type, combat, value) if value >= 1 and (type == STATSCHANGE_HEALTHLOSS or (getCreatureCondition(cid, CONDITION_MANASHIELD) and type == STATSCHANGE_MANALOSS)) then if getPlayerStorageValue(cid,config.storage) - os.time() > 0 and isCreature(attacker) then doSendMagicEffect(getCreaturePosition(cid), config.effect1) doSendAnimatedText(getCreaturePosition(cid), "0", 180) return false end end return true end CREATURESCRIPT REFLECTION function onLogin(cid) -- Verificar se o Reflection ainda está ativo if getPlayerStorageValue(cid, 12789) > os.time() then -- Registrar o evento statschange novamente registerCreatureEvent(cid, "Reflection/statschange") else -- Remover o armazenamento caso o efeito tenha expirado setPlayerStorageValue(cid, 12789, -1) end return true end IMORTALIDADE local config = { storage = 13546, cooldown = 3, --- tempo entre um uso e outro duration = 86400, --- duração effect1 = 26 -- efeito que sai ao falar a spell } function onCastSpell(cid, var) if getPlayerStorageValue(cid, 13546) < 1 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Você precisa ser DONATE para usar esta Magia.") doSendMagicEffect(getThingPos(cid), 2) return true end if os.time() - getPlayerStorageValue(cid, 13546) >= config.cooldown then setPlayerStorageValue(cid, 13546, os.time()) doSendMagicEffect(getCreaturePosition(cid), config.effect1) setPlayerStorageValue(cid, config.storage, os.time() + config.duration) doCreatureSay(cid,"24 HORAS DE INVENCIBILIDADE!!!", 19) doPlayerSendTextMessage(cid, 26, "You have now ".. config.duration .." seconds of invulnerability.") else doPlayerSendCancel(cid, "Your skill is in cooldown, you must wait "..(config.cooldown - (os.time() - getPlayerStorageValue(cid, 13546))).." seconds.") return false end return true end REFLECTION function onCastSpell(cid, var) -- Check if the player has the required storage for the spell if getPlayerStorageValue(cid, 12789) < 1 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You need storage spell donate.") doSendMagicEffect(getThingPosition(cid), CONST_ME_POFF) return false end -- Register the statschange event registerCreatureEvent(cid, "Reflection/statschange") -- Registers the statschange event -- Set the duration for the Reflection effect (24 hours) setPlayerStorageValue(cid, 12789, os.time() + 86400) -- Sets the duration (24 hours) -- Apply the visual effect doSendMagicEffect(getThingPosition(cid), CONST_ME_HOLYDAMAGE) -- Inform the player that they have gained the Reflection effect doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, "You have 24 hours of Reflection.") return true end
  3. EU USO TFS 0.3.6 ESSE SISTEMA NÃO PEGA NESSA VERÇÃO. const Item* rightItem = inventory[SLOT_RIGHT]; WeaponType_t type = item->getWeaponType(), rightType = rightItem->getWeaponType(); if(rightItem->getSlotPosition() & SLOTP_TWO_HAND) ret = RET_DROPTWOHANDEDITEM; else if(item == rightItem && count == item->getItemCount()) ret = RET_NOERROR; else if(rightType == WEAPON_SHIELD && type == WEAPON_SHIELD) ret = RET_CANONLYUSEONESHIELD; else if(!rightItem->isWeapon() || !item->isWeapon() || rightType == WEAPON_SHIELD || rightType == WEAPON_AMMO || type == WEAPON_SHIELD || type == WEAPON_AMMO) ret = RET_NOERROR; else ret = RET_CANONLYUSEONEWEAPON; const Item* leftItem = inventory[SLOT_LEFT]; WeaponType_t type = item->getWeaponType(), leftType = leftItem->getWeaponType(); if(leftItem->getSlotPosition() & SLOTP_TWO_HAND) ret = RET_DROPTWOHANDEDITEM; else if(item == leftItem && count == item->getItemCount()) ret = RET_NOERROR; else if(leftType == WEAPON_SHIELD && type == WEAPON_SHIELD) ret = RET_CANONLYUSEONESHIELD; else if(!leftItem->isWeapon() || !item->isWeapon() || leftType == WEAPON_SHIELD || leftType == WEAPON_AMMO || type == WEAPON_SHIELD || type == WEAPON_AMMO) ret = RET_NOERROR; else ret = RET_CANONLYUSEONEWEAPON; Player.cpp: https://pastebin.com/xdGg6zj0 Ele só calcula o dano de uma arma não calcula nas duas e o shield tambémsó calcula uma sword esse ---> só calcula 1 shield
  4. C++ TFS 0.3.6 - TIBIA - 8.60 - COMO USO ARMAS E ESCUDOS NAS DUAS MÃOS.
  5. TFS 0.3.6 - 8.60 Eu queria clean console script limpa concole semprecisa da clean com mause.
  6. adminLogsEnabled = true displayPlayersLogging = true prefixChannelLogs = "" runFile = "" outLogName = "" errorLogName = "" truncateLogsOnStartup = false -D__ENABLE_SERVER_LOGS__ -D__GUI_LOGS__ Já Adicionei Essas Flag Pra Compila Mais Mesmo Assim eu Aperto CTRL +Z ou CTRL + J Reporto Mais Não Aparece Nada Nos na Pasta Logs adminLogsEnabled = true displayPlayersLogging = true prefixChannelLogs = "" runFile = "logs/run.log" outLogName = "logs/out.log" errorLogName = "logs/error.logs" truncateLogsOnStartup = false Mais não Funciona
  7. Poção Bônus: 0%. aumenta a cura de poções para 1000000000 Alguém tem o código? local configPotion = { effectOnUse = 61, -- Efeito visual ao usar o item maxPotionBoost = 100, -- Máximo de aumento no efeito das potions (%) storagePotionBoost = 14786, -- Storage para rastrear o aumento boostPerUse = 1, -- Aumento percentual por uso itemId = 5879, -- ID do item usado para aumentar o boost potionIds = {7591, 8704, 7588, 7589, 7620, 7618, 8473, 8472, 7590} -- IDs das potions afetadas }
  8. [TFS 0.3.6 - 8.60] - COMO DEIXO AUTOMAP FORMATO .map COMPLETO PRO MEU OTSERV
  9. Olha Como o Meu Tá e Não ta Funcionando Olha Mapa: ONDE EU TO É A POS: x266 y233 z15 <action actionid="4725" script="roulette.lua"/> <action actionid="4571" script="roulette.lua"/> <action actionid="4545" script="roulette.lua"/> <action actionid="4478" script="roulette.lua"/> --[[ ================================================================================ = ROULETTE SYSTEM FOR TFS = = = = Author: Neutras = = Version: 2.1 = = Description: Gacha-style roulette system with dynamic speed mechanics = = and multi-key feature. = = = = Features: = = - Multi-key support (1-4 keys per spin). = = - Dynamic speed animation with configurable initial and final speeds. = = - Persistent "Winner Slot" effects and animated texts. = = - Configurable rewards with reroll chances. = = - Logging system to track player rewards. = = = = Compatible with TFS 0.3.7 (Tibia 8.6). = ================================================================================ --]] --[[ ================================================================================ = ROULETTE SYSTEM FOR TFS = = = = Author: Neutras = = Version: 2.1 = = Description: Gacha-style roulette system with dynamic speed mechanics = = and multi-key feature. = = = = Features: = = - Multi-key support (1-4 keys per spin). = = - Dynamic speed animation with configurable initial and final speeds. = = - Persistent "Winner Slot" effects and animated texts. = = - Configurable rewards with reroll chances. = = - Logging system to track player rewards. = = = = Compatible with TFS 0.3.7 (Tibia 8.6). = ================================================================================ --]] -- ================= LOGGING SYSTEM ================= -- local logPath = "data/logs/" local logFileName = "roulette.log" -- Logs player rewards to a file. -- @param cid: Player ID. -- @param keyName: Name of the key used. -- @param items: Table of items won. -- @param keyCount: Number of keys used. local function logEntry(cid, keyName, items, keyCount) local file = io.open(logPath .. logFileName, "a") if file then local itemStrings = {} for _, item in ipairs(items) do table.insert(itemStrings, string.format("x%d %s", item.count, getItemNameById(item.id))) end file:write(string.format("[%s] %s used %d '%s' and won: %s\n", os.date("%Y-%m-%d %H:%M:%S"), getPlayerName(cid), keyCount, keyName, table.concat(itemStrings, ", "))) file:close() end end -- ================= BASE CONFIGURATION ================= -- -- Levers Action IDs to key item IDs. local keyByAid = { [1354] = 9971, -- Key for reward level 1 (Copper) [1355] = 9972, -- Key for reward level 2 (Silver) [1356] = 9973 -- Key for reward level 3 (Golden) } -- Levers Action IDs to reward levels. local rewardByAid = { [1354] = 1, -- Reward level 1 (Copper) [1355] = 2, -- Reward level 2 (Silver) [1356] = 3 -- Reward level 3 (Golden) } -- Relative positions of the slots in the roulette. local rouletteSpinOffset = { {1, -4}, {2, -4}, {3, -4}, {3, -3}, {4, -3}, {4, -2}, {4, -1}, {5, -1}, {5, 0}, {5, 1}, {4, 1}, {4, 2}, {4, 3}, {3, 3}, {3, 4}, {2, 4}, {1, 4}, {0, 4}, {-1, 4}, {-2, 4}, {-3, 4}, {-3, 3}, {-4, 3}, {-4, 2}, {-4, 1}, {-5, 1}, {-5, 0}, {-5, -1},{-4, -1},{-4, -2}, {-4, -3},{-3, -3},{-3, -4},{-2, -4},{-1, -4}, {0, -4} } -- ================= MAIN CONFIGURATION ================= -- local config = { rouletteCD = 30, -- Global cooldown in seconds. globalStoCd = 22600, -- Storage ID for cooldown. globalStoKeyCount = 22601, -- Storage ID for key count. maxLoops = 100, -- Maximum iterations per spin. initialSpeed = 50, -- Initial speed in milliseconds. finalSpeed = 400, -- Final speed in milliseconds. effectLever = 35, -- Effect when activating the lever. effectRewardPlayer = 28, -- Effect on the player when winning. effectReward = 28, -- Effect on the winning slot. -- Reward table by level. -- Formula: Real Probability = (Item Chance / Total Chances) * (1 - (Reroll % / 100)) items = { [1] = { {id = 4871, chance = 100, count = 1}, }, [2] = { {id = 4872, chance = 100, count = 1}, }, [3] = { {id = 4870, chance = 100, count = 1}, }, [4] = { {id = 5899, chance = 100, count = 1}, }, [5] = { {id = 2349, chance = 100, count = 1}, }, [6] = { {id = 9003, chance = 100, count = 1}, }, [7] = { {id = 2300, chance = 100, count = 1}, }, [8] = { {id = 2309, chance = 100, count = 1}, }, [9] = { {id = 2272, chance = 100, count = 1}, }, [10] = { {id = 2306, chance = 100, count = 1}, }, [11] = { {id = 2447, chance = 100, count = 1}, }, [12] = { {id = 7739, chance = 100, count = 1}, }, [13] = { {id = 7737, chance = 100, count = 1}, }, [14] = { {id = 5805, chance = 100, count = 1}, }, [15] = { {id = 2446, chance = 100, count = 1} } } } -- ================= PROBABILITY CACHING ================= -- -- Precalculates cumulative probabilities for each reward level. local cumulativeChanceCache = {} for rewardId, items in pairs(config.items) do local total = 0 local cumulative = {} for _, item in ipairs(items) do total = total + item.chance table.insert(cumulative, {item = item, threshold = total}) end cumulativeChanceCache[rewardId] = {total = total, items = cumulative} end -- ================= UTILITY FUNCTIONS ================= -- -- Calculates the speed of the roulette animation based on progress. -- @param progress: Current progress (0 to 1). -- @return: Speed in milliseconds. local function calculateSpeed(progress) return config.initialSpeed + (config.finalSpeed - config.initialSpeed) * progress^3 end -- Selects a random item from the reward table, considering reroll chances. -- @param rewardId: Reward level ID. -- @return: Selected item. local function chooseRouletteItem(rewardId) local cache = cumulativeChanceCache[rewardId] local roll = math.random(cache.total) for _, entry in ipairs(cache.items) do if roll <= entry.threshold then if entry.item.porc_cambio and math.random(100) <= entry.item.porc_cambio then return chooseRouletteItem(rewardId) end return entry.item end end return cache.items[#cache.items].item end -- Rotates the slots in the roulette. -- @param slots: Table of slots. local function rotateSlots(slots) local last = slots[36] for i = 36, 2, -1 do slots[i] = slots[i-1] end slots[1] = last end -- Updates the visual display of the roulette. -- @param cpos: Center position of the roulette. -- @param slots: Table of slots. -- @param isFillingPhase: Whether the slots are being filled for the first time. local function updateRouletteDisplay(cpos, slots, isFillingPhase) for i = 1, 36 do local pos = { x = cpos.x + rouletteSpinOffset[i][1], y = cpos.y + rouletteSpinOffset[i][2], z = cpos.z } doCleanTile(pos) if slots[i] then doCreateItem(slots[i].id, slots[i].count, pos) -- Show puff effect only during the initial filling phase. if isFillingPhase then doSendMagicEffect(pos, 14) end end end end -- ================= WINNER SLOTS AND EFFECTS ================= -- -- Shows "Winner Slot" animated text on winning slots. -- @param cpos: Center position of the roulette. -- @param keyCount: Number of keys used. local function showWinnerSlots(cpos, keyCount) local winningSlots = {} if keyCount == 1 then winningSlots = {36} elseif keyCount == 2 then winningSlots = {36, 18} elseif keyCount == 3 then winningSlots = {36, 18, 9} elseif keyCount == 4 then winningSlots = {36, 18, 9, 27} else winningSlots = {36} -- Default to one winning slot if keyCount is invalid. end for _, slot in ipairs(winningSlots) do local pos = { x = cpos.x + rouletteSpinOffset[slot][1], y = cpos.y + rouletteSpinOffset[slot][2], z = cpos.z } doSendAnimatedText(pos, "Winner", TEXTCOLOR_YELLOW) end end -- Shows the number of keys in use. -- @param cpos: Center position of the roulette. local function showKeyCount(cpos) local keyCount = getGlobalStorageValue(config.globalStoKeyCount) keyCount = (keyCount < 1 or keyCount > 4) and 1 or keyCount local pos = {x = 266, y = 233, z = 15} doSendAnimatedText(pos, string.format("Keys: %d", keyCount), TEXTCOLOR_LIGHTBLUE) end -- ================= MAIN ROULETTE LOGIC ================= -- -- Main animation function, recursively called to simulate the roulette spin. -- @param cid: Player ID. -- @param cpos: Center position of the roulette. -- @param rewardId: ID of the reward level. -- @param nloop: Current iteration number. -- @param slots: Table of slots (items). -- @param keyName: Name of the key used. -- @param keyCount: Number of keys used. local function shuffle(cid, cpos, rewardId, nloop, slots, keyName, keyCount) if nloop > config.maxLoops then if isPlayer(cid) then -- Determine winning slots based on the number of keys used. local winningSlots = {} if keyCount == 1 then winningSlots = {36} elseif keyCount == 2 then winningSlots = {36, 18} elseif keyCount == 3 then winningSlots = {36, 18, 9} elseif keyCount == 4 then winningSlots = {36, 18, 9, 27} else winningSlots = {36} -- Default to one winning slot if keyCount is invalid. end -- Get the winning items and their positions. local wonItems = {} local winPositions = {} for _, slot in ipairs(winningSlots) do if slots[slot] then table.insert(wonItems, slots[slot]) local pos = { x = cpos.x + rouletteSpinOffset[slot][1], y = cpos.y + rouletteSpinOffset[slot][2], z = cpos.z } table.insert(winPositions, pos) end end -- Award the items and display visual effects. if #wonItems > 0 then for _, pos in ipairs(winPositions) do doSendAnimatedText(pos, "Winner Slot", TEXTCOLOR_YELLOW) doSendMagicEffect(pos, config.effectReward) end for _, item in ipairs(wonItems) do doPlayerAddItem(cid, item.id, item.count) end doSendMagicEffect(getCreaturePosition(cid), config.effectRewardPlayer) -- Display a message to the player with all the rewards. local itemList = {} for _, item in ipairs(wonItems) do table.insert(itemList, string.format("x%d %s", item.count, getItemNameById(item.id))) end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[ROULETTE] You won: " .. table.concat(itemList, ", ")) -- Log the player's rewards. logEntry(cid, keyName, wonItems, keyCount) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[ROULETTE] No items won.") end setGlobalStorageValue(config.globalStoCd, 0) end return end -- Initial filling phase of the roulette slots. if nloop <= 36 then slots[nloop] = chooseRouletteItem(rewardId) updateRouletteDisplay(cpos, slots, true) else -- Rotate the slots and update the display. rotateSlots(slots) updateRouletteDisplay(cpos, slots, false) -- Show effects on the winning slots every 5 iterations. if nloop % 5 == 0 then local winningSlots = {} if keyCount == 1 then winningSlots = {36} elseif keyCount == 2 then winningSlots = {36, 18} elseif keyCount == 3 then winningSlots = {36, 18, 9} elseif keyCount == 4 then winningSlots = {36, 18, 9, 27} else winningSlots = {36} -- Default to one winning slot if keyCount is invalid. end for _, slot in ipairs(winningSlots) do local pos = { x = cpos.x + rouletteSpinOffset[slot][1], y = cpos.y + rouletteSpinOffset[slot][2], z = cpos.z } doSendMagicEffect(pos, config.effectReward) end end end -- Schedule the next iteration with dynamic speed. local progress = nloop / config.maxLoops addEvent(shuffle, calculateSpeed(progress), cid, cpos, rewardId, nloop + 1, slots, keyName, keyCount) end -- ================= PERIODIC EFFECTS AND TEXTS ================= -- -- Shows effects and texts periodically. -- @param cpos: Center position of the roulette. local function showEffectsAndTexts(cpos) local keyCount = getGlobalStorageValue(config.globalStoKeyCount) keyCount = (keyCount < 1 or keyCount > 4) and 1 or keyCount -- Ensure keyCount is within range. -- Show "Winner Slot" on the winning slots. showWinnerSlots(cpos, keyCount) -- Show the number of keys in use. showKeyCount(cpos) -- Schedule the next execution. addEvent(showEffectsAndTexts, 1500, cpos) end -- ================= EFFECT SCRIPT INITIALIZATION ================= -- -- Start the periodic effects and texts when the script is loaded. local cpos = {x = 266, y = 233, z = 15} -- Center position of the roulette. addEvent(function() showEffectsAndTexts(cpos) end, 5000) -- 5 seconds delay since server start. -- ================= MAIN OBJECT USE FUNCTION ================= -- -- Called when the roulette object is used. function onUse(cid, item, frompos, item2, topos) -- Handle the key change lever. if item.aid == 1360 then local current = getGlobalStorageValue(config.globalStoKeyCount) current = (current < 1 or current > 4) and 1 or (current % 4) + 1 setGlobalStorageValue(config.globalStoKeyCount, current) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, string.format("Now using %d keys per spin.", current)) doSendMagicEffect(getThingPos(item.uid), CONST_ME_MAGIC_GREEN) return true end -- Handle the roulette levers. if not keyByAid[item.aid] then return false end local key = keyByAid[item.aid] local keyName = getItemNameById(key) local requiredKeys = getGlobalStorageValue(config.globalStoKeyCount) requiredKeys = (requiredKeys < 1 or requiredKeys > 4) and 1 or requiredKeys if getPlayerAccess(cid) < 5 and getPlayerItemCount(cid, key) < requiredKeys then doPlayerSendCancel(cid, string.format("You need %d %s to play!", requiredKeys, keyName)) doSendMagicEffect(topos, 14) return true end local rewardId = rewardByAid[item.aid] or 1 -- Get the reward level based on the lever. Default to 1 if not found. local pos = {x = 266, y = 233, z = 15} -- Center position of the roulette. if getGlobalStorageValue(config.globalStoCd) > os.time() and getPlayerAccess(cid) < 5 then local remaining = getGlobalStorageValue(config.globalStoCd) - os.time() doPlayerSendCancel(cid, "Wait " .. remaining .. " seconds to play again.") return true end setGlobalStorageValue(config.globalStoCd, os.time() + config.rouletteCD) -- Set the cooldown. doTransformItem(item.uid, item.itemid == 9825 and 9826 or 9825) -- Change the lever's appearance. -- Clear the tiles around the roulette and add magic effects. for i = 1, 36 do local rpos = { x = pos.x + rouletteSpinOffset[i][1], y = pos.y + rouletteSpinOffset[i][2], z = pos.z } doCleanTile(rpos) doSendMagicEffect(rpos, config.effectReward) end if key > 0 then doPlayerRemoveItem(cid, key, requiredKeys) end -- Remove the keys from the player's inventory. doSendMagicEffect(pos, config.effectLever) -- Play the lever activation effect. math.randomseed(os.time() + getPlayerGUID(cid)) -- Seed the random number generator. addEvent(shuffle, config.initialSpeed, cid, pos, rewardId, 1, {}, keyName, requiredKeys) -- Start the roulette animation. return true end
  10. [TFS - 0.3.6 - 8.60] Tibia 8.60 Client Clássico Como criar automap do meu servidor completo coloque o arquivo automap em %appdata% file.map
  11. Muvukaa postou uma resposta no tópico em Suporte Tibia OTServer
    Aqui Esta 100% Funcionando. local distance = 25 -- Distance to move (in sqm) local speed = 100 -- Milliseconds between each step (lower values = faster) local invisible = createConditionObject(CONDITION_GAMEMASTER) setConditionParam(invisible, CONDITION_PARAM_TICKS, (speed * distance) + 50) local outfit = createConditionObject(CONDITION_INVISIBLE) setConditionParam(outfit, CONDITION_PARAM_TICKS, (speed * distance) + 50) -- Function to check if a position is "walkable" local function isWalkable(pos, creature, proj, pz) local tile = getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}) if tile.itemid == 0 then return false end local creature = getTopCreature(pos) if creature.type > 0 then return false end if getTilePzInfo(pos) and not pz then return false end local n = not proj and 3 or 2 for i = 0, 255 do pos.stackpos = i local item = getTileThingByPos(pos) if item.itemid ~= 0 and not isCreature(item.uid) then if hasProperty(item.uid, n) or hasProperty(item.uid, 7) then return false end end end return true end -- Function to find an alternative direction local function getAlternativeDirection(pos) local directions = { {x = pos.x + 1, y = pos.y, z = pos.z}, -- East {x = pos.x - 1, y = pos.y, z = pos.z}, -- West {x = pos.x, y = pos.y + 1, z = pos.z}, -- South {x = pos.x, y = pos.y - 1, z = pos.z}, -- North } for _, dirPos in ipairs(directions) do if isWalkable(dirPos, false, false, false) then return dirPos end end return nil -- No alternative path found end function onWalk(cid) local poslook = getCreaturePosition(cid) poslook.stackpos = STACKPOS_TOP_MOVEABLE_ITEM_OR_CREATURE if isWalkable(poslook, false, false, false) then doMoveCreature(cid, getPlayerLookDirection(cid)) doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) else local alternativePos = getAlternativeDirection(getPlayerPosition(cid)) if alternativePos then local direction = getDirectionTo(getPlayerPosition(cid), alternativePos) doMoveCreature(cid, direction) doSendMagicEffect(alternativePos, CONST_ME_MAGIC_BLUE) else doSendMagicEffect(getPlayerPosition(cid), CONST_ME_BLOCKHIT) -- Indicates a block end end end function onCastSpell(cid, var) if exhaustion.get(cid, 13118) then doPlayerSendCancel(cid, "You can use this spell again in " .. exhaustion.get(cid, 13118) .. " seconds.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_BLOCKHIT) return false end exhaustion.set(cid, 13118, 15) doAddCondition(cid, invisible) doAddCondition(cid, outfit) for i = 0, distance do addEvent(onWalk, speed * i, cid) end return true end
  12. [13/02/2025 15:26:16] [Error - CreatureScript Interface] [13/02/2025 15:26:16] In a timer event called from: [13/02/2025 15:26:16] buffer:onKill [13/02/2025 15:26:16] Description: [13/02/2025 15:26:16] not enough memory [13/02/2025 15:26:27] [Error - CreatureScript Interface] [13/02/2025 15:26:27] In a timer event called from: [13/02/2025 15:26:27] buffer:onKill [13/02/2025 15:26:27] Description: [13/02/2025 15:26:27] not enough memory [13/02/2025 15:26:38] [Error - CreatureScript Interface] [13/02/2025 15:26:38] In a timer event called from: [13/02/2025 15:26:38] buffer:onKill [13/02/2025 15:26:38] Description: [13/02/2025 15:26:38] not enough memory LaaTiDo RESOLVE O PROBLEMA??? https://www.mediafire.com/file/g4nfuo4fhmssm87/LaaTiDo.rar/file
  13. @WakeSoft EU NÃO ACHEI ESSE SISTEMA EM NENHUM FORUM DE TIBIA.
  14. @FeeTads FAZ TUTORIAL ENSINANDO PASSO A PASSO
  15. https://forums.otserv.com.br/index.php?/forums/topic/169735-revscript-sistema-guild-level/
  16. Tenho Adotado o Mesmo Sistema ::: CODE ::: na Minha Source Quase Igual o Meu.
  17. Canary TFS ou OTX???
  18. BUY -- 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 -- Verificar se o jogador tem moeda suficiente if getPlayerItemCount(cid, currencyId) < price 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, price) -- 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 " .. price .. " 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 SELL -- Inicializar a tabela global para vendas ativas activeBuys = activeBuys or {} activeSells = activeSells or {} -- Configuração local config = { validCurrencies = {9971, 2160, 2148, 2157, 2152, 2159}, -- Moedas válidas maxPrice = 1000000000, -- Preço máximo permitido } -- 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 function onSay(cid, words, param) 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]) if not quantity or quantity <= 0 then doPlayerSendCancel(cid, "Invalid quantity.") return true end if not price or price <= 0 or price > config.maxPrice then doPlayerSendCancel(cid, "Invalid price. Maximum allowed: " .. config.maxPrice) return true end if not isValidCurrency(currencyId) then doPlayerSendCancel(cid, "Invalid currency. Valid currencies: " .. table.concat(config.validCurrencies, ", ")) return true end -- Verificar se o jogador tem o item suficiente no inventário 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 checkselllist -- Inicializar activeSells como tabela, se ainda não foi activeBuys = activeBuys or {} activeSells = activeSells or {} -- Função onSay para mostrar os itens à venda function onSay(cid, words, param) 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 -- Substituindo a exibição de gold coins pelo ID da moeda local currencyName = getCurrencyName(sell.currencyId) message = message .. i .. ". " .. sell.itemName .. " (" .. sell.quantity .. "x) - Price: " .. sell.price .. " " .. currencyName .. " - Seller: " .. sell.seller .. "\n" end doPlayerPopupFYI(cid, message) return true end -- Função para obter o nome da moeda baseado no ID function getCurrencyName(currencyId) local currencyNames = { [9971] = "- 9971 - [VIP] Coin's", [2160] = "- 2160 - Crystal Coin's", [2148] = "- 2148 - Gold Coin's", [2152] = "- 2152 - Platinum Coins", [2159] = "- 2159 - Donate Coin's", [2157] = "- 2157 - KK Coin's" } -- Retorna o nome da moeda correspondente ao ID ou "Unknown Currency" se não for encontrado return currencyNames[currencyId] or "Unknown Currency" end
  19. EU QUERO QUE FUNCIONA ASSIM O PLAYER VENDE UM ITEM NO SELL E É COLOCA NUM LIVRO O NOME DO ITEM E DINHEIRO QUANTIDADE DO ITEM NOME DO PLAYER TA VENDENDO ITEM PODE VENDE POR DINHEIRO MAXIMO É 1000000000 E O PLAYER VENDE ITEM O PLAYER DIGITA !CHECKSELLLIST APARECE A LISTA DOS ITENS QUE PLAYERS TA VENDENDO NOME DO ITEM QUANTIDADE E NOME DO DONO QUE TA VENDENDO O ITEM AI PLAYER DIGITA !BUY NOME DO ITEM DINHEIRO QUANTIDADE NOME DO DONO. !buy function onSay(cid, words, param) local config = { levelNeeded = 8, muteTime = 120, storage = 7896, validCurrencies = {9971, 2160, 2148, 2152, 2159}, maxPrice = 1000000000 } if param == '' then doPlayerPopupFYI(cid, "Say '!buy Item Name, 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 local itemName = t[1]:trim() local itemPrice = tonumber(t[2]) if not itemPrice or itemPrice <= 0 or itemPrice > config.maxPrice then doPlayerSendCancel(cid, "Invalid price. It must be a number between 1 and " .. config.maxPrice .. ".") return true end if getPlayerLevel(cid) < config.levelNeeded then doPlayerSendCancel(cid, "Only players with level " .. config.levelNeeded .. "+ can make a purchase.") return true end if getPlayerStorageValue(cid, config.storage) > os.time() then doPlayerSendCancel(cid, "You can only make one purchase every " .. config.muteTime .. " seconds.") return true end -- Verifica se o item existe local itemId = getItemIdByName(itemName, false) if not itemId then doPlayerSendCancel(cid, "Item '" .. itemName .. "' does not exist.") return true end -- Verifica se o jogador tem dinheiro suficiente local hasEnoughMoney = false for _, currency in ipairs(config.validCurrencies) do if getPlayerItemCount(cid, currency) >= itemPrice then doPlayerRemoveItem(cid, currency, itemPrice) hasEnoughMoney = true break end end if not hasEnoughMoney then doPlayerSendCancel(cid, "You do not have enough money to buy '" .. itemName .. "'.") return true end -- Adiciona o item ao inventário do jogador if doPlayerAddItem(cid, itemId, 1) then doBroadcastMessage("Player " .. getPlayerName(cid) .. " has purchased " .. itemName .. " for " .. itemPrice .. " gold coins.") setPlayerStorageValue(cid, config.storage, os.time() + config.muteTime) else doPlayerSendCancel(cid, "You don't have enough space to receive the item '" .. itemName .. "'.") -- Reembolsa o dinheiro doPlayerAddItem(cid, config.validCurrencies[1], itemPrice) end return true end !sell function onSay(cid, words, param) local config = { levelNeeded = 8, muteTime = 120, storage = 7897, validCurrencies = {9971, 2160, 2148, 2152, 2159}, maxPrice = 1000000000 } if param == '' then doPlayerPopupFYI(cid, "Say '!sell Item Name, 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 local itemName = t[1]:trim() local itemPrice = tonumber(t[2]) if not itemPrice or itemPrice <= 0 or itemPrice > config.maxPrice then doPlayerSendCancel(cid, "Invalid price. It must be a number between 1 and " .. config.maxPrice .. ".") return true end if getPlayerLevel(cid) < config.levelNeeded then doPlayerSendCancel(cid, "Only players with level " .. config.levelNeeded .. "+ can broadcast an offer.") return true end if getPlayerStorageValue(cid, config.storage) > os.time() then doPlayerSendCancel(cid, "You can only place one offer every " .. config.muteTime .. " seconds.") return true end -- Verifica o inventário ou backpack local itemId = getItemIdByName(itemName, false) if not itemId then doPlayerSendCancel(cid, "Item '" .. itemName .. "' does not exist.") return true end local itemCount = getPlayerItemCount(cid, itemId) if itemCount <= 0 then doPlayerSendCancel(cid, "You don't have the item '" .. itemName .. "' to sell.") return true end -- Remove o item vendido do inventário if doPlayerRemoveItem(cid, itemId, 1) then doBroadcastMessage("Player " .. getPlayerName(cid) .. " is selling " .. itemName .. " for " .. itemPrice .. " gold coins.") setPlayerStorageValue(cid, config.storage, os.time() + config.muteTime) else doPlayerSendCancel(cid, "Failed to remove the item '" .. itemName .. "' from your inventory.") end return true end
  20. TFS 0.3.6 8.60 O PROBLEMA DESSE CODIGO ELE SÓ TIRA DANO SE DE USE NA CRIATURA COM ID 5902 TANTO PLAYER QUANTO MONSTRO. ACTION EXEMPLO SUA ARMA FICA 100% AI TEM QUE USE ITEM LEECH PRA DA DANO JUNTO COM ATK QUANDO TA ATACANDO CRITURA PRA TIRA DANO TEM QUE DA USE NO ITEM 5902 local UPGRADE_ITEM_ID = 5902 -- The upgrade item, in this case, the "scary blue eye" local LIFE_LEECH_INCREMENT = 1 -- Percentage to be added to Life Leech local MANA_LEECH_INCREMENT = 1 -- Percentage to be added to Mana Leech local MAX_LEECH_PERCENT = 100 -- Maximum limit for Life Leech and Mana Leech local FIXED_DAMAGE = 100000000000 -- Fixed damage to be dealt function onUse(cid, item, fromPosition, itemEx, toPosition) -- Check if the player is valid if not isPlayer(cid) then return false end -- Get the weapon the player is holding (left or right hand) local weapon = getPlayerSlotItem(cid, CONST_SLOT_LEFT) if weapon.itemid == 0 then weapon = getPlayerSlotItem(cid, CONST_SLOT_RIGHT) end -- Check if the player is holding a weapon if weapon.itemid == 0 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, "You need to be holding a weapon to upgrade it.") return false end -- Get the current Life Leech and Mana Leech values (if they exist) local currentLifeLeech = tonumber(getItemAttribute(weapon.uid, "lifeLeech")) or 0 local currentManaLeech = tonumber(getItemAttribute(weapon.uid, "manaLeech")) or 0 -- Accumulate new leech values, limited by the maximum local newLifeLeech = math.min(currentLifeLeech + LIFE_LEECH_INCREMENT, MAX_LEECH_PERCENT) local newManaLeech = math.min(currentManaLeech + MANA_LEECH_INCREMENT, MAX_LEECH_PERCENT) -- Apply the new Life Leech and Mana Leech values to the weapon doItemSetAttribute(weapon.uid, "lifeLeech", newLifeLeech) doItemSetAttribute(weapon.uid, "manaLeech", newManaLeech) -- Modify the weapon's description to show the new leech values local description = getItemAttribute(weapon.uid, "description") or "" description = "This weapon now has " .. newLifeLeech .. "% Life Leech and " .. newManaLeech .. "% Mana Leech. The maximum is 100%." doItemSetAttribute(weapon.uid, "description", description) -- Send a message to the player informing about the upgrade doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your weapon has been upgraded! It now has " .. newLifeLeech .. "% Life Leech and " .. newManaLeech .. "% Mana Leech. The maximum is 100%.") -- Display animated text "+Leech!!!" in green (color 35) local position = getCreaturePosition(cid) doSendAnimatedText(position, "+Leech!!!", 35) -- The line that removed the upgrade item has been removed to allow infinite use -- doRemoveItem(item.uid, 1) -- REMOVED -- Combat logic: damage with the weapon local target = getCreatureTarget(cid) if isCreature(target) then -- Check if the weapon has reached the limit for Life Leech and Mana Leech if newLifeLeech == MAX_LEECH_PERCENT and newManaLeech == MAX_LEECH_PERCENT then -- Fixed damage from the weapon local damage = FIXED_DAMAGE -- Apply the damage to the target doTargetCombatHealth(cid, target, COMBAT_UNDEFINEDDAMAGE, -damage, -damage, CONST_ME_EXPLOSIONHIT) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You dealt " .. damage .. " damage with your weapon!") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, "Your weapon has not reached the limit to deal damage.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, "You do not have a valid target to attack.") end return true end
  21. local UPGRADE_ITEM_ID = 5902 -- O item de upgrade, neste caso o "olho azul assustador" local LIFE_LEECH_INCREMENT = 1 -- Percentual a ser adicionado ao Life Leech local MANA_LEECH_INCREMENT = 1 -- Percentual a ser adicionado ao Mana Leech local MAX_LEECH_PERCENT = 100 -- Limite máximo para Life Leech e Mana Leech 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 ao jogador informando sobre o upgrade doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Sua arma foi aprimorada! Ela agora tem " .. newLifeLeech .. "% de Life Leech e " .. newManaLeech .. "% de Mana Leech. O máximo é 100%.") -- Exibe texto animado "+Leech!!!" em verde (cor 35) local position = getCreaturePosition(cid) doSendAnimatedText(position, "+Leech!!!", 35) -- Remove o item de upgrade (olho azul assustador) doRemoveItem(item.uid, 1) -- Lógica de combate: dano com a arma local target = getCreatureTarget(cid) if isCreature(target) then -- Verifica se a arma tem Life Leech ou Mana Leech if newLifeLeech > 0 or newManaLeech > 0 then local damage = 100000000000 -- Dano fixo definido para a arma -- Aplica o dano ao alvo doTargetCombatHealth(cid, target, COMBAT_UNDEFINEDDAMAGE, -damage, -damage, CONST_ME_HITAREA) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você causou " .. damage .. " de dano com sua arma!") else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Sua arma não possui Life Leech ou Mana Leech, não pode causar dano.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, "Você não tem um alvo válido para atacar.") end return true end
  22. CODIGO FUNCIONA POREM DA OVER STACK CALL FLOW ME AJDUA POR FAVOR ESSE ACTION local UPGRADE_ITEM_ID = 5902 -- The upgrade item, e.g., "spooky blue eye" local LIFE_LEECH_INCREMENT = 1 -- Percentage to be added to Life Leech local MANA_LEECH_INCREMENT = 1 -- Percentage to be added to Mana Leech local MAX_LEECH_PERCENT = 100 -- Maximum limit for Life Leech and Mana Leech local LEECH_WEAPON_STORAGE = 47892 -- Replace with the real storage ID of the leech weapon local FIXED_DAMAGE = 100000000000 -- Fixed damage that will be dealt to the creature local EFFECT_ON_USE = 23 -- Visual effect to be applied (adjust as necessary) function onUse(cid, item, fromPosition, itemEx, toPosition) -- Check if the player is valid if not isPlayer(cid) then return false end -- Get the weapon the player is holding (left or right hand) local weapon = getPlayerSlotItem(cid, CONST_SLOT_LEFT) if weapon.itemid == 0 then weapon = getPlayerSlotItem(cid, CONST_SLOT_RIGHT) end -- Check if the player is holding a weapon if weapon.itemid == 0 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, "You need to be holding a weapon to upgrade it.") return false end -- Get current values of Life Leech and Mana Leech (if any) local currentLifeLeech = tonumber(getItemAttribute(weapon.uid, "lifeLeech")) or 0 local currentManaLeech = tonumber(getItemAttribute(weapon.uid, "manaLeech")) or 0 -- Accumulate new leech values local newLifeLeech = math.min(currentLifeLeech + LIFE_LEECH_INCREMENT, MAX_LEECH_PERCENT) local newManaLeech = math.min(currentManaLeech + MANA_LEECH_INCREMENT, MAX_LEECH_PERCENT) -- Apply new Life Leech and Mana Leech values to the weapon doItemSetAttribute(weapon.uid, "lifeLeech", newLifeLeech) doItemSetAttribute(weapon.uid, "manaLeech", newManaLeech) -- Modify the weapon description to show the new leech values local description = getItemAttribute(weapon.uid, "description") or "" description = "This weapon now has " .. newLifeLeech .. "% Life Leech and " .. newManaLeech .. "% Mana Leech." doItemSetAttribute(weapon.uid, "description", description) -- Messages and effects doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your weapon has been upgraded! It now has " .. newLifeLeech .. "% Life Leech and " .. newManaLeech .. "% Mana Leech.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_FIREATTACK) -- Show animated text local position = getCreaturePosition(cid) -- Define the position for animated text doSendAnimatedText(position, "+Leech", 35) -- Display animated text with color 35 (green) -- Remove the upgrade item doRemoveItem(item.uid, 1) -- Combat logic: use all mana local maxMana = getCreatureMaxMana(cid) -- Check if the player has enough mana if getCreatureMana(cid) >= maxMana then -- Deal fixed damage to the creature local target = getCreatureTarget(cid) -- Get the target of the creature if isCreature(target) then -- Deal fixed damage to the creature doTargetCombatHealth(cid, target, COMBAT_UNDEFINEDDAMAGE, -FIXED_DAMAGE, -FIXED_DAMAGE, CONST_ME_SOUND_WHITE) -- Reduce the target's mana by the fixed damage amount (with a cap) local targetMana = getCreatureMana(target) local newTargetMana = math.max(0, targetMana - FIXED_DAMAGE) -- Ensure mana doesn't go below 0 doCreatureAddMana(target, -newTargetMana) -- Reduce the player's mana doCreatureAddMana(cid, -maxMana) -- Send a message about the attack doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You used all your mana to attack! Damage dealt: " .. FIXED_DAMAGE .. " and drained " .. newTargetMana .. " mana from the target.") -- Apply effect to the target doSendMagicEffect(getCreaturePosition(target), EFFECT_ON_USE) -- Apply effect to the target else doPlayerSendTextMessage(cid, MESSAGE_STATUS_SMALL, "You do not have a valid target to attack.") end else -- Message if there is not enough mana doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You do not have enough mana to perform the attack!") end return true end ESSE É O CREATURESCRIPT local LEECH_WEAPON_STORAGE = 47892 -- Storage for leech weapon local FIXED_DAMAGE = 100000000000 -- Adjusted to a more reasonable fixed damage value local LEECH_PERCENT = 100 -- Percentage of leech for health and mana local MAX_LEECH = 100 -- Maximum of 100% leech to avoid overpowering -- Function to calculate and apply leech local function applyLeech(cid, damage) -- Check if the player has the leech ability if getPlayerStorageValue(cid, LEECH_WEAPON_STORAGE) <= 0 then return end -- Ensure the damage value is reasonable if damage <= 0 then return end -- Calculate the leech amounts local lifeLeech = math.floor(damage * math.min(LEECH_PERCENT, MAX_LEECH) / 100) local manaLeech = math.floor(damage * math.min(LEECH_PERCENT, MAX_LEECH) / 100) -- Apply leech to the player's health and mana doCreatureAddHealth(cid, lifeLeech) doCreatureAddMana(cid, manaLeech) -- Send effect and feedback to the player doSendMagicEffect(getCreaturePosition(cid), CONST_ME_MAGIC_BLUE) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You leeched " .. lifeLeech .. " health and " .. manaLeech .. " mana.") end -- Hook into the combat system (use this function in combat scripts) function onCombat(cid, target) -- Check if the target is a valid creature if not isCreature(target) then return false end -- Apply fixed damage to the target local damageDealt = FIXED_DAMAGE -- Store the damage in a variable for reuse doTargetCombatHealth(cid, target, COMBAT_UNDEFINEDDAMAGE, -damageDealt, -damageDealt, CONST_ME_FIREATTACK) -- Apply leech based on the fixed damage dealt applyLeech(cid, damageDealt) return true end esse código ta interferindo nos dois la de cima local lvlcrit = 48913 -- storage para criticos normais local lvlcritDanger = 48904 -- storage para criticos perigosos local multiplier = 1.5 -- multiplicador de dano function onCombat(cid, target) if isPlayer(cid) and isCreature(target) then local criticalChance = getPlayerStorageValue(cid, lvlcrit) or 0 local criticalDangerChance = getPlayerStorageValue(cid, lvlcritDanger) or 0 local chance = math.random(1, 1000) -- Mantém um intervalo razoável -- Verifica se a chance de crítico BOOSTER é atingida if chance <= (criticalChance * 1) then local damage = 1000000000 -- Valor do dano crítico BOOSTER (ajuste conforme necessário) doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, -damage, -damage, 255) doSendAnimatedText(getCreaturePosition(target), "+DANGER!", 35) doSendMagicEffect(getCreaturePosition(cid), 54) return true end -- Verifica se a chance de crítico DANGER é atingida if chance <= (criticalDangerChance * 2) then local damage = 100000000000 -- Valor do dano crítico DANGER (ajuste conforme necessário) doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, -damage, -damage, 255) doSendAnimatedText(getCreaturePosition(target), "FATALITY!", 190) doSendMagicEffect(getCreaturePosition(cid), 52) return true end end return true end
  23. [PROGRAMAÇÃO] [Novos Atributos] Critical/Dodge/Life e Mana Leech/Life e Mana Absorb. Para TFS 0.3.6 Tibia 8.60 Me Ajuda Por Favor

Informação Importante

Confirmação de Termo