your second way is really better
local creatureEvent = CreatureEvent("creatureEventTest")
function creatureEvent.onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin)
if attacker and attacker:isPlayer() then
return primaryDamage, primaryType, secondaryDamage, secondaryType
end
if creature and creature:isPlayer() then
local storage = math.max(0, player:getStorageValue(5000))
for i = 1, storage do
primaryDamage = primaryDamage - (primaryDamage * 1 / 100)
secondaryDamage = secondaryDamage - (secondaryDamage * 1 / 100)
end
end
return primaryDamage, primaryType, secondaryDamage, secondaryType
end...
your second way is really betterTo make it clear
If u use 2 different storage for something like this people will receive 15% in total extra dmg.
do u prefer something like this better?
If player has storage number 500 = 10x times means he will receive 10% more dmg from monster
if he has 20x times means he will receive 20% more dmg etc. etc. ?
your second way is really better
local creatureEvent = CreatureEvent("creatureEventTest")
function creatureEvent.onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin)
if attacker and attacker:isPlayer() then
return primaryDamage, primaryType, secondaryDamage, secondaryType
end
if creature and creature:isPlayer() then
local storage = math.max(0, player:getStorageValue(5000))
for i = 1, storage do
primaryDamage = primaryDamage - (primaryDamage * 1 / 100)
secondaryDamage = secondaryDamage - (secondaryDamage * 1 / 100)
end
end
return primaryDamage, primaryType, secondaryDamage, secondaryType
end
creatureEvent:type("healthchange")
creatureEvent:register()
local creatureEvent = CreatureEvent("test")
function creatureEvent.onLogin(player)
player:registerEvent("creatureEventTest")
return true
end
creatureEvent:type("login")
creatureEvent:register()
a doubt I can make a limitation only for active in a poz X to yLua:local creatureEvent = CreatureEvent("creatureEventTest") function creatureEvent.onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin) if attacker and attacker:isPlayer() then return primaryDamage, primaryType, secondaryDamage, secondaryType end if creature and creature:isPlayer() then local storage = math.max(0, player:getStorageValue(5000)) for i = 1, storage do primaryDamage = primaryDamage - (primaryDamage * 1 / 100) secondaryDamage = secondaryDamage - (secondaryDamage * 1 / 100) end end return primaryDamage, primaryType, secondaryDamage, secondaryType end creatureEvent:type("healthchange") creatureEvent:register() local creatureEvent = CreatureEvent("test") function creatureEvent.onLogin(player) player:registerEvent("creatureEventTest") return true end creatureEvent:type("login") creatureEvent:register()
try this
a doubt I can make a limitation only for active in a poz X to y
local positionsIconeglobalevent = {
fromPosition = Position(33481, 32766, 14),
toPosition = Position(33792, 32989, 14)
}
if player:getPosition():isInRange(positionsIconeglobalevent.fromPosition, positionsIconeglobalevent.toPosition) then
if i put this at the beginning can it cause problems?
local positionsIconeglobalevent = {
fromPosition = Position(33481, 32766, 14),
toPosition = Position(33792, 32989, 14)
}
local creatureEvent = CreatureEvent("creatureEventTest")
function creatureEvent.onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin)
if attacker and attacker:isPlayer() then
return primaryDamage, primaryType, secondaryDamage, secondaryType
end
if creature and creature:isPlayer() then
if player:getPosition():isInRange(positionsIconeglobalevent.fromPosition, positionsIconeglobalevent.toPosition) then
local storage = math.max(0, player:getStorageValue(5000))
for i = 1, storage do
primaryDamage = primaryDamage - (primaryDamage * 1 / 100)
secondaryDamage = secondaryDamage - (secondaryDamage * 1 / 100)
end
end
end
return primaryDamage, primaryType, secondaryDamage, secondaryType
end
creatureEvent:type("healthchange")
creatureEvent:register()
local creatureEvent = CreatureEvent("test")
function creatureEvent.onLogin(player)
player:registerEvent("creatureEventTest")
return true
end
creatureEvent:type("login")
creatureEvent:register()
local storage = math.max(0, creature:getStorageValue(757557))
local creatureScore = target:getStorageValue(757557)
if storage < 0 then
storage = 0
end
if storage > creatureScore then
local comparation = math.abs((creatureScore * 100)/storage)
primaryDamage = (primaryDamage * comparation) / 100
secondaryDamage = (secondaryDamage * comparation) / 100
else
primaryDamage = primaryDamage
secondaryDamage = secondaryDamage
end
bumpin this same script if I want to make the player's damage weaker on the monster would it be possible?
Eq
Gt
Lt
Ge
Le
Ne
Exists
Time
Value
Current
maxDamagePercent
and minDamagePercent
, they are commented out in the script so that there is no minimum or maximum limit.area
is defined, but you can comment it out or remove it to make this work everywhere.-- "Constants":
local Eq = function (player, storage, value) return player.storage[storage] == value end
local Gt = function (player, storage, value) return player.storage[storage] > value end
local Lt = function (player, storage, value) return player.storage[storage] < value end
local Ge = function (player, storage, value) return player.storage[storage] >= value end
local Le = function (player, storage, value) return player.storage[storage] <= value end
local Ne = function (player, storage, value) return player.storage[storage] ~= value end
local Exists = function (player, storage) return player.storage[storage] ~= -1 end
local Time = function (player, storage) return player.storage[storage] >= os.time() end
local Value = function (value, lambda)
return function (player, storage) return lambda(player, storage, value) end
end
local Current = function (player, storage) return player.storage[storage] end
-- Config:
local config = {
storages = {
[1000] = { value = Value(1, Eq), damagePercent = 5 }, -- If storage 1000 is equal to 1 then do 5% damagePercent
[1001] = { value = Time, damagePercent = 10 }, -- If storage 1001 is greater than os.time() then do 10% damagePercent
[1002] = { value = Value(100, Ge), damagePercent = 15 }, -- If storage 1002 is greater than or equal to 100 then do 15% damagePercent
[1003] = { value = Exists, damagePercent = Current } -- If storage 1003 exists then do damagePercent equal to the current value
},
area = {
from = Position(100, 100, 7),
to = Position(110, 110, 7)
}
--maxDamagePercent = 100,
--minDamagePercent = -100
}
-- Functions:
local monsterDamageIncrease = CreatureEvent("monsterDamageIncrease")
function monsterDamageIncrease.onHealthChange(player, monster, damage1, type1, damage2, type2)
if monster:isPlayer() then
return damage1, type1, damage2, type2
end
if config.area and not player:getPosition():isInRange(config.area.from, config.area.to) then
return damage1, type1, damage2, type2
end
local damagePercent = 0
for storage, data in pairs(config.storages) do
if data.value(player, storage) then
if type(data.damagePercent) ~= "number" then
damagePercent = damagePercent + data.damagePercent(player, storage)
else
damagePercent = damagePercent + data.damagePercent
end
end
end
if damagePercent ~= 0 then
if config.maxDamagePercent then damagePercent = math.min(damagePercent, config.maxDamagePercent) end
if config.minDamagePercent then damagePercent = math.max(damagePercent, config.minDamagePercent) end
damage1 = damage1 + (damage1 * damagePercent / 100)
damage2 = damage2 + (damage2 * damagePercent / 100)
end
return damage, type1, damage2, type2
end
monsterDamageIncrease:register()
local monsterDamageLogin = CreatureEvent("monsterDamageLogin")
function monsterDamageLogin.onLogin(player)
player:registerEvent("monsterDamageIncrease")
return true
end
monsterDamageLogin:register()
I can make all the damage the player does to the monster have reduction?This code is similar to the one published as a solution, negative values are accepted in the storages, you just have to pay attention to the examples to understand how to create storages with the variables:Eq
Gt
Lt
Ge
Le
Ne
Exists
Time
Value
Current
You can set a minimum and maximum limit only by defining the fields:maxDamagePercent
andminDamagePercent
, they are commented out in the script so that there is no minimum or maximum limit.
Thearea
is defined, but you can comment it out or remove it to make this work everywhere.
Lua:-- "Constants": local Eq = function (player, storage, value) return player.storage[storage] == value end local Gt = function (player, storage, value) return player.storage[storage] > value end local Lt = function (player, storage, value) return player.storage[storage] < value end local Ge = function (player, storage, value) return player.storage[storage] >= value end local Le = function (player, storage, value) return player.storage[storage] <= value end local Ne = function (player, storage, value) return player.storage[storage] ~= value end local Exists = function (player, storage) return player.storage[storage] ~= -1 end local Time = function (player, storage) return player.storage[storage] >= os.time() end local Value = function (value, lambda) return function (player, storage) return lambda(player, storage, value) end end local Current = function (player, storage) return player.storage[storage] end -- Config: local config = { storages = { [1000] = { value = Value(1, Eq), damagePercent = 5 }, -- If storage 1000 is equal to 1 then do 5% damagePercent [1001] = { value = Time, damagePercent = 10 }, -- If storage 1001 is greater than os.time() then do 10% damagePercent [1002] = { value = Value(100, Ge), damagePercent = 15 }, -- If storage 1002 is greater than or equal to 100 then do 15% damagePercent [1003] = { value = Exists, damagePercent = Current } -- If storage 1003 exists then do damagePercent equal to the current value }, area = { from = Position(100, 100, 7), to = Position(110, 110, 7) } --maxDamagePercent = 100, --minDamagePercent = -100 } -- Functions: local monsterDamageIncrease = CreatureEvent("monsterDamageIncrease") function monsterDamageIncrease.onHealthChange(player, monster, damage1, type1, damage2, type2) if monster:isPlayer() then return damage1, type1, damage2, type2 end if config.area and not player:getPosition():isInRange(config.area.from, config.area.to) then return damage1, type1, damage2, type2 end local damagePercent = 0 for storage, data in pairs(config.storages) do if data.value(player, storage) then if type(data.damagePercent) ~= "number" then damagePercent = damagePercent + data.damagePercent(player, storage) else damagePercent = damagePercent + data.damagePercent end end end if damagePercent ~= 0 then if config.maxDamagePercent then damagePercent = math.min(damagePercent, config.maxDamagePercent) end if config.minDamagePercent then damagePercent = math.max(damagePercent, config.minDamagePercent) end damage1 = damage1 + (damage1 * damagePercent / 100) damage2 = damage2 + (damage2 * damagePercent / 100) end return damage, type1, damage2, type2 end monsterDamageIncrease:register() local monsterDamageLogin = CreatureEvent("monsterDamageLogin") function monsterDamageLogin.onLogin(player) player:registerEvent("monsterDamageIncrease") return true end monsterDamageLogin:register()