• 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!

[LUA] & possibly [C++] requests - Sizaro

Sizaro

Advanced OT User
Joined
Aug 20, 2007
Messages
5,151
Solutions
5
Reaction score
210
Location
Sweden
GitHub
coldensjo
So I've been playing around with a new server of mine for a while now and I need a few things, thought I'd request them.

(If you have a better idea that works the same way please let me know)

[DONE] #1: onLogin add outfit (once) based on gender and vocation.
Thanks Ninja
Heres the code:

data\creaturescripts\Actions.xml
Code:
    <event type="login" name="FirstOutfit" script="firstoutfit.lua"/>

data\creaturescripts\scripts\firstoutfit.lua
Code:
local config = {
[1] = {female = 575, male = 574},
[2] = {female = 269, male = 268},
[3] = {female = 142, male = 134},
[4] = {female = 138, male = 130},
[5] = {female = 148, male = 144},
[6] = {female = 137, male = 129}
}

function onLogin(cid)
local player = Player(cid)
local targetVocation = config[player:getVocation():getBase():getId()]
if not targetVocation then
return true
end

if player:hasOutfit(player:getSex() == 0 and targetVocation.female or targetVocation.male) then
return true
end

player:addOutfit(targetVocation.female)
player:addOutfit(targetVocation.male)
return true
end

\data\global or compat.lua
bottom add:

Code:
add this to your global/compat.lua, credits goes to dalkon
function Vocation.getBase(self)
local demotion = self:getDemotion()
while demotion do
local tmp = demotion:getDemotion()
if not tmp then
return demotion
end
demotion = tmp
end
return self
end



[DONE] #2: Dual-Wielding daggers (Swords)

Thanks hakeee

IHgvn3a.png


[DONE] #3: Teleport to house exit function StepIn.
Thanks Ninja
Heres the code:

data\movements\movements.xml
Code:
<movevent event="StepIn" actionid="x" script="houseTeleport.lua" />

data\movements\scripts\houseTeleport.lua
Code:
function onStepIn(cid, item, position, fromPosition)
local player = Player(cid)
if not player then
return true
end

local house = player:getHouse()
if not house then
player:teleportTo(fromPosition, true)
fromPosition:sendMagicEffect(CONST_ME_TELEPORT)
return true
end

player:teleportTo(house:getExitPosition())
player:getPosition():sendMagicEffect(CONST_ME_TELEPORT)
return true
end

[DONE] #3: Summons following you
XML:
<talkaction words="utevo res" separator=" " script="summonmonster.lua" />
Lua:
local summonables = {
    'Rat',
    'Bat',
    'Cat'
}
local sum = {}
for _, mon in pairs(summonables) do -- LOWERCASE ALL MONSTER NAMES FOR COMPARISON WITH PARAMETER
    table.insert(sum,mon:lower())
end
function onSay(player, words, param)
    local name = param:match('%a+')
    if not name then
        player:sendCancelMessage('Invalid parameters.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    if #player:getSummons() > 1 then
        player:sendCancelMessage('You cannot summon any more creatures.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    if not isInArray(sum,name:lower()) then
        player:sendCancelMessage('You cannot summon this monster.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    local monster = Game.createMonster(name, player:getPosition())
    if not monster then
        player:sendCancelMessage('There is not enough room.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    monster:setMaster(player)
    monster:registerEvent('summonfollow')
    return false
end
and then in creaturescripts.xml
XML:
<event type="think" name="summonfollow" script="summonfollow.lua" />
and in summonfollow.lua
Lua:
function onThink(cid, interval)
    local cpos = cid:getPosition()
    local ppos = cid:getMaster():getPosition()
    if cpos.z ~= ppos.z or math.abs(cpos.x - ppos.x) > 8 or math.abs(cpos.y - ppos.y) > 6 then
        cid:teleportTo(ppos)
    end
    return true
end
don't forget to remove utevo res from spells.xml
 
Last edited:
Solution
It's probably best done in source code but I reckon you could handle all that in LUA
Ok so, if you handle utevo res as a talk action like this
XML:
<talkaction words="utevo res" separator=" " script="summonmonster.lua" />
Lua:
local summonables = {
    'Rat',
    'Bat',
    'Cat'
}
local sum = {}
for _, mon in pairs(summonables) do -- LOWERCASE ALL MONSTER NAMES FOR COMPARISON WITH PARAMETER
    table.insert(sum,mon:lower())
end
function onSay(player, words, param)
    local name = param:match('%a+')
    if not name then
        player:sendCancelMessage('Invalid parameters.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    if #player:getSummons() > 1 then
        player:sendCancelMessage('You...
@Aled I used the onKill one and I still get the error sometimes. The second one didn't work at all.

Btw Aled, can we add exhaust to this
Lua:
--------- CONFIG ------
local summonables = {
    ['Skunk'] = {level = 25, mana = 200},
    ['Rat'] = {level = 25, mana = 200},
    ['Badger'] = {level = 25, mana = 200},
    ['Snake'] = {level = 25, mana = 205},
    ['Spider'] = {level = 25, mana = 210},
    ['Chicken'] = {level = 25, mana = 220},
    ['Rabbit'] = {level = 25, mana = 220},
    ['Silver Rabbit'] = {level = 25, mana = 220},
    ['Cat'] = {level = 25, mana = 220},
    ['Dog'] = {level = 25, mana = 220},
    ['Poodle'] = {level = 25, mana = 220},
    ['Squirrel'] = {level = 25, mana = 220},
    ['Enraged Squirrel'] = {level = 25, mana = 220},
    ['Thieving Squirrel'] = {level = 25, mana = 220},
    ['Black Sheep'] = {level = 25, mana = 250},
    ['Flamingo'] = {level = 25, mana = 250},
    ['Green Frog'] = {level = 25, mana = 250},
    ['Parrot'] = {level = 25, mana = 250},
    ['Seagull'] = {level = 25, mana = 250},
    ['Bat'] = {level = 25, mana = 250},
    ['Cave Rat'] = {level = 25, mana = 250},
    ['Bug'] = {level = 25, mana = 250},
    ['Sandcrawler'] = {level = 25, mana = 250},
    ['Pig'] = {level = 25, mana = 255},
    ['Wolf'] = {level = 25, mana = 255},
    ['Deer'] = {level = 25, mana = 260},
    ['Winter Wolf'] = {level = 25, mana = 260},
    ['Poison Spider'] = {level = 25, mana = 270},
    ['Hyaena'] = {level = 25, mana = 275},
    ['Cobra'] = {level = 25, mana = 275},
    ['Wasp'] = {level = 25, mana = 280},
    ['Penguin'] = {level = 25, mana = 290},
    ['Island Troll'] = {level = 25, mana = 290},
    ['Troll'] = {level = 25, mana = 290},
    ['Goblin'] = {level = 25, mana = 300},
    ['Goblin Leader'] = {level = 25, mana = 300},
    ['Frost Troll'] = {level = 25, mana = 300},
    ['Bear'] = {level = 25, mana = 300},
    ['Panda'] = {level = 25, mana = 300},
    ['Orc'] = {level = 25, mana = 300},
    ['Skeleton'] = {level = 25, mana = 300},
    ['Crazed Beggar'] = {level = 25, mana = 300},
    ['Crab'] = {level = 25, mana = 305},
    ['Orc Spearman'] = {level = 25, mana = 310},
    ['Scorpion'] = {level = 25, mana = 310},
    ['Polar Bear'] = {level = 25, mana = 315},
    ['Swamp Troll'] = {level = 25, mana = 320},
    ['Lion'] = {level = 25, mana = 320},
    ['Dwarf'] = {level = 25, mana = 320},
    ['Minotaur'] = {level = 25, mana = 330},
    ['Centipede'] = {level = 25, mana = 335},
    ['Troll Champion'] = {level = 25, mana = 350},
    ['Crocodile'] = {level = 25, mana = 350},
    ['Skeleton Warrior'] = {level = 25, mana = 350},
    ['Larva'] = {level = 25, mana = 355},
    ['Orc Warrior'] = {level = 25, mana = 360},
    ['Dwarf Soldier'] = {level = 25, mana = 360},
    ['Smuggler'] = {level = 25, mana = 390},
    ['Amazon'] = {level = 25, mana = 390},
    ['Minotaur Archer'] = {level = 25, mana = 390},
    ['Scarab'] = {level = 25, mana = 395},
    ['Toad'] = {level = 25, mana = 400},
    ['Husky'] = {level = 25, mana = 420},
    ['Tiger'] = {level = 25, mana = 420},
    ['Rabbit'] = {level = 25, mana = 420},
    ['Dwarf Miner'] = {level = 25, mana = 420},
    ['Wild Warrior'] = {level = 25, mana = 420},
    ['Nomad'] = {level = 25, mana = 420},
    ['Undead Mine Worker'] = {level = 25, mana = 435},
    ['Bandit'] = {level = 25, mana = 450},
    ['Ghoul'] = {level = 25, mana = 450},
    ['Valkyrie'] = {level = 25, mana = 450},
    ['Tarantula'] = {level = 25, mana = 485},
    ['Cyclops'] = {level = 25, mana = 490},
    ['Frost Giantess'] = {level = 25, mana = 490},
    ['Terror Bird'] = {level = 25, mana = 490},
    ['Elephant'] = {level = 25, mana = 500},
    ['Blood Crab'] = {level = 25, mana = 505},
    ['Fire Devil'] = {level = 25, mana = 530},
    ['Minotaur Guard'] = {level = 26, mana = 550},
    ['Stone Golem'] = {level = 27, mana = 590},
    ['Orc Berserker'] = {level = 27, mana = 590},
    ['Monk'] = {level = 27, mana = 600},
    ['Demon Skeleton'] = {level = 28, mana = 620},
    ['Orc Leader'] = {level = 29, mana = 640},
    ['Dwarf Guard'] = {level = 29, mana = 650},
    ['Fire Elemental'] = {level = 30, mana = 690},
    ['Gozzler'] = {level = 34, mana = 800}
}
------------------------
local names, manas, levels = {}, {}, {}
for i, mon in pairs(summonables) do -- LOWERCASE ALL MONSTER NAMES FOR COMPARISON WITH PARAMETER
    table.insert(names,1,i:lower())
    table.insert(manas,1,mon.mana or 0)
    table.insert(levels,1,mon.level or 0)
end
function onSay(player, words, param)
    local name = param:match('%P+')
    local index = 0
    if not name then
        player:sendCancelMessage('Invalid parameters.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    for i, n in ipairs(names) do
        if name:lower() == n:lower() then
            index = i
        end
    end
    if index == 0 then
        player:sendCancelMessage('You cannot summon this monster.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    if #player:getSummons() > 1 then
        player:sendCancelMessage('You cannot summon any more creatures.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    if levels[index] > player:getLevel() then
        player:sendCancelMessage('You do not have enough level.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    if manas[index] > player:getMana() then
        player:sendCancelMessage('You do not have enough mana.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    local monster = Game.createMonster(name, player:getPosition())
    if not monster then
        player:sendCancelMessage('There is not enough room.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    player:addMana(-manas[index])
    player:addManaSpent(manas[index] * configManager.getNumber(configKeys.RATE_MAGIC))
    monster:setMaster(player)
    monster:registerEvent('summonfollow')
    return false
end
 
Lua:
--------- CONFIG ------
local summonables = {
    ['Skunk'] = {level = 25, mana = 200},
    ['Rat'] = {level = 25, mana = 200},
    ['Badger'] = {level = 25, mana = 200},
    ['Snake'] = {level = 25, mana = 205},
    ['Spider'] = {level = 25, mana = 210},
    ['Chicken'] = {level = 25, mana = 220},
    ['Rabbit'] = {level = 25, mana = 220},
    ['Silver Rabbit'] = {level = 25, mana = 220},
    ['Cat'] = {level = 25, mana = 220},
    ['Dog'] = {level = 25, mana = 220},
    ['Poodle'] = {level = 25, mana = 220},
    ['Squirrel'] = {level = 25, mana = 220},
    ['Enraged Squirrel'] = {level = 25, mana = 220},
    ['Thieving Squirrel'] = {level = 25, mana = 220},
    ['Black Sheep'] = {level = 25, mana = 250},
    ['Flamingo'] = {level = 25, mana = 250},
    ['Green Frog'] = {level = 25, mana = 250},
    ['Parrot'] = {level = 25, mana = 250},
    ['Seagull'] = {level = 25, mana = 250},
    ['Bat'] = {level = 25, mana = 250},
    ['Cave Rat'] = {level = 25, mana = 250},
    ['Bug'] = {level = 25, mana = 250},
    ['Sandcrawler'] = {level = 25, mana = 250},
    ['Pig'] = {level = 25, mana = 255},
    ['Wolf'] = {level = 25, mana = 255},
    ['Deer'] = {level = 25, mana = 260},
    ['Winter Wolf'] = {level = 25, mana = 260},
    ['Poison Spider'] = {level = 25, mana = 270},
    ['Hyaena'] = {level = 25, mana = 275},
    ['Cobra'] = {level = 25, mana = 275},
    ['Wasp'] = {level = 25, mana = 280},
    ['Penguin'] = {level = 25, mana = 290},
    ['Island Troll'] = {level = 25, mana = 290},
    ['Troll'] = {level = 25, mana = 290},
    ['Goblin'] = {level = 25, mana = 300},
    ['Goblin Leader'] = {level = 25, mana = 300},
    ['Frost Troll'] = {level = 25, mana = 300},
    ['Bear'] = {level = 25, mana = 300},
    ['Panda'] = {level = 25, mana = 300},
    ['Orc'] = {level = 25, mana = 300},
    ['Skeleton'] = {level = 25, mana = 300},
    ['Crazed Beggar'] = {level = 25, mana = 300},
    ['Crab'] = {level = 25, mana = 305},
    ['Orc Spearman'] = {level = 25, mana = 310},
    ['Scorpion'] = {level = 25, mana = 310},
    ['Polar Bear'] = {level = 25, mana = 315},
    ['Swamp Troll'] = {level = 25, mana = 320},
    ['Lion'] = {level = 25, mana = 320},
    ['Dwarf'] = {level = 25, mana = 320},
    ['Minotaur'] = {level = 25, mana = 330},
    ['Centipede'] = {level = 25, mana = 335},
    ['Troll Champion'] = {level = 25, mana = 350},
    ['Crocodile'] = {level = 25, mana = 350},
    ['Skeleton Warrior'] = {level = 25, mana = 350},
    ['Larva'] = {level = 25, mana = 355},
    ['Orc Warrior'] = {level = 25, mana = 360},
    ['Dwarf Soldier'] = {level = 25, mana = 360},
    ['Smuggler'] = {level = 25, mana = 390},
    ['Amazon'] = {level = 25, mana = 390},
    ['Minotaur Archer'] = {level = 25, mana = 390},
    ['Scarab'] = {level = 25, mana = 395},
    ['Toad'] = {level = 25, mana = 400},
    ['Husky'] = {level = 25, mana = 420},
    ['Tiger'] = {level = 25, mana = 420},
    ['Rabbit'] = {level = 25, mana = 420},
    ['Dwarf Miner'] = {level = 25, mana = 420},
    ['Wild Warrior'] = {level = 25, mana = 420},
    ['Nomad'] = {level = 25, mana = 420},
    ['Undead Mine Worker'] = {level = 25, mana = 435},
    ['Bandit'] = {level = 25, mana = 450},
    ['Ghoul'] = {level = 25, mana = 450},
    ['Valkyrie'] = {level = 25, mana = 450},
    ['Tarantula'] = {level = 25, mana = 485},
    ['Cyclops'] = {level = 25, mana = 490},
    ['Frost Giantess'] = {level = 25, mana = 490},
    ['Terror Bird'] = {level = 25, mana = 490},
    ['Elephant'] = {level = 25, mana = 500},
    ['Blood Crab'] = {level = 25, mana = 505},
    ['Fire Devil'] = {level = 25, mana = 530},
    ['Minotaur Guard'] = {level = 26, mana = 550},
    ['Stone Golem'] = {level = 27, mana = 590},
    ['Orc Berserker'] = {level = 27, mana = 590},
    ['Monk'] = {level = 27, mana = 600},
    ['Demon Skeleton'] = {level = 28, mana = 620},
    ['Orc Leader'] = {level = 29, mana = 640},
    ['Dwarf Guard'] = {level = 29, mana = 650},
    ['Fire Elemental'] = {level = 30, mana = 690},
    ['Gozzler'] = {level = 34, mana = 800}
}
------------------------
local exhaust = Condition(CONDITION_EXHAUST_COMBAT)
exhaust:setParameter(CONDITION_PARAM_TICKS, (configManager.getNumber(configKeys.EX_ACTIONS_DELAY_INTERVAL) - 100))

local names, manas, levels = {}, {}, {}
for i, mon in pairs(summonables) do -- LOWERCASE ALL MONSTER NAMES FOR COMPARISON WITH PARAMETER
    table.insert(names,1,i:lower())
    table.insert(manas,1,mon.mana or 0)
    table.insert(levels,1,mon.level or 0)
end
function onSay(player, words, param)
    local name = param:match('%P+')
    local index = 0
    if not name then
        player:sendCancelMessage('Invalid parameters.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    for i, n in ipairs(names) do
        if name:lower() == n:lower() then
            index = i
        end
    end
    if player:getCondition(CONDITION_EXHAUST_COMBAT) then
        player:sendTextMessage(MESSAGE_STATUS_SMALL, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED))
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    if index == 0 then
        player:sendCancelMessage('You cannot summon this monster.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    if #player:getSummons() > 1 then
        player:sendCancelMessage('You cannot summon any more creatures.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    if levels[index] > player:getLevel() then
        player:sendCancelMessage('You do not have enough level.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    if manas[index] > player:getMana() then
        player:sendCancelMessage('You do not have enough mana.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    local monster = Game.createMonster(name, player:getPosition())
    if not monster then
        player:sendCancelMessage('There is not enough room.')
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
    player:addCondition(exhaust)
    player:addMana(-manas[index])
    player:addManaSpent(manas[index] * configManager.getNumber(configKeys.RATE_MAGIC))
    monster:setMaster(player)
    monster:registerEvent('summonfollow')
    return false
end
 
Back
Top