Updated redstone and pistons some mode. If you break an extended piston the piston extension will now also break. When a redstone device is broken by something other than a person the redstone circuit should now update.
git-svn-id: http://mc-server.googlecode.com/svn/trunk@74 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
9812c38ae2
commit
a9e02cf8fa
@ -78,8 +78,8 @@ enum ENUM_BLOCK_ID
|
||||
E_BLOCK_WOODEN_PRESSURE_PLATE = 72,
|
||||
E_BLOCK_REDSTONE_ORE = 73,
|
||||
E_BLOCK_REDSTONE_ORE_GLOWING = 74,
|
||||
E_BLOCK_REDSTONE_TORCH_ON = 75,
|
||||
E_BLOCK_REDSTONE_TORCH_OFF = 76,
|
||||
E_BLOCK_REDSTONE_TORCH_OFF = 75,
|
||||
E_BLOCK_REDSTONE_TORCH_ON = 76,
|
||||
E_BLOCK_STONE_BUTTON = 77,
|
||||
E_BLOCK_SNOW = 78,
|
||||
E_BLOCK_ICE = 79,
|
||||
|
@ -19,10 +19,12 @@
|
||||
#include "cTorch.h"
|
||||
#include "cLadder.h"
|
||||
#include "cPickup.h"
|
||||
#include "cRedstone.h"
|
||||
#include "cItem.h"
|
||||
#include "cNoise.h"
|
||||
#include "cRoot.h"
|
||||
#include "cCriticalSection.h"
|
||||
#include "cBlockToPickup.h"
|
||||
|
||||
#include "cGenSettings.h"
|
||||
|
||||
@ -215,6 +217,7 @@ void cChunk::Tick(float a_Dt)
|
||||
unsigned int NumTickBlocks = ToTickBlocks.size();
|
||||
if( NumTickBlocks > 0 ) LOG("To tick: %i", NumTickBlocks );
|
||||
m_pState->m_ToTickBlocks.clear();
|
||||
bool isRedstone = false;
|
||||
for( std::map< unsigned int, int>::iterator itr = ToTickBlocks.begin(); itr != ToTickBlocks.end(); ++itr )
|
||||
{
|
||||
if( (*itr).second < 0 ) continue;
|
||||
@ -226,6 +229,12 @@ void cChunk::Tick(float a_Dt)
|
||||
char BlockID = GetBlock( index );
|
||||
switch( BlockID )
|
||||
{
|
||||
case E_BLOCK_REDSTONE_REPEATER_OFF:
|
||||
case E_BLOCK_REDSTONE_REPEATER_ON:
|
||||
case E_BLOCK_REDSTONE_WIRE:
|
||||
{
|
||||
isRedstone = true;
|
||||
}
|
||||
case E_BLOCK_REEDS:
|
||||
case E_BLOCK_WOODEN_PRESSURE_PLATE:
|
||||
case E_BLOCK_STONE_PRESSURE_PLATE:
|
||||
@ -236,19 +245,23 @@ void cChunk::Tick(float a_Dt)
|
||||
case E_BLOCK_YELLOW_FLOWER:
|
||||
case E_BLOCK_RED_ROSE:
|
||||
case E_BLOCK_RED_MUSHROOM:
|
||||
case E_BLOCK_BROWN_MUSHROOM:
|
||||
case E_BLOCK_REDSTONE_WIRE: // Stuff that drops when block below is destroyed
|
||||
case E_BLOCK_BROWN_MUSHROOM: // Stuff that drops when block below is destroyed
|
||||
{
|
||||
if( GetBlock( X, Y-1, Z ) == E_BLOCK_AIR )
|
||||
{
|
||||
SetBlock( X, Y, Z, 0, 0 );
|
||||
cPickup* Pickup = new cPickup( (X+m_PosX*16) * 32 + 16, (Y+m_PosY*128) * 32 + 16, (Z+m_PosZ*16) * 32 + 16, cItem( (ENUM_ITEM_ID)BlockID, 1 ) );
|
||||
if (isRedstone) {
|
||||
cRedstone Redstone(m_World);
|
||||
Redstone.ChangeRedstone( X, Y, Z, false );
|
||||
}
|
||||
cPickup* Pickup = new cPickup( (X+m_PosX*16) * 32 + 16, (Y+m_PosY*128) * 32 + 16, (Z+m_PosZ*16) * 32 + 16, cItem( cBlockToPickup::ToPickup( (ENUM_ITEM_ID)BlockID, E_ITEM_EMPTY) , 1 ) );
|
||||
Pickup->Initialize( m_World );
|
||||
}
|
||||
}
|
||||
break;
|
||||
case E_BLOCK_REDSTONE_TORCH_OFF:
|
||||
case E_BLOCK_REDSTONE_TORCH_ON:
|
||||
isRedstone = true;
|
||||
case E_BLOCK_TORCH:
|
||||
{
|
||||
char Dir = cTorch::MetaDataToDirection( GetLight( m_BlockMeta, X, Y, Z ) );
|
||||
@ -260,7 +273,11 @@ void cChunk::Tick(float a_Dt)
|
||||
if( m_World->GetBlock( XX, YY, ZZ ) == E_BLOCK_AIR )
|
||||
{
|
||||
SetBlock( X, Y, Z, 0, 0 );
|
||||
cPickup* Pickup = new cPickup( (X+m_PosX*16) * 32 + 16, (Y+m_PosY*128) * 32 + 16, (Z+m_PosZ*16) * 32 + 16, cItem( (ENUM_ITEM_ID)BlockID, 1 ) );
|
||||
if (isRedstone) {
|
||||
cRedstone Redstone(m_World);
|
||||
Redstone.ChangeRedstone( X, Y, Z, false );
|
||||
}
|
||||
cPickup* Pickup = new cPickup( (X+m_PosX*16) * 32 + 16, (Y+m_PosY*128) * 32 + 16, (Z+m_PosZ*16) * 32 + 16, cItem( cBlockToPickup::ToPickup( (ENUM_ITEM_ID)BlockID, E_ITEM_EMPTY) , 1 ) );
|
||||
Pickup->Initialize( m_World );
|
||||
}
|
||||
}
|
||||
|
@ -71,6 +71,10 @@
|
||||
#define sprintf_s(dst, size, format, ...) sprintf(dst, format, __VA_ARGS__ )
|
||||
#endif
|
||||
|
||||
#define AddPistonDir( x, y, z, dir, amount ) switch(dir) { case 0: (y)-=(amount); break; case 1: (y)+=(amount); break;\
|
||||
case 2: (z)-=(amount); break; case 3: (z)+=(amount); break;\
|
||||
case 4: (x)-=(amount); break; case 5: (x)+=(amount); break; }
|
||||
|
||||
#define MAX_SEMAPHORES (2000)
|
||||
|
||||
typedef std::list<cPacket*> PacketList;
|
||||
@ -535,15 +539,24 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
|
||||
{
|
||||
if (OldBlock == E_BLOCK_REDSTONE_TORCH_ON) {
|
||||
cRedstone Redstone(World);
|
||||
Redstone.ChangeRedstoneTorch( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ, false );
|
||||
Redstone.ChangeRedstone( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ, false );
|
||||
}
|
||||
if (OldBlock == E_BLOCK_REDSTONE_TORCH_OFF) {
|
||||
cRedstone Redstone(World);
|
||||
Redstone.ChangeRedstoneTorch( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ, false );
|
||||
Redstone.ChangeRedstone( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ, false );
|
||||
}
|
||||
if (OldBlock == E_BLOCK_REDSTONE_WIRE) {
|
||||
cRedstone Redstone(World);
|
||||
Redstone.ChangeRedstoneTorch( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ, false );
|
||||
Redstone.ChangeRedstone( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ, false );
|
||||
}
|
||||
if (( OldBlock == E_BLOCK_PISTON) || (OldBlock == E_BLOCK_STICKY_PISTON) ) {
|
||||
int newX = PacketData->m_PosX;
|
||||
int newY = PacketData->m_PosY;
|
||||
int newZ = PacketData->m_PosZ;
|
||||
AddPistonDir( newX, newY, newZ, MetaData & ~(8), 1 )
|
||||
if (World->GetBlock(newX, newY, newZ) == E_BLOCK_PISTON_EXTENSION) {
|
||||
World->SetBlock( newX, newY, newZ, E_BLOCK_AIR, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
int helditem = m_Player->GetInventory().GetEquippedItem().m_ItemID;
|
||||
@ -629,6 +642,7 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
|
||||
break;
|
||||
case E_BLOCK_PLACE:
|
||||
{
|
||||
|
||||
//LOG("TimeP: %f", m_Player->GetLastBlockActionTime() );
|
||||
//LOG("TimeN: %f", cRoot::Get()->GetWorld()->GetTime() );
|
||||
if ( cRoot::Get()->GetWorld()->GetTime() - m_Player->GetLastBlockActionTime() < 0.1 ) { //only allow block interactions every 0.1 seconds
|
||||
@ -640,9 +654,7 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
|
||||
cPacket_BlockPlace* PacketData = reinterpret_cast<cPacket_BlockPlace*>(a_Packet);
|
||||
cItem & Equipped = m_Player->GetInventory().GetEquippedItem();
|
||||
//if( (Equipped.m_ItemID != PacketData->m_ItemType) ) // Not valid
|
||||
if ( ( m_Player->GetWorld()->GetBlock( PacketData->m_PosX, PacketData->m_PosY, PacketData->m_PosZ ) != E_BLOCK_AIR ) && (m_Player->GetGameMode() != 1) ) { //tried to place a block *into* another?
|
||||
break; //happens when you place a block aiming at side of block like torch or stem
|
||||
}
|
||||
|
||||
if( (Equipped.m_ItemID != PacketData->m_ItemType) && (m_Player->GetGameMode() != 1) ) // Not valid
|
||||
{
|
||||
LOGWARN("Player %s tried to place a block that was not selected! (could indicate bot)", GetUsername() );
|
||||
@ -776,6 +788,9 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
|
||||
char MetaData = (char)Equipped.m_ItemHealth;
|
||||
switch( PacketData->m_ItemType ) // Special handling for special items
|
||||
{
|
||||
case E_BLOCK_WHITE_CLOTH:
|
||||
MetaData = (char)PacketData->m_Uses;
|
||||
break;
|
||||
case E_BLOCK_TORCH:
|
||||
MetaData = cTorch::DirectionToMetaData( PacketData->m_Direction );
|
||||
break;
|
||||
@ -790,14 +805,14 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
|
||||
//printf("transparent not above me\n");
|
||||
}
|
||||
UpdateRedstone = true;
|
||||
AddedCurrent = true;
|
||||
AddedCurrent = false;
|
||||
break;
|
||||
}
|
||||
case E_BLOCK_REDSTONE_TORCH_ON:
|
||||
{
|
||||
MetaData = cTorch::DirectionToMetaData( PacketData->m_Direction );
|
||||
UpdateRedstone = true;
|
||||
AddedCurrent = false;
|
||||
AddedCurrent = true;
|
||||
break;
|
||||
}
|
||||
case E_ITEM_REDSTONE_DUST:
|
||||
@ -848,17 +863,21 @@ void cClientHandle::HandlePacket( cPacket* a_Packet )
|
||||
};
|
||||
if( IsValidBlock( PacketData->m_ItemType) )
|
||||
{
|
||||
if( (m_Player->GetInventory().RemoveItem( Item )) || (m_Player->GetGameMode() == 1) )
|
||||
int X = PacketData->m_PosX;
|
||||
char Y = PacketData->m_PosY;
|
||||
int Z = PacketData->m_PosZ;
|
||||
AddDirection( X, Y, Z, PacketData->m_Direction );
|
||||
if( m_Player->GetWorld()->GetBlock( X, Y, Z ) != E_BLOCK_AIR ) { //tried to place a block *into* another?
|
||||
break; //happens when you place a block aiming at side of block like torch or stem
|
||||
}
|
||||
|
||||
if( (m_Player->GetGameMode() == 1) || (m_Player->GetInventory().RemoveItem( Item )) )
|
||||
{
|
||||
int X = PacketData->m_PosX;
|
||||
char Y = PacketData->m_PosY;
|
||||
int Z = PacketData->m_PosZ;
|
||||
AddDirection( X, Y, Z, PacketData->m_Direction );
|
||||
|
||||
|
||||
m_Player->GetWorld()->SetBlock( X, Y, Z, (char)PacketData->m_ItemType, MetaData );
|
||||
if (UpdateRedstone) {
|
||||
cRedstone Redstone(m_Player->GetWorld());
|
||||
Redstone.ChangeRedstoneTorch( PacketData->m_PosX, PacketData->m_PosY+1, PacketData->m_PosZ, AddedCurrent );
|
||||
Redstone.ChangeRedstone( PacketData->m_PosX, PacketData->m_PosY+1, PacketData->m_PosZ, AddedCurrent );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "cPiston.h"
|
||||
#include "cRedstone.h"
|
||||
#include "cChunk.h"
|
||||
#include "cPickup.h"
|
||||
#include "cBlockToPickup.h"
|
||||
@ -44,74 +45,87 @@ void cPiston::ExtendPiston( int pistx, int pisty, int pistz ) {
|
||||
char pistonBlock = m_World->GetBlock( pistx, pisty, pistz );
|
||||
char pistonMeta = m_World->GetBlockMeta( pistx, pisty, pistz );
|
||||
char isSticky = (char)(pistonBlock == E_BLOCK_STICKY_PISTON) * 8;
|
||||
unsigned short dist = FirstPassthroughBlock(pistx, pisty, pistz, pistonMeta);
|
||||
if(dist>9000) return; // too many blocks
|
||||
|
||||
AddDir( pistx, pisty, pistz, pistonMeta & 7, dist+1 )
|
||||
char currBlock = m_World->GetBlock( pistx, pisty, pistz );
|
||||
if( currBlock != E_BLOCK_AIR ) {
|
||||
cItem PickupItem;
|
||||
PickupItem.m_ItemID = cBlockToPickup::ToPickup( (ENUM_BLOCK_ID) currBlock, E_ITEM_EMPTY );
|
||||
PickupItem.m_ItemCount = 1;
|
||||
cPickup* Pickup = new cPickup( pistx*32 + 16, pisty*32 + 16, pistz*32 + 16, PickupItem );
|
||||
Pickup->Initialize( m_World );
|
||||
}
|
||||
int oldx = pistx, oldy = pisty, oldz = pistz;
|
||||
char currBlockMeta;
|
||||
for( int i = dist+1; i>0; i-- ) {
|
||||
AddDir( pistx, pisty, pistz, pistonMeta & 7, -1 )
|
||||
currBlock = m_World->GetBlock( pistx, pisty, pistz );
|
||||
currBlockMeta = m_World->GetBlockMeta( pistx, pisty, pistz );
|
||||
m_World->SetBlock( oldx, oldy, oldz, currBlock, currBlockMeta );
|
||||
oldx = pistx;
|
||||
oldy = pisty;
|
||||
oldz = pistz;
|
||||
}
|
||||
cPacket_BlockAction Action;
|
||||
Action.m_PosX = (int)pistx;
|
||||
Action.m_PosY = (short)pisty;
|
||||
Action.m_PosZ = (int)pistz;
|
||||
Action.m_Byte1 = 0;
|
||||
Action.m_Byte2 = pistonMeta;
|
||||
cChunk* Chunk = m_World->GetChunk( FAST_FLOOR(pistx/16), FAST_FLOOR(pisty/16), FAST_FLOOR(pistz/16) );
|
||||
Chunk->Broadcast( Action );
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, pistonBlock, pistonMeta | 8 );
|
||||
bool recalc = false;
|
||||
if (pistonMeta < 6) {// only extend if piston is not already extended
|
||||
unsigned short dist = FirstPassthroughBlock(pistx, pisty, pistz, pistonMeta);
|
||||
if(dist>9000) return; // too many blocks
|
||||
|
||||
int extx = pistx;
|
||||
int exty = pisty;
|
||||
int extz = pistz;
|
||||
AddDir( pistx, pisty, pistz, pistonMeta & 7, dist+1 )
|
||||
char currBlock = m_World->GetBlock( pistx, pisty, pistz );
|
||||
if( currBlock != E_BLOCK_AIR ) {
|
||||
cItem PickupItem;
|
||||
PickupItem.m_ItemID = cBlockToPickup::ToPickup( (ENUM_BLOCK_ID) currBlock, E_ITEM_EMPTY );
|
||||
PickupItem.m_ItemCount = 1;
|
||||
cPickup* Pickup = new cPickup( pistx*32 + 16, pisty*32 + 16, pistz*32 + 16, PickupItem );
|
||||
Pickup->Initialize( m_World );
|
||||
recalc = true;
|
||||
}
|
||||
int oldx = pistx, oldy = pisty, oldz = pistz;
|
||||
char currBlockMeta;
|
||||
for( int i = dist+1; i>0; i-- ) {
|
||||
AddDir( pistx, pisty, pistz, pistonMeta & 7, -1 )
|
||||
currBlock = m_World->GetBlock( pistx, pisty, pistz );
|
||||
currBlockMeta = m_World->GetBlockMeta( pistx, pisty, pistz );
|
||||
m_World->SetBlock( oldx, oldy, oldz, currBlock, currBlockMeta );
|
||||
oldx = pistx;
|
||||
oldy = pisty;
|
||||
oldz = pistz;
|
||||
}
|
||||
cPacket_BlockAction Action;
|
||||
Action.m_PosX = (int)pistx;
|
||||
Action.m_PosY = (short)pisty;
|
||||
Action.m_PosZ = (int)pistz;
|
||||
Action.m_Byte1 = 0;
|
||||
Action.m_Byte2 = pistonMeta;
|
||||
cChunk* Chunk = m_World->GetChunk( FAST_FLOOR(pistx/16), FAST_FLOOR(pisty/16), FAST_FLOOR(pistz/16) );
|
||||
Chunk->Broadcast( Action );
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, pistonBlock, pistonMeta | 8 );
|
||||
|
||||
AddDir( extx, exty, extz, pistonMeta&7, 1 )
|
||||
int extx = pistx;
|
||||
int exty = pisty;
|
||||
int extz = pistz;
|
||||
|
||||
AddDir( extx, exty, extz, pistonMeta&7, 1 )
|
||||
|
||||
m_World->SetBlock( extx, exty, extz, E_BLOCK_PISTON_EXTENSION, isSticky+pistonMeta&7 );
|
||||
m_World->SetBlock( extx, exty, extz, E_BLOCK_PISTON_EXTENSION, isSticky+pistonMeta&7 );
|
||||
|
||||
if (recalc) {
|
||||
cRedstone Redstone(m_World);
|
||||
Redstone.ChangeRedstone( extx, exty, extz, false ); //recalculate redstone around current device.
|
||||
Redstone.ChangeRedstone( pistx, pisty, pistz, false ); //recalculate redstone around current device.
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void cPiston::RetractPiston( int pistx, int pisty, int pistz ) {
|
||||
char pistonBlock = m_World->GetBlock( pistx, pisty, pistz );
|
||||
char pistonMeta = m_World->GetBlockMeta( pistx, pisty, pistz );
|
||||
//send blockaction packet
|
||||
cPacket_BlockAction Action;
|
||||
Action.m_PosX = (int)pistx;
|
||||
Action.m_PosY = (short)pisty;
|
||||
Action.m_PosZ = (int)pistz;
|
||||
Action.m_Byte1 = 1;
|
||||
Action.m_Byte1 = pistonMeta & ~(8);
|
||||
cChunk* Chunk = m_World->GetChunk( FAST_FLOOR(pistx/16), FAST_FLOOR(pisty/16), FAST_FLOOR(pistz/16) );
|
||||
Chunk->Broadcast( Action );
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, pistonBlock, pistonMeta & ~(8) );
|
||||
|
||||
AddDir( pistx, pisty, pistz, pistonMeta & 7, 1 )
|
||||
if( m_World->GetBlock( pistx, pisty, pistz ) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
if( pistonBlock == E_BLOCK_STICKY_PISTON ) {
|
||||
int tempx = pistx, tempy = pisty, tempz = pistz;
|
||||
AddDir( tempx, tempy, tempz, pistonMeta&7, 1 )
|
||||
char tempblock = m_World->GetBlock( tempx, tempy, tempz );
|
||||
if(tempblock == E_BLOCK_OBSIDIAN || tempblock == E_BLOCK_BEDROCK || tempblock == E_BLOCK_PISTON_EXTENSION) {return;}
|
||||
m_World->SetBlock( pistx, pisty, pistz, tempblock, m_World->GetBlockMeta( tempx, tempy, tempz ) );
|
||||
m_World->SetBlock( tempx, tempy, tempz, E_BLOCK_AIR, 0 );
|
||||
}else{
|
||||
m_World->SetBlock( pistx, pisty, pistz, E_BLOCK_AIR, 0 );
|
||||
if (pistonMeta > 6) {// only retract if piston is not already retracted
|
||||
//send blockaction packet
|
||||
cPacket_BlockAction Action;
|
||||
Action.m_PosX = (int)pistx;
|
||||
Action.m_PosY = (short)pisty;
|
||||
Action.m_PosZ = (int)pistz;
|
||||
Action.m_Byte1 = 1;
|
||||
Action.m_Byte1 = pistonMeta & ~(8);
|
||||
cChunk* Chunk = m_World->GetChunk( FAST_FLOOR(pistx/16), FAST_FLOOR(pisty/16), FAST_FLOOR(pistz/16) );
|
||||
Chunk->Broadcast( Action );
|
||||
m_World->FastSetBlock( pistx, pisty, pistz, pistonBlock, pistonMeta & ~(8) );
|
||||
|
||||
AddDir( pistx, pisty, pistz, pistonMeta & 7, 1 )
|
||||
if( m_World->GetBlock( pistx, pisty, pistz ) == E_BLOCK_PISTON_EXTENSION ) {
|
||||
if( pistonBlock == E_BLOCK_STICKY_PISTON ) {
|
||||
int tempx = pistx, tempy = pisty, tempz = pistz;
|
||||
AddDir( tempx, tempy, tempz, pistonMeta&7, 1 )
|
||||
char tempblock = m_World->GetBlock( tempx, tempy, tempz );
|
||||
if(tempblock == E_BLOCK_OBSIDIAN || tempblock == E_BLOCK_BEDROCK || tempblock == E_BLOCK_PISTON_EXTENSION) {return;}
|
||||
m_World->SetBlock( pistx, pisty, pistz, tempblock, m_World->GetBlockMeta( tempx, tempy, tempz ) );
|
||||
m_World->SetBlock( tempx, tempy, tempz, E_BLOCK_AIR, 0 );
|
||||
}else{
|
||||
m_World->SetBlock( pistx, pisty, pistz, E_BLOCK_AIR, 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -11,7 +11,7 @@ cRedstone::cRedstone( cWorld* a_World )
|
||||
|
||||
}
|
||||
|
||||
void cRedstone::ChangeRedstoneTorch( int fillx, int filly, int fillz, bool added )
|
||||
void cRedstone::ChangeRedstone( int fillx, int filly, int fillz, bool added )
|
||||
{
|
||||
if (added) {
|
||||
m_Metadata = 15;
|
||||
@ -19,90 +19,157 @@ void cRedstone::ChangeRedstoneTorch( int fillx, int filly, int fillz, bool added
|
||||
m_Metadata = 0;
|
||||
}
|
||||
|
||||
LightRedstone( fillx, filly, fillz );
|
||||
CalculatetRedstone( fillx, filly, fillz );
|
||||
|
||||
if ( (int)m_World->GetBlock( fillx, filly, fillz ) == 0 ) { //we removed an item
|
||||
if ( ( (int)m_World->GetBlock( fillx, filly, fillz ) == E_BLOCK_AIR ) || ( (int)m_World->GetBlock( fillx, filly, fillz ) == E_BLOCK_PISTON_EXTENSION ) ) {
|
||||
|
||||
LightRedstone( fillx+1, filly, fillz );
|
||||
m_Metadata = 0;
|
||||
LightRedstone( fillx-1, filly, fillz );
|
||||
CalculatetRedstone( fillx+1, filly, fillz );
|
||||
m_Metadata = 0;
|
||||
LightRedstone( fillx, filly, fillz+1 );
|
||||
CalculatetRedstone( fillx-1, filly, fillz );
|
||||
m_Metadata = 0;
|
||||
LightRedstone( fillx, filly, fillz-1 );
|
||||
CalculatetRedstone( fillx, filly, fillz+1 );
|
||||
m_Metadata = 0;
|
||||
|
||||
CalculatetRedstone( fillx, filly, fillz-1 );
|
||||
m_Metadata = 0;
|
||||
|
||||
CalculatetRedstone( fillx+1, filly+1, fillz );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx-1, filly+1, fillz );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx, filly+1, fillz+1 );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx, filly+1, fillz-1 );
|
||||
m_Metadata = 0;
|
||||
|
||||
CalculatetRedstone( fillx+1, filly-1, fillz );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx-1, filly-1, fillz );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx, filly-1, fillz+1 );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx, filly-1, fillz-1 );
|
||||
m_Metadata = 0;
|
||||
|
||||
}
|
||||
|
||||
if ( (int)m_World->GetBlock( fillx, filly, fillz ) == E_BLOCK_REDSTONE_WIRE ) { //we added dust
|
||||
|
||||
LightRedstone( fillx+1, filly, fillz );
|
||||
LightRedstone( fillx-1, filly, fillz );
|
||||
LightRedstone( fillx, filly, fillz+1 );
|
||||
LightRedstone( fillx, filly, fillz-1 );
|
||||
CalculatetRedstone( fillx+1, filly, fillz );
|
||||
CalculatetRedstone( fillx-1, filly, fillz );
|
||||
CalculatetRedstone( fillx, filly, fillz+1 );
|
||||
CalculatetRedstone( fillx, filly, fillz-1 );
|
||||
|
||||
CalculatetRedstone( fillx+1, filly+1, fillz );
|
||||
CalculatetRedstone( fillx-1, filly+1, fillz );
|
||||
CalculatetRedstone( fillx, filly+1, fillz+1 );
|
||||
CalculatetRedstone( fillx, filly+1, fillz-1 );
|
||||
|
||||
CalculatetRedstone( fillx+1, filly-1, fillz );
|
||||
CalculatetRedstone( fillx-1, filly-1, fillz );
|
||||
CalculatetRedstone( fillx, filly-1, fillz+1 );
|
||||
CalculatetRedstone( fillx, filly-1, fillz-1 );
|
||||
|
||||
}
|
||||
|
||||
if ( ( (int)m_World->GetBlock( fillx, filly, fillz ) == E_BLOCK_PISTON ) || ( (int)m_World->GetBlock( fillx, filly, fillz ) == E_BLOCK_STICKY_PISTON ) ) { //we added a piston
|
||||
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx+1, filly, fillz );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx-1, filly, fillz );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx, filly, fillz+1 );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx, filly, fillz-1 );
|
||||
m_Metadata = 0;
|
||||
|
||||
CalculatetRedstone( fillx+1, filly+1, fillz );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx-1, filly+1, fillz );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx, filly+1, fillz+1 );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx, filly+1, fillz-1 );
|
||||
m_Metadata = 0;
|
||||
|
||||
CalculatetRedstone( fillx+1, filly-1, fillz );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx-1, filly-1, fillz );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx, filly-1, fillz+1 );
|
||||
m_Metadata = 0;
|
||||
CalculatetRedstone( fillx, filly-1, fillz-1 );
|
||||
m_Metadata = 0;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void cRedstone::LightRedstone( int fillx, int filly, int fillz)
|
||||
void cRedstone::CalculatetRedstone( int fillx, int filly, int fillz)
|
||||
{
|
||||
|
||||
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);
|
||||
char pistonMeta = m_World->GetBlockMeta( fillx, filly, fillz );
|
||||
if (m_Metadata > 0) {
|
||||
Piston.ExtendPiston(fillx, filly, fillz);
|
||||
if (pistonMeta < 6) { // only extend if piston is not already extended
|
||||
cPiston Piston(m_World);
|
||||
Piston.ExtendPiston(fillx, filly, fillz);
|
||||
}
|
||||
} else {
|
||||
Piston.RetractPiston(fillx, filly, fillz);
|
||||
if (pistonMeta > 6) { // only retract if piston is not already retracted
|
||||
cPiston Piston(m_World);
|
||||
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. >.>
|
||||
if ( (int)m_World->GetBlock( fillx, filly, fillz ) == E_BLOCK_REDSTONE_TORCH_ON ) { //If torch is on
|
||||
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);
|
||||
CalculatetRedstone(fillx-1,filly,fillz);
|
||||
}
|
||||
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);
|
||||
CalculatetRedstone(fillx+1,filly,fillz);
|
||||
}
|
||||
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);
|
||||
CalculatetRedstone(fillx,filly,fillz-1);
|
||||
}
|
||||
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);
|
||||
CalculatetRedstone(fillx,filly,fillz+1);
|
||||
}
|
||||
} else if ( (int)m_World->GetBlock( fillx, filly, fillz ) == E_BLOCK_REDSTONE_TORCH_ON ) { //if the torch is off
|
||||
} else if ( (int)m_World->GetBlock( fillx, filly, fillz ) == E_BLOCK_REDSTONE_TORCH_OFF ) { //if the torch is off
|
||||
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);
|
||||
CalculatetRedstone(fillx-1,filly,fillz);
|
||||
}
|
||||
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);
|
||||
CalculatetRedstone(fillx+1,filly,fillz);
|
||||
}
|
||||
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);
|
||||
CalculatetRedstone(fillx,filly,fillz-1);
|
||||
}
|
||||
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);
|
||||
CalculatetRedstone(fillx,filly,fillz+1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ( ( (int)m_World->GetBlock( fillx, filly, fillz ) == E_BLOCK_REDSTONE_WIRE) && ( (int)m_World->GetBlockMeta( fillx, filly, fillz) != m_Metadata ) ) {
|
||||
m_World->FastSetBlock( fillx, filly, fillz, (char)E_BLOCK_REDSTONE_WIRE, m_Metadata );
|
||||
LightRedstone(fillx-1,filly,fillz);
|
||||
LightRedstone(fillx+1,filly,fillz);
|
||||
LightRedstone(fillx,filly,fillz-1);
|
||||
LightRedstone(fillx,filly,fillz+1);
|
||||
CalculatetRedstone(fillx-1,filly,fillz);
|
||||
CalculatetRedstone(fillx+1,filly,fillz);
|
||||
CalculatetRedstone(fillx,filly,fillz-1);
|
||||
CalculatetRedstone(fillx,filly,fillz+1);
|
||||
|
||||
LightRedstone(fillx-1,filly-1,fillz);
|
||||
LightRedstone(fillx+1,filly-1,fillz);
|
||||
LightRedstone(fillx,filly-1,fillz-1);
|
||||
LightRedstone(fillx,filly-1,fillz+1);
|
||||
CalculatetRedstone(fillx-1,filly-1,fillz);
|
||||
CalculatetRedstone(fillx+1,filly-1,fillz);
|
||||
CalculatetRedstone(fillx,filly-1,fillz-1);
|
||||
CalculatetRedstone(fillx,filly-1,fillz+1);
|
||||
|
||||
LightRedstone(fillx-1,filly+1,fillz);
|
||||
LightRedstone(fillx+1,filly+1,fillz);
|
||||
LightRedstone(fillx,filly+1,fillz-1);
|
||||
LightRedstone(fillx,filly+1,fillz+1);
|
||||
CalculatetRedstone(fillx-1,filly+1,fillz);
|
||||
CalculatetRedstone(fillx+1,filly+1,fillz);
|
||||
CalculatetRedstone(fillx,filly+1,fillz-1);
|
||||
CalculatetRedstone(fillx,filly+1,fillz+1);
|
||||
}
|
||||
|
||||
}
|
@ -22,8 +22,8 @@ static char RepeaterRotationToMetaData( float a_Rotation )
|
||||
}
|
||||
|
||||
|
||||
void LightRedstone( int, int, int );
|
||||
void ChangeRedstoneTorch( int, int, int, bool );
|
||||
void CalculatetRedstone( int, int, int );
|
||||
void ChangeRedstone( int, int, int, bool );
|
||||
|
||||
|
||||
cWorld* m_World;
|
||||
|
Loading…
Reference in New Issue
Block a user