Ir para conteúdo
  • Cadastre-se

(Resolvido)crashando o serve ao deslogar com efeito da potion


Ir para solução Resolvido por Mathias Kenfi,

Posts Recomendados

Alguém pode me ajuda com esse script ?

 

ele funciona normal, mas se o player desloga com o efeito da potion o server crasha .

não aparece erro na distro.

 

uso o servidor do malucooo como base.

link do servidor.

Spoiler

 

script

Spoiler

 


local config = {
	cooldown = 35, -- tempo entre uma magia e outra
	tempo = 30, -- tempo em segundos que ficará healando
	storage = 134813,
	effect = 49, --- efeito que vai sair
}

function onUse(cid, item, fromPosition, itemEx, toPosition)

	if os.time() - getPlayerStorageValue(cid, config.storage) >= config.cooldown then
		if getPlayerSoul(cid) <= 49 then
			doPlayerSendTextMessage(cid,20,'Desculpe, você não tem Souls suficiente.')
			return true
		else
			doPlayerAddSoul(cid,-50)
			for i = 1, config.tempo do
				addEvent(function()
					if isCreature(cid) then
						local pos = getPlayerPosition(cid)
						doCreatureAddHealth(cid, (12*getCreatureMaxHealth(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2)) 
						doPlayerAddMana(cid,(12*getPlayerMaxMana(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2))
						doSendMagicEffect(pos, config.effect)
					end
				end, 2000*i)
			end
		end
	setPlayerStorageValue(cid, config.storage, os.time())
	else
			doPlayerSendCancel(cid, "cooldown "..(config.cooldown - (os.time() - getPlayerStorageValue(cid, config.storage))).." seconds.")
	end
	return true
end

 

 

 

 

Editado por Freire (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
Em 17/04/2019 em 16:40, Freire disse:

@KiraConquest vou tenta aqui, valeu

 

Edit:

Testei tirando linha por linha, não consegui acha o erro.

oque aconteceu foi, ou o script para de funciona totalmente ou conituna com o mesmo erro.

 

O que o script FAZ?

Link para o post
Compartilhar em outros sites
Em 17/04/2019 em 14:47, Freire disse:

Alguém pode me ajuda com esse script ?

 

ele funciona normal, mas se o player desloga com o efeito da potion o server crasha .

não aparece erro na distro.

 

uso o servidor do malucooo como base.

link do servidor.

  Mostrar conteúdo oculto

 

script

  Ocultar conteúdo

 



local config = {
	cooldown = 35, -- tempo entre uma magia e outra
	tempo = 30, -- tempo em segundos que ficará healando
	storage = 134813,
	effect = 49, --- efeito que vai sair
}

function onUse(cid, item, fromPosition, itemEx, toPosition)

	if os.time() - getPlayerStorageValue(cid, config.storage) >= config.cooldown then
		if getPlayerSoul(cid) <= 49 then
			doPlayerSendTextMessage(cid,20,'Desculpe, você não tem Souls suficiente.')
			return true
		else
			doPlayerAddSoul(cid,-50)
			for i = 1, config.tempo do
				addEvent(function()
					if isCreature(cid) then
						local pos = getPlayerPosition(cid)
						doCreatureAddHealth(cid, (12*getCreatureMaxHealth(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2)) 
						doPlayerAddMana(cid,(12*getPlayerMaxMana(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2))
						doSendMagicEffect(pos, config.effect)
					end
				end, 2000*i)
			end
		end
	setPlayerStorageValue(cid, config.storage, os.time())
	else
			doPlayerSendCancel(cid, "cooldown "..(config.cooldown - (os.time() - getPlayerStorageValue(cid, config.storage))).." seconds.")
	end
	return true
end

 

 

 

 

 

 

Acho que algo para "burlar" esse bug seria dar a condição de battle na script, assim o player não relogaria (porém, no caso de morte ou algo do tipo, acho que continuaria o erro)

Link para o post
Compartilhar em outros sites
Em 17/04/2019 em 14:47, Freire disse:

Alguém pode me ajuda com esse script ?

 

ele funciona normal, mas se o player desloga com o efeito da potion o server crasha .

não aparece erro na distro.

 

uso o servidor do malucooo como base.

link do servidor.

  Mostrar conteúdo oculto

 

script

  Mostrar conteúdo oculto

 



local config = {
	cooldown = 35, -- tempo entre uma magia e outra
	tempo = 30, -- tempo em segundos que ficará healando
	storage = 134813,
	effect = 49, --- efeito que vai sair
}

function onUse(cid, item, fromPosition, itemEx, toPosition)

	if os.time() - getPlayerStorageValue(cid, config.storage) >= config.cooldown then
		if getPlayerSoul(cid) <= 49 then
			doPlayerSendTextMessage(cid,20,'Desculpe, você não tem Souls suficiente.')
			return true
		else
			doPlayerAddSoul(cid,-50)
			for i = 1, config.tempo do
				addEvent(function()
					if isCreature(cid) then
						local pos = getPlayerPosition(cid)
						doCreatureAddHealth(cid, (12*getCreatureMaxHealth(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2)) 
						doPlayerAddMana(cid,(12*getPlayerMaxMana(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2))
						doSendMagicEffect(pos, config.effect)
					end
				end, 2000*i)
			end
		end
	setPlayerStorageValue(cid, config.storage, os.time())
	else
			doPlayerSendCancel(cid, "cooldown "..(config.cooldown - (os.time() - getPlayerStorageValue(cid, config.storage))).." seconds.")
	end
	return true
end

 

 

 

 

 

Ah sim, pelo visto o problema é causado porque o ao deslogar o Efeito persiste, porém como não há creature, o server crasha, mas não é um BUG, é apenas um pequeno erro de lógica.

 

A Resolução seria você fazer uma versão deste item, só que em SPELLS

local config = {
	cooldown = 35, -- tempo entre uma magia e outra
	storage = 134813,
	effect = 49, --- efeito que vai sair
}

local combat = createCombatObject()

setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING)

setCombatParam(combat, COMBAT_PARAM_EFFECT, config.effect)

setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false)




function onGetFormulaValues(cid, level, skill)
local multiplier = (100*level/100)*(100*skill/100)
return (10*getCreatureMaxHealth(cid)/100)+multiplier, (10*getCreatureMaxHealth(cid)/100)+multipliercura
end


setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")



function onCastSpell(cid, var)

if os.time() - getPlayerStorageValue(cid, config.storage) >= config.cooldown then
	if getPlayerSoul(cid) <= 49 then
		doPlayerSendTextMessage(cid,20,'Desculpe, você não tem Souls suficiente.')
	    return true
	else
		doPlayerAddSoul(cid,-50)
		addEvent(doCombat, 0, cid, combat, var)
		addEvent(doCombat, 2000, cid, combat, var)
		addEvent(doCombat, 4000, cid, combat, var)
		addEvent(doCombat, 6000, cid, combat, var)
		addEvent(doCombat, 8000, cid, combat, var)
		addEvent(doCombat, 10000, cid, combat, var)
		addEvent(doCombat, 12000, cid, combat, var)
		addEvent(doCombat, 14000, cid, combat, var)
		addEvent(doCombat, 16000, cid, combat, var)
		addEvent(doCombat, 18000, cid, combat, var)
		addEvent(doCombat, 20000, cid, combat, var)
		addEvent(doCombat, 22000, cid, combat, var)	
		addEvent(doCombat, 24000, cid, combat, var)
		addEvent(doCombat, 26000, cid, combat, var)
		addEvent(doCombat, 28000, cid, combat, var)
		addEvent(doCombat, 30000, cid, combat, var)
	end
		setPlayerStorageValue(cid, config.storage, os.time())
	else
		doPlayerSendCancel(cid, "cooldown "..(config.cooldown - (os.time() - getPlayerStorageValue(cid, config.storage))).." seconds.")
	end
return true
end

Ai em spells.xml você coloca assim V

 

<rune name="Nome Qualquer" id="ID DO ITEM" allowfaruse="1" charges="1" lvl="1" maglv="0" exhaustion="0" blocktype="solid" event="script" value="nomedoscript.lua"/>

 

Link para o post
Compartilhar em outros sites

@Joaovettor Desculpe a demora pra testa e te responde, eu testei aqui e fica falando que não é possível usar a potion (you cannot use this object).

não aparece erro na distro.

Obrigado por tentar ajudar. ?

 

 

@ZeeroBR seria uma forma de burla, mas como você disse, se o player morre vai crasha o serve do mesmo jeito.

Obrigado pela dica ?

 

 

@Joaovettor percebi que a tag da spell.xml que você me passo é diferente do meu, então arrumei a tag.

o script usa a potion normal, não da erro mas também não cura o char.

 

 

Edit:

deixei o script assim

 

Spoiler

local config = {
	cooldown = 35, -- tempo entre uma magia e outra
	storage = 134813,
	effect = 49, --- efeito que vai sair
}

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatParam(combat, COMBAT_PARAM_EFFECT, config.effect)
setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false)


function onGetFormulaValues(cid, level, maglevel)
	doCreatureAddHealth(cid, (12*getCreatureMaxHealth(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2)) 
	doPlayerAddMana(cid,(12*getPlayerMaxMana(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2))
end
						
						
setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

function onCastSpell(cid, var)

if os.time() - getPlayerStorageValue(cid, config.storage) >= config.cooldown then
	if getPlayerSoul(cid) <= 49 then
		doPlayerSendTextMessage(cid,20,'Desculpe, você não tem Souls suficiente.')
	    return true
	else
		doPlayerAddSoul(cid,-1)
		addEvent(doCombat, 0, cid, combat, var)
		addEvent(doCombat, 2000, cid, combat, var)
		addEvent(doCombat, 4000, cid, combat, var)
		addEvent(doCombat, 6000, cid, combat, var)
		addEvent(doCombat, 8000, cid, combat, var)
		addEvent(doCombat, 10000, cid, combat, var)
		addEvent(doCombat, 12000, cid, combat, var)
		addEvent(doCombat, 14000, cid, combat, var)
		addEvent(doCombat, 16000, cid, combat, var)
		addEvent(doCombat, 18000, cid, combat, var)
		addEvent(doCombat, 20000, cid, combat, var)
		addEvent(doCombat, 22000, cid, combat, var)	
		addEvent(doCombat, 24000, cid, combat, var)
		addEvent(doCombat, 26000, cid, combat, var)
		addEvent(doCombat, 28000, cid, combat, var)
		addEvent(doCombat, 30000, cid, combat, var)
	end
		setPlayerStorageValue(cid, config.storage, os.time())
	else
		doPlayerSendCancel(cid, "cooldown "..(config.cooldown - (os.time() - getPlayerStorageValue(cid, config.storage))).." seconds.")
	end
return true
end

 

 

porem fica dando erro em todos addEvent(doCombat, 0, cid, combat, var)

falando que o Argument #3 is unsafe

ai eu mudo o cid pra creature ou pra player ai para de cura.

Editado por Freire (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
4 horas atrás, Freire disse:

@Joaovettor Desculpe a demora pra testa e te responde, eu testei aqui e fica falando que não é possível usar a potion (you cannot use this object).

não aparece erro na distro.

Obrigado por tentar ajudar. ?

 

 

@ZeeroBR seria uma forma de burla, mas como você disse, se o player morre vai crasha o serve do mesmo jeito.

Obrigado pela dica ?

 

 

@Joaovettor percebi que a tag da spell.xml que você me passo é diferente do meu, então arrumei a tag.

o script usa a potion normal, não da erro mas também não cura o char.

 

 

Edit:

deixei o script assim

 

  Ocultar conteúdo


local config = {
	cooldown = 35, -- tempo entre uma magia e outra
	storage = 134813,
	effect = 49, --- efeito que vai sair
}

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatParam(combat, COMBAT_PARAM_EFFECT, config.effect)
setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false)


function onGetFormulaValues(cid, level, maglevel)
	doCreatureAddHealth(cid, (12*getCreatureMaxHealth(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2)) 
	doPlayerAddMana(cid,(12*getPlayerMaxMana(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2))
end
						
						
setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

function onCastSpell(cid, var)

if os.time() - getPlayerStorageValue(cid, config.storage) >= config.cooldown then
	if getPlayerSoul(cid) <= 49 then
		doPlayerSendTextMessage(cid,20,'Desculpe, você não tem Souls suficiente.')
	    return true
	else
		doPlayerAddSoul(cid,-1)
		addEvent(doCombat, 0, cid, combat, var)
		addEvent(doCombat, 2000, cid, combat, var)
		addEvent(doCombat, 4000, cid, combat, var)
		addEvent(doCombat, 6000, cid, combat, var)
		addEvent(doCombat, 8000, cid, combat, var)
		addEvent(doCombat, 10000, cid, combat, var)
		addEvent(doCombat, 12000, cid, combat, var)
		addEvent(doCombat, 14000, cid, combat, var)
		addEvent(doCombat, 16000, cid, combat, var)
		addEvent(doCombat, 18000, cid, combat, var)
		addEvent(doCombat, 20000, cid, combat, var)
		addEvent(doCombat, 22000, cid, combat, var)	
		addEvent(doCombat, 24000, cid, combat, var)
		addEvent(doCombat, 26000, cid, combat, var)
		addEvent(doCombat, 28000, cid, combat, var)
		addEvent(doCombat, 30000, cid, combat, var)
	end
		setPlayerStorageValue(cid, config.storage, os.time())
	else
		doPlayerSendCancel(cid, "cooldown "..(config.cooldown - (os.time() - getPlayerStorageValue(cid, config.storage))).." seconds.")
	end
return true
end

 

 

porem fica dando erro em todos addEvent(doCombat, 0, cid, combat, var)

falando que o Argument #3 is unsafe

ai eu mudo o cid pra creature ou pra player ai para de cura.

 

@Freire Nesta linha V 

function onGetFormulaValues(cid, level, maglevel)
	doCreatureAddHealth(cid, (12*getCreatureMaxHealth(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2)) 
	doPlayerAddMana(cid,(12*getPlayerMaxMana(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2))
end

Você tem que colocar retornar o valor que você quer que cure V

function onGetFormulaValues(cid, level, maglevel)
cura = (12*getCreatureMaxHealth(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2)
return cura, cura
end

 

Link para o post
Compartilhar em outros sites

@Joaovettor ficando assim ?

function onGetFormulaValues(cid, level, maglevel)
life = (12*getCreatureMaxHealth(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2)
mana = (12*getPlayerMaxMana(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2)
return life, mana
end

se for assim, não cura o char

Link para o post
Compartilhar em outros sites
6 minutos atrás, Freire disse:

@Joaovettor ficando assim ?


function onGetFormulaValues(cid, level, maglevel)
life = (12*getCreatureMaxHealth(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2)
mana = (12*getPlayerMaxMana(cid)/100)+(getPlayerSkill(cid)*6)+(getPlayerMagLevel(cid)*2)
return life, mana
end

se for assim, não cura o char

 

Provavelmente se você colocar negativo, irá dar certo, porém irá remover sua vida, então faça com que os cálculos deem negativo, por exemplo:

 

function onGetFormulaValues(cid, level, maglevel)
return -(-500), -(-500)
end

 

Link para o post
Compartilhar em outros sites
  • Solução
local config = {
    cooldown = 35, -- tempo entre uma magia e outra
    storage = 134813,
    effect = 49, --- efeito que vai sair
}

local combat = Combat()
combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING)
combat:setParameter(COMBAT_PARAM_EFFECT, config.effect)
combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0)

local combat2 = Combat()
combat2:setParameter(COMBAT_PARAM_TYPE, COMBAT_MANADRAIN)
combat2:setParameter(COMBAT_PARAM_EFFECT, config.effect)
combat2:setParameter(COMBAT_PARAM_AGGRESSIVE, 0)

function onGetFormulaValues(player, level, maglevel)
cura = (12*player:getMaxHealth()/100)+(player:getSkillLevel()*6)+(maglevel*12)
return cura, cura
end
combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

function onGetFormulaValues(player, level, maglevel)
cura = (12*player:getMaxMana()/100)+(player:getSkillLevel()*6)+(maglevel*12)
return cura, cura
end
combat2:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")

function doCastSpell(combat, cid, variant)
    local creature = Creature(cid)
    if creature ~= nil then
        combat:execute(creature, variant)
    end
end

function doCastSpell2(combat2, cid, variant)
    local creature = Creature(cid)
    if creature ~= nil then
        combat2:execute(creature, variant)
    end
end


function onCastSpell(creature, variant)
if os.time() - creature:getStorageValue(config.storage) >= config.cooldown then
    if creature:getSoul() <= 0 then
        creature:sendTextMessage(20,'Desculpe, você não tem Souls suficiente.')
        return true
    else
        creature:addSoul(-1)
		creature:setStorageValue(config.storage, os.time()+35)
		combat:execute(creature, variant)
		combat2:execute(creature, variant)
        addEvent(doCastSpell, 0, combat, creature:getId(), variant)
        addEvent(doCastSpell, 2000, combat, creature:getId(), variant)
        addEvent(doCastSpell, 4000, combat, creature:getId(), variant)
        addEvent(doCastSpell, 6000, combat, creature:getId(), variant)
        addEvent(doCastSpell, 8000, combat, creature:getId(), variant)
        addEvent(doCastSpell, 10000, combat, creature:getId(), variant)
        addEvent(doCastSpell, 12000, combat, creature:getId(), variant)
        addEvent(doCastSpell, 14000, combat, creature:getId(), variant)
        addEvent(doCastSpell, 16000, combat, creature:getId(), variant)
        addEvent(doCastSpell, 18000, combat, creature:getId(), variant)
        addEvent(doCastSpell, 20000, combat, creature:getId(), variant)
        addEvent(doCastSpell, 22000, combat, creature:getId(), variant)
        addEvent(doCastSpell, 24000, combat, creature:getId(), variant)
        addEvent(doCastSpell, 26000, combat, creature:getId(), variant)
        addEvent(doCastSpell, 28000, combat, creature:getId(), variant)
        addEvent(doCastSpell, 30000, combat, creature:getId(), variant)
        addEvent(doCastSpell2, 0, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 2000, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 4000, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 6000, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 8000, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 10000, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 12000, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 14000, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 16000, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 18000, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 20000, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 22000, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 24000, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 26000, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 28000, combat2, creature:getId(), variant)
        addEvent(doCastSpell2, 30000, combat2, creature:getId(), variant)
    end
else
creature:sendTextMessage(20, "cooldown "..(config.cooldown - (os.time() - creature:getStorageValue(config.storage))).." seconds.")
end
return true
end

Versão Testada: TFS 1.2

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.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo