summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfaketruth <faketruth@0a769ca7-a7f5-676a-18bf-c427514a06d6>2012-09-30 18:37:44 +0200
committerfaketruth <faketruth@0a769ca7-a7f5-676a-18bf-c427514a06d6>2012-09-30 18:37:44 +0200
commitba2a9b6b2c1519563662a6a1147a82f96afb36dc (patch)
treef176e14fa7afa14a3e598350779bcb755b9d0339
parentFixed initial player head rotation when a player is being spawned on another client (diff)
downloadcuberite-ba2a9b6b2c1519563662a6a1147a82f96afb36dc.tar
cuberite-ba2a9b6b2c1519563662a6a1147a82f96afb36dc.tar.gz
cuberite-ba2a9b6b2c1519563662a6a1147a82f96afb36dc.tar.bz2
cuberite-ba2a9b6b2c1519563662a6a1147a82f96afb36dc.tar.lz
cuberite-ba2a9b6b2c1519563662a6a1147a82f96afb36dc.tar.xz
cuberite-ba2a9b6b2c1519563662a6a1147a82f96afb36dc.tar.zst
cuberite-ba2a9b6b2c1519563662a6a1147a82f96afb36dc.zip
-rw-r--r--Android/jni/app-android.cpp36
-rw-r--r--Android/src/com/mcserver/MCServerActivity.java3
-rw-r--r--VC2008/MCServer.vcproj8
-rw-r--r--source/ClientHandle.cpp8
-rw-r--r--source/ClientHandle.h1
-rw-r--r--source/Defines.h8
-rw-r--r--source/FallingBlock.cpp64
-rw-r--r--source/FallingBlock.h44
-rw-r--r--source/FireSimulator.cpp8
-rw-r--r--source/FireSimulator.h12
-rw-r--r--source/FluidSimulator.cpp8
-rw-r--r--source/FluidSimulator.h14
-rw-r--r--source/LavaSimulator.cpp2
-rw-r--r--source/LavaSimulator.h2
-rw-r--r--source/Protocol/Protocol.h1
-rw-r--r--source/Protocol/Protocol125.cpp25
-rw-r--r--source/Protocol/Protocol125.h1
-rw-r--r--source/Protocol/ProtocolRecognizer.cpp10
-rw-r--r--source/Protocol/ProtocolRecognizer.h1
-rw-r--r--source/RedstoneSimulator.h6
-rw-r--r--source/SandSimulator.cpp45
-rw-r--r--source/SandSimulator.h9
-rw-r--r--source/Simulator.h2
-rw-r--r--source/WaterSimulator.cpp2
-rw-r--r--source/WaterSimulator.h2
-rw-r--r--source/WebAdmin.h2
26 files changed, 254 insertions, 70 deletions
diff --git a/Android/jni/app-android.cpp b/Android/jni/app-android.cpp
index d90374225..0e288a2b2 100644
--- a/Android/jni/app-android.cpp
+++ b/Android/jni/app-android.cpp
@@ -15,9 +15,18 @@
#include "ToJava.h"
#include "Root.h"
+#include "WebAdmin.h"
#include <android/log.h>
+#ifdef _WIN32 // For IntelliSense parsing
+typedef void jobject;
+typedef int jint;
+typedef bool jboolean;
+typedef void JavaVM;
+typedef void JNIEnv;
+#endif
+
cCriticalSection g_CriticalSection;
JNIEnv* g_CurrentJNIEnv = 0;
@@ -61,7 +70,7 @@ cMainThread * pMainThread = NULL;
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
- __android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "JNI_OnLoad JNI_OnLoad JNI_OnLoad JNI_OnLoad");
+ //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "JNI_OnLoad JNI_OnLoad JNI_OnLoad JNI_OnLoad");
g_JavaVM = vm;
return JNI_VERSION_1_4;
}
@@ -72,20 +81,11 @@ extern "C" void Java_com_mcserver_MCServerActivity_NativeOnCreate( JNIEnv* env,
g_CriticalSection.Lock();
g_CurrentJNIEnv = env;
g_JavaThread = thiz;
- //if( !cLogger::GetSingletonPtr() ) new cLogger();
- __android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "Logging from C++!");
+ //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "Logging from C++!");
g_CriticalSection.Unlock();
-
- //CallJavaFunction_Void_Void(g_JavaActivity, "TestTest" );
- //CallJavaFunction_Void_String(g_JavaThread, "AddToLog", "herpderpderp!!" );
mkdir("/sdcard/mcserver", S_IRWXU | S_IRWXG | S_IRWXO);
-// __android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "Before mainthread");
-// pMainThread = new cMainThread();
-// pMainThread->Start();
-// __android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "AFter mainthread");
-
pRoot = new cRoot();
pRoot->Start();
delete pRoot; pRoot = NULL;
@@ -107,8 +107,6 @@ extern "C" void Java_com_mcserver_MCServerActivity_NativeCleanUp( JNIEnv* env,
{
pRoot->ServerCommand("stop");
}
-// pMainThread->Stop();
-// delete pMainThread; pMainThread = NULL;
}
@@ -117,4 +115,16 @@ extern "C" void Java_com_mcserver_MCServerActivity_NativeCleanUp( JNIEnv* env,
extern "C" jboolean Java_com_mcserver_MCServerActivity_NativeIsServerRunning( JNIEnv* env, jobject thiz )
{
return pRoot != NULL;
+}
+
+
+
+
+extern "C" jint Java_com_mcserver_MCServerActivity_NativeGetWebAdminPort( JNIEnv* env, jobject thiz )
+{
+ if( pRoot != NULL && pRoot->GetWebAdmin() != NULL )
+ {
+ return pRoot->GetWebAdmin()->GetPort();
+ }
+ return 0;
} \ No newline at end of file
diff --git a/Android/src/com/mcserver/MCServerActivity.java b/Android/src/com/mcserver/MCServerActivity.java
index 8d3507ca3..38b566250 100644
--- a/Android/src/com/mcserver/MCServerActivity.java
+++ b/Android/src/com/mcserver/MCServerActivity.java
@@ -59,7 +59,7 @@ public class MCServerActivity extends Activity {
((Button)findViewById(R.id.configure_server)).setOnClickListener( new View.OnClickListener() {
public void onClick(View v) {
- Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://localhost:8081/webadmin/"));
+ Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://localhost:" + NativeGetWebAdminPort() + "/webadmin/"));
startActivity( myIntent );
}
});
@@ -251,6 +251,7 @@ public class MCServerActivity extends Activity {
public native void NativeOnCreate();
public native void NativeCleanUp();
public native boolean NativeIsServerRunning();
+ public native int NativeGetWebAdminPort();
}
diff --git a/VC2008/MCServer.vcproj b/VC2008/MCServer.vcproj
index cb3ebf8f4..41e723f9a 100644
--- a/VC2008/MCServer.vcproj
+++ b/VC2008/MCServer.vcproj
@@ -907,6 +907,14 @@
>
</File>
<File
+ RelativePath="..\source\FallingBlock.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\source\FallingBlock.h"
+ >
+ </File>
+ <File
RelativePath="..\source\FurnaceEntity.cpp"
>
</File>
diff --git a/source/ClientHandle.cpp b/source/ClientHandle.cpp
index 8d2ea359d..8ac773d48 100644
--- a/source/ClientHandle.cpp
+++ b/source/ClientHandle.cpp
@@ -1483,6 +1483,14 @@ void cClientHandle::SendUseBed(const cEntity & a_Entity, int a_BlockX, int a_Blo
+void cClientHandle::SendSpawnObject(const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, short a_SpeedX, short a_SpeedY, short a_SpeedZ)
+{
+ m_Protocol->SendSpawnObject(a_Entity, a_ObjectType, a_ObjectData, a_SpeedX, a_SpeedY, a_SpeedZ);
+}
+
+
+
+
void cClientHandle::SendChunkData(int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer)
{
diff --git a/source/ClientHandle.h b/source/ClientHandle.h
index 94f132ea0..5469a5ca5 100644
--- a/source/ClientHandle.h
+++ b/source/ClientHandle.h
@@ -118,6 +118,7 @@ public:
void SendWindowClose (char a_WindowID);
void SendWindowOpen (char a_WindowID, char a_WindowType, const AString & a_WindowTitle, char a_NumSlots);
void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ );
+ void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, short a_SpeedX, short a_SpeedY, short a_SpeedZ);
const AString & GetUsername(void) const; //tolua_export
diff --git a/source/Defines.h b/source/Defines.h
index a5b70a1a5..8ad71475b 100644
--- a/source/Defines.h
+++ b/source/Defines.h
@@ -81,7 +81,7 @@ inline bool IsValidItem( int a_ItemID ) //tolua_export
-inline bool IsBlockWater(char a_BlockID)
+inline bool IsBlockWater(BLOCKTYPE a_BlockID)
{
return (a_BlockID == E_BLOCK_WATER || a_BlockID == E_BLOCK_STATIONARY_WATER);
}
@@ -90,18 +90,18 @@ inline bool IsBlockWater(char a_BlockID)
-inline bool IsBlockLava(char a_BlockID)
+inline bool IsBlockLava(BLOCKTYPE a_BlockID)
{
return (a_BlockID == E_BLOCK_LAVA || a_BlockID == E_BLOCK_STATIONARY_LAVA);
}
-inline bool IsBlockLiquid(char a_BlockID)
+inline bool IsBlockLiquid(BLOCKTYPE a_BlockID)
{
return IsBlockWater(a_BlockID) || IsBlockLava(a_BlockID);
}
-inline bool IsBlockTypeOfDirt(char a_BlockID)
+inline bool IsBlockTypeOfDirt(BLOCKTYPE a_BlockID)
{
switch (a_BlockID)
{
diff --git a/source/FallingBlock.cpp b/source/FallingBlock.cpp
new file mode 100644
index 000000000..1ed9cd5ed
--- /dev/null
+++ b/source/FallingBlock.cpp
@@ -0,0 +1,64 @@
+#include "Globals.h"
+
+#include "FallingBlock.h"
+#include "World.h"
+#include "ClientHandle.h"
+
+
+CLASS_DEFINITION( cFallingBlock, cEntity )
+
+
+cFallingBlock::cFallingBlock(const Vector3i & a_BlockPosition, BLOCKTYPE a_BlockType)
+ : super( a_BlockPosition.x + 0.5f, a_BlockPosition.y + 0.5f, a_BlockPosition.z + 0.5f )
+ , m_BlockType( a_BlockType )
+ , m_OriginalPosition( a_BlockPosition )
+ , m_SpeedY( 0 )
+{
+}
+
+
+
+
+
+cFallingBlock::~cFallingBlock()
+{
+}
+
+
+
+
+
+void cFallingBlock::Initialize(cWorld * a_World)
+{
+ super::Initialize( a_World );
+ a_World->BroadcastSpawn(*this);
+}
+
+
+
+
+
+void cFallingBlock::SpawnOn(cClientHandle & a_ClientHandle)
+{
+ a_ClientHandle.SendSpawnObject(*this, 70, m_BlockType, 0, 0, 0);
+}
+
+
+
+
+
+void cFallingBlock::Tick(float a_Dt)
+{
+ float MilliDt = a_Dt * 0.001f;
+ m_SpeedY -= MilliDt * 9.8f;
+ m_Pos.y += m_SpeedY * MilliDt;
+
+ //GetWorld()->BroadcastTeleportEntity(*this); // Testing position
+
+ Vector3i BlockPos( m_OriginalPosition.x, (int)(m_Pos.y-0.5), m_OriginalPosition.z );
+ if( !IsPassable( GetWorld()->GetBlock( BlockPos ) ) )
+ {
+ Destroy();
+ GetWorld()->SetBlock( BlockPos.x, BlockPos.y+1, BlockPos.z, m_BlockType, 0 );
+ }
+} \ No newline at end of file
diff --git a/source/FallingBlock.h b/source/FallingBlock.h
new file mode 100644
index 000000000..08e3302e1
--- /dev/null
+++ b/source/FallingBlock.h
@@ -0,0 +1,44 @@
+
+#pragma once
+
+#include "Entity.h"
+#include "Defines.h"
+
+
+
+
+class cPlayer;
+class cItem;
+
+
+
+
+
+
+class cFallingBlock : public cEntity
+{
+ typedef cEntity super;
+public:
+ CLASS_PROTOTYPE();
+
+ cFallingBlock(const Vector3i & a_BlockPosition, BLOCKTYPE a_BlockType);
+ ~cFallingBlock();
+
+ virtual void Initialize(cWorld * a_World) override;
+ virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
+ virtual void Tick(float a_Dt) override;
+private:
+ BLOCKTYPE m_BlockType;
+ Vector3i m_OriginalPosition;
+
+ float m_SpeedY;
+
+ static bool IsPassable( BLOCKTYPE a_BlockType )
+ {
+ return a_BlockType == E_BLOCK_AIR || IsBlockLiquid( a_BlockType );
+ }
+};
+
+
+
+
diff --git a/source/FireSimulator.cpp b/source/FireSimulator.cpp
index 9a08524ef..662c4f2d0 100644
--- a/source/FireSimulator.cpp
+++ b/source/FireSimulator.cpp
@@ -48,7 +48,7 @@ void cFireSimulator::Simulate( float a_Dt )
}
-bool cFireSimulator::IsAllowedBlock( char a_BlockID )
+bool cFireSimulator::IsAllowedBlock( BLOCKTYPE a_BlockID )
{
return a_BlockID == E_BLOCK_FIRE
|| IsBlockLava(a_BlockID);
@@ -78,12 +78,12 @@ void cFireSimulator::_AddBlock(int a_X, int a_Y, int a_Z)
}
-bool cFireSimulator::IsForeverBurnable( char a_BlockID )
+bool cFireSimulator::IsForeverBurnable( BLOCKTYPE a_BlockID )
{
return a_BlockID == E_BLOCK_BLOODSTONE;
}
-bool cFireSimulator::IsBurnable( char a_BlockID )
+bool cFireSimulator::IsBurnable( BLOCKTYPE a_BlockID )
{
return a_BlockID == E_BLOCK_PLANKS
|| a_BlockID == E_BLOCK_LEAVES
@@ -95,7 +95,7 @@ bool cFireSimulator::IsBurnable( char a_BlockID )
|| a_BlockID == E_BLOCK_VINES;
}
-bool cFireSimulator::FiresForever( char a_BlockID )
+bool cFireSimulator::FiresForever( BLOCKTYPE a_BlockID )
{
return a_BlockID != E_BLOCK_FIRE;
}
diff --git a/source/FireSimulator.h b/source/FireSimulator.h
index 863fa9835..f879585ab 100644
--- a/source/FireSimulator.h
+++ b/source/FireSimulator.h
@@ -21,16 +21,16 @@ public:
cFireSimulator( cWorld* a_World );
~cFireSimulator();
- virtual void Simulate( float a_Dt );
+ virtual void Simulate( float a_Dt ) override;
- virtual bool IsAllowedBlock( char a_BlockID );
+ virtual bool IsAllowedBlock( BLOCKTYPE a_BlockID ) override;
- virtual bool IsBurnable( char a_BlockID );
- virtual bool IsForeverBurnable( char a_BlockID );
- virtual bool FiresForever( char a_BlockID );
+ virtual bool IsBurnable( BLOCKTYPE a_BlockID );
+ virtual bool IsForeverBurnable( BLOCKTYPE a_BlockID );
+ virtual bool FiresForever( BLOCKTYPE a_BlockID );
protected:
- virtual void AddBlock(int a_X, int a_Y, int a_Z);
+ virtual void AddBlock(int a_X, int a_Y, int a_Z) override;
virtual void _AddBlock(int a_X, int a_Y, int a_Z);
virtual bool BurnBlockAround(int a_X, int a_Y, int a_Z);
virtual bool BurnBlock(int a_X, int a_Y, int a_Z);
diff --git a/source/FluidSimulator.cpp b/source/FluidSimulator.cpp
index d8007b9bf..8cbe5054e 100644
--- a/source/FluidSimulator.cpp
+++ b/source/FluidSimulator.cpp
@@ -436,7 +436,7 @@ void cFluidSimulator::Simulate( float a_Dt )
-bool cFluidSimulator::IsPassableForFluid(char a_BlockID)
+bool cFluidSimulator::IsPassableForFluid(BLOCKTYPE a_BlockID)
{
return a_BlockID == E_BLOCK_AIR
|| a_BlockID == E_BLOCK_FIRE
@@ -448,7 +448,7 @@ bool cFluidSimulator::IsPassableForFluid(char a_BlockID)
-bool cFluidSimulator::IsStationaryBlock (char a_BlockID)
+bool cFluidSimulator::IsStationaryBlock (BLOCKTYPE a_BlockID)
{
return a_BlockID == m_StationaryFluidBlock;
}
@@ -457,7 +457,7 @@ bool cFluidSimulator::IsStationaryBlock (char a_BlockID)
-bool cFluidSimulator::CanWashAway( char a_BlockID )
+bool cFluidSimulator::CanWashAway( BLOCKTYPE a_BlockID )
{
switch( a_BlockID )
{
@@ -476,7 +476,7 @@ bool cFluidSimulator::CanWashAway( char a_BlockID )
-bool cFluidSimulator::IsSolidBlock( char a_BlockID )
+bool cFluidSimulator::IsSolidBlock( BLOCKTYPE a_BlockID )
{
return !(a_BlockID == E_BLOCK_AIR
|| a_BlockID == E_BLOCK_FIRE
diff --git a/source/FluidSimulator.h b/source/FluidSimulator.h
index 1ec254595..20d86b1b8 100644
--- a/source/FluidSimulator.h
+++ b/source/FluidSimulator.h
@@ -29,11 +29,11 @@ public:
//Gets the flowing direction. if a_Over is true also the block over the current block affects the direction (standard)
Direction GetFlowingDirection(int a_X, int a_Y, int a_Z, bool a_Over = true);
- virtual bool IsAllowedBlock( char a_BlockID ) = 0;
- virtual bool IsStationaryBlock( char a_BlockID);
- virtual bool IsPassableForFluid( char a_BlockID );
- bool CanWashAway( char a_BlockID );
- bool IsSolidBlock(char a_BlockID);
+ virtual bool IsAllowedBlock( BLOCKTYPE a_BlockID ) = 0;
+ virtual bool IsStationaryBlock( BLOCKTYPE a_BlockID);
+ virtual bool IsPassableForFluid( BLOCKTYPE a_BlockID );
+ bool CanWashAway( BLOCKTYPE a_BlockID );
+ bool IsSolidBlock(BLOCKTYPE a_BlockID);
protected:
virtual void AddBlock( int a_X, int a_Y, int a_Z);
char GetHighestLevelAround( int a_X, int a_Y, int a_Z );
@@ -47,8 +47,8 @@ protected:
FluidData* m_Data;
//Customize
- char m_FluidBlock;
- char m_StationaryFluidBlock;
+ BLOCKTYPE m_FluidBlock;
+ BLOCKTYPE m_StationaryFluidBlock;
char m_MaxHeight;
char m_FlowReduction;
diff --git a/source/LavaSimulator.cpp b/source/LavaSimulator.cpp
index 15cf5591c..4c3636f09 100644
--- a/source/LavaSimulator.cpp
+++ b/source/LavaSimulator.cpp
@@ -14,7 +14,7 @@ cLavaSimulator::cLavaSimulator(cWorld *a_World)
}
-bool cLavaSimulator::IsAllowedBlock(char a_BlockID)
+bool cLavaSimulator::IsAllowedBlock(BLOCKTYPE a_BlockID)
{
return IsBlockLava(a_BlockID);
} \ No newline at end of file
diff --git a/source/LavaSimulator.h b/source/LavaSimulator.h
index 3a9159f1c..43831ca17 100644
--- a/source/LavaSimulator.h
+++ b/source/LavaSimulator.h
@@ -6,7 +6,7 @@ class cLavaSimulator : public cFluidSimulator
public:
cLavaSimulator( cWorld* a_World );
- virtual bool IsAllowedBlock( char a_BlockID );
+ virtual bool IsAllowedBlock( BLOCKTYPE a_BlockID ) override;
}; \ No newline at end of file
diff --git a/source/Protocol/Protocol.h b/source/Protocol/Protocol.h
index c187387c1..c98f2729b 100644
--- a/source/Protocol/Protocol.h
+++ b/source/Protocol/Protocol.h
@@ -85,6 +85,7 @@ public:
virtual void SendWindowClose (char a_WindowID) = 0;
virtual void SendWindowOpen (char a_WindowID, char a_WindowType, const AString & a_WindowTitle, char a_NumSlots) = 0;
virtual void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ ) = 0;
+ virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, short a_SpeedX, short a_SpeedY, short a_SpeedZ) = 0;
/// Returns the ServerID used for authentication through session.minecraft.net
virtual AString GetAuthServerID(void) = 0;
diff --git a/source/Protocol/Protocol125.cpp b/source/Protocol/Protocol125.cpp
index bec6a19b6..53b9b55db 100644
--- a/source/Protocol/Protocol125.cpp
+++ b/source/Protocol/Protocol125.cpp
@@ -52,7 +52,7 @@ enum
PACKET_PLAYER_SPAWN = 0x14,
PACKET_PICKUP_SPAWN = 0x15,
PACKET_COLLECT_PICKUP = 0x16,
- PACKET_ADD_VEHICLE = 0x17,
+ PACKET_SPAWN_OBJECT = 0x17,
PACKET_SPAWN_MOB = 0x18,
PACKET_DESTROY_ENTITY = 0x1d,
PACKET_ENTITY = 0x1e,
@@ -794,6 +794,29 @@ void cProtocol125::SendUseBed(const cEntity & a_Entity, int a_BlockX, int a_Bloc
+void cProtocol125::SendSpawnObject(const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, short a_SpeedX, short a_SpeedY, short a_SpeedZ)
+{
+ cCSLock Lock(m_CSPacket);
+ WriteByte(PACKET_SPAWN_OBJECT);
+ WriteInt (a_Entity.GetUniqueID());
+ WriteByte(a_ObjectType);
+ WriteInt ((int)(a_Entity.GetPosX() * 32));
+ WriteInt ((int)(a_Entity.GetPosY() * 32));
+ WriteInt ((int)(a_Entity.GetPosZ() * 32));
+ WriteInt (a_ObjectData);
+ if( a_ObjectData != 0 )
+ {
+ WriteShort( a_SpeedX );
+ WriteShort( a_SpeedY );
+ WriteShort( a_SpeedZ );
+ }
+ Flush();
+}
+
+
+
+
+
AString cProtocol125::GetAuthServerID(void)
{
// http://wiki.vg/wiki/index.php?title=Session&oldid=2262
diff --git a/source/Protocol/Protocol125.h b/source/Protocol/Protocol125.h
index 84dfa7a72..898a53008 100644
--- a/source/Protocol/Protocol125.h
+++ b/source/Protocol/Protocol125.h
@@ -69,6 +69,7 @@ public:
virtual void SendWindowClose (char a_WindowID) override;
virtual void SendWindowOpen (char a_WindowID, char a_WindowType, const AString & a_WindowTitle, char a_NumSlots) override;
virtual void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ ) override;
+ virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, short a_SpeedX, short a_SpeedY, short a_SpeedZ) override;
virtual AString GetAuthServerID(void) override;
diff --git a/source/Protocol/ProtocolRecognizer.cpp b/source/Protocol/ProtocolRecognizer.cpp
index edd34b7dc..3d71c95ee 100644
--- a/source/Protocol/ProtocolRecognizer.cpp
+++ b/source/Protocol/ProtocolRecognizer.cpp
@@ -495,6 +495,16 @@ void cProtocolRecognizer::SendUseBed(const cEntity & a_Entity, int a_BlockX, int
+void cProtocolRecognizer::SendSpawnObject(const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, short a_SpeedX, short a_SpeedY, short a_SpeedZ)
+{
+ ASSERT(m_Protocol != NULL);
+ m_Protocol->SendSpawnObject(a_Entity, a_ObjectType, a_ObjectData, a_SpeedX, a_SpeedY, a_SpeedZ);
+}
+
+
+
+
+
AString cProtocolRecognizer::GetAuthServerID(void)
{
ASSERT(m_Protocol != NULL);
diff --git a/source/Protocol/ProtocolRecognizer.h b/source/Protocol/ProtocolRecognizer.h
index 2e2f5a9e9..a5099367a 100644
--- a/source/Protocol/ProtocolRecognizer.h
+++ b/source/Protocol/ProtocolRecognizer.h
@@ -80,6 +80,7 @@ public:
virtual void SendWindowClose (char a_WindowID) override;
virtual void SendWindowOpen (char a_WindowID, char a_WindowType, const AString & a_WindowTitle, char a_NumSlots) override;
virtual void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ ) override;
+ virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, short a_SpeedX, short a_SpeedY, short a_SpeedZ) override;
virtual AString GetAuthServerID(void) override;
diff --git a/source/RedstoneSimulator.h b/source/RedstoneSimulator.h
index 3a845bf6b..13f716cec 100644
--- a/source/RedstoneSimulator.h
+++ b/source/RedstoneSimulator.h
@@ -10,10 +10,10 @@ public:
cRedstoneSimulator( cWorld* a_World );
~cRedstoneSimulator();
- virtual void Simulate( float a_Dt );
- virtual bool IsAllowedBlock( char a_BlockID ) { return true; }
+ virtual void Simulate( float a_Dt ) override;
+ virtual bool IsAllowedBlock( BLOCKTYPE a_BlockID ) override { return true; }
- virtual void WakeUp( int a_X, int a_Y, int a_Z );
+ virtual void WakeUp( int a_X, int a_Y, int a_Z ) override;
enum eRedstoneDirection
{
diff --git a/source/SandSimulator.cpp b/source/SandSimulator.cpp
index 1dd9d3d88..f8cfdad37 100644
--- a/source/SandSimulator.cpp
+++ b/source/SandSimulator.cpp
@@ -6,7 +6,7 @@
#include "Vector3i.h"
#include "BlockID.h"
#include "Defines.h"
-
+#include "FallingBlock.h"
@@ -19,12 +19,20 @@ cSandSimulator::cSandSimulator( cWorld* a_World )
}
+
+
+
+
cSandSimulator::~cSandSimulator()
{
delete m_Buffer;
delete m_Blocks;
}
+
+
+
+
void cSandSimulator::Simulate( float a_Dt )
{
m_Buffer->clear();
@@ -33,31 +41,39 @@ void cSandSimulator::Simulate( float a_Dt )
for( BlockList::iterator itr = m_Buffer->begin(); itr != m_Buffer->end(); ++itr )
{
Vector3i Pos = *itr;
- char BlockID = m_World->GetBlock(Pos.x, Pos.y, Pos.z);
+ BLOCKTYPE BlockID = m_World->GetBlock(Pos.x, Pos.y, Pos.z);
if(!IsAllowedBlock(BlockID))
continue;
- char BottomBlock = m_World->GetBlock( Pos.x, Pos.y - 1, Pos.z );
+ BLOCKTYPE BottomBlock = m_World->GetBlock( Pos.x, Pos.y - 1, Pos.z );
if( IsPassable(BottomBlock) )
{
- m_World->SetBlock( Pos.x, Pos.y, Pos.z, E_BLOCK_AIR, 0 );
- m_World->SetBlock( Pos.x, Pos.y - 1, Pos.z, BlockID, 0 );
+ cFallingBlock * FallingBlock = new cFallingBlock( Pos, BlockID );
+ FallingBlock->Initialize( m_World );
+ m_World->SetBlock( Pos.x, Pos.y, Pos.z, E_BLOCK_AIR, 0 );
}
}
}
-bool cSandSimulator::IsAllowedBlock( char a_BlockID )
+
+
+
+bool cSandSimulator::IsAllowedBlock( BLOCKTYPE a_BlockID )
{
return a_BlockID == E_BLOCK_SAND
|| a_BlockID == E_BLOCK_GRAVEL;
}
+
+
+
+
void cSandSimulator::AddBlock(int a_X, int a_Y, int a_Z)
{
- if(!IsAllowedBlock(m_World->GetBlock(a_X, a_Y, a_Z))) //This should save very much time because it doesn´t have to iterate through all blocks
+ if(!IsAllowedBlock(m_World->GetBlock(a_X, a_Y, a_Z)))
return;
Vector3i Block(a_X, a_Y, a_Z);
@@ -71,21 +87,16 @@ void cSandSimulator::AddBlock(int a_X, int a_Y, int a_Z)
}
m_Blocks->push_back(Block);
-
}
-bool cSandSimulator::IsPassable( char a_BlockID )
+
+
+
+
+bool cSandSimulator::IsPassable( BLOCKTYPE a_BlockID )
{
return a_BlockID == E_BLOCK_AIR
|| IsBlockWater(a_BlockID)
|| IsBlockLava(a_BlockID)
|| a_BlockID == E_BLOCK_FIRE;
-
-}
-
-void cSandSimulator::WakeUp( int a_X, int a_Y, int a_Z )
-{
- //Nothing else needs to be simulated :D (Bugs not included :s)
- AddBlock( a_X, a_Y+1, a_Z );
- AddBlock( a_X, a_Y, a_Z );
}
diff --git a/source/SandSimulator.h b/source/SandSimulator.h
index 6dbac1974..37db2d40f 100644
--- a/source/SandSimulator.h
+++ b/source/SandSimulator.h
@@ -21,14 +21,13 @@ public:
cSandSimulator( cWorld* a_World );
~cSandSimulator();
- virtual void Simulate( float a_Dt );
- virtual void WakeUp( int a_X, int a_Y, int a_Z );
+ virtual void Simulate( float a_Dt ) override;
- virtual bool IsAllowedBlock( char a_BlockID );
- virtual bool IsPassable( char a_BlockID );
+ virtual bool IsAllowedBlock( BLOCKTYPE a_BlockID ) override;
+ virtual bool IsPassable( BLOCKTYPE a_BlockID );
protected:
- virtual void AddBlock(int a_X, int a_Y, int a_Z);
+ virtual void AddBlock(int a_X, int a_Y, int a_Z) override;
typedef std::list <Vector3i> BlockList;
BlockList * m_Blocks;
diff --git a/source/Simulator.h b/source/Simulator.h
index 158e74b99..af823b00b 100644
--- a/source/Simulator.h
+++ b/source/Simulator.h
@@ -11,7 +11,7 @@ public:
virtual void Simulate( float a_Dt ) = 0;
virtual void WakeUp( int a_X, int a_Y, int a_Z );
- virtual bool IsAllowedBlock( char a_BlockID ) = 0;
+ virtual bool IsAllowedBlock( BLOCKTYPE a_BlockID ) = 0;
protected:
virtual void AddBlock(int a_X, int a_Y, int a_Z) = 0;
diff --git a/source/WaterSimulator.cpp b/source/WaterSimulator.cpp
index 48389ccd4..66acaea6a 100644
--- a/source/WaterSimulator.cpp
+++ b/source/WaterSimulator.cpp
@@ -15,7 +15,7 @@ cWaterSimulator::cWaterSimulator(cWorld *a_World)
}
-bool cWaterSimulator::IsAllowedBlock(char a_BlockID)
+bool cWaterSimulator::IsAllowedBlock(BLOCKTYPE a_BlockID)
{
return IsBlockWater(a_BlockID);
}
diff --git a/source/WaterSimulator.h b/source/WaterSimulator.h
index aa81a74f6..04a208368 100644
--- a/source/WaterSimulator.h
+++ b/source/WaterSimulator.h
@@ -6,6 +6,6 @@ class cWaterSimulator : public cFluidSimulator
public:
cWaterSimulator( cWorld* a_World );
- virtual bool IsAllowedBlock( char a_BlockID );
+ virtual bool IsAllowedBlock( BLOCKTYPE a_BlockID ) override;
}; \ No newline at end of file
diff --git a/source/WebAdmin.h b/source/WebAdmin.h
index f50de3f64..8e2d4147b 100644
--- a/source/WebAdmin.h
+++ b/source/WebAdmin.h
@@ -43,6 +43,8 @@ public:
PluginList GetPlugins() { return m_Plugins; }
static void Request_Handler(webserver::http_request* r);
+
+ int GetPort() { return m_Port; }
private:
#ifdef _WIN32