
dgozdk
Membro
-
Registro em
-
Última visita
Histórico de Curtidas
-
dgozdk deu reputação a MatteusDeli em (AJUDA) Colocar tempo em script de pet@dgozdk Boa noite,
local timeStorage = 45644 -- não mexer local config = { time = 2, -- quanto tempo em minutos o player irá esperar para usar o item novamente enableMessage = true, -- habilitar a mensagem : (true) habilita, (false) não habilita messageText = "Voce tem que esperar TIME minuto(s) para usar o pet novamente." -- mensagem que irá aparecer quando estiver em cooldown o pet, TIME é uma palavra chave para mostrar o tempo } local currentTime = 60 * config.time function onUse(cid, item, frompos, item2, topos) local dolls = { [11256] = {pet = "Crystal Spider"}, [11207] = {pet = "Ashmunrah"}, [11144] = {pet = "Demon"}, [9019] = {pet = "Vampire"}, } if (os.time() < getPlayerStorageValue(cid, timeStorage)) then if (config.enableMessage) then local message = config.messageText:gsub('TIME', config.time) doPlayerSendCancel(cid, message) end return end local go = dolls[item.itemid] local summon = getCreatureSummons(cid) --------------------------------------------------- if #summon >= 1 then for _, pid in ipairs(summon) do doRemoveCreature(pid) doCreatureSay(cid, "Can go rest ["..go.pet.."]", TALKTYPE_ORANGE_1) setPlayerStorageValue(cid, timeStorage, os.time() + currentTime) end return true end doConvinceCreature(cid, doSummonCreature(go.pet, getCreaturePosition(cid))) doCreatureSay(cid, "Let battle ["..go.pet.."]", TALKTYPE_ORANGE_1) return true end
-
dgozdk deu reputação a MatteusDeli em (AJUDA) Colocar tempo em script de pet@dgozdk Boa noite, pode ser que o seu servidor não possui a função doPlayerSendCancel, nesse caso tente esse outro script.
local timeStorage = 45644 -- não mexer local config = { time = 2, -- quanto tempo em segundos o player irá esperar para usar o item novamente enableMessage = true, -- habilitar a mensagem : (true) habilita, (false) não habilita } local currentTime = 60 * config.time function onUse(cid, item, frompos, item2, topos) local dolls = { [11256] = {pet = "Crystal Spider"}, [11207] = {pet = "Ashmunrah"}, [11144] = {pet = "Demon"}, [9019] = {pet = "Vampire"}, } if (os.time() < getPlayerStorageValue(cid, timeStorage)) then if (config.enableMessage) then doPlayerSendTextMessage(cid, 4, "Voce tem que esperar "..config.time.." minuto(s) para usar o pet novamente.") end return end local go = dolls[item.itemid] local summon = getCreatureSummons(cid) --------------------------------------------------- if #summon >= 1 then for _, pid in ipairs(summon) do doRemoveCreature(pid) doCreatureSay(cid, "Can go rest ["..go.pet.."]", TALKTYPE_ORANGE_1) setPlayerStorageValue(cid, timeStorage, os.time() + currentTime) end return true end doConvinceCreature(cid, doSummonCreature(go.pet, getCreaturePosition(cid))) doCreatureSay(cid, "Let battle ["..go.pet.."]", TALKTYPE_ORANGE_1) return true end
-
dgozdk deu reputação a xWhiteWolf em Serialize/Unserialize Strings to NumberFala rapeize, eu me propus um desafio de criar uma forma de transformar uma string em números que possam ser anexados no storage.
Basicamente isso resolve o problema dos TFS anteriores de não conseguir salvar nomes de personagens no storage sem ter que fazer source editing.
PS: É óbvio que é mais fácil fazer source editing, mas o desafio era esse e como não é todo mundo que tem source tb pode ser bastante útil.
Eu não fechei o código certinho em funções, mas pretendo fazer em breve (agora preciso dormir) e aí eu edito o tópico aqui.
Nos testes q eu fiz ele conseguiu serializar e deserializar 5 mil caracteres em 0,01 segundo o que provavelmente faz dele o melhor serializador do gênero xD
Limitações: Ele só funciona com um range bem específico de strings, se vc quiser serializar qualquer outra coisa procure um serializador na internet.
Ele é capaz de processar tudo que tá dentro do retangulo vermelho
Ele só funciona com NO MÁXIMO +- 8k de caracteres, se vc quiser mais que isso vai precisar trocar a função table.concat e talvez umas outras coisinhas
O que ele faz: Transforma qualquer texto num numero, divide esse número em espaços de 32 bits e nas posições da memória consecutivas (no exemplo eu to usando uma tabela, mas poderia ser num storage, por ex). Depois ele ainda é capaz de retornar a string original a partir do serial gerado.
Funcionamento: por incrivel q pareça a lógica é bem simples, pega o código ascii de cada caractere da string, subtrai 21 para deixar o numero menor (21 é o máximo que a gente consegue encurtar pq 32 - 21 é 11 e 127 - 21 é 106, aí se eu lê-se 10 eu não saberia dizer se é o código do espaço ou dos 5 ultimos ali da tabela)
Os storages são int_32 então o maior valor q eu consigo colocar dentro de um storage é 2^31 - 1, aí tudo q eu faço é ir pegando os 10 ultimos numeros e vendo se eles cabem dentro desse limite máximo, se não couber eu pego os 9 ultimos, até caber dentro do limite. Aí eu jogo pra tabela e contabilizo quantas vezes eu to fazendo isso (isso vai ser importante depois qnd formos inserir ou pegar do storage)
Como eu já li os lines ultimos numeros da string, eu posso retirar eles e refazer o processo até não restar mais nada.
No final dentro da tabela tb vc vai ter no i o numero q vc soma no storage e no v o valor que deve ir pro storage.
Pra deserializar o processo é parecido, primeiro eu percorro a tabela concatenando os numeros na ordem inversa e depois vou vendo 2 a 2 se o numero é menor que 11 (nosso menor código ascii que representaria o espaço, lembrando que removemos 21 para encurtar). Se ele for menor então significa que estamos lidando com um dos ultimos numeros da tabela (10X), nesse caso temos que ler 3 numeros ao invés de só 2. Depois de passar tudo pra caractere e concatenar, nos é retornado a string inicial.
Código:
Quem quiser testar é só modificar a variável entrada pra qualquer texto que vc quiser e dar run. O resultado aparece na tela a direita.
https://repl.it/repls/LongtermVioletTakin