Ir para conteúdo

dalvorsn

Conde
  • Total de itens

    750
  • Registro em

  • Última visita

  • Dias Ganhos

    8

Tudo que dalvorsn postou

  1. Minha versão com inclusão de retirada de espaços do inicio e depois dos separadores. string.explode = function (str, sep) local ret = {} local str = str:gsub("^%s+", ""):gsub(sep.."%s+", sep) for result in string.gmatch(str, "(.-)".. sep) do str = str:gsub(result .. sep, "") table.insert(ret, result) end table.insert(ret, str) return ret end Em tempo de execução a minha e a sua estão praticamente iguais, já quanto ao gasto de memória a minha apresenta uma pequena diferença mas é devido a retirada dos espaços, ela está gastando mais memória que a sua. str = ""..str..""..char.."" não faça isso em publico vei kk anyway, boa função xD
  2. Sim é possível, porém como eu disse pode trazer erros. Não ficou muito claro para mim, seu ot é 8.6, e você vai mudar o items.otb para uma versão superior. Depois disso você pretende usar o cliente 8.6 ou 9.80? Se for usar client 8.60, esteja certo que dará erros. Um outro problema é que a estrutura pode ter mudado, atributos podem ter sido adicionados/modificados, mounts entre outros, e isso pode dar vários erros. Logo não aconselho a fazer esta mudança, é preferível pegar um distro já modificado para a nova versão.
  3. Interessante até o sistema, mas não entendo porque cria funções se vai usá-las uma unica vez, não seria melhor simplesmente escrever o bloco da função?
  4. Nossa, pra que ler o arquivo tantas vezes e rodar vários loops desnecessários, bote uma função apenas para load do arquivo na lib, use-a no start do server, e faça uma função para update, estilo um reload. E outra coisa, você abre arquivos e não os fecha, isso não é bom. Faça dessa forma e verá que a optimização será grande: Summons = {} function load_summon_file() local file = io.open("data/sumon/sumon.xml") local file_str = file:read("*a") file:close() for name, mana, level, item, health in file_str:gmatch('<monster name="(.-)" mana="(.-)" level="(.-)" item="(.-)" health="(.-)" />') do Summons[name] = { mana = mana, level = level, item = item, health = health} end end function update_summon_file() Summons = {} load_summon_file() end function is_valid_summon(summon_name) return type(Summons[summon_name]) == "table" and true or false end function get_summons_requires(summon_name) return is_valid_summon(summon_name) and Summons[summon_name] or {} end Repare que o arquivo é carregado apenas uma vez, leitura em disco rigido é muito lenta e gasta muita memória, quanto menos o fizer melhor.
  5. Você mostrou o for com ipairs e pairs, mas se quer falou o porque delas poderem ser usadas. Essas funções são funções iteradoras, assim como outras nativas de lua, são elas: string.gmatch string.gsub pairs ipairs io.lines Você pode também criar funções iteradoras, da seguinte forma: function iterator_function(...) return function() return end, ... end Obs.: Pode ter ficado confuso de intender dessa forma, então mostrarei um exemplo prático, com uma função iteradora conhecida, a pairs. function _pairs(_tab) local function void(_table, last_index) local index = next(_table, last_index) if not index then return nil else return index, _table[index] end end return void, _tab, nil end
  6. Só cria se estiver em algum modo de escrita ou atualização(w, w+, w+b, a, a+, a+b), em modos de leitura apenas(r. r+, r+b) ele vai retornar nil e não vai criar nenhum arquivo.
  7. Cara quando se fala "remoto", se remete a algo longícuo, um arquivo no seu computador não se caracteriza em arquivo remoto, seria remoto se fosse em rede, acessando por socket curl etc. E a titulo de informação, existe inúmeros modos de se manipular arquivos, você mostro apenas o io.open ccm o argumento "r", só dentro dele existem mais 8 modos de manipulação (rb, r+b, w, wb, w+b, a, ab, a+b). Dentro da biblioteca io também há mais funções para manipulação. E uma coisa muito importante que você deixou passar, SEMPRE que abrir um arquivo, feche após o uso, em sistemas como windows, o arquivo não poderá nem ser excluido por estar aberto. -- abrindo o arquivo em modo de atualização local file = io.open(file, "r+") -- lendo todo o arquivo como string e salvando na variável str local str = file:read("a*") -- o arquivo ja foi salvo, não há mais a necessidade de mantê-lo aberto, então feche file:close()
  8. O fishing do pxg não é feito dessa forma, lá existem dois items rod, um para quando está "pescando" e outro para puxar o "peixe" quando fisga, sendo o primeiro igual a rod comum de otserv e o segundo apenas de use comum(não tem opção useable marcada no dat nem otb). Outra diferença é que o fishing de lá usa iscas para determinar que tipo de pokemons pescar, e o level serve apenas para determinar qual a quantidade que poderá ser pescada por vez. E o tempo que demora parra fisgar não é fixo pelo skill de fishing ele é randomico e tem um limite de tempo para usar o segundo item (o de use comum), e se somente se for usado dentro do tempo é que é pescado algo, acabando a "pesca" caso não seja usado. #Edit E eu ja ia esquecendo, se voce pescar e sair do target do pokemon pescado, ele "some" (removido) do mapa em aproximadamente 1min.
  9. Então, cara, eu até fiz enquanto na fase de desenvolvimento por querys na database. O problema é que se toda hora eu tenho que salvar o pet na database e obter dados dela, acabei notando o pequeno lag que se criava na execução dos comandos, aí fiz por storage. Obrigado a todos. Não use querys, vai acabar crashando de tantas consultas a db, a não ser que use cache com luasql, nesse caso é otimo, do contrario continue da forma que está pois está excelente. Storages não executam as querys quando são modificadas, elas salvam na memoria e só executam no logout e login. No geral o sistema está muito bom, só a parte de spells que acho que poderia ser algo mais livre. Uma sugestão seria usar uma lib externa com todas as spells, e buscá-las apenas pelo seu nome, dai teria mais liberdade na criação das mesmas. Meus parabéns, otimo sistema. #Edit Vi que as spells já são pelo nome, porem ela só da a configuração, se quiser uma spell diferente com varias areas, efeitos, conditions, creio que será mais complicado, a spell inteira criada num arquivo ou ate mesmo em uma função seria mais interessante. ex.: function do_pet_cast_spell(spell_name) if spell_name "dark bite" then -- executa a spell elseif spell_name "furios bite" then -- sem criatividade kk -- executa ,,, else -- .. end end Dai ficaria algo mais livre pra criação. Isso é uma opnião minha apenas, e não sei se fica mais facil para os que detem pouco conhecimento de scripting.
  10. Aproveitando que falou sobre, apenas para completar, a diferença é basicamente essa: Repeat: Executa o bloco, verifica a condição, se verdadeira executa novamente ate que seja falsa, ou que encontre um return ou break.. While: Verifica a condição, se verdadeira executa e torna o ciclo, ate que seja falsa, ou que encontre um return ou break. Não foi citado no tópico, mas acho importante então aproveitarei o post e falarei, quando se usa loops concatenados dentro de loops, o break para o loops mais interno apenas. local var = 0 while var < 50 do var = var + 1 while true do if var > 40 then break end var = var+ 1 end end como podem ver, ao atingir o valor 41 (var > 40), ele para de executar o segundo loop, mas o primeiro continua. porém se fosse dado um return, ele pararia tudo ali, e retornaria algo pra função a que o bloco pertence
  11. http://www.lua.org/m...manual.html#2.2
  12. Cara, é viável apenas se for trabalhar com index numericos, se tiver index como string fica tenso de fazer no while. Um simples for index, value in pairs(table) do end usando while seria um horror. Pra tabela ele não é muito bom, tanto porque existe pairs e ipairs que faria praticamente todo o serviço numa tabela, Porem a titulo de estudo e viavel que se saiba de varias maneiras, então é valido o tutorial, continue assim.
  13. Excelente aula, clara e objetiva. É um conteúdo bem básico, porém para os que estão iniciando, é de grande ajuda.
  14. me fale quais erros dão, e quais versões você tentou usar, versoes mais recentes tiveram uma pequena mudança na estrutura do spr, no arranjo de bytes onde grava o numero de sprites no spr, cresceu dois bytes se não me engano Leia as regras do xtibia.com antes de postar, apos se registrar você aceito tais termos! Caso ficar quebrando as, sera alertado! Ultimo aviso! Poderia me mostrar onde especificamente está escrito que não se pode postar em tópicos com mais de 30 dias de inatividade? E mesmo que haja de fato isso escrito em algum lugar, o usuario maiconui apenas queria esclarecer uma duvida, que mal há nisso? Unico aviso que vi foi esse: Cuidado, XTibiano! dalvorsn, o último post deste tópico tem mais de 30 dias e uma nova postagem agora poderá ser considerada como flood! Consideramos flood comentários sem sentido só para fazer o tópico subir na posição! Fique ligado e ajude a manter um fórum limpo! E ele é bem claro, diz respeito a flood.
  15. Cara, por que usar um item para cada ovo? não da para generalizar mais isso? tipo, no maximo um ovo diferente pra cada tipo de pokemon(water, fire, etc) dai tu seta atribute keys, ou simplesmente na description dele voce coloa, "krabby egg", dai pega a descrição por pattern: local desc = "charmander egg" -- pega essa string com getitemdescriptions local name = desc:match("(.-) egg") print(name) dai tu seta ela no script que gera o item, acho bem mais pratico que criar um item pra cada pokemon
  16. Cara aqui não é seção para se tirar duvidas, mas enfim explicarei como funciona. • Sintaxe correta da função. • Valores que os parametros adquirem quando não são declarados: • Os valores citados acima são usados em formulas de acordo com o tipo: » Para type igual a FORMULA_LEVELMAGIC: Obs.: os valores lvl, e mglvl, são respectivamente o level do player e o magic level do player. Dito tudo isso acima, para saber os valores de dano pode ser fazer de uma maneira mais simples até mesmo por script aplicando os valores na formula Ex.: Estipulo essa formula: Quero saber quanto eu hitaria para level 50 e ml 10 Input: OutPut: Bom é isso, espero que tenha ficado bem claro. Cya #edit Ah dei uma olhada numa source 0.4 também, parece que a unica coisa diferente, ou que eu não tinha notado na 0.3.6, é a respeito do do valores minc e maxc, quando esses valores são maiores que o resultante da equação respectivamente, eles passam a ser os valores de minimo e maximo
  17. Pelo menos alguem teve a capacidade de fazer esse sistema que a ate agr ninguem feiz. Além disso não sou SCRIPTER. Fiz um básico pra quem quiser. Esse sistema ja foi feito antes sim para sua informação. Se não quiser aceitar a critica tudo bem, estava apenas deixando minha opnião.
  18. Pelo que vi ele teleporta imediatamente ao usar a ultima saffari ball correto? Não acho que seja a melhor maneira, um onThink num intervalo de uns 5s ja estaria excelente, poderia fazer até mesmo checando alguma variável que indica que o player está no saffari e verificando a quantidade de saffari balls. Se não me engano no pxg é ou era assim, e tem uma outra questão também, no saffari não se morre, quando o pokemon acaba com a sua vida, ele te teleporta para fora do saffari apenas. anyway, good system
  19. Achei bem mal feito se é que me permite a critica, acho que deveria no minimo haver um tempo para que ele eclodisse, desse modo que fez está mais para box mesmo. E uma dica, caso goste da ideia e queira tentar fazer, é bem facil, basta usar os atributos de item, de duration e decayTo, se não me engano no decay ele conserva os attributos.
  20. O "sugar" do vampiro seria um ataque certo?! Se sim seria mais aconselhável usar funções de combat no script. doTargetCombatHealth(cid, target, type, min, max, effect) doTargetCombatMana(cid, target, min, max, effect) E como foi dito pelos amigos acima, não está declarado no script as variáveis 'life' e 'mana', e sinceramente, isto está mais para spell que para função propriamente dita.
  21. Interessante, apesar de ser um loop razoável dependendo da quantidade de players. Por database pode ser feito também, mas ai provavelmente estará trabalhando com numeros bem maiores, terá de redobrar os cuidados para que não fique muito pessada.
  22. me fez lembrar um pog que eu fiz uma vez, mas era so pra tabelas inteiramente numericas tab = {2,3,4,6,5} loadstring("print( ".. table.concat(tab, "+").. ")" )() tenso '-' kk
  23. Axo que ele deveria colocar os cretidos para vc dalvorsn ja que vc me passo isso a +- 2 anos atras e e o mesmo sistema Negativo, isso é algo extremamente simples, nem precisa saber programar pra fazer, e com certeza muitos antes de mim fizeram.
  24. não sei se está falando da minha ou da do newtown, enfim na minha basta na função storm, apos o doareacombat colocar a função de adicionar o item la do fogo, e para ficar melhor pode pegar o item na posição, buscar o nome dele, ver se contem o nome "water" e se não tiver criar o item
  25. bom, ai é na tag pelo que vi nas sources é so colocar na tag do spells.xml isso: blocking = "yes"
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...