Postado Abril 24, 2025 Abr 24 Tutorial Completo: Como Adicionar uma Nova Vocação no Canary Server Citar Objetivo: Este guia detalhado explica como criar e configurar novas vocações (exemplo: Warrior e Elite Warrior) no Canary Server, abordando também a lógica por trás do sistema de vocações. 1. Entendendo a Lógica das Vocações No servidor Canary, cada vocação representa uma classe de personagem com habilidades, atributos e características específicas. Para que o servidor reconheça uma nova vocação, é necessário: - Definir um identificador único (ID); - Registrar o ClientID (usado para exibição no cliente); - Especificar um BaseID (para herança de características ou evolução); - Configurar atributos, fórmulas e habilidades no XML. 2. Alterando a Enumeração das Vocações (Código Fonte C++) Arquivo: `src/creatures/creatures_definitions.hpp` Adicione os novos IDs no enum `Vocation_t`: enum Vocation_t : uint16_t { VOCATION_NONE = 0, VOCATION_SORCERER = 1, VOCATION_DRUID = 2, VOCATION_PALADIN = 3, VOCATION_KNIGHT = 4, VOCATION_MASTER_SORCERER = 5, VOCATION_ELDER_DRUID = 6, VOCATION_ROYAL_PALADIN = 7, VOCATION_ELITE_KNIGHT = 8, VOCATION_WARRIOR = 9, VOCATION_ELITE_WARRIOR = 10, VOCATION_LAST = VOCATION_ELITE_WARRIOR }; Citar A constante `VOCATION_LAST` deve sempre apontar para o último ID definido para evitar problemas de indexação interna. 3. Atualizando o Script de Vocações (Lua) Arquivo: `data/libs/vocation.lua` Adicione os novos valores nas três seções do objeto `VOCATION`: VOCATION = { ID = { WARRIOR = 9, ELITE_WARRIOR = 10, ... }, CLIENT_ID = { WARRIOR = 0, ELITE_WARRIOR = 0, ... }, BASE_ID = { WARRIOR = 5, ... } } Citar `CLIENT_ID` com valor 0 indica que a vocação será exibida como "None" na seleção de personagem, mas isso não afeta o jogo em si. `BASE_ID` é usado para definir herança de habilidades e características entre vocações. 4. Criando Função de Verificação da Nova Vocação Arquivo: `data/libs/functions/player.lua` Adicione a seguinte função no final do arquivo: function Player.isWarrior(self) return table.contains({VOCATION.ID.WARRIOR, VOCATION.ID.ELITE_WARRIOR}, self:getVocation():getId()) end Citar Essas funções são úteis para aplicar lógicas específicas por vocação em spells, quests ou sistemas customizados. 5. Configurando as Vocações no XML Arquivo: `data/XML/vocations.xml` Adicione o bloco de cada nova vocação com os atributos desejados: <vocation id="9" clientid="0" baseid="5" name="Warrior" description="a warrior" magicshield="0" gaincap="25" gainhp="15" gainmana="5" gainhpticks="4000" gainhpamount="1" gainmanaticks="6000" gainmanaamount="2" manamultiplier="3.0" attackspeed="2000" basespeed="110" soulmax="200" gainsoulticks="15000" fromvoc="5"> <formula meleeDamage="1.0" distDamage="1.0" defense="1.0" armor="1.0" /> <skill id="0" multiplier="1.1" /> <skill id="1" multiplier="1.1" /> <skill id="2" multiplier="1.1" /> <skill id="3" multiplier="1.1" /> <skill id="4" multiplier="1.4" /> <skill id="5" multiplier="1.1" /> <skill id="6" multiplier="1.1" /> </vocation> <vocation id="10" clientid="0" baseid="6" name="Elite Warrior" description="an elite warrior" magicshield="0" gaincap="25" gainhp="15" gainmana="5" gainhpticks="4000" gainhpamount="1" gainmanaticks="6000" gainmanaamount="2" manamultiplier="3.0" attackspeed="2000" basespeed="110" soulmax="200" gainsoulticks="15000" fromvoc="5"> <formula meleeDamage="1.0" distDamage="1.0" defense="1.0" armor="1.0" /> <skill id="0" multiplier="1.1" /> <skill id="1" multiplier="1.1" /> <skill id="2" multiplier="1.1" /> <skill id="3" multiplier="1.1" /> <skill id="4" multiplier="1.4" /> <skill id="5" multiplier="1.1" /> <skill id="6" multiplier="1.1" /> </vocation> Citar Esses atributos definem como a vocação evolui: vida/mana por level, velocidade de ataque, ganho de soul, atributos de combate, etc. 6. Compilando o Servidor Após todas as alterações, é obrigatório recompilar o servidor para que as novas vocações sejam reconhecidas corretamente. Conclusão: Ao seguir todos os passos, suas novas vocações estarão totalmente integradas ao servidor. Você poderá usá-las para personagens. Contato :https://www.linkedin.com/in/rafhael-oliveira/Projetos :https://github.com/thetibiaking
Postado Abril 7 Abr 7 Boa tarde, gostaria de solicitar uma ajuda relacionada ao tutorial, na data em que me forneceu a ajuda eu estava mexendo com esse servidor, cheguei a testar rapidamente o tutorial e a principio funcionou bem, fiz o passo a passo e deu certo, voltei recentemente a mexer nesse servidor e ao testar novamente sobre a segunda promotion, ao falar com qualquer npc de promotion, seja King Tibianus ou Queen Eloise ou qualquer outro que venda promotion, ele ate chega a promover o player para a primeira promotion, que no caso como ex: knight recebe elite knight, porem se o player desloga quando volta ele está promovida para a segunda promotion. Nio caso tital blader. testei fazer um item que adiciona a pimeira vocation e outro que adiciona a segunda promotion e funcionou corretamente. porem eu gostaria de deixar pelos npc's mesmo.Estou usando mapa global servidor Canary versão 3.1.2 Obs: segui o tutorial de como adicionar a seguinda promotion acima. recompilei oi servidor. porem no npc de promotion nao mexi.Desde já agradeço!Parte de promotion do npc king tibianus[spoiler]-- Promotionlocal node1 = keywordHandler:addKeyword({ "promot" }, StdModule.say, { npcHandler = npcHandler, onlyFocus = true, text = "I can promote you for 20000 gold coins. Do you want me to promote you?",})node1:addChildKeyword({ "yes" }, StdModule.promotePlayer, { npcHandler = npcHandler, cost = 20000, level = 20, text = "Congratulations! You are now promoted.",})node1:addChildKeyword({ "no" }, StdModule.say, { npcHandler = npcHandler, onlyFocus = true, text = "Alright then, come back when you are ready.", reset = true,})[/spoiler]Script que usei e funcionou para primeira promotion via action[spoiler]local action = Action()function action.onUse(player, item, fromPosition, target, toPosition, isHotkey) local vocation = player:getVocation():getId() if vocation >= 1 and vocation <= 4 then player:setVocation(vocation + 4) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You've been promoted! Congratulations!") player:getPosition():sendMagicEffect(CONST_ME_FIREWORK_YELLOW) item:remove() else player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You already have a promotion or cannot use this item.") player:getPosition():sendMagicEffect(CONST_ME_BLOCKHIT) end return trueendaction:id(13550)action:register()[/spoiler]Script que usei e funcionou para segunda promotion via action[spoiler]local action = Action()function action.onUse(player, item, fromPosition, target, toPosition, isHotkey) local vocation = player:getVocation():getId() if vocation >= 5 and vocation <= 8 then player:setVocation(vocation + 4) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You've been promoted to Supreme Vocation! Congratulations!") player:getPosition():sendMagicEffect(CONST_ME_FIREWORK_YELLOW) item:remove() else player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You do not have the correct vocation or are already at the maximum promotion level.") player:getPosition():sendMagicEffect(CONST_ME_BLOCKHIT) end return trueendaction:id(13560) -- ID do item que ativa a açãoaction:register()[/spoiler]
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.