Ir para conteúdo

Featured Replies

Postado
  • 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!  :D

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.  :P

Preview de uma skill que criei para meu projeto:

crafting_zps6dbad9ab.png

 

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.  :P

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  :D

 

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!  :D 

 

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:

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.

 

database_zps0bed0e55.png

 

Agora sua database estará conectada ao SQLite Studio, como na imagem a seguir:

 

database_zps75ad6f95.png

 

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:

database_zpsb393f8e6.png

 

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:

database_zpsc1cd76bc.png

 

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.

database_zpse883069a.png

 

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.  :P

Agora preencha o primeiro id criado com os valores:

skillid: 7
value: 10
cont: 0

Sua tabela deverá estar assim:

database_zpsd7f9a5c2.png

 

Veja que eu selecionei os 3 valores. Aí é só dar Ctrl + C e Ctrl + V pra preencher o restante da tabela. :P

Quando preencher toda a tabela, pressione o botão "Commit changes":

database_zpsa5a42bec.png

 

Pronto, você já configurou sua database!

 

Pronto! Seu servidor já está configurado com a nova skill! Agora você poderá usar Lua para configurá-la!  :D

 

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 por palubo (veja o histórico de edições)

  • Respostas 13
  • Visualizações 6.5k
  • Created
  • Última resposta

Top Posters In This Topic

Postado

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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo