From dc926282ec6318babaf520561c77c50b122646a2 Mon Sep 17 00:00:00 2001 From: faketruth Date: Wed, 1 Feb 2012 00:17:11 +0000 Subject: Changed the Fire plugin to use the new plugin structure git-svn-id: http://mc-server.googlecode.com/svn/trunk@206 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- Plugins/Fire.lua | 149 ------------------------------------------------ Plugins/Fire/plugin.lua | 133 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 149 deletions(-) delete mode 100644 Plugins/Fire.lua create mode 100644 Plugins/Fire/plugin.lua (limited to 'Plugins') diff --git a/Plugins/Fire.lua b/Plugins/Fire.lua deleted file mode 100644 index 88bff84da..000000000 --- a/Plugins/Fire.lua +++ /dev/null @@ -1,149 +0,0 @@ -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 ) 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( self:GetName() .. " v." .. self: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 ) diff --git a/Plugins/Fire/plugin.lua b/Plugins/Fire/plugin.lua new file mode 100644 index 000000000..5a96c4fdc --- /dev/null +++ b/Plugins/Fire/plugin.lua @@ -0,0 +1,133 @@ +local FireBlocks = {} -- List of blocks that are currently burning! + +function Initialize( Plugin ) + + Plugin:SetName( "Fire" ) + Plugin:SetVersion( 2 ) + + PluginManager = cRoot:Get():GetPluginManager() + PluginManager:AddHook( Plugin, cPluginManager.E_PLUGIN_TICK ) + PluginManager:AddHook( Plugin, cPluginManager.E_PLUGIN_BLOCK_PLACE ) + PluginManager:AddHook( Plugin, cPluginManager.E_PLUGIN_BLOCK_DIG ) + + Log( "Initialized " .. Plugin:GetName() .. " v." .. Plugin:GetVersion() ) + + return true +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 ) 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 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 ) + local World = cRoot:Get():GetWorld() + + --Since flint and steel doesn't do anything on the server side yet + if( PacketData.m_ItemType == E_ITEM_FLINT_AND_STEEL ) then + 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 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 + +local NumTicks = 0 +function 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 + + local World = cRoot:Get():GetWorld() + + local NewTable = {} + for key,val in pairs(FireBlocks) do + X = val["x"] + Y = val["y"] + Z = val["z"] + local Burnables = FindBurnableAround(X, Y, Z) + if( math.random(10) > 5 ) then + table.insert( NewTable, val ) + elseif( #Burnables > 0 ) then + local 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 -- cgit v1.2.3