summaryrefslogblamecommitdiffstats
path: root/source/cRedstone.cpp
blob: ff357562f8836c699f6712643aae5d264dfd4186 (plain) (tree)
1
2
3
4
5
6
7
8
9
                       
                     
                   
                    
                     


                                        
                          








                                                                                   
                                 

                              
                                
          
 


















                                                                                                 
 


                                                    
                                                                                              
                                                                             
          
                                                                                              
                                                                             
          
                                                                                              
                                                                             
          
                                                                                              
                                                                             

          
                                                                                              
                                                                               
          
                                                                                              
                                                                               
          
                                                                                              
                                                                               
          
                                                                                              
                                                                               

          
                                                                                              
                                                                               
          
                                                                                              
                                                                               
          
                                                                                              
                                                                               
          
                                                                                              
                                                                               
          


                  

  
                                                                               
  


                                                                                            
                                                                                                                                                                   
                                         
                                      

                                                                  

                                                                   
          
 


























































































































































                                                                                                                                                                                                  
#include "cRedstone.h"
#include "cPiston.h"
#include "cRoot.h"
#include "cWorld.h"
#include "BlockID.h"

cRedstone::cRedstone( cWorld* a_World )
	:m_World ( a_World )
	,m_Metadata ( 0 )
{

}

void cRedstone::ChangeRedstoneTorch( int fillx, int filly, int fillz, bool added )
{
        char metadata = 0;
        if (added) {
                metadata = 15;
                m_Metadata = 15;
        } else {
                metadata = 0;
                m_Metadata = 0;
        }

		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 );
        //}
 
		}

	//cWorld* World = cRoot::Get()->GetWorld();
/*
		while ((int)metadata == 0) {
        if ( ( (int)m_World->GetBlock( fillx+1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE)  ) {
                metadata = LightRedstone( fillx+1, filly, fillz, metadata );
        }
        if ( ( (int)m_World->GetBlock( fillx-1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE)  ) {
                metadata = LightRedstone( fillx-1, filly, fillz, metadata );
        }
        if ( ( (int)m_World->GetBlock( fillx, filly, fillz+1 ) == E_BLOCK_REDSTONE_WIRE)  ) {
                metadata = LightRedstone( fillx, filly, fillz+1, metadata );
        }
        if ( ( (int)m_World->GetBlock( fillx, filly, fillz-1 ) == E_BLOCK_REDSTONE_WIRE)  ) {
                metadata = LightRedstone( fillx, filly, fillz-1, metadata );
        }

        if ( ( (int)m_World->GetBlock( fillx+1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE)  ) {
                metadata = LightRedstone( fillx+1, filly-1, fillz, metadata );
        }
        if ( ( (int)m_World->GetBlock( fillx-1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE)  ) {
                metadata = LightRedstone( fillx-1, filly-1, fillz, metadata );
        }
        if ( ( (int)m_World->GetBlock( fillx, filly, fillz+1 ) == E_BLOCK_REDSTONE_WIRE)  ) {
                metadata = LightRedstone( fillx, filly-1, fillz+1, metadata );
        }
        if ( ( (int)m_World->GetBlock( fillx, filly, fillz-1 ) == E_BLOCK_REDSTONE_WIRE)  ) {
                metadata = LightRedstone( fillx, filly-1, fillz-1, metadata );
        }

        if ( ( (int)m_World->GetBlock( fillx+1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE)  ) {
                metadata = LightRedstone( fillx+1, filly+1, fillz, metadata );
        }
        if ( ( (int)m_World->GetBlock( fillx-1, filly, fillz ) == E_BLOCK_REDSTONE_WIRE)  ) {
                metadata = LightRedstone( fillx-1, filly+1, fillz, metadata );
        }
        if ( ( (int)m_World->GetBlock( fillx, filly, fillz+1 ) == E_BLOCK_REDSTONE_WIRE)  ) {
                metadata = LightRedstone( fillx, filly+1, fillz+1, metadata );
        }
        if ( ( (int)m_World->GetBlock( fillx, filly, fillz-1 ) == E_BLOCK_REDSTONE_WIRE)  ) {
                metadata = LightRedstone( fillx, filly+1, fillz-1, metadata );
        }
        break;
		}
*/   
}

char cRedstone::LightRedstone( int fillx, int filly, int fillz, char metadata)
{
	//while (m_Metadata == metadata) {

	//printf("LightRedstone( %i, %i, %i, %i )\n)", fillx, filly, fillz, (int)metadata);
	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);
		if (m_Metadata > 0) {
			Piston.ExtendPiston(fillx, filly, fillz);
		} else {
			Piston.RetractPiston(fillx, filly, fillz);
		}
	}

	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;

}