Ir para conteúdo
  • Cadastre-se

Posts Recomendados

0100001101101111011001000110010101110011001000000110010001100101011101100110010101101100011011110111000001100101011001000010000001100010011110010010000001010011011101010110100101100011011010010110010001100101

Eu observei que muitos desconhecem a New Library v. 1.2, feita por (um grande amigo e programador/scripter) xWhiteWolf. Então resolvi fazer o uso de algumas de suas funções para tentar expandir o reconhecimento da existência delas, que podem ser muito úteis em diversas situações.

Bom, "loop effect" é uma função com uma condição de teste verdadeira que nunca termina (loop) sobre um shoot type effect (os distance effects). Quando aplicada a um creatureID, gera efeitos de distância infinitos nas posições entorno do mesmo.

Porém, eu fiz pequenas alterações na função original para ficar adequada à talkaction.

Primeiramente, adicione as seguintes funções à sua lib, no arquivo 050-function.lua (data/lib):

function loopEffect(uid, effect, key) -- modified function of xWhiteWolfs library
    local delay = 0.3 -- exhausted do efeito em decimais, sendo 0.3 = 300 milissegundos
    local effectPositions = getPositionsByDirection(uid)
    doSendDistanceShoot(effectPositions[math.random(#effectPositions)], effectPositions[math.random(#effectPositions)], effect)
    addEvent(function()
        if isCreature(uid) and getPlayerStorageValue(uid, key) >= 0 then
            loopEffect(uid, effect, key)
        end
    end, 1000 * delay)
    return true
end

function getPositionsByDirection(uid)
    pos = getCreaturePosition(uid)
    positionsByDirection = {
        [0] = {
        [1] = {x = pos.x + 1, y = pos.y - 1, z = pos.z, stackpos = 0},
        [2] = {x = pos.x + 1, y = pos.y, z = pos.z, stackpos = 0},
        [3] = {x = pos.x + 1, y = pos.y + 1, z = pos.z, stackpos = 0},
        [4] = {x = pos.x, y = pos.y + 1, z = pos.z, stackpos = 0},
        [5] = {x = pos.x - 1, y = pos.y + 1, z = pos.z, stackpos = 0},
        [6] = {x = pos.x - 1, y = pos.y, z = pos.z, stackpos = 0},
        [7] = {x = pos.x - 1, y = pos.y - 1, z = pos.z, stackpos = 0},
        [8] = {x = pos.x, y = pos.y - 1, z = pos.z, stackpos = 0},
        [9] = {x = pos.x, y = pos.y, z = pos.z, stackpos = 0}
    },
        [1] = {
        [1] = {x = pos.x + 1, y = pos.y + 1, z = pos.z, stackpos = 0},
        [2] = {x = pos.x, y = pos.y + 1, z = pos.z, stackpos = 0},
        [3] = {x = pos.x - 1, y = pos.y + 1, z = pos.z, stackpos = 0},
        [4] = {x = pos.x - 1, y = pos.y, z = pos.z, stackpos = 0},
        [5] = {x = pos.x - 1, y = pos.y - 1, z = pos.z, stackpos = 0},
        [6] = {x = pos.x, y = pos.y - 1, z = pos.z, stackpos = 0},
        [7] = {x = pos.x + 1, y = pos.y - 1, z = pos.z, stackpos = 0},
        [8] = {x = pos.x + 1, y = pos.y, z = pos.z, stackpos = 0},
        [9] = {x = pos.x, y = pos.y, z = pos.z, stackpos = 0}
    },
        [2] = {
        [1] = {x = pos.x - 1, y = pos.y + 1, z = pos.z, stackpos = 0},
        [2] = {x = pos.x - 1, y = pos.y, z = pos.z, stackpos = 0},
        [3] = {x = pos.x - 1, y = pos.y - 1, z = pos.z, stackpos = 0},
        [4] = {x = pos.x, y = pos.y - 1, z = pos.z, stackpos = 0},
        [5] = {x = pos.x + 1, y = pos.y - 1, z = pos.z, stackpos = 0},
        [6] = {x = pos.x + 1, y = pos.y, z = pos.z, stackpos = 0},
        [7] = {x = pos.x + 1, y = pos.y + 1, z = pos.z, stackpos = 0},
        [8] = {x = pos.x, y = pos.y + 1, z = pos.z, stackpos = 0},
        [9] = {x = pos.x, y = pos.y, z = pos.z, stackpos = 0}
    },
        [3] = {
        [1] = {x = pos.x - 1, y = pos.y - 1, z = pos.z, stackpos = 0},
        [2] = {x = pos.x, y = pos.y - 1, z = pos.z, stackpos = 0},
        [3] = {x = pos.x + 1, y = pos.y - 1, z = pos.z, stackpos = 0},
        [4] = {x = pos.x + 1, y = pos.y, z = pos.z, stackpos = 0},
        [5] = {x = pos.x + 1, y = pos.y + 1, z = pos.z, stackpos = 0},
        [6] = {x = pos.x, y = pos.y + 1, z = pos.z, stackpos = 0},
        [7] = {x = pos.x - 1, y = pos.y + 1, z = pos.z, stackpos = 0},
        [8] = {x = pos.x - 1, y = pos.y, z = pos.z, stackpos = 0},
        [9] = {x = pos.x, y = pos.y, z = pos.z, stackpos = 0}
    }
    }
    return positionsByDirection[getCreatureLookDirection(uid)]
end

Fiz duas maneiras de um player adquirir esse efeito:

 

  • Quest (por chest ou o que preferir):

     

loopeffquest.lua (data/actions/scripts):

local t = {
    effect = 18, -- shoot type number
    qstor = 70001, -- quest storage
    stor = 70707 -- loopEffect storage
}

function onUse(cid, item)
    if getPlayerStorageValue(cid, t.qstor) < 1 then
        setPlayerStorageValue(cid, t.qstor, 1)
        setPlayerStorageValue(cid, t.stor, t.effect)
        loopEffect(cid, t.effect, t.stor)
        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You have found a magic chest and now you received a constant effect.')
    else
        doPlayerSendCancel(cid, 'You already received the constant effect before.')
    end
    return true
end

 

Tag - actions.xml (data/actions):

<action actionid="ACTIONID" script="loopeffquest.lua"/>

 

  • TalkAction de adição/remoção:

     

loopeffect.lua (data/talkactions/scripts):

function onSay(cid, words, param, channel)
    local stor = 70707 -- loopEffect storage
    local p = string.explode(param, ",")
    local pid, ts, tn = getPlayerByNameWildcard(p[1]), tostring(p[1]), tonumber(p[2])
    if (words == '/addloopeff') then
        if (param == '') then
            return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Enter the player name and the loop effect (shoot type number) you want to assign to the player. Thus: /addloopeff Player, 18')
        end
        
            if (not ts or not tn or p[3]) then
                return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Invalid parameter specified.')
            end
            
                if (tn < 0 or tn > CONST_ANI_LAST) then
                    return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'The shoot type effect number cannot be lower than 0 and higher than '..CONST_ANI_LAST)
                end
                
            if (not pid) then
                return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Player '..ts..' not found.')
            end
            
        if (getPlayerStorageValue(pid, stor) >= 0) then
            return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Player '..ts..' is already with loop effect.')
        end
        
        setPlayerStorageValue(pid, stor, tn)
        loopEffect(pid, tn, stor)
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'You assigned the loop effect '..tn..' to the player '..ts)
    elseif (words == '/removeloopeff') then
        if (param == '') then
            return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Enter the player name you want to remove the loop effect. Thus: /removeloopeff Player')
        end
        
            if (not ts or p[2]) then
                return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Invalid parameter specified.')
            end
            
                if (not pid) then
                    return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Player '..ts..' not found.')
                end
            
            if (getPlayerStorageValue(pid, stor) < 0) then
                return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Player '..ts..' is not with loop effect.')
            end
        
        setPlayerStorageValue(pid, stor, -1)
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'You removed the loop effect of the player '..ts)
    end
    return true
end

 

Tag - talkactions.xml (data/talkactions):

<talkaction log="yes" words="/addloopeff;/removeloopeff" access="5" event="script" value="loopeffect.lua"/>

 

loopeffect.lua (data/creaturescripts/scripts):

function onLogin(cid)
    local stor = 70707 -- loopEffect storage
    if getPlayerStorageValue(cid, stor) >= 0 then
        loopEffect(cid, getPlayerStorageValue(cid, stor), stor)
    end
    return true
end

 

Tag - creaturescripts.xml (data/creaturescripts):

<event type="login" name="LoopEffect" event="script" value="loopeffect.lua"/>

 

Os parâmetros da talkaction são simples.

Para adicionar um loop effect ao player:

/addloopeff playerName, shootTypeNumber

Ex: /addloopeff Suicide, 18

Para remover o loop effect de um player:

/addloopeff playerName

Ex: /removeloopeff Suicide

Nota: mesmo que o player faça logout, o loopEffect retornará quando ele logar novamente. Só vai parar se você o remover do player, com a talkaction.

É isso. Talvez não seja muito útil em servidores globais, manter esse efeito de shoot type infinito.

Mas eu queria compartilhar com vocês; espero que sirva de ajuda pra alguém.

Editado por Suicide (veja o histórico de edições)

The corrupt fear us.

The honest support us.

The heroic join us.

Link para o post
Compartilhar em outros sites

Eis a questão, meu caro @Orochi Elf.
Acredito que isso pode variar.

The corrupt fear us.

The honest support us.

The heroic join us.

Link para o post
Compartilhar em outros sites
  • 3 weeks later...

Gostei bastante, porém to com a mesma dúvida dos outros :/

 

EHUAEHAUEHAU, curti vc botar em binário o Codes developed by Suicide

Nem todo loop infinito é ruim ;P 

User *eu = new User("otteN");
RepSystem<User> *myRep = new RepSystem<User>("jóinha");
myRep->setAlvo(eu);

/* só por ser criado já sou o melhor membro */ 

while(eu->isMelhorMembro()){
myRep->reputar();
}

 

Link para o post
Compartilhar em outros sites

@Gabuuh
Não posso dizer se você vai ter algum problema com lag ou não, pois é uma questão que pode variar.
Faz um backup do seu servidor e aplica os scripts a um test server, veja como fica com os players online.
E obrigado haha ;]

The corrupt fear us.

The honest support us.

The heroic join us.

Link para o post
Compartilhar em outros sites

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.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • Por Mathwsz
      Bom galera, estou trazendo um script de fusão que funciona assim:
      Explicação: É necessário de 7 itens, na qual você coloca em tal coordenada e aperte a alavanca, sendo assim formando um item na qual você deseja em tal lugar configurado.
      Exemplo: Você pode fazer 7 bosses na qual dropa tals itens "Parecidos" e formando um item raro de sua escolha, ou como preferir.. Vamos ao script!
       
      Em Data/Actions/Scripts crie um arquivo chamado fusaoitens.lua e adicione isto dentro:
       
       
      Agora, em Data/Actions.xml adicione o seguinte:
       
      <action uniqueid="9900" script="fusaoitens.lua" /> E no seu RemeresMapEditor , pegue sua alavanca, vai em Propriedades e adicione o UniqueID 9900 nele! 
      PRONTO! Agora configure e divirta-se! Obs: Caso lhe ajudei, da um REP+ Aí !
    • Por MySticaL
      Script Quest:
      --[[ Script: Exemplo de Quest Autor: MySticaL Email: [email protected] ]] function onUse(cid, item, frompos, item2, topos) -- Não mecha. storage = 938312 -- Storage a cada quest que for criada aumente um numero da storage pra qnd vc pegar o baú de outra quest ñ aparecer que vc já fez. item = 2160 -- Id do item ira ganhar. quantidade = 1 -- Quantidade ira ganhar. level = 5 -- Level que precisa pra fazer. if getPlayerLevel(cid) >= level and getPlayerStorageValue(cid,storage) == -1 then -- Não mecha. doPlayerSendTextMessage(cid,25,"Você ganhou um pouco de dinheiro") -- Mensagem que aparecera quando ganhar o item. doPlayerAddItem(cid, item, quantidade) -- Não mecha. setPlayerStorageValue(cid,storage,1) -- Não mecha. elseif getPlayerLevel(cid) <= level then -- Não mecha doPlayerSendTextMessage(cid,25,"Você precisa ser level 5 ou mais.") -- Mensagem que ira aparecer se o player tiver menos level que o necessario. elseif getPlayerStorageValue(cid,storage) >= 1 then -- Não mecha. doPlayerSendTextMessage(cid,25,"Você já fez está quest") -- Quando tentar pegar mais de uma vez o baú. end return true end Actions.xml
      <action actionid="3123" event="script" value="script.lua"/> Obs: O actionid="3123" é o que você deve botar no item no Remeres Map Editor
      Caso você queria criar outra quest aumente a storage no script e o id no actions.xml !
      Como configurar ?
      R- \/
      ================================================================================================================================
      storage = 938312 -- Storage a cada quest que for criada aumente um numero da storage pra quando você for pegar o baú de outra quest não aparecer  que você já fez.
      ================================================================================================================================
      item = 2160 -- Id do item ira ganhar.
      ======================================================
      quantidade = 1 -- Quantidade ira ganhar.
      ======================================================
      level = 5 -- Level que precisa pra fazer.
      ======================================================
      Script bem simples mais irá ajudar alguns membros.
      Rep não cai o dedo
      Não sei muito sobre script.
       
      100% Créditos meu caso for postar em outro lugar deixe os créditos para min !
      Desculpem o tópico mal arrumado
       
    • Por Nazo
      Buenas, TK!
      Um usuário pediu ajuda em um script, onde queria limitar para a quest ser feita apenas uma vez por IP, mesmo que ainda seja possível mudá-lo, resolvi postar aqui xd
       
      Execute esse código SQL no seu banco de dados MySQL, para a criação da tabela onde ficarão as storages e o IP armazenado do player:
      CREATE TABLE player_ip_storage( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, player_id INT NOT NULL, ip CHAR(15) NOT NULL, storage INT NOT NULL ); ALTER TABLE player_ip_storage ADD CONSTRAINT FK_PLAYER_ID FOREIGN KEY (player_id) REFERENCES players(id);  
      Ou caso seja SQLITE, utilize esse código:
      CREATE TABLE player_ip_storage( player_id INT NOT NULL, ip CHAR(15) NOT NULL, storage INT NOT NULL ); ALTER TABLE player_ip_storage ADD CONSTRAINT FK_PLAYER_ID FOREIGN KEY (player_id) REFERENCES players(id);  
      Crie um arquivo chamado nazo-functions.lua em data/lib e adicione o seguinte conteúdo:
      -- by Nazo (tibiaking.com) -- IP Storage System function getIpQuestStatus(cid, storage) storages = db.getResult("SELECT * FROM `player_ip_storage` WHERE `ip` = \"" .. doConvertIntegerToIp(getPlayerIp(cid)) .. "\" and `storage` = "..storage..";") if(storages:getID() ~= -1) then return false end return true end function setIpQuestStatus(cid, storage) db.executeQuery("INSERT INTO player_ip_storage(player_id, ip, storage) VALUES("..getPlayerGUID(cid)..",\""..doConvertIntegerToIp(getPlayerIp(cid)).."\","..storage..")") return true end  
      Agora, quando você tiver uma quest, adicione na verificação a função getIpQuestStatus na checagem junto, e quando finalizar a quest utilize o setIpQuestStatus, com os parâmetros cid e número da storage, porém a função só armazena que essa storage tem algo no banco de dados, ou seja, a quest já foi feita, você não armazena o valor da storage junto (como a função normal que geralmente adiciona "1" na storage).
       
      Exemplo de quest abaixo:
      -- by Nazo (tibiaking.com) config = { storage = 123123, -- storage da quest premio = {2160, 1} -- {itemid, quantia} } function onUse(cid, item, frompos, item2, toPosition) queststatus = getPlayerStorageValue(cid,config.storage) if(queststatus == -1 and getIpQuestStatus(cid, config.storage)) then -- note que eu só adicionei a função, nenhuma comparação, explicarei abaixo do código doPlayerSendTextMessage(cid,22,"Tome seu prêmio.") doPlayerAddItem(cid,config.premio[1],config.premio[2]) setPlayerStorageValue(cid,config.storage,1) setIpQuestStatus(cid,config.storage) -- função que adiciona a storage no banco de dados else doPlayerSendTextMessage(cid,22,"Você já fez esta quest.") end end  
      Explicação básica do motivo da função não possuir comparação na verificação e ficar como a seguir:
       
      if(getIpQuestStatus(cid, config.storage)) then Quando você faz um if, com uma função dentro sem comparações, ela continuará o bloco de comando apenas se o retorno da mesma for verdadeiro, assim quando você fizer a quest, e tentar novamente, o get retorna falso, e isso cancela a condição e vai para o bloco de comando do "else".
    • Por tataboy67
      Opa galera beleza?
      Meu amigo esses dias pediu um sistema basicamente assim:
      sistema:
      !quests charizard (você é teleportado para hunt ou quest por "x" tempo, e após esse tempo, você é teleportado para 1 posição "y" (cp/templo)) !quest time (o jogador recebe uma msg de quanto tempo ainda resta para ele ficar nessa hunt/quest) !quest (abre uma janela aonde fala as informações dessa hunt/quest)
      bom eu tentei usar o "for" para fazer com que tenha varios tipos de hunts dentro (criando uma tabela), mas como ainda estou estudando lua e esse é meu 1º script, eu não consegui fazer, então eu to usando o "param" E eu fui pesquisar aqui no forum e em outro forums tbm esse sistema, e vi que ninguem nunca postou  
      então resolvi cria-lo.
       
      Em Talkactions.xml, adicione a linha:

      Em Talkactions, crie um arquivo com o nome de quest_time.lua, e adicione:

      Creditos:
      Eu: Pelo script

      Desculpa se o script ficou ruim, é que é meu primeiro script, tenham pena de mim.  
      Eu farei melhoras nesse script mais pra frente.
    • Por Aluccard
      Olá!

      A pedidos de usuarios, resolvi fazer esse script simples e eficaz. Como o própio nome do tópico diz: Aol Inifinito.
      No script possui um config onde pode ser alterado o ammyID = id do amuleto, lossExp = player perder exp, lossItems = player perder items.

      newAol.lua

      local config = { ammyID = 2130, lossExp = false, lossItems = false } function onDeath(cid, lastHitKiller, mostDamageKiller) if isPlayer(cid) then if (getPlayerSlotItem(cid, 2).itemid == config.ammyID) then if (config.lossExp == false) then doPlayerSetLossPercent(cid, experience, 0) end doCreatureSetDropLoot(cid, config.lossItems) return true end end return true end creaturescripts.xml <event type="death" name="NewAol" event="script" value="newAol.lua"/> Adicione no login.lua essa linha perto dos outros registercreatures. registerCreatureEvent(cid, "NewAol")

      Obs¹: Esse script serve para todos os players inclusive RedSkulls/BlackSkulls.


      Qualquer dúvida é só postar!



      Atenciosamente,
      Aluccard.
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo