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

Solved Paintball Event Automatic Start ?

Daniel Kopeć

Member
Joined
Dec 8, 2018
Messages
125
Solutions
4
Reaction score
12
Location
Poland
How to set the automatic start of the [MOD] Paintball event. At a given time?
For example, at 17:00.

Script Paintball Event [MOD] xml:

XML:
<?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 = 16957, y = 14134, z = 7}, --Top left pos of spawning area
                        bottom_right = {x = 17015, y = 14162, z = 7}--bottom right pos of spawning area
                    },
                    waiting_room_area = {
                        top_left = {x = 16977, y = 14115, z = 7}, --Top left pos of the waiting room
                        bottom_right = {x = 16985, y = 14123, z = 7}--bottom right pos of the waiting room
                    },
                    tp_to_paintball = {x = 32364, y = 32243, z = 7}, --pos where the tp will be created
                    event_ending_pos = {x = 32369, y = 32241, z = 7} --pos players will be sent after event ending
                },
                storages = {
                    exhaust = 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 = 10, --minutes, 0 if it's an always-open event
                    infinite_ammo = false,
                    winner_gets_item = true,
                    prize_item_id = 9077,
                    decrease_score_on_death = false,
                    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 = true,
                    use_waiting_room = true,
                    waiting_time = 2 --minutes
                }
            },
            onShoot = {
                storages = {
                    ammo = 2400
                },
                misc = {
                    walls_id = {6728,6729,6730,6731,6732,6733,6734,6735,6736,6737,6738},
                    bullets_exhaust = 500, --in ms
                    bullet_speed = 200
                },
                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="3600000" 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>
 
Lua:
<?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 = 16957, y = 14134, z = 7}, --Top left pos of spawning area
                        bottom_right = {x = 17015, y = 14162, z = 7}--bottom right pos of spawning area
                    },
                    waiting_room_area = {
                        top_left = {x = 16977, y = 14115, z = 7}, --Top left pos of the waiting room
                        bottom_right = {x = 16985, y = 14123, z = 7}--bottom right pos of the waiting room
                    },
                    tp_to_paintball = {x = 32364, y = 32243, z = 7}, --pos where the tp will be created
                    event_ending_pos = {x = 32369, y = 32241, z = 7} --pos players will be sent after event ending
                },
                storages = {
                    exhaust = 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 = 10, --minutes, 0 if it's an always-open event
                    infinite_ammo = false,
                    winner_gets_item = true,
                    prize_item_id = 9077,
                    decrease_score_on_death = false,
                    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 = true,
                    use_waiting_room = true,
                    waiting_time = 2 --minutes
                }
            },
            onShoot = {
                storages = {
                    ammo = 2400
                },
                misc = {
                    walls_id = {6728,6729,6730,6731,6732,6733,6734,6735,6736,6737,6738},
                    bullets_exhaust = 500, --in ms
                    bullet_speed = 200
                },
                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" time="17:00" event="script"><![CDATA[
        domodlib('config')
        function onTime()
            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>
 
Last edited:
Lua:
<?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 = 16957, y = 14134, z = 7}, --Top left pos of spawning area
                        bottom_right = {x = 17015, y = 14162, z = 7}--bottom right pos of spawning area
                    },
                    waiting_room_area = {
                        top_left = {x = 16977, y = 14115, z = 7}, --Top left pos of the waiting room
                        bottom_right = {x = 16985, y = 14123, z = 7}--bottom right pos of the waiting room
                    },
                    tp_to_paintball = {x = 32364, y = 32243, z = 7}, --pos where the tp will be created
                    event_ending_pos = {x = 32369, y = 32241, z = 7} --pos players will be sent after event ending
                },
                storages = {
                    exhaust = 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 = 10, --minutes, 0 if it's an always-open event
                    infinite_ammo = false,
                    winner_gets_item = true,
                    prize_item_id = 9077,
                    decrease_score_on_death = false,
                    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 = true,
                    use_waiting_room = true,
                    waiting_time = 2 --minutes
                }
            },
            onShoot = {
                storages = {
                    ammo = 2400
                },
                misc = {
                    walls_id = {6728,6729,6730,6731,6732,6733,6734,6735,6736,6737,6738},
                    bullets_exhaust = 500, --in ms
                    bullet_speed = 200
                },
                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" time="17:00" event="script"><![CDATA[
        domodlib('config')
        function onTimer()
            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>
It doesn't work and there are tons of bugs in the console :eek:
paintball errors.png
 
Back
Top