Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 12/13/15 em %
-
Nightmare Stalker OtClient Show-Off
Aberos e um outro reagiu a NightmareStalker por um tópico no fórum
Reposicionamento do nome das criaturas Observações do sistema: Esse sistema conta com um arquivo de configuração aonde é possível editar a posição do Nome / HP da criatura para aonde desejar, assim deixando visualmente mais bonitos os personagens. Recolorimento do nome das criaturas Observações do sistema: Esse sistema conta com um arquivo de configuração aonde é possível editar a acor do Nome / HP da criatura como desejar, assim deixando visualmente mais bonitos os personagens. Observações Finais: Qualquer interesse no sistema me contatar via mensagens no fórum.2 pontos -
Problema talkaction
Administrador e um outro reagiu a drakylucas por uma questão
Muda no login.lua doPlayerSetVocation(cid,newvoc) Pra doPlayerSetVocation(cid,newsvoc) Se der esse erro de ficar sem vocação, vai em XML - > vocations e vê se as vocations ids são 5,6,7,8, caso contrário, volte na talkaction, nas primeiras linhas, mude os 5 6 7 8 pra id da sua nova vocação. Teste com um char que já tenha uma vocação normal, não com o gm. E teste com um char que vc ainda não testou (pq se não já tem a storage, daí qlqr coisa vc tbm pode mudar a storage nos 2 arquivos, só deixar o msm número pra ambas)2 pontos -
Npc para o sistema de reset: http://www.xtibia.com/forum/topic/238305-sistema-de-resetes/ data/npc/ reseter.XML : <?xml version="1.0" encoding="UTF-8"?> <npc name="Reseter" script="reseter.lua"> <health now="1000" max="1000"/> <look type="133" head="95" body="86" legs="86" feet="38" addons="3"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|.I've been waiting for you to come.. Say 'reset' or 'quantity'" /> <parameter key="message_farewell" value="Cya folk." /> <parameter key="message_walkaway" value="How Rude!" /> </parameters> </npc> data/npc/scripts reseter.lua : local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) 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 player = Player(cid) config = { minlevel = 150, --- Level inical para resetar price = 10000, --- Preço inicial para resetar newlevel = 20, --- Level após reset priceByReset = 0, --- Preço acrescentado por reset percent = 10, ---- Porcentagem da vida/mana que você terá ao resetar (em relação à sua antiga vida total) maxresets = 50, ---- Maximo de resets levelbyreset = 0 --- Quanto de level vai precisar a mais no próximo reset } function addReset(cid) player = Player(cid) resets = player:getResets() hp = player:getMaxHealth() resethp = hp*(config.percent/100) player:setMaxHealth(resethp) mana = player:getMaxMana() resetmana = mana*(config.percent/100) player:setMaxMana(resetmana) playerid = player:getGuid() player:remove() db.query("UPDATE `players` SET `resets`="..resets.. + 1",`experience`= 0 WHERE `players`.`id`= ".. playerid .."") db.query("UPDATE `players` SET `level`="..config.newlevel..",`experience`= 0 WHERE `players`.`id`= ".. playerid .."") return true end local newPrice = config.price + (getResets(cid) * config.priceByReset) local newminlevel = config.minlevel + (getResets(cid) * config.levelbyreset) if msgcontains(msg, 'reset') then if getResets(cid) < config.maxresets then npcHandler:say('You want to reset your character? It will cost '..newPrice..' gp\'s!', cid) npcHandler.topic[cid] = 1 else npcHandler:say('You already reached the maximum reset level!', cid) end elseif msgcontains(msg, 'yes') and npcHandler.topic[cid] == 1 then if player:getLevel() > newminlevel then if player:removeMoney(newPrice) then addEvent(function() if isPlayer(cid) then addReset(cid) end end, 3000) local number = getResets(cid)+1 local msg ="---[Reset: "..number.."]-- You have reseted! You'll be disconnected in 3 seconds." player:popupFYI(msg) npcHandler.topic[cid] = 0 npcHandler:releaseFocus(cid) else npcHandler:say('Its necessary to have at least '..newPrice..' gp\'s for reseting!', cid) npcHandler.topic[cid] = 0 end else npcHandler:say('The minimum level for reseting is '..newminlevel..'!', cid) npcHandler.topic[cid] = 0 end elseif(msgcontains(msg, 'no')) and isInArray({1}, talkState[talkUser]) == TRUE then npcHandler.topic[cid] = 0 npcHandler:releaseFocus(cid) npcHandler:say('Ok.', cid) elseif msgcontains(msg, 'quantity') then npcHandler:say('You have a total of '..getResets(cid)..' reset(s).', cid) npcHandler.topic[cid] = 0 end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Para configurar mexa nessa parte do npc : config = { minlevel = 150, --- Level inical para resetar price = 10000, --- Preço inicial para resetar newlevel = 20, --- Level após reset priceByReset = 0, --- Preço acrescentado por reset percent = 10, ---- Porcentagem da vida/mana que você terá ao resetar (em relação à sua antiga vida total) maxresets = 50, ---- Maximo de resets levelbyreset = 0 --- Quanto de level vai precisar a mais no próximo reset } Créditos: Flavio S1 ponto
-
Vanaheim global open source
sandrodiegoadao reagiu a Bruno por um tópico no fórum
m método diferente de agir. Escolhas diferentes, um projeto surpreendente, e o melhor é open source. Sim, você pode ter acesso a este servidor que estou desenvolvendo em parceria com a Serversoft para você. Um servidor com uma mega estrutura para suportar seus jogadores online sem nenhum problema como: debug, bug de clonagem, instabilidade entre diversos outros dos servidores free's disponíveis para download nessa vasta internet tibiana. Uma inovação no ramo de OTservers, distribuindo não só a datapack como as sourcers e os sistemas, absolutamente tudo que você procura. Basta baixar, compilar... Mas eu não sei compilar. Não há problema nisso, o OTPanel da Serversoft faz tudo isso para você. Basta clicar num botão de "play" e ver a mágica acontecer. O projeto Vanaheim, foi criado com o intuito de ser inteiramente grátis para toda a comunidade. Um servidor no qual a diversão é o fator principal, um projeto com viabilidade absoluta por todos os tibianos. O projeto conta com uma área exclusiva no GitHub para que todos possam acompanhar a evolução do mesmo, dia a dia, diversas atualizações estarão disponíveis a todos. Desde uma action até uma modificação na source vocês terão acesso. O servidor conta com um mapa Global Full, quando eu digo full, quero dizer que está 99.99% do mapa completo, sem bugs entre outros. Um servidor que você escolhe a rate experience/skill que desejar, ele vai se adaptar! Você pode escolher se quer ou não que as quests tenham as missões originais 100%! GITHUB Para acompanhar e baixar o servidor atualizado, segue o link do nosso projeto no GitHub: DOWNLOADS Servidor Mapa Yasir Scan CRÉDITOS TFS Team Orts Project1 ponto -
Global Full [CLIENTS COMPATÍVEIS] 10 e 11.5. [BUGS E DOWNLOAD] BAIXEM E REPORTEM EM: OTXGlobal Full [FEATURES] NEW DEPOT, NEW SPAWN, NEW CAST SYSTEM, NEW NPC SYSTEM VIA BANK BALANCE, NEW CRITICAL BOOST SYSTEM, NEW POTIONS, REWARD SYSTEM, PREY ... [MAPA] FULL GLOBAL MAP WITH FEYRIST TODAS CIDADES E NOVAS AREAS TODAS QUESTS FUNCIONANDO! [EVENTS] WAR-ANTIENTROSA [CONTATO] SKYPE: onjogos WHATSAPP: (66) 998427-4493 [Créditos]Tfs 1.2 Developers -Zbizu - Pitis91 - MatheusMkalo - Gesior - Lundrial - M4G0 - Fish04k - Printer - Djarek - Ninjalulz - Slavidodo - Thexamx - Socket2810 - Ciroc -Absolute - Gordonbay - Mitsuig - Alissonfgp - Gunz - Bruno Minervino - Comedinha -Hirako - Maya - Mattyx14 – Darkjav - Viking Tibia1 ponto
-
Utilizado em conjunto com: http://www.xtibia.com/forum/topic/238305-sistema-de-resetes/ COMBAT.CPP procure: int size0 = lua_gettop(L); adicionar abaixo: int mares = g_config.getNumber(ConfigManager::MAGIC_RES_DAM); procure: damage.primary.value = normal_random( LuaScriptInterface::getNumber<int32_t>(L, -2), LuaScriptInterface::getNumber<int32_t>(L, -1) ); lua_pop(L, 2); } substitua: damage.primary.value = normal_random( LuaScriptInterface::getNumber<int32_t>(L, -2) * ((player->getResets() * mares/100) + 1), LuaScriptInterface::getNumber<int32_t>(L, -1) * ((player->getResets() * mares/100) + 1) ); lua_pop(L, 2); } WEAPONS.H procure: static int32_t getMaxMeleeDamage(int32_t attackSkill, int32_t attackValue); adicone abaixo: static int32_t getMaxWeaponDamage(uint32_t level, uint32_t resets, int32_t attackSkill, int32_t attackValue, float attackFactor); WEAPONS.CPP procure: int32_t Weapons::getMaxWeaponDamage(uint32_t level, int32_t attackSkill, int32_t attackValue, float attackFactor) { int meres = g_config.getNumber(ConfigManager::MELEE_RES_DAM); return static_cast<int32_t>(std::ceil((2 * (attackValue * (attackSkill + 5.8) / 25 + (level - 1) / 10.)) / attackFactor)); } substitua: int32_t Weapons::getMaxWeaponDamage(uint32_t level, uint32_t resets, int32_t attackSkill, int32_t attackValue, float attackFactor) { int meres = g_config.getNumber(ConfigManager::MELEE_RES_DAM); return static_cast<int32_t>(std::ceil(((resets * meres/100) + 1) * (2 * (attackValue * (attackSkill + 5.8) / 25 + (level - 1) / 10.)) / attackFactor)); } procure: int32_t maxDamage = Weapons::getMaxWeaponDamage(player->getLevel(), attackSkill, attackValue, attackFactor); substitua: int32_t maxDamage = Weapons::getMaxWeaponDamage(player->getLevel(), player->getResets(), attackSkill, attackValue, attackFactor); procure: int32_t maxValue = Weapons::getMaxWeaponDamage(player->getLevel(), attackSkill, attackValue, attackFactor); substitua: int32_t maxValue = Weapons::getMaxWeaponDamage(player->getLevel(), player->getResets(), attackSkill, attackValue, attackFactor); procure: int32_t maxValue = static_cast<int32_t>(Weapons::getMaxWeaponDamage(player->getLevel(), attackSkill, attackValue, attackFactor) * player->getVocation()->meleeDamageMultiplier); substitua: int32_t maxValue = static_cast<int32_t>(Weapons::getMaxWeaponDamage(player->getLevel(), player->getResets(), attackSkill, attackValue, attackFactor) * player->getVocation()->meleeDamageMultiplier); procure: int32_t maxValue = Weapons::getMaxWeaponDamage(player->getLevel(), attackSkill, attackValue, attackFactor); substitua: int32_t maxValue = Weapons::getMaxWeaponDamage(player->getLevel(), player->getResets(), attackSkill, attackValue, attackFactor); procure: int32_t maxValue = static_cast<int32_t>(Weapons::getMaxWeaponDamage(player->getLevel(), attackSkill, attackValue, attackFactor) * player->getVocation()->distDamageMultiplier); substitua: int32_t maxValue = static_cast<int32_t>(Weapons::getMaxWeaponDamage(player->getLevel(), player->getResets(), attackSkill, attackValue, attackFactor) * player->getVocation()->distDamageMultiplier); COMFIGMANAGER.CPP procure: integer[RATE_SPAWN] = getGlobalNumber(L, "rateSpawn", 1); adicione abaixo: integer[MELEE_RES_DAM] = getGlobalNumber(L, "MeleeDamResMult", 10); integer[MAGIC_RES_DAM] = getGlobalNumber(L, "MagicDamResMult", 10); CONFIGMANAGER.H procure: RATE_SPAWN, adicione baixo: MELEE_RES_DAM, MAGIC_RES_DAM, LUASCRIPT.CPP procure: registerEnumIn("configKeys", ConfigManager::RATE_SPAWN) adicione abaixo: registerEnumIn("configKeys", ConfigManager::MELEE_RES_DAM) registerEnumIn("configKeys", ConfigManager::MAGIC_RES_DAM) Depois adicione no config.lua do seu servidor: -- Reset -- NOTE: % of damage for reset MeleeDamResMult = 100 MagicDamResMult = 100 Dessa forma cada resete o dano do player vai aumentar 100% em hit e 100% em magia.1 ponto
-
Extensions RME #1 (Grounds)
M i s s reagiu a SamueLGuedes por um tópico no fórum
Introdução "Extensions, traduzindo para o português, Extensões; faz referência ao uso do auto-magic, que por via dos scripts existentes na pasta DATA/VERSÃO pode ser entendido de várias maneiras: Esses scripts, além de definir a existência do AA, funcionam como uma citação de itens registrados em uma paleta específica e/ou conjunto de itens pré montados, com o objetivo de: • Organizar, para que itens sejam facilmente encontrados; • Tornar prático o manuseio de itens que requerem montagem e/ou facilitar a aplicação desses itens." @@Daniel Extensions funciona de certo modo, para organizar todos os IDs de items no RME, como Walls / Grounds / Items em Geral, facilitando o seu manuseio, e evitando perca de tempo em procurar tal ID. No RME já estão disponiveis várias extensions onde estão separados por Pallete / TileSet, EX: Terrain Pallete, que contém TileSets como: Cave, Nature, Roofs, Snow, Stairs, Town. ou também Doodad Pallete, que mistura TileSets para estruturas em geral. e assim por diante. Hoje irei ensinar a como adicionar grounds em seu RME, de maneira facil e simples. Criação da Ground Primeiro, escolha o ground desejado, pegarei como exemplo o ID: 4526 (Grass) . na pasta do RME, vá em Data/Versão (a pasta da versão desejada), e procure por Grounds.xml. iremos pegar um ground já criado, como por exemplo: Legenda: Brush Name: Nome do ground que irá adicionar, no caso colocaremos Grass. type: tipo do item, que no caso é ground server_lookid: o ID do Item que ficara a amostra no RME z-order: No tibia, z é o algaritmo utilizado para representar altura, ou andar. No map editor, funciona como sobreposição: O Ground que possuir o z-order maior, será o ground que terá suas bordas sobre os grounds com z-order menor. Item ID: aqui você irá adicionar o item que desejado, no caso 4526, caso queira que ele adicione mais grounds, basta adicionar mais uma linha ficando: <item id="4526" chance="2500"/> <item id="4527" chance="2500"/> Chance: a chance que tem de a randomização dos grounds colocar o ID no mapa (utilizado para grounds com mais de uma sprite) Border Align "Outer": ID da borda da ground 4526 (iremos ver no proximo passo) Border Align "Inner": caso coloque o ground onde não tenha nada em volta, ficara com o ID da borda padrão 1 "mountain edge border". por fim, no script ficará assim: note que tem mais IDs, no caso é todas as IDs de sprites de grass. Criando uma Borda para o Ground Já criado a sua ground, iremos agora criar uma borda para ela. abra o arquivo: borders.xml. pegaremos como exemplo a borda do ID 4526: Legenda: border id: ID da borda, é importante seguir a ordem dos IDs, para isso veja qual foi a ultima borda adicionada. concluido a borda, volte ao arquivo ground.xml e adicione o ID da Borda na parte: <border align="outer" id="2"/> pronto, seu ground e sua borda foram criados. Adicionando ao RME Criado o seu ground, iremos colocar no RME. na mesma pasta, abra o arquivo: Tilesets.xml. procure pelo Pallet desejado, no caso irei adicionar ao Terrain Pallet / Nature: <tileset name="Nature"> <terrain> note que já terá varios Items adicionados, adicione mais uma linha, ficando: <tileset name="Nature"> <terrain> <brush name="grass"/> OBS: salve e feche. abra seu RME, agora sua ground já está pronta para ser usada. Créditos @SamueLGuedes (por montar o tutorial) @Daniel (por ajudar nas informações) Declarações finais espero que tenham gostado do tutorial, ao decorrer do tempo irei criando mais tutoriais como esse. dúvidas e sugestões podem comentar aqui mesmo, estarei aberto à criticas também.1 ponto -
SoT #01 - Script of Tales
bandos reagiu a Administrador por um tópico no fórum
Luna, a estrela mais amada pelos elfos, vista como um ponto azul e brilhante, ilumina a terra mais que a lua nas noites escuras. Na fortaleza leste da grande floresta, encontra-se a floresta azul, mais conhecida como Lui. Um lugar hábil e sagrado para elfos em treinamento; Yulai é uma jovem elfa que recém formou-se na academia de elfos jovens. Todas as noites, Yulai costumava sentar em um tronco de uma árvore-base (são as maiores da fortaleza), e permanecia por horas olhando para a estrela Luna. Certo dia, Yulai estava deitada olhando para Luna, até notar que a luz da estrela se desfazia no vazio do céu. No mesmo instante, uma luz cegante caiu sobre a floresta e transformou todos os elfos, animais e até mesmo as menores criaturas, em cristais azuis petrificados, com exceção de Yulai. Ela procurou desesperadamente por alguém que não tivesse sido petrificado pela estrela, mas sem sucesso, desistiu. Yulai não conseguia parar de pensar em alguma forma de concertar isto, afinal, porque a estrela mais venerada pelos elfos, Luna, faria isso? Ou não fora ela?" Clique aqui para participar1 ponto -
Show Off (Gwix)
Administrador reagiu a Shakkatsun por um tópico no fórum
Aquela invejinha tomando conta... ;-; Parem de mapear bem, aff =C1 ponto -
Do u wanna travel to another dimension?1 ponto
-
1 ponto
-
@up, editei o tópico colocando mais um Show-OFF.1 ponto
-
Sand border em todos os grounds
FlamesAdmin reagiu a Administrador por uma questão
Puuts perdão cara, eu viajei legal. Você pois os tiles na água e não no dark. Todavia, procure por: <border id="5"> -- Sea border -- <borderitem edge="n" item="4632"/> <borderitem edge="e" item="4635"/> <borderitem edge="s" item="4634"/> <borderitem edge="w" item="4633"/> <borderitem edge="cnw" item="4643"/> <borderitem edge="cne" item="4642"/> <borderitem edge="csw" item="4641"/> <borderitem edge="cse" item="4640"/> <borderitem edge="dnw" item="4639"/> <borderitem edge="dne" item="4638"/> <borderitem edge="dsw" item="4637"/> <borderitem edge="dse" item="4636"/> </border> E substitua por: <border id="5"> -- Sea border -- <borderitem edge="n" item="4644"/> <borderitem edge="e" item="4645"/> <borderitem edge="s" item="4646"/> <borderitem edge="w" item="4647"/> <borderitem edge="cnw" item="4652"/> <borderitem edge="cne" item="4653"/> <borderitem edge="csw" item="4654"/> <borderitem edge="cse" item="4655"/> <borderitem edge="dnw" item="4648"/> <borderitem edge="dne" item="4649"/> <borderitem edge="dsw" item="4650"/> <borderitem edge="dse" item="4651"/> </border> IDS trocados =)1 ponto -
Daniel Spriting
Administrador reagiu a Piabeta Kun por um tópico no fórum
gostei muito, unica coisa agora eh trabalhar em mais detalhes, como poderias ser explorado no shield, mais ficou muito suave e bonito, promissor!1 ponto -
Você colocou para o player falar denovo com o npc lá de promotion???1 ponto
-
Senha Criptografada
JeanOtserv reagiu a jvcasarin por uma questão
tenta colocar nesse site a senha: https://hashkiller.co.uk/sha1-decrypter.aspx Elas estão criptografadas pq vc usa a criptografia "sha1" no config.lua.... Para mudar isso, vc teria q mudar a criptografia para "plain" e mudar a distro.1 ponto -
Troca por este código: function onSay(cid, words, param) local vocs = { [1] = 5, -- master sorcerer [2] = 6, -- elder druid [3] = 7, -- royal paladin [4] = 8, -- elite knight } local newvoc = vocs[getPlayerVocation(cid)] local price = 20000 if getPlayerPremiumDays(cid) > 0 then if getPlayerMoney(cid) >= price then if vocs[getPlayerVocation(cid)] then doPlayerSetVocation(cid,newvoc) doPlayerRemoveMoney(cid, price) doPlayerSendCancel(cid, "Parabens voce foi promovido.") setPlayerStorageValue(cid, 21323, newvoc) else doPlayerSendCancel(cid, "Voce nao pode ser promovido.") doSendMagicEffect(getThingPos(cid), CONST_ME_POFF) end else doPlayerSendCancel(cid, "Voce nao tem dinheiro suficiente.") doSendMagicEffect(getThingPos(cid), CONST_ME_POFF) end else doPlayerSendCancel(cid, "Voce precisa ser premium para usar esse comando.") doSendMagicEffect(getThingPos(cid), CONST_ME_POFF) end return true end Agora em login.lua em baixo da linha que tem "function onLogin(cid)" Adicione isto: local newsvoc = getPlayerStorageValue(cid, 21323) if newsvoc > 4 then doPlayerSetVocation(cid,newvoc) end Pronto! Problema resolvido1 ponto
-
Problema talkaction
jvcasarin reagiu a Night Wolf por uma questão
vc tem que verificar se seu data/XML/vocations.xml as vocs promovidas estão como fromVoc das vocações que as precedem. Do contrário, toda vez que relogar vai voltar como knight ao invés de elite knight, por ex.1 ponto -
Show Off (Gwix)
Shakkatsun reagiu a Gwix por um tópico no fórum
Realmente, a Zanknore antiga possuía apenas 1 estátua dwarf no templo, e pelo fato de ser sujo o pessoal acha que isso é característico. RPGísticamente falando (nisso eu me baseio em LOTR, porque o Tibia também tem muita ligação com o LOTR = Lord of the Rings) Os anões possuem construções lindas e grandiosas, porém rústicas, isso que eu quis incorporar na nova Zanknore, incrementando gemas e etc, as paredes escolhidas não foram escolhidas à toa, nelas tem escrituras rúnicas dos anões (Onde Tolkien se inspirou no alfabeto Futhark - Viking). Na verdade acho que o pessoal não gostou muito da entrada e achou o mapa todo seria daquela forma. Vou postar um mapa de uma forma diferente hoje1 ponto -
Monsters Default Events
Incur reagiu a MatheusGlad por um tópico no fórum
FAÇA BACKUP DA PASTA MONSTERS E CREATURESCRIPTS ANTES DE UTILIZAR! Funciona para todas as versões TFS 0.3.6+ ate TFS 1.2 (Provavelmente funciona para outras tambem mas não me dei o trabalho de testar) Introdução: Bem, como o titulo mesmo diz, o script vai criar e modificar todos os monstros para terem scripts default (Caso o monstro não tenha script) e tambem pode adicionar creaturescripts default, exemplo o onDeath. Code: monsterevent.lua local dir = "./data/monster/" local csdir = "./data/creaturescripts/" local monstersXML = "monsters.xml" local csXML = "creaturescripts.xml" local csTag = '\n <event type="%t" name="%n" script="%s"/>' -- Tag format on creaturescripts.xml (%t = type, %n = name, %s = script) local defaultText = [[function onCreatureAppear(self, creature) return false end function onCreatureDisappear(self, creature) return false end function onCreatureMove(self, creature, oldPosition, newPosition) return false end function onCreatureSay(self, creature, type, message) return false end function onThink(self, interval) return false end]] local events = { ["monsterdeath"] = {type = "death", file="monsterdeath.lua", defaultText=[[ function onDeath(cid, corpse, lasthitkiller, mostdamagekiller, lasthitunjustified, mostdamageunjustified) return true end]]}, } ------- Não edite a partir dessa linha se nao souber o que esta fazendo. function parseXML(file) local ret = {["monster"] = {}, ["event"] = {}} local data = "" for line in file:lines() do data = data .. line .. "\n" line = line:match("<(.-)/>") if line then local element = line:match("^%s*(.-)%s") if element == "monster" or element == "event" then local t = {} for i, x in line:gmatch('%s+(.-)="(.-)"') do t[i] = x end table.insert(ret[element], t) end end end return ret, data:sub(1, #data-1) end function init() ----- Parsing monsters.xml ----- local monstersfile = io.open(dir .. monstersXML, "r") print("Parsing XML " .. dir .. monstersXML .. "...") local xmltable = parseXML(monstersfile) monstersfile:close() -------------------------------- -- Creating scripts directory -- local testfile = io.open(dir .. "scripts/test", "w") if not testfile then os.execute("mkdir data\\monster\\scripts") print("Directory " .. dir .. "scripts has been created.") else testfile:close() end os.remove(dir .. "scripts/test") --------------------------------- ------ Creating default.lua ------- local defaultlua = io.open(dir .. "scripts/default.lua", "w") defaultlua:write(defaultText) defaultlua:close() print("File " .. dir .. "scripts/default.lua has been created.") --------------------------------- ---- Modify all monsters XML! ---- local modified = 0 for i, contents in ipairs(xmltable["monster"]) do local monsterxml = io.open(dir .. contents.file, "r") if monsterxml then local xmldata = monsterxml:read("*a") local _mod = false local s, f, content = xmldata:find("<monster%s(.-)>") local r, p, cs = content:find('script="(.-)"') monsterxml:close() newc = content if not cs then xmldata = xmldata:gsub(content, newc .. ' script="default.lua"') _mod = true elseif cs ~= "default.lua" then print('Warning: The file "' .. contents.file .. '" already has a script.') end local s, f, content = xmldata:find("<monster%s(.-)>") local x, q, scriptcontent = xmldata:find("<script>(.-)</script>") local readyevents = {} local addevents = "" if scriptcontent then for line in scriptcontent:gmatch("(.-)\n") do local event = line:match('<event%s-name="(.-)"') if event then readyevents[event] = true end end end for event, _c in pairs(events) do if not readyevents[event] then addevents = addevents .. '<event name="' .. event .. '"/>\n' end end if addevents ~= "" then _mod = true if scriptcontent and scriptcontent:find("event") then xmldata = xmldata:gsub(scriptcontent, scriptcontent .. addevents) elseif x and q then xmldata = xmldata:sub(1, x-1) .. xmldata:sub(q+1) xmldata = xmldata:sub(1, f) .. "\n<script>\n" .. addevents .. "\n</script>" .. xmldata:sub(f+1) else xmldata = xmldata:sub(1, f) .. "\n<script>\n" .. addevents .. "\n</script>" .. xmldata:sub(f+1) end end if xmldata then if _mod then modified = modified+1 end local monsterxmlwrite = io.open(dir .. contents.file, "w") monsterxmlwrite:write(xmldata) monsterxmlwrite:close() else print("Error in: " .. contents.name) end else print("Warning: Error opening file " .. contents.file) end end print("Total monsters XML modified: " .. modified) ---------------------------------- --- Parsing creaturescripts.xml -- local csfile = io.open(csdir .. csXML, "r") print("Parsing XML " .. csdir .. csXML .. "...") local csxmltable, xmldata = parseXML(csfile) csfile:close() ---------------------------------- --- Modify creaturescripts.xml --- local _mod = false local readytags = {} for i, contents in ipairs(csxmltable["event"]) do if events[contents.name] then readytags[contents.name] = true end end for event, contents in pairs(events) do if not readytags[event] then _mod = true local currenttag = csTag currenttag = currenttag:gsub("%%t", contents.type) currenttag = currenttag:gsub("%%n", event) currenttag = currenttag:gsub("%%s", contents.file) local r, w = xmldata:find("<creaturescripts>") xmldata = xmldata:sub(1, w) .. currenttag .. xmldata:sub(w+1) end end if _mod then local csfilewrite = io.open(csdir .. csXML, "w") csfilewrite:write(xmldata) csfilewrite:close() print("Modified " .. csdir .. csXML) end ---------------------------------- ----- Creating event scripts ----- print("Creating lua creaturescripts...") for event, contents in pairs(events) do local luafile = io.open(csdir .. "scripts/" .. contents.file, "w") luafile:write(contents.defaultText) luafile:close() end ---------------------------------- print("All the modifications were done.") return true end local check = io.open("meventsinstall.lua", "r") if not check then local ret = init() if ret then local file = io.open("meventsinstall.lua", "w") file:write("true") file:close() end else check:close() end Explicando o que o code realmente faz: O code vai ser executado somente uma vez e vai editar todos os monstros do seu OTServer presentes no monsters.xml adicionando um script default, que seria o defaultText presente no inicio do code (So funciona em TFS 1.0+) e tambem ira adicionar eventos ao XML do monstro sem remover os que ja existem (se existirem). Depois disso ele ira editar o creaturescripts.xml para criar a tag do evento e tambem criar o script que esta na tabela events. Como instalar: TFS 0.3.6: Só botar ele na pasta lib do seu OT que ele ja vai executar quando voce abrir o executavel. TFS 1.x: Bote o code na pasta "lib\core" e edite o core.lua nessa pasta adicionando essa linha: dofile('data/lib/core/monstersevent.lua') Se voce fizer tudo certo deve aparecer isso quando voce abrir o server: Você pode rodar o script novamente deletando o arquivo "meventsinstall.lua" que sera criado na pasta do server, ele soh ira adicionar algo se voce mudar alguma coisa no code. Porque usar esse code: Não usar funçoes como onAttack, onSpawn entre outras para registrar eventos em monstros. Usar as funçoes onCreatureAppear, onCreatureDisappear, onCreatureMove, onCreatureSay e onThink em todos os monstros do server (TFS 1.0+)1 ponto -
1 ponto
-
load failed ao compilar com virtual studio
Fernandesops reagiu a DeCarvalho por uma questão
Bom que está de boa.. seria bom ficar de olho no tópico do Bruno http://www.xtibia.com/forum/topic/233145-compilando-tfs-1x-com-video-aula/pois quem sabe ele consiga atualizar o sistema para funcionar no VS2015 mas creio que essa vontade (minha também assim como de outros) seja mais 'frescura' pois só para compilar o tfs o 2013 resolve muito bem nem digo diminuir espaço usado pois o vs2013 ocupa somente 5.6gb usando soh o c++ (adicionei o blender sei la pq) Enfim boa sorte ae no seu projeto1 ponto -
(imagem left4dead) (edição AnneMotta • Eai pessoal, Tudo Bom? Hoje estava com vontade de fazer um Tutorial , mas não sabia de que.Praticamente não é um Tutorial ,é um Guia que irá te ajudar a como Criar sua Própria city. Você quer criar um mapa próprio?Primeiramente , tenha 'Segurança' saiba oque agradará e oque não agradaria os jogadores.Os Jogadores querem se sentir 'confortáveis' , então você precisa fazer algo Bacana. • Templos O Templo é definitivo, você pode fazer um Templo Medieval, mas realmente não precisa ser só de um estilo.Victor Como Assim, não precisa ser só de um Estilo?O Templo pode ter Nature, você pode por o templo no meio do Nada, para dar impressão que ele chegou perdido e não sabe (mais para mapas próprios). Agora voltando no Templo com nature , não importa o Lugar. • O templo pode ser em cima de uma Montanha , pode ser no 'Inferno', local de gelo, Pode ser em um Oasis.É com você o templo. Agora vou dar um Exemplo de Templo com Nature. Feito por Alissow. Vital900 Exemplo VictorFT Exemplo DuMal Sinceramente eu adoro esse Templo, acho legal o mais legal é porque ele é variado.É raro você encontrar um Templo assim. O Templo também pode ter Cachoeira, pode estar embaixo de uma cachoeira e esta cachoeira chegue até ele, se for fazer isto faça algo Coerente. Não algo sem Sentido,porque tudo que precisamos é de um Templo.Mas tenha criatividade no seu Templo pois é uma Rotina, quando o Player nascer ele vai nascer neste lugar. A Importância do Templo é muito Grande, sempre veja se está legal ou não está.Pergunte para Amigos se eles Gostam ou não,o mais legal de um Templo são seus Detalhes.Então faça algo confortável. • Ruas Ruas são locais onde o Jogador fará seu comércio, então ele sempre irá dar uma passada por lá depois de voltar da sua Aventura, passará para comprar coisas, vender também.Faça uma coisa agradável não precisa ser tão grande, pode ser pequeno mas tem que ser detalhado.City pequena,rua pequena,City grande rua grande.Então você primeiramente faça algo Agradável, primeiro com o Ground ,depois fazendo detalhes e depois faça as Casas de comércio.Não precisa ser diferente.Mas cade cidade tem um 'tema'. Exemplo de Rua Feita pelo Left. Feito Por VictorFT Uma rua bem simples ,mais é bem detalhada como podem ver ,é agradável em duas partes.Na Construção e na Nature. Para fazer uma Rua , você tem que fazer oque está na sua cabeça para deixa-la agradável, Uma rua pode ter até cachoeira se você quiser , pode ter oque você quiser contanto que seja Agradável e bonita.Como eu disse está rua não está grande mas está muito bem Detalhada e agradável.Então faça mais o menos desse estilo ou como desejar. • Depot Muito importante na parte de Seu mapa onde os players , irão guardar sues pertences e quando estiverem com Cap totalmente ocupada vão guardar seus itens, Depot precisa de Npc's que vendam Parcel, se quiser adicione O Banker nele.O Depot seguirá sempre o Estilo de sua City, se sua City for estilo Desert o Depot obviamente será estilo Desert, Sua City for perdida o seu Depot vai ter estilo de local abandonado,sujo e destruído.Depot é legal fazer desde que tenha um estilo bom , um formato agradável. Exemplo LordZezim Depot é um local bonito como vocês podem ver este está excelente variado na montanha , cachoeira logo em seguida detalhamento incrível. Está lindo este Depot , formato perfeito. • Fortaleza Forteza é um local onde protege a Cidade, a fortaleza é um local onde será uma defesa contra ataques na sua cidade, ela também irá seguir o Rumo de sua cidade , sua cidade é no estilo Stone sua Fortaleza vai ser feita de Stone, se sua cidade for no Estilo de Deserto ela vai ser estilo deserto , faça uma fortaleza onde os jogadores possam sair da Cidade, para ir até suas Hunt's .Faça uma Fortaleza legal variando no formato não deixe muito reta. Faça algo coerente, um telhado bonito etc. Exemplo VictorFT A Fortaleza está realmente agradável variada nos detalhes , está bonita e bem jogável.Se perceberem logo em seguida tem uma hunt pode ser uma 'Hunt Principal'. Dica: Adicione Stone's no chão e sangue, para mostrar que guerreiros passaram por ai, água para mostrar que é suor pois deserto é um local muito quente. • Loja Loja é um local onde o jogador fará a sua rotina,ele irá comprar itens,venderá itens.Se lembram quando eu falei sobre as Ruas? Então bote as Lojas nas ruas, as lojas podem ser de Knight, Paladin, Mago, para vender itens.Você pode fazer do estilo que quiser , Um dia o Vital900 me explicou que cada cidade pode ter o Padrão de telhado se você usa um estilo de telhado, você usará nas outras construções da mesma cidade.Loja pode ser um local agradável.Pode ter nature, etc. É igual Depot ,se sua city é abandonada sua loja será abandonada, e por ai vai. Exemplos de Lojas (VictorFT,TecBreakerByLipe/Kyoran) VictorFT TecBreakerByLipe/Kyoran • Caves And Nature Nesta etapa final irei explicar cave primeiro. Primeiramente , cave é quase oque defini um Mapa cave tem que ser algo agradável , não algo que os players não gostem , não quero desrespeitar quem gosta de Baiak, Mas pelo amor de Deus as caves de Baiak são mal feitas. Cave é um local onde o player fará uma Rotina até um certo level.Então você fala assim "Bobagem pra mim cave o importante é que upa", Certamente você está certo, mas e ai a questão é , o seu mapa é próprio você vai querer fazer uma cave que tem intenção 'só de upar' ou quer uma cave legal e ao mesmo tempo com a mesma intenção (de upar)?Você que escolhe , se você quiser que só upe, cara... esse tópico não vai te ajudar mas da uma olhada pra eu te converter e se você quer uma Cave que seja legal e agradável continue lendo.Muitas pessoas tem Mania de usar Auto B. em cave isso é Ruim , pois estraga sua Hunt, Raw é como se você tivesse mais liberdade mas demora, no Raw você pode por Objetos onde quiser , e com AB você não tem a mesma Liberdade. Exemplo DuMal: Agora irei explicar sobre Nature é um local bonito , onde possui várias plantas, cachoeira e etc. A Nature é denominada de Natureza tem que ter bastante vida pode estar em qualquer lugar do seu mapa , como no templo (expliquei isto no início do tópico) nature é um local perfeito.Onde animais vivem nature é importante porque lá vai ter Hunt's que o jogador passará pela nature até chegar as Hunts. Exemplo DuMal: Exemplo GuuhMaster Exemplo Laug Exemplo Left4dead Então é isso galera, Obrigado por verem o tópico ,espero ter dado uma noção a todos.Quero ajudar vocês a Mappear ,Obrigado, para contatos adicione:victor-msn-2010@hotmail.com skype:victor.fernandes.t Att. VictorFT1 ponto
-
@Slicer Eu somente expressei minha opinião seguindo as regras. Pois lá está escrito que flood é considerado apenas se o tópico for upado no mesmo dia. E isso que estou fazendo é expressando minha opinião ou seja, liberdade de expressão o/1 ponto