diff options
-rw-r--r-- | makefile | 8 | ||||
-rw-r--r-- | source/cClientHandle.cpp | 32 | ||||
-rw-r--r-- | source/cClientHandle.h | 1 | ||||
-rw-r--r-- | source/cRedstone.cpp | 79 | ||||
-rw-r--r-- | source/cRedstone.h | 108 | ||||
-rw-r--r-- | source/cRedstoneRepeater.h | 20 |
6 files changed, 223 insertions, 25 deletions
@@ -90,6 +90,7 @@ MCServer : \ build/cInventory.o\ build/cLog.o\ build/cMonster.o\ + build/cRedstone.o\ build/cPawn.o\ build/cPickup.o\ build/cPlayer.o\ @@ -275,6 +276,7 @@ MCServer : \ build/cInventory.o\ build/cLog.o\ build/cMonster.o\ + build/cRedstone.o\ build/cPawn.o\ build/cPickup.o\ build/cPlayer.o\ @@ -463,6 +465,7 @@ clean : build/cInventory.o\ build/cLog.o\ build/cMonster.o\ + build/cRedstone.o\ build/cPawn.o\ build/cPickup.o\ build/cPlayer.o\ @@ -721,6 +724,11 @@ build/cMonster.o : source/cMonster.cpp $(CC) $(CC_OPTIONS) source/cMonster.cpp -c $(INCLUDE) -o build/cMonster.o +# Item # 23 -- cRedstone -- +build/cRedstone.o : source/cRedstone.cpp + $(CC) $(CC_OPTIONS) source/cRedstone.cpp -c $(INCLUDE) -o build/cRedstone.o + + # Item # 25 -- cPawn -- build/cPawn.o : source/cPawn.cpp $(CC) $(CC_OPTIONS) source/cPawn.cpp -c $(INCLUDE) -o build/cPawn.o diff --git a/source/cClientHandle.cpp b/source/cClientHandle.cpp index f384eba77..003f23f55 100644 --- a/source/cClientHandle.cpp +++ b/source/cClientHandle.cpp @@ -16,7 +16,7 @@ #include "cStairs.h"
#include "cLadder.h"
#include "cSign.h"
-#include "cRedstoneRepeater.h"
+#include "cRedstone.h"
#include "cBlockToPickup.h"
#include "cMonster.h"
#include "cChatColor.h"
@@ -523,6 +523,16 @@ void cClientHandle::HandlePacket( cPacket* a_Packet ) {
if( World->DigBlock( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ, PickupItem ) )
{
+ printf("OldBlock,E_BLOCK_REDSTONE_TORCH_ON: %i,%i\n", OldBlock, E_BLOCK_REDSTONE_TORCH_ON );
+ if (OldBlock == E_BLOCK_REDSTONE_TORCH_ON) {
+ cRedstone Redstone(World);
+ Redstone.cRedstone::ChangeRedstoneTorch( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ, false );
+ }
+ if (OldBlock == E_BLOCK_REDSTONE_TORCH_OFF) {
+ cRedstone Redstone(World);
+ Redstone.cRedstone::ChangeRedstoneTorch( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ, false );
+ }
+
int helditem = m_Player->GetInventory().GetEquippedItem().m_ItemID;
bool itemhasdur = false;
switch(helditem)
@@ -640,7 +650,6 @@ void cClientHandle::HandlePacket( cPacket* a_Packet ) bool bPlaceBlock = true;
if( PacketData->m_Direction >= 0 )
{
- bool is_redstone_dust = false;
ENUM_BLOCK_ID BlockID = (ENUM_BLOCK_ID)m_Player->GetWorld()->GetBlock( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ );
switch( BlockID )
{
@@ -746,24 +755,37 @@ void cClientHandle::HandlePacket( cPacket* a_Packet ) break;
char MetaData = (char)Equipped.m_ItemHealth;
- bool is_redstone_dust = false;
switch( PacketData->m_ItemType ) // Special handling for special items
{
case E_BLOCK_TORCH:
MetaData = cTorch::DirectionToMetaData( PacketData->m_Direction );
break;
case E_BLOCK_REDSTONE_TORCH_OFF:
+ {
MetaData = cTorch::DirectionToMetaData( PacketData->m_Direction );
+ //check redstone circuit:
+
+ //if( GetBlock( X, Y+1, Z ) == E_BLOCK_AIR )
+ if( g_BlockTransparent[ (int)m_Player->GetWorld()->GetBlock( PacketData->m_PosX, PacketData->m_PosY+2, PacketData->m_PosZ ) ] == true ) {//if block above is transparent
+ printf("transparent above me\n");
+ } else {
+ printf("transparent not above me\n");
+ }
+
+ cRedstone Redstone(m_Player->GetWorld());
+ Redstone.cRedstone::ChangeRedstoneTorch( PacketData->m_PosX, PacketData->m_PosY+1, PacketData->m_PosZ, true );
+
break;
+ }
case E_BLOCK_REDSTONE_TORCH_ON:
MetaData = cTorch::DirectionToMetaData( PacketData->m_Direction );
break;
case E_ITEM_REDSTONE_DUST:
- is_redstone_dust = true;
+ MetaData = 0;
PacketData->m_ItemType = E_BLOCK_REDSTONE_WIRE;
break;
case E_ITEM_REDSTONE_REPEATER:
- MetaData = cRedstoneRepeater::RotationToMetaData( m_Player->GetRotation() );
+ MetaData = cRedstone::RepeaterRotationToMetaData( m_Player->GetRotation() );
PacketData->m_ItemType = E_BLOCK_REDSTONE_REPEATER_OFF;
break;
case E_BLOCK_COBBLESTONE_STAIRS:
diff --git a/source/cClientHandle.h b/source/cClientHandle.h index 318355773..5025f03d2 100644 --- a/source/cClientHandle.h +++ b/source/cClientHandle.h @@ -7,6 +7,7 @@ class Game; class cPacket;
class cChunk;
class cPlayer;
+class cRedstone;
class cClientHandle // tolua_export
{ // tolua_export
public:
diff --git a/source/cRedstone.cpp b/source/cRedstone.cpp new file mode 100644 index 000000000..619ead615 --- /dev/null +++ b/source/cRedstone.cpp @@ -0,0 +1,79 @@ +#include "cRedstone.h"
+#include "cWorld.h"
+
+
+cRedstone::cRedstone( cWorld* a_World )
+ :m_World ( a_World )
+{
+
+}
+
+void cRedstone::ChangeRedstoneTorch( int fillx, int filly, int fillz, bool added )
+{
+ char metadata = 0;
+ if (added) {
+ metadata = 15;
+ } else {
+ metadata = 0;
+ }
+ if ( ( m_World->GetWorld()->GetBlock( fillx+1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx+1, filly, fillz, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx-1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx-1, filly, fillz, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx, filly, fillz+1 ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx, filly, fillz+1, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx, filly, fillz-1 ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx, filly, fillz-1, metadata );
+ }
+
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx+1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx+1, filly-1, fillz, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx-1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx-1, filly-1, fillz, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx, filly, fillz+1 ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx, filly-1, fillz+1, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx, filly, fillz-1 ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx, filly-1, fillz-1, metadata );
+ }
+
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx+1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx+1, filly+1, fillz, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx-1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx-1, filly+1, fillz, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx, filly, fillz+1 ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx, filly+1, fillz+1, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx, filly, fillz-1 ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx, filly+1, fillz-1, metadata );
+ }
+}
+
+void cRedstone::LightRedstone( int fillx, int filly, int fillz, char metadata)
+{
+ if ( ( (int)m_World->GetWorld()->GetBlock( fillx, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) && ( (int)m_World->GetWorld()->GetBlockMeta( fillx, filly, fillz) != metadata ) ) {
+ m_World->GetWorld()->SetBlock( fillx, filly, fillz, (char)E_BLOCK_REDSTONE_WIRE, metadata );
+ LightRedstone(fillx-1,filly,fillz,metadata);
+ LightRedstone(fillx+1,filly,fillz,metadata);
+ LightRedstone(fillx,filly,fillz-1,metadata);
+ LightRedstone(fillx,filly,fillz+1,metadata);
+
+ LightRedstone(fillx-1,filly-1,fillz,metadata);
+ LightRedstone(fillx+1,filly-1,fillz,metadata);
+ LightRedstone(fillx,filly-1,fillz-1,metadata);
+ LightRedstone(fillx,filly-1,fillz+1,metadata);
+
+ LightRedstone(fillx-1,filly+1,fillz,metadata);
+ LightRedstone(fillx+1,filly+1,fillz,metadata);
+ LightRedstone(fillx,filly+1,fillz-1,metadata);
+ LightRedstone(fillx,filly+1,fillz+1,metadata);
+ }
+
+}
diff --git a/source/cRedstone.h b/source/cRedstone.h new file mode 100644 index 000000000..abfc5f2aa --- /dev/null +++ b/source/cRedstone.h @@ -0,0 +1,108 @@ +#pragma once
+
+class cWorld;
+class cRedstone
+{
+public:
+
+cRedstone( cWorld* a_World );
+
+static char RepeaterRotationToMetaData( float a_Rotation )
+{
+ a_Rotation += 90 + 45; // So its not aligned with axis
+ if( a_Rotation > 360.f ) a_Rotation -= 360.f;
+ if( a_Rotation >= 0.f && a_Rotation < 90.f )
+ return 0x1;
+ else if( a_Rotation >= 180 && a_Rotation < 270 )
+ return 0x3;
+ else if( a_Rotation >= 90 && a_Rotation < 180 )
+ return 0x2;
+ else
+ return 0x0;
+}
+
+
+void LightRedstone( int, int, int, char );
+void ChangeRedstoneTorch( int, int, int, bool );
+
+
+cWorld* m_World;
+
+};
+/*
+cRedstone::cRedstone( cWorld* a_World )
+ :m_World ( a_World )
+{
+
+}
+
+void cRedstone::ChangeRedstoneTorch( int fillx, int filly, int fillz, bool added )
+{
+ char metadata = 0;
+ if (added) {
+ metadata = 15;
+ } else {
+ metadata = 0;
+ }
+ if ( ( m_World->GetWorld()->GetBlock( fillx+1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx+1, filly, fillz, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx-1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx-1, filly, fillz, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx, filly, fillz+1 ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx, filly, fillz+1, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx, filly, fillz-1 ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx, filly, fillz-1, metadata );
+ }
+
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx+1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx+1, filly-1, fillz, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx-1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx-1, filly-1, fillz, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx, filly, fillz+1 ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx, filly-1, fillz+1, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx, filly, fillz-1 ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx, filly-1, fillz-1, metadata );
+ }
+
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx+1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx+1, filly+1, fillz, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx-1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx-1, filly+1, fillz, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx, filly, fillz+1 ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx, filly+1, fillz+1, metadata );
+ }
+ if ( ((int)m_World->GetWorld()->GetBlock( fillx, filly, fillz-1 ) == E_BLOCK_REDSTONE_WIRE) ) {
+ LightRedstone( fillx, filly+1, fillz-1, metadata );
+ }
+}
+
+void cRedstone::LightRedstone( int fillx, int filly, int fillz, char metadata)
+{
+ if ( ( (int)m_World->GetWorld()->GetBlock( fillx, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) && ( (int)m_World->GetWorld()->GetBlockMeta( fillx, filly, fillz) != metadata ) ) {
+ m_World->GetWorld()->SetBlock( fillx, filly, fillz, (char)E_BLOCK_REDSTONE_WIRE, metadata );
+ LightRedstone(fillx-1,filly,fillz,metadata);
+ LightRedstone(fillx+1,filly,fillz,metadata);
+ LightRedstone(fillx,filly,fillz-1,metadata);
+ LightRedstone(fillx,filly,fillz+1,metadata);
+
+ LightRedstone(fillx-1,filly-1,fillz,metadata);
+ LightRedstone(fillx+1,filly-1,fillz,metadata);
+ LightRedstone(fillx,filly-1,fillz-1,metadata);
+ LightRedstone(fillx,filly-1,fillz+1,metadata);
+
+ LightRedstone(fillx-1,filly+1,fillz,metadata);
+ LightRedstone(fillx+1,filly+1,fillz,metadata);
+ LightRedstone(fillx,filly+1,fillz-1,metadata);
+ LightRedstone(fillx,filly+1,fillz+1,metadata);
+ }
+
+}
+*/
diff --git a/source/cRedstoneRepeater.h b/source/cRedstoneRepeater.h deleted file mode 100644 index 6a5f0c163..000000000 --- a/source/cRedstoneRepeater.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once
-
-class cRedstoneRepeater //tolua_export
-{ //tolua_export
-public:
- static char RotationToMetaData( float a_Rotation ) //tolua_export
- { //tolua_export
-printf("a_Rotation: %f\n",a_Rotation);
- a_Rotation += 90 + 45; // So its not aligned with axis
- if( a_Rotation > 360.f ) a_Rotation -= 360.f;
- if( a_Rotation >= 0.f && a_Rotation < 90.f ){
- return 0x1;}
- else if( a_Rotation >= 180 && a_Rotation < 270 ){
- return 0x3;}
- else if( a_Rotation >= 90 && a_Rotation < 180 ){
- return 0x2;}
- else
- return 0x0;
- } //tolua_export
-}; //tolua_export
|