1
0
Fork 0

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
This commit is contained in:
admin@omencraft.com 2011-11-04 05:01:55 +00:00
parent ef99915447
commit d2b1aea018
6 changed files with 223 additions and 25 deletions

View File

@ -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

View File

@ -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:

View File

@ -7,6 +7,7 @@ class Game;
class cPacket;
class cChunk;
class cPlayer;
class cRedstone;
class cClientHandle // tolua_export
{ // tolua_export
public:

79
source/cRedstone.cpp Normal file
View File

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

108
source/cRedstone.h Normal file
View File

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

View File

@ -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