Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

Fiz esse script, pra tentar "balancear" as vocations de uma maneira diferente: Melhorar oque eu acho fraco, sem piorar oque está "forte".

Por exemplo: Sorcerers que deveriam ser a vocation de dano, bate menos que um druid, visto que ele tem o exevo gran frigo hur, então ao invés de eu editar o gran frigo hur, ou adicionar um "exevo gran flam hur", eu fiz com que os sorceres tenham uma % de chance de dar burn/electrify/curse quando bater com fire, energy e death (respectivamente). Aí deixei varias possibilidades de configurações, e cada um vai editando oq achar necessario até achar um ponto de "equilibrio" ?

 

Oque cada vocation pode fazer:

Spoiler

 

Knights:

Podem dar Bleed (x Vezes, com intervalo t, variando de y% a z% do dano)

Podem dar Block (variando de x a y % do dano recebido)

 

Paladins:

Podem dar Headshot (x% de chance de dar de y a z vezes a mais de dano)

Podem dar Bleed (x Vezes, com intervalo t, variando de y% a z% do dano)

 

Sorceres:

Podem dar Burn, curse, ou eletrify(x Vezes, com intervalo t, variando de y% a z% do dano)

 

Druids

podem dar Paralyze (quando bate com terra)

podem dar Freeze( quando bate com ice)

 

 

Adicionando o Script

em data/creaturescripts/creaturescripts.xml adicione a tag:

<event type="healthchange" name="balancevoc" script="vocation_balance.lua"/>

 

em data/creaturescript/scripts/login.lua (ou login_events, depende do teu sv) coloque a tag:

player:registerEvent("balancevoc)

 

em data/creaturescript/scripts adicione o arquivo vocation_balance.lua, abra-o e coloque o seguinte script:

Spoiler

local balance = {
--All
timesRepeatCondition = 3
intervalCondition = 900
--Knight
canBlock = true,
canBleed = true,
blockChance = 10,
bleedChance = 10,
blockMaxEffect = 70, -- %
blockMinEffect = 20, -- %
bleedMaxDmg = 60, -- this means the percent of the atk dmg =)
bleedMinDmg = 20, -- this means the percent of the atk dmg =)

--Paladin
canHeadShot = true, -- like a critical
canBleedRP = false, -- 
headshootChance = 1,
bleedChanceRP = 15,
headshootMaxMultiplier = 1.3, -- 2.5x dmg (less than 1 means a dmg reduction instead of a bonus!)
headshootMinMultiplier = 1.0, -- 1.1x dmg (less than 1 means a dmg reduction instead of a bonus!)
bleedMaxDmgRP = 50, -- this means the percent of the atk dmg =)
bleedMinDmgRP = 10, -- this means the percent of the atk dmg =)

--Sorcerer
canBurn = true, -- true or false
canEletrify = true, -- true or false
canCurse = true, -- true or false
burnChance = 10,
eletrifyChance = 10,
curseChance = 10,
burnMaxDmg = 60, -- this means the percent of the atk dmg =)
eletrifyMaxDmg = 60, -- this means the percent of the atk dmg =)
curseMaxDmg = 60, -- this means the percent of the atk dmg =)
burnMinDmg = 20, -- this means the percent of the atk dmg =)
eletrifyMinDmg = 20, -- this means the percent of the atk dmg =)
curseMinDmg = 20, -- this means the percent of the atk dmg =)

--Druid
canParalyze = true, -- true or false
canFreeze = false, -- true or false
paralyzeChance = 10,
freezeChance = 10,
paralyzeMaxEffect = 750, -- for example: 100 = ingame speed 50
paralyzeMinEffect = 350,
freezeMaxDmg = 60, -- this means the percent of the atk dmg =)
freezeMinDmg = 20, -- this means the percent of the atk dmg =)
}

function onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin)
		if primaryType == COMBAT_HEALING then
			return primaryDamage, primaryType, secondaryDamage, secondaryType
		end
		if not attacker then
			return primaryDamage, primaryType, secondaryDamage, secondaryType
		end
	local dmg = 0
	local block = math.random(100)
	local headshot = math.random(100)
	local rand = math.random(100)
		local atacado = creature:getMonster()
	if not atacado then
atacado = creature
	end
	
		if attacker:isPlayer() then
		-- KNIGHTS
			if attacker:getVocation():getClientId() == 1 then
				if balance.canBleed == true then
					if rand <= balance.bleedChance then
				dmg = primaryDamage * math.random(balance.bleedMinDmg, balance.bleedMaxDmg)/100
				  local condition = Condition(CONDITION_BLEEDING)
						condition:setParameter(CONDITION_PARAM_DELAYED, 1)
						condition:addDamage(balance.timesRepeatCondition, balance.intervalCondition, -dmg)
						atacado:addCondition(condition)
					end
				end
			end
		-- PALADINS
			if attacker:getVocation():getClientId() == 2 then
				if balance.canBleedRP == true then
					if primaryType == COMBAT_PHYSICALDAMAGE then
						if rand <= balance.bleedChanceRP then
				dmg = primaryDamage * math.random(balance.bleedMinDmgRP, balance.bleedMaxDmgRP)/100
							local condition = Condition(CONDITION_BLEEDING)
							condition:setParameter(CONDITION_PARAM_DELAYED, 1)
							condition:addDamage(balance.timesRepeatCondition, balance.intervalCondition, -dmg)
							atacado:addCondition(condition)
						end
					end
				end
				if balance.canHeadShot == true then
				local hs = (math.random(balance.headshootMinMultiplier, balance.headshootMaxMultiplier))
						if headshot <= balance.headshootChance then
							if primaryDamage > 0 then
								primaryDamage = primaryDamage * hs
								creature:say("HEADSHOT!", TALKTYPE_MONSTER_SAY)
							end		
						end
				end
			end
		-- SORCERERS
			if attacker:getVocation():getClientId() == 3 then
				if balance.canBurn == true then
					if primaryType == COMBAT_FIREDAMAGE then
						if rand <= balance.burnChance then
				dmg = primaryDamage * math.random(balance.burnMinDmg, balance.burnMaxDmg)/100
							local condition = Condition(CONDITION_FIRE)
							condition:setParameter(CONDITION_PARAM_DELAYED, 1)
							condition:addDamage(balance.timesRepeatCondition, balance.intervalCondition, -dmg)
							atacado:addCondition(condition)
						end
					end
				end
				if balance.canEletrify == true then
					if primaryType == COMBAT_ENERGYDAMAGE then
						if rand <= balance.eletrifyChance then
				dmg = primaryDamage * math.random(balance.eletrifyMinDmg, balance.eletrifyMaxDmg)/100
							local condition = Condition(CONDITION_ENERGY)
							condition:setParameter(CONDITION_PARAM_DELAYED, 1)
							condition:addDamage(balance.timesRepeatCondition, balance.intervalCondition, -dmg)
							atacado:addCondition(condition)
						end
					end				
				end
				if balance.canCurse == true then
					if primaryType == COMBAT_DEATHDAMAGE then
						if rand <= balance.curseChance then
				dmg = primaryDamage * math.random(balance.curseMinDmg, balance.curseMaxDmg)/100
							local condition = Condition(CONDITION_CURSED)
							condition:setParameter(CONDITION_PARAM_DELAYED, 1)
							condition:addDamage(balance.timesRepeatCondition, balance.intervalCondition, -dmg)
							atacado:addCondition(condition)
						end
					end							
				end			
			end
		-- DRUIDS
			if attacker:getVocation():getClientId() == 4 then
				if balance.canParalyze == true then
					if primaryType == COMBAT_EARTHDAMAGE then
						if rand <= balance.paralyzeChance then				
							local para = math.random(balance.paralyzeMinEffect, balance.paralyzeMaxEffect)
							local condition = Condition(CONDITION_PARALYZE)
							condition:setParameter(CONDITION_PARAM_TICKS, 500)
							condition:setFormula(-1, para, -1, para)
							atacado:addCondition(condition)
						end
					end
				end
				if balance.canFreeze == true then
					if primaryType == COMBAT_ICEDAMAGE then
						if rand <= balance.freezeChance then				
				dmg = primaryDamage * math.random(balance.freezeMinDmg, balance.freezeMaxDmg)/100
							local condition = Condition(CONDITION_FREEZING)
							condition:setParameter(CONDITION_PARAM_DELAYED, 1)
							condition:addDamage(balance.timesRepeatCondition, balance.intervalCondition, -dmg)
							atacado:addCondition(condition)
						end
					end
				end	
			end
		end
		
	-- KNIGHT BLOCK
			if creature:isPlayer() and (creature:getVocation():getClientId()) == 1 then
				if balance.canBlock == true then
					if block <= balance.blockChance then 
					local blockpercent = math.random(balance.blockMinEffect, balance.blockMaxEffect)
						creature:say("BLOCK!", TALKTYPE_MONSTER_SAY)
						if primaryDamage > 0 then
							primaryDamage = primaryDamage * (blockpercent)/100
						end
						if secondaryDamage > 0 then
							secondaryDamage = secondaryDamage * (blockpercent)/100
						end
					end
				end
			end
	 return primaryDamage, primaryType, secondaryDamage, secondaryType
end

 

 

Então vá até data/events/events.xml, procure por:

<event class="Creature" method="onTargetCombat" enabled="0" />

E mude enabled="0" para enabled="1"

 

Aí abra data/events/scripts/creature.lua, procure por function Creature:onTargetCombat(target) e abaixo, coloque a tag:

target:registerEvent("balancevoc")

 

 

E pronto, tá feito o sorvetinho ?

 

MEUS POSTS:

 

SE AJUDEI, DÁ O REP+, ESQUECE NÃO, VLW BB <3

  • Respostas 23
  • Visualizações 4k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • Só uma observação, mas nada demais... Esse tipo de verificação não é necessária if balance.canBlock == true then Você pode fazer apenas if balance.canBlock then Caso seja true, ele

  • @Movie @Mor3nao @diarmaint acho q da p simplesmente fazer um if creature:isPlayer() and (creature:getVocation():getClientId()) >= 1 then q deve funfar pra todas  

  • Tem essa opção também, mas pegaria tecnicamente todas... Caso fosse somente a 1 e a 3, teria que ser pelo or mesmo. Mas boa observação!

Postado

Só uma observação, mas nada demais...

Esse tipo de verificação não é necessária

if balance.canBlock == true then

Você pode fazer apenas

if balance.canBlock then

Caso seja true, ele vai passar normalmente, caso for false ele para ali e nem termina de executar o código.

Postado
  • Autor
9 horas atrás, Movie disse:

Só uma observação, mas nada demais...

Esse tipo de verificação não é necessária


if balance.canBlock == true then

Você pode fazer apenas


if balance.canBlock then

Caso seja true, ele vai passar normalmente, caso for false ele para ali e nem termina de executar o código.

Humm.. nao sabia, mas estranho, pq as vezes qd vou checar storages, se a storage é 0, ela passa do mesmo jeito, teoricamente isso deveria ter o mesmo efeito que true e false, nao? mas de qualquer forma, bom saber xD

MEUS POSTS:

 

SE AJUDEI, DÁ O REP+, ESQUECE NÃO, VLW BB <3

Postado
1 hora atrás, Mor3nao disse:

Humm.. nao sabia, mas estranho, pq as vezes qd vou checar storages, se a storage é 0, ela passa do mesmo jeito, teoricamente isso deveria ter o mesmo efeito que true e false, nao? mas de qualquer forma, bom saber xD

Quando você usa com storage, você precisa comparar, porque a storage pode assumir diversos valores.

 

Por exemplo, se você tentar fazer isso, você vai comparar o valor com o que? Isso o lua não entende

if player:getStorageValue(1771) then

 

O certo seria 

if player:getStorageValue(1771) == (valor) then

 

Não sei se conseguiu entender.. caso não tenha entendido me avisa.

Postado
1 hora atrás, Mor3nao disse:

pq as vezes qd vou checar storages, se a storage é 0, ela passa do mesmo jeito, teoricamente isso deveria ter o mesmo efeito que true e false, nao?

Apenas complementando a explicação do @Movie, a função que busca o valor de uma storage pode retornar tanto nil (nulo) ou -1 quando o jogador não possui essa storage, e qualquer valor que não seja nulo vai fazer o if retornar verdadeiro, seja esse valor 0 ou até mesmo valores negativos.

 

 

 

Nós somos aquilo que fazemos repetidamente. Excelência, não é um modo de agir, mas um hábito.

                                                                                                                                                                                                                                        Aristóteles 

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

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo