Forum Forum o OTs by Wrobel Strona Główna


FAQ Szukaj Użytkownicy Profil

 RejestracjaRejestracja   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 
[8.70] Rain System - Deszcz!

 
Napisz nowy temat   Odpowiedz do tematu    Forum Forum o OTs by Wrobel Strona Główna -> Skrypty do OTS
Zobacz poprzedni temat :: Zobacz następny temat  
Mefix94


Nowicjusz
Dołączył: 17 Lut 2011
Posty: 4
Przeczytał: 0 tematów

Ostrzeżeń: 0/5
Skąd: Poznań

PostWysłany: Czw 14:16, 17 Lut 2011    Temat postu: [8.70] Rain System - Deszcz!

Testowany na : 0.3.6 +
Instalacja:
1) data / lib / i robimy plik rain.lua
Kod:
-- Features:
    -- chance = OBJECT.chance = INT
    -- createItem = OBJECT.createItem = {chance = INT, item = {itemid = INT, type = INT}}
 
 
Rain = {ignoreIds = {4526}}
 
function Rain:new()
    local obj = {}
    setmetatable(obj, self)
    self.__index = self
    return obj
end
function Rain:getPositionInArea(fromPos, toPos)
    self.positions = {}
    for Y = fromPos.y, toPos.y do
        for X = fromPos.x, toPos.x do
            if (getTileThingByPos({x=X, y=Y, z=7, stackpos=0}).itemid ~= 0) then
                if not (string.match(string.lower(getItemNameById(getTileThingByPos({x=X, y=Y, z=7, stackpos=0}).itemid)), "water")) then
                    table.insert(self.positions, {x=X, y=Y, z=Z})
                end
            end
        end
    end
    return true
end
 
function Rain:doRain(position, disteffect, effect)
    if (self.duraction ~= self.executed) then
        local chance = self.chance or 100
        if (math.random(0, 1000) <= chance) then
            for Z = 0, 7 do
                if (getTileThingByPos(({x = position.x, y = position.y, z = Z})).itemid ~= 0) then
                    doSendDistanceShoot({x = position.x - 7, y = position.y - 5, z = Z}, {x = position.x, y = position.y, z = Z}, disteffect)
                    doSendMagicEffect({x = position.x, y = position.y, z = Z}, effect)
                    if (self.createItem) then
                        if (math.random(0, 1000) <= self.createItem.chance) then
                            if (isInArray(self.ignoreIds, getTileThingByPos({x=X, y=Y, z=Z, stackpos=0}).itemid) == FALSE) then
                                local item = doCreateItem(self.createItem.item.itemid, self.createItem.item.type, {x=position.x, y=position.y, z=Z})
                                doDecayItem(item)
                            end
                        end
                    end
                    break
                end
            end
        end
        return true
    else
        return false
    end
end
 
function Rain:start(positions, effects, duraction, delay, var)
    self:getPositionInArea(positions.fromPos, positions.toPos)
    if not (self.positions[1]) then
        return false
    end
    self.delay = delay
    self.var = var or self
    self.effects = effects
    self.duraction = duraction
    self.executed = 0
    addEvent(doCallback, self.delay, {var=self.var})
    return true
end
 
function doCallback(p)
    for _, v in pairs(p.var.positions) do
        if not (p.var:doRain(v, p.var.effects.disteffect, p.var.effects.effect)) then
            return true
        end
    end
    addEvent(doCallback, p.var.delay, {var=p.var})
    p.var.executed = p.var.executed+1
end 

2) data/glovalevent/ i tworzymy plik rain.lua
Kod:
local rain = Rain:new()
 
function onThink(interval, lastExecution)
    local minX = 990
    local minY = 993
    local maxX = 1008
    local maxY = 1006
 
    local frompos = {x=math.random(minX, maxX), y=math.random(minY, maxY), z=7}
    local topos = {x=math.random(frompos.x, maxX), y=math.random(frompos.y, maxY), z=7}
 
    local effects = {
        snow = {
            disteffect = CONST_ANI_SNOWBALL,
            effect = CONST_ME_ENERGYAREA
        },
        rain = {
            disteffect = CONST_ANI_ICE,
            effect = CONST_ME_LOSEENERGY
 
        }
    }
    random = math.random(0, 10)
    if (random == 0) then
        rain.chance = math.random(10,50)
        rain:start({fromPos = frompos, toPos = topos}, effects.snow, 300, math.random(100, 500))
    else
        rain.chance = math.random(40,100)
        rain.createItem = {chance = math.random(0,10), item = {itemid = 2016, type = 1}}
        rain:start({fromPos = frompos, toPos = topos}, effects.rain, math.random(300, 1000), math.random(100, 350))
    end
    return TRUE
end 

3) do Globalevents.xml dodaj linijkę :
Kod:
<globalevent name="rain" interval="200" event="script" value="rain.lua"/> 

4) data \ globalevents \ lib i tworzymy plik rain.lua
Kod:
-- Features:
    -- chance = OBJECT.chance = INT
    -- createItem = OBJECT.createItem = {chance = INT, item = {itemid = INT, type = INT}}
 
 
Rain = {ignoreIds = {4526}}
 
function Rain:new()
    local obj = {}
    setmetatable(obj, self)
    self.__index = self
    return obj
end
function Rain:getPositionInArea(fromPos, toPos)
    self.positions = {}
    for Y = fromPos.y, toPos.y do
        for X = fromPos.x, toPos.x do
            if (getTileThingByPos({x=X, y=Y, z=7, stackpos=0}).itemid ~= 0) then
                if not (string.match(string.lower(getItemNameById(getTileThingByPos({x=X, y=Y, z=7, stackpos=0}).itemid)), "water")) then
                    table.insert(self.positions, {x=X, y=Y, z=Z})
                end
            end
        end
    end
    return true
end
 
function Rain:doRain(position, disteffect, effect)
    if (self.duraction ~= self.executed) then
        local chance = self.chance or 100
        if (math.random(0, 1000) <= chance) then
            for Z = 0, 7 do
                if (getTileThingByPos(({x = position.x, y = position.y, z = Z})).itemid ~= 0) then
                    doSendDistanceShoot({x = position.x - 7, y = position.y - 5, z = Z}, {x = position.x, y = position.y, z = Z}, disteffect)
                    doSendMagicEffect({x = position.x, y = position.y, z = Z}, effect)
                    if (self.createItem) then
                        if (math.random(0, 1000) <= self.createItem.chance) then
                            if (isInArray(self.ignoreIds, getTileThingByPos({x=X, y=Y, z=Z, stackpos=0}).itemid) == FALSE) then
                                local item = doCreateItem(self.createItem.item.itemid, self.createItem.item.type, {x=position.x, y=position.y, z=Z})
                                doDecayItem(item)
                            end
                        end
                    end
                    break
                end
            end
        end
        return true
    else
        return false
    end
end
 
function Rain:start(positions, effects, duraction, delay, var)
    self:getPositionInArea(positions.fromPos, positions.toPos)
    if not (self.positions[1]) then
        return false
    end
    self.delay = delay
    self.var = var or self
    self.effects = effects
    self.duraction = duraction
    self.executed = 0
    addEvent(doCallback, self.delay, {var=self.var})
    return true
end
 
function doCallback(p)
    for _, v in pairs(p.var.positions) do
        if not (p.var:doRain(v, p.var.effects.disteffect, p.var.effects.effect)) then
            return true
        end
    end
    addEvent(doCallback, p.var.delay, {var=p.var})
    p.var.executed = p.var.executed+1
end 

Konfiguracja :
Kod:
local minX = 0
local minY = 0
local maxX = 0
local maxY = 0 

Wyznaczamy pozycję.

Możesz wybrać odstępy czasowe w których będzie pojawiał się deszcz :
Kod:
rain.chance = Math.random (20.10


Zdjęcie:
iv.pl/images/41999350036199920866.png


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora

Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Forum o OTs by Wrobel Strona Główna -> Skrypty do OTS Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach


fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
 
Regulamin