Jump to content

Revolução Tibiana no UnderWar 07/08/2021 - SÁBADO - 16:00hrs

Crie sua conta, chame sua guild e venha participar desse MEGA RECOMEÇO no UnderWar!

São 14 anos de OT e você comemora junto com a gente... Muitos eventos, sorteios e premiações nessa data tão especial!

Muitas atualizações em um NOVO UNDERWAR!

UNDERWAR ESTA ONLINE!

Kyle Bellini

Member
  • Content Count

    51
  • Joined

  • Last visited

Posts posted by Kyle Bellini

  1. E aí,

    Testa assim:

    Spoiler
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!--
                    ULTIMATE SURVIVAL - Codigo feito por Omega / Pedido por vinnevinne
    -->
     
    <mod name="Ultimate Survival" version="1.0" author="Omega" enabled="yes">
    <config name="ultimatelib"><![CDATA[
    USurvival = {
        posi = {x=110, y=151, z=11},
        posf = {x=121, y=162, z=11},
        posc = {x=116, y=159, z=11},
        
        waves = {
        [1] = {monsters = {"wolf","wolf beast"}, count = 30, reward = {exp = 0, item = 3956, amount = 5, money = 100}},
        [2] = {monsters = {"shadow beast","shadow lion","shadow skeleton","shadow prisioner","shadow tombler"}, count = 40, reward = {exp = 0, item = 3956, amount = 10, money = 1000}},
        [3] = {monsters = {"raditz","nappa","turles","bardock","broly","gotenks","vegeta","king vegeta","goku","gogeta","vegetto"}, count = 50, reward = {exp = 0, item = 3956, amount = 15, money = 10000}},
        },
        exhaust = 1 * 24 * 60 * 60, -- Tempo em segundos ate poder entrar novamente na arena (1 * 24 * 60 * 60 = 1 dia)
        
        final_reward = {item = 2160, amount = 100, exp = 300000, money = 500000},
        
        storage_ex = 607069,
        storage_wave = 607089,
    }
    
    function isWalkable(pos)-- by Nord / editado por Omega
        if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then
            return false
        elseif isCreature(getTopCreature(pos).uid) then
            return false
        elseif getTileInfo(pos).protection then
            return false
        elseif hasProperty(getThingFromPos(pos).uid, 3) or hasProperty(getThingFromPos(pos).uid, 7) then
            return false
        end
    return true
    end
    
    function doSpawnMonsters(monsters, pos, radius, limit)
        if not pos.x or not pos.y or not pos.z or not type(monsters) == 'table' then
            return false
        end
            local radius = tonumber(radius)
        if radius > 5 then
            radius = 5
        elseif radius < 2 then
            radius = 2
        end
        if not limit or limit < 1 then
            limit = 1
        elseif limit > radius ^ 2 then
            limit = math.floor((radius*1.5) ^ 2)
        end
        
        local k = 0
        local tries = 0
        repeat
            for x = pos.x - radius, pos.x + radius do
                for y = pos.y - radius, pos.y + radius do
                    if isWalkable({x=x, y=y, z=pos.z}) then
                        local monster = monsters[math.random(1, #monsters)]
                        local chance = math.random(1, 30)
                        if k == limit then
                            break
                        elseif chance <= 8 and doCreateMonster(monster, {x=x, y=y, z=pos.z}) then
                            k = k + 1
                        end
                    end
                end
            end
            tries = tries + 1
        until k >= limit or tries >= 500
        return k >= limit and true or false
    end
    
    function getPlayersInArea(pos1,pos2)
        local players = {}
        if pos1.x and pos1.y and pos2.x and pos2.y and pos1.z == pos2.z then
            for a = pos1.x, pos2.x do
                for b = pos1.y,pos2.y do
                    local pos = {x=a,y=b,z=pos1.z}
                    if isPlayer(getTopCreature(pos).uid) then
                        table.insert(players,getTopCreature(pos).uid)
                    end
                end
            end
            return players
        else
            return false
        end
    end    
    
    function getMonstersInArea(pos1,pos2)
        local players = {}
        if pos1.x and pos1.y and pos2.x and pos2.y and pos1.z == pos2.z then
            for a = pos1.x, pos2.x do
                for b = pos1.y,pos2.y do
                    local pos = {x=a,y=b,z=pos1.z}
                    if isMonster(getTopCreature(pos).uid) then
                        table.insert(players,getTopCreature(pos).uid)
                    end
                end
            end
            return players
        else
            return false
        end
    end
    
    function doCleanArena()
        local monsters = getMonstersInArea(USurvival.posi, USurvival.posf)
        for _, cid in pairs(monsters) do
            doRemoveCreature(cid)
        end
    end
    
    function doStartWave(waveID, cid)
        if not isCreature(cid) then return false end
        if USurvival.waves[waveID] then
            wave = USurvival.waves[waveID]
            doSpawnMonsters(wave.monsters, USurvival.posc, 5, wave.count)
            doPlayerSendTextMessage(cid, 21, 'Wave '..waveID..' has started! FIGHT!')
        end
    end
    ]]></config>
    
    <action actionid="4599" event="script" override="yes"><![CDATA[
    domodlib('ultimatelib')
    function onUse(cid, item)
    
        local taskItem = {
            checkItem = 1547,
            countItem = 1
        }
    
        if getPlayerItemCount(cid, taskItem.checkItem) >= taskItem.countItem then
            if getPlayerStorageValue(cid, USurvival.storage_ex) <= os.time() then
                if #getPlayersInArea(USurvival.posi, USurvival.posf) == 0 then
                    doCleanArena()
                    doPlayerRemoveItem(cid, taskItem.checkItem, taskItem.countItem)
                    doTeleportThing(cid, USurvival.posc)
                    doPlayerSendTextMessage(cid, 21, 'The Survival will Start in 60 seconds! Be ready to face your destiny!')
                    addEvent(doStartWave, 60000, 1, cid)
                    setPlayerStorageValue(cid, USurvival.storage_wave, 1)
                    setPlayerStorageValue(cid, USurvival.storage_ex, os.time() + USurvival.exhaust)
                    if item.itemid % 2 == 1 then
                        doTransformItem(item.uid, item.itemid+1)
                    else
                        doTransformItem(item.uid, item.itemid-1)
                    end
                else
                    doPlayerSendCancel(cid, 'Someone is already in the arena.')
                    doSendMagicEffect(getThingPos(cid), 2)
                end
            else
                local left = getPlayerStorageValue(cid, USurvival.storage_ex) - os.time()
                left = {hour = math.floor(left/3600), minutes = math.ceil((left % 3600)/60)}
                doPlayerSendCancel(cid, 'You have to wait '.. left.hour ..'h and '..left.minutes..'min.')
                doSendMagicEffect(getThingPos(cid), 2)
            end
        end
        return true
    end
    ]]></action>
    
    <event type="login" name="US Login" event="script"><![CDATA[
    domodlib('ultimatelib')
    function onLogin(cid)
        registerCreatureEvent(cid,'UltimateSurvival1')
        registerCreatureEvent(cid,'UltimateSurvival2')
        if isInArea(getThingPos(cid), USurvival.posi, USurvival.posf) then
            doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
            doSendMagicEffect(getThingPos(cid), 10)
        end
        return true
    end
    ]]></event>
    
    <event type="kill" name="UltimateSurvival1" event="script"><![CDATA[
    domodlib('ultimatelib')
    function onKill(cid, target)
        if isInArea(getThingPos(cid), USurvival.posi, USurvival.posf) then
            if #getMonstersInArea(USurvival.posi, USurvival.posf) == 1 then
                local wave = getPlayerStorageValue(cid, USurvival.storage_wave)
                if USurvival.waves[wave+1] then
                    setPlayerStorageValue(cid, USurvival.storage_wave, wave + 1)
                    addEvent(doStartWave, 30000, wave + 1, cid)
                    doPlayerSendTextMessage(cid, 22, 'Congratulations! Next wave will start in 30 seconds!')
                else
                    doPlayerSendTextMessage(cid, 22, 'CONGRATULATIONS! YOU HAVE BEATEN THE SURVIVAL!')
                    local reward = USurvival.final_reward
                    if reward.item then
                        doPlayerAddItem(cid, reward.item, (reward.amount or 1), false)
                    end
                    if reward.exp then
                        doPlayerAddExp(cid, reward.exp)
                    end
                    if reward.money then
                        doPlayerAddMoney(cid, reward.money)
                    end
                    local medal = doPlayerAddItem(cid, 5785, 1, false)
                    if medal then
                        doItemSetAttribute(medal, 'description', 'This was awarded to '..getCreatureName(cid)..' for completing the Ultimate Survival.')
                        doItemSetAttribute(medal,'name', 'Ultimate Survival Medal')
                    end
                    doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
                end
            end
        end
        return true
    end
    
    ]]></event>
    
    <event type="preparedeath" name="UltimateSurvival2" event="script"><![CDATA[
    domodlib('ultimatelib')
    function onPrepareDeath(cid, killers)
        if isInArea(getThingPos(cid), USurvival.posi, USurvival.posf) then
            doCreatureAddHealth(cid, getCreatureMaxHealth(cid), 65535, 256, true)
            doRemoveConditions(cid, false)
            doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
            doPlayerSendTextMessage(cid, 21, 'Too bad, you couldn\'t defeat the Ultimate Survival... Better luck next time.')
            local reward = USurvival.waves[getPlayerStorageValue(cid, USurvival.storage_wave)].reward
            if reward.item then
                doPlayerAddItem(cid, reward.item, reward.amount or 1)
            end
            if reward.exp then
                doPlayerAddExp(cid, reward.exp)
            end
            if reward.money then
                doPlayerAddMoney(cid, reward.money)
            end
            return false
        end
        return true
    end
    ]]></event>
    
    </mod>

     

     

  2. É bem simples, fiz um aqui pra ti:

     

    local config = {
        bossPos = {x = 1091, y = 920, z = 7}, -- Position que o monstro será criado
        bossName = "Boss Monster" -- Nome do monstro
    }
    
    function onStartup()
    
        doCreateMonster(config.bossName, config.bossPos)
        return true
    end

     

    No seu globalevents.xml você adiciona essa tag:

    <globalevent name="CreateBoss" type = "start" event="script" value="createboss.lua"/>

     

  3. Só removi algumas coisas, e organizei um pouco o código. Testa aí e me fala.

    local config = {
    	cooldown = 45, -- Cooldown para utilizar a spell novamente
    	effect = 27, -- Efeito ao utilizar a spell
    	storage = 5891, -- Storage responsável pelo cooldown
    }
    
    function onCastSpell(cid, var)
    	
    	if exhaustion.check(cid, config.storage) then
    		doPlayerSendCancel(cid, "Aguarde " .. exhaustion.get(cid, config.storage) .. " segundos para usar a spell novamente.")
    		return false
    	end 
    	
    	doCreatureSetNoMove(cid, false)
    	doSendMagicEffect(getCreaturePosition(cid), config.effect)
    	exhaustion.set(cid, config.storage, config.cooldown)
    	return true
    end

     

  4. 6 horas atrás, Calisto disse:

    Estou amando trabalhar com OTclient, e obrigado pelos design's que vc proporcionou!, não tenho muito conhecimento, mas estou estudando para melhorar meus conhecimentos, não manjo de puxar informações para por personagem, mas um dia vou conseguir!

     

    image.thumb.png.52dee8f3f53af0b0b96e32708b0590a2.png

     

    image.thumb.png.79e7a69aa42f01a63d13cf7a3c23a110.png

     

     

    Caramba, que show!!!

     

    Os trabalhos aqui do pessoal estão muito bacanas, parabéns galera!

  5. Oie,

     

    Basta utilizar a função doPlayerRemoveItem(cid, id do item, quantidade que deseja remover).

     

    Spoiler
    
    local combat = createCombatObject()
    setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY)
    setCombatParam(combat, COMBAT_PARAM_CREATEITEM, 1497)
    
    local arr = {
    {1, 1, 1},
    {1, 2, 1},
    {1, 1, 1}
    }
    
    local area = createCombatArea(arr)
    setCombatArea(combat, area)
    
    function onCastSpell(cid, var)
      local runeid = 2293 -- ID da runa que deseja remover.
    
      doPlayerRemoveItem(cid, runeid, 1)
      return doCombat(cid, combat, var)
    end

     

     

     

  6. Olá,

     

    Testa aí e me fala se está como quer. Coloquei uma mensagem tbm avisando os segundos pro jogador saber.

     

    Spoiler
    
    local combat1 = createCombatObject()
    setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
    setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA)
    setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, 27)
    
    function onGetFormulaValues(cid, level, skill, attack, factor)
    local k = getPlayerStorageValue(cid, 378378)
    local skillTotal, levelTotal = skill + attack, level / 5
    return -(skillTotal * 2.5 + levelTotal)-(skillTotal * 2.5 + levelTotal)*(k*1.0), -(skillTotal * 2.8 + levelTotal)-(skillTotal * 2.9 + levelTotal)*(k*1.0)
    end
    
    
    setCombatCallback(combat1, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")
    
    local combat2 = createCombatObject()
    setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
    setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA)
    setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, 27)
    setCombatFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, -10, -10, -1, -20, 5, 5, 2.4, 10.1)
    
    local combat3 = createCombatObject()
    setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
    setCombatParam(combat3, COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA)
    setCombatParam(combat3, COMBAT_PARAM_DISTANCEEFFECT, 27)
    setCombatFormula(combat3, COMBAT_FORMULA_LEVELMAGIC, -10, -10, -1, -20, 5, 5, 2.4, 10.1)
    
    local function onCastSpell1(parameters)
    doCombat(parameters.cid, parameters.combat1, parameters.var)
    end
    
    local function onCastSpell2(parameters)
    doCombat(parameters.cid, parameters.combat2, parameters.var)
    end
    
    local function onCastSpell3(parameters)
    doCombat(parameters.cid, parameters.combat3, parameters.var)
    end
    
    local config = {
      stor_time = 89787, -- Storage responsável pelo cooldown.
      time = 30 -- Tempo em segundos
    }
    
    function onCastSpell(cid, var)
      local parameters = {cid = cid, var = var, combat1 = combat1, combat2 = combat2, combat3 = combat3}
    
      if getPlayerStorageValue(cid, config.stor_time) > os.time() then
        doPlayerSendCancel(cid, "You're exhausted. Wait " .. (getPlayerStorageValue(cid, config.stor_time) - os.time()) .. " seconds.")
        return false
      end
      setPlayerStorageValue(cid, config.stor_time, os.time() + config.time)
      addEvent(onCastSpell1, 1000, parameters)
      addEvent(onCastSpell2, 1500, parameters)
      addEvent(onCastSpell3, 2000, parameters)
      return true
    end

     

     

     

  7. O script por completo só funciona se o level do jogador morto for maior que o level do jogador que matou, assim como pediu ali atrás:

    "e ao matar um player level menor que o dele não ganhar exp."

    E o gif que mostrou ali, o player é lvl 600 e está matando um 550 :d

     

    Se o Bruno for level 500, e matar o Guilherme que é lvl 400, o script não vai ser executado. Porque está configurado para que funcione apenas se o Guilherme tiver um level maior que o do Bruno.

    Dá pra colocar a punição independente do level, mas não faz sentido dado o contexto. Visto que se o jogador for de level menor, ele não ganhará experiência nem nada.

  8. Estava com pouco tempo.. Mas estranho não estar funcionando a parte do IP, sendo que é a mesma linha de código que tu enviou anteriormente kkk

     

    O script só vai funcionar se o target for um jogador e que este seja maior ou igual ao level do cid, talvez você matou alguém de level inferior.

  9. A quantidade de XP que o jogador irá receber tu consegue definir nas variáveis "exp", "nexp", e "newexp", basta alterar as operações matemáticas que estão sendo feitas dentro delas. Modifiquei pra que o cálculo seja feito em cima do level do jogador inimigo, assim fica algo mais proveitoso e menos "fixo". Testa aí e me fala:

     

    Spoiler
    
    function onKill(cid, target)
    local lvlCid = getPlayerLevel(cid)
    local lvlTarget = getPlayerLevel(target)
    
    ------------- Em exp/nexp/newexp são as fórmulas de cálculo para decidir qual será a XP que o jogador irá obter.
    
      local exp = (50 * (lvlTarget) * (lvlTarget) * (lvlTarget) - 130 * (lvlTarget) * (lvlTarget) + 400 * (lvlTarget)) / 5
      local nexp = (50 * (lvlCid) * (lvlCid) * (lvlCid) - 130 * (lvlCid) * (lvlCid) + 400 * (lvlCid)) / 5
      local newexp = (exp - nexp) / 2
      local punishment = 2 -- Valor que será multiplicado pelo resultado de 'newexp'. (Punição por matar player do mesmo IP)
    
      if (isPlayer(target)) and (lvlTarget >= lvlCid)then
        if getPlayerIp(cid) ~= getPlayerIp(target) then
          doPlayerAddExp(cid, newexp)
          doCreatureSay(cid, "You earned " .. newexp .. " points of experience.", TALKTYPE_MONSTER)
        else
          doPlayerAddExperience(cid, -((newexp) * punishment))
          doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"You have been punished for killing a player of the same IP.")
        end
      end
      return true
    end 

     

     

×
×
  • Create New...

Important Information

Confirmação de Termo