Ir para conteúdo
  • Cadastre-se

Storm

Héroi
  • Total de itens

    1045
  • Registro em

  • Última visita

  • Dias Ganhos

    43

Histórico de Curtidas

  1. Obrigado
    Storm recebeu reputação de DiigooMix em (Resolvido)Global Storage   
    local Online = getPlayersOnline() -- Retorna uma Tabela local storage,value = 2442, 1 for pid = 1, #Online do setPlayerStorageValue(Online[pid], storage, value) end Ou
     
    setGlobalStorageValue(valueid, newvalue)  
  2. Gostei
    Storm recebeu reputação de Gabrielx17 em (Resolvido)[PEDIDO] PARALYZE MODIFICADO   
    @Baiak Furion
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, 27) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local condition = createConditionObject(CONDITION_HASTE) setConditionParam(condition, CONDITION_PARAM_TICKS, 60000) setConditionFormula(condition, 3.0, -24, 3.0, -24) setCombatCondition(combat, condition) function onCastSpell(cid, var) if getCreatureCondition(cid, CONDITION_PARALYZE) then doSendMagicEffect(getCreaturePosition(cid), 1) return doPlayerSendTextMessage(cid, 27, "Não pode usar essa magia enquanto estiver paralizado") else return doCombat(cid, combat, var) end end  
  3. Gostei
    Storm recebeu reputação de wellington.penazzi em (Resolvido)Habilidade que Causa danos continuo   
    local condition = createConditionObject(CONDITION_POISON) -- FIRE, POISON, etc.. setConditionParam(condition, CONDITION_PARAM_DELAYED, 1) addDamageCondition(condition, 5, 3000, -45) -- vezes, intervalo, dano setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) setCombatCondition(combat, condition) function onCastSpell(cid, var) return doCombat(cid, combat, var) end  
  4. Obrigado
    Storm recebeu reputação de Orientalz em [PEDIDO] MAGIA   
    Após o
    function onCastSpell(cid, var) Adicione :
    local storage = 15234 -- Coloque aqui a storage que o player ganhou ao completar a quest if getPlayerStorageValue(cid, storage) == -1 then doPlayerSendTextMessage(cid, 27, "Você precisa concluir a quest para usar a magia") doSendMagicEffect(getCreaturePosition(cid), 4) return true end  
  5. Gostei
    Storm recebeu reputação de FearWar em (Resolvido)FOOD MAGICO   
    @Phineasz 
    local config = { [2150] = {tip = "Mana", textType = 27, msg = "Mana refilled.", effect = 3}, [2151] = {tip = "Life", textType = 27, msg = "Life refilled.", effect = 3} } function onUse(cid, item, fromPosition, itemEx, toPosition) local var = config[item.id] if var then doRemoveItem(item.uid, 1) doPlayerSendTextMessage(cid, var.textType, var.msg) doSendMagicEffect(fromPosition, var.effect) if string.lower(var.tip) == string.lower("Mana") then doCreatureAddMana(cid, getCreatureMaxMana(cid)) else doCreatureAddHealth(cid, getCreatureMaxHealth(cid)) end end return true end  
  6. Obrigado
    Storm recebeu reputação de Merascylla em (Resolvido)PISO QUE DA DANO ALEATORIO   
    @Gnius 
    local danos = { {10, 3}, {20, 6}, {30, 5}} -- {Porcentagem, effect} function onStepIn(cid, item, position, fromPosition) if not isPlayer(cid) then return true end local dmg = danos[math.random(1, #danos)] local damage = math.ceil((tonumber(dmg[1])* 0.01) * getCreatureMaxHealth(cid)) doSendMagicEffect(getThingPos(cid), dmg[2]) doSendAnimatedText(getThingPos(cid), '- ' .. damage, TEXTCOLOR_LIGHTBLUE) doCreatureAddHealth(cid, - damage) return true end  
  7. Curtir
    Storm recebeu reputação de marcoshps11 em [otcv8] Como utilizar - Ip fixo, spr, encrypt, auto update   
    Excelente tutorial, obrigado pelo conteúdo! OBS: Escutem o áudio do inicio da postagem, é importante.
  8. Gostei
    Storm recebeu reputação de Cat em [otcv8] Como utilizar - Ip fixo, spr, encrypt, auto update   
    Excelente tutorial, obrigado pelo conteúdo! OBS: Escutem o áudio do inicio da postagem, é importante.
  9. Obrigado
    Storm deu reputação a marcoshps11 em [otcv8] Como utilizar - Ip fixo, spr, encrypt, auto update   
    * Áudio de saudação *
     
    Neste tutorial, irei ensinar alguns passos inicias para utilizar o OTClientV8
     
    1º Passo: Como fixar ip e colocar a spr no local correto
     
    - Faço o download no link: https://github.com/OTCv8/otclientv8
    - Extraia o arquivo
    - Dentro da pasta principal, vá até o arquivo init.lua
     
    Neste trecho, precisará remover os comentários --[[ e ]]:
    Servers = { --[[ OTClientV8 = "http://otclient.ovh/api/login.php", OTClientV8c = "otclient.ovh:7171", OTClientV8Test = "http://otclient.ovh/api/login2.php", LocalTestServ = "127.0.0.1:7171:1098:110:30:93" ]] }  
    Ficando assim:
    Servers = { Meuserver = "127.0.0.1:7171:1098" } ficando na seguinte configuração NOME = "IP:PORTA:VERSÃO"
     
     
    Para fixar e não aparecer a lista de servers, basta alterar:
    ALLOW_CUSTOM_SERVERS = true -- if true it shows option ANOTHER on server list  
    Para:
    ALLOW_CUSTOM_SERVERS = false -- if true it shows option ANOTHER on server list  
     
    Caso queira trocar o nome do aplicativo é só mudar
    g_app.setName("OTCv8") trocando o "OTCv8" para o nome desejado, lembrando que isto irá alterar apenas o nome da janela do aplicativo
     
     
    Incluir a SPR/Dat:

    Para incluir, basta ir na pasta data, criar uma nova pasta e renomear com o nome "things" e depois criar uma outra pasta dentro dela com o nome da versão que desejar utilizar, exemplos:
    * 800
    * 860
    * 910
    * 1100
    dentro desta pasta, incluir as respectivas spr/dat da versão correspondente 

    Um vídeo objetivo do conteúdo citado acima:
     
     
     

     
    2º Passo: Remover campo "Token" da tela inicial
     
    Apesar de ser algo simples, vejo muitos perguntarem como remover este campo, vamos lá:

    - Vá até a pasta modules -> client_entergame
    - Abra o arquivo entergame.lua
    - Na linha 380 remova ou comente o trecho:
    enterGame:getChildById('accountTokenTextEdit'):clearText()  
    - Na linha 412 remova ou comente o trecho:
    G.authenticatorToken = enterGame:getChildById('accountTokenTextEdit'):getText()  
    - salve o arquivo
    - na mesma pasta, abra o arquivo entergame.otui
    - da linha 32 a 44 remova ou comente o seguinte trecho:
    MenuLabel !text: tr('Token') anchors.left: prev.left anchors.top: prev.bottom text-auto-resize: true margin-top: 8 TextEdit id: accountTokenTextEdit anchors.left: parent.left anchors.right: parent.right anchors.top: prev.bottom margin-top: 2  
    Um vídeo objetivo do conteúdo citado acima:
     
     

    3º Passo: como encriptar os arquivos
     
    - Recomendo inicialmente criar uma cópia da pasta que ira encriptar, pois não é reversivo
    - Copie o endereço da pasta onde estão os arquivos
    - Abra o cmd e navegue até esta pasta utilizando o comando cd (link do endereço da pasta)
    - utilize o comando otclient_dx.exe --encrypt
    - Aguarde o sistema sinalizar que os arquivos foram encriptados 
     
    PS: a pasta do modulo bot ( modules -> game_bot ) não pode ser encriptado, remova ela antes deste processo.
     
    Um vídeo objetivo do conteúdo citado acima:
     
     

    4º Passo: Utilizando o auto update
     
    IMPORTANTE:
    Este processo precisa ser feito exatamente como demonstrado, qualquer link errado o sistema não irá funcionar.
     
    - Dentro da pasta API, abra o arquivo updater_advanced.php
     
    em $files_dir = "/var/www/otclient/files"; é a pasta onde conterá os arquivos do otclient para download, lembrando que o caminho precisa estar especificada desde a pasta inicial
    em $files_url = "http://otclient.ovh/files"; é o link que você pode utilizar o navegador para acessar a pasta "files" a mesma pasta do processo anterior.
    em $checksum_update_interval = 60; é o tempo em segundos, que o update levará para checkar se há alguma atualização ( não é necesário alterar )
     
    - Na sua vps, dentro da pasta do SITE, cria uma pasta chamada API e outra pasta dentro dela chamada FILES
    - Envie o arquivo updater_advanced.php para a pasta API
    - De permissão 777 para pasta e subpasta API
     
    * voltando aos arquivos do otclient * 
     
    - Abra o arquivo init.lua
     
    aconselho alterar o "APP_NAME = "otclientv8", pois é o nome da pasta que ficará salva nos arquivos temporários, isso evitará conflitos com versões já existe no pc
    altere o campo updater, colocando o endereço apontado para o arquivo updater_advanced.php enviado para o seu site nos passos anteriores.
     
    - Após as edições anteriores, salve o arquivo 
    - Compacte os arquivos data, layout, modules e init.lua, renomeando para data.zip ( obrigatoriamente precisa ser zip )
    - Exclua os arquivos zipados e os demais desnecessários para os jogadores.
     
    Atenção: o auto update só funcionará se os arquivos estiverem zipado conforme descrito.
     
    - Envie todos os arquivos para a pasta files em sua vps ( recomendo zipar para enviar, poupara processamento e tempo de envio )
    - Após enviar, extraia os arquivos NA VPS, os arquivos no pc devem continuar zipado
    - Atenção nesta parte, as pastas e arquivo data / layout / modules / init.lua necessáriamente precisam estar na mesma pasta do executáveis, conforme time 4:20 no vídeo que deixarei disponível no final.
     
    lembrando: o update só aceitará arquivos editados após o tempo estipulado em checksum_update_interval , se fizer edições antes deste tempo, o sistema não irá considerar
     
     
    Um vídeo objetivo do conteúdo citado acima:
     
     
     
  10. Gostei
    Storm deu reputação a Cjaker em Anti Map-Tracker [8.54 & 8.60]   
    Heyo, desenvolvi uma proteção básica pra evitar que roubem seu mapa em servidores 8.54 e 8.60.
    Lembrando que é bastante simples e pessoas com conhecimento médio à avançado conseguem entender a lógica e atualizar um map tracker.
    Se caso muitos precisarem e/ou gostarem deste conteúdo, irei trazer uma versão com proteção mais forte, mas será incluso uma .dll
    [Tudo foi testado em cima do 8.54 e 8.60 usando as sources do OTX2]
     
    [Download]
    TibiaAntiMapTrackPatcher.exe
     
    [Scan]
    https://www.virustotal.com/gui/file/316f854a845705ec10be8b148e400e593602d697c836479bfa65cd5839387a42/detection

    [Tutorial]
    => Cliente: baixe o software no tópico, arraste o seu executável do Tibia (8.6 ou 8.54) no .exe do software, quando der a mensagem 'Done.' será gerado um arquivo na mesma pasta chamado 'Tibia_output.exe' ele é seu novo Cliente 'protegido'.
     
    => Servidor (OTX2 8.60) (https://github.com/mattyx14/otxserver/blob/otxserv2/sources/protocolgame.cpp)
    Abra o arquivo protocolgame.cpp na source do seu servidor, procure por:
    msg->addByte(0x6D);  
    Abaixo terá essa linha:
    msg->addPosition(oldPos);  
    Substitua por:
    msg->add<uint32_t>(oldPos.x); msg->add<uint16_t>(oldPos.y); msg->addByte(oldPos.z); Obs: vai pesquisando e substituindo todos que encontrar!
    Procure por:
    msg->addByte(0x64); msg->addPosition(player->getPosition()); Substitua por:
    msg->addByte(0x64); Position playerPosition = player->getPosition(); msg->add<uint32_t>(playerPosition.x); msg->add<uint16_t>(playerPosition.y); msg->addByte(playerPosition.z); Bom, após tudo isso compile o servidor e estará com um 'anti-track' ativo, assim o map tracker padrão não conseguirá interpretar o mapa evitando que possa ser 'trackeado'.
  11. Curtir
    Storm recebeu reputação de Bruce Pereira em (Resolvido)Erro ao usar Spell de Buff   
    @Zyros 
    local tempo = 180 -- tempo em segundos. local efeito = 98 -- effect no player, caso queira apenas 1, basta remover os outros numeros. local ml = 40 -- quantos ira aumentar o skill de ML local skillfist = 0 -- quantos ira aumentar o skill de Fist local skillsword = 40 -- quantos ira aumentar o skill de Sword local skillaxe = 40 -- quantos ira aumentar o skill de Axe local skillclub = 40 -- quantos ira aumentar o skill de Club local skilldistance = 40 -- quantos ira aumentar o skill de Distance local skillshield = 0 -- quantos ira aumentar o skill de Shield local health = 350 -- A cada 1 segundo quantos aumentar de vida local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, 0) local condition = createConditionObject(CONDITION_ATTRIBUTES) setConditionParam(condition, CONDITION_PARAM_TICKS, tempo*1000) setConditionParam(condition, CONDITION_PARAM_STAT_MAGICLEVEL, ml) setConditionParam(condition, CONDITION_PARAM_SKILL_FIST, skillfist) setConditionParam(condition, CONDITION_PARAM_SKILL_SWORD, skillsword) setConditionParam(condition, CONDITION_PARAM_SKILL_AXE, skillaxe) setConditionParam(condition, CONDITION_PARAM_SKILL_CLUB, skillclub) setConditionParam(condition, CONDITION_PARAM_SKILL_DISTANCE, skilldistance) setConditionParam(condition, CONDITION_PARAM_SKILL_SHIELD, skillshield) setConditionParam(condition, CONDITION_PARAM_OUTFIT, outfit) setCombatCondition(combat, condition) local condition = createConditionObject(CONDITION_HASTE) setConditionParam(condition, CONDITION_PARAM_SPEED, 250) setConditionParam(condition, CONDITION_PARAM_TICKS, tempo*1000) setConditionParam(condition, CONDITION_PARAM_BUFF, TRUE) setCombatCondition(combat, condition) local condition = createConditionObject(CONDITION_REGENERATION) setConditionParam(condition, CONDITION_PARAM_SUBID, 1) setConditionParam(condition, CONDITION_PARAM_BUFF, TRUE) setConditionParam(condition, CONDITION_PARAM_TICKS, tempo*1000) setConditionParam(condition, CONDITION_PARAM_HEALTHGAIN, health) setConditionParam(condition, CONDITION_PARAM_HEALTHTICKS, 1000) setCombatCondition(combat, condition) function onCastSpell(cid, var) if getCreatureCondition(cid, CONDITION_REGENERATION, 1) == false then doCombat(cid, combat, var) repeatEff(cid, efeito, tempo) doCreatureSay(cid, "FURIE", TALKTYPE_MONSTER) else doPlayerSendCancel(cid, "Sorry, you are transformed.") end end
    Depois, adicione na sua LIB:
    local effsTortos = { --[eff] = {valores para corrigi-los}, [175] = {x= 1, y= 0}, --naruto } function repeatEff(cid, eff, tempo) if not isCreature(cid) or tempo == 0 then return end local p = getThingPos(cid) if effsTortos[eff] then p = {x= p.x+(effsTortos[eff].x), y= p.y+(effsTortos[eff].y), z= p.z} end doSendMagicEffect(p, eff) addEvent(repeatEff, 500, cid, eff, tempo-1) end  
  12. Curtir
    Storm deu reputação a GamerGoiano em TFS 1.3 8.60 by Nekiro (Tela Extendida)   
    Download: https://www.mediafire.com/file/8phk1r3z9i9ye61/tfs+1.3+8.60+by+nekiro.rar/file
    Scan: https://www.virustotal.com/gui/file/3513f18d45c9109f62fa6d1b4de9c21c2297d920fb09947972cd3a190919749c/detection
    Conteúdo: Otclient Com Sources, TFS com Sources, Site Znote, Tudo Configurado.
     
    Como usar:
    Basta baixar, extrair, criar um banco de dados no xampp mais atualizado com o nome: Tibia e importar os 2 banco de dados que estão na pasta do TFS
    Copiar a pasta htdocs e colocar em C:\Xampp substituir a pasta Htdocs que tem lá.
    Abrir o Servidor e Abrir o cliente e jogar. (Crie a conta no site)
     
    Descrição:
    Esse é o TFS 1.3 que o Nekiro passou pra 8.60, eu apenas extendi a tela pra ficar melhor.
    Deixei TFS em x64 bits pq eu compilei pelo vcpkg, se quiser pode compilar vc mesmo em x86.

    Alterações:
    1. Tela Extendida (Aumentei a tela pra 20)
    2. Adicionado X Y Z no Minimap
    3. Removi os Painéis como Padrão
    4. Atalho pra aumentar e diminuir zoom CTRL + e CTRL -


  13. Curtir
    Storm deu reputação a Movie em [SafeZone] Evento by Movie & LuanLuciano   
    [SafeZone 1.x]

    Hellou galera, a um tempo atrás tinha postado um safezone que eu e o @luanluciano93 tinhamos feito e por algumas questões resolvi apagar o tópico.
    Hoje venho postá-lo novamente porém mais otimizado e com maior número de configurações.
    Qualquer bug que houver durante o decorrer do evento só me avisar nesse tópico que irei fixar (SOMENTE NESSE TÓPICO, NÃO ME PROCUREM NO DISCORD NEM VIA PM)

     
    Na pasta lib, crie um arquivo chamado safezone.lua
     
    --[[ Evento SafeZone escrito por LuanLuciano93 e Movie (Movie#4361) Otimizado por Movie Disponibilizado para o TibiaKing e não autorizo outras reproduções Mantenha os créditos <3 --]] SAFEZONE = { teleportTimeClose = 5, eventTimeTotal = 30, positionTeleportOpen = Position(1003, 1217, 7), -- Posição que o portal irá abrir positionEnterEvent = Position(1545, 957, 7), -- Para onde os players irão storage = 12149, -- Não mexa actionId = 6412, -- ActionID que irá no portal ao ser criado, tem que ser o mesmo do movements protectionTileId = {9562, 9563, 9564, 9565}, -- ID dos pisos que serão criados levelMin = 150, minPlayers = 5, maxPlayers = 50, reward = {9020, 5}, -- ID do Item, Quantidade players = {}, days = { ["Sunday"] = {"20:00"}, ["Monday"] = {"20:00"}, ["Tuesday"] = {"20:00"}, ["Wednesday"] = {"20:00"}, ["Thursday"] = {"20:00"}, ["Friday"] = {"20:00"}, ["Saturday"] = {"20:00"}, }, messages = { prefix = "[SafeZone] ", messageStart = "O evento irá começar agora com %d participantes! Boa sorte!", messageNoStart = "O evento não foi iniciado por falta de participantes!", messageTime = "O evento foi finalizado por ultrapassar o limite de tempo!", messageOpen = "O evento foi aberto, você tem %d minutos para entrar no portal do evento que se encontra no templo!", messageWait = "O teleporte para o evento está aberto, você tem %d minuto(s) para entrar!", messageFinish = "O evento foi finalizado e o ganhador foi o %s! Parabéns!", messageWinner = "Você ganhou %d %s como premiação pelo primeiro lugar!", }, lifeColor = { [1] = 94, -- red [2] = 77, -- orange [3] = 79 -- yellow }, positionEvent = {firstTile = {x = 1538, y = 951, z = 7}, tilesX = 15, tilesY = 11} -- No final do tópico ensino a configurar } function SAFEZONE:teleportCheck() local tile = Tile(SAFEZONE.positionTeleportOpen) if tile then local item = tile:getItemById(1387) if item then item:remove() local totalPlayers = SAFEZONE:totalPlayers() if totalPlayers >= SAFEZONE.minPlayers then Game.broadcastMessage(SAFEZONE.messages.prefix .. SAFEZONE.messages.messageStart:format(totalPlayers), MESSAGE_STATUS_WARNING) SAFEZONE:createProtectionTiles() addEvent(function() if totalPlayers > 0 then Game.broadcastMessage(SAFEZONE.messages.prefix .. SAFEZONE.messages.messageTime, MESSAGE_STATUS_WARNING) SAFEZONE:removePlayers() end end, SAFEZONE.eventTimeTotal * 60 * 1000) else Game.broadcastMessage(SAFEZONE.messages.prefix .. SAFEZONE.messages.messageNoStart, MESSAGE_STATUS_WARNING) SAFEZONE:removePlayers() end else Game.broadcastMessage(SAFEZONE.messages.prefix .. SAFEZONE.messages.messageOpen:format(SAFEZONE.teleportTimeClose), MESSAGE_STATUS_WARNING) addEvent(Game.broadcastMessage, (SAFEZONE.teleportTimeClose - 3) * 60 * 1000, SAFEZONE.messages.prefix .. (SAFEZONE.messages.messageWait):format(SAFEZONE.teleportTimeClose - 2)) addEvent(Game.broadcastMessage, (SAFEZONE.teleportTimeClose - 1) * 60 * 1000, SAFEZONE.messages.prefix .. (SAFEZONE.messages.messageWait):format(SAFEZONE.teleportTimeClose - 4)) local teleport = Game.createItem(1387, 1, SAFEZONE.positionTeleportOpen) if teleport then teleport:setActionId(SAFEZONE.actionId) end addEvent(function() SAFEZONE:teleportCheck() end, SAFEZONE.teleportTimeClose * 60000) end end end function SAFEZONE:removePlayers() for a in pairs(SAFEZONE.players) do local player = Player(a) player:setStorageValue(SAFEZONE.storage, 0) player:teleportTo(player:getTown():getTemplePosition()) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) end end function SAFEZONE:insertPlayer(playerId) SAFEZONE.players[playerId] = {} end function SAFEZONE:removePlayer(playerId) SAFEZONE.players[playerId] = nil end function SAFEZONE:totalPlayers() local x = 0 for a in pairs(SAFEZONE.players) do x = x + 1 end return x end function SAFEZONE:totalProtectionTile() local totalPlayers = SAFEZONE:totalPlayers() if totalPlayers >= 10 then return totalPlayers - 3 else return totalPlayers - 1 end end function SAFEZONE:createProtectionTiles() local totalPlayers = SAFEZONE:totalPlayers() if SAFEZONE:totalPlayers() == 1 then for a in pairs(SAFEZONE.players) do local player = Player(a) if player:getStorageValue(SAFEZONE.storage) > 0 then player:setStorageValue(SAFEZONE.storage, 0) SAFEZONE.players[a] = nil player:teleportTo(player:getTown():getTemplePosition()) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) local itemType = ItemType(SAFEZONE.reward[1]) if itemType:getId() ~= 0 then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, SAFEZONE.messages.prefix .. SAFEZONE.messages.messageWinner:format(SAFEZONE.reward[2],itemType:getName())) player:addItem(itemType:getId(), SAFEZONE.reward[2]) end Game.broadcastMessage(SAFEZONE.messages.prefix .. SAFEZONE.messages.messageFinish:format(player:getName()), MESSAGE_STATUS_WARNING) end end elseif totalPlayers >= SAFEZONE.minPlayers then local createTiles, totalTiles = 0, SAFEZONE:totalProtectionTile() local tileX = SAFEZONE.positionEvent.firstTile.x local tileY = SAFEZONE.positionEvent.firstTile.y local tileZ = SAFEZONE.positionEvent.firstTile.z local tilesX = SAFEZONE.positionEvent.tilesX local tilesY = SAFEZONE.positionEvent.tilesY local protectionTileId = SAFEZONE.protectionTileId while createTiles < totalTiles do local randomX = math.random(tileX, tileX + tilesX) local randomY = math.random(tileY, tileY + tilesY) local newPosition = Position({x = randomX, y = randomY, z = tileZ}) local tile = Tile(newPosition) if tile then local item1 = tile:getItemById(protectionTileId[1]) local item2 = tile:getItemById(protectionTileId[2]) local item3 = tile:getItemById(protectionTileId[3]) local item4 = tile:getItemById(protectionTileId[4]) if not item1 and not item2 and not item3 and not item4 then local randomTile = math.random(protectionTileId[1], protectionTileId[4]) local tileProtection = Game.createItem(randomTile, 1, newPosition) if tileProtection then tileProtection:getPosition():sendMagicEffect(CONST_ME_ENERGYHIT) addEvent(function() SAFEZONE:deleteProtectionTiles(newPosition, randomTile) end, 5000) createTiles = createTiles + 1 end end end end addEvent(function() SAFEZONE:effectArea(SAFEZONE.positionEvent.firstTile, SAFEZONE.positionEvent.tilesX, SAFEZONE.positionEvent.tilesY) end, 5000) addEvent(function() SAFEZONE:checkPlayersinProtectionTiles() end, 4000) addEvent(function() SAFEZONE:createProtectionTiles() end, 6000) end end function SAFEZONE:deleteProtectionTiles(position, tileId) local tile = Tile(position) if tile then local item = tile:getItemById(tileId) if item then item:getPosition():sendMagicEffect(CONST_ME_POFF) item:remove() end end end function SAFEZONE:checkPlayersinProtectionTiles() local protectionTileId = SAFEZONE.protectionTileId for a in pairs(SAFEZONE.players) do local player = Player(a) if player:getStorageValue(SAFEZONE.storage) > 0 then local tile = Tile(player:getPosition()) if tile then local item1 = tile:getItemById(protectionTileId[1]) local item2 = tile:getItemById(protectionTileId[2]) local item3 = tile:getItemById(protectionTileId[3]) local item4 = tile:getItemById(protectionTileId[4]) if not item1 and not item2 and not item3 and not item4 then if player:getStorageValue(SAFEZONE.storage) > 1 then player:setStorageValue(SAFEZONE.storage, player:getStorageValue(SAFEZONE.storage) - 1) local lifes = player:getStorageValue(SAFEZONE.storage) player:setStorageValue(SAFEZONE.storage, 0) player:getPosition():sendMagicEffect(CONST_ME_FIREAREA) SAFEZONE.players[player:getId()] = nil local outfit = player:getSex() == 0 and 136 or 128 if lifes == 1 then local lifeColor = SAFEZONE.lifeColor[1] player:setOutfit({lookType = outfit, lookHead = lifeColor, lookBody = lifeColor, lookLegs = lifeColor, lookFeet = lifeColor}) elseif lifes == 2 then local lifeColor = SAFEZONE.lifeColor[2] player:setOutfit({lookType = outfit, lookHead = lifeColor, lookBody = lifeColor, lookLegs = lifeColor, lookFeet = lifeColor}) end player:setStorageValue(SAFEZONE.storage, lifes) else player:setStorageValue(SAFEZONE.storage, 0) player:getPosition():sendMagicEffect(CONST_ME_FIREAREA) player:teleportTo(player:getTown():getTemplePosition()) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) end end end end end end function SAFEZONE:effectArea(firstTile, tilesX, tilesY) local fromPosition = firstTile local toPositionX = fromPosition.x + tilesX local toPositionY = fromPosition.y + tilesY for x = fromPosition.x, toPositionX do for y = fromPosition.y, toPositionY do local position = Position({x = x, y = y, z = fromPosition.z}) if position then position:sendMagicEffect(CONST_ME_SMALLPLANTS) end end end end Não esqueça de registrar essa lib no lib.lua

     
    Agora na pasta movements/scripts crie um arquivo chamado safezone.lua
    --[[ Evento SafeZone escrito por LuanLuciano93 e Movie (Movie#4361) Otimizado por Movie Disponibilizado para o TibiaKing e não autorizo outras reproduções Mantenha os créditos <3 --]] function onStepIn(creature, item, position, fromPosition) local player = creature:getPlayer() if not player then return true end if player:getGroup():getAccess() then player:teleportTo(SAFEZONE.positionEnterEvent) return true end if player:getLevel() < SAFEZONE.levelMin then player:sendCancelMessage(SAFEZONE.messages.prefix .."Você precisa ser level " .. SAFEZONE.levelMin .. "ou maior para entrar no evento.") player:teleportTo(fromPosition, true) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end if player:getItemCount(2165) >= 1 then player:sendCancelMessage(SAFEZONE.messages.prefix .."Você não pode entrar com um stealth ring no evento.") player:teleportTo(fromPosition, true) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end local ring = player:getSlotItem(CONST_SLOT_RING) if ring then if ring:getId() == 2202 then player:sendCancelMessage(SAFEZONE.messages.prefix .." Você não pode entrar no evento com um stealth ring.") player:teleportTo(fromPosition, true) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end end for a in pairs(SAFEZONE.players) do target = Player(a) if player:getIp() == target:getIp() then player:sendCancelMessage(SAFEZONE.messages.prefix .. "Você já possui um outro player dentro do evento.") player:teleportTo(fromPosition, true) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end end if SAFEZONE:totalPlayers() >= SAFEZONE.maxPlayers then player:sendCancelMessage(SAFEZONE.messages.prefix .. "O evento já atingiu o número máximo de participantes.") player:teleportTo(fromPosition, true) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end local outfit = player:getSex() == 0 and 136 or 128 local treeLifeColor = SAFEZONE.lifeColor[3] player:setOutfit({lookType = outfit, lookHead = treeLifeColor, lookBody = treeLifeColor, lookLegs = treeLifeColor, lookFeet = treeLifeColor}) player:sendTextMessage(MESSAGE_INFO_DESCR, SAFEZONE.messages.prefix .."Você entrou no evento. Boa sorte!") player:teleportTo(SAFEZONE.positionEnterEvent) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) player:setStorageValue(SAFEZONE.storage, 3) SAFEZONE:insertPlayer(player:getId()) return true end <movevent event="StepIn" actionid="6412" script="safezone.lua" />
    Agora vá na pasta globalevents/scripts e crie o arquivo safezone.lua
    function onThink(interval) if SAFEZONE.days[os.date("%A")] then local hrs = tostring(os.date("%X")):sub(1, 5) if isInArray(SAFEZONE.days[os.date("%A")], hrs) then SAFEZONE:teleportCheck() end end return true end <globalevent name="SafeZone" interval="60000" script="safezone.lua" />  

     

     
    No quadrado azul marinho você configura a posição do 
    firstTile = {x = x, y = y, z = z} Em verde, você conta quantos quadrados existem e coloque em
    tilesX = quantidade Em vermelho, você conta quantos quadrados existem e coloque em
    tilesY = quantidade De resto, as outras configurações estão bem explícitas.

     
    Créditos
    30% Movie
    69% @luanluciano93
    1% @WooX (pela divisória rs)

     
  14. Curtir
    Storm deu reputação a Augusto em [Resolvido] Site Permission denied   
    você esta instalando ele?
    tente executar

    chmod 777 -R /var/www/

    pois este erro é de permissão na pasta!
  15. Curtir
    Storm deu reputação a WooX em Depot Locker System   
    Depot Locker System

    Escrevi esse sistema no ano passado a pedido de um amigo e finalmente deixei a preguiça de lado pra postar ele aqui. Aviso de antemão que o sistema é funcional apenas para OTX2 e TFS 0.4, para utilizar a função doShowTextDialog da maneira como está no sistema no TFS 0.4 e inferiores é necessário uma alteração na source, link abaixo.
     
    O que faz?
     Este sistema consiste em adicionar um layer extra de segurança para o jogador, permitido criar uma senha para acesso do depot. Isso possibilita o jogador passar sua senha a amigos em que não confia totalmente e a estar precavido até certo ponto no caso de hacking.
    Vídeo
     
     
    Instalação
    Este sistema utiliza de funções contidas na lib do link abaixo, então antes de mais nada é necessário adicionar esta lib no servidor.
     
    Depois de instalado a lib, basta baixar os arquivos anexados no tópico, adicionar em seus respectivos locais e registrar as tags XML contidas nos mesmos. Após isso é necessário adicionar o action id configurado no piso dos depots em que o sistema deve funcionar. Toda configuração do sistema se encontra dentro do arquivo lib_depotlocker.lua, segue explicação da seção de configuração.
    config = { useBoard = false, passMinLength = 4, passMaxLength = 12, askPassOnlyOneTimePerLogin = true, boardIDs = {1811, 1818}, -- West/East and North/South depotIDs = {2589, 2590, 2591, 2592}, -- South, West, North and East typeYourPassMsg = "Digite sua senha: ", rightPassMsg = "Senha correta, depot liberado.", wrongPassMsg = "Senha incorreta, tente novamente.", wrongTries = { limitTries = true, triesBeforeBlock = 5, blockTime = 15 * 60, -- 15 Minutos triesLeftMsg = "Senha incorreta, você ainda tem %s tentativa.", blockMsg = "Depot bloqueado, tente novamente em %s." }, } useBoard: pode ser definido como true ou false, se definido como verdadeiro irá criar um quadro ao lado do depot para o player poder digitar a senha, da mesma forma que é mostrada no vídeo, (eu recomendo deixar esta opção ativada somente se utilizar paredes como separador entre um depot e outro). passMinLength/passMaxLength: definem o valor minimo e máximo de caracteres que uma senha pode ter. askPassOnlyOneTimePerLogin: pode ser definido como true ou false, se definido como verdadeiro irá pedir a senha novamente apenas se o jogador sair e entrar novamente. boardIDs: aqui é preenchido os IDs dos quadros em que o player deve digitar a senha, um ID para vertical e outro para a horizontal. depotIDs: aqui é preenchido os IDs dos depots na respectiva ordem, sul, oeste, norte e leste. typeYourPassMsg: esta é a mensagem que irá aparecer na caixa de texto orientando o jogador a digitar a senha. rightPassMsg: esta é a mensagem que irá aparecer quando o jogador digitar a senha correta. wrongPassMsg: esta é a mensagem que irá aparecer quando o jogador digitar a senha incorreta. limitTries: pode ser definido como true ou false, se definido como verdadeiro irá bloquear as tentativas do jogador caso ele digite a senha incorreta um determinado numero de vezes. triesBeforeBlock: quantidade de tentativas incorretas para realizar o bloqueio. blockTime: Tempo de bloqueio (valor é definido em segundos). triesLeftMsg: esta é a mensagem que será enviada para o jogador com a quantidade de tentativas que ele ainda possui. blockMsg: esta é a mensagem que será enviada para o jogador caso todas suas tentativas falhem e ele seja bloqueado.  
     
    Lembrando que o action id configurado em depotTile deve ser o mesmo registrado no script de movement e deve ser adicionado no piso do depot.

     
    Créditos
    @Yan Liima pela idealização do sistema e vídeo de demonstração.
    @Baiakeiro por testar a versão final do sistema.
    locker_action.lua locker_creature.lua locker_movement.lua npc.lua npc.xml
  16. Curtir
    Storm recebeu reputação de Rogex Joyz em (Resolvido)Login.lua dando erro   
    @Rogex Joyz 
     
     
  17. Curtir
    Storm deu reputação a WooX em Algumas funções Lua   
    Biblioteca de funções Lua
     
    Eu me recordo que alguns anos atrás quando iniciei meus estudos em Lua, a biblioteca de funções postada pelo @xWhiteWolf me ajudou muito com a escrita de alguns scripts, me fez economizar tempo e algumas linhas de código. Ter uma biblioteca de funções uteis é uma mão na roda para qualquer desenvolvedor pois poupa tempo que teria de ser gasto desenvolvendo algo que algum outro programador provavelmente já fez.
     
    Pensando nisso, hoje eu decidi trazer algumas funções Lua, tenho certeza que poderá ser útil pra alguém algum dia. Algumas dessas funções foram feitas por mim, outras por amigos meus e algumas eu já nem lembro mais onde encontrei. Irei postar aqui o conteúdo desta biblioteca porem ela também estará no final do tópico como anexo. As funções que me recordo a origem estará com os créditos do autor.
     
    Lib
     
    Explicação das funções:
     
    Por enquanto é isso... pretendo atualizar este tópico sempre que achar necessidade de escrever algo novo ou encontrar algo que possa ser útil a biblioteca.
     
    090-woox_functions.lua
  18. Curtir
    Storm recebeu reputação de Pvp Easy em AJUDA SCRIPT ERRO   
    @Pvp Easy O servidor não tem a função getGuildNameByID adicionada. Vai em lib > 050-function.lua, desce tudo e no final adiciona a função:
    function getGuildNameByID(id) local Info = db.getResult("SELECT `name` FROM `guilds` WHERE `id` = " .. id .. ";") if Info:getID() ~= LUA_ERROR then local Name= Info:getDataString("name") Info:free() return Name end return LUA_ERROR end  
  19. Curtir
    Storm recebeu reputação de Rogex Joyz em (Resolvido)Exhausted em uma lever   
    @Rogex Joyz 
     

    Configure as posições que eu mostrei na imagem acima, nessa parte aqui:
    area = { -- fromPos e toPos {x = 18, y = 60, z = 13}, {x = 21, y = 60, z = 13}, },
     
  20. Curtir
    Storm recebeu reputação de Lisbeky em (Resolvido)Aumentar Charges   
    @Lisbeky 
    local config = { item = 2131, -- ID do item count = 1, -- Qnt de item que será removida charges = 1000, -- Charges remove = 9020, -- Item que será removido countr = 25, -- Qnt do item que será removida texto = "Você comprou star amulet. Custou 25 Tokens.", texto2 = "Tokens insuficientes. Precisa de 25 Tokens para comprar star amulet.", effect = 15 } function onUse(cid, item, fromPosition, itemEx, toPosition) if doPlayerRemoveItem(cid, config.remove, config.countr) then doPlayerSendTextMessage(cid, 22, config.texto) local item = doPlayerAddItem(cid, config.item, config.count) doItemSetAttribute(item, "charges", config.charges) doSendMagicEffect(fromPosition, config.effect) else doPlayerSendTextMessage(cid, 22, config.texto2) end return true end  
  21. Curtir
    Storm recebeu reputação de GOD Vitor em (Resolvido)Check party item   
    @esnio12 Tenta assim:
    local itemid, count = 2155, 1 local party_id = getPartyMembers(cid) for _, var in pairs(party_id) do if getPlayerItemCount(var, itemid) <= count then doPlayerSendTextMessage(cid, 27, "O jogador ".. getPlayerNameById(var) .." nao tem a quantidade do item suficiente") return true end end  
  22. Curtir
    Storm deu reputação a Bruxo Ots em Npc Imbuiment item Seller   
    Ola meus queridos, trago para vosas senhorias este belo npc vendedor de itens para imbuiment.
     
    Ele pode ser melhorado? sim claro.
    Esta funcionando? sim claro
    Bruxo você entende de programação? claro...que não.
     
    Esta por Gold, ja que curto coisas custons, o npc base usado foi a A Sweaty Cyclops.
    E isso pessoal espero que usem e abusem.
     
     
    Instalação:
    Dentro da pasta Npc de CTRL+C E CTRL+V em cima de algum dos arquivos .XML e renomeio o mesmo para Imbuiment.
    ou o nome que desejar e cole isso dentro.
    <?xml version="1.0" encoding="utf-8"?> <npc name="Imbuiment Seller" script="Imbuiment.lua" walkinterval="0" floorchange="0"> <health now="100" max="100" /> <look type="1078" /> </npc>  
     
    Crie um arquivo na pasta Npc/Scripts chamado de Imbuiment.lua ou o nome que desejar e cole isso dentro!!!
     
     
    Essa é a linha que pede os golds e que remove o mesmo pela troca dos items if player:removeItem(2160,100) then.
    2160, id do coin e 100 a quantidade.
     
    Já essa é a linha que vai adicionar os items ao player. Deixei comentado pra ficar facil a visualização.
    player:addItem(10602, 25) --Vampire Teeth
    player:addItem(10550, 15) --Bloody Pincers
    player:addItem(10580, 5) --Piece of Dead Brain
     
     
     
    É isso queridos até o proximo npc basicão.
  23. Curtir
    Storm deu reputação a grafit em [Função] getPlayersInArea   
    Função que retorna os players que estão numa área específica
     
    function getPlayersInArea(fromPos, toPos) -- function by amoeba13 playersInArea = {} for x = fromPos.x, toPos.x do for y = fromPos.y, toPos.y do for z = fromPos.z, toPos.z do totalArea = {x=x, y=y, z=z} playerz = getTopCreature(totalArea) if isPlayer(playerz.uid) then table.insert(playersInArea, playerz.uid) end end end end return playersInArea end Exemplo de uso:
    function onSay(cid, words, param, channel) local area = getPlayersInArea({x = 153, y = 50, z = 7}, {x = 156, y = 53, z = 7}) if area then for i = 1, (#area) do doTeleportThing(area[i], {x = 160, y = 51, z = 7}, false) end end return true end Créditos: Killua
  24. Curtir
    Storm deu reputação a WooX em Classic-Yurots [8.60] - Push Cruzado + Cast com Setas   
    Sim, eu fiquei ofendido, não pelo o que você disse mas como você disse. Fala que o servidor tem problema sérios e críticos e fala de closingdoor e skullcheck?

    Mas o que realmente me atingiu foi você se utilizar de um conteúdo público e não querer contribuir com o mesmo de forma pública quando solicitado.
     
    Bom, o que você disse me fez entender o contrário.
     
    Em nenhum momento eu tive a intenção de "lacrar", acho isso ridículo, só queria expor que você estava falando bobagens e se recusando a compartilhar soluções pra problemas que segundo você mesmo resolveu todos. E eu concordo com você em um ponto, a comunidade realmente está desunida, você é a prova viva disso.
    Eu iria ajudar independente de você, o único motivo de eu não ter respondido este tópico antes é porque estava afastado do fórum, desde o momento em que foi postado eu dei orientações de como compilar, postei distro já compiladas pra windows e etc. E se não for pra contribuir de forma positiva boa coisa você faz não postando mais aqui.
    Sim realmente, mas não graças a você né?
  25. Curtir
    Storm deu reputação a WooX em Classic-Yurots [8.60] - Push Cruzado + Cast com Setas   
    Da uma lida rápida nos posts antes, as vezes a solução pro seu problema já foi postada.
     
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo