02-28-2011, 01:46 AM
I was bored with cactus not growing, so I thought I'd take the opportunity to implement a more fun growth mechanism for cactus
Trees are coming soon too btw using the same implementation!
These are all automatically generated by the plugin with "forking" occuring 1/3 times, completely randomly, and cactus height also random.
The destruction implementation of cactus hasn't been done yet because I can't figure out the digging API, but feel free to inform me
Trees are coming soon too btw using the same implementation!
PHP Code:
local CactiPlugin = {}
CactiPlugin.__index = CactiPlugin
function CactiPlugin:new()
local t = {}
setmetatable(t, CactiPlugin)
local w = Lua__cPlugin:new()
tolua.setpeer(w, t)
w:tolua__set_instance(w)
return w
end
function CactiPlugin:OnDisable()
Log( Plugin:GetName() .. " v." .. Plugin:GetVersion() .. " is shutting down..." )
end
function CactiPlugin:Initialize()
self:SetName( "Cacti" )
self:SetVersion( 1 )
PluginManager = cRoot:Get():GetPluginManager()
PluginManager:AddHook( self, cPluginManager.E_PLUGIN_TICK )
PluginManager:AddHook( self, cPluginManager.E_PLUGIN_BLOCK_DIG )
PluginManager:AddHook( self, cPluginManager.E_PLUGIN_BLOCK_PLACE )
self.CactiBlocks = {};
self.CactiBlocks = {};
Log( "Initialized " .. self:GetName() .. " v." .. self:GetVersion() )
self.NumTicks = 0;
return true
end
function IsFreeForCacti(block)
return block == E_BLOCK_AIR
or block == E_BLOCK_TORCH
or block == E_BLOCK_MINECART_TRACKS
or block == E_BLOCK_REDSTONE_TORCH_ON
or block == E_BLOCK_REDSTONE_TORCH_OFF;
end
function IsCacti(block)
return block == E_BLOCK_CACTUS;
end
function IsBurnable(block)
return block == E_BLOCK_LOG
or block == E_BLOCK_LEAVES;
end
function CactiPlugin:OnBlockPlace( PacketData, Player )
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 t = PacketData.m_ItemType; -- the type of item used to call the place command
local World = cRoot:Get():GetWorld();
if(t == 81) then -- cactus
Log("cactus: " .. X .. "," .. Y .. "," .. Z .. " -- adding due to Place... " .. t);
World:SetBlock(X, Y, Z, E_BLOCK_CACTUS, 0);
end
self:AddSurroundings(X, Y, Z);
self:AddBlock(X, Y, Z);
return false
end
function CactiPlugin:AddSurroundings(X, Y, Z)
local level_points = {
{X, Y+1, Z},
};
for key,val in pairs(level_points) do
self:AddBlock(val[1], val[2], val[3]);
end
end
function CactiPlugin:AddBlock(X, Y, Z)
local World = cRoot:Get():GetWorld();
local t = World:GetBlock(X, Y, Z);
if(t == E_BLOCK_CACTUS) then
Log("addblock adding");
table.insert(self.CactiBlocks, {X, Y, Z});
end
end
function CactiPlugin:OnBlockDig( PacketData, Player )
end
function CactiPlugin:Tick( DeltaTime )
if( self.NumTicks < 1 ) then -- Instant grow cactus for testing purposes
self.NumTicks = self.NumTicks + 1
return
end
local debug = true;
self.NumTicks = 0
local World = cRoot:Get():GetWorld()
local OldBlocks = self.CactiBlocks;
self.CactiBlocks = {};
for key,val in pairs(OldBlocks) do
local X = val[1]
local Y = val[2]
local Z = val[3]
local t = World:GetBlock(X, Y, Z);
Log("processing: " .. X .. "," .. Y .. "," .. Z .. " -- " .. t);
countValue = math.random(2,5)
Yvalue = Y-countValue
local down = World:GetBlock(X, Yvalue, Z);
local up = World:GetBlock(X, Y+1, Z);
if((IsCacti(down))) then
forkGrowth = math.random(0,7) -- probability of forking - this is a 1/3 chance.
if(forkGrowth<2) then
Log(" Forking growth");
if(forkGrowth==1) then
World:SetBlock(X-1, Y, Z, E_BLOCK_CACTUS, 8);
self:AddBlock(X-1, Y, Z);
World:SetBlock(X+1, Y, Z, E_BLOCK_CACTUS, 8);
self:AddBlock(X+1, Y, Z);
end
if(forkGrowth==0) then
World:SetBlock(X, Y, Z-1, E_BLOCK_CACTUS, 8);
self:AddBlock(X, Y, Z-1);
World:SetBlock(X, Y, Z+1, E_BLOCK_CACTUS, 8);
self:AddBlock(X, Y, Z+1);
end
end
Log(" stopping growth!");
else
Log(" up");
World:SetBlock(X, Y+1, Z, E_BLOCK_CACTUS, 8);
self:AddBlock(X, Y+1, Z);
end
end
end
Plugin = CactiPlugin:new()
cRoot:Get():GetPluginManager():AddPlugin( Plugin )
These are all automatically generated by the plugin with "forking" occuring 1/3 times, completely randomly, and cactus height also random.
The destruction implementation of cactus hasn't been done yet because I can't figure out the digging API, but feel free to inform me