Postado Maio 9, 2014 11 anos Este é um post popular. Fala, galera! Beleza? Sou novo aqui no TK e queria trazer algo para vocês. Dei uma procurada e não achei nada do tipo, então creio que esse tutorial possa ajudar algumas pessoas! O que vou ensinar a vocês é como criar uma skill direto na source, o que permite que você utilize comandos como "getPlayerSkill", "doPlayerAddSkillTry" etc em seus scripts em Lua. Esse tutorial NÃO serve para criar skills de "combate", como sword, axe etc. Esse tipo de skill envolve vários outros parâmetros além do que mostrarei aqui. Quem sabe eu faça um tutorial sobre isso daqui um tempo. Preview de uma skill que criei para meu projeto: Para este tutorial, eu usei: Sources do The Forgotten Server 0.3.7: Aqui serão feitas várias edições, criando a nova skill e tudo que é necessário para a skill funcionar corretamente. Microsoft Visual Studio 2010 Professional: Utilizei para compilar o TFS com as novas edições. Se não souber compilar, procure em outros tópicos aqui do fórum. Não é meu objetivo aqui ensinar como compilar. É necessário compilar com o MVS? Não. Se você preferir, pode fazer com outros programas. Notepad++: Usei porque acho um editor de texto simples, prático e funcional. Não gosto de editar os códigos no MVS. Porém sinta-se à vontade para usar o editor que quiser. haha SQLiteStudio 2.1.4: Será necessário para fazer pequenas alterações para que seu banco de dados funcione corretamente. Se você utiliza MySQL, terá que fazer essas edições por outro programa. Sources do OTClient: Como utilizo o OTClient em meu servidor, usarei ele para demonstrar como adicionar a barrinha à janela de Skill. Se você utiliza outro client, infelizmente, não poderei dar suporte, já que nunca editei outros clients. Codeblocks: Usei para compilar o OTClient. Mas pode ser feito com o MVS também. A escolha é sua! Passo 1 - Editar a source do TFS: Aqui faremos edições em vários arquivos de extensão .cpp (C++) e .h (headers). Eu recomendo que tais edições sejam feitas pelo Notepad++, mas você pode usar até o bloco de notas do Windows, se preferir. Tome cuidado para sempre salvar o arquivo depois que editar. Um erro nesta etapa e sua skill poderá não funcionar corretamente. Então... vamos lá! 1.1: Aqui, iremos editar o arquivo "condition.cpp". Procure o trecho: case CONDITIONPARAM_SKILL_FISHING: skills[SKILL_FISH] = value; return true; Embaixo, iremos criar o primeiro parâmetro da nossa nova skill. Vamos supor que estejamos criando uma skill de "woodcut". O código ficará assim: case CONDITIONPARAM_SKILL_WOODCUTTING: skills[SKILL_WOODCUT] = value; return true; Ainda no mesmo arquivo, procure o trecho: case CONDITIONPARAM_SKILL_FISHINGPERCENT: skillsPercent[SKILL_FISH] = std::max((int32_t)0, value); return true; Embaixo, vamos adicionar o segundo parâmetro da nova skill: case CONDITIONPARAM_SKILL_WOODCUTTINGPERCENT: skillsPercent[SKILL_WOODCUT] = std::max((int32_t)0, value); return true; Pronto. Já editamos o "condition.cpp". 1.2: Agora vamos editar o "const.h". Procure por: SKILL_FISH, Embaixo, adicione: SKILL_WOODCUT, Procure a linha: SKILL_LAST = SKILL_FISH, Substitua o SKILL_FISH pelo seu skill, ficando assim: SKILL_LAST = SKILL_WOODCUT, Pronto! 1.3: Agora iremos editar o "enums.h". Procure por: CONDITIONPARAM_SKILL_FISHING, Embaixo, adicione: CONDITIONPARAM_SKILL_WOODCUTTING, Ainda no mesmo arquivo, procure por: CONDITIONPARAM_SKILL_FISHINGPERCENT, Embaixo, adicione: CONDITIONPARAM_SKILL_WOODCUTTINGPERCENT, Já editamos o "enums.h". 1.4: Em "items.cpp", procure: else if(tmpStrValue == "skillfish") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.getAbilities()->skills[SKILL_FISH] = intValue; } Embaixo, adicione: else if(tmpStrValue == "skillwoodcut") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.getAbilities()->skills[SKILL_WOODCUT] = intValue; } Pronto! haha 1.5: O arquivo da vez é o "monsters.h". Procure por: else if(readXMLInteger(node, "fishing", intValue) || readXMLInteger(node, "fish", intValue)) param = CONDITIONPARAM_SKILL_FISHING; Embaixo, adicione: else if(readXMLInteger(node, "woodcutting", intValue) || readXMLInteger(node, "woodcut", intValue)) param = CONDITIONPARAM_SKILL_WOODCUTTING; Note que, nesta última etapa, adicionamos duas condições: tanto o termo woodcutting quanto o woodcut, quando utilizados no monsters.xml, serão reconhecidos. O que permite isso é o operador lógico "ou", representado em C++ por "||". Caso queira que apenas um termo seja reconhecido, bastaria deixar o código assim: else if(readXMLInteger(node, "woodcut", intValue)) param = CONDITIONPARAM_SKILL_WOODCUTTING; No mesmo arquivo, procure por: else if(readXMLInteger(node, "fishingPercent", intValue) || readXMLInteger(node, "fishPercent", intValue)) param = CONDITIONPARAM_SKILL_FISHINGPERCENT; Embaixo, adicione: else if(readXMLInteger(node, "woodcuttingPercent", intValue) || readXMLInteger(node, "woodcutPercent", intValue)) param = CONDITIONPARAM_SKILL_WOODCUTTINGPERCENT; O mesmo processo que eu expliquei acima é válido aqui e será em outros exemplos mais abaixo. Pronto! Mais um arquivo editado. 1.6: Agora editaremos o "mounts.cpp". Procure por: if(readXMLInteger(configNode, "fishing", intValue) || readXMLInteger(configNode, "fish", intValue)) mount->skills[SKILL_FISH] = intValue; Embaixo, adicione: if(readXMLInteger(configNode, "woodcutting", intValue) || readXMLInteger(configNode, "woodcut", intValue)) mount->skills[SKILL_WOODCUT] = intValue; Ainda em "mounts.cpp", procure: if(readXMLInteger(configNode, "fishingPercent", intValue) || readXMLInteger(configNode, "fishPercent", intValue)) mount->skillsPercent[SKILL_FISH] = intValue; E adicione em seguida: if(readXMLInteger(configNode, "woodcuttingPercent", intValue) || readXMLInteger(configNode, "woodcutPercent", intValue)) mount->skillsPercent[SKILL_WOODCUT] = intValue; Pronto! 1.7: Agora editaremos o arquivo "outfit.cpp". Procure por: if(readXMLInteger(configNode, "fishing", intValue) || readXMLInteger(configNode, "fish", intValue)) outfit.skills[SKILL_FISH] = intValue; Embaixo, adicione: if(readXMLInteger(configNode, "woodcutting", intValue) || readXMLInteger(configNode, "woodcut", intValue)) outfit.skills[SKILL_WOODCUT] = intValue; Procure por: if(readXMLInteger(configNode, "fishingPercent", intValue) || readXMLInteger(configNode, "fishPercent", intValue)) outfit.skillsPercent[SKILL_FISH] = intValue; Adicione: if(readXMLInteger(configNode, "woodcuttingPercent", intValue) || readXMLInteger(configNode, "woodcutPercent", intValue)) outfit.skillsPercent[SKILL_WOODCUT] = intValue; Pronto. 1.8: Abra o arquivo "tools.cpp" e procure por: {"fishing", SKILL_FISH}, {"fish", SKILL_FISH}, Embaixo, adicione: {"woodcutting", SKILL_WOODCUT}, {"woodcut", SKILL_WOODCUT}, Procure por: case SKILL_FISH: return "fishing"; Embaixo, adicione: case SKILL_WOODCUT: return "woodcutting"; 1.9: No arquivo "vocations.cpp", procure por: if(readXMLFloat(configNode, "fishing", floatValue) || readXMLFloat(configNode, "fish", floatValue)) voc->setSkillMultiplier(SKILL_FISH, floatValue); if(readXMLInteger(configNode, "fishingBase", intValue) || readXMLInteger(configNode, "fishBase", intValue)) voc->setSkillBase(SKILL_FISH, intValue); Adicione: if(readXMLFloat(configNode, "woodcutting", floatValue) || readXMLFloat(configNode, "woodcut", floatValue)) voc->setSkillMultiplier(SKILL_WOODCUT, floatValue); if(readXMLInteger(configNode, "woodcuttingBase", intValue) || readXMLInteger(configNode, "woodcutBase", intValue)) voc->setSkillBase(SKILL_WOODCUT, intValue); Procure por: skillBase[SKILL_FISH] = 20; Embaixo, adicione: skillBase[SKILL_WOODCUT] = 20; Procure por: skillMultipliers[SKILL_FISH] = 1.1f; Adicione: skillMultipliers[SKILL_WOODCUT] = 1.1f; E pronto! Editamos tudo que precisamos na source. Agora, compile para que continuemos! haha Passo 2 - Editar o OTClient: 2.1: Aqui, vamos editar as sources do OTClient. A alteração aqui será pequena, bem mais simples do que editar a source do TFS. Se você não possui as sources do OTClient, o download da versão mais recente pode ser feita clicando aqui. Na pasta "client", procure pelo arquivo "const.h". Nele, procure por: Fishing, Embaixo, adicione: Woodcutting, Pronto! Basta compilar e podemos continuar. Se você não sabe como compilar, clique aqui para Windows e aqui para Linux. 2.2: Depois de compilado, vá à pasta do client e acesse "modules\game_skills". Nesta pasta, abra o arquivo "skills.otui" pelo Notepad++ e adicione no final: SkillButton id: skillId7 SkillNameLabel !text: tr('Woodcutting') SkillValueLabel SkillPercentPanel Tome cuidado com os tabs. Se você der tab para aumentar o recuo, o OTClient NÃO irá funcionar. Use ESPAÇOS para criar esse recuo, ok? Caso contrário, o Client não conseguirá abrir a janela de Skills, seja apertando Ctrl+S ou clicando no botão "Skills". Feito isso, seu Client estará pronto! haha Passo 3 - Editar o TFS: 3.1: Na pasta do seu server, vá em "data\lib" e abra o arquivo "000-constant.lua". Nele, procure por: SKILL_FISHING = 6 Note que a id de fishing é 6 e, logo embaixo, a id de magic level é 7. Correto? A nossa nova skill irá assumir a id 7. Sendo assim, magic level passa a ter id 8; level, id 9; e experiência, id 10. Além disso, você deverá trocar o valor de "SKILL_LAST", visto que agora nossa última skill é a Woodcutting. Após todas as edições, ficará assim: SKILL_FISHING = 6 SKILL_WOODCUTTING = 7 SKILL__MAGLEVEL = 8 SKILL__LEVEL = 9 SKILL__EXPERIENCE = 10 SKILL_LAST = SKILL_WOODCUTTING Agora procure por: [SKILL_FISHING] = "fishing", Embaixo, adicione: [SKILL_WOODCUTTING] = "woodcutting", Procure por: ["fishing"] = SKILL_FISHING, ["fish"] = SKILL_FISHING, Adicione: ["woodcutting"] = SKILL_WOODCUTTING, ["woodcut"] = SKILL_WOODCUTTING, Salve o arquivo e estaremos quase prontos! 3.2: Agora precisamos editar o "vocations.xml", que estará na pasta "data\XML". Acabamos de editar as ids das skills, certo? Em vocations.xml, você precisará editar isso também, se quiser que uma determinada vocação tenha um avanço mais rápido que outras na nossa nova skill. Para isso, recomendo este tutorial do JhonatanCWest: [TUTORIAL] Explicando E Criando Vocações Lembre-se que o ID da nossa nova skill passou a ser 7. Você também, se preferir, deverá ser capaz de referenciar à nova skill da seguinte maneira: <skill fist="1.5" club="2.0" sword="2.0" axe="2.0" distance="2.0" shielding="1.5" fishing="1.1" experience="1.0" woodcutting="1.0"/> Edite todas as vocações e salve. Passo 4 - Editar a database: 4.1: Agora é a hora de editar nossa database, para que ela funcione com a nossa nova skill. Abra o SQLite Studio 2.1.4. Vá em Databases > Add Database. Na janela a seguir, selecione a database do seu servidor (extensão .s3db) e dê Ok. Agora sua database estará conectada ao SQLite Studio, como na imagem a seguir: Vá em Tables > player > Triggers e abra a trigger "oncreate_players". Haverá um código ali, certo? No final, adicione: INSERT INTO "player_skills" ( "player_id" , "skillid" , "value" ) VALUES ( NEW . "id" , 7 , 10 ) Deverá ficar assim: Feito isso, aperta "Change". Se seu servidor já possui jogadores criados, você deverá adicionar a nova skill a eles também. Sinceramente, não sou um grande conhecedor de SQL e não sei como fazer isso automaticamente. Se alguém que souber puder postar nos comentários, eu edito aqui no tópico principal! De qualquer forma, é bem simples de se fazer manualmente. Se seu servidor não possui jogadores ainda, então pule o passo 4.2. 4.2: Editando jogadores já existentes: Ainda na sua database, vá em Tables > players e dê duplo clique. Então, vá na aba "Data". Você deverá ver algo como na imagem a seguir: Você precisará verificar quantas IDs já foram criadas. No meu caso, foram 7. Feito isso, vá em Tables > players_skills e dê duplo clique. Clique na opção "Add custom number of rows" e digite a quantidade de IDs. Feito isso, dê Ok. Note que serão criadas 7 novas linhas na sua tabela. Na coluna "player_id", preencha com os valores de 1 a 7, ou o número de IDs que já existiam no seu server. Agora preencha o primeiro id criado com os valores: skillid: 7 value: 10 cont: 0 Sua tabela deverá estar assim: Veja que eu selecionei os 3 valores. Aí é só dar Ctrl + C e Ctrl + V pra preencher o restante da tabela. Quando preencher toda a tabela, pressione o botão "Commit changes": Pronto, você já configurou sua database! Pronto! Seu servidor já está configurado com a nova skill! Agora você poderá usar Lua para configurá-la! Vou dar um exemplo MUITO simples de como isso poderia ser feito em Lua: function onUse(cid, item, fromPosition, itemEx, toPosition) local logs = 0 -- Insira aqui o ID do item. No caso, o ID da madeira. doPlayerAddItem(cid,logs,1) doPlayerSendTextMessage(cid, 22, "You cut a tree.") doPlayerAddSkillTry(cid, SKILL_WOODCUTTING, 1) return true end Claro que essa action acima é algo muito simples, mas, tendo o servidor já configurado, acredito que essas modificações abram uma gama de possibilidades imensas a todos que querem desenvolver uma nova skill. Espero que tenham gostado e que o tutorial seja útil para alguém! haha Qualquer erro ou bug, me avisem! Atenciosamente, Auro Mota. Editado Maio 9, 2014 11 anos por palubo (veja o histórico de edições)
Postado Maio 9, 2014 11 anos que massa, não sabia disso ... obrigado pelo conteudo, rep+ STYLLER OT 2022
Postado Maio 9, 2014 11 anos Legal ! A um tempo atrás andei procurando tutorial sobre isso e não achei nenhum bom,obrigado por trazer um para o TK. Ajudei = REP+ Não dou suporte por PM qualquer dúvida procure no fórum,caso não encontre oque procura crie um tópico. [email protected]" /> | TFS 0.4 DEV | %5Bcreaturescript%5D Icones no minimap com descrição%5Btalkaction%5D Adicionar ou remover VIP do player.%5Bcreaturescripts%5D Senha para porta%5Btalkaction%5D Mandar mensagem para pasta do servidorMapa Evento War Castle%5Baction%5D Canoa em MovimentoTeleport Scroll System%5Bcreaturescripts%5D Recompensa por level para X vocations%5Btalkaction%5D Adicionar X item para o player%5Btalkactions%5D Adicionar item para todos players online%5Baction%5D Item que teleporta o player para house[action+movement] Passaporte para entrar no barco
Postado Maio 9, 2014 11 anos Obrigado por contribuir com o TibiaKing! É muito viável pra quem quer fazer um projeto novo e alternativo. Reputado. Skype @kaiquegabriel__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Atenciosamente, kaiquegabriel. Não dou suporte via pm. Em caso de dúvidas, crie um tópico e espere o suporte.
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.