Ir para conteúdo
  • Cadastre-se

Posts Recomendados

Parabéns, seu tópico de conteúdo foi aprovado!
Muito obrigado pela sua contribuição, nós do Tibia King agradecemos.
Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP.

Spoiler

Congratulations, your content has been approved!
Thank you for your contribution, we of Tibia King we are grateful.
Your content will help many other users, you received +1 REP.

 

Compre seus Scripts Agora totalmente seguro e de forma rápida, aceitamos também encomendas.

discord.gg/phJZeHa2k4

 

Projeto ATS (Naruto)

Informações Abaixo

Facebook

Youtube
Discord

 

Tutoriais / Conteúdos

Clique Aqui

Link para o post
Compartilhar em outros sites

@Lyu Eu achei o sistema bem diferente e a ideia é boa (os esquemas de double click, exaustão, etc. também, bem completo), da pra fazer uma salinha separada no templo com alavancas, podendo cair diferentes tipos de itens. Vou compartilhar seu conteúdo na página para mais pessoas visualizarem, usarem ou trazerem feedback!

Obrigado pela contribuição!

Link para o post
Compartilhar em outros sites
1 hora atrás, Daniel disse:

@Lyu Eu achei o sistema bem diferente e a ideia é boa (os esquemas de double click, exaustão, etc. também, bem completo), da pra fazer uma salinha separada no templo com alavancas, podendo cair diferentes tipos de itens. Vou compartilhar seu conteúdo na página para mais pessoas visualizarem, usarem ou trazerem feedback!

Obrigado pela contribuição!

 

Muito obrigado, @Daniel! <3

Link para o post
Compartilhar em outros sites

@Lyu Seu lindo kkk <3 muito bom o script... parabéns doido tmj ^^ 

Link para o post
Compartilhar em outros sites
1 hora atrás, tataboy67 disse:

@Lyu Seu lindo kkk <3 muito bom o script... parabéns doido tmj ^^ 

 

haha valeu @tataboy67, tamo junto! <3

Link para o post
Compartilhar em outros sites
  • 2 weeks later...
Em 08/09/2018 em 17:15, Lyu disse:

Fala clã, há um tempo soltei um sistema privado meu no grupo do TK no Discord e hoje resolvi soltar aqui no Fórum também, abaixo irei explicar um pouquinho sobre esse sistema.

 

O que é Legendary Lever?

É um sistema de alavancas que vendem itens (aleatórios), similar à uma surprise bag, porém cada item possui x porcento de chances de dropar ao jogador que estiver pagando para tentar a sorte.

 

Qual o objetivo afinal?

Bom, na época que desenvolvi esse sistema, era para um cliente meu que acabou desistindo da compra quando eu estava prestes a começar a desenvolver. O objetivo do cara era criar 5 alavancas, onde cada alavanca teria pelo menos 1 item lendário com 3% de chance de dropar ao jogador que estivesse puxando a alavanca, e cada alavanca teria entre 5 a 7 itens ao todo (a maioria itens simples). Mas a ideia por trás de tudo era lucrar com isso, fazer jogadores donatarem mais para poder tentar pegar esses itens lendários (claro, o cara ia ter que gastar muito pra isso). Terminou que resolvi desenvolver esse sistema com proteção contra duplo click, exaustão, logs de ações, etc.

 

Em qual versão posso utilizar esse sistema?

Esse sistema foi programado para rodar em TFS 1.x. Se vocês quiserem, em breve posso converter para 0.4 e trazer ao Fórum, mas aí vai depender do feedback ;)

 

Sem mais delongas, vamos ao sistema!

antes de tudo, crie uma pasta chamada legendarylever em data/actions/scripts, e dentro da legendarylever crie outra pasta chamada lib.

 

data/actions/scripts/legendarylever/lib/lib.lua :

  Mostrar conteúdo oculto


-- Legendary Lever was developed by lyu (Legendary Lever now is public)

if not randomitems then
	
	randomitems = {}	
	
	function randomitems:saveLog(...)
		local message = '[%s] %s has found %s %s\n'		
		local file = io.open('data/logs/randomitems/' .. ... .. '.log', 'a')
		
		if not file then
			return
		end

		io.output(file)
		io.write(message:format(os.date('%d/%m/%Y %H:%M'), ...))
		io.close(file)
	end
	
	function randomitems:random(p, obj, exhaust, item)
		if not rawequal(type(obj), 'table') then
			return error('table of items not found.')
		end
				
		if not p:getGroup():getAccess() then
			
			-- double-click protect
			if obj.exhaust and obj.exhaust > os.time() then
				return p:getMoney() >= obj.coust and p:sendCancelMessage('Lever exhausted for ' .. obj.exhaust - os.time() ..' seconds.') or true
			end	
			
			-- the exhaust of x object is global for all players
			obj.exhaust = os.time() + (not exhaust and 2 or exhaust)
			
			if obj.onlypremium and not p:isPremium() then
				return p:say('Sorry, only premium players can use this lever.', TALKTYPE_MONSTER_SAY)
			end
			
			if not p:removeMoney(obj.coust) then		
				return p:say('Payment fail, you need ' .. obj.coust .. ' gold coins.', TALKTYPE_MONSTER_SAY)
			end
			
			if exhaust > 1 then
				item:transform(item.itemid + 1)
				
				addEvent(function()
					item:transform(item.itemid - 1)
				end, ((obj.exhaust - os.time())-1) * 1000)
			end
			
		end
		
		-- this function is necessary to repeat the loop if the result was nil
		local function randomize()
		
			for _, it in ipairs(obj) do
				if it.chance>=100-(math.random()*100) then
					local item = p:addItem(it.itemid, it.amount)
					local name = not rawequal(type(item), 'table') and item:getName() or item[1]:getName()
					
					self:saveLog(p:getName(), it.amount, name)
					p:save() -- [security] save player	
					
					if it.broadcast then
						local msg = '[Legendary Levers] %s has found %s %s.'
						
						if not p:getGroup():getAccess() then	
						
							Game.broadcastMessage(msg:format(p:getName(), rawequal(it.amount, 1) and 'a' or it.amount, name .. '' .. (it.amount > 1 and 's' or '')), MESSAGE_EVENT_ADVANCE)
						end
					end	 
					
					p:sendTextMessage(MESSAGE_INFO_DESCR, 'Congratulations, you have found ' .. (rawequal(it.amount, 1) and 'a' or it.amount) .. ' ' .. name .. '' .. (it.amount > 1 and 's.' or '.'))									
					return not p:isInGhostMode() and p:getPosition():sendMagicEffect(it.broadcast and 7 or 15)
				end
			end
			
			-- repeat
			randomize()
		end
		
		-- called by self:random(...)
		randomize()
		
		return true
	end

else
	
	error('>> randomitems/lib.lua loading failed.')
end

 

 

agora abra data/lib/lib.lua e inclua esta linha :


dofile('data/actions/scripts/legendarylever/lib/lib.lua')

 

Feito isso, você já pode começar a criar os arquivos das alavancas. Vamos então criar a nossa primeira alavanca!

 

data/actions/scripts/legendarylever/royalcrossbow.lua :

  Mostrar conteúdo oculto


-- Legendary Lever was developed by lyu (Legendary Lever now is public)

local lever = {

	{itemid = 8851, amount = 1, chance = 5, broadcast = true},
	{itemid = 8300, amount = 1, chance = 12, broadcast = false},
	{itemid = 9971, amount = 50, chance = 25, broadcast = false},
	{itemid = 7253, amount = 1, chance = 65, broadcast = false},
}

lever.onlypremium = false
lever.coust = 10000


function onUse(player, item) return randomitems:random(player, lever, 2, item) end

 

 

data/actions/actions.xml :


<action actionid="3370" script="legendarylever/royalcrossbow.lua"/>

 

E por fim, adicione a actionid 3370 em uma alavanca no Remere's Map Editor! ?

 

Para criar novas alavancas, você já deve saber o que se fazer. Sim! CTRL + C CTRL + V no arquivo royalcrossbow.lua, renomea o nome, edite a tabela de itens, preços, premium etc e adicione a tag no XML com uma nova actionid (a actionid põe em uma nova alavanca no Remere's).

 

A configuração não preciso nem explicar né! A única dica que dou, é deixar brodacast = true apenas nos itens mais difíceis de dropar, ou seja, os lendários. Porque isso irá anunciar ao servidor todo que aquele player conseguiu o danado do item haha ?

 

Então é isso, espero que tenham gostado!

 

*Edit: Para salvar log de ações, crie uma pasta chamada randomitems em data/logs.

 

Créditos: Lyu (isme)

 

 

 

o.4 seria uma boa <3 

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 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.
    • Por amoxicilina
      Action: Remover skull
       
       
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo