Jump to content

Search the Community

Showing results for tags 'Action TFS 1.X'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Tibia King
    • Rules
    • Portal
    • FeedBack
  • Open Tibia
    • Otserv
    • Tools
    • Codes
    • Clients
    • Maps
    • Websites
  • Management of Ot Servers
    • Otserv Discussions & Research
    • Support and Requests
    • Otserv Tutorials
  • Tibia and Bots
    • Tibia
    • Bots
  • Others
    • Announcements
    • Other Programming Languages
    • Graphics and Design
    • Playground (Off-topic)

Calendars

  • Official Calendar
  • OTServs Calendar
  • Several Calendars

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Localization


My character


Favorite OTServ


Bot preferred


Interests

Found 25 results

  1. Eu fiz uma "sala de hunts", só que queria melhorar ela, mas to tendo uns problemas, atualmente ela é assim: vc entra na sala, e recebe um aviso que será expulso de lá em 15 minutos, aí tem essa alavanca, cada vez que vc clica, ela spawna 3 bixos(varia de sala pra sala), aí oq eu queria fazer é: vc entra, clica na alavanca 1 vez, aí enquanto ela tiver virada pra esquerda, ela começa a manter 5 monstros na sala, ex: vc clicou, ela spawna 5, aí sempre q vc mata um, nasce outro no lugar. Eu tentei fazer usando como base, a yalahar quest, mas nao consegui adaptar o For, ou fazer algum tipo de While, inclusive, se puder só me explicar como uso essas funções, já resolve o script da yalahar:
  2. Este script funciona perfeitamente qual quer problema comente no topico. basta ser adicionado em action.xml com um action e adicionado ao mapa. local t = { players = { -- posições que os players devem ficar ao puxar a alavanca [1] = Position(33395,32661,6), [2] = Position(33394,32662,6), [3] = Position(33395,32662,6), [4] = Position(33395,32663,6), [5] = Position(33396,32662,6) }, boss = {name = "Scarlett Etzel", create_pos = Position(33396,32642,6)}, destination = Position(33395,32656,6), -- posição para qual os players serão teleportados cooldown = {0, "sec"}, -- tempo para ser teleportado novamente. Ex.: {2, "sec"}, {5, "min"}, {10, "hour"}, {3, "day"} storage = 56482 -- storage não utilizado no seu servidor } function onUse(player, item, fromPosition, target, toPosition, isHotkey) local players, tab = {}, t.players for i = 1, #tab do local tile = Tile(tab) if tile then local p = Player(tile:getTopCreature()) if p then if p:getStorageValue(t.storage) <= os.time() then players[#players + 1] = p:getId() end end end end if #players == 0 then player:sendCancelMessage("One or all players did not wait " .. getStrTime(t.cooldown) .. " to go again.") return true end for i = 1, #tab do local playerTile = Tile(tab) local playerToGo = Player(playerTile:getTopCreature()) if playerToGo then if isInArray(players, playerToGo:getId()) then playerToGo:setStorageValue(t.storage, mathtime(t.cooldown) + os.time()) playerTile:relocateTo(t.destination) tab:sendMagicEffect(CONST_ME_POFF) end end end t.destination:sendMagicEffect(CONST_ME_TELEPORT) Game.createMonster(t.boss.name, t.boss.create_pos) item:transform(item.itemid == 36319 or 1946 or 1945) return true end local boss_room = {fromPos = Position(33386, 32639, 6), toPos = Position(33405, 32659, 6)} local bossplayer = Player(cid) local exit = Position(33395, 32659, 6) if bossplayer and isInRange(bossplayer:getPosition(), boss_room.fromPos, boss_room.toPos) then bossplayer:teleportTo(exit) end function mathtime(table) -- by dwarfer local unit = {"sec", "min", "hour", "day"} for i, v in pairs(unit) do if v == table[2] then return table[1](60^(v == unit[4] and 2 or i-1))(v == unit[4] and 24 or 1) end end return error("Bad declaration in mathtime function.") end function getStrTime(table) -- by dwarfer local unit = {["sec"] = "second",["min"] = "minute",["hour"] = "hour",["day"] = "day"} return tostring(table[1].." "..unit[table[2]]..(table[1] > 1 and "s" or "")) end
  3. Muito boa tarde a todos, há um tempo atrás dei uma pausa com um projeto meu e resolvi voltar agora que estou com um tempinho livre. Gostaria de pedir uma ajuda dos especialistas, pois sou bem leigo quando o assunto é scripts. Estou há um bom tempo procurando nas comunidades um script de teleport por alavanca, onde 4 jogadores em posições determinadas acionam uma alavanca e são transportados para uma posição determinada. Mas para isso, os quatro jogadores devem ser exatamente level 100, qualquer level abaixo ou acima disso não é permitida a entrada e todos os 4 devem possuir x item para poder ir para a quest. Ao serem teleportados o item é removido. Se possível, o script possuir as seguintes funções: caso já tenha um grupo na quest, outros não poderão entrar somente quando o grupo atual finalizar. E Para evitar jogadores "Espertinhos" que tentem bloquear a quest de alguma forma, um limite de tempo para terminar a quest e ao termino o time todo é teleportado de volta para a saida (posição determinada por mim). Sei que pode ser muita coisa, mas peço que me ajudem pois, por mais simples que seja o script, já procurei muito e não encontro nenhum que funcione na minha versão do servidor. Todos os que eu achei foram pra versões anteriores do TFS e não consegui por pra rodar no meu. Versão do meu servidor: 11.00 TFS: 1.3
  4. Funções: Suporta muitas criaturas diferentes Suporta personalizado números participante Reset automático Totalmente personalizável Notificações de erro annihilator.lua annihilator_chest.lua
  5. Necessário adicionar TAG no Action.xml Scroll.lua
  6. o script roda em tfs 1.3. mais preciso ajuda para colocar um coldoown pra poder fazer dnovo a quest. (configurable) local config = { duration = 10, -- time till reset, in minutes level_req = 1, -- minimum level to do quest min_players = 1, -- minimum players to join quest lever_id = 1945, -- id of lever before pulled pulled_id = 1946 -- id of lever after pulled } local player_positions = { [1] = {fromPos = Position(928, 1015, 7), toPos = Position(919, 1020, 7)} -- [2] = {fromPos = Position(1000, 1000, 7), toPos = Position(1000, 1000, 7)}, -- [3] = {fromPos = Position(1000, 1000, 7), toPos = Position(1000, 1000, 7)}, -- [4] = {fromPos = Position(1000, 1000, 7), toPos = Position(1000, 1000, 7)} } local monsters = { [1] = {pos = Position(918, 1016, 7), name = "Orc"} } local quest_range = {fromPos = Position(913, 1013, 7), toPos = Position(925, 1020, 7)} -- see image in thread for explanation local exit_position = Position(1000, 1000, 7) -- Position completely outside the quest area function doResetAnnihilator(position, cid_array) local tile = Tile(position) local item = tile and tile:getItemById(config.pulled_id) if not item then return end local monster_names = {} for key, value in pairs(monsters) do if not isInArray(monster_names, value.name) then monster_names[#monster_names + 1] = value.name end end for i = 1, #monsters do local creatures = Tile(monsters[i].pos):getCreatures() for key, creature in pairs(creatures) do if isInArray(monster_names, creature:getName()) then creature:remove() end end end for i = 1, #player_positions do local creatures = Tile(player_positions[i].toPos):getCreatures() for key, creature in pairs(creatures) do if isInArray(monster_names, creature:getName()) then creature:remove() end end end for key, cid in pairs(cid_array) do local participant = Player(cid) if participant and isInRange(participant:getPosition(), quest_range.fromPos, quest_range.toPos) then participant:teleportTo(exit_position) exit_position:sendMagicEffect(CONST_ME_TELEPORT) end end item:transform(config.lever_id) end function onUse(player, item, fromPosition, target, toPosition, isHotkey) if item.itemid ~= config.lever_id then return player:sendCancelMessage("The quest is currently in use. Cooldown is " .. config.duration .. " minutes.") end local participants, pull_player = {}, false for i = 1, #player_positions do local fromPos = player_positions[i].fromPos local tile = Tile(fromPos) if not tile then print(">> ERROR: Annihilator tile does not exist for Position(" .. fromPos.x .. ", " .. fromPos.y .. ", " .. fromPos.z .. ").") return player:sendCancelMessage("There is an issue with this quest. Please contact an administrator.") end local creature = tile:getBottomCreature() if creature then local participant = creature:getPlayer() if not participant then return player:sendCancelMessage(participant:getName() .. " is not a valid participant.") end if participant:getLevel() < config.level_req then return player:sendCancelMessage(participant:getName() .. " is not the required level.") end if participant.uid == player.uid then pull_player = true end participants[#participants + 1] = {participant = participant, toPos = player_positions[i].toPos} end end if #participants < config.min_players then return player:sendCancelMessage("You do not have the required amount of participants.") end if not pull_player then return player:sendCancelMessage("You are in the wrong position.") end for i = 1, #monsters do local toPos = monsters[i].pos if not Tile(toPos) then print(">> ERROR: Annihilator tile does not exist for Position(" .. toPos.x .. ", " .. toPos.y .. ", " .. toPos.z .. ").") return player:sendCancelMessage("There is an issue with this quest. Please contact an administrator.") end Game.createMonster(monsters[i].name, monsters[i].pos, false, true) end local cid_array = {} for i = 1, #participants do participants[i].participant:teleportTo(participants[i].toPos) participants[i].toPos:sendMagicEffect(CONST_ME_TELEPORT) cid_array[#cid_array + 1] = participants[i].participant.uid end item:transform(config.pulled_id) addEvent(doResetAnnihilator, config.duration * 60 * 1000, toPosition, cid_array) return true end creditos do script : Apollos
  7. Use como quiser, ha varias possibilidades para este código. Aproveite. Exemplo Uso Fast exercise_training.lua local skills = { [26397] = {id=SKILL_SWORD,voc=4}, [26398] = {id=SKILL_AXE,voc=4}, [26399] = {id=SKILL_CLUB,voc=4}, [26400] = {id=SKILL_DISTANCE,voc=3,range=CONST_ANI_SIMPLEARROW}, [26401] = {id=SKILL_MAGLEVEL,voc=2,range=CONST_ANI_ENERGY}, [26402] = {id=SKILL_MAGLEVEL,voc=1,range=CONST_ANI_FIRE}, } ------- CONFIG -----// local dummies = {26403,26404} local skill_gain = 1 -- per hit local gain_stamina = 60 local function start_train(pid,start_pos,itemid,fpos) local player = Player(pid) if player ~= nil then local pos_n = player:getPosition() if start_pos:getDistance(pos_n) == 0 and getTilePzInfo(pos_n) then if player:getItemCount(itemid) >= 1 then local exercise = player:getItemById(itemid,true) if exercise:isItem() then if exercise:hasAttribute(ITEM_ATTRIBUTE_CHARGES) then local charges_n = exercise:getAttribute(ITEM_ATTRIBUTE_CHARGES) if charges_n >= 1 then exercise:setAttribute(ITEM_ATTRIBUTE_CHARGES, (charges_n-1)) local required = 0 local currently = 0 local voc = player:getVocation() if skills[itemid].id == SKILL_MAGLEVEL then required = voc:getRequiredManaSpent(player:getBaseMagicLevel() + 1)/skill_gain currently = player:getManaSpent() player:addManaSpent(required - currently) else required = voc:getRequiredSkillTries(skills[itemid].id, player:getSkillLevel(skills[itemid].id)+1)/skill_gain currently = player:getSkillTries(skills[itemid].id) player:addSkillTries(skills[itemid].id, (required - currently)) end fpos:sendMagicEffect(CONST_ME_HITAREA) if skills[itemid].range then pos_n:sendDistanceEffect(fpos, skills[itemid].range) end player:setStamina(player:getStamina() + 60) if charges_n == 1 then exercise:remove(1) return true end local training = addEvent(start_train, voc:getAttackSpeed(), pid,start_pos,itemid,fpos) else exercise:remove(1) stopEvent(training) end end end end else stopEvent(training) end else stopEvent(training) end return true end function onUse(player, item, fromPosition, target, toPosition, isHotkey) local start_pos = player:getPosition() if target:isItem() then if isInArray(dummies,target:getId()) then if not skills[item.itemid].range and (start_pos:getDistance(target:getPosition()) > 1) then stopEvent(training) return false end if not player:getVocation():getId() == skills[item.itemid].voc or not player:getVocation():getId() == (skills[item.itemid].voc+4) then stopEvent(training) return false end player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You started training.") start_train(player:getId(),start_pos,item.itemid,target:getPosition()) end end return true end action XML <!-- Training --> <action fromid="26397" toid="26402" script="exercise_training.lua" allowfaruse="1"/> Em events.xml Altera 0 para 1 <event class="Player" method="onTradeRequest" enabled="1" /> Em /events/scripts/player.lua Adicione esta linha ao topo local exercise_ids = {26397,26398,26399,26400,26401,26402} Playerfunction.lua Procure por onMoveItem. Adicione Em baixo. -- Exercise Weapons if isInArray(exercise_ids,item.itemid) then self:sendCancelMessage('You cannot move this item outside this container.') return false end Playerfuncion.lua procure por onTradeRequest. Adicione em cima if isInArray(exercise_ids,item.itemid) then return false end
  8. Assim que a pedra principal aparecer será necessário clicar em todas as outras para que elas voltem a ser pedras "normais". Pronto o teleport aparece. além disso pode ser cobraldo algo para se entrar no to após usar as pedras. Aproveitem. Em Action.xml <action actionid = "10100" event = "script" value = "ChangeST.lua" /> Arquivo ChangeST.lua local minutes = 5 local stones = { {pos = {x = 1037, y = 997, z = 7}}, {pos = {x = 1041, y = 994, z = 7}}, {pos = {x = 1045, y = 997, z = 7}}, } local teleporter = { ['id'] = 1387, ['position.create'] = {x = 1041, y = 997, z = 7}, ['position.send'] = {x = 1041, y = 992, z = 7}, } function onUse(cid, item, fromPosition, itemEx, toPosition) local a = item.actionid if (not(a == 10100)) then return true end if (getTileItemById(teleporter['position.create'], 1387).uid > 0) then return true end if (item.itemid == 1304) then doSendMagicEffect(fromPosition, 52) else doSendMagicEffect(fromPosition, CONST_ME_POFF) end doTransformItem(item.uid, item.itemid == 1354 and 1304 or 1354) local count = 0 for i = 1, #stones do local p = stones[i].pos if (getTileItemById(p, 1354).uid > 0) then count = count + 1 end end if (count == #stones) then doCreatureSay(cid, "Sukcess!", TALKTYPE_ORANGE_1) doCreatureSay(cid, "The teleporter was created.", TALKTYPE_ORANGE_1) doSendMagicEffect(getCreaturePosition(cid), 49) doCreateTeleport(teleporter['id'], teleporter['position.send'], teleporter['position.create']) addEvent(function(cid) for v = 1, #stones do local s = stones[v].pos if (getTileItemById(s, 1354).uid > 0) then doTransformItem(getTileItemById(s, 1354).uid, 1304) doSendMagicEffect(s, CONST_ME_POFF) end end local tp = getTileItemById(teleporter['position.create'], teleporter['id']).uid if (tp > 0) then doRemoveItem(tp) end end, 60000 * minutes, cid) end return true end Config local minutes = 5 -- Minutos o portal aparecer local stones = { -- Posições das pedras {pos = {x = 1037, y = 997, z = 7}}, {pos = {x = 1041, y = 994, z = 7}}, {pos = {x = 1045, y = 997, z = 7}}, } local teleporter = { -- Teleporter que ira apareccer ['id'] = 1387, ['position.create'] = {x = 1041, y = 997, z = 7}, -- Posição que ira levar se falhar ['position.send'] = {x = 1041, y = 992, z = 7}, } Qual quer duvida use o topico.
  9. Olá pessoal, para quem não sabe esse script funciona da seguinte maneira, você escolhe um X item, e ao dar use neste X item, será removido a skull e os frags do player que usa-lo (só funciona se estiver Red Skull ou Black Skull). Crie um arquivo com o nome frag_remover.lua em actions/scripts/ e coloque esse código dentro: function onUse(player, item, fromPosition, itemEx, toPosition, isHotkey) if table.contains({SKULL_RED, SKULL_BLACK}, player:getSkull()) then player:setSkull(SKULL_NONE) player:setSkullTime(0) player:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your skull has been removed!") db.query("UPDATE `player_deaths` SET `unjustified` = 0 WHERE `unjustified` = 1 AND `killed_by` = " .. db.escapeString(player:getName())) item:remove(1) else player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You can only remove red or black skulls!") player:getPosition():sendMagicEffect(CONST_ME_POFF) end return true end E em actions.xml adicione a tag: <action itemid="XXXX" script="frag_remover.lua"/> Agora é só trocar o XXXX da tag acima pelo ID do item que será o seu Frag Remover Créditos: Ninja Bem simples né pessoal ?! Espero ter ajudado, abraços!
  10. Buenas, TK! Um mano gringo aí pediu algo do tipo, e eu precisava me familiarizar melhor com a orientação a objetos usada em Lua do TFS 1.3, então fiz esse action, onde o player que possui um scroll pode fazer um portal para seu templo, que é usado dando USE mesmo, e sua party inteira pode ir junto para seus respectivos templos se não estiverem pz locked ou com battle, e caso o player não esteja em uma party, apenas o mesmo pode entrar no portal. Tags XML: <action itemid="PORTALID HERE" script="townportalsystem.lua"/> <action itemid="SCROLLID HERE" script="townportalsystem.lua"/> Arquivo townportalsystem.lua em actions/scripts/: -- Town Portal Scroll System based in Dota 2 -- by Nazo (tibiaking.com) local config = { portalId = 1231, -- change to portal item id portalTime = 30, -- portal duration in seconds scrollId = 1232, -- change to scroll item id effect = CONST_ME_POFF -- effect id or CONST that appears at the end of time } local function removePortal(portal) if(portal) portal:remove() portal:getPosition():sendMagicEffect(config.effect) else print("Admin excluiu o portal, parabéns") end end function onUse(player, item, fromPosition, target, toPosition, isHotkey) if(item:getId()==config.scrollId) then portal = Game.createItem(config.portalId, 1, player:getPosition()) if(player:getParty()) then portal:setCustomAttribute("party", player:getParty()) else portal:setCustomAttribute("owner", player:getName()) end addEvent(removePortal, config.portalTime * 1000, portal) item:remove() else if(not player:isPzLocked() and not player:getCondition(CONDITION_INFIGHT, CONDITIONID_DEFAULT)) then if(item:getCustomAttribute("party")) then if(player:getParty()==item:getCustomAttribute("party")) then player:teleportTo(player:getTown():getTemplePosition(), true) else player:popupFYI("You do not participate in the portal creator's party.") end elseif(item:getCustomAttribute("name") and player:getName() == item:getCustomAttribute("name")) then player:teleportTo(player:getTown():getTemplePosition(), true) else player:popupFYI("You isn't the owner.") end else player:popupFYI("You are PZ locked or in battle.") end end return true end
  11. Olá pessoal, para quem não sabe esse script funciona da seguinte maneira, você escolhe um X item, ao dar use neste X item, a Stamina do player enche X tempo que você determinar. Crie um arquivo com o nome stamina_refuel.lua em actions/scripts e coloque isso dentro: local stamina_full = 42 -- horas (stamina full) function onUse(player, item, fromPosition, target, toPosition, isHotkey) if player:getStamina() >= (stamina_full * 60) then player:sendCancelMessage("Your stamina is already full.") else player:setStamina(stamina_full * 60) player:sendTextMessage(MESSAGE_INFO_DESCR, "Your stamina has been refilled.") player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) item:remove(1) end return true end E em actions.xml adcione a tag: <action itemid="ITEMID" script="stamina_refuel.lua"/> Para editar é fácil, nesta parte: local stamina_full = 42 -- horas (stamina full) Acima você escolhe o tempo (em horas) que encherá ao usar o stamina refuel. Bem simples né pessoal ?! Espero ter ajudado, abraços!
  12. Olá pessoal, essa é a primeira versão do "Exercise Weapons", Sinta-se livre para sugerir modificações e ajudar a melhorá-lo! Caso você não tenha as sprites, pode usar outras, como a "Training Dummy" e outros items correspondentes. Crie o arquivo exercise_training.lua local skills = { [26397] = {id=SKILL_SWORD,voc=4}, [26398] = {id=SKILL_AXE,voc=4}, [26399] = {id=SKILL_CLUB,voc=4}, [26400] = {id=SKILL_DISTANCE,voc=3,range=CONST_ANI_SIMPLEARROW}, [26401] = {id=SKILL_MAGLEVEL,voc=2,range=CONST_ANI_ENERGY}, [26402] = {id=SKILL_MAGLEVEL,voc=1,range=CONST_ANI_FIRE}, } ------- CONFIG -----// local dummies = {26403,26404} local skill_gain = 1 -- per hit local gain_stamina = 60 local function start_train(pid,start_pos,itemid,fpos) local player = Player(pid) if player ~= nil then local pos_n = player:getPosition() if start_pos:getDistance(pos_n) == 0 and getTilePzInfo(pos_n) then if player:getItemCount(itemid) >= 1 then local exercise = player:getItemById(itemid,true) if exercise:isItem() then if exercise:hasAttribute(ITEM_ATTRIBUTE_CHARGES) then local charges_n = exercise:getAttribute(ITEM_ATTRIBUTE_CHARGES) if charges_n >= 1 then exercise:setAttribute(ITEM_ATTRIBUTE_CHARGES, (charges_n-1)) local required = 0 local currently = 0 local voc = player:getVocation() if skills[itemid].id == SKILL_MAGLEVEL then required = voc:getRequiredManaSpent(player:getBaseMagicLevel() + 1)/skill_gain currently = player:getManaSpent() player:addManaSpent(required - currently) else required = voc:getRequiredSkillTries(skills[itemid].id, player:getSkillLevel(skills[itemid].id)+1)/skill_gain currently = player:getSkillTries(skills[itemid].id) player:addSkillTries(skills[itemid].id, (required - currently)) end fpos:sendMagicEffect(CONST_ME_HITAREA) if skills[itemid].range then pos_n:sendDistanceEffect(fpos, skills[itemid].range) end player:setStamina(player:getStamina() + 60) if charges_n == 1 then exercise:remove(1) return true end local training = addEvent(start_train, voc:getAttackSpeed(), pid,start_pos,itemid,fpos) else exercise:remove(1) stopEvent(training) end end end end else stopEvent(training) end else stopEvent(training) end return true end function onUse(player, item, fromPosition, target, toPosition, isHotkey) local start_pos = player:getPosition() if target:isItem() then if isInArray(dummies,target:getId()) then if not skills[item.itemid].range and (start_pos:getDistance(target:getPosition()) > 1) then stopEvent(training) return false end if not player:getVocation():getId() == skills[item.itemid].voc or not player:getVocation():getId() == (skills[item.itemid].voc+4) then stopEvent(training) return false end player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You started training.") start_train(player:getId(),start_pos,item.itemid,target:getPosition()) end end return true end Adicione essa linha em actions.xml <!-- Training --> <action fromid="26397" toid="26402" script="exercise_training.lua" allowfaruse="1"/> Em events.xml - Você vai alterar a parte (enable="0" para "1") <event class="Player" method="onTradeRequest" enabled="1" /> Em /events/scripts/player.luaAdicione essa linha no início do arquivo local exercise_ids = {26397,26398,26399,26400,26401,26402} - Agora vá até a função function PlayerMoveItem e adicione abaixo: -- Exercise Weapons if isInArray(exercise_ids,item.itemid) then self:sendCancelMessage('You cannot move this item outside this container.') return false end - Na função function PlayerOnTradeRequest adicione essa linha abaixo: if isInArray(exercise_ids,item.itemid) then return false end Espero que gostem e seja útil.
  13. Olá pessoal, como to mexendo em um servidor "baiak" tive a ideia de fazer esse sistema de alavanca (pedi ajuda para o MaXwEllDeN, que foi quem fez praticamente o script inteiro), o script é formado por 2 alavancas., onde uma é para life e outra para mana, e essas alavancas vendem potions em cargas de 100x, a diferença dela é que ela verifica a vocation e o level do player, e vendi o potion em função disso. Por exemplo: Knight com level inferior a 50 só pode usar health potion, então se ele clicar na alavanca de life, ele irá receber o health potion, mas se este knight estiver em um level supior a 50 e inferior a 80 irá receber um strong potion, e assim sucessivamente. Faça pelo seu RME algo parecido com isso: Agora coloque a actionid 20001 na alavanca de life e 20002 na alavanca de mana ... Depois vá em actions/actions.xml e add a tag: <!-- Alavanca Potions --> <action actionid="20001" script="alavanca_potions.lua"/> <action actionid="20002" script="alavanca_potions.lua"/> E por fim, em actions/scripts/ crie um arquivo chamado alavanca_potions.lua e adicione isso dentro: É isso pessoal, os créditos são todos do MaXwEllDeN. Até mais!
  14. Sistema simples de abrir uma box com algum objeto (No caso uma chave) e ter chance de ganhar outfits, items , montarias ou perder a chave. key_loot_crate.lua (Actions) local config = { key_break = 30, -- Porcentagem de chave quebrar crate_itemid = 1739, -- ItemID da Crate rewards = { [1] = { item = "addon", chance = 10, lookType = { [0] = 142, -- lookType Female [1] = 134, -- lookType Male }, addon = 2, name = "Warrior Sword", }, [2] = { item = "mount", chance = 20, mountId = 40, name = "Noble Lion", }, [3] = { item = {2160, 2}, chance = 30, }, [4] = { item = {2390, 1}, chance = 40, }, [5] = { item = {2195, 1}, chance = 50, }, [6] = { item = {2471, 2}, chance = 60, }, [7] = { item = {2469, 1}, chance = 70, }, [8] = { item = {2492, 2}, chance = 80, }, } } local function broadcast(message) for _, targetPlayer in ipairs(Game.getPlayers()) do targetPlayer:sendTextMessage(MESSAGE_STATUS_WARNING, message) end return true end function onUse(cid, item, fromPosition, itemEx, toPosition) local player = Player(cid) if (itemEx.itemid ~= config.crate_itemid) then return false end if (math.random(100) <= config.key_break) then toPosition:sendMagicEffect(3) player:sendTextMessage(MESSAGE_EVENT_ORANGE, "Na tentativa de abrir a crate, sua chave quebrou!") else local random = math.random(100) local i = 1 while (i <= #config.rewards) do local v = config.rewards[i] if (random <= v.chance) then if (v.item == "addon") then local lookType = v.lookType[player:getSex()] if (not player:hasOutfit(lookType, v.addon)) then player:addOutfitAddon(lookType, v.addon) broadcast(player:getName() .. " abriu uma loot crate e ganhou o addon ".. v.name .. ".") i = 9999 break else random = math.random(100) end elseif(v.item == "mount") then if (not player:hasMount(v.mountId)) then player:addMount(v.mountId) broadcast(player:getName() .. " abriu uma loot crate e ganhou a montaria ".. v.name .. ".") i = 9999 break else random = math.random(100) end else local new_item = player:addItem(v.item[1], v.item[2]) if (type(new_item) == "table") then new_item = new_item[1] end broadcast(player:getName() .. " abriu uma loot crate e ganhou ".. v.item[2] .. " ".. new_item:getName() .. ".") i = 9999 break end end i = i + 1 end if (i == 9999) then toPosition:sendMagicEffect(14) player:sendTextMessage(MESSAGE_EVENT_ORANGE, "Eh uma pena, mas a loot crate estava vazia.") else toPosition:sendMagicEffect(15) end end itemEx:remove() item:remove() return true end actions.xml <action itemid="22607" script="key_loot_crate.lua" /> <!-- Loot Crate Key --> HAVE FUN !
  15. Olá, Bom... teve um pedido no Discord da TK feito por algum usuário (não estou recordando o nome) que estava tendo dificuldades em fazer determinado script, então decidi fazê-lo. É algo simples, eu já tinha enviado lá no canal de suporte, porém, como já de conhecimento por muitos, o canal foi removido. Decidi refazer de uma forma melhor e mais prática. * Sobre o Script * Quando o jogador utilizar a alavanca para ganhar determinado(s) item(s), ele terá que ter deixado em POSIÇÕES DEFINIDAS alguns itens, sendo assim, possível efetuar a troca. Simples, não? Caso ainda não tenha entendido, tem imagem abaixo de como funciona o mesmo. * Imagens demonstração * Tentando efetuar a troca sem tá com os itens posicionados de forma correta... Efetuando a troca de forma correta. * Instalando o Script * Em data/actions/scripts/ crie um arquivo chamado alavanca_troca.lua e cole isto dentro: --[[ Lordzetros - TK ]] local config_itens = { {id = 2666, pos = {144,63,6}, count = 1}, -- ID DO ITEM NECESSÁRIO, POSIÇÃO QUE DEVE FICAR, QUANTIDADE DE ITEM NECESSÁRIO {id = 2667, pos = {145,63,6}, count = 1}, {id = 2671, pos = {146,63,6}, count = 1}, -- Caso queira colocar outro item, basta seguir esse modelo (ctrl + c) } local config_troca = { msg_falha = "Falha na troca do item. Necessario: %dx %s em sua devida posicao!", msg_sucesso = "A troca foi efetuada com sucesso!", recompensas = {{id = 2003, count = 1}, {id = 2004, count = 1}} -- Para deixar apenas uma recompensa, apenas deixe recompensas = {{id = ID_DO_ITEM_A_GANHAR, count = QUANTIDADE_A_GANHAR}} } function onUse(player, item, fromPosition, target, toPosition, isHotkey) local ax_t = {} for i, v in ipairs(config_itens) do local vt = Tile(Position(v.pos[1], v.pos[2], v.pos[3])) local item_t = vt:getItemById(v.id) if (not item_t or item_t:getCount() < v.count) then player:getPosition():sendMagicEffect(CONST_ME_POFF) player:sendTextMessage(36, config_troca.msg_falha:format(v.count, ItemType(v.id):getName())) return false end table.insert(ax_t, {item_t, v.count}) end for i, v in ipairs(ax_t) do v[1]:remove(v[2]) end for i, v in ipairs(config_troca.recompensas) do player:addItem(v.id, v.count) end player:sendTextMessage(36, config_troca.msg_sucesso) player:getPosition():sendMagicEffect(CONST_ME_FIREWORK_RED) return true end Em seguida, coloque esta linha de código abaixo de uma semelhante em data/actions/actions.xml <action actionid="30258" script="alavanca_troca.lua" /> Para finalizar, abre seu editor de mapa e coloque em algum alavanca o actionID = 30258 * Configurando o Script * Tá tudo comentado no código, portanto, vou falar só por cima. {id = 2666, pos = {144,63,6}, count = 1} Nesta parte, você deve colocar o id do item necessário, a posição que ele deve ficar e a quantidade. E nesta parte você configura a recompensa do jogador recompensas = {{id = 2003, count = 1}, {id = 2004, count = 1}} Id do item que ele ganhará e quantidade Enfim, script simples, porém, pode ser útil para muitos, assim como acredito que será para o usuário que solicitou, :). Abraços.
  16. Opa galera beleza? Eu vi um cidadão aqui do forum pedindo, e para não reviver o tópico resolvi desenvolver 1 e postar @ADM Mayk on BaiakME Ta ai o script que tu pediu. Crie um arquivo com o nome de Bau_Diario.lua local config = { items = { [1] = {2160, 10}, [2] = {2159, 10} }, level = 100, tempo = 24*60*60, -- 24 horas stoTime = 31402 } function onUse(player, item, fromPosition, itemEx, toPosition) if player:getLevel() >= config.level then if player:getStorageValue(config.stoTime) - os.time() < 0 then player:setStorageValue(config.stoTime, os.time() + config.tempo) for _, table in pairs(config.items) do for i=1, #config.items do player:addItem(table[i]) end end else player:getStorageValue(config.stoTime, 0) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("Wait: %s.", string.diff(player:getStorageValue(config.stoTime)-os.time()))) end else player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Voce nao tem level "..config.level..".") end end Adicione a TAG em actions.xml <action actionid="22164" script="Bau_Diario.lua"/> Créditos: Eu
  17. Fala clã, há um tempo soltei um sistema privado meu no grupo do TK no Discord e hoje resolvi soltar aqui no Fórum também, abaixo irei explicar um pouquinho sobre esse sistema. O que é Legendary Lever? É um sistema de alavancas que vendem itens (aleatórios), similar à uma surprise bag, porém cada item possui x porcento de chances de dropar ao jogador que estiver pagando para tentar a sorte. Qual o objetivo afinal? Bom, na época que desenvolvi esse sistema, era para um cliente meu que acabou desistindo da compra quando eu estava prestes a começar a desenvolver. O objetivo do cara era criar 5 alavancas, onde cada alavanca teria pelo menos 1 item lendário com 3% de chance de dropar ao jogador que estivesse puxando a alavanca, e cada alavanca teria entre 5 a 7 itens ao todo (a maioria itens simples). Mas a ideia por trás de tudo era lucrar com isso, fazer jogadores donatarem mais para poder tentar pegar esses itens lendários (claro, o cara ia ter que gastar muito pra isso). Terminou que resolvi desenvolver esse sistema com proteção contra duplo click, exaustão, logs de ações, etc. Em qual versão posso utilizar esse sistema? Esse sistema foi programado para rodar em TFS 1.x. Se vocês quiserem, em breve posso converter para 0.4 e trazer ao Fórum, mas aí vai depender do feedback Sem mais delongas, vamos ao sistema! antes de tudo, crie uma pasta chamada legendarylever em data/actions/scripts, e dentro da legendarylever crie outra pasta chamada lib. data/actions/scripts/legendarylever/lib/lib.lua : agora abra data/lib/lib.lua e inclua esta linha : dofile('data/actions/scripts/legendarylever/lib/lib.lua') Feito isso, você já pode começar a criar os arquivos das alavancas. Vamos então criar a nossa primeira alavanca! data/actions/scripts/legendarylever/royalcrossbow.lua : data/actions/actions.xml : <action actionid="3370" script="legendarylever/royalcrossbow.lua"/> E por fim, adicione a actionid 3370 em uma alavanca no Remere's Map Editor! 😄 Para criar novas alavancas, você já deve saber o que se fazer. Sim! CTRL + C CTRL + V no arquivo royalcrossbow.lua, renomea o nome, edite a tabela de itens, preços, premium etc e adicione a tag no XML com uma nova actionid (a actionid põe em uma nova alavanca no Remere's). A configuração não preciso nem explicar né! A única dica que dou, é deixar brodacast = true apenas nos itens mais difíceis de dropar, ou seja, os lendários. Porque isso irá anunciar ao servidor todo que aquele player conseguiu o danado do item haha 😄 Então é isso, espero que tenham gostado! *Edit: Para salvar log de ações, crie uma pasta chamada randomitems em data/logs. Créditos: Lyu (isme)
  18. Opa boa noite rapaziada, tudo bom? Eu estou treinando um pouco scripts e acabei que tendo a ideia de fazer algo relacionado com as Guilds. Então resolvi trazer 1 sistema de Guild Dungeon Lever para mim treinar Estou em fase de treinamento, então por favor, deem dicas e criticas ao sistema ! Obrigado ... Como o sistema funciona? Terá uma alavanca com local para os jogadores de sua Guild ficarem... O jogador que estiver na posição principal e próxima a alavanca irá clicar na alavanca que fará com que todos entrem na Dungeon. Os jogadores terão um tempo "x" para terminar, porém se o tempo acabar, o jogador será teleportado de volta para a posição principal da alavanca (Aonde o jogador clicou). Como configurar o script? local config = { time = 10, -- 1 Second. (1*60 To Minutes) level = 100, -- Level Necessary. dungeonPos = Position(1454, 909, 7), -- Dungeon Pos. needPos = { [1] = Position(1447, 915, 7), -- Position (where the player will click on the lever) and back position. [2] = Position(1449, 914, 7) }, fromPos = {x = 1449, y = 904, z = 7}, -- Position /\ < from the dungeon toPos = {x = 1456, y = 911, z = 7}, -- Position \/ > from the dungeon Storagetime = 39320, -- Storage Time. StorageDay = 39321, -- Storage Day. Timer = 24*60*60 -- To re-enter in the dungeon. (24hours) } time ------------------ Tempo que os jogadores ficarão dentro da Dungeon. level ----------------- Nível que todos precisam ser para entrar. dungeonPos ------ Posição que todos os jogadores serão teleportados. needPos ------------ Posição que os jogadores devem estar para serem teleportados. fromPos ------------- Posição SUPERIOR ESQUERDO da sala. toPos ----------------- Posição INFERIOR DIREITO da sala. Storagetime -------- Não mexer se não souber. StorageDay ----------- Não mexer se não souber. Timer ------------------ Tempo que o jogador terá que esperar para entrar novamente na Dungeon. Sem mais delongas, vamos ao script: Adicione a linha em: (data/actions/actions.xml) <!-- Script GUILD --> <action actionid="29305" script="Dungeon_Guild.lua" /> Adicione a linha em: (data/actions/scripts/Dungeon_Guild.lua) local config = { time = 5, -- 1 Second. (1*60 To Minutes) inside the dungeon. level = 100, -- Level Necessary. dungeonPos = Position(1454, 909, 7), -- Dungeon Pos. needPos = { [1] = Position(1447, 915, 7), -- Position (where the player will click on the lever) and back position. [2] = Position(1449, 914, 7) }, fromPos = {x = 1449, y = 904, z = 7}, -- Position /\ < from the dungeon toPos = {x = 1456, y = 911, z = 7}, -- Position \/ > from the dungeon Storagetime = 39320, -- Storage Time. StorageDay = 39321, -- Storage Day. Timer = 24*60*60 -- To re-enter in the dungeon. (24hrs) } function onUse(player, item, fromPosition, itemEx, toPosition, isHotkey) local guild = player:getGuild() for i = 1, #config.needPos do local playerTile = Tile(config.needPos[i]):getTopCreature() if not playerTile or not playerTile:isPlayer() then player:getPosition():sendMagicEffect(CONST_ME_POFF) player:sendTextMessage(MESSAGE_STATUS_DEFAULT, "You need 2 players and stay on the orange floor.") return true end if not playerTile:getGuild() and not player:getGuild() then player:getPosition():sendMagicEffect(CONST_ME_POFF) return player:sendTextMessage(MESSAGE_STATUS_SMALL, "One of the members does not have guild.") end if playerTile:getLevel() < config.level then player:getPosition():sendMagicEffect(CONST_ME_POFF) return player:sendTextMessage(MESSAGE_STATUS_SMALL, "All the players need to be level "..config.level.." or higher.") end if player:getGuild():getId() ~= playerTile:getGuild():getId() then player:getPosition():sendMagicEffect(CONST_ME_POFF) return player:sendTextMessage(MESSAGE_STATUS_SMALL, "Only players in your guild can join you.") end if player:getStorageValue(config.Storagetime) - os.time() > 0 and playerTile:getStorageValue(config.Storagetime) - os.time() > 0 then player:getPosition():sendMagicEffect(CONST_ME_POFF) return false end if player:getStorageValue(config.StorageDay) - os.time() > 0 and playerTile:getStorageValue(config.StorageDay) - os.time() > 0 then player:getPosition():sendMagicEffect(CONST_ME_POFF) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("You're in cooldown to enter in a dungeon again. Cooldown: %s.", string.diff(player:getStorageValue(config.StorageDay)-os.time()))) return false end local players = {} for x = config.fromPos.x, config.toPos.x do for y = config.fromPos.y, config.toPos.y do for z = config.fromPos.z, config.toPos.z do local tile = Tile(x, y, z) local creature = tile:getTopCreature() if creature and creature:isPlayer() then players[#players+1] = creature end end end end if #players > 0 then player:getPosition():sendMagicEffect(CONST_ME_POFF) return player:sendTextMessage(MESSAGE_STATUS_SMALL, "Already has a guild inside.") end player:teleportTo(config.dungeonPos) playerTile:teleportTo(config.dungeonPos) playerTile:getPosition():sendMagicEffect(50) addEvent(function() player:teleportTo(config.needPos[2]) playerTile:teleportTo(config.needPos[2]) player:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) playerTile:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) player:setStorageValue(config.StorageDay, os.time() + config.Timer) playerTile:setStorageValue(config.StorageDay, os.time() + config.Timer) end, config.time*1000) return false end return true end Créditos: @KotZletY E eu Espero que gostem 😄 ... Edit* Adicionado Tempo para que você possa entrar novamente na Dungeon: Rep+
  19. Bom pessoal, esse é um script bem simples, mas eu gosto da ideia dele, e não consegui encontrar por aí. É uma boa solução pra quando você quer summonar monstros numa quest, e se tiver vários players não ficará summonando monstros várias vezes. Esse script está sendo usado ao dar use num chest, mas está a seu critério onde utilizar. monstersToCreate = { [1] = { name = 'Lost Berserker', position = {x = 1034, y = 1425, z = 15} }, [2] = { name = 'Lost Thrower', position = {x = 1028, y = 1424, z = 15} }, [3] = { name = 'Lost Basher', position = {x = 1034, y = 1427, z = 15} }, [4] = { name = 'Lost Thrower', position = {x = 1040, y = 1423, z = 15} }, [5] = { name = 'Lost Husher', position = {x = 1030, y = 1430, z = 15} }, [6] = { name = 'Lost Husher', position = {x = 1038, y = 1429, z = 15} } } function onUse (player, item, param) if item:getActionId() == 45016 then if player:getStorageValue(45016) == -1 then player:addItem(2517, 1) -- shield of honour player:addItem(2502, 1) -- dwarven helmet local currentMonsters = Game.getStorageValue(45016) if currentMonsters then for v = 1, #currentMonsters do local monsterId = currentMonsters[v] local isMonsterAlive = Monster(monsterId) if not isMonsterAlive then local createdMonster = Game.createMonster(monstersToCreate[v].name, monstersToCreate[v].position) currentMonsters[v] = createdMonster:getId() end end Game.setStorageValue(45016, currentMonsters) else local createdMonsters = {} for i = 1, #monstersToCreate do local createdMonster = Game.createMonster(monstersToCreate[i].name, monstersToCreate[i].position) table.insert(createdMonsters, createdMonster:getId()) end Game.setStorageValue(45016, createdMonsters) end player:setStorageValue(45016, 1) player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You've got a reward.") else player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, "You've already got your reward.") end end return true end actions.xml: <action actionid="45016" script="seu_script.lua" /> Se alguém quiser aprimorar o script, sinta-se à vontade 😃
  20. To adicionando uns scripts no me servidor, sistemas e to achando super dahora e vejo que não tem por aqui, vim disponibilizar pra vocês. actions.xml <action itemid="2580" script="monsterFishing.lua" allowfaruse="1"/> scripts/monsterFishing.lua local waterIds = {493, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 7236, 10499, 15401, 15402} local lootTrash = {2234, 2238, 2376, 2509, 2667} local lootCommon = {2152, 2167, 2168, 2669, 7588, 7589} local lootRare = {2143, 2146, 2149, 7158, 7159} local lootVeryRare = {7632, 7633, 10220} local useWorms = true -- Config for monster fishing local config = { enabled = true, -- ativar ou desativar a pesca monstro debug = false, -- ativar mensagens de depuração no console verifyMonsters = false, -- desabilite isso se você estiver tendo problemas com o Monster fishing :: Warning - Invalid monster name chance = 50, -- chance de pegar um monstro em% - 50 significa que você tem 50/50 de chance de pegar um monstro ou um peixe bossLevel = 300, -- nível mínimo para pegar um "boss" bossSkill = 90, -- min habilidade de pesca para pegar um "boss" monsters = { -- [minLevel] = {"monster", "names", "for", "level"} [100] = {"Quara Hydromancer", "Quara Constrictor", "Quara Mantassin", "Idontexist"}, [150] = {"Quara Pincher", "Quara Predator"}, [200] = {"Serpent Spawn", "Wyrm"}, [300] = {"Sea Serpent"}, }, bosses = { -- Monsters that can only be caught with atleast "bossLevel" and "bossSkill" "Titan Goddess of Water", } } -- Validate monsters configuration if config.verifyMonsters then local m = {} for minLevel, monsters in pairs(config.monsters) do m[minLevel] = {} if config.debug then print("#monsters", #monsters) end for i = 1, #monsters do if MonsterType(monsters[i]) then table.insert(m[minLevel], monsters[i]) else print("Monster fishing::Warning - Invalid monster name:", monsters[i]) end end if config.debug then print("Monster fishing::Debug - #monsters added", #m[minLevel]) end end config.monsters = m end function onUse(player, item, fromPosition, itemEx, toPosition, isHotkey) local targetId = itemEx.itemid if not isInArray(waterIds, itemEx.itemid) then return false end if targetId == 10499 then local targetItem = Item(itemEx.uid) local owner = targetItem:getAttribute(ITEM_ATTRIBUTE_CORPSEOWNER) if owner ~= 0 and owner ~= player:getId() then player:sendTextMessage(MESSAGE_STATUS_SMALL, "You are not the owner.") return true end toPosition:sendMagicEffect(CONST_ME_WATERSPLASH) targetItem:remove() local rareChance = math.random(1, 100) if rareChance == 1 then player:addItem(lootVeryRare[math.random(#lootVeryRare)], 1) elseif rareChance <= 3 then player:addItem(lootRare[math.random(#lootRare)], 1) elseif rareChance <= 10 then player:addItem(lootCommon[math.random(#lootCommon)], 1) else player:addItem(lootTrash[math.random(#lootTrash)], 1) end return true end if targetId ~= 7236 then toPosition:sendMagicEffect(CONST_ME_LOSEENERGY) end if targetId == 493 or targetId == 15402 then return true end player:addSkillTries(SKILL_FISHING, 1) if math.random(1, 100) <= math.min(math.max(10 + (player:getEffectiveSkillLevel(SKILL_FISHING) - 10) * 0.597, 10), 50) then if useWorms and not player:removeItem("worm", 1) then return true end if targetId == 15401 then local targetItem = Item(itemEx.uid) targetItem:transform(targetId + 1) targetItem:decay() if math.random(1, 100) >= 97 then player:addItem(15405, 1) return true end elseif targetId == 7236 then local targetItem = Item(itemEx.uid) targetItem:transform(targetId + 1) targetItem:decay() local rareChance = math.random(1, 100) if rareChance == 1 then player:addItem(7158, 1) return true elseif rareChance <= 4 then player:addItem(2669, 1) return true elseif rareChance <= 10 then player:addItem(7159, 1) return true end end if config.enabled and math.random(100) <= config.chance then local level = player:getLevel() local skill = player:getSkillLevel(SKILL_FISHING) local tmpMonsters = {} for minLevel, monsters in pairs(config.monsters) do if config.debug then print("Monster fishing::Debug - Level check:", level, ">=", minLevel) end if level >= minLevel then if config.debug then print("Monster fishing::Debug - Level check passed - #monsters:", #monsters) end for i = 1, #monsters do if config.debug then print("Monster fishing::Debug - Found monster:", monsters[i]) end table.insert(tmpMonsters, monsters[i]) end end end if level >= config.bossLevel and skill >= config.bossSkill then for i = 1, #config.bosses do table.insert(tmpMonsters, config.bosses[i]) end end if config.debug then print("Monster fishing::Debug - #tmpMonsters: "..#tmpMonsters) end if #tmpMonsters > 0 then local pos = player:getPosition() Game.createMonster(tmpMonsters[math.random(1, #tmpMonsters)], pos) return true end end player:addItem("fish", 1) end return true end Caso na hora de pescar venha esse item ao invés do fish, é por causa dos items.xml, dai é só você mudar player:addItem("2667", 1) e adicionar o ID do fish.
  21. Bom pessoal, vi alguns tópicos pedindo esse script, e como precisei dele agora, resolvi faze-lo. Em actions.xml: <action itemid="22726" script="descongelando_ursagrodon.lua" /> Agora em actions/scripts/ crie um arquivo lua com o nome de: descongelando_ursagrodon.lua local itemId = {22729, 22730, 22731, 22732} local porcentagem = 50 local function revertIce(toPosition) local tile = toPosition:getTile() if tile then local sprite = tile:getItemById(itemId[4]) if sprite then sprite:transform(itemId[1]) end end end function onUse(player, item, fromPosition, target, toPosition, isHotkey) if target.itemid == itemId[1] or target.itemid == itemId[2] or target.itemid == itemId[3] then if player:hasMount(38) then return player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You already have the obedience of ursagrodon.') end local rand = math.random(1, 100) if rand <= porcentagem then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'The ice cracked and the frozen creature with it - be more careful next time!') item:remove(1) target:transform(itemId[4]) addEvent(revertIce, 600000, toPosition) else if target.itemid == itemId[1] then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You managed to melt about half of the ice blook. Quickly now, it\'s ice cold here and the ice block could freeze over again.') target:transform(itemId[2]) elseif target.itemid == itemId[2] then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You managed to melt almost the whole block, only the feet of the creature are still stuck in the ice. Finish the job!') target:transform(itemId[3]) elseif target.itemid == itemId[3] then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'The freed ursagrodon look at you with glowing, obedient eyes.') target:transform(itemId[4]) player:addMount(38) item:remove(1) addEvent(revertIce, 600 * 1000, toPosition) end end end return true end Lembrando que precisa editar as fases do congelamento pelo id: local itemId = {22729, 22730, 22731, 22732} local porcentagem = 50 Espero ter ajudado.
  22. Preview Script data/actions/actions.xml <action itemid="9737" script="other/magicalorb.lua"/> data/actions/scripts/magicalorb.lua local items = { [2195] = 35000, -- [ItemID] = PriceOfItem } function onUse(cid, item, fromPosition, itemEx, toPosition) local x = items[itemEx.itemid] if x then doRemoveItem(itemEx.uid, 1) doPlayerAddMoney(cid, x) local info = getItemRWInfo(itemEx.itemid) doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You have sold your item!") doSendMagicEffect(getThingPos(cid), CONST_ME_FIREWORK_YELLOW) else doPlayerSendCancel(cid, "You can't sell this item.") doSendMagicEffect(getThingPos(cid), CONST_ME_POFF) end return true end Créditos: God Mythera
  23. Preview Script data/items/items.xml <item id="8981" article="a" name="gold premium card"> <attribute key="weight" value="0" /> <attribute key="description" value="Use this card to receive 7 premium days." /> </item> data/actions/actions.xml <action itemid="8981" script="other/premiumcard.lua"/> data/actions/scripts/premium_card local t = { days = 7, effect = CONST_ME_HOLYAREA } function onUse(cid, item, fromPosition, itemEx, toPosition) doPlayerRemoveItem(cid, 8981, 1) return TRUE, doPlayerAddPremiumDays(cid, t.days), doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You now have +" .. t.days .. " premium days!"), doSendMagicEffect(fromPosition, t.effect) end Créditos: God Mythera
  24. Olá pessoal, para quem não sabe esse script funciona da seguinte maneira: você clica em um X item, e o player muda de sexo, se ele for male vira female, e vice-versa. Crie um arquivo com o nome change_sex.lua em actions/scripts e coloque isso dentro: change_sex.lua (TFS 1.0) change_sex.lua (TFS 1.1 e 1.2) E em actions.xml adcione a tag: <action itemid="XXXX" script="change_sex.lua"/> Basta colocar o id do item em XXXX acima, e prontinho. Bem simples né pessoal ?! Espero ter ajudado, abraços!
  25. Olá, tenho alma de compartilhador de conhecimento, assim como peguei algumas coisas daqui, sinto que devo também. Meu parceiro pediu-me que fizesse com que as quests dele tivessem seu funcionamento no TFS 1.0 assim como em um servidor que baixara a muito tempo. Eu olhei o script e era uma zona total, não entendi nada e resolvi escrever um do jeito que eu entendo por programação. O que ele gostaria é que tivesse o poder de criar quests, do modo antigo do tibia, apenas você e o baú, pelo próprio editor. Com essa maneira, ele simplesmente coloca qualquer container no mapa, mas pera aí, o que é um container para um código de OT? É qualquer coisa que possa carregar em dentro de si, uma ou mais de uma outra coisa. Corpos mortos, baús, etc. Note que caso o container, por exemplo um baú, seja para beneficar o jogador com mais de um item, é necessário criar um outro container dentro deste e adicionar os itens dentro desse último container criado. Um exemplo: para uma quest que dê 10 cerejas e 10 pães crie um baú com uma bag dentro, dentro da bag adicione as 10 cerejas e os 10 pães. Mãos a obra. Copie o código abaixo para um arquivo com qualquer nome desejável, eu o nomeei de "editor.lua" function onUse(cid, item, fromPosition, itemEx, toPosition) local container = Container(item.uid) local player = Player(cid) if player:getStorageValue(item.uid) == -1 then local questReward = container:getItem(0) local questRewardName = questReward:getType():getName() local weight = 0; if questReward:isContainer() then weight = questReward:getWeight() else weight = questReward:getType():getWeight(questReward:getCount()) end local freecap = player:getFreeCapacity() if freecap >= weight then local reward = questReward:clone() local result = player:addItemEx(reward) if result ~= RETURNVALUE_NOERROR then player:sendTextMessage(MESSAGE_INFO_DESCR, 'You have not enough room.') else player:sendTextMessage(MESSAGE_INFO_DESCR, 'You have found a ' .. questRewardName .. '.') player:setStorageValue(item.uid, 1) end else player:sendTextMessage(MESSAGE_INFO_DESCR, 'You have found a ' .. questRewardName .. ' weighing ' .. string.format("%.2f", weight) .. ' oz. It\'s too heavy.') end else player:sendTextMessage(MESSAGE_INFO_DESCR, "It is empty.") end return true end Neste outro passo tu podes seguir dois caminhos, o primeiro e o mais correto é uma alteração no código fonte do forgottenserver. Então, desta forma, se for a preferia por ti. Faça: No arquivo luascript.h, logo após a linha de número 744, ou procure algo parecido com: static int32_t luaContainerGetSize(lua_State* L); static int32_t luaContainerGetCapacity(lua_State* L); static int32_t luaContainerGetEmptySlots(lua_State* L); adicione uma nova linha com o seguinte: static int32_t luaContainerGetWeight(lua_State* L); No arquivo luascript.cpp, logo após a linha de número 2100, ou procure algo parecido com: registerMethod("Container", "getSize", LuaScriptInterface::luaContainerGetSize); registerMethod("Container", "getCapacity", LuaScriptInterface::luaContainerGetCapacity); registerMethod("Container", "getEmptySlots", LuaScriptInterface::luaContainerGetEmptySlots); adicione uma nova linha com o seguinte: registerMethod("Container", "getWeight", LuaScriptInterface::luaContainerGetWeight); Ainda em luascript.cpp, logo após a linha de número 6895, ou procure algo parecido com: int32_t LuaScriptInterface::luaContainerGetEmptySlots(lua_State* L) Logo após essa função (não a linha), insira o código abaixo: int32_t LuaScriptInterface::luaContainerGetWeight(lua_State* L) { // container:getWeight() Container* container = getUserdata<Container>(L, 1); if (!container) { lua_pushnil(L); return 1; } double weight = container->getWeight(); lua_pushnumber(L, weight); return 1; } E qual o motivo de eu preferir ter este código no lado do servidor compilado? Desempenho. O peso do container é guardado em memória e acessado diretamente, não há qualquer conta com inúmeras multiplicações ou funções recursivas. Mas caso esteja de mal humor e não queira compilar um servidor, terá que construir uma função da qual eu particularmente não gosto: function getWeight(item) local totalWeight = 0; if item:isContainer() then local size = item:getSize() for i = 0, size - 1 do totalWeight = totalWeight + getWeight(item:getItem(i)) end else totalWeight = totalWeight + item:getType():getWeight(item:getCount()) end return totalWeight; end Coloque este código, essa função, antes da função onUse dentro de editor.lua E troque aonde diz questReward:getWeight() por getWeight(questReward) Para terminar e fechar logo, não esqueça de adicionar o action id , eu normalmente uso 2000 pra esta actionId. É importante também lembrar que o UniqueId do baú deve ser ÚNICO em todo seu servidor, apenas dessa forma poderemos saber quais baús o jogador já abriu e conseguiu a recompensa. Agora, vá aos testes meu querido! Salve todos os scripts, se tiver que compilar o servidor, vá e faça isso. Coloque um baú no seu mapa com um item apenas dentro, se tu colocares mais do que um item, apenas o primeiro será considerado, assim como pode ser visto na linha: local questReward = container:getItem(0) Dessa forma, caso seja necessário vários itens, lembre-se, uma bag, backpack, qualquer container com os itens dentro. Agora seja criativo, crie corpos de dragões, humanos, esqueletos, coloque chaves dentro de caixas, livros importantes na biblioteca, entre várias oportunidades. E então, o que acharam?

Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia começando do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer fazer um plano publicitário para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução!

×
×
  • Create New...