Postado Fevereiro 26, 2015 10 anos <p><span style="font-size:18px;">Bom, não testei, mas está aí o que eu fiz até agora [baseado no script '<a data-ipb=nomediaparse" href="">Evento Assasin</a>], criado pelo <strong>@zipter98</strong>...</span></p> <p><span style="font-size:18px;">Pedi para ele dar uma olhada aqui, pois deve estar com bugs.</span></p> <p> </p> <p><span style="font-size:18px;"><strong>Como Funciona?</strong></span></p> <ul> <li> <div><span style="font-size:18px;">Em x horário, aparecerá um portal.</span></div> </li> </ul> <ul> <li> <div><span style="font-size:18px;">Ao aparecer, o jogador que entrar por ele, será teleportado para uma das quatro salas de acordo com o nível dele [50-199/200-299/300-399/400+].</span></div> </li> </ul> <ul> <li> <div><span style="font-size:18px;">Ao entrar, espera o evento começar [sem se movimentar] - ou seja, ajuntar um número maior de players dentro da arena.</span></div> </li> </ul> <ul> <li> <div><span style="font-size:18px;">Após o tempo máximo de espera ou superlotação das salas[todas], é avisado aos participantes para se prepararem, pois a batalha começará em X segundos.</span></div> </li> </ul> <ul> <li> <div><span style="font-size:18px;">Os que morrerem, irão direto para o templo.</span></div> </li> </ul> <ul> <li> <div><span style="font-size:18px;">O ganhador sairá por um portal que aparece a 2 quadrados ao seu lado direito.</span></div> </li> </ul> <ul> <li> <div><span style="font-size:18px;">Logo após entrar no portal, recebe sua recompensa.</span></div> </li> </ul> <p> </p> <p> </p> <p><strong><span style="font-size:18px;">Instalação</span></strong></p> <p> </p> <p><span style="font-size:18px;">Na 'pasta data\lib', crie um arquivo com qualquer nome e coloque o seguinte código;</span><br /> </p> <pre class="_prettyXprint _lang-auto _linenums:0"> local config_SurvivalQuest = { day = {"Saturday"}, --Dia(s) que ocorrerá o evento. time = 5, --Tempo de espera de player, em minutos. time_inicio = 5, --Tempo de espera entre o término do tempo ou vagas e o inicio da batalha, em segundos. playerCount = {2, 20}, --Respectivamente, número mínimo e máximo de jogadores no evento [em cada sala de lvl]. prize = {itemid, count}, --Respectivamente, ID do prêmio e quantidade. positions = { levels = { ['50-199'] = { ----------------[sala lvl 50-199]---------------- fromPosition = {x = x, y = y, z = z}, --Coordenadas da posição superior esquerda da área. toPosition = {x = x, y = y, z = z}, --Coordenadas da posição inferior direita da área. }, ['200-299'] = { ---------------[sala lvl 200-299]---------------- fromPosition = {x = x, y = y, z = z}, --Coordenadas da posição superior esquerda da área. toPosition = {x = x, y = y, z = z}, --Coordenadas da posição inferior direita da área. }, ['300-399'] = { ---------------[sala lvl 300-399]---------------- fromPosition = {x = x, y = y, z = z}, --Coordenadas da posição superior esquerda da área. toPosition = {x = x, y = y, z = z}, --Coordenadas da posição inferior direita da área. }, ['400'] ={ -----------------[sala lvl 400+]----------------- fromPosition = {x = x, y = y, z = z}, --Coordenadas da posição superior esquerda da área. toPosition = {x = x, y = y, z = z}, --Coordenadas da posição inferior direita da área. }, }, }, startTime = 20, --Tempo para iniciar o evento, em segundos. aid = 5901, storages = { global = 9501, players = 9502 storage = 9010, }, teleport = { tpId = xxx, --ID do teleporte. createPos = {x = x, y = y, z = z}, --Onde o teleporte será criado. }, } function addPlayerOnSurvivalEvent(cid) if isPlayer(cid) then local sto = getGlobalStorageValue(config_SurvivalQuest.storages.players) if type(sto) == "number" then setGlobalStorageValue(config_SurvivalQuest.storages.players, getPlayerRoomOnSurvivalEvent(cid)) else local str = "" sto = sto:explode(",") table.insert(sto, ""..getCreatureName(cid)..";"..getPlayerRoomOnSurvivalEvent(cid)) for i = 1, #sto do if str == "" then str = sto else str = str..","..sto end end setGlobalStorageValue(config_SurvivalQuest.storages.players, str) end setPlayerStorageValue(cid, config_SurvivalQuest.storages.storage, 1) --Salva na storage que o player está no evento local room = getPlayerRoomOnSurvivalEvent(cid) --Verifica a respectiva room do player broadcastMessage(getCreatureName(cid).." entered on the Survival event ["..room.."]. ") --Broadcast informando quantidade de players em cada sala local mensagem = "Have " for a,b in ipairs(config_SurvivalQuest.positions.levels) do mensagem = mensagem..#getPlayersOnSurvivalEvent(((a-99) .."-".. (a-1))).." on the room ["..(a-99) .."-".. (a-1).."], " end mensagem = mensagem.. " players waiting in the event now." broadcastMessage(mensagem) --Teleporta o player pra sala de acordo com seu lvl doTeleportThing(cid, getRandomPositions(config_SurvivalQuest.positions[room].fromPosition, config_SurvivalQuest.positions[room].toPosition, 1)[1]) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, "You entered on the Survival event.["..room.."]") doPlayerSetNoMove(cid, true) --Trava o player pra nao se movimentar durante a espera end end function isFinishedSurvivalEvent() --Funçao que verifica a room correspondente ao lvl do player for a,b in ipairs(config_SurvivalQuest.positions.levels) do --loop que acessa todas as salas de lvl if #getPlayersOnSurvivalEvent(a)>0 then --Se tiver algum player na sala selecionada pelo loop return false end end return true end function isFullRoomOnSurvivalEvent(room) --Funçao que verifica se a room está cheia if #getPlayersOnSurvivalEvent(room)<config_SurvivalQuest.playerCount[2] then --Se tiver menos players que o máximo return false end return true end function getRoomsNotHaveMinimum() --Funçao que verifica quais rooms NÃO tem o minimo de players local rooms = {} --Tabela que será retornada for a,b in ipairs(config_SurvivalQuest.positions.levels) do if #getPlayersOnSurvivalEvent(a)<config_SurvivalQuest.playerCount[1] then --Se tiver menos players que o minimo table.insert(rooms, a) --Adiciona pra tabela que será retornada end end return rooms end function getPlayerRoomOnSurvivalEvent(cid) --Funçao que verifica a room correspondente ao lvl do player for a,b in ipairs(config_SurvivalQuest.positions.levels) do val = a:explode("-") if getPlayerLevel(cid) <= val[2] then return a end end return false end function getPlayersOnSurvivalEvent(room) room = (room) and room or "all" local pid = {} local sto = getGlobalStorageValue(config_SurvivalQuest.storages.players) if type(sto) ~= "string" then return false end sto = sto:explode(",") for i = 1, #sto do sto2 = sto:explode(";") if sto2[2] == room or room == "all" then local cid = getCreatureByName(sto2[1]) if isPlayer(cid) then table.insert(pid, cid) end end end return #pid > 0 and pid or false end function getRandomPositions(fromPos, toPos, count) count = tonumber(count) or 1 local positions = {} for i = 1, count do table.insert(positions, {x = math.random(fromPos.x, toPos.x), y = math.random(fromPos.y, toPos.y), z = math.random(fromPos.z, toPos.z)}) end return positions end function getPlayersInArea(fromPos, toPos) local players = {} for x = fromPos.x, toPos.x do for y = fromPos.y, toPos.y do for z = fromPos.z, toPos.z do local pos = {x = x, y = y, z = z} if isPlayer(getTopCreature(pos).uid) then table.insert(players, getTopCreature(pos).uid) end end end end return players end function addItem(cid, itemid, count) if isItemStackable(itemid) then doPlayerAddItem(cid, itemid, count) else if count > 1 then for i = 1, count do doPlayerAddItem(cid, itemid, 1) end else doPlayerAddItem(cid, itemid, 1) end end end </pre> <p> <br /> <br /> <span style="font-size:18px;">Agora vá na pasta 'mods' e crie um arquivo chamado '[EVENT]Survivor.xml' e coloque o seguinte código;</span><br /> </p> <pre class="_prettyXprint _lang-auto _linenums:0"> <?xml version="1.0" encoding="UTF-8"?> <mod name="Survivor Event" version="1.0" author="zipter98" contact="http://www.tibiaking.com/forum/user/52847-zipter98/"'>http://www.tibiaking.com/forum/user/52847-zipter98/"enabled="yes"> <!-- Mude 19:30 para o horário que quer que o evento Survival seja aberto. --> <globalevent name="Survival" time="19:30" event="script" value="Survivor/globalevents.lua"/> <movevent type="StepIn" actionid="5901" event="script" value="Survivor/movements.lua"/> <event type="preparedeath" name="deathSurvival" event="script" value="Survivor/creaturescripts.lua"/> <event type="login" name="survivalLogin" event="script" value="Survivor/creaturescripts.lua"/> <event type="logout" name="survivalLogout" event="script" value="Survivor/creaturescripts.lua"/> <event type="statschange" name="damageSurvival" event="script" value="Survivor/creaturescripts.lua"/> </mod> </pre> <p> <br /> <br /> <span style="font-size:18px;">Crie uma pasta em 'mods/scripts' chamada 'Survivor'.<br /> <br /> Agora, crie os seguintes arquivos em 'mods/Survivor';</span></p> <ul class="bbc"> <li><span style="font-size:18px;">globalevents.lua </span></li> </ul> <p> </p> <pre class="_prettyXprint _lang-auto _linenums:0"> local config = config_SurvivalQuest function onTime() if isInArray(config.day, os.date("%A")) then broadcastMessage("The survival event is open! You guys have "..config.time.." minutes to enter.") local item = doCreateItem(config.teleport.tpId, 1, config.teleport.createPos) doItemSetAttribute(item, "aid", config.aid) setGlobalStorageValue(config.storages.global, 1) addEvent(function() if getGlobalStorageValue(config.storages.global) == 1 then local tp = getTileItemById(config.teleport.createPos, config.teleport.tpId).uid if tp > 0 then doRemoveItem(tp) end local canceleds = getRoomsNotHaveMinimum() if #canceleds ~= 0 then for room,_ in ipairs(canceleds) do broadcastMessage("Not enough players to start the survival event for lvl "..room..". :/") end if #canceleds == config.playerCount then setGlobalStorageValue(config.storages.global, -1) end for room,_ in ipairs(canceleds) do for _,player in ipairs(getPlayersOnSurvivalEvent(room)) do setPlayerStorageValue(player, config.storages.storage, -1) end db.executeQuery("UPDATE player_storage SET value = -1 WHERE key = "..config.storages.storage.." AND value = '"..room.."'") end else broadcastMessage("The survival event will start in "..config.startTime.." minutes.") addEvent(function() broadcastMessage("The survival event started!!!") setGlobalStorageValue(config.storages.global, 2) for i = 1, #getPlayersOnSurvivalEvent() do doPlayerSetNoMove(getPlayersOnSurvivalEvent(), false) end end, config.startTime * 1000) end end end, config.time * 60 * 1000) end return true end </pre> <p> </p> <ul class="bbc"> <li><span style="font-size:18px;">creaturescripts.lua</span></li> </ul> <p> </p> <pre class="_prettyXprint _lang-"> local config = config_SurvivalQuest function onPrepareDeath(cid) if getGlobalStorageValue(config.storages.global) > -1 and getPlayerStorageValue(cid, config.storages.storage) > -1 then doCreatureAddHealth(cid, getCreatureMaxHealth(cid)) doCreatureAddMana(cid, getCreatureMaxMana(cid)) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) doPlayerSendTextMessage(cid, 27, "Oh, you died in the survival event. :/") setPlayerStorageValue(cid, config.storages.storage, -1) if #getPlayersInArea(config.fromPosition, config.toPosition) == 1 then local pid = getPlayersInArea(config.fromPosition, config.toPosition)[1] broadcastMessage(getCreatureName(pid).." won the survival event! Congratulations to him!") doCreatureAddHealth(pid, getCreatureMaxHealth(pid)) doCreatureAddMana(pid, getCreatureMaxMana(pid)) local position = getCreaturePosition(cid) --Pega a posição do player position.x = position.x+1 --Adiciona 1 quadradinho pra DIREITA a variavel 'position' if not isWalkable(position) then position.x = position.x - 2 --Altera pra 1 quadradinho a ESQUERDA a variavel 'position' if not isWalkable(position) then --Se não puder caminhar nesse local position.x = position.x+1 --Retorna position.x ao seu valor original position.y = position.y+1 --Altera pra 1 quadradinho ACIMA a variavel 'position' if not isWalkable(position) then --Se não puder caminhar nesse local position.y = position.y - 2 --Altera pra 1 quadradinho ABAIXO a variavel 'position' end end end local item = doCreateItem(config.teleport.tpId, 1, position) --Cria o teleport no novo local doItemSetAttribute(item, "aid", config.aid) --Adiciona a action id para teleportar ao templo doPlayerSendTextMessage(pid, MESSAGE_STATUS_CONSOLE_ORANGE, "You win! Congratulations!\nEnter the portal to receive your prize.") end end return true end function onStatsChange(cid, attacker, type, combat, value) if getGlobalStorageValue(config.storages.global) > -1 and getGlobalStorageValue(config.storages.global) ~= 2 and getPlayerStorageValue(cid, config.storages.storage) > -1 then return false end return true end function onLogin(cid) if getPlayerStorageValue(cid, config.storages.storage) > -1 and getGlobalStorageValue(config.storages.global) < 1 then setPlayerStorageValue(cid, config.storages.storage, -1) end registerCreatureEvent(cid, "damageSurvival") registerCreatureEvent(cid, "deathSurvival") return true end function onLogout(cid) if getGlobalStorageValue(config.storages.global) > -1 and getPlayerStorageValue(cid, config.storages.storage) > -1 then return doPlayerSendCancel(cid, "You can't logout on the survival event.") and false end return true end </pre> <p> </p> <p> </p> <ul class="bbc"> <li><span style="font-size:18px;">movements.lua</span></li> </ul> <p> </p> <pre class="_prettyXprint _lang-auto _linenums:0"> function onStepIn(cid, item, position, fromPosition) if position == config.teleport.createPos then --Se for o tp pra entrar no evento if not isPlayer(cid) then return true elseif getGlobalStorageValue(config.storages.global) < 1 then return doPlayerSendCancel(cid, "The event isn't open.") and doTeleportThing(cid, fromPosition) elseif isFullRoomOnSurvivalEvent(getPlayerRoomOnSurvivalEvent(cid)) then return doPlayerSendCancel(cid, "There's already the maximum number of players on the Survival event.") and doTeleportThing(cid, fromPosition) end addPlayerOnEvent(cid) if #getPlayersOnSurvivalEvent(getPlayerRoomOnSurvivalEvent(cid)) >= config.playerCount[2] then local tp = getTileItemById(config.teleport.createPos, config.teleport.tpId).uid if tp > 0 then doRemoveItem(tp) end broadcastMessage("The survival event for lvl "..getPlayerRoomOnSurvivalEvent(cid).." will start in "..config.startTime.." minutes.") setGlobalStorageValue(config.storages.global, 3) addEvent(function() broadcastMessage("Registration for the survival event lvl "..getPlayerRoomOnSurvivalEvent(cid).." have finished! The battle begins in 2 minutes!") setGlobalStorageValue(config.storages.global, 2) for i = 1, #addPlayerOnSurvivalEvent() do doPlayerSetNoMove(addPlayerOnSurvivalEvent(), false) end end, config.startTime * 1000) end return true else --Se for o tp para sair do evento [winner] doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) addItem(cid, config.prize[1], config.prize[2]) setPlayerStorageValue(cid, config.storages.storage, -1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Congratulations!\nYou have received your prize: "..config.prize[2].."x "..getItemNameById(config.prize[1])..".") if isFinishedSurvivalEvent() then --Se o evento terminou setGlobalStorageValue(config.storages.global, -1) --Altera a storage global que salva o state do evento end end end </pre> <p> </p> <p> </p> <p><span style="color:#ff0000;">*Obs.; deixei comentado as partes que eu editei pra melhor compreensão do código.</span></p> Editado Fevereiro 27, 2015 10 anos por david0703 (veja o histórico de edições) Atenciosamente, David Araujo Meu Conteúdo Fui útil? Gostou? Faça uma doação. "É errando que se erra." "Gambiarras resolvem instantemente, porém podem complicar em problemas futuros." "Cada dia vivido é um aprendizado."
Postado Fevereiro 27, 2015 10 anos Autor pelo que eu entendi, esse evento, todos os players de todos os levels, vão pra mesma sala de espera ? e depois vai ser teleportado pras salas de seus levels? pq no evento que eu quero, são 4 salas de espera, que o player ao entrar no portal, vai ser teleportado para a sala de espera do level dele se entendi mal, desculpe kk nao entendo muito irei testar só estou esperando meu notebook formatar aqui, por que no pc nao da pra testar nada, fica travando kk '-' quando testar edito aqui Editado Fevereiro 27, 2015 10 anos por subhe (veja o histórico de edições)
Postado Fevereiro 27, 2015 10 anos na vdd, eles esperariam na propria sala de combate ali... nao coloquei uma sala de espera... o jogador que entrar por ele, será teleportado para uma das quatro salas de acordo com o nível dele [50-199/200-299/300-399/400+]. se eu arranjar um tempo hj coloco. Editado Fevereiro 27, 2015 10 anos por david0703 (veja o histórico de edições) Atenciosamente, David Araujo Meu Conteúdo Fui útil? Gostou? Faça uma doação. "É errando que se erra." "Gambiarras resolvem instantemente, porém podem complicar em problemas futuros." "Cada dia vivido é um aprendizado."
Postado Fevereiro 27, 2015 10 anos Autor na vdd, eles esperariam na propria sala de combate ali... nao coloquei uma sala de espera... se eu arranjar um tempo hj coloco. ai parceiro, se ficar melhor pra você, vc pode mandar os player pra ser teleportado para sala de espera de cada level, no caso seriam 4 salas, e quando o evento começar, aparecer uma escada pra subir, por que a sala de combate irá ser emcima da sala de espera, mais que a escada só suba e nao desça e quando o evento acabar, aparecer o portal em um lugar configuravel, que teleport ele pra o templo, e ganhe a recompensa dele assim que ele entrar no portal se ficar melhor pra vc, pode ser assim tbm
Postado Fevereiro 27, 2015 10 anos Eu fiz o seguinte, os participantes são direcionados pra sala respectiva ao seu lvl logo que entra no portal, mas nao pode se movimentar até que seja anunciado o inicio do evento. Explicação da variável playerCount, presente no arquivo da pasta lib... quantidade mínima de participantes para que haja evento[em cada sala], quantidade máxima de players em cada sala. Cada sala vai funcionar independentemente, ou seja, pode ser que não hajam players suficientes na sala de lvl 400+, portanto, se houver algum player na sala após o término do tempo de inscrição no torneio [time], será direcionado ao templo. Isso não impede de acontecer o evento na sala de 50-199, caso hajam participantes suficientes. Em creaturescripts.lua, tem o seguinte código... local position = getCreaturePosition(cid) --Pega a posição do player position.x = position.x+1 --Adiciona 1 quadradinho pra DIREITA a variavel 'position' if not isWalkable(position) then position.x = position.x - 2 --Altera pra 1 quadradinho a ESQUERDA a variavel 'position' if not isWalkable(position) then --Se não puder caminhar nesse local position.x = position.x+1 --Retorna position.x ao seu valor original position.y = position.y+1 --Altera pra 1 quadradinho ACIMA a variavel 'position' if not isWalkable(position) then --Se não puder caminhar nesse local position.y = position.y - 2 --Altera pra 1 quadradinho ABAIXO a variavel 'position' end end end local item = doCreateItem(config.teleport.tpId, 1, position) --Cria o teleport no novo local doItemSetAttribute(item, "aid", config.aid) --Adiciona a action id para teleportar ao templo Esse código cria um portal em algum lugar viável próximo ao vencedor, evitando ter que ficar procurando. Não tive tempo pra adicionar ele a esperar na sala de espera... se der tempo amanhã faço pra vc. Abraços. Editado Fevereiro 27, 2015 10 anos por david0703 (veja o histórico de edições) Atenciosamente, David Araujo Meu Conteúdo Fui útil? Gostou? Faça uma doação. "É errando que se erra." "Gambiarras resolvem instantemente, porém podem complicar em problemas futuros." "Cada dia vivido é um aprendizado."
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.