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