summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--makefile8
-rw-r--r--source/cClientHandle.cpp32
-rw-r--r--source/cClientHandle.h1
-rw-r--r--source/cRedstone.cpp79
-rw-r--r--source/cRedstone.h108
-rw-r--r--source/cRedstoneRepeater.h20
6 files changed, 223 insertions, 25 deletions
diff --git a/makefile b/makefile
index 43a16d871..d94859fff 100644
--- a/makefile
+++ b/makefile
@@ -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