Ir para conteúdo
  • Cadastre-se

Posts Recomendados

@luanluciano93  sabe dizer o porque do seu sistema simplesmente parar quando eu uso esse sistema de locker protection ? A mensagem de reward aparece porém nada vai para o depot e nem no corpo do boss. 

 

                                                                                                               destinyshield.gif.9f031b59b026058f32a1c50da92ebe2a.gif  mídias sociais  destinyshield.gif.02fca81ab0615e050b2bcefd8a73a2e8.gif

                                                                                                                            talk to me              

                                                                                                                               vídeos           

                                                                                             

                                                                                                            LOGONORMAL.png.815b40b04ec583be88d8a1e2626fe430.png

                                                                                                           

                               

Link para o post
Compartilhar em outros sites
  • 3 months later...
  • Respostas 91
  • Created
  • Última resposta

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

Olá pessoal, resolvi criar um sistema de recompensa parecido com o sistema do tibia global para a versão 8.60, mas tie que fazer varias "gambiarras" para ele funcionar nesta versão. Para quem não c

msg = msg .. " ".. (tabela_reward[x][2] > 1 and tabela_reward[x][2] or "") .." ".. getItemNameById(tabela_reward[x][1]) ..","  

pessoal, só final de semana para fixar

Posted Images

Tem como ao matar o boss, gerar um papel para todos os players mostrando quanto cada um fez de pontuação no boss?

 

@luanluciano93

Editado por You Know Nothing (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • 5 weeks later...
Em 05/08/2017 em 12:47, luanluciano93 disse:

Olá pessoal, resolvi criar um sistema de recompensa parecido com o sistema do tibia global para a versão 8.60, mas tie que fazer varias "gambiarras" para ele funcionar nesta versão.

Para quem não conhece: http://www.tibiawiki.com.br/wiki/Loot#Sistema_de_Recompensas

Basicamente meu sistema funciona da seguinte forma:
• você determina as criaturas que irão funcionar com esse sistema (normalmente bosses).
• durante a batalha com a criatura o sistema conta pontos aos jogadores por ataque, bloqueio e suporte ("healar" quem esta na batalha).
• quando a criatura é morta o sistema cria um "loot" de acordo com os pontos e envia-o ao depot do jogador em uma bag determinada nas configurações.

Primeiramente vamos criar o arquivo das configurações gerais, crie uma pasta dentro do "data" com o nome de sistemas e dentro cria um arquivo rewardchest.lua

  Mostrar conteúdo oculto


-- Sistema de recompensa criado por luanluciano93

REWARDCHEST = {
	rewardBagId = 2595,
	formula = {hit = 3, block = 1, suport = 9},
	storageExaust = 60000,
	town_id = 1,
	bosses = {
		["ghazbaran"] = -- todo o nome do boss em letras minúsculas.
		{
			comum = {
				{2143, 10, 100}, -- white pearl
				{2146, 10, 100}, -- small sapphire
				{2145, 10, 100}, -- small diamond
				{2144, 10, 100}, -- black pearl
				{2149, 10, 100}, -- small emeralds
				{5954, 3, 100}, -- demon horn
				{7896, 1, 100}, -- glacier kilt
				{7590, 1, 100}, -- great mana potion
				{2179, 1, 100}, -- gold ring
				{2151, 1, 100}, -- talon
			}, 

			semi_raro = {
				{2152, 90, 100}, -- platinum coin
				{7368, 50, 100}, -- assassin star
				{2130, 1, 100}, -- golden amulet
				{2436, 1, 100}, -- skull staff
				{2447, 1, 100}, -- twin axe
				{2171, 1, 100}, -- platinum amulet
				{2158, 1, 100}, -- blue gem
				{2393, 1, 100}, -- giant sword
				{2164, 1, 100}, -- might ring
				{7454, 1, 100}, -- glorious axe
				{6553, 1, 100}, -- ruthless axe
				{9971, 1, 100}, -- gold ingot
			},

			raro = {
				{2160, 3, 100}, -- crystal coin
				{8887, 1, 100}, -- frozen plate
				{2470, 1, 100}, -- golden legs
				{2472, 1, 100}, -- magic plate armor
				{7431, 1, 100}, -- demonbone
				{2520, 1, 100}, -- demon shield
				{5943, 1, 100}, -- morgaroth hearth
				{2466, 1, 100}, -- golden armor
				{2514, 1, 100}, -- mastermind shield
				{2142, 1, 100}, -- ancient amulet
				{2123, 1, 100}, -- ring of the sky
				{1984, 1, 100}, -- blue tome
			},

			muito_raro = {
				{8866, 1, 100}, -- robe of the ice queen
				{6553, 1, 100}, -- ruthless axe
				{8884, 1, 100}, -- oceanborn leviathan armor
				{2421, 1, 100}, -- thunder hammer
				{2646, 1, 100}, -- golden boots
				{7455, 1, 100}, -- mythril axe
			},
			
			sempre = {
				{2148, 90, 100}, -- gold coin
				{6500, 9, 100}, -- demonic essence
				{2177, 1, 100}, -- life crystal
				{2214, 1, 100}, -- ring of healing
			},
			
			storage = 65479, 
		},
		
		["orshabaal"] = -- nome do boss em todo em letras minísculas
		{
			comum = {
				{2143, 10, 100}, -- white pearl
				{2146, 10, 100}, -- small sapphire
				{2145, 10, 100}, -- small diamond
				{2144, 10, 100}, -- black pearl
				{2149, 10, 100}, -- small emeralds
				{5954, 3, 100}, -- demon horn
				{7896, 1, 100}, -- glacier kilt
				{2432, 1, 100}, -- fire axe
				{2462, 1, 100}, -- devil helmet
				{7590, 1, 100}, -- great mana potion
				{2179, 1, 100}, -- gold ring
				{2151, 1, 100}, -- talon
			}, 

			semi_raro = {
				{2195, 1, 100}, -- boots of haste
				{2436, 1, 100}, -- skull staff
				{2393, 1, 100}, -- giant sword
				{5954, 5, 100}, -- demon horn
			},

			raro = {
				{2470, 1, 100}, -- golden legs
				{2472, 1, 100}, -- magic plate armor
				{2514, 1, 100}, -- mastermind shield
				{2520, 1, 100}, -- demon shield
				{1982, 1, 100}, -- purple tome
				{2123, 1, 100}, -- ring of the sky
			},

			muito_raro = {
				{8890, 1, 100}, -- Robe of the underworld
				{2421, 1, 100}, -- thunder hammer
			},
			
			sempre = {
				{5808, 1, 100}, -- orshabaals brain
				{2171, 1, 100}, -- platinum amulet
				{2148, 90, 100}, -- gold coin
				{2146, 10, 100}, -- small sapphire
			},
			
			storage = 65480, 
		},
		
		["ferumbras"] = -- todo o nome do boss em letras minúsculas.
		{
			comum = {
				{2143, 10, 100}, -- white pearl
				{2146, 10, 100}, -- small sapphire
				{2145, 10, 100}, -- small diamond
				{2144, 10, 100}, -- black pearl
				{2149, 10, 100}, -- small emeralds
				{7416, 1, 100}, -- Bloody Edge
				{7896, 1, 100}, -- glacier kilt
				{2432, 1, 100}, -- fire axe
				{2462, 1, 100}, -- devil helmet
				{7590, 1, 100}, -- great mana potion
				{2179, 1, 100}, -- gold ring
				{2151, 1, 100}, -- talon
			}, 

			semi_raro = {
				{2195, 1, 100}, -- boots of haste
				{2472, 1, 100}, -- magic plate armor
				{2393, 1, 100}, -- giant sword
				{2470, 1, 100}, -- golden legs
				{2514, 1, 100}, -- mastermind shield
			},

			raro = {
				{8885, 1, 100}, -- divine plate
				{2520, 1, 100}, -- demon shield
				{8930, 1, 100}, -- emerald sword
				{2522, 1, 100}, -- great shield
				{2421, 1, 100}, -- thunder hammer
			},

			muito_raro = {
				{5903, 1, 100}, -- ferumbras hat
			},
			
			sempre = {
				{2171, 1, 100}, -- platinum amulet
				{2148, 90, 100}, -- gold coin
				{2146, 10, 100}, -- small sapphire
			},
			
			storage = 65481, 
		},
		["zulazza the corruptor"] = -- todo o nome do boss em letras minúsculas.
		{
			comum = {
				{2158, 1, 100}, -- blue gem
				{2156, 1, 100}, -- red gem
				{2155, 1, 100}, -- green gem
				{2154, 1, 100}, -- yellow gem
				{2153, 1, 100}, -- violet gem
			}, 

			semi_raro = {
				{5944, 5, 100}, -- soul orb
			},

			raro = {
				{2514, 1, 100}, -- mastermind shield
			},

			muito_raro = {
				{11114, 1, 100}, -- dragon scale boots
				{8882, 1, 100}, -- earthborn titan armor
			},
			
			sempre = {
				{2152, 90, 100}, -- platinum coin
				{9971, 5, 100}, -- gold ingot
			},
			
			storage = 65482, 
		},
		["morgaroth"] = -- todo o nome do boss em letras minúsculas.
		{
			comum = {
				{2143, 10, 100}, -- white pearl
				{2146, 10, 100}, -- small sapphire
				{2145, 10, 100}, -- small diamond
				{2144, 10, 100}, -- black pearl
				{2149, 10, 100}, -- small emeralds
				{5954, 3, 100}, -- demon horn
				{7896, 1, 100}, -- glacier kilt
				{2432, 1, 100}, -- fire axe
				{2462, 1, 100}, -- devil helmet
				{7590, 1, 100}, -- great mana potion
				{2179, 1, 100}, -- gold ring
				{2151, 1, 100}, -- talon
			}, 

			semi_raro = {
				{2195, 1, 100}, -- boots of haste
				{2393, 1, 100}, -- giant sword
				{5954, 5, 100}, -- demon horn
				{2123, 1, 100}, -- ring of the sky
			},

			raro = {
				{8886, 1, 100}, -- molten plate
				{2472, 1, 100}, -- magic plate armor
				{8867, 1, 100}, -- dragon robe
				{2514, 1, 100}, -- mastermind shield
				{2520, 1, 100}, -- demon shield
				{1982, 1, 100}, -- purple tome
				{8851, 1, 100}, -- Royal Crossbow
			},

			muito_raro = {
				{2421, 1, 100}, -- thunder hammer
				{2522, 1, 100}, -- great shield
				{8850, 1, 100}, -- chain bolter
			},
			
			sempre = {
				{5943, 1, 100}, -- morgaroths brain
				{2171, 1, 100}, -- platinum amulet
				{2148, 90, 100}, -- gold coin
				{2146, 10, 100}, -- small sapphire
			},
			storage = 65483, 
		},
	}
}

Neste arquivo esta configurado 4 bosses para vocês verem como funciona para adicionar mais criaturas (você terá que ter o mínimo de conhecimento para entender)


Depois em creaturescript crie dois arquivos:
rewardchest_boss.lua:

  Mostrar conteúdo oculto


-- Sistema de recompensa criado por luanluciano93

dofile('data/sistemas/rewardchest.lua')

local function addRewardLoot(uid, bossName, tabela_reward)
	local money = math.random(10, 40)
	local msg = "The following items are available in your reward chest:"
	local chest = doCreateItemEx(REWARDCHEST.rewardBagId)

	doItemSetAttribute(chest, "description", "Reward System has kill the boss ".. bossName ..".")

	if table.maxn(tabela_reward) > 0 then
		for x = 1, table.maxn(tabela_reward) do
			local rand = math.random(100)
			if rand <= tabela_reward[x][3] then
				local count = math.random(1, tabela_reward[x][2])
				doAddContainerItem(chest, tabela_reward[x][1], count)
				msg = msg .. " ".. (count > 1 and count or "") .." "..getItemNameById(tabela_reward[x][1])..","
			end
		end
		doPlayerSendTextMessage(uid, MESSAGE_INFO_DESCR, msg .. " and ".. money .." platinum coins.")
	else
		doPlayerSendTextMessage(uid, MESSAGE_INFO_DESCR, msg .. " ".. money .." platinum coins.")
	end

	doAddContainerItem(chest, 2152, money)
	doPlayerSendMailByName(getPlayerName(uid), chest, REWARDCHEST.town_id)

	local boss = REWARDCHEST.bosses[bossName]
	setPlayerStorageValue(uid, boss.storage, 0)
	doSendMagicEffect(getPlayerPosition(uid), CONST_ME_MAGIC_BLUE)
end

local function addLoot(tabela_loot, tabela_reward, all_loot)
	if table.maxn(tabela_loot) > 0 then
		if all_loot then
			for x = 1, table.maxn(tabela_loot) do
				table.insert(tabela_reward, tabela_loot[x])
			end
		else
			table.insert(tabela_reward, tabela_loot[math.random(table.maxn(tabela_loot))])
		end
	end

	return tabela_reward
end

local function rewardChestSystem(bossName)
	local players = {}
	local boss = REWARDCHEST.bosses[bossName]

	for _, uid in ipairs(getPlayersOnline()) do
		if getPlayerStorageValue(uid, boss.storage) > 0 then
			table.insert(players, uid)
		end
	end

	table.sort(players, function(a, b) return getPlayerStorageValue(a, boss.storage) > getPlayerStorageValue(b, boss.storage) end)

	local porcentagem = math.ceil(getPlayerStorageValue(players[1], boss.storage))

	for i = 1, table.maxn(players) do

		local tabela_reward = {}
		local pontos = getPlayerStorageValue(players[i], boss.storage)

		if i == 1 then
			addLoot(boss.comum, tabela_reward, false)
			addLoot(boss.semi_raro, tabela_reward, false)
			addLoot(boss.raro, tabela_reward, false)
			addLoot(boss.sempre, tabela_reward, true)
		elseif i >= 2 and pontos >= math.ceil((porcentagem * 0.8)) then
			addLoot(boss.comum, tabela_reward, false)
			addLoot(boss.semi_raro, tabela_reward, false)
			addLoot(boss.raro, tabela_reward, false)
			addLoot(boss.muito_raro, tabela_reward, false)
		elseif pontos < math.ceil((porcentagem * 0.8)) and pontos >= math.ceil((porcentagem * 0.6)) then
			addLoot(boss.comum, tabela_reward, false)
			addLoot(boss.semi_raro, tabela_reward, false)
			addLoot(boss.raro, tabela_reward, false)
		elseif pontos < math.ceil((porcentagem * 0.6)) and pontos >= math.ceil((porcentagem * 0.4)) then
			addLoot(boss.comum, tabela_reward, false)
			addLoot(boss.semi_raro, tabela_reward, false)
		elseif pontos < math.ceil((porcentagem * 0.4)) and pontos >= math.ceil((porcentagem * 0.1)) then
			addLoot(boss.comum, tabela_reward, false)
		end

		addRewardLoot(players[i], bossName, tabela_reward)
	end
end

function onDeath(cid, corpse, killer)
	local boss = REWARDCHEST.bosses[getCreatureName(cid):lower()]
	if boss then
		addEvent(rewardChestSystem, 1000, getCreatureName(cid):lower())
	end
	return true
end

function onStatsChange(cid, attacker, type, combat, value)
	if isMonster(cid) and type == STATSCHANGE_HEALTHLOSS and isPlayer(attacker) then
		local boss = REWARDCHEST.bosses[getCreatureName(cid):lower()]
		if boss and attacker then
			setPlayerStorageValue(attacker, boss.storage, getPlayerStorageValue(attacker, boss.storage) + math.ceil((value / REWARDCHEST.formula.hit)))
		end
	end
	return true
end

 


rewardchest_pontos.lua

  Mostrar conteúdo oculto


-- Sistema de recompensa criado por luanluciano93

dofile('data/sistemas/rewardchest.lua')

function onLogin(cid)
	for key, value in pairs(REWARDCHEST.bosses) do
		if getPlayerStorageValue(cid, value.storage) > 0 then
			setPlayerStorageValue(cid, value.storage, 0)
		end
	end
	registerCreatureEvent(cid, "RewardChestStats")
	return true
end

function onStatsChange(cid, attacker, type, combat, value)
	if isMonster(attacker) and (type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS) then
		local boss = REWARDCHEST.bosses[getCreatureName(attacker):lower()]
		if boss then
			setPlayerStorageValue(cid, boss.storage, getPlayerStorageValue(cid, boss.storage) + math.ceil((value / REWARDCHEST.formula.block)))
			setPlayerStorageValue(cid, REWARDCHEST.storageExaust, os.time() + 5)
		end
	elseif (isPlayer(attacker) and (type == STATSCHANGE_HEALTHGAIN or type == STATSCHANGE_MANAGAIN) and (getCreatureHealth(cid) < getCreatureMaxHealth(cid)) and (getPlayerStorageValue(cid, REWARDCHEST.storageExaust) >= os.time())) then
		for key, valor in pairs(REWARDCHEST.bosses) do
			if getPlayerStorageValue(cid, valor.storage) > 0 then
				if getCreatureHealth(cid) + value > getCreatureMaxHealth(cid) then
					local add = getCreatureMaxHealth(cid) - getCreatureHealth(cid)
					setPlayerStorageValue(attacker, valor.storage, getPlayerStorageValue(attacker, valor.storage) + math.ceil((add / REWARDCHEST.formula.suport)))
				else
					setPlayerStorageValue(attacker, valor.storage, getPlayerStorageValue(attacker, valor.storage) + math.ceil((value / REWARDCHEST.formula.suport)))
				end
			end
		end
	end
	return true
end

 


Lembrando que em todas as criaturas que forem adicionadas ao sistema além de coloca-las no rewarchest.lua você deve add isso no xml do monstro: 


<script> 
  <event name="RewardChestDeath"/>
  <event name="RewardChestMonster"/>
</script>

E isso no creaturescript.xml


<!-- Sistema de recompensa criado por luanluciano93 -->
<event type="login" name="RewardChestLogin" event="script" value="rewardchest_pontos.lua"/>
<event type="statschange" name="RewardChestStats" event="script" value="rewardchest_pontos.lua"/>
<event type="death" name="RewardChestDeath" event="script" value="rewardchest_boss.lua"/>
<event type="statschange" name="RewardChestMonster" event="script" value="rewardchest_boss.lua"/>


Basicamente é isso, qualquer dúvida postem aqui ... abraços!

LINK DO SCRIPT NO GITHUB: https://github.com/luanluciano93/ESTUDOS/tree/master/LUA/REWARD_SYSTEM_860

Muito bom o sistema REP+!

Uma dúvida, quando eu mato ferumbras, não dropa ferumbras hat que deveria ser toda vez, é assim mesmo?

Link para o post
Compartilhar em outros sites
  • 1 year later...

Alguém ainda consegue dar suporte nesse script? Aqui funcionou até bem, porém o blocker sempre leva grande parte dos loots, shooters e EDs não ganham praticamente nada. Como alterar isso @luanluciano93?

Link para o post
Compartilhar em outros sites
19 horas atrás, Bruno Rezende disse:

Alguém ainda consegue dar suporte nesse script? Aqui funcionou até bem, porém o blocker sempre leva grande parte dos loots, shooters e EDs não ganham praticamente nada. Como alterar isso @luanluciano93?

Deve alteração na fórmula: 

formula = {hit = 3, block = 1, suport = 9},

 

Link para o post
Compartilhar em outros sites
4 minutos atrás, luanluciano93 disse:

Deve alteração na fórmula: 



formula = {hit = 3, block = 1, suport = 9},

 

Coloquei todos como 3 @luanluciano93, mas ainda parece não dividir bem. Também não consegui entender o cálculo, saberia explicar? Uma coisa que percebi, se trocar o id do Reward Bag, o script não entrega a reward.

 

sistemas/

REWARDCHEST = {
	rewardBagId = 2595,
	formula = {hit = 3, block = 3, suport = 3},
	storageExaust = 60000,
	town_id = 1,

 

creaturescripts/rewardchestboss

dofile('data/sistemas/rewardchest.lua')

local function addRewardLoot(uid, bossName, tabela_reward)
	local money = math.random(10, 40)
	local msg = "The following items are available in your reward chest:"
	local chest = doCreateItemEx(REWARDCHEST.rewardBagId)

	doItemSetAttribute(chest, "description", "Reward System has kill the boss ".. bossName ..".")

	if table.maxn(tabela_reward) > 0 then
		for x = 1, table.maxn(tabela_reward) do
			local rand = math.random(100)
			if rand <= tabela_reward[x][3] then
				local count = math.random(1, tabela_reward[x][2])
				doAddContainerItem(chest, tabela_reward[x][1], count)
				msg = msg .. " ".. (count > 1 and count or "") .." "..getItemNameById(tabela_reward[x][1])..","
			end
		end
		doPlayerSendTextMessage(uid, MESSAGE_INFO_DESCR, msg .. " and ".. money .." platinum coins.")
	else
		doPlayerSendTextMessage(uid, MESSAGE_INFO_DESCR, msg .. " ".. money .." platinum coins.")
	end

	doAddContainerItem(chest, 2152, money)
	doPlayerSendMailByName(getPlayerName(uid), chest, REWARDCHEST.town_id)

	local boss = REWARDCHEST.bosses[bossName]
	setPlayerStorageValue(uid, boss.storage, 0)
	doSendMagicEffect(getPlayerPosition(uid), CONST_ME_MAGIC_BLUE)
end

local function addLoot(tabela_loot, tabela_reward, all_loot)
	if table.maxn(tabela_loot) > 0 then
		if all_loot then
			for x = 1, table.maxn(tabela_loot) do
				table.insert(tabela_reward, tabela_loot[x])
			end
		else
			table.insert(tabela_reward, tabela_loot[math.random(table.maxn(tabela_loot))])
		end
	end

	return tabela_reward
end

local function rewardChestSystem(bossName)
	local players = {}
	local boss = REWARDCHEST.bosses[bossName]

	for _, uid in ipairs(getPlayersOnline()) do
		if getPlayerStorageValue(uid, boss.storage) > 0 then
			table.insert(players, uid)
		end
	end

	table.sort(players, function(a, b) return getPlayerStorageValue(a, boss.storage) > getPlayerStorageValue(b, boss.storage) end)

	local porcentagem = math.ceil(getPlayerStorageValue(players[1], boss.storage))

	for i = 1, table.maxn(players) do

		local tabela_reward = {}
		local pontos = getPlayerStorageValue(players[i], boss.storage)

		if i == 1 then
			addLoot(boss.comum, tabela_reward, false)
			addLoot(boss.semi_raro, tabela_reward, false)
			addLoot(boss.raro, tabela_reward, false)
			addLoot(boss.sempre, tabela_reward, true)
		elseif i >= 2 and pontos >= math.ceil((porcentagem * 0.8)) then
			addLoot(boss.comum, tabela_reward, false)
			addLoot(boss.semi_raro, tabela_reward, false)
			addLoot(boss.raro, tabela_reward, false)
			addLoot(boss.muito_raro, tabela_reward, false)
		elseif pontos < math.ceil((porcentagem * 0.8)) and pontos >= math.ceil((porcentagem * 0.6)) then
			addLoot(boss.comum, tabela_reward, false)
			addLoot(boss.semi_raro, tabela_reward, false)
			addLoot(boss.raro, tabela_reward, false)
		elseif pontos < math.ceil((porcentagem * 0.6)) and pontos >= math.ceil((porcentagem * 0.4)) then
			addLoot(boss.comum, tabela_reward, false)
			addLoot(boss.semi_raro, tabela_reward, false)
		elseif pontos < math.ceil((porcentagem * 0.4)) and pontos >= math.ceil((porcentagem * 0.1)) then
			addLoot(boss.comum, tabela_reward, false)
		end

		addRewardLoot(players[i], bossName, tabela_reward)
	end
end

function onDeath(cid, corpse, killer)
	local boss = REWARDCHEST.bosses[getCreatureName(cid):lower()]
	if boss then
		addEvent(rewardChestSystem, 1000, getCreatureName(cid):lower())
	end
	return true
end

function onStatsChange(cid, attacker, type, combat, value)
	if isMonster(cid) and type == STATSCHANGE_HEALTHLOSS and isPlayer(attacker) then
		local boss = REWARDCHEST.bosses[getCreatureName(cid):lower()]
		if boss and attacker then
			setPlayerStorageValue(attacker, boss.storage, getPlayerStorageValue(attacker, boss.storage) + math.ceil((value / REWARDCHEST.formula.hit)))
		end
	end
	return true
end

rewardchestpontos

dofile('data/sistemas/rewardchest.lua')

function onLogin(cid)
	for key, value in pairs(REWARDCHEST.bosses) do
		if getPlayerStorageValue(cid, value.storage) > 0 then
			setPlayerStorageValue(cid, value.storage, 0)
		end
	end
	registerCreatureEvent(cid, "RewardChestStats")
	return true
end

function onStatsChange(cid, attacker, type, combat, value)
	if isMonster(attacker) and (type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS) then
		local boss = REWARDCHEST.bosses[getCreatureName(attacker):lower()]
		if boss then
			setPlayerStorageValue(cid, boss.storage, getPlayerStorageValue(cid, boss.storage) + math.ceil((value / REWARDCHEST.formula.block)))
			setPlayerStorageValue(cid, REWARDCHEST.storageExaust, os.time() + 5)
		end
	elseif (isPlayer(attacker) and (type == STATSCHANGE_HEALTHGAIN or type == STATSCHANGE_MANAGAIN) and (getCreatureHealth(cid) < getCreatureMaxHealth(cid)) and (getPlayerStorageValue(cid, REWARDCHEST.storageExaust) >= os.time())) then
		for key, valor in pairs(REWARDCHEST.bosses) do
			if getPlayerStorageValue(cid, valor.storage) > 0 then
				if getCreatureHealth(cid) + value > getCreatureMaxHealth(cid) then
					local add = getCreatureMaxHealth(cid) - getCreatureHealth(cid)
					setPlayerStorageValue(attacker, valor.storage, getPlayerStorageValue(attacker, valor.storage) + math.ceil((add / REWARDCHEST.formula.suport)))
				else
					setPlayerStorageValue(attacker, valor.storage, getPlayerStorageValue(attacker, valor.storage) + math.ceil((value / REWARDCHEST.formula.suport)))
				end
			end
		end
	end
	return true
end

 

Editado por Bruno Rezende
correção de informação (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
9 horas atrás, Bruno Rezende disse:

Também não consegui entender o cálculo, saberia explicar?

fórmula do hit = 'dano no boss' dividido pelo 'valor definido na fórmula'.

fórmula do block = 'dano recebido' dividido pelo 'valor definido na fórmula'.
fórmula do support = 'quantidade que você healar de alguém que está no boss' dividido pelo valor definido na fórmula.

 

9 horas atrás, Bruno Rezende disse:

Uma coisa que percebi, se trocar o id do Reward Bag, o script não entrega a reward.

estranho, você colocou de um 'container' funcional ? 

Link para o post
Compartilhar em outros sites
5 horas atrás, luanluciano93 disse:

fórmula do hit = 'dano no boss' dividido pelo 'valor definido na fórmula'.

fórmula do block = 'dano recebido' dividido pelo 'valor definido na fórmula'.
fórmula do support = 'quantidade que você healar de alguém que está no boss' dividido pelo valor definido na fórmula.

 

estranho, você colocou de um 'container' funcional ? 

Por incrível que pareça sim. O container é funcional , conforme imagem. Mas quando mato o boss, recebo uma letter. Poderia avaliar meu script pra ver se está correto @luanluciano93, por favor?

image.png

Link para o post
Compartilhar em outros sites
11 minutos atrás, luanluciano93 disse:

sem tempo amigo, usa o padrão do tópico que vai funcionar

Sim, é idêntico ao que você postou, só queria ver essa questão mesmo do container diferente pra reward a e divisão dos rewards.

Link para o post
Compartilhar em outros sites
  • 6 months later...

@luanluciano93 uma outra dúvida, não deveria ter formula.hit? Ou ela é calculada em outro lugar?

 

	elseif (isPlayer(attacker) and (type == STATSCHANGE_HEALTHGAIN or type == STATSCHANGE_MANAGAIN) and (getCreatureHealth(cid) < getCreatureMaxHealth(cid)) and (getPlayerStorageValue(cid, REWARDCHEST.storageExaust) >= os.time())) then
		for key, valor in pairs(REWARDCHEST.bosses) do
			if getPlayerStorageValue(cid, valor.storage) > 0 then
				if getCreatureHealth(cid) + value > getCreatureMaxHealth(cid) then
					local add = getCreatureMaxHealth(cid) - getCreatureHealth(cid)
					setPlayerStorageValue(attacker, valor.storage, getPlayerStorageValue(attacker, valor.storage) + math.ceil((add / REWARDCHEST.formula.suport)))
				else
					setPlayerStorageValue(attacker, valor.storage, getPlayerStorageValue(attacker, valor.storage) + math.ceil((value / REWARDCHEST.formula.suport)))
				end
			end
		end
	end
	return true
end

 

Link para o post
Compartilhar em outros sites
Em 14/08/2023 em 18:18, Bruno Rezende disse:

não deveria ter formula.hit? Ou ela é calculada em outro lugar?

outro arquivo, só olhar no tópico e dar Ctrl+F

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 danielzin021
      alguém sabe como implementa isso no serv e se tem como?
    • Por Maniaco
      Salve TibiaKing!!! TFS 0.4 . 8.60
       
      Estou implementando o Sistema do @WooX de Cave Exlusiva

      Link:
       
      Porem estou com um problema seguindo o tutorial completo dele acabo tendo um retorno de erro na Distro! E ja que o mesmo nao entra no forum deis de 14/01! Venho solicitar ajuda de vocês!
      Caso alguem tenha o Discord Dele Favor me Passe  
      Vamos lá!
      Erro:
       
      Script :
       
      Lib
       
       
      Print Rme:
       
       
      Lembrando que nao esta funcionando em geral, Acrédito que eu tenha pulado algo ou deixado passar despercebido!
      Espero que alguem consiga me ajudar vlw!
    • Por WooX
      Trade Offline V2.0

      Esse sistema me foi pedido a alguns meses atrás e hoje tirei um tempinho pra trazer aqui.
      O sistema consiste em permitir que jogadores negociem sem contato direto entre comprador e vendedor.
      Mas como assim?
      O vendedor pode criar um anuncio de venda informando item, valores ou até mesmo items que ele queira em troca, após feito o anuncio todas essas informações ficam armazenadas no banco de dados do servidor, permitindo assim serem exibidas em uma página no site para interessados, junto de todas informações fornecidas pelo vendedor é exibido um comando para que os interessados possam adquirir a oferta exibida na página.
       
      Sobre o sistema

       
      O sistema foi testado apenas em OTX2, mas provavelmente também funcione em TFS 0.4
       
      Versão para TFS 1.x adaptada pelo @luanluciano93
       
      Como mencionado acima, o sistema funciona de forma semelhante ao Market System das versões atuais porem sem exibição gráfica das ofertas in-game, para isso o sistema vai acompanhado de uma página para o Gesior AAC. Este sistema existe no fórum há um bom tempo e já é familiar pra muitos jogadores, essa versão trás consigo algumas melhorias e diferenças que irei listar abaixo.
       
      Sistema
      Agora é possivel vender um item exigindo outro item em troca ao invés de dinheiro. Containers com um conjunto de items dentro agora podem ser anunciados. Agora o sistema verifica as cargas e durações dos items antes de criar uma oferta. Novo parâmetro adicionado para verificar informações de ofertas in-game. Agora todo valor recebido vai diretamente para o banco do vendedor. Página
      A depender da quantidade de ofertas existentes no servidor, a página agora irá separa-las por páginas. Agora além do valor é exibido também imagem da moeda a depender do valor da oferta. Agora é possivel ver as características tanto dos items ofertados como dos items exigidos pelo vendedor. Adicionado filtros para exibir somente ofertas de items vip, containers ou trocas. Adicionado barras de pesquisas para filtrar as ofertas por items ou nome do jogador.  
      Algumas imagens
       
      Instalação

      Antes de mais nada é necessário citar os requisitos necessários para o funcionamento correto do sistema, ele utiliza de algumas funções que não estão no script principal e portanto é necessário a instalação de uma lib extra, também é necessário instalar as funções doItemSetDuration e getItemDurationTime na source do servidor, ambos os links se encontram abaixo.
       
      Todos os arquivos necessários para a instalação estão anexados no tópico, irei apenas dizer onde instalar e como deve ser configurado.
       
      Primeiramente importe o arquivo schema.sql no banco de dados, ou se preferir pode executar as queries a seguir.
      CREATE TABLE IF NOT EXISTS `trade_off_offers` ( `id` int(11) NOT NULL auto_increment, `player_id` int(11) NOT NULL, `type` int(1) NOT NULL DEFAULT '0', `item_id` int(11), `item_count` int(11) NOT NULL DEFAULT '1', `item_charges` int(11) NULL, `item_duration` int(11) NULL, `item_name` varchar(255), `item_trade` tinyint(1) NOT NULL DEFAULT '0', `cost` bigint(20) UNSIGNED NOT NULL, `cost_count` int(11) NOT NULL DEFAULT '1', `date` bigint(20), PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; CREATE TABLE IF NOT EXISTS `trade_off_container_items` ( `offer_id` int(11) NOT NULL, `item_id` int(11), `item_charges` int(11) NULL, `item_duration` int(11) NULL, `count` int(11) DEFAULT '1' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; ALTER TABLE `trade_off_container_items` ADD KEY `offer_id` (`offer_id`); ALTER TABLE `trade_off_container_items` ADD CONSTRAINT `offer_id_fk` FOREIGN KEY (`offer_id`) REFERENCES `trade_off_offers`(`id`) ON DELETE CASCADE;  
      Configuração no arquivo tradeoff.lua: 
      -- Trade Offline 2.0 by WooX -- local config = { priceLimit = 2000000000, -- 2kkk offerLimit = 3, offerLimitStor = 86420, infoOnPopUp = true, infoMsgType = MESSAGE_STATUS_CONSOLE_BLUE, errorMsgType = MESSAGE_STATUS_CONSOLE_RED, successMsgType = MESSAGE_INFO_DESCR, helpMsg = "Enter the parameters (add, remove, active, buy, info).", goldItems = {2148, 2152, 2160}, itemsVIP = {4540, 4545, 4560}, } priceLimit: define o valor máximo de uma oferta. offerLimit: define o valor máximo de ofertas que um jogador pode adicionar. offerLimitStor: storage que irá armazenar quantas ofertas ativas o jogador possui. infoOnPopUp: pode ser definido como true ou false, se definido como falso irá enviar os detalhes da oferta no default ao invés de como é mostrado nas imagens acima. infoMsgType: define como será exibido uma mensagem de informação ao jogador (não recomendo mexer a menos que saiba o que está fazendo). errorMsgType: define como será exibido uma mensagem de erro ao jogador (não recomendo mexer a menos que saiba o que está fazendo). successMsgType: define como será exibido uma mensagem de ação sucedida ao jogador (não recomendo mexer a menos que saiba o que está fazendo). helpMsg: mensagem que será enviada para o jogador caso ele erre os parâmetros do comando. goldItems: nesta tabela deve ser preenchido todos os IDs de moedas no servidor como gold coins, platinum coins, etc. itemsVIP: nesta tabela deve ser preenchido os IDs dos items vips existentes no servidor.  
      Agora para a instalação da página, no arquivo mysql_db.php deve ser preenchido os dados para conexão no banco de dados do servidor.
      /** * Host do banco de dados * @var string */ private static $DB_HOST = 'localhost'; /** * Usuario de conexao ao banco de dados * @var string */ private static $DB_USER = 'root'; /** * Senha de conexao ao banco de dados * @var string */ private static $DB_PASS = 'SUA_SENHA'; /** * Nome do banco de dados * @var string */ private static $DB_NAME = 'NOME_BANCO'; Após feito isso, o arquivo paginationClass.php em conjunto do arquivo mysql_db.php devem ser adicionados no seguinte diretório do Gesior AAC.
      classes/
      Finalizado isto, basta jogar o arquivo tradeoff.php dentro do diretório informado abaixo e o sistema estará pronto para uso.
      pages/
       
      Avisos

       
      Eu escrevi somente o sistema, não sou o autor da página para o Gesior AAC portanto não estarei dando suporte em relação a página que não seja sobre a instalação da mesma no Gesior AAC 2012, e embora esteja funcional, eu não recomendo o uso da página devido a falta do uso de cache para leitura do items.xml. Foram mais de 600 linhas de código sem contar funções extras e alterações na source, além de muitas horas de testes para garantir que tudo estava funcionando corretamente, tudo que peço em troca é que não removam os créditos no arquivo quando forem usar.  
      Créditos

      @MatheusDuarte pela página do Gesior AAC.
      schema.sql tradeoff.lua tradeoff.php mysql_db.php paginationClass.php
    • Por Denker
      O Player será teletransportado para o TC, após sair do TradeCenter o player retornará á cidade de origem, ex:

      Saffon > TC , o player retornará a saffron.

      ---------------------------------------------------------------------------------------------------------------------

      Em Data/Movements/Scripts, crie um arquivo.lua e coloque dentro:

       
      -- Developed by: Denker local configs = { tps = { -- Teleport para o TC através de um TP (Item) especifico no chão [ItemID] = {pos = {x = 0, y = 0, z = 0}, storage = 50000}, -- Pallet [ItemID] = {pos = {x = 0, y = 0, z = 0}, storage = 50001}, -- Viridian [ItemID] = {pos = {x = 0, y = 0, z = 0}, storage = 50002}, -- Pewter [ItemID] = {pos = {x = 0, y = 0, z = 0}, storage = 50003}, -- Cerulean [ItemID] = {pos = {x = 0, y = 0, z = 0}, storage = 50004}, -- Saffron [ItemID] = {pos = {x = 0, y = 0, z = 0}, storage = 50005}, -- Celadon [ItemID] = {pos = {x = 0, y = 0, z = 0}, storage = 50006}, -- Vermilion [ItemID] = {pos = {x = 0, y = 0, z = 0}, storage = 50007}, -- Fuchsia [ItemID] = {pos = {x = 0, y = 0, z = 0}, storage = 50008}, -- Cinnabar }, -- LOCALIZAÇÕES localizacaoPallet = {x= 0, y= 0, z= 0}, localizacaoViridian = {x= 0, y= 0, z= 0}, localizacaoPewter = {x= 0, y= 0, z= 0}, localizacaoCerulean = {x= 0, y= 0, z= 0}, localizacaoSaffron = {x= 0, y= 0, z= 0}, localizacaoCeladon = {x= 0, y= 0, z= 0}, localizacaoVermilion = {x= 0, y= 0, z= 0}, localizacaoFuchsia = {x= 0, y= 0, z= 0}, localizacaoCinnabar = {x= 0, y= 0, z= 0} } function onStepIn(cid, item, position, fromPosition) local tp = configs.tps[item.itemid] if tp then doTeleportThing(cid, tp.pos) setPlayerStorageValue(cid, tp.storage, 1) return true end -- Verificação que irá teletransportar o player de acordo com a city que ele estava antes if (item.itemid == ItemID ) and getPlayerStorageValue(cid, 50000) == 1 then doTeleportThing(cid, configs.localizacaoPallet) setPlayerStorageValue(cid, 50000, 0) doPlayerSendTextMessage(cid, COLOR_MESSAGE_GREEN, "Você foi Teletransportado para Pallet") return true end if (item.itemid == ItemID ) and getPlayerStorageValue(cid, 50001) == 1 then doTeleportThing(cid, configs.localizacaoViridian) setPlayerStorageValue(cid, 50001, 0) doPlayerSendTextMessage(cid, COLOR_MESSAGE_GREEN, "Você foi Teletransportado para Viridian") return true end if (item.itemid == ItemID ) and getPlayerStorageValue(cid, 50002) == 1 then doTeleportThing(cid, configs.localizacaoPewter) setPlayerStorageValue(cid, 50002, 0) doPlayerSendTextMessage(cid, COLOR_MESSAGE_GREEN, "Você foi Teletransportado para Pewter") return true end if (item.itemid == ItemID ) and getPlayerStorageValue(cid, 50003) == 1 then doTeleportThing(cid, configs.localizacaoCerulean) setPlayerStorageValue(cid, 50003, 0) doPlayerSendTextMessage(cid, COLOR_MESSAGE_GREEN, "Você foi Teletransportado para Cerulean") return true end if (item.itemid == ItemID ) and getPlayerStorageValue(cid, 50004) == 1 then doTeleportThing(cid, configs.localizacaoSaffron) setPlayerStorageValue(cid, 50004, 0) doPlayerSendTextMessage(cid, COLOR_MESSAGE_GREEN, "Você foi Teletransportado para Saffron") return true end if (item.itemid == ItemID ) and getPlayerStorageValue(cid, 50005) == 1 then doTeleportThing(cid, configs.localizacaoCeladon) setPlayerStorageValue(cid, 50005, 0) doPlayerSendTextMessage(cid, COLOR_MESSAGE_GREEN, "Você foi Teletransportado para Celadon") return true end if (item.itemid == ItemID ) and getPlayerStorageValue(cid, 50006) == 1 then doTeleportThing(cid, configs.localizacaoVermilion) setPlayerStorageValue(cid, 50006, 0) doPlayerSendTextMessage(cid, COLOR_MESSAGE_GREEN, "Você foi Teletransportado para Vermilion") return true end if (item.itemid == ItemID ) and getPlayerStorageValue(cid, 50007) == 1 then doTeleportThing(cid, configs.localizacaoFuchsia) setPlayerStorageValue(cid, 50007, 0) doPlayerSendTextMessage(cid, COLOR_MESSAGE_GREEN, "Você foi Teletransportado para Fuchsia") return true end if (item.itemid == ItemID ) and getPlayerStorageValue(cid, 50008) == 1 then doTeleportThing(cid, configs.localizacaoCinnabar) setPlayerStorageValue(cid, 50008, 0) doPlayerSendTextMessage(cid, COLOR_MESSAGE_GREEN, "Você foi Teletransportado para Cinnabar") return true end end OBS: O item ID da verificação de volta, será igual para todas as verificações.

      Em Data/Movements/Movements.xml, coloque dentro:

       
      <movevent type="StepIn" itemid="ID" event="script" value="arquivo.lua"/>  

    • Por Denker
      Ao clicar em um baú o player receberá o pokémon, ao ser teleportado para a cidade inicial ele ganhará um kit.
      OBS: Script desenvolvido para Ot's aonde  não há opção de escolha para cidade inicial, sempre será a mesma.
       
      Em Data/Actions/Script, crie um arquivo.lua e coloque:
       
      -- Developed by: Denker local configs = { position = {x = , y = , z = }, -- Localização que o player será teletransportado level = 8, -- Level minimo item = { [1] = {id = , count = }, -- Item que será entregue [2] = {id = , count = }, }, pokemons = { [] = "Charmander", -- Pokémons a se escolher e os ID item que será correspondente a cada poke [] = "Bulbasaur", [] = "Squitler", } } function onUse(cid, item) local first_Pokemon = configs.pokemons[item.itemid] if getPlayerLevel(cid) >= configs.level then for i = 1, #configs.item do doPlayerAddItem(cid, configs.item[1].id, configs.item[1].count) end addPokeToPlayer(cid, first_Pokemon,nil,"normal") doTeleportThing(cid, configs.position) doPlayerSetTown(cid,ID) -- Seta a cidade inicial no player doPlayerSendTextMessage(cid, 27, "Você pegou "..first_Pokemon.." como seu primeiro pokémon, boa sorte em sua jornada") -- Mensagem enviada após pegar escolher o pokémon else doPlayerSendTextMessage(cid, 27, "Você não pode pegar este Pokémon") -- Mensagem caso o player não tenha o requisito end return true end
      Em Data/Action/action.xml, coloque:

       
      <action itemid="ItemID" event="script" value="arquivo.lua"/>  




×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo