Nowicjusz
Dołączył: 17 Lut 2011
Posty: 4
Przeczytał: 0 tematów
Ostrzeżeń: 0/5
Skąd: Poznań
|
Wysł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 |
|
|