Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 01/25/13 em todas áreas
-
Pet System OOP
PostadorHunter e 5 outros reagiu a Oneshot por um tópico no fórum
Pet System OOP Boa tarde, pessoal. Depois de ver muitos sistemas de pet para Tibia, resolvi desenvolver o meu próprio sistema de pets. O diferencial do meu sistema é que ele é orientado a objetos. Sim, ele trata o pet do jogador como um objeto em Lua e suas ações como métodos. Essa ainda é uma versão básica, que irei aprimorar aos poucos, igual fiz com meu Forge System e Refine System. Por se tratar de uma biblioteca orientada a objetos, ele pode ser usado por qualquer scripter em diversos sistemas, e se bem adaptado, dá até para fazer um Poketibia orientado a objetos. Aliás, os comandos estão bastante semelhantes a Pokétibia. Instalação 1. Crie um arquivo em data/lib com o nome pet-system.lua e cole o conteúdo abaixo: -- This script is part of Pet System -- Copyright (C) 2013 Oneshot -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see <http://www.gnu.org/licenses/>. -- storages for pet system PET_UID = 80001 PET_SPECIE = 80002 PET_LEVEL = 80003 PET_EXPERIENCE = 80004 PET_HEALTH = 80005 PET_HEALTHMAX = 80006 PET_MANA = 80007 PET_MANAMAX = 80008 PET_EXHAUST = 80009 PET_ALIVE = 80010 Pets = {} -- class for pet species PetSpecie = { type = "", basehp = 0, basemp = 0, gainhp = 0, gainmp = 0, spells = {}, evolution = "", evolve = 0, } -- class for pets Pet = { it = nil, attributes = nil, level = 0, experience = 0, health = 0, healthmax = 0, mana = 0, manamax = 0, } -- create new instances of PetSpecie function PetSpecie:new(type, basehp, basemp, gainhp, gainmp, spells, evolution, evolve) local new_specie = { type = type, basehp = basehp, basemp = basemp, gainhp = gainhp, gainmp = gainmp, spells = spells, evolution = evolution, evolve = evolve, } local obj = setmetatable(new_specie, {__index = self}) Pets[type:lower()] = obj return obj end -- create new instances of Pet function PetSpecie:create() local new_pet = { it = nil, attributes = self, level = 1, experience = 0, health = self.basehp, healthmax = self.basehp, mana = self.basemp, manamax = self.basemp, } return setmetatable(new_pet, {__index = Pet}) end -- summon a player pet for the first time function Pet:hatch(cid) if getCreatureStorage(cid, PET_SPECIE) ~= -1 then return doPlayerSendCancel(cid, "You already have a pet.") end local pet = doCreateMonster(self.attributes.type, getCreaturePosition(cid)) if not pet then return false end if not doConvinceCreature(cid, pet) then doRemoveCreature(pet) return false end self:setit(pet) setCreatureMaxHealth(pet, self.healthmax) doCreatureAddHealth(pet, self.healthmax) doCreatureSetStorage(cid, PET_SPECIE, self.attributes.type) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your new pet has born.") self:save() doSendMagicEffect(getCreaturePosition(pet), CONST_ME_HOLYDAMAGE) return self end -- make player pet say something function Pet:say(strt) doCreatureSay(self.it, strt, TALKTYPE_ORANGE_1) end -- gather a summoned player pet back function Pet:back() self:save() doSendMagicEffect(self:position(), CONST_ME_POFF) doCreatureSay(getCreatureMaster(self.it), "It's enough, ".. getCreatureName(self.it)) doRemoveCreature(self.it) end -- free a player pet forever function Pet:release() local cid = getCreatureMaster(self.it) doCreatureSay(cid, "Good bye, ".. getCreatureName(self.it) .."... :'(") doCreatureSetStorage(cid, PET_UID, -1) doCreatureSetStorage(cid, PET_SPECIE, -1) doCreatureSetStorage(cid, PET_LEVEL, -1) doCreatureSetStorage(cid, PET_EXPERIENCE, -1) doCreatureSetStorage(cid, PET_HEALTH, -1) doCreatureSetStorage(cid, PET_HEALTHMAX, -1) doCreatureSetStorage(cid, PET_MANA, -1) doCreatureSetStorage(cid, PET_MANAMAX, -1) doSendMagicEffect(self:position(), CONST_ME_POFF) doRemoveCreature(self.it) end -- add experience to player pet function Pet:addexperience(value) local prevLevel = self.level local nextLevelExp = getExperienceForLevel(self.level + 1) self.experience = self.experience + value while self.experience >= nextLevelExp do self.healthmax = self.healthmax + self.attributes.gainhp self.manamax = self.manamax + self.attributes.gainmp self.level = self.level + 1 nextLevelExp = getExperienceForLevel(self.level + 1) end if prevLevel ~= self.level then self.mana = self.manamax self.health = self.healthmax doPlayerSendTextMessage(getCreatureMaster(self.it), MESSAGE_STATUS_CONSOLE_BLUE, "Your pet advanced from level ".. prevLevel .." to level ".. self.level ..".") setCreatureMaxHealth(self.it, self.healthmax) doCreatureAddHealth(self.it, getCreatureMaxHealth(self.it)) self:save() if self.attributes.evolution then if self.attributes.evolve and self.level >= self.attributes.evolve then doCreatureSay(getCreatureMaster(self.it), "What's happening?!") addEvent(function() local cid = getCreatureMaster(self.it) local position = self:position() doRemoveCreature(self.it) local pet = doCreateMonster(self.attributes.evolution, position) if not doConvinceCreature(cid, pet) then doRemoveCreature(pet) call_pet(cid) return end doCreatureSetStorage(cid, PET_UID, pet) setCreatureMaxHealth(pet, self.healthmax) doCreatureAddHealth(pet, getCreatureMaxHealth(pet)) doSendMagicEffect(getCreaturePosition(pet), CONST_ME_MORTAREA) doCreatureSetStorage(cid, PET_SPECIE, self.attributes.evolution) end, 100) end end end end -- make pet cast a spell function Pet:cast(index) local cid = getCreatureMaster(self.it) if not self.attributes.spells[index] then return doPlayerSendCancel(cid, "This spell is unknown.") end local spell = self.attributes.spells[index] if self.level < spell.level then doPlayerSendCancel(cid, "Your pet doesn't have enough level to cast this spell.") return end if self.mana < spell.mana then doPlayerSendCancel(cid, "Your pet doesn't have enough mana to cast this spell.") return end if getCreatureStorage(cid, PET_EXHAUST) > os.clock() then doSendMagicEffect(self:position(), CONST_ME_POFF) doPlayerSendCancel(cid, "Your pet is exhausted.") return end if spell.target then local target = getCreatureTarget(self.it) if target == 0 then doPlayerSendCancel(cid, "First, select a target.") return end spell.range = spell.range or 1 if getDistanceBetween(self:position(), getCreaturePosition(target)) > spell.range then doPlayerSendCancel(cid, "Too far to cast spell.") return end doSendDistanceShoot(self:position(), getCreaturePosition(target), spell.shooteffect) doTargetCombatHealth(self.it, target, spell.type, -spell.min, -spell.max, spell.effect) else doAreaCombatHealth(self.it, spell.type, self:position(), (spell.area or 0), -min, -max, spell.effect) end self.mana = self.mana - spell.mana doCreatureSetStorage(cid, PET_EXHAUST, os.clock() + (spell.exhaust / 1000)) doCreatureSay(cid, getCreatureName(self.it) ..", use ".. spell.name .."!") self:say(spell.name) end -- set pet uid function Pet:setit(uid) self.it = uid end -- get player pet position function Pet:position() return getCreaturePosition(self.it) end -- move player pet to a direction function Pet:move(direction) local toPosition = getPosByDir(self:position(), direction, 1) if getCreatureStorage(getCreatureMaster(self.it), PET_EXHAUST) > os.clock() then doSendMagicEffect(self:position(), CONST_ME_POFF) doPlayerSendCancel(cid, "Your pet is exhausted.") return end if queryTileAddThing(self.it, toPosition) == RETURNVALUE_NOERROR then doMoveCreature(self.it, direction) doCreatureSetStorage(cid, PET_EXHAUST, os.clock() + 0.5) doCreatureSay(cid, "Move, ".. getCreatureName(self.it) .."!") end end -- save player pet attributes function Pet:save() local cid = getCreatureMaster(self.it) doCreatureSetStorage(cid, PET_UID, self.it) doCreatureSetStorage(cid, PET_SPECIE, getCreatureName(self.it)) doCreatureSetStorage(cid, PET_LEVEL, self.level) doCreatureSetStorage(cid, PET_EXPERIENCE, self.experience) doCreatureSetStorage(cid, PET_HEALTH, self.health) doCreatureSetStorage(cid, PET_HEALTHMAX, self.healthmax) doCreatureSetStorage(cid, PET_MANA, self.mana) doCreatureSetStorage(cid, PET_MANAMAX, self.manamax) end -- get player pet and return instance function get_pet(cid) local uid, it = getCreatureStorage(cid, PET_UID) for _, pet in ipairs(getCreatureSummons(cid)) do if pet == uid then it = pet break end end if not it then return false end local this_pet = { it = it, attributes = Pets[getCreatureName(it):lower()], level = getCreatureStorage(cid, PET_LEVEL), experience = getCreatureStorage(cid, PET_EXPERIENCE), health = getCreatureHealth(it), healthmax = getCreatureMaxHealth(it), mana = getCreatureStorage(cid, PET_MANA), manamax = getCreatureStorage(cid, PET_MANAMAX), } return setmetatable(this_pet, {__index = Pet}) end -- summon a existing player pet function call_pet(cid) if get_pet(cid) then return doPlayerSendCancel(cid, "You cannot summon your pet more than one time.") end if getCreatureStorage(cid, PET_SPECIE) == -1 then return doPlayerSendCancel(cid, "You don't have a pet.") end if getCreatureStorage(cid, PET_ALIVE) == 0 then return doPlayerSendCancel(cid, "You need to revive your pet") end local pet = doCreateMonster(getCreatureStorage(cid, PET_SPECIE), getCreaturePosition(cid)) if not pet then return false end if not doConvinceCreature(cid, pet) then doRemoveCreature(pet) return false end local health, healthmax = getCreatureStorage(cid, PET_HEALTH), getCreatureStorage(cid, PET_HEALTHMAX) setCreatureMaxHealth(pet, healthmax) doCreatureAddHealth(pet, healthmax) doCreatureAddHealth(pet, (health - healthmax)) doCreatureSay(cid, "Go, ".. getCreatureName(pet) .."!") doSendMagicEffect(getCreaturePosition(pet), CONST_ME_MAGIC_GREEN) doCreatureSetStorage(cid, PET_UID, pet) return true end -- is pet function is_pet(cid) return getCreatureMaster(cid) == 0 and false or isPlayer(getCreatureMaster(cid)) end dofile(getDataDir() .."/lib/pet-spells.lua") Pet_Rat = PetSpecie:new("Rat", 20, 0, 5, 5, {[1] = Rock_Throw, [2] = Dark_Bite}, "Cave Rat", 14) Pet_Cave_Rat = PetSpecie:new("Cave Rat", 40, 20, 10, 10, {[1] = Dark_Bite}, "Munster", 32) Pet_Munster = PetSpecie:new("Munster", 100, 50, 20, 20, {[1] = Dark_Bite}, false, false) 2. Crie um arquivo em data/lib com o nome pet-spells.lua e cole o código abaixo: -- This script is part of Pet System -- Copyright (C) 2013 Oneshot -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see <http://www.gnu.org/licenses/>. dofile("data/spells/lib/spells.lua") Dark_Bite = { name = "Dark Bite", level = 1, mana = 100, type = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_BLOCKHIT, shooteffect = CONST_ANI_SMALLSTONE, target = true, range = 1, min = 300, max = 500, area = 0, exhaust = 1000, } Rock_Throw = { name = "Rock Throw", level = 1, mana = 10, type = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_BLOCKHIT, shooteffect = CONST_ANI_NONE, target = true, range = 1, min = 20, max = 25, area = 0, exhaust = 1000, } 3. Crie um arquivo em data/talkactions/scripts, chamado pet-talkactions.lua e cole o conteúdo abaixo: -- This script is part of Pet System -- Copyright (C) 2013 Oneshot -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see <http://www.gnu.org/licenses/>. function onSay(cid, words, param, channel) param = string.explode(param, ":") if param[1]:lower() == "go" then if getTilePzInfo(getCreaturePosition(cid)) then return doPlayerSendCancel(cid, "You cannot call your pet at protection zone.") end local pet = get_pet(cid) if pet then return doPlayerSendCancel(cid, "You cannot call your pet two times.") end call_pet(cid) return true elseif param[1]:lower() == "back" then local pet = get_pet(cid) if not pet then return doPlayerSendCancel(cid, "Please call your pet first.") end pet:back() return true elseif param[1]:lower() == "release" then local pet = get_pet(cid) if not pet then return doPlayerSendCancel(cid, "Please call your pet first.") end pet:release() return true elseif param[1]:lower() == "cast" then local pet = get_pet(cid) if not pet then return doPlayerSendCancel(cid, "Please call your pet first.") end local index = tonumber(param[2]) or 1 pet:cast(index) return true elseif param[1]:lower() == "say" then local pet = get_pet(cid) if not pet then return doPlayerSendCancel(cid, "Please call your pet first.") end pet:say(param[2]) return true elseif param[1]:lower() == "move" then local pet = get_pet(cid) if not pet then return doPlayerSendCancel(cid, "Please call your pet first.") end if not isInArray({"north", "south", "east", "west"}, param[2]:lower()) then return doPlayerSendCancel(cid, "Invalid direction.") end pet:move((_G[param[2]:upper()] or NORTH)) return true elseif param[1]:lower() == "addexp" then local pet = get_pet(cid) if not pet then return doPlayerSendCancel(cid, "Please call your pet first.") end if getPlayerGroupId(cid) < 3 then return doPlayerSendCancel(cid, "You cannot use this command.") end pet:addexperience(tonumber(param[2]) or 0) return true end return true end 4. No talkactions.xml <talkaction words="/pet" event="script" value="pet-talkactions.lua"/> 5. Crie um arquivo em data/creaturescripts/scripts com o nome pet-creaturescripts.lua e adicione o conteúdo abaixo: -- This script is part of Pet System -- Copyright (C) 2013 Oneshot -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see <http://www.gnu.org/licenses/>. function onKill(cid, target, lastHit) local pet = get_pet(cid) if not isMonster(target) or getMonsterInfo(getCreatureName(target)) and getMonsterInfo(getCreatureName(target)).experience == 0 then return true end if not pet then return true end pet:addexperience(getMonsterInfo(getCreatureName(target)).experience) return true end function onDeath(cid, corpse, deathList) if not is_pet(cid) then return true end local master = getCreatureMaster(cid) doPlayerSendTextMessage(master, MESSAGE_EVENT_ADVANCE, "Your pet is dead.") doCreatureSetStorage(master, PET_ALIVE, 0) doCreatureSetStorage(master, PET_HEALTH, getCreatureMaxHealth(cid)) return true end 6. No arquivo login.lua de data/creaturescripts/scripts, adicione: registerCreatureEvent(cid, "PetKill") 7. No arquivo creaturescripts.xml, adicione: <event type="kill" name="PetKill" event="script" value="pet-creaturescripts.lua"/> <event type="death" name="PetDeath" event="script" value="pet-creaturescripts.lua"/> 8. Em cada arquivo XML de cada monstro que servirá como pet, adicione: <script> <event name="PetDeath"/> </script> 9. Mude o flag convinceable de cada monstro que será um tipo de pet. <flag convinceable="1"/> 10. Crie um arquivo chamado pet trainer.lua em data/npc/scripts, adicione: local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} local petState = {} 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 local PetPrices = { ["rat"] = {1000, 200}, } function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_PRIVATE and 0 or cid if msgcontains(msg, "sell") then local say = "I can offer you these pet species: " for pet_name, k in pairs(PetPrices) do local first = true if Pets[pet_name] then say = say .. (first == true and "" or ", ") .."{".. pet_name .. "}" first = false end end selfSay(say, cid) talkState[talkUser] = 1 elseif msgcontains(msg, "revive") then if getCreatureStorage(cid, PET_SPECIE) == -1 then selfSay("You don't have a pet", cid) return true end if getCreatureStorage(cid, PET_ALIVE) == 0 then if doPlayerRemoveMoney(cid, PetPrices[getCreatureStorage(cid, PET_SPECIE):lower()][2]) then selfSay("Your pet is now alive.", cid) doCreatureSetStorage(cid, PET_ALIVE, 1) else selfSay("Sorry, you need ".. PetPrices[getCreatureStorage(cid, PET_SPECIE)][2] .." gold.", cid) end else selfSay("Sorry, your pet is alive.", cid) end elseif talkState[talkUser] == 1 then if PetPrices[msg] then selfSay("A good choice, so do you want to buy a ".. msg .." pet? It will cost ".. PetPrices[msg][1] .." gold.", cid) talkState[talkUser] = 2 petState[talkUser] = msg else selfSay("Sorry, I don't know this pet specie", cid) end elseif talkState[talkUser] == 2 then if msgcontains(msg, "yes") then if get_pet(cid) or getCreatureStorage(cid, PET_SPECIE) ~= -1 then selfSay("Sorry, you already have a pet.", cid) return true end local pet = petState[talkUser] if getPlayerMoney(cid) < PetPrices[pet][1] then selfSay("Sorry, you don't have enough money", cid) return true end selfSay("This is your new pet, take care of it.", cid) Pets[pet]:create():hatch(cid) elseif msgcontains(msg, "no") then selfSay("Then not.", cid) talkState[talkUser] = 0 end end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) 11. Crie um arquivo chamado Pet Trainer.xml em data/npc, adicione: <?xml version="1.0" encoding="UTF-8"?> <npc name="Pet Trainer" script="pet trainer.lua" walkinterval="0" floorchange="0"> <health now="100" max="100"/> <look type="128" head="17" body="54" legs="114" feet="0" addons="2"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|, I {sell} and {revive} pets."/> </parameters> </npc> Configuração O Pet System OOP é todo orientado a objetos. Para criar novas raças de pet é muito, mas muito simples mesmo. Basta uma linha: PetSpecie:new("Rat", 20, 0, 5, 5, {[1] = Rock_Throw, [2] = Dark_Bite}, "Cave Rat", 14) Como segue o modelo abaixo: PetSpecie:new(NOME_DO_MONSTRO, HP_INICIAL, MP_INICIAL, HP_POR_LEVEL, MP_POR_LEVEL, {[1] = MAGIA_1, [2] = MAGIA_2, [3] = MAGIA_3, ...}, NOME_DA_EVOLUÇÃO, LEVEL_DA_EVOLUÇÃO) Caso você não queira que o pet evolua, coloque os dois parâmetros como false. E para criar novas magias, é só seguir o mesmo modelo das duas magias padrão dentro de pet-spells.lua. Demonstração Este sistema está no Github sob a licença Gnu GPL v3. Você pode baixar os scripts aqui. Abraços.6 pontos -
Saudações XTibianos! Hoje estou trazendo mais uma entrevista, dessa vez com nosso ilustríssimo Oneshot! Na entrevista de hoje, vocês acompanharão um pouco sobre ele, e as possíveis e futuras mudanças com a sua chegada a coordenação! Preparem a pipoca, e boa leitura! Faaaala Oneshot! É um prazer estar entrevistando você hoje =p Para começarmos, que tal nos dizer qual seu nome e sua idade? - Meu nome é Bruno Lopes, 19 anos. Como você conheceu o XTibia? - Eu estava na minha 5ª série, Tibia no auge da versão 7.6, um colega de classe criou então o primeiro "servidor pirata" (era como nós chamávamos na época) de Tibia que eu vi na vida. Na época, eu era bem pirralhinho, então vivia pedindo para ele me colocar de GM em troca de lições-de-casa (yeah, rly). Até que um dia eu me irritei e fui pesquisar no Google - Com vários resultados, encontrei o XTibia no meio deles. Como, e o que te levou a conhecer/jogar o game Tibia? - Para falar a verdade mesmo, eu nunca joguei Tibia a fundo. Joguei durante a versão 7.6, e nunca cheguei ao level 8 para sair de Rookgaard. O que te levou a procurar o aprendizado pela programação? Você já participou de outras áreas do fórum além desta? - Bom, quando eu resolvi fuçar realmente com OTServ, criar meu próprio servidor, já estávamos na versão 7.92. O que eu só fazia, era ser um simples OT-Admin, eu só entrava nos fóruns para baixar magias, monstros e actions. Só que eu era um pouco orgulhoso, me recusava a criar tópicos pedindo algo. Então, por exemplo, a primeira magia que eu baixei foi aquela famosa Ultimate Explosion com o efeito de sudden death que quase existe em todos servidores, eu fuçava em tudo tentando entender como funcionava. O primeiro sistema que fui fuçar foi um do tal do Colex, um sistema de sorvete. Até então eu não sabia programar, me davam crises de querer aprender, ia na internet ler os tutoriais e não entendia nada, aquilo parecia uma mistura de russo e mandarim para mim. O tempo (muito tempo) foi passando, eu migrei de Open Tibia para RPG Maker e quando voltei para Open Tibia, notei que eu tinha desenvolvido uma estranha facilidade de me adaptar e aprender as linguagens de programação e foi quase como mágica com a linguagem Lua. Todos te conheciam como o "eterno colaborador", e agora, como é ter o tão almejado cargo de coordenador? Você sente que fez um bom trabalho até agora? - Nah, as pessoas que não me conhecem, me chamam mais de "bipolar", por eu ter entrado inúmeras vezes como Colaborador e ter saído da equipe todas elas. Para ter ideia, na minha primeira entrada como Colab., este era um cargo sem acesso nenhum, funcionava mais como um título para aqueles que contribuíam bastante com o fórum. Hoje, sim, Colaborador virou um cargo que tem papel de sub-moderação no Éks, com acessos moderativos e tudo mais. Assumo, "Eterno Colaborador", eu roubei do grande Won Helder, o "Eterno Coordenador/Diretor". E, sim, eu sempre almejei o cargo de coordenação e agradeço muito a oportunidade que o Ranieri Lorde do Fogo está me dando e se ele reconheceu meu trabalho, acho que estou fazendo algo de bom para o Éks Agora como coordenador de programação e scripting, quais são seus projetos e/ou planejamentos para ambas as seções? Novos concursos, novos tipos de tutoriais... o que vem por aí? - A seção de programação não tem movimento, uma vez que C++, a linguagem da programação nas sources, é bem mais complicada que Lua. Nem a área de Pedidos é frequentada, uma vez que os OT-admins, não sabem discernir entre scripting e programação. Pode notar que muitas das vezes, eles criam tópicos de pedidos em Scripting que só podem ser realizados com edições nas sources. Acho que a seção só iria ser movimentada, se Poketibia fosse open source, aí iam chover pedidos lá dentro. Meu plano para a área é tentar semear interesse nela, e caso isso não funcione, recorrer a fusão da área de Programação como uma sub-seção de Scripting, como ela existe em todos os fóruns gringos. Para a área de Scripting, planejo organizar ela, criar novas regras de postagem, "limpar a sujeira" e, com isso, dar início aos planos principais. Dois novos concursos irão ser iniciados, um de caráter semanal de avaliação, o "X-Script of the Week" e um de caráter "arena" ao estilo do "Quem ganha, fica". E também o projeto "Escola de Scripting" que foi iniciado por um ex-colaborador também irá voltar, dessa vez definitivo, mais organizado e com 100% de chances de dar certo. Com ele, irei transformar OT-admins em scripters iniciantes, e quem sabe, esses scripters iniciantes comecem a colaborar com o fórum em busca de aprender mais e mais. Essa é uma pergunta que sempre costumo fazer. Qual a sua visão sobre o atual XTibia? O que você acha da atual equipe, e da organização em si? - O Open Tibia tem sofrido uma queda no público interessado e todos os fóruns voltados para isso, sofrem com isso. O XTibia, hoje, é o maior fórum brasileiro de Open Tibia, com mais usuários e maior conteúdo - isso - porque lá, no início, ele foi criado como um fórum de suporte e não uma porcaria para dar lucro, como um outro fórum aí que já está falindo. Acho que a equipe do XTibia atual é uma das melhores, com algumas exceções. Acredito que o certo é contratar pessoas para equipe que sejam maduras, não briguem por qualquer "coisinha" e, por favor, saibam o bom português, pelo menos o do ensino fundamental. A organização do fórum, bom, eu não posso dizer muito sobre as outras áreas, pois não as frequento o bastante para ter uma opinião. Mas sobre a área de Scripting, ela está caótica, existe um abismo entre pedidos de scripts e entrada de conteúdo na seção, o que resulta naquela seção monstra de 10 páginas de pedidos. Fora que os usuários hoje em dia, não querem nem mais pesquisar o fórum pelo que eles querem, ou seja, a maioria do que tem na seção de pedidos, tem no fórum. Mas estou planejando tudo como disse acima, para que isso não aconteça mais. No momento, há algo que é preciso melhorar dentro da comunidade? O que seria isso, e como melhorar? - Como disse acima, acho que é necessário ensinar os novos usuários de alguma forma sobre postagens em seções incorretas, pedidos repetidos e etcétera. Também acho que com a entrada de 2013, nosso velho e bom XTibia poderia ganhar um remake, com um novo portal, um novo banner, uma nova skin, uma reorganização das seções no geral, acho que isso é necessário para agradar e atrair os usuários. Do seu ponto de vista, qual a seção mais "famosa" e mais promissora aqui no XTibia? - Acho que as seções de Mapping e Design são as mais famosas, com muitos usuários colaborando, e transbordando interesse em aprender. Mas eu não vou perder para os coordenadores delas, né, Tony? Então logo Scripting estará mais uma vez no auge. Baseada na pergunta anterior, qual a seção que atualmente, precisa de mais atenção da parte da equipe e da comunidade em si? Porque? E há algo que você possa dizer para melhorá-la? - Acho que a seção de Spriting está mais abandonada até que a seção de Programação, ela não tem coordenador, ou pelo menos, acho que ele faz por não existir. Então acho que a equipe precisa tomar uma decisão quanto a ela, existem, sim, usuários querendo colaborador com conteúdo, como a grande quantidade de tutoriais em avaliação, mas não existe ninguém para incentivar esses usuários. Existe algum projeto ativo que lhe chame mais a atenção? (Organização, elaboração, criatividade, etc.) - Existem dois, na verdade, um é o DigiWo que parece estar ficando muito bom e porque eu já gostei bastante de Digimon. E o outro é o Bulls Yurots, um remake incrível do Yurots na versão atual do Tibia, que acho bastante promissor com o Anyur de mapper. A equipe é composta por vários membros. Para você, destes membros há algum principal destaque? - Nossa, são muitos. Lá vai a lista. Lordfire - Esse é um ótimo administrador, ele ganhou minha confiança depois de mostrar que realmente se importa e gosta do fórum. Tonynh - O cara entra de coordenador e, como mágica, traz a seção de Design dos mortos. É uma grande inspiração para mim, quero fazer isso também com a seção de Scripting. Anyur - Bom, depois de começar como moderador, ser promovido a coordenador, ter um monte de gente brigando com ele e querendo derrubar ele, o cara conquistou seu lugar como Diretor e foi merecido. Não tive muita oportunidade de conhecer ele melhor, mas acho que ele deve ser nota 10. Qual o membro da comunidade que você mais se identifica aqui no fórum? (Pode ser da equipe ou não.) - É o meu pupilo LuckOake. Eu vejo nele minha vontade de aprender Lua quando eu era iniciante. Acho que foi por isso mesmo que decidi tentar ensinar tudo que sei para ele. Para finalizarmos, você tem algo para dizer para os usuários que lerão esta entrevista? =p Obrigado a todos que vão ler essa entrevista gigante e aguardem a "Era de Ouro" do Scripting, haha. FIM DA ENTREVISTA Obrigado ao Oneshot por ceder um pouco de seu tempo para dar essa entrevista! Ótimas respostas! E é isso, espero que todos vocês tenham gostado da entrevista com esse cara incrível! =p MIAU É ISSO AÍ!3 pontos
-
Não é um tema tão fácil auhauha Difícil encontrar boas stocks, mas tentei fazer algo legal. Espero que goste =)3 pontos
-
[Encerrado] Dat Editor Para Tibia 8.54
Tonynh e um outro reagiu a danilinho79 por um tópico no fórum
Você precisa ir em open e selecionar os arquivos, aí do lado da barrinha que tá escrito open, vc poe 780 Dá um rep pra mim por favor?2 pontos -
Como Usar Background Eraser Tool
Gabriel Couto e um outro reagiu a Smucck por um tópico no fórum
Conteúdo removido.2 pontos -
Conheça um pouco mais sobre as ferramentas do Photoshop!
Alexclusive e um outro reagiu a Smucck por um tópico no fórum
Eu busquei no Google e em sites voltados à Design/Gráficos, as ferramentas do Photoshop e suas funções para apresentá-las aos que ainda não conhecem os recursos que o Photoshop libera! Ferramentas Photoshop: Com certeza deverá existir algum tópico relacionado à isso, mas quis resumir o que cada uma das ferramentas faz, para aprenderem cada vez mais sobre os recursos do PS. Créditos: Sites relacionado à Design/Gráficos Smucck2 pontos -
Letras com Efeito de neon + Site com milhares de tutoriais
Gabriel Couto e um outro reagiu a masdead por um tópico no fórum
01. Pressione Ctrl+N para criar um novo documento, defina o tamanho em 600x350 pixels, 72 dpi´s e modo de cor em RGB, pressione Ok, pressione a letra D do teclado para resetar as cores de Foreground e Background para preto e branco, pressione Alt+Backspace (a tecla acima do Enter) ou pressione a letra G do teclado para selecionar a Paint Bucket Tool e clique no documento para preencher a layer com a cor escolhida, pressione a letra X do teclado para alternar as cores de Foreground e Background, sua cor de Foreground deve ser a branca, pressione a letra T do teclado para selecionar a Horizontal Type Tool e escreva uma palavra qualquer. 02. Vá em Layer> Layer Style> Outer Glow e defina os valores abaixo. 03. Com a tecla Ctrl pressionada clique sobre a miniatura da layer de texto para ativar a seleçao ao redor da palavra, pressione Ctrl+Shift+Alt+N para criar uma nova layer, vá em Select> Modify> Expand, defina o valor de 10 pixels e pressione Ok, escolha a cor que desejar e pressione Alt+Backspace (a tecla acima do Enter) ou pressione a letra G do teclado para selecionar a Paint bucket Tool e clique dentro da seleção para preencher com a cor escolhida. 04. Mude o modo de blend da layer para Color. 05. No final sua palavra estará como a da foto abaixo. Créditos: Tutoriais Photoshop2 pontos -
Nature - Estilo Venore
FelipeGorreri e um outro reagiu a Nolis por um tópico no fórum
------------------- xTibia - DanielZiyak ------------------- Fala galerinha, finalmente depois de alguns meses voltei a postar no xTibia Nessas férias eu fiquei mais 'leve', tentei voltar a jogar global e vi que mudou muita coisa por lá, algumas (muitas) sprites novas estão ruins na minha opinião e meio 'gays', mas isso não interessa... Tava observando o mapa do global, vi alguns bugs pequenos mas nem reportei, e ja que estou a muito tempo fora resolvi voltar aqui pra contribuir com meu minimo conhecimento O Tema que eu escolhe é Nature (swamp, ponte, venore) eu tentei seguir um pouco o estilo do global pra mostrar a vocês, mas fiz várias modificações, principalmente nas bordas. Vamos lá. ------------------ Área ------------------ Como todo mapa que eu faço, primeiramente eu penso no tema, nos detalhes e na criatividade, mas a primeira coisa que se deve fazer é delimitar a área em qe vamos trabalhar, nesse caso usei 23x23, e, ja es seguida, adicionei as bordas básicas e necessárias no meu estilo, deve-se tomar cuidado para não errar a borda, ficar muito quadrada ou muito editada. Não utilizei Auto-Border, verão a seguir que não é preciso tantos detalhes para se trabalhar nesse estilo, é muito simples e rápido. Veja o Começo: ------------------ Swamp - Bordas ------------------ Swamp é muito simples de trabalhar, como podem ver o jeito é distribuir bem cada uma, se rocurar no raw, verá que tem dois tipos dessa borda usada, eu usei a primeira mas creio que não tenha tanta diferença, nem sei qual delas está no global. ------------------ Bordas - Detalhamento ------------------ É muito útil usar os recursos da borda da grass, ela tem dois tipos de borda, a grossa e a fina, porém é facil de fazer um grande bug, tem que tomar cuidado pra nao errar, pode adicionar na swamp esses detalhes mas é perigoso ficar feio se exagerar, esse estilo eu nao vi ser usado no global, em venore, mas eu adicionei por que é do meu gosto, outro detalhe é o outro tipo de borda em baixo da grass, o 'dirt', eu coloquei pouco, mesmo assim achei que ficou muito, mas da pra arriscar ------------------ Detalhamento geral ------------------ Agora vem o 'bixo' Haha, não é tao dificil, percebam que usei mais grass tufts grandes do qe pequeno, coloquei vitoria régia no swamp, poucas árvores seguidas por arbustos e apenas algumas pedrinhas quase não notáveis no caminho, grande parte disso, que muitos não fazem, pertence a grandes mapas no mundo real =) Eu também não quis exagerar nas swamp plants, axei agradavel com poucas e também os tall jungle grass. A minha ponte vai ficar pequena, por erro meu, mas axo que não faz mal vou adaptar o terreno rsrs ------------------ Finalização ------------------ Pra finalizar adicionei umas pedrinhas amais na ponte, não editei muito, ficou bem básico como no global, mas me emputei um pouco com o formato da ponte, não tem problema, se você for fazer pode criá-la do seu jeito. (não delimitei bem a área, viu como é importante, rsrs) Em alguams partes do mapa, poucas, tem algumas plantas, mossy stones e eu puis duas placas, opcional ^^ ------------------ The End ------------------ Bom, alguns mappers vão me criticar ou pensar em criticar sobre a minha ponte rsrsrs, pois a wall pequena de baixo \/ parece estar bugada não? eu não quis mudar pois não considerei um bug muito grave, mas isso é de usa preferencia, também coloquei uma borda de montanha do lado de baixo da ponte, o que não sei se é muito correto, faltou uma flowery wall nessa pedra mas não faz mal; É isso ai, meio que um show-off tutorialzinho básico so pra avisar que voltei, espero que tenham curtido, confiram abaixo a ponte em que me inspirei. Danielziyak2 pontos -
[Pokemon] PDA By Slicer Pokemon dash advanced editado por slicer, vários bugs retidos. Projeto encerrado! Espero que todos tenham gostado desse 1 ano de trabalho duro! Todas as atualizações: * Leiam e sigam as instruções do Change Log dentro da pasta do patch! Downlaods: PDA By Slicer With Level System v2.9 Full -> http://www.mediafire...z2afuu75zblvmvq PDA By Slicer Without Level System v1.9 Full -> http://www.mediafire...td0l0ip9ajprrbf OTClient editado 2.8/1.8 => http://www.mediafire...1lcbs1fktpm676w Atualizações: EH OBRIGATORIO O USO DESSE CLIENT ABAIXO E USEM O .PIC TB!!!!!!!!! Client v1.9/2.9 => http://www.mediafire...77i414v1hy187fj Patch v1.9 => http://www.mediafire...da4umj3ip18jrf1 Patch v2.9 => http://www.mediafire...7nt275td9afl1fy Patch v1.9.1 => http://www.mediafire.com/?i3flwa3lrd016zl Patch v2.9.1 => http://www.mediafire.com/?m4zhjgn62uow1sp Obs: Atualizaçoes mais antigas estao dentro do spoiler acima!! OTAL.DLL: OBS: caso n esteja aparecendo a barra de moves no client normal do tibia, baixem essa .dll e coloquem na pasta onde fica o Pokemon_nibe.exe ... Otal.rar Patch Correçao! Todos olhem! Bugs na nova atualizaçao? Olhe o spoiler e veja se arruma o problema! Atualizado: 08/02/13 Créditos: Otal.rar1 ponto
-
O conteúdo de uma página HTML é feita de textos e referências (o que é chamado de hipertexto) marcados por tags (etiquetas). As etiquetas são o que fazem o HTML ser mais do que apenas texto corrido. Uma tag tem a seguinte estrutura: <abre tag>conteúdo</fecha tag> Isso é um elemento, o conjunto inteiro desde a abertura de uma tag até o seu fechamento. Repare que a abertura de uma tag e o fechamento são iguais, exceto que o fechamento tem uma barra antes. Geralmente não há diferença na caixa, ou seja, pode se escrever <TAG>, <tag> e <Tag> para obter o mesmo resultado, mas a recomendação oficial é de se usar apenas letras minúsculas, e esse será o padrão deste curso. Alguns exemplos de elementos estão a seguir: <p>Isto é um parágrafo</p> <a href="ajuda.php">Link para a página ajuda</a> <br> Também é possível colocar um elemento dentro de outro, mas lembre-se de fechar na ordem! <p><a href="http://xtibia.com">Clique aqui</a> para acessar o XTibia.</p> Cabeçalhos O HTML dispõe de uma série de cabeçalhos para organizar o texto. Eles vão desde o <h1> até o <h6>, quanto menor o número, maior a importância. Veja um exemplo de como utilizar os cabeçalhos: <h1>Como criar um OTserv</h1><h2>Fazendo o download</h2>Acesse o site www.xtibia.com e procure a seção de downloads. Baixe um servidor e extraia.<h2>Configurando o servidor</h2><h3>Arquivo config</h3>No arquivo config ficam as configurações principais do servidor. Veja algumas delas:<h4>Mudando o IP</h4>Para mudar seu IP altere a configuração "ip" para seu IP disponível em www.meuip.com.br<h4>Mudando as rates</h4>Para mudar as rates altere os seguintes valores:<h5>expRate</h5>O expRate altera o multiplicador de experiência, quantas vezes mais de exp as criaturas dão.<h6>Stages</h6>Os stages também podem alterar o multiplicador de experiência para certos levels.<h5>skillRate</h5>O skillRate altera o multiplicador das skills, quantas vezes mais rápido vai subir.<h5>lootRate</h5>O lootRate altera o multiplicador do loot, quantas vezes mais fácil é dropar os loots.<h3>Scripts</h3>Scripts adicionam funções ao seu servidor. Para instalar vá ao XTibia e procure na seção.<h2>Colocando online</h2>Se você configurou corretamente basta abrir o .exe da pasta inicial e seu servidor estará online.Obrigado por ler o tutorial. Este código produz a seguinte página: Atenção: NÃO use cabeçalhos pra fazer o texto ficar maior ou destacado. Ele é feito para ser, exclusivamente, um cabeçalho. Mais a frente estudaremos como enfasar texto e mudar estilo. Quebras de linha Se você foi um bom observador, percebeu que, no exemplo acima, as duas últimas linhas se tornaram uma só. Isso porque o HTML torna múltiplos espaços, quebras de linha e outros como um simples espaço. Para forçar uma quebra de linha, devemos usar o elemento <br />. Esta tag é vazia, ela não tem conteúdo e, por isso, não precisa ser aberta ou fechada, apenas ser escrita. Podemos mudar as frases para o seguinte, então: Se você configurou corretamente basta abrir o .exe da pasta inicial e seu servidor estará online.<br />Obrigado por ler o tutorial. Parágrafos Uma solução alternativa para as quebras de linha é a utilização de parágrafos. Para fazer um parágrafo, use a tag <p> em volta do texto. Mais a frente sempre usaremos parágrafos para textos que não são cabeçalhos, então se acostume a usar textos dentro desta tag: <h1>Como criar um OTserv</h1><h2>Fazendo o download</h2><p>Acesse o site www.xtibia.com e procure a seção de downloads. Baixe um servidor e extraia.</p><h2>Configurando o servidor</h2><h3>Arquivo config</h3><p>No arquivo config ficam as configurações principais do servidor. Veja algumas delas:</p><h4>Mudando o IP</h4><p>Para mudar seu IP altere a configuração "ip" para seu IP disponível em www.meuip.com.br</p><h4>Mudando as rates</h4><p>Para mudar as rates altere os seguintes valores:</p><h5>expRate</h5><p>O expRate altera o multiplicador de experiência, quantas vezes mais de exp as criaturas dão.</p><h6>Stages</h6><p>Os stages também podem alterar o multiplicador de experiência para certos levels.</p><h5>skillRate</h5><p>O skillRate altera o multiplicador das skills, quantas vezes mais rápido vai subir.</p><h5>lootRate</h5><p>O lootRate altera o multiplicador do loot, quantas vezes mais fácil é dropar os loots.</p><h3>Scripts</h3><p>Scripts adicionam funções ao seu servidor. Para instalar vá ao XTibia e procure na seção.</p><h2>Colocando online</h2><p>Se você configurou corretamente basta abrir o .exe da pasta inicial e seu servidor estará online.</p><p>Obrigado por ler o tutorial.</p> Note que tanto usando a quebra de linha quanto colocando em diferentes parágrafos, este será o resultado: Links Links, como você já deve saber, são elementos que levam para outra página. No HTML eles se chamam âncoras, são representadas pela tag <a>, e podem ser usados de 3 formas: Link absoluto Um link absoluto é um link que leva exatamente para uma página. Por exemplo, você está na página www.meusite.com e quer criar um link para www.xtibia.com, então você faz da seguinte forma: <a href="http://xtibia.com">Link para o XTibia</a> Um link absoluto deve começar por um protocolo, seja "http://", "ftp://" ou outros que existem, ou então ele será tratado como link relativo. Link relativo Um link relativo leva para uma página usando o link da atual. Se você quer ir de www.meusite.com para www.meusite.com/pg2.html, pode usar o seguinte elemento: <a href="pg2.html">Link para a página 2</a> O conteúdo do atributo "href" é somado com o caminho até a página atual (excluindo o próprio nome da página), incluindo a barra. Ou seja, www.meusite.com/ + pg2.html. Você também pode usar múltiplas pastas: <a href="plantas/arvores/carvalho.html">Link para a página sobre carvalhos</a> www.meusite.com/ + plantas/arvores/carvalho.html = www.meusite.com/plantas/arvores/carvalho.html Mas nada o impede de usar também links absolutos para ir para uma página dentro do mesmo site: <a href="http://meusite.com/pg2.html">Link para a página 2</a> Isto é exatamente igual ao primeiro exemplo de link relativo. Âncoras As âncoras servem para navegar por uma página. Sabe quando você clica no botão "Ir para o topo" em alguma página e ela sobe, ou então acessa um post específico de um tópico aqui no XTibia e a página vai automaticamente para este post? Isso é feito usando âncoras. Vamos supor que, no nosso exemplo do tutorial de colocar um OTserv online, nós queiramos fazer um botão de "voltar ao topo", então colocamos antes da primeira linha: <a name="topo"> E, na última linha, colocamos este link: <a href="#topo"> Então, ao clicar no link, vamos para o topo da página. Você pode colocar âncoras onde quiser, mas para chamá-las, deve usar o # (jogo da velha, hashtag) na frente. Você também pode misturar as âncoras com os outros tipos de link. Vamos supor que eu queira colocar aqui no XTibia um link para a âncora #expRate em www.meusite.com/criar_ot.html, então eu faço o seguinte link: <a href="http://meusite.com/criar_ot.html#expRate">expRates!</a> Imagens As imagens são representadas pela tag <img>, e o caminho para a imagem funciona igual ao href da tag <a>, mas se chama src. As tags de imagem não são de abrir e fechar, você deve utilizar a tag, colocar os atributos e fechar com o />, como a quebra de linha: <img src="http://i.imgur.com/f1fNwaC.jpg" /> Ou, então, usando links relativos: <img src="foto_minha.png" /> As imagens possuem o atributo alt, que serve para indicar um texto alternativo para mostrar caso a imagem não consiga ser carregada, mas a maioria dos navegadores também mostra esse texto quando você passa o mouse em cima da imagem: <img src="foto_minha.png" alt="Eu na praia de Quixajuba" /> Sua tarefa desta primeira aula é criar uma página simples com suas informações básicas: nome, idade e/ou data de nascimento, localização, um pequeno texto sobre você, e quais mais informações você quiser colocar. Se preferir, não é necessário utilizar informações reais. Utilize pelo menos 2 cabeçalhos diferentes, um link, uma imagem, parágrafos nos textos e quebras de linha quando quiser.1 ponto
-
Área sera movimentada com no minimo 2 Imagem por semana. Obrigado.1 ponto
-
Bem vindos ao Anarchy-Global! Servidor online! ******* CRIE SUA CONTA ******* Dados de Conexão: SITE: www.anarchy-global.com IP: www.anarchy-global.com Versão: 9.80 / 9.81 Cliente Fixo para download em nosso site Features: - Seu attackspeed aumenta de acordo com seu fist! - CONTAMOS COM NEW VENORE! - Mounts e Outfits 9.80 (Com Mounts Custom) - Quirefang and Gray Island - Mounts free. (Taming global. REAL) - Guild Wars Customizado (Confira a página após criar a war) - Parcel System 100% - Mounts 100% Global - Mapa Global Full & Custom (CONTAMOS COM NEW VENORE) - Updates constantes para melhor diversão - Bank System - Quests Global 100% - Site com recursos únicos e inéditos - Market system 100% - Munição de Pally infinita - Potions Infinitas - System Aluguel de Mounts 100% - TASK System 100% - GnomeBase e Warzone 1 2 3 - 9 Cidades VIP Eventos: - Fire Storm - War Of Emperium - Rush Event - Capture The Flag - Battlefield Event Entre outros eventos Rates: XP: 500x (Stagiadas) Skills: 100.0 Magic: 45.0 Loot: 8.0 @Update Servidor online novamente. Para maiores informações, vejam em nosso site. @Update Servidor resetado, test server finalizado. * Corrigido debug no BlueLegs Quest * Adicionado bot-ingame * Adicionado Upgrade System * Monsters não droparão pure energy * Adicionado Sistema de Login-Save * Sistema de spellUP * Premios dos eventos ajustados * Melhoria no ataque após logar-se * Exausted de Knights diminuido * Ajustado NPC que troca items por mount stampor1 ponto
-
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"/>1 ponto
-
[RME] Função Replace Item
Gabriel Couto reagiu a Nolis por um tópico no fórum
REPLACE ITEM Download do RME: (por Left4Dead) Link Oficial: http://t.co/SKJVTj5C Função: Troca item X que está no mapa, por item Y que você escolher. •1 Abra seu RME, a versão não interfere, a não ser que queira um item de outra versão avançada. •2 Coloque vários gold coins no mapa, pode ser outro item, mas eu estou mostrando pelo gold coin. •3 Vá em edit -> replace item •4 Em replace this item coloquei o id do gold coin. •5 Em with this item, coloque o id do item que quer adicionar, no meu caso, crystal coin. •6 Clique em replace e pronto, todos os itens com o id do gold coin no mapa serão trocados pelo id do crystal coin. é o que sei, espero ter ajudado pode-se trocar vários itens colocados em grandes quantidades no mapa pelo que sei.1 ponto -
[Tutorial] Sign Clean bleach
Gabriel Couto reagiu a Overpower por um tópico no fórum
Galera eu vi esse tutorial que o Mazeko fez gostei pakas mesmo u.U CASO NAO ABRA A IMAGEM -> http://fc07.deviantart.net/fs70/f/2010/345/b/1/tutorial_sign_ichigo_bleach_by_mazeko-d34p43y.jpg Créditos : Mazeko1 ponto -
1 ponto
-
Gift to Anyur - Captain América
Gabriel Couto reagiu a Tonynh por um tópico no fórum
Tava ensinando uns macetes ao Anyur, e o resultado foi essa sign =p http://i.imgur.com/Sl1dght.png Fica ai o presente xD Anyur GOSTOSO!1 ponto -
[Encerrado] Como balancear pokemons selvagens (pokemon PDA V1.8_f)
xandeloko reagiu a StyloMaldoso por um tópico no fórum
lib/configuration.lua tabela flys... ["Moltres"] = {229, 2300} 229 = id da outfit em fly - 351, 2300 = era pra ser a velo do poke, mas ignore isso.. @creditos slicer.. tava com preguiça de ajeita kk1 ponto -
Seu último mapa - your last map
Etorodriigues reagiu a vital900 por um tópico no fórum
Bom, teve algumas 'falhas' de fácil concerto! Treine, veja tutoriais que você pode melhorar muito! Dica, nunca é bom se usar TP em um templo, tira o 'ar de um templo'.1 ponto -
Seu último mapa - your last map
vital900 reagiu a Etorodriigues por um tópico no fórum
Eu não sei mecher muito no forum do xtibia para postar imagens ... mais ta ai um templo feinho1 ponto -
http://www.xtibia.com/forum/topic/49854-como-abrir-2-servers-no-mesmo-servidor/1 ponto
-
Na boa o trabalho dos cara ta otimo, ae em um cara nao vou citar nomes (Eratsu) e fala que esta de nivel bem iniciante ? pra mim isso é inveja tu sabe que nao consegue e fica falando isso pra desmoraliza os cara, entao se tu vem aki fala que o trabalho deles ta de nivel baixo mostra um trabalho teu com nivel superior aos deles Enquanto ao projeto de vcs ta muito bom mesmo cara, espero que vcs finalizem o projeto e coloquem on para nos todos vermos o resultado final, boa sorte!!1 ponto
-
TibiaSpace lança um novo concurso
Gabriel Couto reagiu a FelipeGorreri por um tópico no fórum
Vocês conhecem bem o Tibia? Hoje o TibiaSpace.com iniciou um concurso de enigma. Os detalhes estão disponíveis em Inglês e Português no site. Se você acha que consegue nomear alguns NPCs ou monstros com apenas algumas dicas participe! Fonte: Tibia1 ponto -
alguem me ensina
rohfagundes reagiu a Slicer por uma questão
ata.. intendi errado.. usa assim entao..1 ponto -
psé tem gente que é o melhor do mundo e tem que fazer criticas orriveis a todos os trabalhos até os melhores ai está meu mapa, so pra brincar e contribuir, tem bastante bug, tentando conviver com os novos itens1 ponto
-
Logo/Animação Poke!
Heinekennn reagiu a WH47 por uma questão
Assim que vc queria? Tamanho e tal... Mal, não tinha visto que já tinha resolvido... Vou fechar!1 ponto -
Seu último mapa - your last map
Gabriel Couto reagiu a Kausen por um tópico no fórum
Esse tipo de critica ninguém precisa. Critica são aquelas que mostram os pontos negativos assim por fim ajudando a melhorar o mapa. Agora o Cara fala que o mapa ficou Horrível por causa de uma Stone? já reparou que tem mias de 1 stone no mapa? Trágico. Aund@ Ficou simples porém agradavel.1 ponto -
1 ponto
-
Seu último mapa - your last map
Tonynh reagiu a Gabriel Couto por um tópico no fórum
Faço das palavras do Tonynh, larga de ser flammer um pouco. Suspenso, por esse e mais comentários de flammer.1 ponto -
Error no script de Upgrade
tonynamoral reagiu a Slicer por uma questão
na real n faz muito sentido ja tem essas funcoes ae no script do mock... tira o arquivo q eu mandei tu por.. tenta trocar esse teu upgrade ae por esse aki..1 ponto -
Spriting feita para um Ot de Resident.... espero que gostem...1 ponto
-
Uma huntizinha bem simples:1 ponto
-
tenta usar esse aki como base..1 ponto
-
[8.60] Baiak Jungle Com Donate
Karolaynerox reagiu a guitar123 por um tópico no fórum
Muito bom, baixei e recomendo!1 ponto -
Aula 1 - Tags? Cabeçalhos, parágrafos, links e imagens!
JDetonados reagiu a Bernardo por um tópico no fórum
1. As tags <hX> representam cabeçalhos, e portanto são destacadas automáticamente. Que não quiser que elas estejam em negrito, pode usar CSS: <h1 style="font-weight:300">Oi</h1> Font-weight:300 representa uma letra considerada "normal" na tipografia. __________________________________________________________________________________________ 2. A nomenclatura comum é "<abc> </abc>", mas a tag <br> não tem conteúdo, ou seja, ela não possui nada dentro. Portanto, você pode fechá-la de uma vez só, assim: Oi oi oi oi oi <br /> Oi oi oi oi oi Dessa forma, o código vai ter duas linhas. __________________________________________________________________________________________ 3. Essa ordem deve ser respeitada simplesmente por ORGANIZAÇÃO do seu código. Os dois códigos abaixo fazem a mesma coisa, mas o primeiro código abre e fecha as tags na mesma ordem. Você pode acabar esquecendo de fechar alguma tag... <a href="x.html"><h1><b>Código organizado</b></h1></a> <b><a href="x.html"><h1>Código desorganizado</b></h1></a> __________________________________________________________________________________________ 4. Isso é fácil, mas ainda vão explicar. Mas é mais ou menos assim: <a href="link.html" target="_blank">Âncora</a> A propriedade target indica onde o navegador vai abrir esse link. __________________________________________________________________________________________ 5. Acho que só por javascript... Depois tu vê isso, mas não é muito difícil não. __________________________________________________________________________________________ 6. <p> dá um espaçamento de parágrafo. Representa uma linha a mais, sim. O espaço do <p> representa o uso de dois <br />1 ponto -
@lucashgas Spoilers funcionando, talvez seja o navegador Update 22/01/2013 > Donos do Honor Castle agora possuem acesso a hunts com monstros que dao 25% mais xp Update 22/01/2013 - 22:56 > Consertados alguns tiles do Abismo Subterrâneo > Consertada escada da Exp Potion Quest em Azeroth Update 23/01/2013 - 05:12 > Escada do porto de Azeroth consertada > Adicionada mais uma quest > Pequenas correções no mapas > Corrigidos alguns bugs de borda e mapping (thx to DiogoM e Vingador)1 ponto
-
[Encerrado] [AJUDA URGENTE]Criador de magias não esta funfando em poketibia :S
PxNzMariaLongo reagiu a Slicer por um tópico no fórum
'sanado', movido ;x1 ponto -
pronto anyur ^^ vlw huntre essa eh ms a ideia ^^1 ponto
-
Alguns Servidores: http://www.xtibia.com/forum/topic/159223-860baiak-yurots-by-tech-vip-2-sem-bugs-860/ http://www.xtibia.com/forum/topic/145906-new-slayer-yurots-860/ http://www.xtibia.com/forum/topic/134254-new-slayer-yurots-854-ao-857/ http://www.xtibia.com/forum/topic/194500-mapa-yurots-editado/ Espero ter ajudado, qualquer coisa é so olhar na area mapping ou pegar de um servidor que ja esta disponivel na area "Downloads de otserv"1 ponto
-
First Collage
Gabriel Couto reagiu a Eratsu por um tópico no fórum
Aquele sapo não combinou com a collage-1 pontos -
um çaite qualquer
Gabriel Couto reagiu a Eratsu por um tópico no fórum
ai olha ta uma bosta http://4.imgland.net/4GS-EV.png-1 pontos -
TibiaSpace lança um novo concurso
Gabriel Couto reagiu a Caronte por um tópico no fórum
Affe isso foi roubado do tibia br se não me engano , já teve até resultado lá.-1 pontos -
ficou uma maravilha seu trabalho, porém a única coisa que acabou completamente seu mapa tornando-o um desastre total, foi isso-2 pontos