Ir para conteúdo
  • Cadastre-se

Posts Recomendados

Esta é uma mensagem automática! Este tópico foi movido para a área correta.
Pedimos que você leia as regras do fórum.

Spoiler

This is an automated message! This topic has been moved to the correct area.
Please read the forum rules.

 

Link para o post
Compartilhar em outros sites
3 horas atrás, Wakon disse:

Esta é uma mensagem automática! Este tópico foi movido para a área correta.
Pedimos que você leia as regras do fórum.

  Ocultar conteúdo

This is an automated message! This topic has been moved to the correct area.
Please read the forum rules.

 

Oxi e tem essas viadagem de area correta ? 

Link para o post
Compartilhar em outros sites
19 horas atrás, helix758 disse:

Oxi e tem essas viadagem de area correta ? 

Sim, tem area correta. Por isso é possivel achar tópicos de ajuda, download separadamente. Imagina a zona que seria.

 

O script tem a venda em um site ai, ninguém vai postar de graça provavelmente, até porque seria falta de respeito com quem desenvolveu e vende.

Acho que não é permitido eu postar.

asdukeeh.jpg

Link para o post
Compartilhar em outros sites
5 horas atrás, DukeeH disse:

Sim, tem area correta. Por isso é possivel achar tópicos de ajuda, download separadamente. Imagina a zona que seria.

 

O script tem a venda em um site ai, ninguém vai postar de graça provavelmente, até porque seria falta de respeito com quem desenvolveu e vende.

Acho que não é permitido eu postar.

Oxi pow, só postar nas baixa aqui :p 

Link para o post
Compartilhar em outros sites

como funciona o evento?

Toda terça-feira um tópico novo:

Descanso para curar mana (Spell): https://tibiaking.com/forums/topic/94615-spell-descanso-para-curar-mana/

Peça sua spell (Suporte):                https://tibiaking.com/forums/topic/84162-peça-sua-spell/                        

Chuva de flechas (Spell):                https://tibiaking.com/forums/topic/72232-chuva-de-flechas-spell/

Doom (Spell):                                https://tibiaking.com/forums/topic/51622-doom-spell/

Utilização do VS Code (Infra)       https://tibiaking.com/forums/topic/94463-utilizando-o-visual-studio-code-notepad-nunca-mais/

SD com Combo (Spell):                 https://tibiaking.com/forums/topic/94520-sd-modificada/

Alteração attack speed (C++):        https://tibiaking.com/forums/topic/94714-c-attack-speed-spells-itens-e-onde-você-quiser/  

Bônus de Speed (NPC)                  https://tibiaking.com/forums/topic/94809-npc-concede-bônus-aos-players/
 

Link para o post
Compartilhar em outros sites
58 minutos atrás, Reds disse:

como funciona o evento?

é um evento boladão aí :D que o cara tem que tacar bolinha de neve nos outros players, é uma viadagem, mas é legal.

Link para o post
Compartilhar em outros sites

se bater em arvore, montanha ou algo do tipo a bola para de andar?

Toda terça-feira um tópico novo:

Descanso para curar mana (Spell): https://tibiaking.com/forums/topic/94615-spell-descanso-para-curar-mana/

Peça sua spell (Suporte):                https://tibiaking.com/forums/topic/84162-peça-sua-spell/                        

Chuva de flechas (Spell):                https://tibiaking.com/forums/topic/72232-chuva-de-flechas-spell/

Doom (Spell):                                https://tibiaking.com/forums/topic/51622-doom-spell/

Utilização do VS Code (Infra)       https://tibiaking.com/forums/topic/94463-utilizando-o-visual-studio-code-notepad-nunca-mais/

SD com Combo (Spell):                 https://tibiaking.com/forums/topic/94520-sd-modificada/

Alteração attack speed (C++):        https://tibiaking.com/forums/topic/94714-c-attack-speed-spells-itens-e-onde-você-quiser/  

Bônus de Speed (NPC)                  https://tibiaking.com/forums/topic/94809-npc-concede-bônus-aos-players/
 

Link para o post
Compartilhar em outros sites
2 minutos atrás, Reds disse:

se bater em arvore, montanha ou algo do tipo a bola para de andar?

Não sei cara kkk

Link para o post
Compartilhar em outros sites
  • 4 weeks later...

<?xml version="1.0" encoding="UTF-8"?>
    <mod name="Paintball event" version="1.0" author="Bogart" contact="otland.net" enabled="yes">
        <description>
            
        </description>
        <config name="config"><![CDATA[
        t = {
            main = {
                tfs_version = "0.3", --0.3 or 0.4
                positions = {
                    paintball_spawn_area = {
                        top_left = {x = 970, y = 1040, z = 4}, --Top left pos of spawning area
                        bottom_right = {x = 975, y = 1046, z = 7}--bottom right pos of spawning area
                    },
                    waiting_room_area = {
                        top_left = {x = 970, y = 1040, z = 7}, --Top left pos of the waiting room
                        bottom_right = {x = 975, y = 1046, z = 7}--bottom right pos of the waiting room
                    },
                    tp_to_paintball = {x = 985, y = 1052, z = 7}, --pos where the tp will be created
                    event_ending_pos = {x = 985, y = 1052, z = 7} --pos players will be sent after event ending
                },
                storages = {aexhaust = 2455,
                    is_in_event = 2460,
                    score = 2465
                },
                misc = {
                    status = 'on'
                },
                messages = {
                    event_started = "Paintball event has started! there's a teleport near Thais temple!",--Message that will be broadcasted after the event has started
                    event_ended = "Paintball event has ended!" --same but when event ends
                },
                event_config = {
                    event_duration = 15, --minutes, 0 if it's an always-open event
                    infinite_ammo = false,
                    winner_gets_item = true,
                    prize_item_id = 3051,
                    decrease_score_on_death = true,
                    points_per_kill = 1,
                    randomize_player_start_pos = true,
                    ammo_per_point = 100,
                    reset_bullets_on_death = true,
                    min_bullets_on_spawn = 100,
                    start_automatically = false,
                    use_waiting_room = false,
                    waiting_time = 3 --minutes
                }
            },
            onShoot = {
                storages = {
                    ammo = 2400
                },
                misc = {
                    walls_id = {1115,1111,1112,5258,1385,1113},
                    bullets_exhaust = 500, --in ms
                    bullet_speed = 150
                },
                vars = {
                    shootdir = 0
                }
            }
        }
        ]]></config>
        <movevent type="StepIn" actionid ="2880" event="script"><![CDATA[
        domodlib('config')
        function onStepIn(cid, item, pos)
            local t_l = t.main.positions.paintball_spawn_area.top_left
            local b_r = t.main.positions.paintball_spawn_area.bottom_right
            doTeleportThing(cid, {x=math.random(t_l.x,b_r.x), y=math.random(t_l.y, b_r.y), z=math.random(t_l.z, b_r.z)})
            doPlayerSetStorageValue(cid, t.main.storages.is_in_event,1)
            doPlayerSetStorageValue(cid, t.onShoot.storages.ammo, t.main.event_config.min_bullets_on_spawn)
            doPlayerSetStorageValue(cid, t.main.storages.score, 0)
            doPlayerSendTextMessage(cid,27,"Welcome to paintball, here are the commands:\n!shoot bullet --This will shot a bullet.\n!shoot ammo --This will give you "..t.main.event_config.ammo_per_point.." bullets and take 1 point from your current score (you need at least 1 point to use this command).\n!shoot info --This will show you your current score and ammo, it'll also show the current high score of the event.\nIt is strongly recommended that you bind these commands to your hotkeys.")
        end
        ]]></movevent>
        <globalevent name="StartPaintBall" interval="3600" event="script"><![CDATA[
        domodlib('config')
        function onThink(interval, lastExecution, thinkInterval)
            if t.main.event_config.start_automatically then
                doBroadcastMessage(t.main.messages.event_started, MESSAGE_STATUS_WARNING)
                if t.main.event_config.use_waiting_room then
                    addEvent(moveToEvent, t.main.event_config.waiting_time*1000*60) 
                    doCreateTeleport(1387,t.main.positions.waiting_room_area.top_left, t.main.positions.tp_to_paintball)
                else
                    if t.main.tfs_version == "0.3" then 
                        doItemSetAttribute(doCreateItem(1387, t.main.positions.tp_to_paintball), "aid", 2880)
                    else
                        doSetItemActionId(doCreateItem(1387, t.main.positions.tp_to_paintball),2880)
                    end
                    if(t.main.event_config.event_duration > 0) then
                        addEvent(endPaintball, t.main.event_config.event_duration*1000*60)
                    end
                end
            end
        return true
        end
        
        function endPaintball()
            local score = {}
            if not t.main.event_config.use_waiting_room then 
                doRemoveItem(getTileItemById(t.main.positions.tp_to_paintball,1387).uid)
            end
            for _, pid in ipairs(getPlayersOnline()) do
                if getPlayerStorageValue(pid, t.main.storages.is_in_event) > 0 then
                    table.insert(score, {getCreatureName(pid), getPlayerStorageValue(pid, t.main.storages.score)})
                    doPlayerSetStorageValue(pid, t.main.storages.is_in_event, 0)
                    doPlayerSetStorageValue(pid, t.main.storages.score, 0)
                    doPlayerSetStorageValue(pid, t.onShoot.storages.ammo, 0)
                    doTeleportThing(pid, t.main.positions.event_ending_pos)
                end
            end
            table.sort(score, function(a, b) return a[2] > b[2] end)
            if table.getn(score) > 0 then
                if t.main.event_config.winner_gets_item then
                    for _, pid in ipairs(getPlayersOnline()) do
                        if getCreatureName(pid) == score[1][1] then
                            doPlayerAddItem(pid, t.main.event_config.prize_item_id)
                            break
                        end
                    end
                end
                doBroadcastMessage("Paintball event has ended, "..score[1][1].." won paintball event with "..score[1][2].." points", MESSAGE_STATUS_WARNING)
            end
        end
        local t_l = t.main.positions.paintball_spawn_area.top_left
        local b_r = t.main.positions.paintball_spawn_area.bottom_right
        function moveToEvent()
            for _, pid in ipairs(getPlayersOnline()) do 
                if isInRange(getCreaturePosition(pid), t.main.positions.waiting_room_area.top_left, t.main.positions.waiting_room_area.bottom_right) then
                    doTeleportThing(pid, {x=math.random(t_l.x,b_r.x), y=math.random(t_l.y, b_r.y), z=math.random(t_l.z, b_r.z)})
                    doPlayerSetStorageValue(pid, t.main.storages.is_in_event,1)
                    doPlayerSetStorageValue(pid, t.onShoot.storages.ammo, t.main.event_config.min_bullets_on_spawn)
                    doPlayerSetStorageValue(pid, t.main.storages.score, 0)
                    doPlayerSendTextMessage(pid,27,"Welcome to paintball, here are the commands:\n!shoot bullet --This will shot a bullet.\n!shoot ammo --This will give you "..t.main.event_config.ammo_per_point.." bullets and take 1 point from your current score (you need at least 1 point to use this command).\n!shoot info --This will show you your current score and ammo, it'll also show the current high score of the event.\nIt is strongly recommended that you bind these commands to your hotkeys.")
                end
            end
            doRemoveItem(getTileItemById(t.main.positions.tp_to_paintball,1387).uid)
            addEvent(endPaintball, t.main.event_config.event_duration*1000*60)
        end
        ]]></globalevent> 
        <talkaction words="!shoot" event="script"><![CDATA[
        domodlib('config')
        function onSay(cid, words, param, channel)
            local k = string.explode(param, ",")
            if(k[1] ~= nil) then 
                if(string.upper(k[1]) == 'END') and getPlayerGroupId(cid) >= 3 then
                    endPaintball()
                end
                if(string.upper(k[1]) == 'START') and getPlayerGroupId(cid) >= 3 then
                    doBroadcastMessage(t.main.messages.event_started, MESSAGE_STATUS_WARNING)
                    if t.main.event_config.use_waiting_room then
                        addEvent(moveToEvent, t.main.event_config.waiting_time*1000*60) 
                        doCreateTeleport(1387,t.main.positions.waiting_room_area.top_left, t.main.positions.tp_to_paintball)
                    else
                        if t.main.tfs_version == "0.3" then 
                            doItemSetAttribute(doCreateItem(1387, t.main.positions.tp_to_paintball), "aid", 2880)
                        else
                            doSetItemActionId(doCreateItem(1387, t.main.positions.tp_to_paintball),2880)
                        end
                        if(t.main.event_config.event_duration > 0) then
                            addEvent(endPaintball, t.main.event_config.event_duration*1000*60)
                        end
                    end
                end
                if(string.upper(k[1]) == 'INFO') then
                local score = {}
                local output =  "You have " .. getPlayerStorageValue(cid, t.main.storages.score) .. " points.\nYou have "..getPlayerStorageValue(cid, t.onShoot.storages.ammo).." ammo left.\n------------------\nThe current high score in paintball is:\n"
                    for _, pid in ipairs(getPlayersOnline()) do
                        if getPlayerStorageValue(pid, t.main.storages.is_in_event) then
                            table.insert(score, {getCreatureName(pid), getPlayerStorageValue(pid, t.main.storages.score)})
                        end
                    end
                local lx = table.getn(score)
                if(lx > 3) then lx = 3 end 
                    table.sort(score, function(a, b) return a[2] > b[2] end)
                    for k = 1,lx do
                        output = output .. k..". "..score[k][1] .." [".. score[k][2] .."].\n"
                    end
                doPlayerPopupFYI(cid, output) 
                end
                if (string.upper(k[1]) == 'AMMO') then
                    if(t.main.event_config.infinite_ammo) then 
                        doPlayerSendTextMessage(cid, 27, "Ammo is infinite, there's no need to buy more.")
                    else
                        if getPlayerStorageValue(cid, t.main.storages.score) > 0 then
                            doPlayerSetStorageValue(cid, t.main.storages.score, getPlayerStorageValue(cid, t.main.storages.score)-1)
                            doPlayerSetStorageValue(cid, t.onShoot.storages.ammo, getPlayerStorageValue(cid,t.onShoot.storages.ammo)+t.main.event_config.ammo_per_point)
                            doPlayerSendTextMessage(cid, 27, "You have received " .. t.main.event_config.ammo_per_point .. " bullets and you have lost 1 score point.")
                            doSendMagicEffect(getCreaturePosition(cid),4)
                        else
                            doPlayerSendTextMessage(cid, 27, "You do not have enough score points to buy ammo, you need ".. 1-(getPlayerStorageValue(cid, t.main.storages.score)).. " more.")            
                        end
                    end
                end
                if (string.upper(k[1]) == 'BULLET') then
                    if(getPlayerStorageValue(cid, t.main.storages.is_in_event) == 1) then
                        if getPlayerStorageValue(cid, t.main.storages.exhaust) <= 1 then
                            if(getPlayerStorageValue(cid, t.onShoot.storages.ammo) > 0) then
                                if t.main.misc.status == 'on' then
                                    if(t.main.event_config.infinite_ammo == false) then
                                        doPlayerSetStorageValue(cid, t.onShoot.storages.ammo, getPlayerStorageValue(cid, t.onShoot.storages.ammo)-1)
                                    end
                                    doPlayerSetStorageValue(cid, t.main.storages.exhaust, 2)
                                    lineAnimation(getPlayerLookDirection(cid),getCreaturePosition(cid),12,cid,1,0,1,0,0,0,1,0)
                                    addEvent(doPlayerSetStorageValue,t.onShoot.misc.bullets_exhaust, cid, t.main.storages.exhaust,1)
                                end
                            else
                                doPlayerSendCancel(cid, "You're out of ammo, exchange ammo for points with !shoot ammo or get killed for a recharge.")
                                doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)    
                            end
                        else
                            doPlayerSendCancel(cid, "Gun is on cooldown")
                            doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
                        end
                    else
                        doPlayerSendCancel(cid, "You need to be in the event.")
                        doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
                    end
                end
            end
        return true
        end


        function lineAnimation(lookDir,playerPos,effect,cid,fvar,fpos,ffound,fposV,fcheck,fvcid,floopCounter,fvpid, name)
        local var = fvar
        local pos = fpos
        local found = ffound
        local posV = fposV
        local check = fcheck
        local vcid = fvcid
        local loopCounter = floopCounter
        local vpid = fvpid
        local storage = t.main.storages.exhaust
            if var < 2 then
                vcid = cid
            end
            pos = playerPos
            if not isInWallArray(convert(lookDir,pos)) then--isInWallArray({x=convert(lookDir,pos).x, y=convert(lookDir,pos).y,z=convert(lookDir,pos).z}) then --isInArray(t.onShoot.misc.walls_id, getThingfromPos({x=convert(lookDir,pos).x, y=convert(lookDir,pos).y,z=convert(lookDir,pos).z, stackpos=0}).itemid) then
                doSendDistanceShoot(pos, convert(lookDir,pos),effect)
                pos = convert(lookDir,pos)
                var=var+1
                posV = convertV(lookDir,playerPos)
                for _, pid in ipairs(getPlayersOnline()) do
                    if (getCreaturePosition(pid).x == pos.x and getCreaturePosition(pid).y == pos.y and getCreaturePosition(pid).z == pos.z) then
                        --if loopCounter > 2 then
                        vpid = pid
                        --end
                        if (vpid ~= vcid) then
                            if var > 2 then
                                if (getCreaturePosition(pid).x == posV.x and getCreaturePosition(pid).y == posV.y and getCreaturePosition(pid).z == posV.z) then
                                    killPlayer(pid,pos,getCreatureName(vcid))
                                    if (lookDir == 0) or (lookDir == 2) then 
                                        var = 6
                                    else
                                        var = 8
                                    end
                                end
                            end
                            killPlayer(pid,pos,vcid)
                            if (lookDir == 0) or (lookDir == 2) then
                                var = 6
                            else
                                var = 8
                            end
                        end
                    end
                    loopCounter = loopCounter +1
                end    
                if (lookDir == 0) or (lookDir == 2) then
                    if var ~= 6 then
                        addEvent(lineAnimation, t.onShoot.misc.bullet_speed, lookDir,pos,effect,nil,var,pos,found,posV,check,vcid,loopCounter,vpid)
                    else
                        var = 1
                    end
                else
                    if var ~= 8 then
                        addEvent(lineAnimation,  t.onShoot.misc.bullet_speed, lookDir,pos,effect,nil,var,pos,found,posV,check,vcid,loopCounter,vpid)
                    else
                        var = 1
                    end
                end
            else
                doSendMagicEffect(convert(lookDir,pos),2)
                var = 1
            end
        end

        local ret = {}
        function convert(lookDir,pos)
        local positions = {
            [0] = {x = pos.x, y = pos.y-1, z = pos.z},
            [1] = {x = pos.x+1, y = pos.y, z = pos.z},
            [2] = {x = pos.x, y = pos.y+1, z = pos.z},
            [3] = {x = pos.x-1, y = pos.y, z = pos.z}
            }
            ret = positions[lookDir]
        return ret
        end


        local ret = {}
        function convertV(lookDir,pos)
        local positions = {
            [0] = {x = pos.x, y = pos.y+1, z = pos.z},
            [1] = {x = pos.x-1, y = pos.y, z = pos.z},
            [2] = {x = pos.x, y = pos.y-1, z = pos.z},
            [3] = {x = pos.x+1, y = pos.y, z = pos.z}
            }
            ret = positions[lookDir]
        return ret
        end
                
        function killPlayer(cid,pos, killer)
            local t_l = t.main.positions.paintball_spawn_area.top_left
            local b_r = t.main.positions.paintball_spawn_area.bottom_right
            doTeleportThing(cid, {x=math.random(t_l.x,b_r.x), y=math.random(t_l.y, b_r.y), z=math.random(t_l.z, b_r.z)})
            doSendMagicEffect(pos,2)
            doPlayerSendTextMessage(cid, 27, "You've been killed by "..getCreatureName(killer)..".")
            doPlayerSetStorageValue(killer, t.main.storages.score, getPlayerStorageValue(killer, t.main.storages.score)+t.main.event_config.points_per_kill)
            doPlayerSendTextMessage(killer, 27, "You've killed "..getCreatureName(cid)..".")
            doBroadcastMessage("[Event] Paintball: "..getCreatureName(killer).." has killed "..getCreatureName(cid)..".", MESSAGE_STATUS_WARNING)
            if t.main.event_config.decrease_score_on_death then
                doPlayerSetStorageValue(cid, t.main.storages.score, getPlayerStorageValue(cid, t.main.storages.score)-1)
            end
            if t.main.event_config.reset_bullets_on_death then
                doPlayerSetStorageValue(cid, t.onShoot.storages.ammo, t.main.event_config.min_bullets_on_spawn)
            end
        end
                        
        function isInWallArray(pos)
            for k = 0, table.getn(t.onShoot.misc.walls_id) do
                if getTileItemById(pos, t.onShoot.misc.walls_id[k]).itemid == t.onShoot.misc.walls_id[k] then --this doesn't even make sense but tried other ways and it gave errors, so meh 2lazy2search 
                    return true    
                end
            end
            return false
        end
        function endPaintball()
            local score = {}
            if not t.main.event_config.use_waiting_room then 
                doRemoveItem(getTileItemById(t.main.positions.tp_to_paintball,1387).uid)
            end
            for _, pid in ipairs(getPlayersOnline()) do
                if getPlayerStorageValue(pid, t.main.storages.is_in_event) > 0 then
                    table.insert(score, {getCreatureName(pid), getPlayerStorageValue(pid, t.main.storages.score)})
                    doPlayerSetStorageValue(pid, t.main.storages.is_in_event, 0)
                    doPlayerSetStorageValue(pid, t.main.storages.score, 0)
                    doPlayerSetStorageValue(pid, t.onShoot.storages.ammo, 0)
                    doTeleportThing(pid, t.main.positions.event_ending_pos)
                end
            end
            table.sort(score, function(a, b) return a[2] > b[2] end)
            if table.getn(score) > 0 then
                if t.main.event_config.winner_gets_item then
                    for _, pid in ipairs(getPlayersOnline()) do
                        if getCreatureName(pid) == score[1][1] then
                            doPlayerAddItem(pid, t.main.event_config.prize_item_id)
                            break
                        end
                    end
                end
            doBroadcastMessage("Painball event has ended, "..score[1][1].." won paintball event with "..score[1][2].." points", MESSAGE_STATUS_WARNING)
            end
        end
        local t_l = t.main.positions.paintball_spawn_area.top_left
        local b_r = t.main.positions.paintball_spawn_area.bottom_right
        function moveToEvent()
            for _, pid in ipairs(getPlayersOnline()) do 
                if isInRange(getCreaturePosition(pid), t.main.positions.waiting_room_area.top_left, t.main.positions.waiting_room_area.bottom_right) then
                    doTeleportThing(pid, {x=math.random(t_l.x,b_r.x), y=math.random(t_l.y, b_r.y), z=math.random(t_l.z, b_r.z)})
                    doPlayerSetStorageValue(pid, t.main.storages.is_in_event,1)
                    doPlayerSetStorageValue(pid, t.onShoot.storages.ammo, t.main.event_config.min_bullets_on_spawn)
                    doPlayerSetStorageValue(pid, t.main.storages.score, 0)
                    doPlayerSendTextMessage(pid,27,"Welcome to paintball, here are the commands:\n!shoot bullet --This will shot a bullet.\n!shoot ammo --This will give you "..t.main.event_config.ammo_per_point.." bullets and take 1 point from your current score (you need at least 1 point to use this command).\n!shoot info --This will show you your current score and ammo, it'll also show the current high score of the event.\nIt is strongly recommended that you bind these commands to your hotkeys.")
                end
            end
            doRemoveItem(getTileItemById(t.main.positions.tp_to_paintball,1387).uid)
            addEvent(endPaintball, t.main.event_config.event_duration*1000*60)
        end
        ]]></talkaction>
    </mod>

Link para o post
Compartilhar em outros sites
  • 2 weeks later...
  • 8 months later...

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

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • Por Absolute
      Olá amigos, membros, visitantes, papagaios, enfim...

      Depois de muito me pedirem o evento SNOWBAL WAR EVENT, trago ele 100% pra vocês.

      Como funciona?
      Os jogadores irão se divertir em uma emocionante partida de guerra de bolas de neve. O objetivo principal do evento é derrubar o número máximo de jogadores durante uma partida - atirando bolas de neve contra seus inimigos. O jogador que mais pontos fizer até o termino do evento será o vencedor (recompensa pode ser configurada).

      Sem delongas, vamos ao que interessa...
       
       
       
       

      Em data/actions abra o seu actions.xml e insira a seguinte linha:
       
       
      <action actionid="7900" event="script" value="snowballaction.lua" />

      Em data/actions/scripts crie um arquivo com o nome de snowballaction.lua e insira o seguinte conteúdo:
      function onUse(cid, item, frompos, item2, topos) if item.actionid == 7900 then if(SBW_AMMOINFI) then doPlayerSendTextMessage(cid, 27, "as bolas de neve sao infinitas, nao ha necessidade que voce compre-as.") else if (getPlayerStorageValue(cid, SBW_SCORE) > 0) and (getPlayerStorageValue(cid, SBW_AMMO) < 30) then doPlayerSetStorageValue(cid, SBW_SCORE, getPlayerStorageValue(cid, SBW_SCORE)-1) doPlayerSetStorageValue(cid, SBW_AMMO, getPlayerStorageValue(cid, SBW_AMMO)+SBW_AMMOBUY) doPlayerSendTextMessage(cid, 27, "Voce trocou " .. SBW_AMMOBUY .. "x bolas de neve por 1 ponto de placar.") doSendMagicEffect(getCreaturePosition(cid),4) else doPlayerSendTextMessage(cid, 27, "Voce nao possui pontos de jogo o suficiente ou ja esta carregando muitas bolas de neve.") end end end end  
       
       
       

      Em data/talkactions abra o seu talkactions.xml e insira a seguinte linha:
       
      <talkaction words="!snowball" event="script" value="snowballtalk.lua"/>

      Em data/talkactions/scripts crie um arquivo com o nome de snowballtalk.lua e insira o seguinte conteúdo:
      function onSay(cid, words, param, channel) local k = string.explode(param, ",") if(k[1] ~= nil) then if(string.upper(k[1]) == 'INFO') then local score = {} local output = "Voce tem " .. getPlayerStorageValue(cid, SBW_SCORE) .. " pontos.\nVoce tem "..getPlayerStorageValue(cid, SBW_AMMO).."x municoes.\n------------------\nO maior matador:\n" for _, pid in ipairs(getPlayersOnline()) do if getPlayerStorageValue(pid, SBW_INEVENT) then table.insert(score, {getCreatureName(pid), getPlayerStorageValue(pid, SBW_SCORE)}) end end local lx = table.getn(score) if(lx > 3) then lx = 3 end table.sort(score, function(a, b) return a[2] > b[2] end) for k = 1,lx do output = output .. k..". "..score[k][1] .." [".. score[k][2] .."].\n" end doPlayerPopupFYI(cid, output) end if (string.upper(k[1]) == 'ATIRAR') then if(getPlayerStorageValue(cid, SBW_INEVENT) == 1) and not getTileInfo(getThingPos(cid)).protection then if getPlayerStorageValue(cid, SBW_EXAUSTHED) <= 1 then if(getPlayerStorageValue(cid, SBW_AMMO) > 0) then if SBW_STATUS == 'on' then if(SBW_AMMOINFI == false) then doPlayerSetStorageValue(cid, SBW_AMMO, getPlayerStorageValue(cid, SBW_AMMO)-1) end doPlayerSetStorageValue(cid, SBW_EXAUSTHED, 2) lineAnimation(getPlayerLookDirection(cid),getCreaturePosition(cid),12,cid,1,0,1,0,0,0,1,0) addEvent(doPlayerSetStorageValue, SBW_SHOOTEXAUSTHED, cid, SBW_EXAUSTHED, 1) if (getPlayerStorageValue(cid, SBW_AMMO) ~= 1) then doPlayerSendTextMessage(cid, 27, "Restam "..getPlayerStorageValue(cid, SBW_AMMO).."x bolas de neve.") else doPlayerSendTextMessage(cid, 27, "Usando sua ultima bola de neve, recarregue.") end end else doPlayerSendCancel(cid, "Voce esta sem bolas de neve, recarregue no centro do campo ou mate um inimigo.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) end else doPlayerPopupFYI(cid, "Acalme-se voce deve esperar para atirar novamente.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) return false end else doPlayerPopupFYI(cid, "Voce precisa estar dentro evento ou fora da pz.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) end end end return true end function lineAnimation(lookDir,playerPos,effect,cid,fvar,fpos,ffound,fposV,fcheck,fvcid,floopCounter,fvpid, name) local var = fvar local pos = fpos local found = ffound local posV = fposV local check = fcheck local vcid = fvcid local loopCounter = floopCounter local vpid = fvpid local storage = SBW_EXAUSTHED if var < 2 then vcid = cid end pos = playerPos if not isInWallArray(convert(lookDir,pos)) then--isInWallArray({x=convert(lookDir,pos).x, y=convert(lookDir,pos).y,z=convert(lookDir,pos).z}) then --isInArray(t.onShoot.misc.walls_id, getThingfromPos({x=convert(lookDir,pos).x, y=convert(lookDir,pos).y,z=convert(lookDir,pos).z, stackpos=0}).itemid) then doSendDistanceShoot(pos, convert(lookDir,pos),effect) pos = convert(lookDir,pos) var=var+1 posV = convertV(lookDir,playerPos) for _, pid in ipairs(getPlayersOnline()) do if (getCreaturePosition(pid).x == pos.x and getCreaturePosition(pid).y == pos.y and getCreaturePosition(pid).z == pos.z) then --if loopCounter > 2 then vpid = pid --end if (vpid ~= vcid) then if var > 2 then if (getCreaturePosition(pid).x == posV.x and getCreaturePosition(pid).y == posV.y and getCreaturePosition(pid).z == posV.z) then killPlayer(pid,pos,getCreatureName(vcid)) if (lookDir == 0) or (lookDir == 2) then var = 6 else var = 8 end end end killPlayer(pid,pos,vcid) if (lookDir == 0) or (lookDir == 2) then var = 6 else var = 8 end end end loopCounter = loopCounter +1 end if (lookDir == 0) or (lookDir == 2) then if var ~= 6 then addEvent(lineAnimation, SBW_BALLSPEED, lookDir,pos,effect,nil,var,pos,found,posV,check,vcid,loopCounter,vpid) else var = 1 end else if var ~= 8 then addEvent(lineAnimation, SBW_BALLSPEED, lookDir,pos,effect,nil,var,pos,found,posV,check,vcid,loopCounter,vpid) else var = 1 end end else doSendMagicEffect(convert(lookDir,pos),2) var = 1 end end local ret = {} function convert(lookDir,pos) local positions = { [0] = {x = pos.x, y = pos.y-1, z = pos.z}, [1] = {x = pos.x+1, y = pos.y, z = pos.z}, [2] = {x = pos.x, y = pos.y+1, z = pos.z}, [3] = {x = pos.x-1, y = pos.y, z = pos.z} } ret = positions[lookDir] return ret end local ret = {} function convertV(lookDir,pos) local positions = { [0] = {x = pos.x, y = pos.y+1, z = pos.z}, [1] = {x = pos.x-1, y = pos.y, z = pos.z}, [2] = {x = pos.x, y = pos.y-1, z = pos.z}, [3] = {x = pos.x+1, y = pos.y, z = pos.z} } ret = positions[lookDir] return ret end function isInWallArray(pos) for k = 0, table.getn(SBW_WALLSID) do if getTileItemById(pos, SBW_WALLSID[k]).itemid == SBW_WALLSID[k] then --this doesn't even make sense but tried other ways and it gave errors, so meh 2lazy2search return true end end return false end function killPlayer(cid, pos, killer) local t_l = SBW_AREA[1] local b_r = SBW_AREA[2] local posti = {} local isPossibleToTeleportPlayer = false while (isPossibleToTeleportPlayer == FALSE) do posti = Position(math.random(t_l.x,b_r.x), math.random(t_l.y, b_r.y), 7) if isInWallArray(posti) == FALSE then isPossibleToTeleportPlayer = TRUE end end doTeleportThing(cid, posti) doSendMagicEffect(pos,2) doSendMagicEffect(posti,6) doSendAnimatedText(pos, ""..getCreatureName(killer).." ", 55) doPlayerSendTextMessage(cid, 27, "Voce morreu para "..getCreatureName(killer)..".") doPlayerSetStorageValue(killer, SBW_SCORE, getPlayerStorageValue(killer, SBW_SCORE)+SBW_POINTSKILL) doPlayerSendTextMessage(killer, 27, "You've killed "..getCreatureName(cid)..".") if SBW_LOSTSCORE then doPlayerSetStorageValue(cid, SBW_SCORE, getPlayerStorageValue(cid, SBW_SCORE)-1) end if SBW_RESETAMMO then doPlayerSetStorageValue(cid, SBW_AMMO, SBW_MINAMMO) end end  
       
       
       
       
      Em data/globalevents abra o seu globalevents.xml e insira a seguinte linha:
      <globalevent name="StartSBW" time="19:00" event="script" value="events/snowballglobalevent.lua"/>
      Em data/globalevents/scripts crie um arquivo com o nome de snowballglobalevent.lua e insira o seguinte conteúdo:
      function onTime() function isInWallArray(pos) for k = 0, table.getn(SBW_WALLSID) do if (getTileItemById(pos, SBW_WALLSID[k]).itemid == SBW_WALLSID[k]) then return true end end return false end function endsnowball() local score = {} if not SBW_USEWAIT then doRemoveItem(getTileItemById(SBW_TP, 1387).uid) end for _, pid in ipairs(getPlayersOnline()) do if getPlayerStorageValue(pid, SBW_INEVENT) > 0 then table.insert(score, {getCreatureName(pid), getPlayerStorageValue(pid, SBW_SCORE)}) doPlayerSetStorageValue(pid, SBW_INEVENT, 0) doPlayerSetStorageValue(pid, SBW_SCORE, 0) doPlayerSetStorageValue(pid, SBW_AMMO, 0) doTeleportThing(pid, SBW_TPEND) end end table.sort(score, function(a, b) return a[2] > b[2] end) --local random_item = SBW_REWARDS[math.random(1, #SBW_REWARDS)] local hora = os.date("%X") local data = os.date("%x") if table.getn(score) > 0 then if SBW_ADDREWARD then for _, pid in ipairs(getPlayersOnline()) do if getCreatureName(pid) == score[1][1] then for op,ad in pairs(SBW_REWARDS) do doPlayerAddItem(pid, ad[1], ad[2]) end break end end end db.query("INSERT INTO `snowballwar` VALUES ('', ".. db.escapeString(score[1][1]) .. ",".. score[1][2] ..", ".. db.escapeString(data) ..", ".. db.escapeString(hora) ..");") db.query("UPDATE `players` SET `sbw_points`=`sbw_points`+".. score[1][2] .." WHERE `name` = " .. db.escapeString(score[1][1]) .. ";") doBroadcastMessage("[SNOWBALL EVENT] encerrou-se, parabens ao jogador "..score[1][1].." que venceu o SnowBall Event com "..score[1][2].." pontos.") end return true end local t_l = SBW_AREA[1] local b_r = SBW_AREA[2] function moveToEvent() for _, pid in ipairs(getPlayersOnline()) do if isInRange(getCreaturePosition(pid), SBW_WAITROOM[1], SBW_WAITROOM[2]) then local posti = {} local isPossibleToTeleportPlayer = false while (isPossibleToTeleportPlayer == FALSE) do posti = Position(math.random(t_l.x,b_r.x), math.random(t_l.y, b_r.y), 7) if (isInWallArray(posti) == FALSE) then isPossibleToTeleportPlayer = TRUE end end doTeleportThing(pid, posti) doPlayerSetStorageValue(pid, SBW_INEVENT, 1) doPlayerSetStorageValue(pid, SBW_AMMO, SBW_MINAMMO) doPlayerSetStorageValue(pid, SBW_SCORE, 0) doPlayerSendTextMessage(pid, 27, "[SNOWBALL WAR] Seja bem vindo, aqui estao os comandos que voce vai usar durante o evento\n!snowball atirar --Atirar uma bola de neve.\n!snowball info --Isso mostra seus pontos de jogos e a quantia de bolas de neve que voce tem. Tambem mostra o ranking de pontos do evento.\n Recarregue suas bolas de neve clicando em frente ao gerador no centro do campo.\nAltamente recomendado adicionar estes comandos a sua hotkeys.") end end doRemoveItem(getTileItemById(SBW_TP, 1387).uid) addEvent(endsnowball, SBW_DURATION*1000*60) doBroadcastMessage(SBW_MSGSTART) end local time = os.date("*t") local timeopen1 = math.ceil(SBW_TIMEWAIT / 4) local timeopen2 = math.ceil(SBW_TIMEWAIT / 2) if (SBW_STARTAUTO) and (isInArray(SBW_DAYS,time.wday)) then doBroadcastMessage(SBW_MSGWARNING) if SBW_USEWAIT then addEvent(doBroadcastMessage, timeopen1*1000*60, "[SNOWBALL WAR] - Resta(m) ".. timeopen2 .." minuto(s) para iniciar o evento!") if (timeopen2 ~= timeopen1) then addEvent(doBroadcastMessage, timeopen2*1000*60, "[SNOWBALL WAR] - Resta(m) ".. timeopen1 .." minuto(s) para iniciar o evento!") end addEvent(moveToEvent, SBW_TIMEWAIT*1000*60) doCreateTeleport(1387, SBW_TPGO, SBW_TP) else if SBW_TFS == "0.3" then doItemSetAttribute(doCreateItem(1387, SBW_TP), "aid", 2880) else doSetItemActionId(doCreateItem(1387, SBW_TP), 2880) end if(SBW_DURATION > 0) then addEvent(endsnowball, SBW_DURATION*1000*60) end end end return true end  
       
       
       
       
      Em data/movements abra o seu movements.xml e insira a seguinte linha:
      <movevent type="StepIn" actionid ="2880" event="script" value="snowballmovement.lua"/>  
      Em data/movements/scripts crie um arquivo com o nome de snowballglobalmovement.lua e insira o seguinte conteúdo:
      function onStepIn(cid, item, pos) doTeleportThing(cid, SBW_TPGO) doBroadcastMessage("[SNOWBALL WAR] O " ..getCreatureName(cid).. " player esta participando do evento snowball.", MESSAGE_STATUS_CONSOLE_ORANGE) doPlayerSetStorageValue(cid, SBW_INEVENT, 1) doPlayerSetStorageValue(cid, SBW_AMMO, SBW_MINAMMO) doPlayerSetStorageValue(cid, SBW_SCORE, 0) end  
       
       
       
       
      Já estamos quase terminando!
      Agora em data/lib crie um arquivo com o nome de SBW.lua com o seguinte conteúdo:
       
      -- This script is part of Snow Ball War Event Tibiaking Absolute -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see <http://www.gnu.org/licenses/>. -- // -- POSIÇÕES IMPORTANTES SBW_AREA = {{x = 1214, y = 1205, z = 7}, {x = 1251, y = 1242, z = 7}}-- AREA DO EVENTO | Canto superior esquerdo / inferior direito SBW_WAITROOM = {{x = 1229, y = 1220, z = 6}, {x = 1235, y = 1226, z = 6}} -- AREA DE ESPERA | Canto superior esquerdo / inferior direito SBW_TP = {x = 165, y = 45, z = 7} -- local onde teleport sera criado (entrada de jogadores) SBW_TPGO = {x = 1232, y = 1223, z = 6} -- local onde teleport vai levar (saida de jogadores) SBW_TPEND = {x = 155, y = 54, z = 7} -- local onde serao teleport ao final do evento SBW_GERADOR = {x = 1232, y = 1223, z = 7} -- local onde gerador vai ficar -- CONFIGURAÇÕES DO EVENTO SBW_DAYS = {1,2,3,4,5,6,7} -- dias de semana que vai abrir SBW_DURATION = 10 -- duração do evento em minutos SBW_POINTSKILL = 1 -- pontos de jogo por morte SBW_AMMOBUY = 20 -- quantia de munições compradas por cada ponto SBW_MINAMMO = 50 -- munição inicial dos jogadores SBW_TIMEWAIT = 3 -- tempo na sala de espera em minutos SBW_AMMOINFI = false SBW_LOSTSCORE = true SBW_RANDOMIZE = true SBW_RESETAMMO = true SBW_STARTAUTO = true SBW_USEWAIT = true --PREMIO DO EVENTO SBW_ADDREWARD = true SBW_REWARDS = { {6527,500}, {2345,1} } -- // Não mexa daqui para baixo SBW_TFS = "0.4" -- STORAGES SBW_EXAUSTHED = 2455 SBW_INEVENT = 2460 SBW_SCORE = 2465 SBW_AMMO = 2400 SBW_WALLSID = {5324,7003,7021,6712,7023,7002,6713,6714,6869,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6707,6708,6709,6710,6711,2698,2697,7020,6719,6720,6721,6722,6723,6724,6725,6726,6727,6761,6762,6768,6769,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4664,4665,4666,7008,7009,7010,7011,8239,7004,7005,7006,7007,6627,6628,6629,6630,6631,6632,6633,6634,6635,6636,6637,6638,7022} SBW_BALLSPEED = 150 SBW_SHOOTEXAUSTHED = 1000 SBW_SHOOTDIR = 0 SBW_STATUS = 'on' -- MENSAGENS SBW_MSGWARNING = "[SNOWBALL WAR] Abriu o teleport de ingresso para o evento, para participar se dirija ate o templo do servidor." SBW_MSGSTART = "[SNOWBALL WAR] O teleport foi removido e o evento foi iniciado, boa sorte a todos participantes." A frente das configuração solicitadas explica onde devem ser modificados.
       
       
       
       
       
      E por fim, vá até o seu banco de dados (phpmyadmin) e insira a seguinte query:
      CREATE TABLE IF NOT EXISTS `snowballwar` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `score` int(11) NOT NULL, `data` varchar(255) NOT NULL, `hora` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;  
      Ainda no phpmyadmin execute:
      ALTER TABLE `players` ADD `sbw_points` int(11);  
       
      Importe o arquivo SNOWBALL.otbm em seu mapa!
      Imagem do mapa:


      Download do mapa: https://www.sendspace.com/file/mae37z
      Scan do mapa: https://www.virustotal.com/pt/file/94a507c71ef4cc241e415f2a8290441f7fa77809d804e24be18e9581a85c4740/analysis/1479161634/
       
       


      É importante lembrar que peguei o script de um autor e realizei as modificações o tornando público para a comunidade exclusiva do TIBIAKING.

      Espero que façam um ótimo proveito.

      See you later.
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo