Cuberite Forum

Full Version: Fire.LuA
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
anyone know how to add TNT boxes to this so they can be ignited? also does anyone know how to make railroads work? they dont link together andyou cant put a cart on it



PHP Code:
local FirePlugin = {}
FirePlugin.__index = FirePlugin

FireBlocks 
= {}

function 
FirePlugin:new()
   
local t = {}
   
setmetatable(t, FirePlugin)
   
local w = Lua__cPlugin:new()
   
tolua.setpeer(w, t)
   
w:tolua__set_instance(w)
   return 
w
end

function IsForeverBurnable( BlockID )
    if( 
BlockID == E_BLOCK_BLOODSTONE ) then
        
return true
    end
    
return false
end

function IsBurnable( BlockID )
    if( 
BlockID == E_BLOCK_LEAVES or BlockID == E_BLOCK_LOG BlockID) then
        
return true
    end

    
return false
end

function FindBurnableAround( X, Y, Z )
    
World = cRoot:Get():GetWorld()

    
ListBurnables = {}
    if( 
IsBurnable( World:GetBlock(X-1, Y, Z) ) ) then
        table
.insert( ListBurnables, { ["x"] = X-1, ["y"] = Y, ["z"] = Z } )
    
end
    
if( IsBurnable( World:GetBlock(X+1, Y, Z) ) ) then
        table
.insert( ListBurnables, { ["x"] = X+1, ["y"] = Y, ["z"] = Z } )
    
end
    
if( IsBurnable( World:GetBlock(X, Y-1, Z) ) ) then
        table
.insert( ListBurnables, { ["x"] = X, ["y"] = Y-1, ["z"] = Z } )
    
end
    
if( IsBurnable( World:GetBlock(X, Y+1, Z) ) ) then
        table
.insert( ListBurnables, { ["x"] = X, ["y"] = Y+1, ["z"] = Z } )
    
end
    
if( IsBurnable( World:GetBlock(X, Y, Z-1) ) ) then
        table
.insert( ListBurnables, { ["x"] = X, ["y"] = Y, ["z"] = Z-1 } )
    
end
    
if( IsBurnable( World:GetBlock(X, Y, Z+1) ) ) then
        table
.insert( ListBurnables, { ["x"] = X, ["y"] = Y, ["z"] = Z+1 } )
    
end

    
return ListBurnables
end

function FirePlugin:OnDisable()
    
Log( Plugin:GetName() .. " v." .. Plugin:GetVersion() .. " is shutting down..." )
end

function FirePlugin:Initialize()
    
self:SetName( "Fire" )
    
self:SetVersion( 1 )

    
PluginManager = cRoot:Get():GetPluginManager()
    
PluginManager:AddHook( self, cPluginManager.E_PLUGIN_TICK )
    
PluginManager:AddHook( self, cPluginManager.E_PLUGIN_BLOCK_PLACE )
    
PluginManager:AddHook( self, cPluginManager.E_PLUGIN_BLOCK_DIG )

    
Log( "Initialized " .. self:GetName() .. " v." .. self:GetVersion() )
    return 
true
end

function FirePlugin:OnBlockPlace( PacketData, Player )

    if( 
PacketData.m_ItemType == E_BLOCK_FIRE or PacketData.m_ItemType == E_ITEM_FLINT_AND_STEEL ) then
        
if( PacketData.m_Direction > -1 ) then
            local X 
= PacketData.m_PosX
            local Y 
= PacketData.m_PosY
            local Z 
= PacketData.m_PosZ

            X
, Y, Z = AddDirection( X, Y, Z, PacketData.m_Direction )

            --
Since flint and steel doesn't do anything on the server side yet
            if( PacketData.m_ItemType == E_ITEM_FLINT_AND_STEEL ) then
                local World = cRoot:Get():GetWorld()
                World:SetBlock( X, Y, Z, E_BLOCK_FIRE, 0 )
            end

            if( not IsForeverBurnable( World:GetBlock( X, Y-1, Z ) ) ) then
                table.insert( FireBlocks, { ["x"] = X, ["y"] = Y, ["z"] = Z } )
            end
        end
    end

    return false -- dont forbid placing the fire
end

-- To put out fires! :D
function FirePlugin:OnBlockDig( PacketData, Player )
    if( PacketData.m_Direction < 0 ) then
        return false
    end

    local X = PacketData.m_PosX
    local Y = PacketData.m_PosY
    local Z = PacketData.m_PosZ

    X, Y, Z = AddDirection( X, Y, Z, PacketData.m_Direction )

    local World = cRoot:Get():GetWorld()
    if( World:GetBlock( X, Y, Z ) == E_BLOCK_FIRE ) then
        World:SetBlock( X, Y, Z, E_BLOCK_AIR, 0 )
    end

    return false
end

NumTicks = 0
function FirePlugin:Tick( DeltaTime )
    if( NumTicks < 10 ) then    -- Only spread every 10 ticks, to make sure it doesnt happen too fast
        NumTicks = NumTicks + 1
        return
    end
    NumTicks = 0

    World = cRoot:Get():GetWorld()

    NewTable = {}
    for key,val in pairs(FireBlocks) do
        X = val["x"]
        Y = val["y"]
        Z = val["z"]
        Burnables = FindBurnableAround(X, Y, Z)
        if( math.random(10) > 5 ) then
            table.insert( NewTable, val )
        elseif( #Burnables > 0 ) then
            ToBurn = Burnables[ math.random( #Burnables ) ]
            World:SetBlock( ToBurn["x"], ToBurn["y"], ToBurn["z"], E_BLOCK_FIRE, 0 )
            table.insert( NewTable, ToBurn )
            table.insert( NewTable, val )
        else
            World:SetBlock( X, Y, Z, 0, 0 )
        end
    end
    FireBlocks = NewTable
end

Plugin = FirePlugin:new()
cRoot:Get():GetPluginManager():AddPlugin( Plugin ) 
(02-28-2011, 10:06 AM)distroyed123 Wrote: [ -> ]anyone know how to add TNT boxes to this so they can be ignited? also does anyone know how to make railroads work? they dont link together andyou cant put a cart on it

Needs to be implemented into MCServer.
(03-01-2011, 02:47 AM)Tybor Wrote: [ -> ]
(02-28-2011, 10:06 AM)distroyed123 Wrote: [ -> ]anyone know how to add TNT boxes to this so they can be ignited? also does anyone know how to make railroads work? they dont link together andyou cant put a cart on it

Needs to be implemented into MCServer.

ahh ok, didnt know if everything needed to be emplemented