2013-11-13 08:50:47 -05:00
# pragma once
# ifndef _WIN32
# include "BlockID.h"
# else
enum ENUM_ITEM_ID ;
# endif
# define MAX_PLAYERS 65535
# include "Simulator/SimulatorManager.h"
# include "MersenneTwister.h"
# include "ChunkMap.h"
# include "WorldStorage/WorldStorage.h"
# include "Generating/ChunkGenerator.h"
# include "Vector3i.h"
# include "Vector3f.h"
# include "ChunkSender.h"
# include "Defines.h"
# include "LightingThread.h"
# include "Item.h"
# include "Mobs/Monster.h"
# include "Entities/ProjectileEntity.h"
2014-01-20 13:15:19 -05:00
# include "ForEachChunkProvider.h"
2014-01-19 07:20:57 -05:00
# include "Scoreboard.h"
2014-01-25 14:14:14 -05:00
# include "Blocks/WorldInterface.h"
2014-01-26 09:20:39 -05:00
# include "Blocks/BroadcastInterface.h"
2013-11-13 08:50:47 -05:00
class cFireSimulator ;
class cFluidSimulator ;
class cSandSimulator ;
2014-02-07 16:59:08 -05:00
class cRedstoneSimulator ;
2013-11-13 08:50:47 -05:00
class cItem ;
class cPlayer ;
class cClientHandle ;
class cEntity ;
class cBlockEntity ;
class cWorldGenerator ; // The generator that actually generates the chunks for a single world
class cChunkGenerator ; // The thread responsible for generating chunks
class cChestEntity ;
class cDispenserEntity ;
class cFurnaceEntity ;
2013-12-14 11:52:22 -05:00
class cNoteEntity ;
2013-11-13 08:50:47 -05:00
class cMobCensus ;
2014-02-15 17:16:44 -05:00
class cCompositeChat ;
2013-11-13 08:50:47 -05:00
typedef std : : list < cPlayer * > cPlayerList ;
2014-01-18 08:16:47 -05:00
typedef cItemCallback < cPlayer > cPlayerListCallback ;
typedef cItemCallback < cEntity > cEntityCallback ;
typedef cItemCallback < cChestEntity > cChestCallback ;
typedef cItemCallback < cDispenserEntity > cDispenserCallback ;
typedef cItemCallback < cFurnaceEntity > cFurnaceCallback ;
typedef cItemCallback < cNoteEntity > cNoteBlockCallback ;
typedef cItemCallback < cCommandBlockEntity > cCommandBlockCallback ;
2013-11-13 08:50:47 -05:00
// tolua_begin
2014-01-26 09:20:39 -05:00
class cWorld : public cForEachChunkProvider , public cWorldInterface , public cBroadcastInterface
2013-11-13 08:50:47 -05:00
{
public :
// tolua_end
2014-01-19 17:49:19 -05:00
/** A simple RAII locker for the chunkmap - locks the chunkmap in its constructor, unlocks it in the destructor */
2013-11-13 08:50:47 -05:00
class cLock :
public cCSLock
{
typedef cCSLock super ;
public :
cLock ( cWorld & a_World ) ;
} ;
2014-01-19 17:49:19 -05:00
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** A common ancestor for all tasks queued onto the tick thread */
2013-11-13 08:50:47 -05:00
class cTask
{
public :
2013-12-22 09:55:24 -05:00
virtual ~ cTask ( ) { } ;
2013-11-13 08:50:47 -05:00
virtual void Run ( cWorld & a_World ) = 0 ;
} ;
typedef std : : vector < cTask * > cTasks ;
2014-01-19 17:49:19 -05:00
2013-11-13 08:50:47 -05:00
class cTaskSaveAllChunks :
public cTask
{
protected :
// cTask overrides:
virtual void Run ( cWorld & a_World ) override ;
} ;
2014-02-10 20:00:07 -05:00
class cTaskUnloadUnusedChunks :
public cTask
{
protected :
// cTask overrides:
virtual void Run ( cWorld & a_World ) override ;
} ;
2013-11-13 08:50:47 -05:00
static const char * GetClassStatic ( void ) // Needed for ManualBindings's ForEach templates
{
return " cWorld " ;
}
// tolua_begin
int GetTicksUntilWeatherChange ( void ) const { return m_WeatherInterval ; }
2014-01-26 09:20:39 -05:00
virtual Int64 GetWorldAge ( void ) const { return m_WorldAge ; }
2014-01-25 14:14:14 -05:00
virtual Int64 GetTimeOfDay ( void ) const { return m_TimeOfDay ; }
2013-11-13 08:50:47 -05:00
void SetTicksUntilWeatherChange ( int a_WeatherInterval )
{
m_WeatherInterval = a_WeatherInterval ;
}
void SetTimeOfDay ( Int64 a_TimeOfDay )
{
m_TimeOfDay = a_TimeOfDay ;
m_TimeOfDaySecs = ( double ) a_TimeOfDay / 20.0 ;
BroadcastTimeUpdate ( ) ;
}
2014-01-19 17:49:19 -05:00
/** Returns the current game mode. Partly OBSOLETE, you should use IsGameModeXXX() functions wherever applicable */
2013-11-13 08:50:47 -05:00
eGameMode GetGameMode ( void ) const { return m_GameMode ; }
2014-01-19 17:49:19 -05:00
/** Returns true if the world is in Creative mode */
2013-11-13 08:50:47 -05:00
bool IsGameModeCreative ( void ) const { return ( m_GameMode = = gmCreative ) ; }
2014-01-19 17:49:19 -05:00
/** Returns true if the world is in Survival mode */
2013-11-13 08:50:47 -05:00
bool IsGameModeSurvival ( void ) const { return ( m_GameMode = = gmSurvival ) ; }
2014-01-19 17:49:19 -05:00
/** Returns true if the world is in Adventure mode */
2013-11-13 08:50:47 -05:00
bool IsGameModeAdventure ( void ) const { return ( m_GameMode = = gmAdventure ) ; }
bool IsPVPEnabled ( void ) const { return m_bEnabledPVP ; }
bool IsDeepSnowEnabled ( void ) const { return m_IsDeepSnowEnabled ; }
2013-12-04 13:48:42 -05:00
bool ShouldLavaSpawnFire ( void ) const { return m_ShouldLavaSpawnFire ; }
2014-01-27 16:02:19 -05:00
bool VillagersShouldHarvestCrops ( void ) const { return m_VillagersShouldHarvestCrops ; }
2014-01-25 14:14:14 -05:00
virtual eDimension GetDimension ( void ) const { return m_Dimension ; }
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** Returns the world height at the specified coords; waits for the chunk to get loaded / generated */
2013-11-13 08:50:47 -05:00
int GetHeight ( int a_BlockX , int a_BlockZ ) ;
// tolua_end
2014-01-19 17:49:19 -05:00
/** Retrieves the world height at the specified coords; returns false if chunk not loaded / generated */
2013-11-13 08:50:47 -05:00
bool TryGetHeight ( int a_BlockX , int a_BlockZ , int & a_Height ) ; // Exported in ManualBindings.cpp
// Broadcast respective packets to all clients of the chunk where the event is taking place
// (Please keep these alpha-sorted)
void BroadcastAttachEntity ( const cEntity & a_Entity , const cEntity * a_Vehicle ) ;
2014-01-06 10:01:20 -05:00
void BroadcastBlockAction ( int a_BlockX , int a_BlockY , int a_BlockZ , char a_Byte1 , char a_Byte2 , BLOCKTYPE a_BlockType , const cClientHandle * a_Exclude = NULL ) ; // tolua_export
2013-11-13 08:50:47 -05:00
void BroadcastBlockBreakAnimation ( int a_EntityID , int a_BlockX , int a_BlockY , int a_BlockZ , char a_Stage , const cClientHandle * a_Exclude = NULL ) ;
void BroadcastBlockEntity ( int a_BlockX , int a_BlockY , int a_BlockZ , const cClientHandle * a_Exclude = NULL ) ; ///< If there is a block entity at the specified coods, sends it to all clients except a_Exclude
2014-02-05 18:24:02 -05:00
2014-02-07 13:58:52 -05:00
// tolua_begin
2014-02-15 17:26:19 -05:00
void BroadcastChat ( const AString & a_Message , const cClientHandle * a_Exclude = NULL , eMessageType a_ChatPrefix = mtCustom ) ;
void BroadcastChatInfo ( const AString & a_Message , const cClientHandle * a_Exclude = NULL ) { BroadcastChat ( a_Message , a_Exclude , mtInformation ) ; }
void BroadcastChatFailure ( const AString & a_Message , const cClientHandle * a_Exclude = NULL ) { BroadcastChat ( a_Message , a_Exclude , mtFailure ) ; }
void BroadcastChatSuccess ( const AString & a_Message , const cClientHandle * a_Exclude = NULL ) { BroadcastChat ( a_Message , a_Exclude , mtSuccess ) ; }
void BroadcastChatWarning ( const AString & a_Message , const cClientHandle * a_Exclude = NULL ) { BroadcastChat ( a_Message , a_Exclude , mtWarning ) ; }
void BroadcastChatFatal ( const AString & a_Message , const cClientHandle * a_Exclude = NULL ) { BroadcastChat ( a_Message , a_Exclude , mtFailure ) ; }
void BroadcastChatDeath ( const AString & a_Message , const cClientHandle * a_Exclude = NULL ) { BroadcastChat ( a_Message , a_Exclude , mtDeath ) ; }
2014-02-15 17:16:44 -05:00
void BroadcastChat ( const cCompositeChat & a_Message , const cClientHandle * a_Exclude = NULL ) ;
2014-02-05 18:24:02 -05:00
// tolua_end
2013-11-13 08:50:47 -05:00
void BroadcastChunkData ( int a_ChunkX , int a_ChunkZ , cChunkDataSerializer & a_Serializer , const cClientHandle * a_Exclude = NULL ) ;
void BroadcastCollectPickup ( const cPickup & a_Pickup , const cPlayer & a_Player , const cClientHandle * a_Exclude = NULL ) ;
void BroadcastDestroyEntity ( const cEntity & a_Entity , const cClientHandle * a_Exclude = NULL ) ;
2013-12-15 04:51:46 -05:00
void BroadcastEntityEffect ( const cEntity & a_Entity , int a_EffectID , int a_Amplifier , short a_Duration , const cClientHandle * a_Exclude = NULL ) ;
2013-11-13 08:50:47 -05:00
void BroadcastEntityEquipment ( const cEntity & a_Entity , short a_SlotNum , const cItem & a_Item , const cClientHandle * a_Exclude = NULL ) ;
void BroadcastEntityHeadLook ( const cEntity & a_Entity , const cClientHandle * a_Exclude = NULL ) ;
void BroadcastEntityLook ( const cEntity & a_Entity , const cClientHandle * a_Exclude = NULL ) ;
void BroadcastEntityMetadata ( const cEntity & a_Entity , const cClientHandle * a_Exclude = NULL ) ;
void BroadcastEntityRelMove ( const cEntity & a_Entity , char a_RelX , char a_RelY , char a_RelZ , const cClientHandle * a_Exclude = NULL ) ;
void BroadcastEntityRelMoveLook ( const cEntity & a_Entity , char a_RelX , char a_RelY , char a_RelZ , const cClientHandle * a_Exclude = NULL ) ;
void BroadcastEntityStatus ( const cEntity & a_Entity , char a_Status , const cClientHandle * a_Exclude = NULL ) ;
void BroadcastEntityVelocity ( const cEntity & a_Entity , const cClientHandle * a_Exclude = NULL ) ;
2013-12-06 18:47:07 -05:00
void BroadcastEntityAnimation ( const cEntity & a_Entity , char a_Animation , const cClientHandle * a_Exclude = NULL ) ;
2014-02-15 05:38:20 -05:00
void BroadcastParticleEffect ( const AString & a_ParticleName , float a_SrcX , float a_SrcY , float a_SrcZ , float a_OffsetX , float a_OffsetY , float a_OffsetZ , float a_ParticleData , int a_ParticleAmmount , cClientHandle * a_Exclude = NULL ) ; // tolua_export
2013-11-13 08:50:47 -05:00
void BroadcastPlayerListItem ( const cPlayer & a_Player , bool a_IsOnline , const cClientHandle * a_Exclude = NULL ) ;
2013-12-15 04:51:46 -05:00
void BroadcastRemoveEntityEffect ( const cEntity & a_Entity , int a_EffectID , const cClientHandle * a_Exclude = NULL ) ;
2014-01-21 08:58:17 -05:00
void BroadcastScoreboardObjective ( const AString & a_Name , const AString & a_DisplayName , Byte a_Mode ) ;
void BroadcastScoreUpdate ( const AString & a_Objective , const AString & a_Player , cObjective : : Score a_Score , Byte a_Mode ) ;
void BroadcastDisplayObjective ( const AString & a_Objective , cScoreboard : : eDisplaySlot a_Display ) ;
2013-11-13 08:50:47 -05:00
void BroadcastSoundEffect ( const AString & a_SoundName , int a_SrcX , int a_SrcY , int a_SrcZ , float a_Volume , float a_Pitch , const cClientHandle * a_Exclude = NULL ) ; // tolua_export a_Src coords are Block * 8
void BroadcastSoundParticleEffect ( int a_EffectID , int a_SrcX , int a_SrcY , int a_SrcZ , int a_Data , const cClientHandle * a_Exclude = NULL ) ; // tolua_export
void BroadcastSpawnEntity ( cEntity & a_Entity , const cClientHandle * a_Exclude = NULL ) ;
void BroadcastTeleportEntity ( const cEntity & a_Entity , const cClientHandle * a_Exclude = NULL ) ;
void BroadcastThunderbolt ( int a_BlockX , int a_BlockY , int a_BlockZ , const cClientHandle * a_Exclude = NULL ) ;
void BroadcastTimeUpdate ( const cClientHandle * a_Exclude = NULL ) ;
2014-01-25 14:14:14 -05:00
virtual void BroadcastUseBed ( const cEntity & a_Entity , int a_BlockX , int a_BlockY , int a_BlockZ ) ;
2013-11-13 08:50:47 -05:00
void BroadcastWeather ( eWeather a_Weather , const cClientHandle * a_Exclude = NULL ) ;
2014-02-01 08:06:32 -05:00
virtual cBroadcastInterface & GetBroadcastManager ( )
2014-01-26 09:20:39 -05:00
{
2014-02-01 08:06:32 -05:00
return * this ;
2014-01-26 09:20:39 -05:00
}
2014-01-19 17:49:19 -05:00
/** If there is a block entity at the specified coords, sends it to the client specified */
2013-11-13 08:50:47 -05:00
void SendBlockEntity ( int a_BlockX , int a_BlockY , int a_BlockZ , cClientHandle & a_Client ) ;
void MarkChunkDirty ( int a_ChunkX , int a_ChunkZ ) ;
void MarkChunkSaving ( int a_ChunkX , int a_ChunkZ ) ;
void MarkChunkSaved ( int a_ChunkX , int a_ChunkZ ) ;
/** Sets the chunk data as either loaded from the storage or generated.
a_BlockLight and a_BlockSkyLight are optional , if not present , chunk will be marked as unlighted .
a_BiomeMap is optional , if not present , biomes will be calculated by the generator
a_HeightMap is optional , if not present , will be calculated .
If a_MarkDirty is set , the chunk is set as dirty ( used after generating )
*/
void SetChunkData (
int a_ChunkX , int a_ChunkZ ,
const BLOCKTYPE * a_BlockTypes ,
const NIBBLETYPE * a_BlockMeta ,
const NIBBLETYPE * a_BlockLight ,
const NIBBLETYPE * a_BlockSkyLight ,
const cChunkDef : : HeightMap * a_HeightMap ,
const cChunkDef : : BiomeMap * a_BiomeMap ,
cEntityList & a_Entities ,
cBlockEntityList & a_BlockEntities ,
bool a_MarkDirty
) ;
void ChunkLighted (
int a_ChunkX , int a_ChunkZ ,
const cChunkDef : : BlockNibbles & a_BlockLight ,
const cChunkDef : : BlockNibbles & a_SkyLight
) ;
bool GetChunkData ( int a_ChunkX , int a_ChunkZ , cChunkDataCallback & a_Callback ) ;
2014-01-19 17:49:19 -05:00
/** Gets the chunk's blocks, only the block types */
2013-11-13 08:50:47 -05:00
bool GetChunkBlockTypes ( int a_ChunkX , int a_ChunkZ , BLOCKTYPE * a_BlockTypes ) ;
bool IsChunkValid ( int a_ChunkX , int a_ChunkZ ) const ;
bool HasChunkAnyClients ( int a_ChunkX , int a_ChunkZ ) const ;
2014-02-11 08:01:25 -05:00
/** Queues a task to unload unused chunks onto the tick thread. The prefferred way of unloading*/
2014-02-10 20:00:07 -05:00
void QueueUnloadUnusedChunks ( void ) ; // tolua_export
2013-11-13 08:50:47 -05:00
void CollectPickupsByPlayer ( cPlayer * a_Player ) ;
void AddPlayer ( cPlayer * a_Player ) ;
void RemovePlayer ( cPlayer * a_Player ) ;
2014-01-19 17:49:19 -05:00
/** Calls the callback for each player in the list; returns true if all players processed, false if the callback aborted by returning true */
bool ForEachPlayer ( cPlayerListCallback & a_Callback ) ; // >> EXPORTED IN MANUALBINDINGS <<
/** Calls the callback for the player of the given name; returns true if the player was found and the callback called, false if player not found. Callback return ignored */
bool DoWithPlayer ( const AString & a_PlayerName , cPlayerListCallback & a_Callback ) ; // >> EXPORTED IN MANUALBINDINGS <<
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** Finds a player from a partial or complete player name and calls the callback - case-insensitive */
2013-11-13 08:50:47 -05:00
bool FindAndDoWithPlayer ( const AString & a_PlayerNameHint , cPlayerListCallback & a_Callback ) ; // >> EXPORTED IN MANUALBINDINGS <<
// TODO: This interface is dangerous - rewrite to DoWithClosestPlayer(pos, sight, action)
2014-02-03 15:06:43 -05:00
cPlayer * FindClosestPlayer ( const Vector3d & a_Pos , float a_SightLimit , bool a_CheckLineOfSight = true ) ;
2013-11-13 08:50:47 -05:00
void SendPlayerList ( cPlayer * a_DestPlayer ) ; // Sends playerlist to the player
2014-01-19 17:49:19 -05:00
/** Adds the entity into its appropriate chunk; takes ownership of the entity ptr */
2013-11-13 08:50:47 -05:00
void AddEntity ( cEntity * a_Entity ) ;
bool HasEntity ( int a_UniqueID ) ;
2014-01-19 17:49:19 -05:00
/** Removes the entity, the entity ptr ownership is assumed taken by the caller */
2013-11-13 08:50:47 -05:00
void RemoveEntity ( cEntity * a_Entity ) ;
2014-01-19 17:49:19 -05:00
/** Calls the callback for each entity in the entire world; returns true if all entities processed, false if the callback aborted by returning true */
2013-11-13 08:50:47 -05:00
bool ForEachEntity ( cEntityCallback & a_Callback ) ; // Exported in ManualBindings.cpp
2014-01-19 17:49:19 -05:00
/** Calls the callback for each entity in the specified chunk; returns true if all entities processed, false if the callback aborted by returning true */
2013-11-13 08:50:47 -05:00
bool ForEachEntityInChunk ( int a_ChunkX , int a_ChunkZ , cEntityCallback & a_Callback ) ; // Exported in ManualBindings.cpp
2014-01-19 17:49:19 -05:00
/** Calls the callback if the entity with the specified ID is found, with the entity object as the callback param. Returns true if entity found and callback returned false. */
2013-11-13 08:50:47 -05:00
bool DoWithEntityByID ( int a_UniqueID , cEntityCallback & a_Callback ) ; // Exported in ManualBindings.cpp
2014-01-19 17:49:19 -05:00
/** Compares clients of two chunks, calls the callback accordingly */
2013-11-13 08:50:47 -05:00
void CompareChunkClients ( int a_ChunkX1 , int a_ChunkZ1 , int a_ChunkX2 , int a_ChunkZ2 , cClientDiffCallback & a_Callback ) ;
2014-01-19 17:49:19 -05:00
/** Adds client to a chunk, if not already present; returns true if added, false if present */
2013-11-13 08:50:47 -05:00
bool AddChunkClient ( int a_ChunkX , int a_ChunkZ , cClientHandle * a_Client ) ;
2014-01-19 17:49:19 -05:00
/** Removes client from the chunk specified */
2013-11-13 08:50:47 -05:00
void RemoveChunkClient ( int a_ChunkX , int a_ChunkZ , cClientHandle * a_Client ) ;
2014-01-19 17:49:19 -05:00
/** Removes the client from all chunks it is present in */
2013-11-13 08:50:47 -05:00
void RemoveClientFromChunks ( cClientHandle * a_Client ) ;
2014-01-19 17:49:19 -05:00
/** Sends the chunk to the client specified, if the chunk is valid. If not valid, the request is postponed (ChunkSender will send that chunk when it becomes valid+lighted) */
2013-11-13 08:50:47 -05:00
void SendChunkTo ( int a_ChunkX , int a_ChunkZ , cClientHandle * a_Client ) ;
2014-01-19 17:49:19 -05:00
/** Removes client from ChunkSender's queue of chunks to be sent */
2013-11-13 08:50:47 -05:00
void RemoveClientFromChunkSender ( cClientHandle * a_Client ) ;
2014-01-19 17:49:19 -05:00
/** Touches the chunk, causing it to be loaded or generated */
2013-11-13 08:50:47 -05:00
void TouchChunk ( int a_ChunkX , int a_ChunkY , int a_ChunkZ ) ;
2014-01-19 17:49:19 -05:00
/** Loads the chunk, if not already loaded. Doesn't generate. Returns true if chunk valid (even if already loaded before) */
2013-11-13 08:50:47 -05:00
bool LoadChunk ( int a_ChunkX , int a_ChunkY , int a_ChunkZ ) ;
2014-01-19 17:49:19 -05:00
/** Loads the chunks specified. Doesn't report failure, other than chunks being !IsValid() */
2013-11-13 08:50:47 -05:00
void LoadChunks ( const cChunkCoordsList & a_Chunks ) ;
2014-01-19 17:49:19 -05:00
/** Marks the chunk as failed-to-load: */
2013-11-13 08:50:47 -05:00
void ChunkLoadFailed ( int a_ChunkX , int a_ChunkY , int a_ChunkZ ) ;
2014-01-19 17:49:19 -05:00
/** Sets the sign text, asking plugins for permission first. a_Player is the player who this change belongs to, may be NULL. Returns true if sign text changed. Same as UpdateSign() */
2013-11-13 08:50:47 -05:00
bool SetSignLines ( int a_BlockX , int a_BlockY , int a_BlockZ , const AString & a_Line1 , const AString & a_Line2 , const AString & a_Line3 , const AString & a_Line4 , cPlayer * a_Player = NULL ) ; // Exported in ManualBindings.cpp
2014-01-19 17:49:19 -05:00
/** Sets the sign text, asking plugins for permission first. a_Player is the player who this change belongs to, may be NULL. Returns true if sign text changed. Same as SetSignLines() */
2013-11-13 08:50:47 -05:00
bool UpdateSign ( int a_X , int a_Y , int a_Z , const AString & a_Line1 , const AString & a_Line2 , const AString & a_Line3 , const AString & a_Line4 , cPlayer * a_Player = NULL ) ; // Exported in ManualBindings.cpp
2014-01-23 07:57:04 -05:00
/** Sets the command block command. Returns true if command changed. */
bool SetCommandBlockCommand ( int a_BlockX , int a_BlockY , int a_BlockZ , const AString & a_Command ) ; // tolua_export
2014-01-19 17:49:19 -05:00
/** Regenerate the given chunk: */
2013-11-13 08:50:47 -05:00
void RegenerateChunk ( int a_ChunkX , int a_ChunkZ ) ; // tolua_export
2014-01-19 17:49:19 -05:00
/** Generates the given chunk, if not already generated */
2013-11-13 08:50:47 -05:00
void GenerateChunk ( int a_ChunkX , int a_ChunkZ ) ; // tolua_export
2014-01-19 17:49:19 -05:00
/** Queues a chunk for lighting; a_Callback is called after the chunk is lighted */
2013-11-13 08:50:47 -05:00
void QueueLightChunk ( int a_ChunkX , int a_ChunkZ , cChunkCoordCallback * a_Callback = NULL ) ;
bool IsChunkLighted ( int a_ChunkX , int a_ChunkZ ) ;
2014-01-19 17:49:19 -05:00
/** Calls the callback for each chunk in the coords specified (all cords are inclusive). Returns true if all chunks have been processed successfully */
2014-01-20 12:17:24 -05:00
virtual bool ForEachChunkInRect ( int a_MinChunkX , int a_MaxChunkX , int a_MinChunkZ , int a_MaxChunkZ , cChunkDataCallback & a_Callback ) ;
2013-11-13 08:50:47 -05:00
// tolua_begin
/** Sets the block at the specified coords to the specified value.
Full processing , incl . updating neighbors , is performed .
*/
void SetBlock ( int a_BlockX , int a_BlockY , int a_BlockZ , BLOCKTYPE a_BlockType , NIBBLETYPE a_BlockMeta ) ;
/** Sets the block at the specified coords to the specified value.
The replacement doesn ' t trigger block updates .
The replaced blocks aren ' t checked for block entities ( block entity is leaked if it exists at this block )
*/
2014-01-26 09:20:39 -05:00
void FastSetBlock ( int a_BlockX , int a_BlockY , int a_BlockZ , BLOCKTYPE a_BlockType , NIBBLETYPE a_BlockMeta )
{
m_ChunkMap - > FastSetBlock ( a_BlockX , a_BlockY , a_BlockZ , a_BlockType , a_BlockMeta ) ;
}
2013-11-13 08:50:47 -05:00
/** Queues a SetBlock() with the specified parameters after the specified number of ticks.
Calls SetBlock ( ) , so performs full processing of the replaced block .
*/
2014-01-26 09:20:39 -05:00
void QueueSetBlock ( int a_BlockX , int a_BlockY , int a_BlockZ , BLOCKTYPE a_BlockType , NIBBLETYPE a_BlockMeta , int a_TickDelay , BLOCKTYPE a_PreviousBlockType = E_BLOCK_AIR )
{
m_ChunkMap - > QueueSetBlock ( a_BlockX , a_BlockY , a_BlockZ , a_BlockType , a_BlockMeta , GetWorldAge ( ) + a_TickDelay , a_PreviousBlockType ) ;
}
BLOCKTYPE GetBlock ( int a_BlockX , int a_BlockY , int a_BlockZ )
{
return m_ChunkMap - > GetBlock ( a_BlockX , a_BlockY , a_BlockZ ) ;
}
2013-11-13 08:50:47 -05:00
2014-01-26 09:20:39 -05:00
NIBBLETYPE GetBlockMeta ( int a_BlockX , int a_BlockY , int a_BlockZ )
{
return m_ChunkMap - > GetBlockMeta ( a_BlockX , a_BlockY , a_BlockZ ) ;
}
2013-11-13 08:50:47 -05:00
void SetBlockMeta ( int a_BlockX , int a_BlockY , int a_BlockZ , NIBBLETYPE a_MetaData ) ;
NIBBLETYPE GetBlockSkyLight ( int a_BlockX , int a_BlockY , int a_BlockZ ) ;
NIBBLETYPE GetBlockBlockLight ( int a_BlockX , int a_BlockY , int a_BlockZ ) ;
// tolua_end
bool GetBlockTypeMeta ( int a_BlockX , int a_BlockY , int a_BlockZ , BLOCKTYPE & a_BlockType , NIBBLETYPE & a_BlockMeta ) ; // TODO: Exported in ManualBindings.cpp
bool GetBlockInfo ( int a_BlockX , int a_BlockY , int a_BlockZ , BLOCKTYPE & a_BlockType , NIBBLETYPE & a_Meta , NIBBLETYPE & a_SkyLight , NIBBLETYPE & a_BlockLight ) ; // TODO: Exported in ManualBindings.cpp
// TODO: NIBBLETYPE GetBlockActualLight(int a_BlockX, int a_BlockY, int a_BlockZ);
// tolua_begin
// Vector3i variants:
void FastSetBlock ( const Vector3i & a_Pos , BLOCKTYPE a_BlockType , NIBBLETYPE a_BlockMeta ) { FastSetBlock ( a_Pos . x , a_Pos . y , a_Pos . z , a_BlockType , a_BlockMeta ) ; }
BLOCKTYPE GetBlock ( const Vector3i & a_Pos ) { return GetBlock ( a_Pos . x , a_Pos . y , a_Pos . z ) ; }
NIBBLETYPE GetBlockMeta ( const Vector3i & a_Pos ) { return GetBlockMeta ( a_Pos . x , a_Pos . y , a_Pos . z ) ; }
void SetBlockMeta ( const Vector3i & a_Pos , NIBBLETYPE a_MetaData ) { SetBlockMeta ( a_Pos . x , a_Pos . y , a_Pos . z , a_MetaData ) ; }
// tolua_end
/** Writes the block area into the specified coords.
Returns true if all chunks have been processed .
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 .
*/
2014-01-20 12:17:24 -05:00
virtual bool WriteBlockArea ( cBlockArea & a_Area , int a_MinBlockX , int a_MinBlockY , int a_MinBlockZ , int a_DataTypes ) ;
2013-11-13 08:50:47 -05:00
// tolua_begin
2014-01-19 17:49:19 -05:00
/** Spawns item pickups for each item in the list. May compress pickups if too many entities: */
2014-01-26 09:20:39 -05:00
virtual void SpawnItemPickups ( const cItems & a_Pickups , double a_BlockX , double a_BlockY , double a_BlockZ , double a_FlyAwaySpeed = 1.0 , bool IsPlayerCreated = false ) ;
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** Spawns item pickups for each item in the list. May compress pickups if too many entities. All pickups get the speed specified: */
2014-01-26 09:20:39 -05:00
virtual void SpawnItemPickups ( const cItems & a_Pickups , double a_BlockX , double a_BlockY , double a_BlockZ , double a_SpeedX , double a_SpeedY , double a_SpeedZ , bool IsPlayerCreated = false ) ;
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** Spawns an falling block entity at the given position. It returns the UniqueID of the spawned falling block. */
2013-12-07 08:26:52 -05:00
int SpawnFallingBlock ( int a_X , int a_Y , int a_Z , BLOCKTYPE BlockType , NIBBLETYPE BlockMeta ) ;
2014-01-19 17:49:19 -05:00
/** Spawns an minecart at the given coordinates. */
2014-01-12 12:04:41 -05:00
int SpawnMinecart ( double a_X , double a_Y , double a_Z , int a_MinecartType , const cItem & a_Content = cItem ( ) , int a_BlockHeight = 1 ) ;
2014-01-12 08:33:32 -05:00
2014-01-19 17:49:19 -05:00
/** Spawns an experience orb at the given location with the given reward. It returns the UniqueID of the spawned experience orb. */
2013-11-26 09:37:15 -05:00
int SpawnExperienceOrb ( double a_X , double a_Y , double a_Z , int a_Reward ) ;
2013-11-25 15:03:26 -05:00
2014-01-19 17:49:19 -05:00
/** Spawns a new primed TNT entity at the specified block coords and specified fuse duration. Initial velocity is given based on the relative coefficient provided */
2013-11-13 08:50:47 -05:00
void SpawnPrimedTNT ( double a_X , double a_Y , double a_Z , double a_FuseTimeInSec , double a_InitialVelocityCoeff = 1 ) ;
// tolua_end
2014-01-19 17:49:19 -05:00
/** Replaces world blocks with a_Blocks, if they are of type a_FilterBlockType */
2013-11-13 08:50:47 -05:00
void ReplaceBlocks ( const sSetBlockVector & a_Blocks , BLOCKTYPE a_FilterBlockType ) ;
2014-01-19 17:49:19 -05:00
/** Retrieves block types of the specified blocks. If a chunk is not loaded, doesn't modify the block. Returns true if all blocks were read. */
2013-11-13 08:50:47 -05:00
bool GetBlocks ( sSetBlockVector & a_Blocks , bool a_ContinueOnFailure ) ;
// tolua_begin
bool DigBlock ( int a_X , int a_Y , int a_Z ) ;
void SendBlockTo ( int a_X , int a_Y , int a_Z , cPlayer * a_Player ) ;
double GetSpawnX ( void ) const { return m_SpawnX ; }
double GetSpawnY ( void ) const { return m_SpawnY ; }
double GetSpawnZ ( void ) const { return m_SpawnZ ; }
2014-01-19 17:49:19 -05:00
/** Wakes up the simulators for the specified block */
2013-11-13 08:50:47 -05:00
void WakeUpSimulators ( int a_BlockX , int a_BlockY , int a_BlockZ ) ;
2014-01-19 17:49:19 -05:00
/** Wakes up the simulators for the specified area of blocks */
2013-11-13 08:50:47 -05:00
void WakeUpSimulatorsInArea ( int a_MinBlockX , int a_MaxBlockX , int a_MinBlockY , int a_MaxBlockY , int a_MinBlockZ , int a_MaxBlockZ ) ;
// tolua_end
inline cSimulatorManager * GetSimulatorManager ( void ) { return m_SimulatorManager ; }
inline cFluidSimulator * GetWaterSimulator ( void ) { return m_WaterSimulator ; }
inline cFluidSimulator * GetLavaSimulator ( void ) { return m_LavaSimulator ; }
2014-02-07 16:59:08 -05:00
inline cRedstoneSimulator * GetRedstoneSimulator ( void ) { return m_RedstoneSimulator ; }
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** Calls the callback for each block entity in the specified chunk; returns true if all block entities processed, false if the callback aborted by returning true */
2013-11-20 15:53:29 -05:00
bool ForEachBlockEntityInChunk ( int a_ChunkX , int a_ChunkZ , cBlockEntityCallback & a_Callback ) ; // Exported in ManualBindings.cpp
2014-01-19 17:49:19 -05:00
/** Calls the callback for each chest in the specified chunk; returns true if all chests processed, false if the callback aborted by returning true */
2013-11-20 15:53:29 -05:00
bool ForEachChestInChunk ( int a_ChunkX , int a_ChunkZ , cChestCallback & a_Callback ) ; // Exported in ManualBindings.cpp
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** Calls the callback for each dispenser in the specified chunk; returns true if all dispensers processed, false if the callback aborted by returning true */
2013-11-13 08:50:47 -05:00
bool ForEachDispenserInChunk ( int a_ChunkX , int a_ChunkZ , cDispenserCallback & a_Callback ) ;
2014-01-19 17:49:19 -05:00
/** Calls the callback for each dropper in the specified chunk; returns true if all droppers processed, false if the callback aborted by returning true */
2013-11-13 08:50:47 -05:00
bool ForEachDropperInChunk ( int a_ChunkX , int a_ChunkZ , cDropperCallback & a_Callback ) ;
2014-01-19 17:49:19 -05:00
/** Calls the callback for each dropspenser in the specified chunk; returns true if all dropspensers processed, false if the callback aborted by returning true */
2013-11-13 08:50:47 -05:00
bool ForEachDropSpenserInChunk ( int a_ChunkX , int a_ChunkZ , cDropSpenserCallback & a_Callback ) ;
2014-01-19 17:49:19 -05:00
/** Calls the callback for each furnace in the specified chunk; returns true if all furnaces processed, false if the callback aborted by returning true */
2013-11-13 08:50:47 -05:00
bool ForEachFurnaceInChunk ( int a_ChunkX , int a_ChunkZ , cFurnaceCallback & a_Callback ) ; // Exported in ManualBindings.cpp
/** Does an explosion with the specified strength at the specified coordinate
a_SourceData exact type depends on the a_Source :
| esOther | void * |
| esPrimedTNT | cTNTEntity * |
2013-12-23 16:36:22 -05:00
| esMonster | cMonster * |
2013-11-13 08:50:47 -05:00
| esBed | cVector3i * |
| esEnderCrystal | Vector3i * |
| esGhastFireball | cGhastFireball * |
| esWitherSkullBlack | TBD |
| esWitherSkullBlue | TBD |
| esWitherBirth | TBD |
| esPlugin | void * |
*/
2014-01-26 09:20:39 -05:00
virtual void DoExplosionAt ( double a_ExplosionSize , double a_BlockX , double a_BlockY , double a_BlockZ , bool a_CanCauseFire , eExplosionSource a_Source , void * a_SourceData ) ; // tolua_export
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** Calls the callback for the block entity at the specified coords; returns false if there's no block entity at those coords, true if found */
2013-11-20 15:53:29 -05:00
bool DoWithBlockEntityAt ( int a_BlockX , int a_BlockY , int a_BlockZ , cBlockEntityCallback & a_Callback ) ; // Exported in ManualBindings.cpp
2014-01-19 17:49:19 -05:00
/** Calls the callback for the chest at the specified coords; returns false if there's no chest at those coords, true if found */
2013-11-20 15:53:29 -05:00
bool DoWithChestAt ( int a_BlockX , int a_BlockY , int a_BlockZ , cChestCallback & a_Callback ) ; // Exported in ManualBindings.cpp
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** Calls the callback for the dispenser at the specified coords; returns false if there's no dispenser at those coords or callback returns true, returns true if found */
2013-11-13 08:50:47 -05:00
bool DoWithDispenserAt ( int a_BlockX , int a_BlockY , int a_BlockZ , cDispenserCallback & a_Callback ) ; // Exported in ManualBindings.cpp
2014-01-19 17:49:19 -05:00
/** Calls the callback for the dropper at the specified coords; returns false if there's no dropper at those coords or callback returns true, returns true if found */
2013-11-13 08:50:47 -05:00
bool DoWithDropperAt ( int a_BlockX , int a_BlockY , int a_BlockZ , cDropperCallback & a_Callback ) ; // Exported in ManualBindings.cpp
2014-01-19 17:49:19 -05:00
/** Calls the callback for the dropspenser at the specified coords; returns false if there's no dropspenser at those coords or callback returns true, returns true if found */
2013-11-13 08:50:47 -05:00
bool DoWithDropSpenserAt ( int a_BlockX , int a_BlockY , int a_BlockZ , cDropSpenserCallback & a_Callback ) ; // Exported in ManualBindings.cpp
2014-01-19 17:49:19 -05:00
/** Calls the callback for the furnace at the specified coords; returns false if there's no furnace at those coords or callback returns true, returns true if found */
2013-11-13 08:50:47 -05:00
bool DoWithFurnaceAt ( int a_BlockX , int a_BlockY , int a_BlockZ , cFurnaceCallback & a_Callback ) ; // Exported in ManualBindings.cpp
2013-12-14 11:52:22 -05:00
2014-01-19 17:49:19 -05:00
/** Calls the callback for the noteblock at the specified coords; returns false if there's no noteblock at those coords or callback returns true, returns true if found */
2013-12-14 11:52:22 -05:00
bool DoWithNoteBlockAt ( int a_BlockX , int a_BlockY , int a_BlockZ , cNoteBlockCallback & a_Callback ) ; // Exported in ManualBindings.cpp
2014-01-18 08:16:47 -05:00
2014-01-19 17:49:19 -05:00
/** Calls the callback for the command block at the specified coords; returns false if there's no command block at those coords or callback returns true, returns true if found */
2014-01-18 09:59:33 -05:00
bool DoWithCommandBlockAt ( int a_BlockX , int a_BlockY , int a_BlockZ , cCommandBlockCallback & a_Callback ) ; // Exported in ManualBindings.cpp
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** Retrieves the test on the sign at the specified coords; returns false if there's no sign at those coords, true if found */
2013-11-13 08:50:47 -05:00
bool GetSignLines ( int a_BlockX , int a_BlockY , int a_BlockZ , AString & a_Line1 , AString & a_Line2 , AString & a_Line3 , AString & a_Line4 ) ; // Exported in ManualBindings.cpp
2014-01-19 17:49:19 -05:00
/** a_Player is using block entity at [x, y, z], handle that: */
2013-11-13 08:50:47 -05:00
void UseBlockEntity ( cPlayer * a_Player , int a_BlockX , int a_BlockY , int a_BlockZ ) { m_ChunkMap - > UseBlockEntity ( a_Player , a_BlockX , a_BlockY , a_BlockZ ) ; } // tolua_export
2014-01-19 17:49:19 -05:00
/** Calls the callback for the chunk specified, with ChunkMapCS locked; returns false if the chunk doesn't exist, otherwise returns the same value as the callback */
2013-11-13 08:50:47 -05:00
bool DoWithChunk ( int a_ChunkX , int a_ChunkZ , cChunkCallback & a_Callback ) ;
void GrowTreeImage ( const sSetBlockVector & a_Blocks ) ;
// tolua_begin
2014-01-19 17:49:19 -05:00
/** Grows a tree at the specified coords, either from a sapling there, or based on the biome */
2013-11-13 08:50:47 -05:00
void GrowTree ( int a_BlockX , int a_BlockY , int a_BlockZ ) ;
2014-01-19 17:49:19 -05:00
/** Grows a tree at the specified coords, based on the sapling meta provided */
2013-11-13 08:50:47 -05:00
void GrowTreeFromSapling ( int a_BlockX , int a_BlockY , int a_BlockZ , NIBBLETYPE a_SaplingMeta ) ;
2014-01-19 17:49:19 -05:00
/** Grows a tree at the specified coords, based on the biome in the place */
2013-11-13 08:50:47 -05:00
void GrowTreeByBiome ( int a_BlockX , int a_BlockY , int a_BlockZ ) ;
2014-01-19 17:49:19 -05:00
/** Grows the plant at the specified block to its ripe stage (bonemeal used); returns false if the block is not growable. If a_IsBonemeal is true, block is not grown if not allowed in world.ini */
2013-11-13 08:50:47 -05:00
bool GrowRipePlant ( int a_BlockX , int a_BlockY , int a_BlockZ , bool a_IsByBonemeal = false ) ;
2014-01-19 17:49:19 -05:00
/** Grows a cactus present at the block specified by the amount of blocks specified, up to the max height specified in the config */
2013-11-13 08:50:47 -05:00
void GrowCactus ( int a_BlockX , int a_BlockY , int a_BlockZ , int a_NumBlocksToGrow ) ;
2014-01-19 17:49:19 -05:00
/** Grows a melon or a pumpkin next to the block specified (assumed to be the stem) */
2013-11-13 08:50:47 -05:00
void GrowMelonPumpkin ( int a_BlockX , int a_BlockY , int a_BlockZ , BLOCKTYPE a_BlockType ) ;
2014-01-19 17:49:19 -05:00
/** Grows a sugarcane present at the block specified by the amount of blocks specified, up to the max height specified in the config */
2013-11-13 08:50:47 -05:00
void GrowSugarcane ( int a_BlockX , int a_BlockY , int a_BlockZ , int a_NumBlocksToGrow ) ;
2014-01-19 17:49:19 -05:00
/** Returns the biome at the specified coords. Reads the biome from the chunk, if loaded, otherwise uses the world generator to provide the biome value */
2014-02-03 15:26:17 -05:00
EMCSBiome GetBiomeAt ( int a_BlockX , int a_BlockZ ) ;
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** Returns the name of the world */
2013-11-13 08:50:47 -05:00
const AString & GetName ( void ) const { return m_WorldName ; }
2014-01-19 17:49:19 -05:00
/** Returns the name of the world.ini file used by this world */
2013-11-13 08:50:47 -05:00
const AString & GetIniFileName ( void ) const { return m_IniFileName ; }
2014-01-19 07:20:57 -05:00
2014-02-07 13:58:52 -05:00
/** Returns the associated scoreboard instance */
2014-01-21 08:58:17 -05:00
cScoreboard & GetScoreBoard ( void ) { return m_Scoreboard ; }
2014-01-23 07:57:04 -05:00
bool AreCommandBlocksEnabled ( void ) const { return m_bCommandBlocksEnabled ; }
void SetCommandBlocksEnabled ( bool a_Flag ) { m_bCommandBlocksEnabled = a_Flag ; }
2014-02-07 13:58:52 -05:00
bool ShouldUseChatPrefixes ( void ) const { return m_bUseChatPrefixes ; }
void SetShouldUseChatPrefixes ( bool a_Flag ) { m_bUseChatPrefixes = a_Flag ; }
2013-11-13 08:50:47 -05:00
// tolua_end
inline static void BlockToChunk ( int a_X , int a_Y , int a_Z , int & a_ChunkX , int & a_ChunkY , int & a_ChunkZ )
{
// TODO: Use floor() instead of weird if statements
// Also fix Y
( void ) a_Y ; // not unused anymore
a_ChunkX = a_X / cChunkDef : : Width ;
if ( a_X < 0 & & a_X % cChunkDef : : Width ! = 0 ) a_ChunkX - - ;
a_ChunkY = 0 ;
a_ChunkZ = a_Z / cChunkDef : : Width ;
if ( a_Z < 0 & & a_Z % cChunkDef : : Width ! = 0 ) a_ChunkZ - - ;
}
2014-01-19 17:49:19 -05:00
/** Saves all chunks immediately. Dangerous interface, may deadlock, use QueueSaveAllChunks() instead */
2013-11-13 08:50:47 -05:00
void SaveAllChunks ( void ) ;
2014-01-19 17:49:19 -05:00
/** Queues a task to save all chunks onto the tick thread. The prefferred way of saving chunks from external sources */
2013-11-13 08:50:47 -05:00
void QueueSaveAllChunks ( void ) ; // tolua_export
2014-01-19 17:49:19 -05:00
/** Queues a task onto the tick thread. The task object will be deleted once the task is finished */
2013-11-13 08:50:47 -05:00
void QueueTask ( cTask * a_Task ) ; // Exported in ManualBindings.cpp
2014-01-14 15:17:03 -05:00
2014-01-19 17:49:19 -05:00
/** Queues a task onto the tick thread, with the specified delay.
The task object will be deleted once the task is finished */
void ScheduleTask ( int a_DelayTicks , cTask * a_Task ) ;
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** Returns the number of chunks loaded */
2013-11-13 08:50:47 -05:00
int GetNumChunks ( ) const ; // tolua_export
2014-01-19 17:49:19 -05:00
/** Returns the number of chunks loaded and dirty, and in the lighting queue */
2013-11-13 08:50:47 -05:00
void GetChunkStats ( int & a_NumValid , int & a_NumDirty , int & a_NumInLightingQueue ) ;
// Various queues length queries (cannot be const, they lock their CS):
inline int GetGeneratorQueueLength ( void ) { return m_Generator . GetQueueLength ( ) ; } // tolua_export
inline int GetLightingQueueLength ( void ) { return m_Lighting . GetQueueLength ( ) ; } // tolua_export
inline int GetStorageLoadQueueLength ( void ) { return m_Storage . GetLoadQueueLength ( ) ; } // tolua_export
inline int GetStorageSaveQueueLength ( void ) { return m_Storage . GetSaveQueueLength ( ) ; } // tolua_export
void InitializeSpawn ( void ) ;
2014-01-19 17:49:19 -05:00
/** Starts threads that belong to this world */
2013-11-13 08:50:47 -05:00
void Start ( void ) ;
2014-01-19 17:49:19 -05:00
/** Stops threads that belong to this world (part of deinit) */
2013-11-13 08:50:47 -05:00
void Stop ( void ) ;
2014-01-19 17:49:19 -05:00
/** Processes the blocks queued for ticking with a delay (m_BlockTickQueue[]) */
2013-11-13 08:50:47 -05:00
void TickQueuedBlocks ( void ) ;
struct BlockTickQueueItem
{
int X ;
int Y ;
int Z ;
int TicksToWait ;
} ;
2014-01-19 17:49:19 -05:00
/** Queues the block to be ticked after the specified number of game ticks */
2013-11-13 08:50:47 -05:00
void QueueBlockForTick ( int a_BlockX , int a_BlockY , int a_BlockZ , int a_TicksToWait ) ; // tolua_export
// tolua_begin
2014-01-19 17:49:19 -05:00
/** Casts a thunderbolt at the specified coords */
2013-11-13 08:50:47 -05:00
void CastThunderbolt ( int a_BlockX , int a_BlockY , int a_BlockZ ) ;
2014-01-19 17:49:19 -05:00
/** Sets the specified weather; resets weather interval; asks and notifies plugins of the change */
2013-11-13 08:50:47 -05:00
void SetWeather ( eWeather a_NewWeather ) ;
2014-01-19 17:49:19 -05:00
/** Forces a weather change in the next game tick */
2013-11-13 08:50:47 -05:00
void ChangeWeather ( void ) ;
2014-01-19 17:49:19 -05:00
/** Returns the current weather. Instead of comparing values directly to the weather constants, use IsWeatherXXX() functions, if possible */
2013-11-13 08:50:47 -05:00
eWeather GetWeather ( void ) const { return m_Weather ; } ;
bool IsWeatherSunny ( void ) const { return ( m_Weather = = wSunny ) ; }
bool IsWeatherRain ( void ) const { return ( m_Weather = = wRain ) ; }
bool IsWeatherStorm ( void ) const { return ( m_Weather = = wStorm ) ; }
2014-01-19 17:49:19 -05:00
/** Returns true if the current weather has any precipitation - rain or storm */
2013-11-13 08:50:47 -05:00
bool IsWeatherWet ( void ) const { return ( m_Weather ! = wSunny ) ; }
// tolua_end
cChunkGenerator & GetGenerator ( void ) { return m_Generator ; }
cWorldStorage & GetStorage ( void ) { return m_Storage ; }
cChunkMap * GetChunkMap ( void ) { return m_ChunkMap ; }
2014-01-19 17:49:19 -05:00
/** Sets the blockticking to start at the specified block. Only one blocktick per chunk may be set, second call overwrites the first call */
2013-11-13 08:50:47 -05:00
void SetNextBlockTick ( int a_BlockX , int a_BlockY , int a_BlockZ ) ; // tolua_export
int GetMaxSugarcaneHeight ( void ) const { return m_MaxSugarcaneHeight ; } // tolua_export
int GetMaxCactusHeight ( void ) const { return m_MaxCactusHeight ; } // tolua_export
bool IsBlockDirectlyWatered ( int a_BlockX , int a_BlockY , int a_BlockZ ) ; // tolua_export
2014-01-19 17:49:19 -05:00
/** Spawns a mob of the specified type. Returns the mob's EntityID if recognized and spawned, <0 otherwise */
2014-01-31 18:17:41 -05:00
virtual int SpawnMob ( double a_PosX , double a_PosY , double a_PosZ , cMonster : : eType a_MonsterType ) ; // tolua_export
2013-11-13 08:50:47 -05:00
int SpawnMobFinalize ( cMonster * a_Monster ) ;
2014-01-19 17:49:19 -05:00
/** Creates a projectile of the specified type. Returns the projectile's EntityID if successful, <0 otherwise */
2013-11-13 08:50:47 -05:00
int CreateProjectile ( double a_PosX , double a_PosY , double a_PosZ , cProjectileEntity : : eKind a_Kind , cEntity * a_Creator , const Vector3d * a_Speed = NULL ) ; // tolua_export
2014-01-19 17:49:19 -05:00
/** Returns a random number from the m_TickRand in range [0 .. a_Range]. To be used only in the tick thread! */
2013-11-13 08:50:47 -05:00
int GetTickRandomNumber ( unsigned a_Range ) { return ( int ) ( m_TickRand . randInt ( a_Range ) ) ; }
2014-01-19 17:49:19 -05:00
/** Appends all usernames starting with a_Text (case-insensitive) into Results */
2013-11-13 08:50:47 -05:00
void TabCompleteUserName ( const AString & a_Text , AStringVector & a_Results ) ;
2014-01-19 17:49:19 -05:00
/** Get the current darkness level based on the time */
2013-11-13 08:50:47 -05:00
NIBBLETYPE GetSkyDarkness ( ) { return m_SkyDarkness ; }
private :
friend class cRoot ;
class cTickThread :
public cIsThread
{
typedef cIsThread super ;
public :
cTickThread ( cWorld & a_World ) ;
protected :
cWorld & m_World ;
// cIsThread overrides:
virtual void Execute ( void ) override ;
} ;
2014-01-10 16:22:54 -05:00
/** Implementation of the callbacks that the ChunkGenerator uses to store new chunks and interface to plugins */
class cChunkGeneratorCallbacks :
public cChunkGenerator : : cChunkSink ,
public cChunkGenerator : : cPluginInterface
{
cWorld * m_World ;
// cChunkSink overrides:
virtual void OnChunkGenerated ( cChunkDesc & a_ChunkDesc ) override ;
virtual bool IsChunkValid ( int a_ChunkX , int a_ChunkZ ) override ;
virtual bool HasChunkAnyClients ( int a_ChunkX , int a_ChunkZ ) override ;
// cPluginInterface overrides:
virtual void CallHookChunkGenerating ( cChunkDesc & a_ChunkDesc ) override ;
virtual void CallHookChunkGenerated ( cChunkDesc & a_ChunkDesc ) override ;
public :
cChunkGeneratorCallbacks ( cWorld & a_World ) ;
} ;
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** A container for tasks that have been scheduled for a specific game tick */
class cScheduledTask
{
public :
Int64 m_TargetTick ;
cTask * m_Task ;
/** Creates a new scheduled task; takes ownership of the task object passed to it. */
cScheduledTask ( Int64 a_TargetTick , cTask * a_Task ) :
m_TargetTick ( a_TargetTick ) ,
m_Task ( a_Task )
{
}
virtual ~ cScheduledTask ( )
{
delete m_Task ;
}
} ;
typedef std : : list < cScheduledTask * > cScheduledTasks ;
2013-11-13 08:50:47 -05:00
AString m_WorldName ;
AString m_IniFileName ;
2014-01-19 17:49:19 -05:00
/** Name of the storage schema used to load and save chunks */
2013-11-13 08:50:47 -05:00
AString m_StorageSchema ;
2014-01-17 14:01:14 -05:00
int m_StorageCompressionFactor ;
2014-01-19 17:49:19 -05:00
/** The dimension of the world, used by the client to provide correct lighting scheme */
2013-11-13 08:50:47 -05:00
eDimension m_Dimension ;
2014-01-19 17:49:19 -05:00
/** This random generator is to be used only in the Tick() method, and thus only in the World-Tick-thread (MTRand is not exactly thread-safe) */
2013-11-13 08:50:47 -05:00
MTRand m_TickRand ;
2013-12-20 13:10:07 -05:00
bool m_IsSpawnExplicitlySet ;
2013-11-13 08:50:47 -05:00
double m_SpawnX ;
double m_SpawnY ;
double m_SpawnZ ;
double m_WorldAgeSecs ; // World age, in seconds. Is only incremented, cannot be set by plugins.
double m_TimeOfDaySecs ; // Time of day in seconds. Can be adjusted. Is wrapped to zero each day.
Int64 m_WorldAge ; // World age in ticks, calculated off of m_WorldAgeSecs
Int64 m_TimeOfDay ; // Time in ticks, calculated off of m_TimeOfDaySecs
Int64 m_LastTimeUpdate ; // The tick in which the last time update has been sent.
Int64 m_LastUnload ; // The last WorldAge (in ticks) in which unloading was triggerred
Int64 m_LastSave ; // The last WorldAge (in ticks) in which save-all was triggerred
std : : map < cMonster : : eFamily , Int64 > m_LastSpawnMonster ; // The last WorldAge (in ticks) in which a monster was spawned (for each megatype of monster) // MG TODO : find a way to optimize without creating unmaintenability (if mob IDs are becoming unrowed)
NIBBLETYPE m_SkyDarkness ;
eGameMode m_GameMode ;
bool m_bEnabledPVP ;
bool m_IsDeepSnowEnabled ;
2013-12-04 13:48:42 -05:00
bool m_ShouldLavaSpawnFire ;
2014-01-27 16:02:19 -05:00
bool m_VillagersShouldHarvestCrops ;
2013-11-13 08:50:47 -05:00
std : : vector < BlockTickQueueItem * > m_BlockTickQueue ;
std : : vector < BlockTickQueueItem * > m_BlockTickQueueCopy ; // Second is for safely removing the objects from the queue
cSimulatorManager * m_SimulatorManager ;
cSandSimulator * m_SandSimulator ;
cFluidSimulator * m_WaterSimulator ;
cFluidSimulator * m_LavaSimulator ;
cFireSimulator * m_FireSimulator ;
2014-02-07 16:59:08 -05:00
cRedstoneSimulator * m_RedstoneSimulator ;
2013-11-13 08:50:47 -05:00
cCriticalSection m_CSPlayers ;
cPlayerList m_Players ;
cWorldStorage m_Storage ;
unsigned int m_MaxPlayers ;
cChunkMap * m_ChunkMap ;
bool m_bAnimals ;
std : : set < cMonster : : eType > m_AllowedMobs ;
eWeather m_Weather ;
int m_WeatherInterval ;
int m_MaxCactusHeight ;
int m_MaxSugarcaneHeight ;
bool m_IsCactusBonemealable ;
bool m_IsCarrotsBonemealable ;
bool m_IsCropsBonemealable ;
bool m_IsGrassBonemealable ;
bool m_IsMelonStemBonemealable ;
bool m_IsMelonBonemealable ;
bool m_IsPotatoesBonemealable ;
bool m_IsPumpkinStemBonemealable ;
bool m_IsPumpkinBonemealable ;
bool m_IsSaplingBonemealable ;
bool m_IsSugarcaneBonemealable ;
2014-02-07 13:58:52 -05:00
/** Whether command blocks are enabled or not */
2014-01-23 07:57:04 -05:00
bool m_bCommandBlocksEnabled ;
2014-02-11 05:56:29 -05:00
2014-02-07 13:58:52 -05:00
/** Whether prefixes such as [INFO] are prepended to SendMessageXXX() / BroadcastChatXXX() functions */
bool m_bUseChatPrefixes ;
2013-11-13 08:50:47 -05:00
cChunkGenerator m_Generator ;
2014-01-19 07:20:57 -05:00
cScoreboard m_Scoreboard ;
2013-11-13 08:50:47 -05:00
2014-01-10 16:22:54 -05:00
/** The callbacks that the ChunkGenerator uses to store new chunks and interface to plugins */
cChunkGeneratorCallbacks m_GeneratorCallbacks ;
2013-11-13 08:50:47 -05:00
cChunkSender m_ChunkSender ;
cLightingThread m_Lighting ;
cTickThread m_TickThread ;
2014-01-19 17:49:19 -05:00
/** Guards the m_Tasks */
2013-11-13 08:50:47 -05:00
cCriticalSection m_CSTasks ;
2014-01-19 17:49:19 -05:00
/** Tasks that have been queued onto the tick thread; guarded by m_CSTasks */
2013-11-13 08:50:47 -05:00
cTasks m_Tasks ;
2014-01-19 17:49:19 -05:00
/** Guards the m_ScheduledTasks */
cCriticalSection m_CSScheduledTasks ;
/** Tasks that have been queued to be executed on the tick thread at target tick in the future.
Ordered by increasing m_TargetTick .
Guarded by m_CSScheduledTasks */
cScheduledTasks m_ScheduledTasks ;
2014-01-14 15:17:03 -05:00
2014-01-19 17:49:19 -05:00
/** Guards m_Clients */
2013-11-13 08:50:47 -05:00
cCriticalSection m_CSClients ;
2014-01-19 17:49:19 -05:00
/** List of clients in this world, these will be ticked by this world */
2013-11-13 08:50:47 -05:00
cClientHandleList m_Clients ;
2014-01-19 17:49:19 -05:00
/** Clients that are scheduled for removal (ticked in another world), waiting for TickClients() to remove them */
2013-11-13 08:50:47 -05:00
cClientHandleList m_ClientsToRemove ;
2014-01-19 17:49:19 -05:00
/** Clients that are scheduled for adding, waiting for TickClients to add them */
2013-11-13 08:50:47 -05:00
cClientHandleList m_ClientsToAdd ;
cWorld ( const AString & a_WorldName ) ;
2014-02-11 05:56:29 -05:00
virtual ~ cWorld ( ) ;
2013-11-13 08:50:47 -05:00
2013-11-30 08:22:26 -05:00
void Tick ( float a_Dt , int a_LastTickDurationMSec ) ;
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** Handles the weather in each tick */
2013-11-13 08:50:47 -05:00
void TickWeather ( float a_Dt ) ;
2014-01-19 17:49:19 -05:00
/** Handles the mob spawning/moving/destroying each tick */
2013-11-13 08:50:47 -05:00
void TickMobs ( float a_Dt ) ;
2014-01-19 17:49:19 -05:00
/** Executes all tasks queued onto the tick thread */
2013-11-13 08:50:47 -05:00
void TickQueuedTasks ( void ) ;
2014-01-19 17:49:19 -05:00
/** Executes all tasks queued onto the tick thread */
2014-01-14 15:17:03 -05:00
void TickScheduledTasks ( void ) ;
2014-01-19 17:49:19 -05:00
/** Ticks all clients that are in this world */
2013-11-13 08:50:47 -05:00
void TickClients ( float a_Dt ) ;
2014-02-11 14:38:28 -05:00
/** Unloads all chunks immediately.*/
void UnloadUnusedChunks ( void ) ;
2013-11-26 16:54:40 -05:00
void UpdateSkyDarkness ( void ) ;
2014-01-19 17:49:19 -05:00
/** <summary>Generates a random spawnpoint on solid land by walking chunks and finding their biomes</summary> */
2013-11-26 16:54:40 -05:00
void GenerateRandomSpawn ( void ) ;
2013-11-13 08:50:47 -05:00
2014-01-19 17:49:19 -05:00
/** Creates a new fluid simulator, loads its settings from the inifile (a_FluidName section) */
2013-11-13 08:50:47 -05:00
cFluidSimulator * InitializeFluidSimulator ( cIniFile & a_IniFile , const char * a_FluidName , BLOCKTYPE a_SimulateBlock , BLOCKTYPE a_StationaryBlock ) ;
2014-02-07 16:13:55 -05:00
/** Creates a new redstone simulator.*/
2014-02-07 16:59:08 -05:00
cRedstoneSimulator * InitializeRedstoneSimulator ( cIniFile & a_IniFile ) ;
2013-11-13 08:50:47 -05:00
} ; // tolua_export