summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authoradmin@omencraft.com <admin@omencraft.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2011-11-04 06:01:55 +0100
committeradmin@omencraft.com <admin@omencraft.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2011-11-04 06:01:55 +0100
commitd2b1aea018650c570e405b5ebb58de3f5b85054e (patch)
tree9dfbcb6bc841ac1e4639b0d4160019524666a499 /source
parentFixed some redstone items and a bug that prevented floats from client to server packets reading correctly on 64 bit linux. (diff)
downloadcuberite-d2b1aea018650c570e405b5ebb58de3f5b85054e.tar
cuberite-d2b1aea018650c570e405b5ebb58de3f5b85054e.tar.gz
cuberite-d2b1aea018650c570e405b5ebb58de3f5b85054e.tar.bz2
cuberite-d2b1aea018650c570e405b5ebb58de3f5b85054e.tar.lz
cuberite-d2b1aea018650c570e405b5ebb58de3f5b85054e.tar.xz
cuberite-d2b1aea018650c570e405b5ebb58de3f5b85054e.tar.zst
cuberite-d2b1aea018650c570e405b5ebb58de3f5b85054e.zip
Diffstat (limited to 'source')
-rw-r--r--source/cClientHandle.cpp32
-rw-r--r--source/cClientHandle.h1
-rw-r--r--source/cRedstone.cpp79
-rw-r--r--source/cRedstone.h108
-rw-r--r--source/cRedstoneRepeater.h20
5 files changed, 215 insertions, 25 deletions
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