Ir para conteúdo

Jackson Santana

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Gostei
    Jackson Santana deu reputação a Ryzor em Algumas LIBs úteis em OTServ   
    Algumas LIBs úteis em OTServ





    Introdução: Não sou NENHUM expert em lua e estou LONGE de ser. Porém, ontem eu vim procurar algum tutorial que me evidenciasse facilmente o assunto em questão e não encontrei, então resolvi estudar um pouquinho e trazer para vocês

    Fonte: A fonte do meu estudo foi um site muito conhecido por scripters, que é: Lua-Users.org

    Explicações: Optei por incluir nesse tutorial explicações somente das libs que eu achei mais interessantes e que pude ver uma utilidade em OTServ, como Math, Os e Table. Se você acha que faltou algo de interessante ou que alguma explicação pode ser melhorada, por favor, poste construtivamente aqui, quem sabe até eu possa aprender mais


    Da Biblioteca Math...math.abs(v): retorna o valor absoluto de v -- o valor positivo
    math.floor(v): retorna o valor inteiro mais proximo e menor ou igual a v -- arredonda para baixo
    math.ceil(v): retorna o valor inteiro mais proximo e maior ou igual a v -- arredonda para cima
    math.min(a,b,c,d,...): retorna o menor valor do conjunto especificado entre parêntesis (a,b,c,d,....)
    math.max(a,b,c,d,...): retorna o maior valor do conjunto especificado entre parêntesis (a,b,c,d,....)
    math.random(a,b): retorna um valor aleatório entre a e b, incluindo ambos




    Da Biblioteca Os...

    os.date(): retorna uma string no formato MM/DD/YY HH:MM:SS.
    os.date('*t'): retorna uma tabela contendo {hour, min, wday, year, yday, month, sec, day, isdst(true)}
    os.date('!*t'): retorna uma tabela contendo {hour, min, wday, year, yday, month, sec, day, isdst(false)}
    os.time(): retorna o horário do sistema utilizando Unix Timestamp --(Conversor: http://www.unixtimestamp.com/index.php)
    os.difftime(t2, t1): retorna os segundos de diferença entre os tempos t2 e t1





    Da Biblioteca Table...

    table.insert(table, [pos,] v): insere um elemento de valor v na tabela table na posição pos. --NOTA: Se não for especificada a pos, o elemento será inserido no fim da tabela.
    table.remove(table [, pos]): remove o elemento da tabela table que está indicado pelo índice pos. NOTA: Se não for especificada a pos, removerá o último elemento da tabela.
    table.concat(table [, sep [, i [, j]]]): Concatena (une) os elementos da tabela table a fim de formar uma string. --NOTA: sep é o elemento separador e i e j são os índices de começo e fim, respectivamente, dos elementos que serão concatenados.
    table.sort(table [, comp]): reordena os elementos da tabela table segundo as especificações de comp. --NOTA: O padrão é: function(a,b) return a<b end, ou seja, reordernação ascendente.





    Da Biblioteca String...

    string.lower(s) ou s:lower(): Retorna a string s após fazer com que todos seus caracteres maiúsculos se tornem minúsculos. --Tudo minúsculo, oposto de string:upper
    string.upper(s) ou s:upper(): Retorna a string s após fazer com que todos seus caracteres minúsculos se tornem maiúsculos. --Tudo maiúsculo, oposto de string:lower
    string.gsub(s, pattern, replace [, n]) ou s:gsub(pattern, replace [,n]): Retorna o texto s após substituir os caracteres pattern do texto pelos caracteres definidos em replace, sendo n o limite de subtituições, que caso não seja definido, é ilimitado.
    string.len(s) ou s:len(): Retorna a quantidade de caracteres da string s.
    string.reverse(s) ou s:reverse(): Retorna a string s reordenada de forma contrária.
    string.rep(s, n) s:rep(n): Gera uma string que são n cópias da string s concatenadas.





    Outras bibliotecas...

    tonumber(a): Converte a string a para números.

    OBS: OBRIGATÓRIO DEFINIR // NÃO-OBRIGATÓRIO DEFINIR

    Considerações Finais: Esse tutorial foi feito para dar uma noção do quão úteis podem ser essas libs. Quem já tem essa noção e já sabe trabalhar acha um tutorial desse desnecessário, mas assim como eu, muitos não sabem que podem ter grande utilidade.

    Dica: Sempre que estiverem a fim, deem uma olhada no Lua-Users.org, site citado no início do tutorial, na parte Fonte. Há muitas coisas legais lá, e se cresce bastante estudando assim, apesar de o site estar em inglês.

    Até a próxima!



    Creditos : Guiminhah
  2. Gostei
    Jackson Santana deu reputação a Ryzor em Manipulando arquivos através de LUA   
    Manipulando arquivos através de LUA

    Abrindo um arquivo

    Para começar, você terá que abrir o arquivo.Para isso, usamos a função io.open(arquivo[modo]), que também pode cria-lo caso não exista.Arquivo será o seu diretório,que caso não exista retornará nil, e modo são os seguintes:


    "r" - Modo de leitura.
    "rb" - Leitura em modo binário.
    "w" - Modo de escrita.
    "wb" - Escrita em modo binário.
    "a" - Adicionar ao arquivo.
    "r+" - Modo de atualização preservando os dados anteriores.
    "w+" - Modo de atualização apagando os dados anteriores.
    "a+" - Modo de adição e atualização, preservando os dados anteriores e adicionando ao final do arquivo.

    Por exemplo, quero abrir um arquivo que se chama Iuri.lua e está no disco rígido C:, uso:



    io.open("C://Iuri.lua") Caso o arquivo não exista, irá retornar nil. Escrevendo em arquivos Para fazer a escrita em um arquivo é muito simples, basta usar file:write(...), onde file é o arquivo que abrimos anteriormente.Em ... será colocada uma string que irá ser escrita conforme o modo de abertura do arquivo definido anteriormente. Ex.: local file = io.open("C://Iuri.lua") file:write('Este é um tutorial') file:close() Lendo arquivos Para fazermos a leitura do arquivo, usamos file:read(...).Se nenhum formato for especificado, ele usará o formato padrão("*l").Os outros formatos são: "*n" - Lê um número, este é o único formato que retorna um número ao invés de uma cadeia. "*a" - Irá ler o arquivo inteiro, iniciando da posição atual. number - Irá ler o arquivo até o número de caracteres definido. Ex.: local file = io.open("C://Iuri.lua") print(file:read()) file:close() Isso irá printar 'Este é um tutorial' no console , o que foi escrito anteriormente. file:lines() file:lines(), é usado em um laço for e sua sintaxe é a seguinte: for linha in file:lines do corpo end Isso criará uma repetição sobre todas as linhas do arquivo com linha retornando os caracteres da linha em questão. Ex.: local file = io.open("C://Iuri.lua") for linha in file:lines do print(linha) end file:close() Como só foi escrito uma linha no arquivo irá printar 'Este é um tutorial', se embaixo disso escrevessemos 'Teste' o for se repetiria 2 vezes e iria printar: 'Este é um tutorial' 'Teste' Finalizando o arquivo Por último, iremos finalizar o arquivo, usando o file:close(), que já foi mostrado nos exemplos anteriores. Deletando arquivos ou diretórios Para deletar arquivos e diretórios, usamos a função os.remove(file or directory), lembrando que o arquivo não pode estar em uso e o diretório vazio. Ex.: os.remove("C://Iuri.lua")


    Creditos

    Dean
  3. Gostei
    Jackson Santana deu reputação a Renato em Callbacks   
    ACTIONS


    onUse(cid, item, fromPosition, itemEx, toPosition)
    onLogin(cid)
    onLogout(cid)
    onAdvance(cid, skill, oldLevel, newLevel)
    onStatsChange(cid, attacker, type, combat, value)
    onDirection(cid, old, current)
    onOutfit(cid, old, current)
    onSendMail(cid, receiver, item, openBox)
    onReceiveMail(cid, sender, item, openBox)
    onTradeRequest(cid, target, item)
    onTradeAccept(cid, target, item, targetItem)
    onJoinChannel(cid, channel, users)
    onLeaveChannel (cid, channel, users)
    onLook(cid, thing, position, lookDistance)
    onThink(cid, interval)
    onTextEdit(cid, item, newText)
    onReportBug(cid, comment)
    onAreaCombat(cid, tileItem, tilePosition, isAggressive)
    onPush(cid, target)
    onTarget(cid, target)
    onFollow(cid, target)
    onCombat(cid, target)
    onAttack(cid, target)
    onCast(cid, target)
    onKill(cid, target, lastHit)
    onDeath(cid, corpse, deathList)
    onPrepareDeath(cid, deathList)
    [/code] [center][/center] [center][size=8]GLOBAL EVENTS[/size][/center] [code]onThink(interval)
    onStartup()
    onShutdown()
    onGlobalSave()
    onRecord(current, old, cid)
    onTime() onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)
    onStepOut(cid, item, position, lastPosition, fromPosition, toPosition, actor)
    onEquip(cid, item, slot)
    onDeEquip(cid, item, slot)
    onAddItem(moveItem, tileItem, position, cid)
    onRemoveItem(moveItem, tileItem, position, cid)[/code] [center][/center] [center][size=8]SPELLS[/size][/center] [code]onCastSpell(cid, var) onSay(cid, words, param, channel) onUseWeapon(cid, var)



    • Retirado do SCRIPTSYSTEM_HELP, doc das Sources do TFS
    CREATURE SCRIPTS MOVEMENTS TALKACTIONS WEAPONS
  4. Gostei
    Jackson Santana deu reputação a Private Sub Teste em [Resolvido] Ajuda com TUGBOT pleaseee   
    1. Não sei, pois estou na escola sem o Tugbot

    2. Se não me engano vai em: Hotkeys e depois adiciona uma como: toggle attack, algo assim

    3. O Tugbot usa o shovel quando você adiciona o Holle, porem, ele é bugado e as vezes usa, as vezes não, nunca encontrei uma solução do tipo: UseItem (X,Y,Z,ID).
  5. Gostei
    Jackson Santana deu reputação a Private Sub Teste em [Resolvido] Algumas Duvidas...   
    Reposta da 1: Não sei.


    Resposta da 2: Acho o BBot e o Neobot os melhores em comparação ao Elf, sistemas de 'hotkeys' bem avançados.

    Resposta da 3: Existe, porém só sei com o BBot que é o Anti-Push, tenha Worms & Gold na Backpack que ele ficará jogando em baixo de você.
  6. Gostei
    Jackson Santana deu reputação a Private Sub Teste em [Script] Para treinar com rotworm   
    Pronto meu amigo...



    NumberOfMonsters = 3 /// Numero de monstros pra trocar arma StrongWeapon = 3324 /// ID da arma FORTE WearWeapon = 3304 /// ID da arma FRACA function GetItemFromOpenBackpack(ID: integer): TItem; var y: integer; begin Result := nil; for x := 0 to Self.Containers.Count - 1 do begin if x >= Self.Containers.Count then Break; for y := 0 to Self.Containers.Container[x].Count - 1 do begin if y >= Self.Containers.Container[x].Count then Break; if Self.Containers.Container[x].Item[y].ID = ID then begin Result := Self.Containers.Container[x].Item[y]; Exit; end; end; end; end; function CountMonstersBesideYou:Integer; begin Result := 0; UpdateWorld; for i := 0 to creatures.Count -1 do begin if i >= Creatures.Count then break for x := -1 to 1 do begin if x >= 2 then break for y := -1 to 1 do begin if y > 1 then break; if Creatures.Creature[i].NPC then if (Creatures.Creature[i].x = Self.X +x) and (Creatures.Creature[i].y = Self.y + y) and (Creatures.Creature[i].Z = Self.Z) then Result := Result + 1; end; end; end; end; while not terminated do begin UpdateWorld; if CountMonstersBesideYou >= NumberOfMonsters then begin if Self.RightHand.ID <> StrongWeapon then begin Boots := GetItemFromOpenBackpack(StrongWeapon); if Boots <> nil then Boots.MoveToBody(Self.RightHand,0); else Self.Displaytext('Strong Weapon werent found in open backpack!'); end; end; if CountMonstersBesideYou < NumberOfMonsters then begin if Self.RightHand.ID <> WearWeapon then begin Boots := GetItemFromOpenBackpack(WearWeapon); if Boots <> nil then Boots.MoveToBody(Self.RightHand,0); else Self.Displaytext('Wear Weapon werent found in open backpack!'); end; end;

    Ps: Testa porque eu não tenho NG, se funcionar REP++

Informação Importante

Confirmação de Termo