Hey - Tim - 02-23-2011
Hey, I love the server - great performance and sync compared to the official. Just have a question about water.. I gather it isn't generated by the server when the world is created, but the water plugin is supposed to compensate for this? However the water plugin just spits out loads of errors on my copy of the server saying about a deprecated function. Have you got any suggestions or remedies for this?
Thanks
RE: Hey - FakeTruth - 02-23-2011
Water IS generated, but I guess it's pretty rare... the generation algorithm definitely needs some modifying.
The water plugin simply makes water flow. The messages are not errors but warnings, because it does use deprecated functions like.. each tick
Here's the water plugin edited by me, to remove some logging and fixed deprecated warnings. This is NOT written by me, but by the awesome guy that goes by with the name ker on the Ae forum http://ae-c.net/viewtopic.php?f=14&t=261
Code: local WaterPlugin = {}
WaterPlugin.__index = WaterPlugin
function WaterPlugin:new()
local t = {}
setmetatable(t, WaterPlugin)
local w = Lua__cPlugin:new()
tolua.setpeer(w, t)
w:tolua__set_instance(w)
return w
end
function WaterPlugin:OnDisable()
--Log( Plugin:GetName() .. " v." .. Plugin:GetVersion() .. " is shutting down..." )
end
function WaterPlugin:Initialize()
self:SetName( "Water" )
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.WaterBlocks = {};
self.WaterBlocks = {};
--Log( "Initialized " .. self:GetName() .. " v." .. self:GetVersion() )
self.NumTicks = 0;
return true
end
function IsFreeForWater(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 WaterPlugin: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 )
--Log("water: " .. X .. "," .. Y .. "," .. Z .. " -- adding due to Place...");
self:AddSurroundings(X, Y, Z);
return false
end
function WaterPlugin:AddSurroundings(X, Y, Z)
local level_points = {
{X-1, Y, Z},
{X+1, Y, Z},
{X, Y, Z-1},
{X, Y, Z+1},
{X, Y+1, Z},
{X, Y-1, Z},
};
for key,val in pairs(level_points) do
self:AddBlock(val[1], val[2], val[3]);
end
end
function WaterPlugin:AddBlock(X, Y, Z)
local World = cRoot:Get():GetWorld();
local t = World:GetBlock(X, Y, Z);
if(t == E_BLOCK_WATER or t == E_BLOCK_STATIONARY_WATER) then
local found = false;
for key,val in pairs(self.WaterBlocks) do
if(val[1] == X and val[2] == Y and val[3] == Z) then
found = true;
--Log("addblock found");
break;
end
end
if(not found) then
--Log("addblock adding");
table.insert(self.WaterBlocks, {X, Y, Z});
end
end
end
function WaterPlugin:OnBlockDig( PacketData, Player )
local X = PacketData.m_PosX
local Y = PacketData.m_PosY
local Z = PacketData.m_PosZ
if(PacketData.m_Status == 3) then -- block broken
--Log("water: " .. X .. "," .. Y .. "," .. Z .. " -- adding due to dig... status is: " .. PacketData.m_Status);
self:AddSurroundings(X, Y, Z);
end
return false
end
function WaterPlugin:Tick( DeltaTime )
if( self.NumTicks < 5 ) then -- Only spread every 10 ticks, to make sure it doesnt happen too fast
self.NumTicks = self.NumTicks + 1
return
end
local debug = true;
self.NumTicks = 0
local World = cRoot:Get():GetWorld()
local OldBlocks = self.WaterBlocks;
self.WaterBlocks = {};
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);
if(t == E_BLOCK_WATER) then
local isFed = false;
local f = World:GetBlockMeta(X, Y, Z);
local f2 = f;
if(f == 8) then
local t2 = World:GetBlock(X, Y+1, Z);
if(t2 == E_BLOCK_WATER) then
isFed = true;
f = 0;
end
elseif(f == 0) then
isFed = true;
else
f2 = GetMaximumWaterAround(X, Y, Z);
if(f2 < f) then
isFed = true;
end
end
if(isFed) then
--Log(" isFed");
local down = World:GetBlock(X, Y-1, Z);
if(IsFreeForWater(down)) then
--Log(" down");
World:SetBlock(X, Y-1, Z, E_BLOCK_WATER, 8);
self:AddBlock(X, Y-1, Z);
else
--Log(" around");
if(f2+1 < f) then
World:SetBlock(X, Y, Z, E_BLOCK_WATER, f2+1);
self:AddBlock(X, Y, Z);
elseif(f < 7) then
--Log(" enough power");
local points = GetLowestPoints(X, Y, Z);
for k,v in pairs(points) do
local t2 = World:GetBlock(v[1], v[2], v[3]);
if(t2 ~= E_BLOCK_WATER) then
if(v[2] == Y) then
World:SetBlock(v[1], v[2], v[3], E_BLOCK_WATER, f+1);
else
World:SetBlock(v[1], v[2], v[3], E_BLOCK_WATER, 8);
end
self:AddBlock(v[1], v[2], v[3]);
else -- is water
local f3 = World:GetBlockMeta(v[1], v[2], v[3]);
if(f3 > f+1) then
self:AddBlock(v[1], v[2], v[3]);
end
end
end
end
end
else
--Log(" not isFed");
World:SetBlock(X, Y, Z, E_BLOCK_AIR, 0);
self:AddSurroundings(X, Y, Z);
end
else
--Log("changed before tick, not processing none-water");
end
end
end
function GetMaximumWaterAround(X, Y, Z)
local mx = 8;
local level_points = {
{X-1, Y, Z},
{X+1, Y, Z},
{X, Y, Z-1},
{X, Y, Z+1},
};
local World = cRoot:Get():GetWorld();
for key,val in pairs(level_points) do
local t = World:GetBlock(val[1], val[2], val[3]);
if(t == E_BLOCK_STATIONARY_WATER) then
mx = 0;
break;
elseif(t == E_BLOCK_WATER) then
local f = World:GetBlockMeta(val[1], val[2], val[3]);
if(f < mx) then
mx = f;
elseif(f == 8) then
mx = 0;
end
if(mx == 0) then
break;
end
end
end
return mx;
end
function GetLowestPoints(X, Y, Z)
local World = cWorld:GetWorld()
local t = World:GetBlock(X, Y-1, Z);
local points = {};
if(IsFreeForWater(t)) then
table.insert(points, {X, Y-1, Z});
return points;
end
local lower_points = {
{X-1, Y-1, Z},
{X+1, Y-1, Z},
{X, Y-1, Z-1},
{X, Y-1, Z+1},
};
local waterFound = false;
for key,val in pairs(lower_points) do
local t = World:GetBlock(val[1], val[2], val[3]);
local t2 = World:GetBlock(val[1], Y, val[3]);
if(IsFreeForWater(t) and IsFreeForWater(t2)) then
table.insert(points, val);
val[2] = Y;
table.insert(points, val);
elseif(t2 == E_BLOCK_WATER and (IsFreeForWater(t) or t == E_BLOCK_WATER)) then
waterFound = true;
end
end
if(#points == 0 and not waterFound) then
local level_points = {
{X-1, Y, Z},
{X+1, Y, Z},
{X, Y, Z-1},
{X, Y, Z+1},
};
for key,val in pairs(level_points) do
local t = World:GetBlock(val[1], val[2], val[3]);
if(IsFreeForWater(t) or t == E_BLOCK_WATER) then
table.insert(points, val);
end
end
end
return points;
end
Plugin = WaterPlugin:new()
cRoot:Get():GetPluginManager():AddPlugin( Plugin )
RE: Hey - Tim - 02-24-2011
Ah, okay thanks! would be cool to have more water- haven't found any yet but oh well not a big problem. Obviously I'm a big noob to scripting for it, do you think you could give me any pointers/help in the way of a script that would effectively 'glue' you to a block, my friend and and I wanted to make a script that would allow one of us to stick to the other ones magic carpet and fly without falling off.
Thanks
RE: Hey - FakeTruth - 02-24-2011
I think that should be possible by using the function
Code: cPlayer:TeleportTo( PosX, PosY, PosZ );
The only problem is that blocks don't actually 'move'.
You'll have to change the MagicCarpet plugin to do what you want it to do. First you should detect whether a player is standing on the carpet, and if so, keep teleporting the player to the right position on the carpet.
RE: Hey - Tim - 02-24-2011
Ah yeah that makes sense, i'll check that out. We've run in to a bit of an issue where blocks respawn after being destroyed but would i be correct in thinking this is due to server performance rather than the minecraft server?
RE: Hey - FakeTruth - 02-24-2011
Block re-spawn after destroying because Notch changed the network protocol a tiny bit, I have already fixed this I think I'll be releasing it today.
RE: Hey - Tim - 02-24-2011
Ahh okay, that would be awesome if you could. Thanks for answering all my questions so quick- think thats all the questions for now but I'm sure I'll have plenty more in the near future
RE: Hey - jmejamie - 02-24-2011
Hey, couldn't help but read the posts haha, just wondering what time zone you are in as i am in GMT + 0 and wanted to know if it was going to be released tonight?
thanks
RE: Hey - FakeTruth - 02-24-2011
Yeah, I'm GMT+1 (The Netherlands)
RE: Hey - jmejamie - 02-24-2011
so roughly what time is it going to be released tonight?
|