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 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: [email protected]
      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 luanluciano93
      Olá galera, em 02/12/23 o projeto Canary atualizou seu release para a versão 3.1.2 e como estou desenvolvendo um servidor usando esta base decidi divulga-la, pois a cada dia ela melhor muito, é um projeto promissor.

      Para quem não conhece, Canary é um projeto desenvolvido no github de um servidor completo na versão 13.21 (atualmente) com todas as features do tibia global. Ele tem duas opções de datapack que seriam o global e um custom.

      Aqui está o link do projeto para quem quiser conhecer melhor: https://github.com/opentibiabr/canary
      Aqui está o link do lançamento do release para a versão 3.1.2 e suas mudanças e melhorias: https://github.com/opentibiabr/canary/compare/v3.1.1...v3.1.2
      Aqui está o link do discord do projeto para dúvidas e etc: https://discord.com/invite/gvTj5sh9Mp
      Aqui está o link de tutoriais e a documentação do projeto: https://docs.opentibiabr.com/home/welcome

      Algumas das features existentes no projeto:

      BOOSTED CREATURE:

       
      EVENT SCHEDULE:

       
      CYCLOPEDIA:

       
      CHARMS:

       
      DAILY REWARD: 

       
      PREY:

       
      IMBUEMENTS:

       
      MARKET:

       
      STORE:

       
      CUSTOM CHARACTERS:


       
      DENTRE MUITOS OUTROS!
    • 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.
    • Por Anderson Sacani
      Bom dia!
      Estava de bobeira agora pela manhã e resolvi brincar um pouco.
      Criei um script de SD no qual se for noite, ela retornará um valor X de dano, e, se for dia, ela retornará um valor Y de dano.
      Estou compartilhando esse script para vocês terem como base e usarem até mesmo em outros:
       
      local config = { damageDay = { min = 0.70, max = 0.75 }, damageNight = { min = 0.95, max = 1 }, hourStartDay = 6, hourEndDay = 18 } local combat = Combat() combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE) combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA) combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SUDDENDEATH) function onGetFormulaValues(player, level, maglevel) local min, max = ((level / 5) + (maglevel * 4.605)), ((level / 5) + (maglevel * 7.395)) local hour = tonumber(os.date("%H", os.time())) -- Obtém a hora atual -- Define o valor do dano com base na hora do dia if hour >= config.hourStartDay and hour < config.hourEndDay then -- Dia min = min * config.damageDay.min max = max * config.damageDay.max else -- Noite min = min * config.damageNight.min max = max * config.damageNight.max end return -min, -max end combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") local rune = Spell("rune") function rune.onCastSpell(creature, var, isHotkey) return combat:execute(creature, var) end rune:group("attack") rune:name("sudden death rune") rune:runeId(3155) rune:allowFarUse(true) rune:charges(3) rune:level(45) rune:magicLevel(15) rune:cooldown(2 * 1000) rune:groupCooldown(2 * 1000) rune:needTarget(true) rune:isBlocking(true) -- True = Solid / False = Creature rune:register()  
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo