Ir para conteúdo
  • Cadastre-se

Posts Recomendados

Venho publicar uma alteração que eu e minha equipe fizemos no script já existente do Canary.

O arquivo do script se chama quest_system1.lua.

Fizemos essa alteração, porque o sistema original não entregava chave com actionid ao jogador. A chave vinha com o código 0000, ou seja, não abria nenhuma porta.

A alteração que fizemos foi justamente para arrumar esse bug, por tanto, agora quando o quest ter uma chave com actionid dentro do baú, o jogador receberá essa mesma chave com o actionid definido.

 

local specialQuests = {
	-- {x = 32752, y = 32343, z = 14}
	[52167] = Storage.DreamersChallenge.Reward,
	-- {x = 32806, y = 32230, z = 11}
	[52003] = Storage.PitsOfInferno.WeaponReward,
	-- {x = 32311, y = 32211, z = 8}
	[51400] = Storage.ThievesGuild.Reward,
	[51324] = Storage.WrathoftheEmperor.mainReward,
	-- {x = 32232, y = 31066, z = 7}
	[51715] = Storage.SvargrondArena.RewardGreenhorn,
	-- {x = 32232, y = 31059, z = 7}
	[51716] = Storage.SvargrondArena.RewardScrapper,
	-- {x = 32232, y = 31052, z = 7}
	[51717] = Storage.SvargrondArena.RewardWarlord
}

local questsExperience = {
	[3101] = 1 -- dummy values
}

local questLog = {
	[8213] = Storage.HiddenCityOfBeregar.DefaultStart
}

local tutorialIds = {
	[50080] = 5,
	[50082] = 6,
	[50084] = 10,
	[50086] = 11
}

local hotaQuest = { 50950, 50951, 50952, 50953, 50954, 50955 }

local questSystem1 = Action()

function questSystem1.onUse(player, item, fromPosition, target, toPosition, isHotkey)
	local storage = specialQuests[item.actionid]
	if not storage then
		storage = item.uid
		if storage > 65535 then
			return false
		end
	end

	if storage == 23644 or storage == 24632 or storage == 14338 then
		player:setStorageValue(Storage.SvargrondArena.PitDoor, -1)
	end

	if player:getStorageValue(storage) > 0 and player:getAccountType() < ACCOUNT_TYPE_GOD then
		player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'The ' .. ItemType(item.itemid):getName() .. ' is empty.')
		return true
	end

	local function copyContainer(originalContainer, newContainer)
		for i = 0, originalContainer:getSize() - 1 do
			local originalItem = originalContainer:getItem(i)
			local newItem = Game.createItem(originalItem.itemid, originalItem.type)
			newItem:setActionId(originalItem:getActionId())
			newItem:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, originalItem:getAttribute(ITEM_ATTRIBUTE_DESCRIPTION))

			if originalItem:isContainer() then
				copyContainer(Container(originalItem.uid), Container(newItem.uid))
			end

			newContainer:addItemEx(newItem)
		end
	end

	local items, reward = {}
	local size = item:isContainer() and item:getSize() or 0
	if size == 0 then
		local actionId = item:getActionId()
		reward = Game.createItem(item.itemid, item.type)
		reward:setActionId(actionId)
		reward:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, item:getAttribute(ITEM_ATTRIBUTE_DESCRIPTION))
	else
		local container = Container(item.uid)
		for i = 0, container:getSize() - 1 do
			local originalItem = container:getItem(i)
			local newItem = Game.createItem(originalItem.itemid, originalItem.type)
			newItem:setActionId(originalItem:getActionId())
			newItem:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, originalItem:getAttribute(ITEM_ATTRIBUTE_DESCRIPTION))

			if originalItem:isContainer() then
				copyContainer(Container(originalItem.uid), Container(newItem.uid))
			end

			items[#items + 1] = newItem
		end

		if size == 1 then
			reward = items[1]
		end
	end

	local result = ''
	if reward then
		local ret = ItemType(reward.itemid)
		if ret:isRune() then
			result = ret:getArticle() .. ' ' .. ret:getName() .. ' (' .. reward.type .. ' charges)'
		elseif ret:isStackable() and reward:getCount() > 1 then
			result = reward:getCount() .. ' ' .. ret:getPluralName()
		elseif ret:getArticle() ~= '' then
			result = ret:getArticle() .. ' ' .. ret:getName()
		else
			result = ret:getName()
		end
	else
		if size > 20 then
			reward = Game.createItem(item.itemid, 1)
		elseif size > 8 then
			reward = Game.createItem(2854, 1)
		else
			reward = Game.createItem(2853, 1)
		end

		for i = 1, size do
			local tmp = items[i]
			if reward:addItemEx(tmp) ~= RETURNVALUE_NOERROR then
				Spdlog.warn("[questSystem1.onUse] - Could not add quest reward to container")
			end
		end
		local ret = ItemType(reward.itemid)
		result = ret:getArticle() .. ' ' .. ret:getName()
	end

	if player:addItemEx(reward) ~= RETURNVALUE_NOERROR then
		local weight = reward:getWeight()
		if player:getFreeCapacity() < weight then
			player:sendCancelMessage(string.format('You have found %s weighing %.2f oz. You have no capacity.', result,
				(weight / 100)))
		else
			player:sendCancelMessage('You have found ' .. result .. ', but you have no room to take it.')
		end
		return true
	end

	if questsExperience[storage] then
		player:addExperience(questsExperience[storage], true)
	end

	if questLog[storage] then
		player:setStorageValue(questLog[storage], 1)
	end

	if tutorialIds[storage] then
		player:sendTutorial(tutorialIds[storage])
		if item.uid == 50080 then
			player:setStorageValue(Storage.RookgaardTutorialIsland.SantiagoNpcGreetStorage, 3)
		end
	end

	if isInArray(hotaQuest, item.uid) then
		if player:getStorageValue(Storage.TheAncientTombs.DefaultStart) ~= 1 then
			player:setStorageValue(Storage.TheAncientTombs.DefaultStart, 1)
		end
	end

	player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You have found ' .. result .. '.')
	player:setStorageValue(storage, 1)
	return true
end

for index, value in pairs(specialQuests) do
	questSystem1:aid(index)
end

questSystem1:aid(2000)
questSystem1:register()

 

Link para o post
Compartilhar em outros sites

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

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • Por Under
      Tutorial Completo: Como Adicionar uma Nova Vocação no Canary Server
       
       
       
       
       
      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 };  
       
       
       
       
      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,         ...     } }  
       
       
       
       
      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  
       
       
       
       
      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>  
       
       
       
       
      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.
       
       
    • Por Mateus Robeerto
      Eu estava trabalhando neste sistema apenas por diversão, mas acabei gostando muito dele. Quem se lembra dos velhos dias do TFS 0.x, 0.3.6 e 0.4, quando você podia usar o comando !create guild name para convidar outros jogadores? Bons tempos!

      Decidi compartilhá-lo com a comunidade tibiaking. Está funcionando e foi testado na versão 1.4.2 (build 1098). Acredito que deve funcionar a partir da versão 1.3+ em diante.

      Aqui estão as imagens..
      .Guild_System _ Classic_Style.lua
    • Por chateadoagr
      Bem-vindo ao Genesis Online Tibia (GOT), um mundo onde a civilização foi devastada por um apocalipse zumbi. Inspirado em referências como The Walking Dead e Resident Evil, o GOT desafia você a sobreviver em meio ao caos, enfrentando hordas de mortos-vivos, explorando ruínas perigosas e formando alianças estratégicas. Embarque nesta jornada épica de sobrevivência e descoberta, onde cada escolha molda seu destino em um cenário hostil repleto de desafios e perigos iminentes.
       
       
      Adentre o universo de Genesis Online Tibia (GOT), um jogo repleto de sistemas inovadores e emocionantes. Equipe-se com um vasto arsenal de armas para enfrentar as ameaças do apocalipse zumbi, enquanto o sistema autoloot simplifica suas conquistas. Desenvolva seu personagem através de um sistema de upgrade único, aprimorando habilidades e atributos para enfrentar desafios cada vez mais formidáveis.
       
      Explore um mundo imersivo onde o som desempenha um papel crucial, criando uma atmosfera envolvente e realista. Vasculhe cada canto em busca de recursos vitais, desvendando segredos e tesouros ocultos. Siga uma cativante história através de missões que expandem o enredo, revelando os mistérios por trás do apocalipse e oferecendo recompensas valiosas.
       
      Em Genesis Online Tibia, a jornada pela sobrevivência é repleta de ação, estratégia e emoção, convidando você a se aventurar em um mundo onde cada decisão molda seu destino e determina sua capacidade de enfrentar os desafios que aguardam.

      Em breve imagens do servidor!
       
       
    • Por cloudrun2023
      CloudRun - Sua Melhor Escolha para Hospedagem de OTServer!
      Você está procurando a solução definitiva para hospedar seu OTServer com desempenho imbatível e segurança inigualável? Não procure mais! Apresentamos a CloudRun, sua parceira confiável em serviços de hospedagem na nuvem.
       
      Recursos Exclusivos - Proteção DDoS Avançada:
      Mantenha seu OTServer online e seguro com nossa robusta proteção DDoS, garantindo uma experiência de jogo ininterrupta para seus jogadores.
       
      Servidores Ryzen 7 Poderosos: Desfrute do poder de processamento superior dos servidores Ryzen 7 para garantir um desempenho excepcional do seu OTServer. Velocidade e estabilidade garantidas!
       
      Armazenamento NVMe de Alta Velocidade:
      Reduza o tempo de carregamento do jogo com nosso armazenamento NVMe ultrarrápido. Seus jogadores vão adorar a rapidez com que podem explorar o mundo do seu OTServer.
       
      Uplink de até 1GB:
      Oferecemos uma conexão de alta velocidade com até 1GB de largura de banda, garantindo uma experiência de jogo suave e livre de lag para todos os seus jogadores, mesmo nos momentos de pico.
       
      Suporte 24 Horas:
      Estamos sempre aqui para você! Nossa equipe de suporte está disponível 24 horas por dia, 7 dias por semana, para resolver qualquer problema ou responder a qualquer pergunta que você possa ter. Sua satisfação é a nossa prioridade.
       
      Fácil e Rápido de Começar:
      Configurar seu OTServer na CloudRun é simples e rápido. Concentre-se no desenvolvimento do seu jogo enquanto cuidamos da hospedagem.
       
      Entre em Contato Agora!
      Website: https://central.cloudrun.com.br/index.php?rp=/store/cloud-ryzen-brasil
      Email: contato@cloudrun.com.br
      Telefone: (47) 99902-5147

      Não comprometa a qualidade da hospedagem do seu OTServer. Escolha a CloudRun e ofereça aos seus jogadores a melhor experiência de jogo possível. Visite nosso site hoje mesmo para conhecer nossos planos e começar!
       
      https://central.cloudrun.com.br/index.php?rp=/store/cloud-ryzen-brasil
       
      CloudRun - Onde a Velocidade Encontra a Confiabilidade!
       

    • Por PokemonXdemon
      [Quest System]
       
       
      Estava ontem analisando minha base, aonde tinha várias quests em arquivos separados.
      Então, pq não organizar tudo em apenas um arquivo exemplo:
      Então fiz esse script, meio simples mas útil para organizar tudo.
       
       
      Agora vamos entender oq precisamos fazer!
       
       Uma pequena atualização,  agora fica em um lugar separado a configuração para ficar mais  fácil modificar.
      Agora pode adicionar o boost que voce deseja no pokemon.
       
      Bem é isso.
  • Estatísticas dos Fóruns

    96843
    Tópicos
    519605
    Posts
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo