2011-11-04 01:01:55 -04:00
# include "cRedstone.h"
2011-11-05 22:36:05 -04:00
# include "cPiston.h"
2011-11-04 03:50:18 -04:00
# include "cRoot.h"
2011-11-04 01:01:55 -04:00
# include "cWorld.h"
2011-11-04 12:05:18 -04:00
# include "BlockID.h"
2011-11-04 01:01:55 -04:00
cRedstone : : cRedstone ( cWorld * a_World )
: m_World ( a_World )
2011-11-06 15:39:44 -05:00
, m_Metadata ( 0 )
2011-11-04 01:01:55 -04:00
{
}
void cRedstone : : ChangeRedstoneTorch ( int fillx , int filly , int fillz , bool added )
{
char metadata = 0 ;
if ( added ) {
metadata = 15 ;
2011-11-06 15:39:44 -05:00
m_Metadata = 15 ;
2011-11-04 01:01:55 -04:00
} else {
metadata = 0 ;
2011-11-06 15:39:44 -05:00
m_Metadata = 0 ;
2011-11-04 01:01:55 -04:00
}
2011-11-04 03:50:18 -04:00
2011-11-06 15:39:44 -05:00
LightRedstone ( fillx , filly , fillz , metadata ) ;
if ( ( int ) m_World - > GetBlock ( fillx , filly , fillz ) = = 0 ) { //we removed an item
//se we check each possible current connection around it.
//if ( ( (int)m_World->GetBlock( fillx+1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
LightRedstone ( fillx + 1 , filly , fillz , m_Metadata ) ;
//}
//if ( ( (int)m_World->GetBlock( fillx-1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
LightRedstone ( fillx - 1 , filly , fillz , m_Metadata ) ;
//}
//if ( ( (int)m_World->GetBlock( fillx, filly, fillz+1 ) == E_BLOCK_REDSTONE_WIRE) ) {
LightRedstone ( fillx , filly , fillz + 1 , m_Metadata ) ;
//}
//if ( ( (int)m_World->GetBlock( fillx, filly, fillz-1 ) == E_BLOCK_REDSTONE_WIRE) ) {
LightRedstone ( fillx , filly , fillz - 1 , m_Metadata ) ;
//}
}
2011-11-04 03:50:18 -04:00
2011-11-06 15:39:44 -05:00
//cWorld* World = cRoot::Get()->GetWorld();
/*
while ( ( int ) metadata = = 0 ) {
2011-11-05 15:31:25 -04:00
if ( ( ( int ) m_World - > GetBlock ( fillx + 1 , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) ) {
2011-11-06 15:39:44 -05:00
metadata = LightRedstone ( fillx + 1 , filly , fillz , metadata ) ;
2011-11-04 01:01:55 -04:00
}
2011-11-05 15:31:25 -04:00
if ( ( ( int ) m_World - > GetBlock ( fillx - 1 , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) ) {
2011-11-06 15:39:44 -05:00
metadata = LightRedstone ( fillx - 1 , filly , fillz , metadata ) ;
2011-11-04 01:01:55 -04:00
}
2011-11-05 15:31:25 -04:00
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz + 1 ) = = E_BLOCK_REDSTONE_WIRE ) ) {
2011-11-06 15:39:44 -05:00
metadata = LightRedstone ( fillx , filly , fillz + 1 , metadata ) ;
2011-11-04 01:01:55 -04:00
}
2011-11-05 15:31:25 -04:00
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz - 1 ) = = E_BLOCK_REDSTONE_WIRE ) ) {
2011-11-06 15:39:44 -05:00
metadata = LightRedstone ( fillx , filly , fillz - 1 , metadata ) ;
2011-11-04 01:01:55 -04:00
}
2011-11-05 15:31:25 -04:00
if ( ( ( int ) m_World - > GetBlock ( fillx + 1 , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) ) {
2011-11-06 15:39:44 -05:00
metadata = LightRedstone ( fillx + 1 , filly - 1 , fillz , metadata ) ;
2011-11-04 01:01:55 -04:00
}
2011-11-05 15:31:25 -04:00
if ( ( ( int ) m_World - > GetBlock ( fillx - 1 , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) ) {
2011-11-06 15:39:44 -05:00
metadata = LightRedstone ( fillx - 1 , filly - 1 , fillz , metadata ) ;
2011-11-04 01:01:55 -04:00
}
2011-11-05 15:31:25 -04:00
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz + 1 ) = = E_BLOCK_REDSTONE_WIRE ) ) {
2011-11-06 15:39:44 -05:00
metadata = LightRedstone ( fillx , filly - 1 , fillz + 1 , metadata ) ;
2011-11-04 01:01:55 -04:00
}
2011-11-05 15:31:25 -04:00
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz - 1 ) = = E_BLOCK_REDSTONE_WIRE ) ) {
2011-11-06 15:39:44 -05:00
metadata = LightRedstone ( fillx , filly - 1 , fillz - 1 , metadata ) ;
2011-11-04 01:01:55 -04:00
}
2011-11-05 15:31:25 -04:00
if ( ( ( int ) m_World - > GetBlock ( fillx + 1 , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) ) {
2011-11-06 15:39:44 -05:00
metadata = LightRedstone ( fillx + 1 , filly + 1 , fillz , metadata ) ;
2011-11-04 01:01:55 -04:00
}
2011-11-05 15:31:25 -04:00
if ( ( ( int ) m_World - > GetBlock ( fillx - 1 , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) ) {
2011-11-06 15:39:44 -05:00
metadata = LightRedstone ( fillx - 1 , filly + 1 , fillz , metadata ) ;
2011-11-04 01:01:55 -04:00
}
2011-11-05 15:31:25 -04:00
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz + 1 ) = = E_BLOCK_REDSTONE_WIRE ) ) {
2011-11-06 15:39:44 -05:00
metadata = LightRedstone ( fillx , filly + 1 , fillz + 1 , metadata ) ;
2011-11-04 01:01:55 -04:00
}
2011-11-05 15:31:25 -04:00
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz - 1 ) = = E_BLOCK_REDSTONE_WIRE ) ) {
2011-11-06 15:39:44 -05:00
metadata = LightRedstone ( fillx , filly + 1 , fillz - 1 , metadata ) ;
2011-11-04 01:01:55 -04:00
}
2011-11-06 15:39:44 -05:00
break ;
}
*/
2011-11-04 01:01:55 -04:00
}
2011-11-06 15:39:44 -05:00
char cRedstone : : LightRedstone ( int fillx , int filly , int fillz , char metadata )
2011-11-04 01:01:55 -04:00
{
2011-11-06 15:39:44 -05:00
//while (m_Metadata == metadata) {
//printf("LightRedstone( %i, %i, %i, %i )\n)", fillx, filly, fillz, (int)metadata);
2011-11-05 22:36:05 -04:00
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz ) = = E_BLOCK_STICKY_PISTON ) | | ( ( int ) m_World - > GetBlock ( fillx , filly , fillz ) = = E_BLOCK_PISTON ) ) {
cPiston Piston ( m_World ) ;
2011-11-06 15:39:44 -05:00
if ( m_Metadata > 0 ) {
2011-11-05 22:36:05 -04:00
Piston . ExtendPiston ( fillx , filly , fillz ) ;
} else {
Piston . RetractPiston ( fillx , filly , fillz ) ;
}
}
2011-11-04 01:01:55 -04:00
2011-11-06 15:39:44 -05:00
if ( ( int ) m_World - > GetBlock ( fillx , filly , fillz ) = = E_BLOCK_REDSTONE_TORCH_OFF ) { //I don't think notch knows on from off. >.>
//printf("1\n");
metadata = 15 ;
m_Metadata = 15 ;
if ( ( ( int ) m_World - > GetBlock ( fillx - 1 , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx - 1 , filly , fillz ) ! = m_Metadata ) ) {
LightRedstone ( fillx - 1 , filly , fillz , m_Metadata ) ;
}
if ( ( ( int ) m_World - > GetBlock ( fillx + 1 , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx + 1 , filly , fillz ) ! = m_Metadata ) ) {
LightRedstone ( fillx + 1 , filly , fillz , m_Metadata ) ;
}
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz - 1 ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx , filly , fillz - 1 ) ! = m_Metadata ) ) {
LightRedstone ( fillx , filly , fillz - 1 , m_Metadata ) ;
}
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz + 1 ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx , filly , fillz + 1 ) ! = m_Metadata ) ) {
LightRedstone ( fillx , filly , fillz + 1 , m_Metadata ) ;
}
} else if ( ( int ) m_World - > GetBlock ( fillx , filly , fillz ) = = E_BLOCK_REDSTONE_TORCH_ON ) { //if the torch is off
//printf("2\n");
metadata = 0 ;
if ( ( ( int ) m_World - > GetBlock ( fillx - 1 , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx - 1 , filly , fillz ) ! = m_Metadata ) ) {
LightRedstone ( fillx - 1 , filly , fillz , m_Metadata ) ;
}
if ( ( ( int ) m_World - > GetBlock ( fillx + 1 , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx + 1 , filly , fillz ) ! = m_Metadata ) ) {
LightRedstone ( fillx + 1 , filly , fillz , m_Metadata ) ;
}
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz - 1 ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx , filly , fillz - 1 ) ! = m_Metadata ) ) {
LightRedstone ( fillx , filly , fillz - 1 , m_Metadata ) ;
}
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz + 1 ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx , filly , fillz + 1 ) ! = m_Metadata ) ) {
LightRedstone ( fillx , filly , fillz + 1 , m_Metadata ) ;
}
}
/*
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx , filly , fillz ) = = 15 ) ) { //if current block is redstone and is on
if ( ( int ) m_Metadata = = 15 ) { //and we want it to be on then we do nothing
} else { //we want it to be off
//if (m_Metadata == metadata) { // only do this if another fill in the same class hasn't found a lit torch yet
m_World - > FastSetBlock ( fillx , filly , fillz , ( char ) E_BLOCK_REDSTONE_WIRE , metadata ) ; //turn it off then check each one around it
if ( ( ( int ) m_World - > GetBlock ( fillx - 1 , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx - 1 , filly , fillz ) ! = m_Metadata ) ) {
LightRedstone ( fillx - 1 , filly , fillz , m_Metadata ) ;
}
if ( ( ( int ) m_World - > GetBlock ( fillx + 1 , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx + 1 , filly , fillz ) ! = m_Metadata ) ) {
LightRedstone ( fillx + 1 , filly , fillz , m_Metadata ) ;
}
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz - 1 ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx , filly , fillz - 1 ) ! = m_Metadata ) ) {
LightRedstone ( fillx , filly , fillz - 1 , m_Metadata ) ;
}
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz + 1 ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx , filly , fillz + 1 ) ! = m_Metadata ) ) {
LightRedstone ( fillx , filly , fillz + 1 , m_Metadata ) ;
}
//}
}
}
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx , filly , fillz ) = = 0 ) ) { //if current block is redstone and is off
if ( ( int ) m_Metadata = = 15 ) { //and we want it to be on then we check each object around it
m_World - > FastSetBlock ( fillx , filly , fillz , ( char ) E_BLOCK_REDSTONE_WIRE , m_Metadata ) ; //turn it off then check each one around it
if ( ( ( int ) m_World - > GetBlock ( fillx - 1 , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx - 1 , filly , fillz ) ! = m_Metadata ) ) {
LightRedstone ( fillx - 1 , filly , fillz , m_Metadata ) ;
}
if ( ( ( int ) m_World - > GetBlock ( fillx + 1 , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx + 1 , filly , fillz ) ! = m_Metadata ) ) {
LightRedstone ( fillx + 1 , filly , fillz , m_Metadata ) ;
}
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz - 1 ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx , filly , fillz - 1 ) ! = m_Metadata ) ) {
LightRedstone ( fillx , filly , fillz - 1 , m_Metadata ) ;
}
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz + 1 ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx , filly , fillz + 1 ) ! = m_Metadata ) ) {
LightRedstone ( fillx , filly , fillz + 1 , m_Metadata ) ;
}
} else { //we want it to be off
}
}
*/
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx , filly , fillz ) ! = m_Metadata ) ) {
//if ( ( (int)m_World->GetBlock( fillx, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) ) {
//printf("3\n");
m_World - > FastSetBlock ( fillx , filly , fillz , ( char ) E_BLOCK_REDSTONE_WIRE , m_Metadata ) ;
LightRedstone ( fillx - 1 , filly , fillz , m_Metadata ) ;
LightRedstone ( fillx + 1 , filly , fillz , m_Metadata ) ;
LightRedstone ( fillx , filly , fillz - 1 , m_Metadata ) ;
LightRedstone ( fillx , filly , fillz + 1 , m_Metadata ) ;
LightRedstone ( fillx - 1 , filly - 1 , fillz , m_Metadata ) ;
LightRedstone ( fillx + 1 , filly - 1 , fillz , m_Metadata ) ;
LightRedstone ( fillx , filly - 1 , fillz - 1 , m_Metadata ) ;
LightRedstone ( fillx , filly - 1 , fillz + 1 , m_Metadata ) ;
LightRedstone ( fillx - 1 , filly + 1 , fillz , m_Metadata ) ;
LightRedstone ( fillx + 1 , filly + 1 , fillz , m_Metadata ) ;
LightRedstone ( fillx , filly + 1 , fillz - 1 , m_Metadata ) ;
LightRedstone ( fillx , filly + 1 , fillz + 1 , m_Metadata ) ;
}
/*
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx , filly , fillz ) ! = metadata ) ) {
m_World - > FastSetBlock ( fillx , filly , fillz , ( char ) E_BLOCK_REDSTONE_WIRE , metadata ) ;
//if ( ( (int)m_World->GetBlock( fillx-1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) && ( (int)m_World->GetBlockMeta( fillx-1, filly, fillz) != metadata ) ) {
LightRedstone ( fillx - 1 , filly , fillz , metadata ) ;
//}
//if ( ( (int)m_World->GetBlock( fillx+1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) && ( (int)m_World->GetBlockMeta( fillx+1, filly, fillz) != metadata ) ) {
LightRedstone ( fillx + 1 , filly , fillz , metadata ) ;
//}
//if ( ( (int)m_World->GetBlock( fillx, filly, fillz-1 ) == E_BLOCK_REDSTONE_WIRE) && ( (int)m_World->GetBlockMeta( fillx, filly, fillz-1) != metadata ) ) {
LightRedstone ( fillx , filly , fillz - 1 , metadata ) ;
//}
//if ( ( (int)m_World->GetBlock( fillx, filly, fillz+1 ) == E_BLOCK_REDSTONE_WIRE) && ( (int)m_World->GetBlockMeta( fillx, filly, fillz+1) != metadata ) ) {
LightRedstone ( fillx , filly , fillz + 1 , metadata ) ;
//}
}
if ( ( ( int ) m_World - > GetBlock ( fillx , filly , fillz ) = = E_BLOCK_REDSTONE_WIRE ) & & ( ( int ) m_World - > GetBlockMeta ( fillx , filly , fillz ) ! = metadata ) ) {
m_World - > FastSetBlock ( fillx , filly , fillz , ( char ) E_BLOCK_REDSTONE_WIRE , metadata ) ;
//if ( ( (int)m_World->GetBlock( fillx-1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) && ( (int)m_World->GetBlockMeta( fillx-1, filly, fillz) != metadata ) ) {
LightRedstone ( fillx - 1 , filly , fillz , metadata ) ;
//}
//if ( ( (int)m_World->GetBlock( fillx+1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) && ( (int)m_World->GetBlockMeta( fillx+1, filly, fillz) != metadata ) ) {
LightRedstone ( fillx + 1 , filly , fillz , metadata ) ;
//}
//if ( ( (int)m_World->GetBlock( fillx, filly, fillz-1 ) == E_BLOCK_REDSTONE_WIRE) && ( (int)m_World->GetBlockMeta( fillx, filly, fillz-1) != metadata ) ) {
LightRedstone ( fillx , filly , fillz - 1 , metadata ) ;
//}
//if ( ( (int)m_World->GetBlock( fillx, filly, fillz+1 ) == E_BLOCK_REDSTONE_WIRE) && ( (int)m_World->GetBlockMeta( fillx, filly, fillz+1) != metadata ) ) {
LightRedstone ( fillx , filly , fillz + 1 , metadata ) ;
//}
}
*/
return metadata ;
}