Seperated BlockArea From World
If anyone can come up with a better name for the interface I'll change it, It contians to methods which do compleatly unrelated things
This commit is contained in:
parent
bd4278aca1
commit
9bb61e6e2e
@ -6,7 +6,6 @@
|
|||||||
|
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
#include "BlockArea.h"
|
#include "BlockArea.h"
|
||||||
#include "World.h"
|
|
||||||
#include "OSSupport/GZipFile.h"
|
#include "OSSupport/GZipFile.h"
|
||||||
#include "WorldStorage/FastNBT.h"
|
#include "WorldStorage/FastNBT.h"
|
||||||
#include "Blocks/BlockHandler.h"
|
#include "Blocks/BlockHandler.h"
|
||||||
@ -266,7 +265,7 @@ void cBlockArea::SetOrigin(int a_OriginX, int a_OriginY, int a_OriginZ)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cBlockArea::Read(cWorld * a_World, int a_MinBlockX, int a_MaxBlockX, int a_MinBlockY, int a_MaxBlockY, int a_MinBlockZ, int a_MaxBlockZ, int a_DataTypes)
|
bool cBlockArea::Read(cForEachChunkProvider * a_ForEachChunkProvider, int a_MinBlockX, int a_MaxBlockX, int a_MinBlockY, int a_MaxBlockY, int a_MinBlockZ, int a_MaxBlockZ, int a_DataTypes)
|
||||||
{
|
{
|
||||||
// Normalize the coords:
|
// Normalize the coords:
|
||||||
if (a_MinBlockX > a_MaxBlockX)
|
if (a_MinBlockX > a_MaxBlockX)
|
||||||
@ -327,7 +326,7 @@ bool cBlockArea::Read(cWorld * a_World, int a_MinBlockX, int a_MaxBlockX, int a_
|
|||||||
cChunkDef::AbsoluteToRelative(a_MaxBlockX, a_MaxBlockY, a_MaxBlockZ, MaxChunkX, MaxChunkZ);
|
cChunkDef::AbsoluteToRelative(a_MaxBlockX, a_MaxBlockY, a_MaxBlockZ, MaxChunkX, MaxChunkZ);
|
||||||
|
|
||||||
// Query block data:
|
// Query block data:
|
||||||
if (!a_World->ForEachChunkInRect(MinChunkX, MaxChunkX, MinChunkZ, MaxChunkZ, Reader))
|
if (!a_ForEachChunkProvider->ForEachChunkInRect(MinChunkX, MaxChunkX, MinChunkZ, MaxChunkZ, Reader))
|
||||||
{
|
{
|
||||||
Clear();
|
Clear();
|
||||||
return false;
|
return false;
|
||||||
@ -340,7 +339,7 @@ bool cBlockArea::Read(cWorld * a_World, int a_MinBlockX, int a_MaxBlockX, int a_
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cBlockArea::Write(cWorld * a_World, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes)
|
bool cBlockArea::Write(cForEachChunkProvider * a_ForEachChunkProvider, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes)
|
||||||
{
|
{
|
||||||
ASSERT((a_DataTypes & GetDataTypes()) == a_DataTypes); // Are you requesting only the data that I have?
|
ASSERT((a_DataTypes & GetDataTypes()) == a_DataTypes); // Are you requesting only the data that I have?
|
||||||
a_DataTypes = a_DataTypes & GetDataTypes(); // For release builds, silently cut off the datatypes that I don't have
|
a_DataTypes = a_DataTypes & GetDataTypes(); // For release builds, silently cut off the datatypes that I don't have
|
||||||
@ -357,7 +356,7 @@ bool cBlockArea::Write(cWorld * a_World, int a_MinBlockX, int a_MinBlockY, int a
|
|||||||
a_MinBlockY = cChunkDef::Height - m_SizeY;
|
a_MinBlockY = cChunkDef::Height - m_SizeY;
|
||||||
}
|
}
|
||||||
|
|
||||||
return a_World->WriteBlockArea(*this, a_MinBlockX, a_MinBlockY, a_MinBlockZ, a_DataTypes);
|
return a_ForEachChunkProvider->WriteBlockArea(*this, a_MinBlockX, a_MinBlockY, a_MinBlockZ, a_DataTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,13 +12,10 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "ForEachChunkProvider.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// fwd: World.h
|
|
||||||
class cWorld;
|
|
||||||
|
|
||||||
// fwd: FastNBT.h
|
// fwd: FastNBT.h
|
||||||
class cParsedNBT;
|
class cParsedNBT;
|
||||||
|
|
||||||
@ -68,13 +65,13 @@ public:
|
|||||||
void SetOrigin(int a_OriginX, int a_OriginY, int a_OriginZ);
|
void SetOrigin(int a_OriginX, int a_OriginY, int a_OriginZ);
|
||||||
|
|
||||||
/// Reads an area of blocks specified. Returns true if successful. All coords are inclusive.
|
/// Reads an area of blocks specified. Returns true if successful. All coords are inclusive.
|
||||||
bool Read(cWorld * a_World, int a_MinBlockX, int a_MaxBlockX, int a_MinBlockY, int a_MaxBlockY, int a_MinBlockZ, int a_MaxBlockZ, int a_DataTypes = baTypes | baMetas);
|
bool Read(cForEachChunkProvider * a_ForEachChunkProvider, int a_MinBlockX, int a_MaxBlockX, int a_MinBlockY, int a_MaxBlockY, int a_MinBlockZ, int a_MaxBlockZ, int a_DataTypes = baTypes | baMetas);
|
||||||
|
|
||||||
// TODO: Write() is not too good an interface: if it fails, there's no way to repeat only for the parts that didn't write
|
// TODO: Write() is not too good an interface: if it fails, there's no way to repeat only for the parts that didn't write
|
||||||
// A better way may be to return a list of cBlockAreas for each part that didn't succeed writing, so that the caller may try again
|
// A better way may be to return a list of cBlockAreas for each part that didn't succeed writing, so that the caller may try again
|
||||||
|
|
||||||
/// Writes the area back into cWorld at the coords specified. Returns true if successful in all chunks, false if only partially / not at all
|
/// Writes the area back into cWorld at the coords specified. Returns true if successful in all chunks, false if only partially / not at all
|
||||||
bool Write(cWorld * a_World, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes = baTypes | baMetas);
|
bool Write(cForEachChunkProvider * a_ForEachChunkProvider, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes = baTypes | baMetas);
|
||||||
|
|
||||||
/// Copies this object's contents into the specified BlockArea.
|
/// Copies this object's contents into the specified BlockArea.
|
||||||
void CopyTo(cBlockArea & a_Into) const;
|
void CopyTo(cBlockArea & a_Into) const;
|
||||||
|
10
src/ForEachChunkProvider.h
Normal file
10
src/ForEachChunkProvider.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
class cBlockArea;
|
||||||
|
|
||||||
|
class cForEachChunkProvider
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual bool ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback) = 0;
|
||||||
|
|
||||||
|
virtual bool WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes) = 0;
|
||||||
|
};
|
@ -59,7 +59,7 @@ typedef cItemCallback<cNoteEntity> cNoteBlockCallback;
|
|||||||
|
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
class cWorld
|
class cWorld : public cForEachChunkProvider
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -315,7 +315,7 @@ public:
|
|||||||
bool IsChunkLighted(int a_ChunkX, int a_ChunkZ);
|
bool IsChunkLighted(int a_ChunkX, int a_ChunkZ);
|
||||||
|
|
||||||
/// Calls the callback for each chunk in the coords specified (all cords are inclusive). Returns true if all chunks have been processed successfully
|
/// Calls the callback for each chunk in the coords specified (all cords are inclusive). Returns true if all chunks have been processed successfully
|
||||||
bool ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback);
|
virtual bool ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback);
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
@ -361,7 +361,7 @@ public:
|
|||||||
Prefer cBlockArea::Write() instead, this is the internal implementation; cBlockArea does error checking, too.
|
Prefer cBlockArea::Write() instead, this is the internal implementation; cBlockArea does error checking, too.
|
||||||
a_DataTypes is a bitmask of cBlockArea::baXXX constants ORed together.
|
a_DataTypes is a bitmask of cBlockArea::baXXX constants ORed together.
|
||||||
*/
|
*/
|
||||||
bool WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes);
|
virtual bool WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes);
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user