Ir para conteúdo
  • Cadastre-se

Posts Recomendados

Olá, tenho alma de compartilhador de conhecimento, assim como peguei algumas coisas daqui, sinto que devo também.

 

Meu parceiro pediu-me que fizesse com que as quests dele tivessem seu funcionamento no TFS 1.0 assim como em um servidor que baixara a muito tempo. Eu olhei o script e era uma zona total, não entendi nada e resolvi escrever um do jeito que eu entendo por programação.

 

O que ele gostaria é que tivesse o poder de criar quests, do modo antigo do tibia, apenas você e o baú, pelo próprio editor. Com essa maneira, ele simplesmente coloca qualquer container no mapa, mas pera aí, o que é um container para um código de OT? É qualquer coisa que possa carregar em dentro de si, uma ou mais de uma outra coisa. Corpos mortos, baús, etc.

 

Note que caso o container, por exemplo um baú, seja para beneficar o jogador com mais de um item, é necessário criar um outro container dentro deste e adicionar os itens dentro desse último container criado. Um exemplo: para uma quest que dê 10 cerejas e 10 pães crie um baú com uma bag dentro, dentro da bag adicione as 10 cerejas e os 10 pães.

 

Mãos a obra.

 

Copie o código abaixo para um arquivo com qualquer nome desejável, eu o nomeei de "editor.lua"

function onUse(cid, item, fromPosition, itemEx, toPosition)
	local container = Container(item.uid)
	local player = Player(cid)

	if player:getStorageValue(item.uid) == -1 then

		local questReward = container:getItem(0)
		local questRewardName = questReward:getType():getName()

		local weight = 0;

		if questReward:isContainer() then
			weight = questReward:getWeight()
		else
			weight = questReward:getType():getWeight(questReward:getCount())
		end
		
		local freecap = player:getFreeCapacity()

		if freecap >= weight then
			local reward = questReward:clone()
			local result = player:addItemEx(reward)
			
			if result ~= RETURNVALUE_NOERROR then
				player:sendTextMessage(MESSAGE_INFO_DESCR, 'You have not enough room.')
			else
				player:sendTextMessage(MESSAGE_INFO_DESCR, 'You have found a ' .. questRewardName .. '.')
				player:setStorageValue(item.uid, 1)
			end
		else
			player:sendTextMessage(MESSAGE_INFO_DESCR, 'You have found a ' .. questRewardName .. ' weighing ' .. string.format("%.2f", weight) .. ' oz. It\'s too heavy.')
		end

	else

		player:sendTextMessage(MESSAGE_INFO_DESCR, "It is empty.")

	end

	return true
end 

Neste outro passo tu podes seguir dois caminhos, o primeiro e o mais correto é uma alteração no código fonte do forgottenserver. Então, desta forma, se for a preferia por ti. Faça:

 

No arquivo luascript.h, logo após a linha de número 744, ou procure algo parecido com:

static int32_t luaContainerGetSize(lua_State* L);
static int32_t luaContainerGetCapacity(lua_State* L);
static int32_t luaContainerGetEmptySlots(lua_State* L); 

adicione uma nova linha com o seguinte:

static int32_t luaContainerGetWeight(lua_State* L);

No arquivo luascript.cpp, logo após a linha de número 2100, ou procure algo parecido com:

registerMethod("Container", "getSize", LuaScriptInterface::luaContainerGetSize);
registerMethod("Container", "getCapacity", LuaScriptInterface::luaContainerGetCapacity);
registerMethod("Container", "getEmptySlots", LuaScriptInterface::luaContainerGetEmptySlots);

adicione uma nova linha com o seguinte:

registerMethod("Container", "getWeight", LuaScriptInterface::luaContainerGetWeight);

Ainda em luascript.cpp, logo após a linha de número 6895, ou procure algo parecido com:

int32_t LuaScriptInterface::luaContainerGetEmptySlots(lua_State* L)

Logo após essa função (não a linha), insira o código abaixo:

int32_t LuaScriptInterface::luaContainerGetWeight(lua_State* L)
{
	// container:getWeight()
	Container* container = getUserdata<Container>(L, 1);
	if (!container) {
		lua_pushnil(L);
		return 1;
	}

	double weight = container->getWeight();
	lua_pushnumber(L, weight);

	return 1;
}

E qual o motivo de eu preferir ter este código no lado do servidor compilado? Desempenho. O peso do container é guardado em memória e acessado diretamente, não há qualquer conta com inúmeras multiplicações ou funções recursivas.

 

Mas caso esteja de mal humor e não queira compilar um servidor, terá que construir uma função da qual eu particularmente não gosto:

function getWeight(item)
	local totalWeight = 0;
	
	if item:isContainer() then
		local size = item:getSize()
		for i = 0, size - 1 do
			totalWeight = totalWeight + getWeight(item:getItem(i))
		end
	else
		totalWeight = totalWeight + item:getType():getWeight(item:getCount())
	end
	
	return totalWeight;
end

Coloque este código, essa função, antes da função onUse dentro de editor.lua

 

E troque aonde diz 

questReward:getWeight()

por

getWeight(questReward) 

Para terminar e fechar logo, não esqueça de adicionar o action id , eu normalmente uso 2000 pra esta actionId. É importante também lembrar que o UniqueId do baú deve ser ÚNICO em todo seu servidor, apenas dessa forma poderemos saber quais baús o jogador já abriu e conseguiu a recompensa.

 

Agora, vá aos testes meu querido! Salve todos os scripts, se tiver que compilar o servidor, vá e faça isso. Coloque um baú no seu mapa com um item apenas dentro, se tu colocares mais do que um item, apenas o primeiro será considerado, assim como pode ser visto na linha:

local questReward = container:getItem(0)

Dessa forma, caso seja necessário vários itens, lembre-se, uma bag, backpack, qualquer container com os itens dentro.

 

Agora seja criativo, crie corpos de dragões, humanos, esqueletos, coloque chaves dentro de caixas, livros importantes na biblioteca, entre várias oportunidades.

 

E então, o que acharam?

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 Glacial
      Boa tarde galera, tudo bem?
       
      Meu nome é Gustavo/Glacial, gostaria de compartilhar com a comunidade meu projeto solo no RME 3.5 /Client 10.98 do Tibia.
      Glacial City, com houses, hunts, lojas, quests, bosses e depot.

      Os teleportes já estão redirecionados, falta apenas itens nos baús das quests.
       
      Espero que curtam e podem baixar pra colocar no ot de vocês!
       
      Atualização versão 2.0:
      - Houses na cidade
      - Hive Lair (Lady Bug)
      - Silencer & Frazzle/Guzzlemaw Hunt
      - Drakens + Demons Hunt (área maior)
       
      Links MediaFire e VirusTotal:
      Download Mapas: https://www.mediafire.com/folder/hz0q694t9nk86/Mapas_Glacial
      versão 1.0 Virus Total: https://www.virustotal.com/gui/file/b4e94903752e24aba63b291f9929f15f6bd7f4feb44d5a1f42ec3d755ee7977e?nocache=1
      versão 2.0 Virus Total: https://www.virustotal.com/gui/file/d88ae087e966bed6e2f2348f31246c1858831c1fb13d4e8613ba98f6ede37503?nocache=1
       
      Segue fotos em anexo.
       

       

       

       
       
       

       

       

    • Por Imperius
      Olá, pessoal! Acabei encontrando um script que tinha feito a um tempo atrás. Estou compartilhando aqui para quem quiser usar ou melhorar.
       
      É bem parecido com os outros sistemas de roleta, igual deste tópico: https://tibiaking.com/forums/topic/101557-action-cassino-roleta-de-items/
       
      Como funciona?
       
      O "Treasure Chest" é um item custom, onde o jogador têm a possibilidade de ganhar itens raros ou bem meia boca. Tudo dependerá da sorte.
       
      O jogador precisa tacar o treasure chest na bancada e acionar a alavanca. O treasure chest irá se transformar em vários itens de forma randômica no qual o jogador poderá ou não ganhar. No final, apenas um item é entregue ao jogador.
       
      Para entender melhor o seu funcionamento, segue o GIF abaixo:
       

       
       
      em data > actions > actions.xml
       
       
      em data > actions > scripts > crie um arquivo chamado leverTreasureChest.lua
       
       
      no banco de dados do servidor, adicione o seguinte código em "SQL":
       
       
       

      Também estou disponibilizando uma página PHP, para quem quiser usar no site do servidor. Na página tem informações sobre o funcionamento, quais são os possíveis prêmios e a lista de jogadores que ganharam os itens raros.
       

       
       
      Espero ter ajudado de alguma forma! : )
       
      treasure_chest.php
    • 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
      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()  
    • Por Anderson Sacani
      local config = { scrollId = 14758, premiumDays = 30, } local days = config.premiumDays local premiumScroll = Action() function premiumScroll.onUse(player, item, fromPosition, target, toPosition, isHotkey) player:addPremiumDays(days) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Voce recebeu " .. days .. " dias de conta premium.") item:remove(1) addEvent(function() if player:isPlayer() then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "No total voce tem " .. player:getPremiumDays() .. " dias de conta premium.") end end, 2500) return true end premiumScroll:id(config.scrollId) premiumScroll:register() Percebi que alguns servidores estão vindo sem o script do premium scroll, então criei esse script para adicionar 30 dias de premium na conta do jogador que usar o premium scroll.
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo