What's new
  • logo_cipsoft
    Latest servers:
    New servers will open on: 16th Oct 2024:
    Bravoria (Open PvP) Aethera (Open PvP) us_logo Cantabra (Open PvP)

- Skrypt Skrypt do gry Tetris

Status
Not open for further replies.

Exevo

User
Joined
Dec 6, 2012
Messages
39
Reaction score
0
Witam, chcia?em Wam przedstawi? skrypt do gry Tetris.

Nazwa skryptu: Tetris
Autor:Fatty Efx/Exevo
Wymagania (ekwipunek, potki): Bez wymaga?
Opis*: Nale?y umie?ci? ten plik PHP do jakiego? NPC, bynajmniej ja tak zrobi?em, dzi?ki temu skryptowi mo?na gra? w Tetris w tibii.
Screeny*: Po otwarciu ots'a wstawi?.

Wi?c tak, tworzymy plik tetris.lua i wklejamy do niego:
PHP:
--[[
Tetris system By Exevo (mtb)
Email: [email]bastyx@o2.pl[/email]
Enjoy ""
]]
local config = {
    uppos = {x=983,y=1204,z=7},
    dowpos = {x=989,y=1214,z=7},
    playerpos = {x=991,y=1211,z=7},
    block_start={x=986,y=1205,z=7},
    exit={x=991,y=1208,z=7},
    delay=10,
    item=1739,
    effects = {
        mark=3,
        burn=15,
        },
    blocks = {
        --
            {
             {
                {0,1,0},
                {1,1,1},
                {0,0,0},
                },
                 {
                {0,1,0},
                {0,1,1},
                {0,1,0},
                },
                 {
                {0,0,0},
                {1,1,1},
                {0,1,0},
                },
                 {
                {0,1,0},
                {1,1,0},
                {0,1,0}
                }
            },

        {
             {
                {1,1,1},
            },
             {
                {1},
                {1},
                {1},
            },
        },
        --
        {
        {
            {1},
        },
        },
        {
        {
        {1,1},{1,1},
        },
        },


    },
    data={false},
}

local function createItensInArea(item, pos, area) -- Function by Exevo
    local centro = {}
    local coisa = {}
    centro.y = math.floor(#area/2)+1
    for y = 1, #area do
        for x = 1, #area[y] do
            number = area[y][x]
            if number > 0 then
                centro.x = math.floor(table.getn(area[y])/2)+1
                local pos = {x = pos.x + x - centro.x, y = pos.y + y - centro.y, z = pos.z}
                local items = doCreateItem(item, 1, pos)
                table.insert(coisa, 1, items)
            end
        end
    end
    return coisa
end
local function removeItensInArea(item, pos, area) -- Function by Exevo
    local centro = {}
    centro.y = math.floor(table.getn(area)/2)+1
    for y = 1, table.getn(area) do
        for x = 1, table.getn(area[y]) do
            number = area[y][x]
            if number > 0 then
                centro.x = math.floor(table.getn(area[y])/2)+1
                local pos = {x = pos.x + x - centro.x, y = pos.y + y - centro.y, z = pos.z,stackpos = 255}
                local coisa = getThingfromPos(pos)
                if coisa.itemid == item then
                  doRemoveItem(coisa.uid,1)
                end
            end
        end
    end
end
local function checkItensInArea(item, pos, area,coisas) -- Function by Exevo
    local centro = {}
    if coisas == nil then
        coisas = {}
    end
    centro.y = math.floor(table.getn(area)/2)+1
    for y = 1, table.getn(area) do
        for x = 1, table.getn(area[y]) do
            number = area[y][x]
            if number > 0 then
                centro.x = math.floor(table.getn(area[y])/2)+1
                local pos = {x = pos.x + x - centro.x, y = pos.y + y - centro.y, z = pos.z,stackpos = 1}
                local coisa = getThingfromPos(pos)
                if coisa.itemid == item then
                    if not isInArray(coisas, coisa.uid) then
                        return true
                    end
                end
            end
        end
    end
    return false
end
function clean(pos1,pos2,stack) -- Function by Exevo
    for x = 0, math.floor(pos2.x-pos1.x) do
        for y = 0, math.floor(pos2.y-pos1.y) do
            local coisa = getThingfromPos({x = pos1.x+x, y = pos1.y+y, z = pos1.z, stackpos = stack})
            if coisa.itemid == config.item then
                doRemoveItem(coisa.uid,1)
            end
        end
    end
end
local function pushdown(pos1,pos2,item) -- push all piece 1 sqm to down
    -- Function by mock
    local ymax = math.floor(pos2.y-pos1.y)
    for y = 1,ymax  do
        for x = 1, math.floor(pos2.x-pos1.x)-1 do
            local coisa = getThingfromPos({x = pos1.x+x, y = pos1.y+(ymax-y), z = pos1.z, stackpos = 1})
            if coisa.itemid == item then
                local p2 = getThingPos(coisa.uid)
                doRemoveItem(coisa.uid,1)
                p2.y = p2.y+1
                doCreateItem(item, 1, p2)
            end
        end
    end
end
local function checkline(pos,cid,item) -- Function by Exevo
    local sizex = config.dowpos.x-config.uppos.x-1
    local t = {}
    for x=1,sizex do
        local using = {x=pos.x+x,y=pos.y,z=pos.z,stackpos=1}
        local igz = getThingfromPos(using)

        if igz.itemid == item then

            table.insert(t,1,{using,igz.uid})
        end
    end
    if #t == sizex then
        setPlayerStorageValue(cid,21451, getPlayerStorageValue(cid, 21451)+1)
        for i=1,#t do
            local f = t[i]
            doRemoveItem(f[2],1)
            if config.effects.burn then
                doSendMagicEffect(f[1],config.effects.burn)
            end
        end
        pushdown(config.uppos,{x=config.dowpos.x,y=pos.y,z  =config.dowpos.z},item)
        checkline(pos,cid,item)
    end
end
function doSendMagicEffectInArea(pos,effect,area,cid) -- Function by Exevo
    local centro = {}
    centro.y = math.floor(table.getn(area)/2)+1
    for y = 1, table.getn(area) do
        for x = 1, table.getn(area[y]) do
            if area[y][x] > 0 then
                centro.x = math.floor(table.getn(area[y])/2)+1
                if type(effect) == 'table' then
                    doSendMagicEffect({x=pos.x+x-centro.x,y=pos.y+y-centro.y,z= pos.z},(effect[area[y][x]] or 0),cid)
                else
                    doSendMagicEffect({x=pos.x+x-centro.x,y=pos.y+y-centro.y,z= pos.z},effect or 0,cid)
                end
            end
        end
    end
    return true
end

local function pedra(pos,cid,area) -- Function by Exevo
        config.data = config.data or {}
        config.data[6] = config.data[6] or config.delay
        config.data[5] = config.data[5] or 1
        config.data[5] = config.data[5]+1
        if config.data[1] == false then
            config.data[1] = #area == 1 and 1 or math.random(1,#area)
        end
        local cre_pos = getCreaturePosition(cid)
        pos.stackpos = 255
        pos.y = pos.y-1
        if getThingfromPos(pos).itemid == config.item then
            removeItensInArea(config.item,pos, area[config.data[1]])
        end
        if config.data[5] >= config.data[6] then
            pos.y = pos.y+1
            config.data[5] = 1
        end
        pos.stackpos = 1
        if cre_pos.x == config.playerpos.x+1 then
            doTeleportThing(cid, config.playerpos)
            pos.x = pos.x+1
            local coisa2 = getThingfromPos(pos)
            if checkItensInArea(463,pos, area[config.data[1]]) or checkItensInArea(config.item,pos, area[config.data[1]]) then
                pos.x = pos.x-1
                doSendAnimatedText(cre_pos, "Block", math.random(1,255))
            end
        elseif cre_pos.x == config.playerpos.x and cre_pos.y == config.playerpos.y+1 then
            doTeleportThing(cid, config.playerpos)
            pos.y = pos.y+1
            if checkItensInArea(463,pos, area[config.data[1]]) or checkItensInArea(config.item,pos, area[config.data[1]]) then
                pos.y = pos.y-1
                doSendAnimatedText(cre_pos, "Block", math.random(1,255))
            end
        elseif cre_pos.x == config.playerpos.x and cre_pos.y == config.playerpos.y-1 then
            doTeleportThing(cid, config.playerpos)
            if #area > 1 then
                local rot = #area < config.data[1]+1 and 1 or config.data[1]+1
                if checkItensInArea(463,pos, area[rot]) or checkItensInArea(config.item,pos, area[rot]) then
                    doSendAnimatedText(cre_pos, "Block", math.random(1,255))
                else
                    config.data[1] = rot
                end
            end
        elseif cre_pos.x == config.playerpos.x-1 then
            doTeleportThing(cid, config.playerpos)
            pos.x = pos.x-1
            local coisa2 = getThingfromPos(pos)
            if checkItensInArea(463,pos, area[config.data[1]]) or checkItensInArea(config.item,pos, area[config.data[1]]) then
                pos.x = pos.x+1
                doSendAnimatedText(cre_pos, "Block", math.random(1,255))
            end
        end
        if config.data[3] then
            config.data[3] = nil
            return
        end
        pos.stackpos=1
        if getThingfromPos(pos).itemid == config.item then
            doPlayerSendTextMessage(config.data[2], 24, 'You lose!')
            clean(config.uppos,config.dowpos,2)
            clean(config.uppos,config.dowpos,1)
            creation = nil
            doTeleportThing(config.data[2], config.exit)
            config.data[2] = nil
            config.data[1] = false
            config.data[3] = true
            return
        end
        local uida = createItensInArea(config.item,pos, area[config.data[1]])
        if config.effects.mark then
            doSendMagicEffectInArea(pos,config.effects.mark, area [config.data[1]] )
        end
        local humrox = pos
        pos.y = pos.y+1
        if not checkItensInArea(463,pos, area[config.data[1]]) and not checkItensInArea(config.item,humrox, area[config.data[1]],uida) then
            addEvent(pedra, 100, pos,cid,area)
        else
        e = 0
        for i=0,((config.dowpos.y)-(config.uppos.y)) do
            e = e-1
            addEvent(checkline,100*i,{x=config.uppos.x,y= config.dowpos.y +e,z=config.uppos.z},cid,config.item)
        end
      creation = nil
      config.data[1] = false
      end
end


local function control_loop(startpos) -- Function by Exevo
    if not config.data[2] then
        return
    end
    doSendMagicEffect(getCreaturePosition(config.data[2]), 1)
    local poi = getPlayerStorageValue(config.data[2], 21451)
    if poi == -1 then
        setPlayerStorageValue(config.data[2],21451, 0)
        poi = 0
    end
    doSendAnimatedText(getCreaturePosition(config.data[2]), "points: "..poi, math.random(1,255))
    startpos.stackpos = 2
    local coisaa = getThingfromPos(startpos)
    if not creation then
       creation = true
       addEvent(pedra, 1000, {x=config.block_start.x,y=config.block_start.y,z= config.block_start.z ,stackpos=1},config.data[2],config.blocks[math.random(1,#config.blocks)])
    end
    if coisaa.itemid == config.item then
        doPlayerSendTextMessage(config.data[2], 24, 'You lose!')
        clean(config.uppos,config.dowpos,2)
        clean(config.uppos,config.dowpos,1)
        creation = nil
        doTeleportThing(config.data[2], config.exit)
        config.data[2] = nil
        config.data[1] = false
        config.data[3] = true
    else
        addEvent(control_loop, 300, startpos)
    end
end

function onUse(cid, item, fromPosition, itemEx, toPosition)
    if not config.data[2] then
        doTeleportThing(cid, config.playerpos)
        setPlayerStorageValue(cid,21451, 0)
        config.data[2] = cid
        addEvent(control_loop, 1000,config.block_start)
    else
        doPlayerSendCancel(cid,'Tetris is in use. Please wait.')
    end
    return false
end

UWAGA! To nie jest skrypt PHP, tylko LUA. Napisa?em w autorze Fatty Efx/Exevo, poniewa? gram pod tymi nickami. Je?li ktosjest ogarni?ty, mo?e r?wnie? przet?umaczy? na Polski.
 
Status
Not open for further replies.
Top