• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

RevScripts Script to strengthen monster attacks

alcapone

Member
Joined
Jan 13, 2021
Messages
247
Reaction score
19
if the player has storage X receives 5% more damage from monsters if the player has Y storage receives 10% more damage from monsters
 
Solution
your second way is really better
Lua:
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...
To 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. ?
 
To 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
 
your second way is really better
Lua:
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
 
Last edited:
Solution
Lua:
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?
 
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?
Lua:
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()

Should work
 
Awesome! this work for me too, thanks levi :).
One question, the damage coming are just for monsters? or work for damage from another player too?
 
Last edited:
Levi, can you help me to make this same script but only work for players?

making something like this:

Lua:
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
 
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 and minDamagePercent, they are commented out in the script so that there is no minimum or maximum limit.

The area 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()
 
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 and minDamagePercent, they are commented out in the script so that there is no minimum or maximum limit.

The area 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()
I can make all the damage the player does to the monster have reduction?
 
Back
Top