Ir para conteúdo
  • Cadastre-se

[Pedido] Sistema de critical hit estilizado.


Posts Recomendados

Galera utilizo um sistema de critical ultrapassado em meu servidor 8.6 DEV 0.4,que preciso criar um script para cada arma e registrar todas nos moviments,esse sistema é apenas para armas com atack 45 ou superior funcionar,um amigo meu começou a fazer um script para registrar todas as arma em apenas um script facilitando muito a configuração e não funcionou(nenhum erro no console),eu vou postar ele para poder ver qual o problema,ou se optar em fazer outro script funcional ou se for possivel um script que dispensa registrar os IDs e apenas se basear no atack 45+ das arma ficaria grato de verdade! =]
 
 
 
Segue o script:
 
local specific_weapons = true -- Somente armas especificas poderãoo dar cri­tico? (true / false)
local critical_weapons = { -- IDs das armas com cri­tico (só edite se o specific_weapons for true)
	[2400] = {30, 100}, -- [id da arma] = {chance, porcentagem_de_cri­tico},
	[2222] = {25, 200},
}
local critical_ratio = 25 -- Chance geral de crÃitico se o specific_weapons for false
local critical_percentage = 200 -- Porcentagem de cri­tico se o specific_weapons for false

function onStatsChange(cid, attacker, type, combat, value)
	if type == STATSCHANGE_HEALTHLOSS and value >= 1 then
		if specific_weapons then
			for weapon_ids, arrays in pairs(critical_weapons) do
				if getPlayerSlotItem(attacker, CONST_SLOT_RIGHT).itemid == weapon_ids or getPlayerSlotItem(attacker, CONST_SLOT_LEFT).itemid == weapon_ids then
					if math.random(1, 100) <= arrays[1] then
						doTargetCombatHealth(attacker, cid, combat, -value*arrays[2], -value*arrays[2], CONST_ME_NONE)
						doSendAnimatedText(getCreaturePosition(cid), "CRITICAL "..tostring(arrays[2]).."%!", TEXTCOLOR_DARKRED)
					end
				end
			end
		else
			if math.random(1, 100) <= critical_ratio then
				doTargetCombatHealth(attacker, cid, combat, -value*critical_percentage, -value*critical_percentage, CONST_ME_NONE)
				doSendAnimatedText(getCreaturePosition(cid), "CRITICAL "..tostring(critical_percentage).."%!", TEXTCOLOR_DARKRED)
			end
		end
	end
	return true
end
Editado por Lyon (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Não testei.

local config = {
    attack = 45,                  --Ataque mínimo da arma.
    chance = 25,                  --Chance de dar crítico.
    multiplier = 1.5,             --Multiplicador de crítico.
}
function onStatsChange(cid, attacker, type, combat, value)
    if type == STATSCHANGE_HEALTHLOSS and isPlayer(attacker) then
        for i = 5, 6 do
            local item = getPlayerSlotItem(attacker, i)
            if item then
                if getItemAttack(item) >= config.attack then
                    if math.random(1, 100) <= config.chance then
                        value = math.floor(value * config.multiplier)
                        doSendAnimatedText(getThingPos(cid), "CRITICAL!", TEXTCOLOR_DARKRED)
                        break
                    end
                end
            end
        end
    end
    return true
end
Editado por zipter98 (veja o histórico de edições)

não respondo pms solicitando suporte em programação/scripting

Link para o post
Compartilhar em outros sites
local config = {
	specific_weapons = "yes" -- Somente armas especificas poderãoo dar cri­tico? (("yes" / true) / ("no" / false))
	critical_chance = 25 -- 1 a 100
	critical_damage = 200 -- damage + critical_damage%
	critical_weapons = {
		[2400] = {30, 100},
		[2222] = {25, 200}
	}
}

config.specific_weapons = getBooleanFromString(config.specific_weapons)
function onStatsChange(cid, attacker, type, combat, value)
	if(type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS) then
		if(specific_weapons) then
			for weapon_ids, arrays in pairs(config.critical_weapons) do
				if(getPlayerSlotItem(attacker, CONST_SLOT_RIGHT).itemid == weapon_ids or getPlayerSlotItem(attacker, CONST_SLOT_LEFT).itemid == weapon_ids) then
					if(math.random(1,100) <= arrays[1]) then
						doTargetCombatHealth(attacker, cid, combat, -math.floor(value+(value*(arrays[2]/100))), -math.floor(value+(value*(arrays[2]/100))), CONST_ME_NONE)
						doSendAnimatedText(getThingPos(cid), "CRITICAL!", TEXTCOLOR_DARKRED) -- Só é permitido 9 caracteres
						return false
					end
				end
			end
		else
			if(math.random(1,100) <= config.critical_chance) then
				doTargetCombatHealth(attacker, cid, combat, -math.floor(value+(value*(config.critical_damage/100))), -math.floor(value+(value*(config.critical_damage/100))), CONST_ME_NONE)
				doSendAnimatedText(getThingPos(cid), "CRITICAL!", TEXTCOLOR_DARKRED)
				return false
			end
		end
	end
	return true
end

Não testei.

 

 

OBS: Magias também poderão dar critical.

Link para o post
Compartilhar em outros sites

Não testei.

local config = {
    attack = 45,                  --Ataque mínimo da arma.
    chance = 25,                  --Chance de dar crítico.
    multiplier = 1.5,             --Multiplicador de crítico.
}
function onStatsChange(cid, attacker, type, combat, value)
    if type == STATSCHANGE_HEALTHLOSS and isPlayer(attacker) then
        for i = 5, 6 do
            local item = getPlayerSlotItem(attacker, i)
            if item then
                if getItemAttack(item) >= config.attack then
                    if math.random(1, 100) <= config.chance then
                        value = math.floor(value * config.multiplier)
                        doSendAnimatedText(getThingPos(cid), "CRITICAL!", TEXTCOLOR_DARKRED)
                        break
                    end
                end
            end
        end
    end
    return true
end

 

 zipter98@Testei aqui e não acontece nada,aumentei a chance de critico usando uma arma de atack 48 e nada acontece,nenhum erro no console.

 

 

local config = {
	specific_weapons = "yes" -- Somente armas especificas poderãoo dar cri­tico? (("yes" / true) / ("no" / false))
	critical_chance = 25 -- 1 a 100
	critical_damage = 200 -- damage + critical_damage%
	critical_weapons = {
		[2400] = {30, 100},
		[2222] = {25, 200}
	}
}

config.specific_weapons = getBooleanFromString(config.specific_weapons)
function onStatsChange(cid, attacker, type, combat, value)
	if(type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS) then
		if(specific_weapons) then
			for weapon_ids, arrays in pairs(config.critical_weapons) do
				if(getPlayerSlotItem(attacker, CONST_SLOT_RIGHT).itemid == weapon_ids or getPlayerSlotItem(attacker, CONST_SLOT_LEFT).itemid == weapon_ids) then
					if(math.random(1,100) <= arrays[1]) then
						doTargetCombatHealth(attacker, cid, combat, -math.floor(value+(value*(arrays[2]/100))), -math.floor(value+(value*(arrays[2]/100))), CONST_ME_NONE)
						doSendAnimatedText(getThingPos(cid), "CRITICAL!", TEXTCOLOR_DARKRED) -- Só é permitido 9 caracteres
						return false
					end
				end
			end
		else
			if(math.random(1,100) <= config.critical_chance) then
				doTargetCombatHealth(attacker, cid, combat, -math.floor(value+(value*(config.critical_damage/100))), -math.floor(value+(value*(config.critical_damage/100))), CONST_ME_NONE)
				doSendAnimatedText(getThingPos(cid), "CRITICAL!", TEXTCOLOR_DARKRED)
				return false
			end
		end
	end
	return true
end

Não testei.

 

 

OBS: Magias também poderão dar critical.

 

 

 

MaTTch@ Cara ao carregar o script retornou erro no console abaixo:(esse negocio de magia dar critical é possivel mudar deixar se basear apenas no Attack da arma empunhada nas mãos?)

[14:11:34.484] [Error - LuaInterface::loadFile] data/creaturescripts/scripts/cr
tical.lua:3: '}' expected (to close '{' at line 1) near 'critical_chance'
[14:11:34.484] [Warning - Event::loadScript] Cannot load script (data/creatures
ripts/scripts/critical.lua)
[14:11:34.484] data/creaturescripts/scripts/critical.lua:3: '}' expected (to cl
se '{' at line 1) near 'critical_chance'

Ambos foram testados com :

 

Essa tag registrada em login.lua

 registerCreatureEvent(cid, 'CriticalHit')

E essa em creaturescripts.xml:

 <event type="statschange" name="CriticalHit" event="script" value="critical.lua"/>

Obrigado a todos que se empenham em me ajudar.

Editado por Lyon (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Esqueci das virgulas, tenta agora:

local config = {
    specific_weapons = "yes", -- Somente armas especificas poderãoo dar cri­tico? (("yes" / true) / ("no" / false))
    critical_chance = 25, -- 1 a 100
    critical_damage = 200, -- damage + critical_damage%
    critical_weapons = {
        [2400] = {30, 100},
        [2222] = {25, 200}
    }
}

config.specific_weapons = getBooleanFromString(config.specific_weapons)
function onStatsChange(cid, attacker, type, combat, value)
    if(type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS) then
        if(specific_weapons) then
            for weapon_ids, arrays in pairs(config.critical_weapons) do
                if(getPlayerSlotItem(attacker, CONST_SLOT_RIGHT).itemid == weapon_ids or getPlayerSlotItem(attacker, CONST_SLOT_LEFT).itemid == weapon_ids) then
                    if(math.random(1,100) <= arrays[1]) then
                        doTargetCombatHealth(attacker, cid, combat, -math.floor(value+(value*(arrays[2]/100))), -math.floor(value+(value*(arrays[2]/100))), CONST_ME_NONE)
                        doSendAnimatedText(getThingPos(cid), "CRITICAL!", TEXTCOLOR_DARKRED) -- Só é permitido 9 caracteres
                        return false
                    end
                end
            end
        else
            if(math.random(1,100) <= config.critical_chance) then
                doTargetCombatHealth(attacker, cid, combat, -math.floor(value+(value*(config.critical_damage/100))), -math.floor(value+(value*(config.critical_damage/100))), CONST_ME_NONE)
                doSendAnimatedText(getThingPos(cid), "CRITICAL!", TEXTCOLOR_DARKRED)
                return false
            end
        end
    end
    return true
end
Link para o post
Compartilhar em outros sites

 

Esqueci das virgulas, tenta agora:

local config = {
    specific_weapons = "yes", -- Somente armas especificas poderãoo dar cri­tico? (("yes" / true) / ("no" / false))
    critical_chance = 25, -- 1 a 100
    critical_damage = 200, -- damage + critical_damage%
    critical_weapons = {
        [2400] = {30, 100},
        [2222] = {25, 200}
    }
}

config.specific_weapons = getBooleanFromString(config.specific_weapons)
function onStatsChange(cid, attacker, type, combat, value)
    if(type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS) then
        if(specific_weapons) then
            for weapon_ids, arrays in pairs(config.critical_weapons) do
                if(getPlayerSlotItem(attacker, CONST_SLOT_RIGHT).itemid == weapon_ids or getPlayerSlotItem(attacker, CONST_SLOT_LEFT).itemid == weapon_ids) then
                    if(math.random(1,100) <= arrays[1]) then
                        doTargetCombatHealth(attacker, cid, combat, -math.floor(value+(value*(arrays[2]/100))), -math.floor(value+(value*(arrays[2]/100))), CONST_ME_NONE)
                        doSendAnimatedText(getThingPos(cid), "CRITICAL!", TEXTCOLOR_DARKRED) -- Só é permitido 9 caracteres
                        return false
                    end
                end
            end
        else
            if(math.random(1,100) <= config.critical_chance) then
                doTargetCombatHealth(attacker, cid, combat, -math.floor(value+(value*(config.critical_damage/100))), -math.floor(value+(value*(config.critical_damage/100))), CONST_ME_NONE)
                doSendAnimatedText(getThingPos(cid), "CRITICAL!", TEXTCOLOR_DARKRED)
                return false
            end
        end
    end
    return true
end
Não funcionou,vou postar um script que eu possuo que funciona perfeitamente para mim,apenas gostaria que houvesse a opção de selecionar a a arma que vai causar o critico e a porcentagem e o dano dela igual você criou nesse script acima:
critical_weapons = {
        [2400] = {30, 100},
        [2222] = {25, 200}
    }

Esse script que eu vou postar para analise do funcionamento eu rodo ele com uma função nova na minha LIB,que seria essa:

function getWeaponSkill(itemid)
if itemid == 0 then
return 0
end
local skill = {[0]=0, [2]=1, [1]=2, [3]=3, [7]=4, [6]=7}
return skill[getItemInfo(itemid).weaponType]
end

function getPlayerWeaponSkill(cid)
return getWeaponSkill(getPlayerWeapon(cid).itemid)
end

Se conseguir incrementar nesse script apenas a função de poder escolher a arma,chance e porcetagem, no lugar de escolher as vocações ta perfeito,pois ele se baseia pela skill,então um mage nao sera efetivo usando uma arma dessa!:

local tabelachance={    -- Aqui e a chance que cada voc tem, por exemplo a voc numero 4 tem 6% de chance de dar critical.
[4]=6,
[8]=7,
[12]=12,
[16]=16
}


function onAttack(cid,target)
    local weapon = getPlayerWeapon(cid)
    if weapon.uid == 0 then
        return true
    end
    local atk = getItemInfo(weapon.itemid).attack + getItemInfo(weapon.itemid).extraAttack
    if atk < 45 then
        return true
    end
    if getDistanceBetween(getCreaturePos(cid), getCreaturePos(target)) > 1 then
        return TRUE
    end
    
local textos = {         -- Textos que aparecerao para quando for executado o critical.
[1] = 'Feel My Power!',
[2] = 'For Honor!',
[3] = 'This Safe, Dammit!',
[4] = '',
}

local healing = {   --o healing que o critical pode dar, 10%..10% etc.
[1] = 0.10,
[2] = 0.15,
[3] = 0.10,
}

    local skill = getPlayerSkillLevel(cid, getPlayerWeaponSkill(cid))
    local level = getPlayerLevel(cid)
    
    --Formula para se basear no dano--
    local formula1 = level*atk*skill   --formula 1
    local formula2 = formula1/150      --formula 2
    local formula = math.floor(formula2/6+math.random(10, 50)) --formula final, o player hitará isso
    local text = "Critical!"    --texto animado
    local text_color = COLOR_GREY
    local effect = 31   --efeito que vai dar no alvo.
    local rand1 = math.random(1,100)
    local vid = getPlayerVocation(cid)
    
    if tabelachance[vid] and rand1 <= tabelachance[vid] then
        doSendAnimatedText(getCreaturePosition(cid), text, text_color)
        doCreatureAddHealth(cid, getCreatureMaxHealth(cid)*healing[math.random(1,#healing)])
        doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, (-formula), (-formula), effect)
        doPlayerSay(cid, textos[math.random(1,#textos)], TALKTYPE_ORANGE_1)
    end
    return true
end
<event type="attack" name="critical" event="script" value="critico.lua"/>
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