Ir para conteúdo
  • Cadastre-se

(Resolvido)[AJUDA] ERRO REWARD CHEST


Ir para solução Resolvido por L3K0T,

Posts Recomendados

.QuOlá pessoal boa tarde,

 

Estou usando o Reward Chest do @luanluciano93

 

Porém quando mato 3 boss ao mesmo tempo (rápido) gera essa erro na minha distro.

 

[16:15:31.503] [Error - CreatureScript Interface]
[16:15:31.503] In a timer event called from:
[16:15:31.504] data/creaturescripts/scripts/customs/rewardchest_boss.lua:onDeath
[16:15:31.504] Description:
[16:15:31.505] ...creaturescripts/scripts/customs/rewardchest_boss.lua:58: bad argument #1 to 'ceil' (number expected, got boolean)
[16:15:31.505] stack traceback:
[16:15:31.506]  [C]: in function 'ceil'
[16:15:31.506]  ...creaturescripts/scripts/customs/rewardchest_boss.lua:58: in function <...creaturescripts/scripts/customs/rewardchest_boss.lua:46>

 

Script do erro acima...

Spoiler

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

 

 

Alguem poderia me ajudar fazendo favor?

Utilizo OTX SERVER 2 - 8.6

Link para o post
Compartilhar em outros sites
Em 04/05/2023 em 16:21, DigoleraZica disse:

rewardchest_boss.lua:58: bad argument #1 to 'ceil' (number expected, got boolean)

o erro diz que a função MATH.CEIL está sendo usando em um boleano. 

O MATH.CEIL é usado para arredondar um número quebrado pra cima, por exemplo = math.ceil(1.7) o resultado será 2.

BOLEANO é um tipo de dado, e eles retornar VERDADEIRO ou FALSO, por exemplo = isPremium(), se o jogador for premium, retorna verdadeiro, se não for, retornar falso.

Pois bem, o erro é na linha local porcentagem = math.ceil(getPlayerStorageValue(players[1], boss.storage))

a função getPlayerStorageValue puxa o valor que esta armazena na storage  boss.storage, porém ela, de alguma forma, esta retornando um boleano. 

Creio que o valor pode ter sido definido como boleano para essa storage em outro script do servidor.

 

Link para o post
Compartilhar em outros sites

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 x = getPlayerStorageValue(players[1], boss.storage)
	if (type(x) == "number") then
		local porcentagem = math.ceil(x)

		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
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
 

 

Link para o post
Compartilhar em outros sites

@luanluciano93Agora esta dando este erro

 

[17:56:17.205] [Error - CreatureScript Interface]
[17:56:17.207] In a timer event called from:
[17:56:17.208] data/creaturescripts/scripts/customs/rewardchest_boss.lua:onDeath
[17:56:17.209] Description:
[17:56:17.209] (LuaInterface::luaGetCreatureStorage) Creature not found

Link para o post
Compartilhar em outros sites
  • 1 month later...
18 horas atrás, DigoleraZica disse:

@luanluciano93 ainda continuo com este erro

Tenta substituir essa parte: 

			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)

por: 

			local pontos = getPlayerStorageValue(players[i], boss.storage)
			if pontos then
				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

 

Link para o post
Compartilhar em outros sites

@luanluciano93 ainda o erro persiste

 

[15:54:16.167] [Error - CreatureScript Interface]
[15:54:16.168] In a timer event called from:
[15:54:16.169] data/creaturescripts/scripts/customs/rewardchest_boss.lua:onDeath
[15:54:16.170] Description:
[15:54:16.171] (LuaInterface::luaDoAddContainerItem) Container not found
 

o boss morre demora um tempo e gera este erro...

Link para o post
Compartilhar em outros sites
  • Sub-Admin
  • Solução
Em 13/06/2023 em 15:55, DigoleraZica disse:

@luanluciano93 ainda o erro persiste

 

[15:54:16.167] [Error - CreatureScript Interface]
[15:54:16.168] In a timer event called from:
[15:54:16.169] data/creaturescripts/scripts/customs/rewardchest_boss.lua:onDeath
[15:54:16.170] Description:
[15:54:16.171] (LuaInterface::luaDoAddContainerItem) Container not found
 

o boss morre demora um tempo e gera este erro...

A parte que o Luciano disse, fiz alteração 

 

local pontos = getPlayerStorageValue(players[i], boss.storage)
if pontos ~= nil then
    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
 

 

 

Esse erro que vc citou é porque alguém ficou desconectado durante a batalha e deslogo  causando o erro, vc disse que de vez enquando aparece, então é isso foi adicionado no script if pontos ~= nil then

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

Link para o post
Compartilhar em outros sites
  • Sub-Admin
8 horas atrás, luanluciano93 disse:

if pontos then É IGUAL A if pontos ~= nil then

"if pontos then" considera qualquer valor diferente de "false" ou "nil" como verdadeiro.

"if pontos ~= nil" verifica explicitamente se pontos não é igual a "nil".

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

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.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo