Ir para conteúdo

caotic

Infante
  • Total de itens

    1599
  • Registro em

  • Última visita

  • Dias Ganhos

    7

Tudo que caotic postou

  1. Tópico movido para a seção de dúvidas e pedidos resolvidos.
  2. Construindo o TV system em Lua
  3. Nada melhor do que usar string.gmatch. Eheuhaeuhaue
  4. Ola galera do xtibia. function onSay(cid, words, param, channel) function getTalksByGroup(cid) local events = io.open("data/talkactions/talkactions.xml", "r") str = "" for i in events:read("*a"):gmatch('<talkaction(.-)/>') do local acess = tonumber(i:match('access="(.-)"')) local talk = tostring(i:match('words="(.-)"')) local acess = acess or 0 if not string.find(tostring(i), "access") then str = ""..str.."\n"..talk.."- Player" elseif getPlayerGroupId(cid) >= acess then str = ""..str.."\n"..talk.." - "..acess.."" end end return str end function getSpellVocation(cid) local events = io.open("data/spells/spells.xml", "r") str = " >---Spell Vocations "..getPlayerVocation(cid).."---< " for i in events:read("*a"):gmatch('<instant(.-)</instant>') do local name = tostring(i:match('name="(.-)"')) local level = tostring(i:match('lvl="(.-)"')) local words = tostring(i:match('words="(.-)"')) if getPlayerGroupId(cid) >= 5 or getPlayerVocation(cid) == 0 then str = ""..str.."\n"..name.."-"..level.."-"..words.."" elseif string.find(i, '<vocation id="'..getPlayerVocation(cid)..'"/>') then str = ""..str.."\n"..name.."-"..level.."-"..words.."" end end return str end if param == "" or not param then return doPlayerPopupFYI(cid, "Diga se quer ver a sua lista de spell(/commands spells) ou comandos(/commands talks)") end if param == "spell" or param == "spells" then doShowTextDialog(cid, 1949, getSpellVocation(cid)) return true end if param == "talk" or param == "talks" then doShowTextDialog(cid, 1949, getTalksByGroup(cid)) return true end return true end Agora vá em talkactions.xml e coloque esta tag: <talkaction words="!commands;/commands" event="script" value="commands.lua"/> List talks/spells e um sistema completo que monstra uma lista que monstra a lista de talks ou a lista de spells. Na lista de spell e exibido todas as spells da vocação do player e com informações do level da spell,nome da spell e words da spell. Na lista de talkactions e exibido todas as talks do grupo do player. Para ver a lista de cada um e só dizer. /commands spells --Lista de spells /commands talks --- Lista de talks Agora vamos ao sistema. Crie um arquivo lua chamado de commands em talkactions e coloque isto:
  5. E como foi dito o poger e associado a quantidade de linhas. Mais nunca disse que a quantidade de linhas tem relação com a qualidade do script. Do mais. Eu não vejo as gambiarras como monstro. Desculpe, eu interpretei mal. Realmente, as "gambiarras" geralmente ocupam mais linhas do que uma solução que seria naturalmente mais simples. E quanto à ser um monstro, É o que eu falei: É um mal necessário. Se existe uma solução mais simples e limpa, por que fazer de forma absurda? Para ganhar a alcunha de "rei do pog"? Para obscurecer o código? Usando uma analogia bem ridícula: se você pode colocar o quadro na parede com um prego, por que usar durepoxy? Existem casos onde gambiarras são sim necessárias. Talvez porque não exista outra solução pro problema. Ou talvez seja um mÉtodo mais rápido de executar determinada rotina. Para estes casos eu concordo com você, mas o programador tem que ter certeza absoluta de que a solução É segura, eficiente, e a melhor possível para o problema. Para isso você precisa saber com o que está lidando, conhecer muito bem suas ferramentas (bibliotecas e linguagem), e mesmo assim deixar um comentário explicando como a magia negra funciona e por que ela foi necessária. Todo mundo faz gambiarra um dia, apenas tenha certeza de que está fazendo a coisa certa, e não fazendo só por graça. O trabalho dos programadores não É apenas encontrar soluções, mas sim encontrar as melhores soluções. O motivo do meu pânico em relação ao assunto É que muitos programadores incentivam os iniciantes a fazer gambiarra como se fosse normal, e isso continua com a pessoa por muito tempo, atÉ que ela atinja maturidade suficiente pra diferenciar uma solução boa de uma solução ruim. Me chame de egoísta se quiser, mas eu não quero mais ver novatos fazendo magia negra sem nem se dar o trabalho de procurar uma solução mais simples. São essas pessoas que fazem códigos com 9 loops aninhados e dificílimos de entender. Outra coisa: do jeito que eu falei talvez tenha parecido que eu estou depreciando seu trabalho. Se você entendeu isso, você tem minhas sinceras desculpas, não foi minha intenção. Eu apenas não quero que quem está começando a programar leia o tópico e seja encorajado a fazer gambiarra em todo lugar do código. Programação não É isso. Um bom programador faz um código limpo, legível e rápido, e gambiarra É justamente o contrário desses três adjetivos. Para provar que eu tambÉm faço absurdos e não estou só falando da boca pra fora, aqui está uma gambiarra que eu fiz não faz muito tempo: module("space", package.seeall) _T = "space" local __type__ = type function _G.type(value) if __type__(value) == "table" and value._T then return value._T end return __type__(value) end Mais como foi dito. Você "pelo que parece" e muito organizado; Na verdade não tenho organização nenhuma e isto e realmente um problema. Tanto que já perdi muita coisa por falta de organização. Depende muito do programador. [i]Tudo depende da pessoa. Se a pessoa gostar do que faz não há nada que impeça usar gambiarras.[/i] [i]Um programador acima de tudo deve gostar do que ele faz.[/i]
  6. E como foi dito o poger e associado a quantidade de linhas. Mais nunca disse que a quantidade de linhas tem relação com a qualidade do script. Do mais. Eu não vejo as gambiarras como monstro.
  7. Ola pessoal xtibiano. Neste tutorial estarei abordando as famosas gambiarras ou "pogs". Tomara que gostem do tuto e que decidam o sua posição em relação a gambiarras. Organizei o tutorial por perguntas mais "importante" em relação ao poger. Todas as perguntas estão organizadas e bem estruturadas. Mais o que é Gambiarras? Gambiarras são novas formulas em programação para se realizar uma ação. Normalmente as "gambiarras" são associadas a lentidão e mal uso da linguagem mais isto irá depender da sua estrutura! Normalmente um programador busca a formula mais convencional,simples,rápida é funcional para se realizar um script mais os programadores "gambiarizadores" tentem de inúmeras maneiras possíveis mesmo comprometendo a performance de seu script . Na hora da construção ele utiliza estruturas mais "abusivas". Um exemplo de gambiarra são a reconstrução de funções nativas da linguagem normalmente as funções recriadas saem com sua "performance" prejudicada. Todo programador utiliza gambiarras? Normalmente um programador adquiri esta "sede" de gambiarras ou seja nem todo programador gosta dessas fantásticas ideias. Normalmente gambiarras são associadas a falta de organização é isto e realmente verdade. Um gambiarrador normalmente tem menos organização em seus scripts ignorando (nome de variáveis,espaçamento e etc...) Necessita ter mais conhecimento na linguagem para usar as gambiarras? Não necessita ter mais conhecimento NECESSITA TER MAIS CRIATIVIDADE. Como foi dito o gambiarrador utiliza estruturas "abusivas" ou seja que consomem mais processamento da plataforma. Loops e Tables com múltiplos valores são muitos comuns em scripts com gambiarras. Existe a possibilidade de ter uma gambiarra amigável com o processamento da maquina? Claro. A maioria das gambiarras consome uma boa quantidade de processamento da maquinas mais não significa que todas as gambiarras vão utilizar a memoria de forma abusiva. Lembrando que gambiarras são apenas formulas mais inovadoras não as confundam. Numero de linhas de um código e associado a gambiarras? Sim. Normalmente códigos com gambiarras são perfeitamente visíveis que consomem mais linhas. Usar mais inovação também gasta linhas(hehe). Afinal de tudo vale a pena virar um poger? Tudo depende da pessoa. Se a pessoa gostar do que faz não há nada que impeça usar gambiarras. Um programador acima de tudo deve gostar do que ele faz. Tomarás que tenham respondido suas perguntas sobre as gambiarras. E isto ae pessoal. OUVIU LUCKOAKE POG NÃO E RUIM.
  8. você está atribuindo o uid = 0 sempre, então nao é desnecessario esse uid? (só por curiosidade mesmo) e novamente, parabens! rep+ merecido! Eu falei com o luck sobre isto. Ele falo que erá para ficar mais bonito.
  9. Sei la cara. E chato não tem necessidade.
  10. Ola pessoal xtibiano. O Info Monster e um sistema que permite ver informações importantes de um monstro para o player. Ele exibe vários atribbutos do monstro como por exemplo os ataques do monstro. Assim o player antes de caçar um monstro ele irá analisar se ele poderá derrotar o monstro. Além disso se o player errar o nome do monstro a talk exibe os nomes de todos os monstro do seu otserv assim o player podera identificar o monstro que ele procura. Então vamos a talkactions. Crie um arquivo lua chamado de info em talkactions e coloque isto: function getDirMonsterByNameMonster(name) t = {} local monster = io.open("data/monster/monsters.xml", "r") for i in monster:read("*a"):gmatch('<monster name="'..tostring(name)..'" file="(.-)"/>') do table.insert(t, tostring(i)) end return t[1] or 0 end function getMonsterAttacks(name) local dir = "data/monster/"..getDirMonsterByNameMonster(name).."" local monster = io.open(""..dir.."", "r") str = "" for i in monster:read("*a"):gmatch('attack name="(.-)"') do str = ""..str.." - "..i.."" end return str end function getMonsterDefense(name) local dir = "data/monster/"..getDirMonsterByNameMonster(name).."" local monster = io.open(""..dir.."", "r") str = "" for i in monster:read("*a"):gmatch('defense name="(.-)"') do str = ""..str.." - "..i.."" end return str end function getMonsterLootItens(name) local dir = "data/monster/"..getDirMonsterByNameMonster(name).."" local monster = io.open(""..dir.."", "r") str = "" for i in monster:read("*a"):gmatch('id="(.-)"') do str = ""..str.." - "..i.."" end return str end function getMonsterVoices(name) local dir = "data/monster/"..getDirMonsterByNameMonster(name).."" local monster = io.open(""..dir.."", "r") str = "" for i in monster:read("*a"):gmatch('voice sentence="(.-)"') do str = ""..str.." - "..i.."" end return str end function getAllMonster() local str = "" local monster = io.open("data/monster/monsters.xml", "r") str = "Você digitou incorretamente o nome do monstro veja a lista de monstro\n" for i in monster:read("*a"):gmatch('<monster name="(.-)"') do str = ""..str.." - "..i.."" end return str end function getAttrMonster(name) return "Vida = "..getMonsterInfo(name).health.."\nExp = "..getMonsterInfo(name).experience.."\n" end function onSay(cid, words, param, channel) if param == "" or not param or param == " " then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você precisa dizer o nome do monstro") return true end local name = param if (getMonsterInfo(param)) then doShowTextDialog(cid, 1397, "Info Monster "..name.."\n"..getAttrMonster(name).."\nAttacks = "..getMonsterAttacks(name).."\n\nDefense = "..getMonsterDefense(name).."\n\nVoices = "..getMonsterVoices(name).."\n\nLoots = "..getMonsterLootItens(name).."") else doShowTextDialog(cid, 1397, getAllMonster()) return true end return true end Agora vá em talkactions.xml e coloque isto: <talkaction words="/infom" event="script" value="info.lua"/>
  11. E incrível o sistema Você manipula a criatura de um jeito espetacular salvando a criatura com o pet:setit A única coisa chata seria as storages. Mais ta incrível Parabéns.
  12. Antes de configurar o script. Eu recomendo algumas dicas.
  13. Não vejo motivo para não funcionar em versões 8.X
  14. Ola galera xtibia. Eu resolvi fazer o Trainer OFF 1.0 o antigo trainer off beta tinha algumas limitações. Segue o link do Trainer off beta: http://www.xtibia.com/forum/topic/199659-trainer-off-sytem-beta-by-caotic/ Como o próprio nome diz e um treinamento quando o player está off. Ele paga uma taxa para treinar uma certa quantidade de horas e depois suas skills são upadas. Na versão superior foi adicionado Vamos ao sistema lets go: Crie um arquivo lua chamado de trainer em talkactions e coloque isto: local Train = { skill = 0, quant = 0, time = 0, vocations = {}, money = 0, player = 0 } local table = { ["fist"] = SKILL_FIST, ["sword"] = SKILL_SWORD, ["axe"] = SKILL_AXE, ["distance"] = SKILL_DISTANCE, ["shild"] = SKILL_SHIELD, ["fishing"] = SKILL_FISHING } local x = {"First Skill", "Sword Skill", "Axe Skill", "Distance Skill", "Shild Skill", "Fishing Skill"} function Train:new(cid, param, vocations, money, quant) local trainer = { vocations = {}, param = param, player = cid, money = tonumber(money), quant = tonumber(quant) } return setmetatable(trainer, {__index = self}) end function Train:start() cid = self.player local t = string.explode(self.param, ",") if not t[1] or not isNumeric(t[1]) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Diga o tempo que você quer treinar") and false end self.skill = table[t[2]] self.time = t[1]*36000*1000 self.money = self.money*t[1] self.quant = self.quant*t[1] if not t[2] or not table[t[2]] then str = "Lista de skills(Diga a sua skill)\nPara dizer e só escrever /treiner (tempo do treiner,skill)\n" for i = 1, #x do str = ""..str.."\n"..x[i].."" end doShowTextDialog(cid, 1397, str) return true end if isInArray(self.vocations, getPlayerVocation(cid)) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sua vocação não permite o trainer") and false end if self.money >= getPlayerMoney(cid) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não tem "..self.money.." de money") and false end if self.time <= 36000*1000 then self.time = 36000*1000 end exhaustion.set(cid, 44226, self.time) doPlayerAddSkill(cid, self.skill, self.quant) doPlayerRemoveMoney(cid, self.money) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Pronto você esta em treinamento") doRemoveCreature(cid) end function onSay(cid, words, param, channel) local voc = {} ---- Vocações QUE NÃO SE PERMITIDAS TRAINER OFF(Se não tiver deixe sem nenhuma) local money = 200000 ----- Quanto de money PARA CADA hora local quant = 4 ------ Quantidade de skill que ele ganha PARA CADA HORA local trainer = Train:new(cid, param, voc, money, quant) trainer:start() return true end Agora vá em talkactions.xml e coloque esta tag: <talkaction words="/treiner" event="script" value="trainer.lua"/> Agora vá em creaturescripts e crie um arquivo lua chamado de treiner e coloque este codigo: function onLogin(cid) if exhaustion.get(cid, 44226) then doPlayerPopupFYI(cid, "Não e permitido logar enquanto esta treinando") return addEvent(doRemoveCreature, 180, cid) end return true end Registre o evento em login.lua colocando isto antes do ultimo return true: registerCreatureEvent(cid, "treiner") E coloque esta tag em creaturescripts.xml: <event type="login" name="treiner" register = "1" event="script" value="treiner.lua"/>
  15. Ele precisa terminar as horas de treinos para ele pode logar. Ate mais
  16. Ola galerinha xtibiana. Eu resolvi fazer uma versão superior do report system usando db. Segue o link da versão demo: http://www.xtibia.com/forum/topic/198470-report-sytem-beta/ Esta versão utiliza banco de dados assim fica mais fácil de manipular e o administrador poderá ver os reports "In-Game" além de que eles serão excluídos apos serem lidos. A lista e ordenada pelo level do player "evitando as vezes você ler primeiros possíveis floods". Vamos a instalação. Vá em lib e crie um arquivo lua chamado de report e coloque isto: function getReportByGuid(guid) local shop = db.getResult("SELECT * FROM `report` WHERE `id` = ".. guid ..";") return shop:getDataString("report") end function doPlayerAddReport(cid, report) db.executeQuery("INSERT INTO `report` (`id`, `report`, `level`) VALUES (" .. getPlayerGUID(cid) .. ", '" .. report .. "', " .. getPlayerLevel(cid) .. ");") return true end function showReports(cid) local rep = db.getResult("SELECT * FROM `report` WHERE `id` ORDER BY `level`") str = "Reports Ativos:\n\n" if rep:getID() == -1 then doShowTextDialog(cid, 1387, "Não ha reports disponiveis!") return true end while true do local list = rep:getDataString("report") local players = rep:getDataInt("id") local name = getPlayerNameByGUID(players) str = str .. list .. " -("..players..")- Name ("..name..")]\n\n" db.executeQuery("DELETE FROM `report` WHERE `id` = ".. players.." and `report` = '".. list .."';") if not rep:next() then doShowTextDialog(cid, 1397, str) break end end end Agora vá em talkactions e crie um arquivo LUA chamado de report e coloque este codigo: function onSay(cid, words, param, channel) local time = 4 ---- Exhaustion cada numeral equivale a 1 hora. if param == "" or not param or param == " " then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "E necessario escrever o report") and false end if exhaustion.get(cid, 23246) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você atingiu o limite de reports espere o limite sair") and false end if #param <= 4 then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "O seu report deve conter mais de 4 caracteres") and false end exhaustion.set(cid, 23246, time*36000*1000) doPlayerAddReport(cid, param) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Parabéns seu report foi enviado para nosso banco de dados logo ele sera visto\nA equipe agradece") return true end Agora continue em talkactions e crie um arquivo lua chamado de logreport e coloque isto: function onSay(cid, words, param, channel) showReports(cid) return true end Agora vá em talkactions.xml e coloque esta tags: Dicas:
  17. Área Incorreta Tópico Moved
  18. Que nada. Eu postei para compartilhar. Não ligo para estas coisas.
  19. Ain. Eu nem citei nome . @topic A organização esta razoável como foi dito só falto trabalhar mais nas perguntas
  20. Eehuaheaueh' Agora que vi que tem uma tag com meu nick.
  21. Eu não curto entrevista "arranjadas" que foram feitas a pedidos do usuário. Tem que ser algo "merecedor"
  22. Ehaueheu. O script ja ta bagunçado se ainda quer mais? Eu queria "Pogar" ele um pouco só que não achei nenhuma utilidade para usar o pog.
  23. Estava sem nada para fazer e resolvi fazer este script. A ideia e que quando o player morre ele tem "vidas" e ele volta para a posição de onde estava. Você deve alterar somente a quantidade de vidas que cada player terá. Vá em creaturescripts crie um arquivo lua chamado de checkpoint e coloque isto: function onDeath(cid, corpse, killer) if getPlayerStorageValue(cid, 43242) == -1 then if getPlayerStorageValue(cid, 26124) ~= -1 then doPlayerSetLossSkill(cid, getPlayerStorageValue(cid, 26124)) end return true end function recordPos(cid) local pos = getThingPos(cid) setPlayerStorageValue(cid, 12356, pos.x) setPlayerStorageValue(cid, 12367, pos.y) setPlayerStorageValue(cid, 12378, pos.z) end function noLoseAttr(cid, corpse) setPlayerStorageValue(cid, 26124, getPlayerLossSkill(cid)) doPlayerSetLossSkill(cid, 0) doRemoveItem(corpse.uid) end recordPos(cid) noLoseAttr(cid, corpse) return true end function onLogin(cid) local vidas = 3 ---Quantas vidas o player vai ter function returnCheckPoint(cid) local record_pos = {x=getPlayerStorageValue(cid, 12356), y=getPlayerStorageValue(cid, 12367), z=getPlayerStorageValue(cid, 12378)} doTeleportThing(cid, record_pos) end function sendMens(cid) local vidas = getPlayerStorageValue(cid, 43242) local x = {"Você esta com "..vidas.." vidas","Resta "..vidas.." vidas para você", "Cuidado resta "..vidas.." vidas para você"} return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, x[math.random(1, #x)]) end if getPlayerStorageValue(cid, 43242) == -1 then return setPlayerStorageValue(cid, 43242, vidas) and true end sendMens(cid) returnCheckPoint(cid) setPlayerStorageValue(cid, 43242, getPlayerStorageValue(cid, 43242)-1) return true end Coloque esta tags em creaturescripts.xml: <event type="death" name="check" event="script" value="checkpoint.lua"/> <event type="login" name="record"" event="script" value="checkpoint.lua"/> Registre o evento em login.lua colocando isto antes do ultimo return true:
  24. lerme você acabou de reviver um tópico de 2011. Leia as regras
  • Quem Está Navegando   0 membros estão online

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