From d2b1aea018650c570e405b5ebb58de3f5b85054e Mon Sep 17 00:00:00 2001 From: "admin@omencraft.com" Date: Fri, 4 Nov 2011 05:01:55 +0000 Subject: [PATCH] Added (Probably incorrectly) a cRedstone class. Also, palcing a redstone torch will recursively light any redstone wire it's connected to. Removing a torch from an active wire will unlight the entire length. Class needs to be updated to make use of non deprecated function. Current deprecated function warning drastically slows redstone performance. git-svn-id: http://mc-server.googlecode.com/svn/trunk@51 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- makefile | 8 +++ source/cClientHandle.cpp | 32 +++++++++-- source/cClientHandle.h | 1 + source/cRedstone.cpp | 79 +++++++++++++++++++++++++++ source/cRedstone.h | 108 +++++++++++++++++++++++++++++++++++++ source/cRedstoneRepeater.h | 20 ------- 6 files changed, 223 insertions(+), 25 deletions(-) create mode 100644 source/cRedstone.cpp create mode 100644 source/cRedstone.h delete mode 100644 source/cRedstoneRepeater.h 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