Ir para conteúdo

GiovaniRodrigo

Membro
  • Registro em

  • Última visita

Tudo que GiovaniRodrigo postou

  1. Olá galera, estou utilizando um sistema de task system simples, aonde você pede a task para o NPC, mata os monstros e volta para pegar a recompensa. Peguei um script base do @Vodkart e alterei para as minhas necessidades. Como faz tempo que não faço scripts, estou enfrentando um problema onde no meu script está configurado o ganho de experiência, dinheiro e itens quando dizer "reward" para o NPC, ao dizer "reward" o jogador recebe apenas a experiência e o dinheiro, os itens não, e está gerando o seguinte erro no console: Outro problema que eu enfrento é que sempre que eu falar "reward" eu recebo a recompensa novamente, sendo que só pode receber apenas uma vez. Utilizo a base TFS 0.4 simpletask.xml <?xml version="1.0" encoding="UTF-8"?> <mod name="Simple Task" version="1.0" enabled="yes"> <config name="task_func"> <![CDATA[ monstertable = { ["troll"] = {monster = {"troll", "frost troll", "furious troll", "island troll", "swamp troll", "troll champion", "troll legionnaire"}, startStorage = 200201, storage = 91001, count = 20, experience = 150, money = 300, reward = {{2160, 2}, {2389, 10}}}, ["goblin"] = {monster = {"goblin", "goblin assassin", "goblin leader"}, startStorage = 200202, storage = 91002, count = 30, experience = 200, money = 150, reward = {{1294, 20}}}, } function isSummon(cid) return getCreatureMaster(cid); end function checkTask(cid) for k, v in pairs(monstertable) do if getPlayerStorageValue(cid, v.startStorage) >= 1 then return true end end return false end function HavePlayerPosition(cid, from, to) return isInRange(getPlayerPosition(cid), from, to) and true or false end function getItemsInContainerById(container, itemid) local items = {} if isContainer(container) and getContainerSize(container) > 0 then for slot = 0, (getContainerSize(container)-1) do local item = getContainerItem(container, slot) if isContainer(item.uid) then local itemsbag = getItemsInContainerById(item.uid, itemid) for i = 0, #itemsbag do table.insert(items, itemsbag[i]) end else if itemid == item.itemid then table.insert(items, item.uid) end end end end return items end function doPlayerAddItemStacking(cid, itemid, quant) local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid) local piles = 0 if #item > 0 then for i, x in pairs(item) do if getThing(x).type < 100 then local it = getThing(x) doTransformItem(it.uid, itemid, it.type+quant) if it.type+quant > 100 then doPlayerAddItem(cid, itemid, it.type+quant-100) end else piles = piles+1 end end else return doPlayerAddItem(cid, itemid, quant) end if piles == #item then doPlayerAddItem(cid, itemid, quant) end end function getItemsFromList(items) local str = '' if table.maxn(items) > 0 then for i = 1, table.maxn(items) do str = str .. items[i][2] .. ' ' .. getItemNameById(items[i][1]) if i ~= table.maxn(items) then str = str .. ', ' end end end return str end function doAddItemsFromList(cid,items) if table.maxn(items) > 0 then for i = 1, table.maxn(items) do local count = items[i][2] while count > 0 do if isItemStackable(items[i][1]) then doPlayerAddItemStacking(cid, items[i][1], 1) else doPlayerAddItem(cid, items[i][1],1) end count = count - 1 end end end end ]]> </config> <event type="login" name="TaskLogin" event="script"> <![CDATA[ function onLogin(cid) registerCreatureEvent(cid, "KillTask") return true end ]]> </event> <event type="kill" name="KillTask" event="script"> <![CDATA[ domodlib('task_func') function onKill(cid, target, lastHit) if isMonster(target) and not isSummon(target) then local n = string.lower(getCreatureName(target)) for task, mob in pairs(monstertable) do if getPlayerStorageValue(cid, mob.startStorage) >= 1 then for i = 1, #mob.monster do if n == mob.monster[i] and getPlayerStorageValue(cid, mob.startStorage) >= 1 then local contagem = getPlayerStorageValue(cid, mob.storage) if (contagem == -1) then contagem = 1 end if not tonumber(contagem) then return true end if contagem > mob.count then return true end setPlayerStorageValue(cid, mob.storage, contagem+1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, ""..(contagem == mob.count and "Congratulations! You finished the task of "..task.."." or "defeated. Total ["..contagem.."/"..mob.count.."] "..task..".").."") end end end end end return true end ]]> </event> </mod> simpletask.lua(NPC) domodlib('task_func') local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid local msg = string.lower(msg) if isInArray({"task", "tasks"}, msg) then selfSay("Tell me what the monster's name wants to do the task?", cid) talkState[talkUser] = 1 elseif talkState[talkUser] == 1 then if monstertable[msg] then if checkTask(cid) ~= true then local contagem = getPlayerStorageValue(cid, monstertable[msg].storage) if(contagem == -1) then contagem = 1 end if not tonumber(contagem) then selfSay("Sorry, but you're done with the "..msg..".", cid) talkState[talkUser] = 0 return true end setPlayerStorageValue(cid, monstertable[msg].startStorage, 1) selfSay("Congratulations, you are now participating in the "..msg.." task, "..monstertable[msg].count.." "..msg.." left for you to kill.", cid) talkState[talkUser] = 0 else selfSay("Sorry, but you are already part of a task.", cid) talkState[talkUser] = 0 end else selfSay("Enter the correct task name.", cid) talkState[talkUser] = 0 end elseif msgcontains(msg, "reward") then if checkTask(cid) then for k, v in pairs(monstertable) do if getPlayerStorageValue(cid, v.startStorage) >= 1 then local contagem = getPlayerStorageValue(cid, v.storage) if (contagem == -1) then contagem = 1 end if not tonumber(contagem) then selfSay("You can only receive items only once.", cid) return true end if (((contagem) -1) >= v.count) then local str = "" if v.experience ~= nil then doPlayerAddExp(cid, v.experience) str = str.."".. (str == "" and "" or ",").. " "..v.experience.." of experience" end if v.money ~= nil then doPlayerAddMoney(cid, v.money) str = str.."".. (str == "" and "" or ",").." "..v.money.." golds" end if v.reward ~= nil then doAddItemsFromList(cid, v.reward) str = str.."".. (str == "" and "" or ",").." "..getItemsFromList(v.reward).."" end selfSay("Thanks for your help, you received "..(str == "" and "none" or ""..str.."").." for completing the task of the "..k..".", cid) setPlayerStorageValue(cid, v.storage, "Finished") setPlayerStorageValue(cid, v.startStorage, 0) setPlayerStorageValue(cid, 521456, getPlayerStorageValue(cid, 521456) == -1 and 1 or getPlayerStorageValue(cid, 521456) + 1) else selfSay("Sorry, but you only killed "..((contagem)-1).." of "..v.count.." "..k..".", cid) end end end else selfSay("You are not participating in any task.", cid) end elseif msgcontains(msg, "leave") then if checkTask(cid) then talkState[talkUser] = 2 for k, v in pairs(monstertable) do if getPlayerStorageValue(cid, v.startStorage) >= 1 then storagesair = v.startStorage local contagem = getPlayerStorageValue(cid, v.storage) if (contagem == -1) then contagem = 1 end if not tonumber(contagem) then selfSay("You are not participating in any task.", cid) else selfSay("You are participating in a "..k.." and already has "..((contagem)-1).." dead "..k..", do you really want to leave?", cid) end end end else selfSay("You are not on any task.", cid) end elseif msgcontains(msg, "yes") and talkState[talkUser] == 2 then setPlayerStorageValue(cid, storagesair, 0) selfSay("You were successfully removed from the task!", cid) elseif msgcontains(msg, "no") then selfSay("Okay then.", cid) talkState[talkUser] = 0 npcHandler:releaseFocus(cid) end return TRUE end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Scripts atualizados, problema corrgido, task funcionando 100% euacho
  2. Não sei se está correto pois estou a anos sem fazer scripts, mas testa esse e me diz o que deu. function onLogin(cid) if isPremium(cid) and getPlayerStorageValue(cid, 2143190718) == -1 then setPlayerStorageValue(cid, 2143190718, 1) end local house = getHouseByPlayerGUID(getPlayerGUID(cid)) local pos = {x=32369, y=32241, z=7} -- pos onde será teleportado if not isPremium(cid) and getPlayerStorageValue(cid, 2143190718) == 1 then doPlayerSendTextMessage(cid, 22, "mensagem aqui.") doCreatureChangeOutfit(cid, 128) if getHouseByPlayerGUID(getPlayerGUID(cid)) ~= nil then setHouseOwner(house, 0) end doTeleportThing(cid, pos) end return true end
  3. Nem vou brigar por ter apenas copiado e colado o código que eu já postei e não ter colocado créditos, enfim, desnecessário seu post.
  4. Tenta esse demon1pos = {x = 2175, y = 3114, z = 7} demon2pos = {x = 2177, y = 3114, z = 7} demon3pos = {x = 2179, y = 3114, z = 7} demon4pos = {x = 2175, y = 3118, z = 7} demon5pos = {x = 2177, y = 3118, z = 7} demon6pos = {x = 2179, y = 3118, z = 7} demon7pos = {x = 2173, y = 3117, z = 7} demon8pos = {x = 2181, y = 3117, z = 7} positionPlayer = {x = 2171, y = 3108, z = 6} function onUse(cid, item, frompos, item2, topos) if getCreaturePosition(cid) == positionPlayer then doTeleportThing(cid,{x = 2177, y = 3116, z = 7}) doSummonCreature("Orshabaal", demon1pos) doSummonCreature("Orshabaal", demon2pos) doSummonCreature("Orshabaal", demon3pos) doSummonCreature("Orshabaal", demon4pos) doSummonCreature("Orshabaal", demon5pos) doSummonCreature("Orshabaal", demon6pos) doSummonCreature("Morgaroth", demon7pos) doSummonCreature("Morgaroth", demon8pos) else doPlayerSendTextMessage(cid, 22, "Entre no piso branco.") end end
  5. demon1pos = {x = 2175, y = 3114, z = 7} demon2pos = {x = 2177, y = 3114, z = 7} demon3pos = {x = 2179, y = 3114, z = 7} demon4pos = {x = 2175, y = 3118, z = 7} demon5pos = {x = 2177, y = 3118, z = 7} demon6pos = {x = 2179, y = 3118, z = 7} demon7pos = {x = 2173, y = 3117, z = 7} demon8pos = {x = 2181, y = 3117, z = 7} positionPlayer = {x = 2171, y = 3108, z = 6} function onUse(cid, item, frompos, item2, topos) if getCreaturePosition(cid) == positionPlayer then doTeleportThing(cid,{x = 2177, y = 3116, z = 7}) doSummonCreature("Orshabaal", demon1pos) doSummonCreature("Orshabaal", demon2pos) doSummonCreature("Orshabaal", demon3pos) doSummonCreature("Orshabaal", demon4pos) doSummonCreature("Orshabaal", demon5pos) doSummonCreature("Orshabaal", demon6pos) doSummonCreature("Morgaroth", demon7pos) doSummonCreature("Morgaroth", demon8pos) end else doPlayerSendTextMessage(cid, 22, "Entre no piso branco.") end Testa esse.
  6. Você quer dez itens, onde cada um tenha sua própria porcentagem de sortear um de dez itens. Eu até conseguiria fazer, mas estou afastado faz quase um ano ou mais, quem tem os dons é o MaXwEllDeN. Se eu for fazer o script, o código ficará muito extenso, acho que o Max conseguiria diminui-lo usando for e aquelas paradas.
  7. GiovaniRodrigo postou uma resposta no tópico em Suporte Tibia OTServer
    Se a sua preocupação é editar valores do banco de dados, não precisa estar em SQLite, da pra editar No MySQL também.
  8. GiovaniRodrigo postou uma resposta no tópico em Mapping Show Off
    Criatividades sem fim, simplesmente OP - jogadoresdelolirãoentender
  9. KKKKKKKKKK, bugado, eu deixo os tutoriais pronto e depois mando um combo na cara de vocês (:
  10. Olá KingTibianos, hoje trago a vocês comandos para gestão de dados no SQL. Alterar dados UPDATE usuario SET password=”Senha321” WHERE id=1; UPDATE tabela: Altera registros de uma determinada tabela. SET campo=”Novo Valor”: Especifica o campo que será alterado e altera o valor. WHERE campo=valor: Especifica alteração na linha que estiver com o campo “X” com valor “X”. OBS: Se eu usar WHERE [email protected] ele iria alterar todos os usuários que tenha o [email protected] registrado em sua conta. Até a próxima pessoal.
  11. Olá KingTibianos, hoje trago a vocês comandos para gestão de dados no SQL. Inserir dados INSERT INTO usuarios (user_name, password, email) VALUES(‘UsuarioTeste’, ‘Senha123’, ‘[email protected]’); Como de costume vou explicar a linha de comando INSER INTO usuarios: Especifica a tabela que os dados serão inseridos. (campo1, campo2, campo3): Campos que receberão os valores. VALUES(‘valor_campo1’, ‘valor_campo2’, ‘valor_campo3’): Valores que serão inseridos nos campos. Não confundem VALUES(‘’) como um valor nulo. Exemplo de um campo nulo: INSERT INTO usuarios (user_name, password) VALUES(‘UsuarioTeste’, ‘Senha123’); Vale lembrar que se o campo email estivesse com o tipo de dado NOT_NULL daria erro na hora de executar a linha de comando. Como ele está NULL então pode ser nulo. Até a próxima pessoal.
  12. Olá KingTibianos, hoje trago a vocês comandos para gestão de tabelas no SQL. Outros comandos para gestão de tabelas Apagar tabela. DROP TABLE tabela; Exibir tabelas existentes. SHOW TABLES; Mostrar descrição da tabela. DESCRIBE tabela; Até a próxima pessoal.
  13. Olá KingTibianos, hoje trago a vocês comandos para gestão de tabelas no SQL. Alterar tabelas ALTER TABLE nome_da_tabela: Alterar determinada tabela. Você sempre irá usar ALTER TABLE nome_da_tabela antes de qualquer modificação. Tipos de alterações ADD campo <tipo_de_dados>: Adiciona um campo. ALTER campo SET DEFAULT <tipo_de_dados>: Altera o valor por defeito de um campo. ALTER campo DROP DEFAULT: Remove o valor por defeito de um campo. CHANGE campo novo_nome <tipo_de_dados>: Altera o nome de um campo e os tipos de dados. DROP campo: Elimina um campo. MODIFY campo <tipo_de_dados>: Altera tipo de dados de um campo. RENAME tabela: Altera o nome de uma tabela. 1º - ALTER TABLE usuarios ADD email VARCHAR(50) NULL; 2º - ALTER TABLE usuarios RENAME users; No primeiro exemplo eu adicionei o campo email na tabela usuarios. No segundo exemplo eu alterei o nome da tabela usuarios para users. Até a próxima pessoal.
  14. Olá KingTibianos, hoje trago a vocês comandos para gestão de tabelas no SQL. Criar Tabelas CREATE TABLE usuarios ( id int NOT_NULL AUTO_INCREMENT, user_name VARCHAR(16) NOT NULL, password VARCHAR(16) NOT_NULL, PRIMARY KEY (id) ); Nesse exemplo eu criei uma tabela de cadastro de usuários bem simples. Vou explicar cada linha de comando e o tipos de dados usados nos campos(alguns tipos de dados são repetidos, sendo assim não irei explicar novamente) CREATE TABLE nome_da_tabela: Responsável por criar a tabela. id: O campo id é usado para identificação do usuário, usei o tipo de dados int para especificar que apenas números inteiros seja adicionado nesse campo, tipo NOT_NULL diz que o campo não pode ser nulo e o AUTO_INCREMENT é responsável por auto incrementar os valores, sendo assim a cada cadastro novo ele incrementa +1 no valor anterior, se o primeiro cadastro é id = 1 automaticamente o segundo cadastro será id = 2 e assim por diante. user_name: O campo user_name é usado para guardar o nome de usuário do cadastrado, usei o tipo de dados VARCHAR(16) para especificar que esse campo receba apenas 16 caracteres. PRIMARY KEY(id): Especifica a chave primaria da tabela, no nosso caso o campo id. Até a próxima pessoal.
  15. Está de parabéns moderador (:
  16. Sim, eu fiz bem básico mesmo. Apenas os principais.
  17. O tópico foi movido para a área correta, preste mais atenção da próxima vez! Leia as regras do fórum: http://tibiaking.com/forum/topic/1281-regras-gerais/?p=7680 Este tópico foi movido: De: "OTServ → WebSites → Tutoriais de Websites" Para: "OTServ → Suporte OTServ"
  18. Olá KingTibianos, hoje trago a vocês alguns tipos de dados podemos definir no SQL. String CHAR(n): Armazena uma cadeia de longitude fixa. A cadeia poderá conter desde 0 até 255 caracteres. VARCHAR(n): Armazena uma cadeia de longitude variável. A cadeia poderá conter desde 0 até 255 caracteres. Dentro dos tipos de cadeia pode-se distinguir dois subtipos, os tipo Test e os tipo Blob (Binary Large Object) A diferença entre um tipo e outro é o tratamento que recebem na hora de ordená-los e compará-los. No tipo test ordena-se sem ter importância as maiúsculas e as minúsculas e no tipo blob ordena-se tendo em conta as maiúsculas e minúsculas. TINYTEXT/TINYBLOD: Coluna com uma longitude máxima de 255 caracteres. TEXT/BLOD: Um texto com um máximo de 65535 caracteres. MEDIUMTEXT/MEDIUMBLOD: Um texto com um máximo de 16.777.215 caracteres. LONGTEXT/LONGBLOD: Um texto com um máximo de caracteres 4.294.967.295. Há que ter em conta que devido aos protocolos de comunicação os pacotes podem ter um máximo de 16 Mb. ENUM: Campo que pode ter um único valor de uma lista que se especifica. O tipo Enum aceita até 65535 valores diferentes. SET: Um campo que pode conter nenhum, um ou vários valores de uma lista. A lista pode ter um máximo de 64 valores. Diferença de armazenamento entre os tipos CHAR e VARCHAR Até a próxima pessoal.
  19. Olá KingTibianos, hoje trago a vocês alguns tipos de dados podemos definir no SQL. Data DATE: Armazena uma data. A margem de valores vai desde o 1 de Janeiro de 1001 ao 31 de dezembro de 9999. O formato de armazenamento é de ano-mes-dia. DATETIME: Combinação de data e hora. A margem de valores vai desde o 1 ed Janeiro de 1001 às 0 horas, 0 minutos e 0 segundos ao 31 de Dezembro de 9999 às 23 horas, 59 minutos e 59 segundos. O formato de armazenamento é de ano-mes-dia horas:minutos:segundos. TIMESTAMP: Combinação de data e hora. A margem vai desde o 1 de Janeiro de 1970 ao ano 2037. O formato de armazenamento depende do tamanho do campo: TIME: Armazena uma hora. A margem de horas vai desde -838 horas, 59 minutos e 59 segundos. O formato de armazenamento é 'HH:MM:SS'. YEAR: Armazena um ano. A margem de valores permitidos vai desde o ano 1901 ao ano 2155. O campo pode ter tamanho dois ou tamanho 4 dependendo de se queremos armazenar o ano com dois ou quatro algarismos. Até a próxima pessoal.
  20. O tópico foi movido para a área correta, preste mais atenção da próxima vez! Leia as regras do fórum: http://tibiaking.com/forum/topic/1281-regras-gerais/?p=7680 Este tópico foi movido: De: "OTServ → WebSites → Downloads de Websites" Para: "OTServ → Suporte OTServ"
  21. Olá KingTibianos, hoje trago a vocês alguns tipos de dados podemos definir no SQL. Numéricos TINYINT: é Um número inteiro com ou sem signo. Com signo a margem de valores válidos é desde -128 até 127. Sem signo, a margem de valores é de 0 até 255. BIT/BOOL: Um número inteiro que pode ser 0 ou 1. SMALLINT: Número inteiro com ou sem signo. Com signo a margem de valores válidos é desde -32768 até 32767. Sem signo, a margem de valores é de 0 até 65535. MEDIUMINT: Número inteiro com ou sem signo. Com signo a margem de valores válidos é desde -8.388.608 até 8.388.607. Sem signo, a margem de valores é de 0 até 16777215. INTEGER/INT: Número inteiro com ou sem signo. Com signo a margem de valores válidos é desde -2147483648 até 2147483647. Sem signo, a margem de valores é de 0 até 429.496.295. BIGINT: Número inteiro com ou sem signo. Com signo a margem de valores válidos é desde -9.223.372.036.854.775.808 até 9.223.372.036.854.775.807. Sem signo, a margem de valores é de 0 até 18.446.744.073.709.551.615. FLOAT: Número pequeno em vírgula flutuante de precisão simples. Os valores válidos vão desde -3.402823466E+38 até -1.175494351E-38,0 eté desde 175494351E-38 até 3.402823466E+38. xREAL/DOUBLE: Número em vírgula flutuante de dupla precisão. Os valores permitidos vão desde -1.7976931348623157E+308 até -2.2250738585072014E-308, 0 e desde 2.2250738585072014E-308 até 1.7976931348623157E+308. DECIMAL/DEC/NUMERIC: Número em vírgula flutuante desempacotado. O número armazena-se como uma cadeia. Até a próxima pessoal.
  22. Olá KingTibianos, hoje trago a vocês alguns comandos de gestão de banco de dados no SQL. Cria um banco de dados. CREATE DATABASE baseDeDados; Apaga um bando de dados. DROP DATABASE baseDeDados; Mostra todos os bancos de dados existentes. SHOW DATABASES; Usa um determinado banco de dados. USE baseDeDados; Até a próxima pessoal.
  23. GiovaniRodrigo postou uma resposta no tópico em Playground (Off-topic)
    To te dizendo, o Youtube estava querendo meu corpo nu :/

Informação Importante

Confirmação de Termo