Added some Metadate rotaters using templated Mixin
This commit is contained in:
parent
9c6d72a023
commit
84913299f4
@ -4,6 +4,7 @@
|
|||||||
#include "BlockHandler.h"
|
#include "BlockHandler.h"
|
||||||
#include "ChunkInterface.h"
|
#include "ChunkInterface.h"
|
||||||
#include "WorldInterface.h"
|
#include "WorldInterface.h"
|
||||||
|
#include "MetaRotater.h"
|
||||||
#include "../Entities/Player.h"
|
#include "../Entities/Player.h"
|
||||||
|
|
||||||
|
|
||||||
@ -11,11 +12,11 @@
|
|||||||
|
|
||||||
|
|
||||||
class cBlockBedHandler :
|
class cBlockBedHandler :
|
||||||
public cBlockHandler
|
public cMetaRotater<cBlockHandler,0x3,0x02,0x03,0x00,0x01>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cBlockBedHandler(BLOCKTYPE a_BlockType)
|
cBlockBedHandler(BLOCKTYPE a_BlockType)
|
||||||
: cBlockHandler(a_BlockType)
|
: cMetaRotater<cBlockHandler,0x3,0x02,0x03,0x00,0x01>(a_BlockType)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,11 +7,11 @@
|
|||||||
|
|
||||||
|
|
||||||
class cBlockButtonHandler :
|
class cBlockButtonHandler :
|
||||||
public cBlockHandler
|
public cMetaRotater<cBlockHandler,0x07,0x04,0x01,0x03,0x02>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cBlockButtonHandler(BLOCKTYPE a_BlockType)
|
cBlockButtonHandler(BLOCKTYPE a_BlockType)
|
||||||
: cBlockHandler(a_BlockType)
|
: cMetaRotater<cBlockHandler,0x07,0x04,0x01,0x03,0x02>(a_BlockType)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,11 +10,11 @@
|
|||||||
|
|
||||||
|
|
||||||
class cBlockChestHandler :
|
class cBlockChestHandler :
|
||||||
public cBlockEntityHandler
|
public cMetaRotater<cBlockEntityHandler,0x07,0x04,0x01,0x03,0x02>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cBlockChestHandler(BLOCKTYPE a_BlockType)
|
cBlockChestHandler(BLOCKTYPE a_BlockType)
|
||||||
: cBlockEntityHandler(a_BlockType)
|
: cMetaRotater<cBlockEntityHandler,0x07,0x02,0x05,0x03,0x04>(a_BlockType)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,11 +9,11 @@
|
|||||||
|
|
||||||
|
|
||||||
class cBlockComparatorHandler :
|
class cBlockComparatorHandler :
|
||||||
public cBlockHandler
|
public cMetaRotater<cBlockHandler,0x03,0x00,0x01,0x02,0x03>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cBlockComparatorHandler(BLOCKTYPE a_BlockType)
|
cBlockComparatorHandler(BLOCKTYPE a_BlockType)
|
||||||
: cBlockHandler(a_BlockType)
|
: cMetaRotater<cBlockHandler,0x03,0x00,0x01,0x02,0x03>(a_BlockType)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
|
|
||||||
cBlockDoorHandler::cBlockDoorHandler(BLOCKTYPE a_BlockType)
|
cBlockDoorHandler::cBlockDoorHandler(BLOCKTYPE a_BlockType)
|
||||||
: cBlockHandler(a_BlockType)
|
: super(a_BlockType)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,8 +9,9 @@
|
|||||||
|
|
||||||
|
|
||||||
class cBlockDoorHandler :
|
class cBlockDoorHandler :
|
||||||
public cBlockHandler
|
public cMetaRotater<cBlockHandler,0x03,0x01,0x02,0x03,0x00>
|
||||||
{
|
{
|
||||||
|
typedef super cMetaRotater<cBlockHandler,0x03,0x01,0x02,0x03,0x00>;
|
||||||
public:
|
public:
|
||||||
cBlockDoorHandler(BLOCKTYPE a_BlockType);
|
cBlockDoorHandler(BLOCKTYPE a_BlockType);
|
||||||
|
|
||||||
@ -167,6 +168,60 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) override
|
||||||
|
{
|
||||||
|
if (a_Meta & 0x08)
|
||||||
|
{
|
||||||
|
return a_Meta;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return super::MetaRotateCCW(a_Meta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
virtual NIBBLETYPE MetaRotateCW(NIBBLETYPE a_Meta) override
|
||||||
|
{
|
||||||
|
if (a_Meta & 0x08)
|
||||||
|
{
|
||||||
|
return a_Meta;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return super::MetaRotateCW(a_Meta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
virtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta) override
|
||||||
|
{
|
||||||
|
if (a_Meta & 0x08)
|
||||||
|
{
|
||||||
|
return a_Meta;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return super::MetaMirrorXY(a_Meta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
virtual NIBBLETYPE MetaMirrorYZ(NIBBLETYPE a_Meta) override
|
||||||
|
{
|
||||||
|
if (a_Meta & 0x08)
|
||||||
|
{
|
||||||
|
return a_Meta;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return super::MetaMirrorYZ(a_Meta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,11 +12,11 @@
|
|||||||
|
|
||||||
|
|
||||||
class cBlockDropSpenserHandler :
|
class cBlockDropSpenserHandler :
|
||||||
public cBlockEntityHandler
|
public cMetaRotater<cBlockEntityHandler,0x07,0x02,0x05,0x03,0x04>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cBlockDropSpenserHandler(BLOCKTYPE a_BlockType) :
|
cBlockDropSpenserHandler(BLOCKTYPE a_BlockType) :
|
||||||
cBlockEntityHandler(a_BlockType)
|
cMetaRotater<cBlockEntitHandler,0x07,0x02,0x05,0x03,0x04>(a_BlockType)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,6 +34,20 @@ public:
|
|||||||
a_BlockMeta = cPiston::RotationPitchToMetaData(a_Player->GetYaw(), a_Player->GetPitch());
|
a_BlockMeta = cPiston::RotationPitchToMetaData(a_Player->GetYaw(), a_Player->GetPitch());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual NIBBLETYPE MetaMirrorXZ(NIBBLETYPE a_Meta) override
|
||||||
|
{
|
||||||
|
// Bit 0x08 is a flag. Lowest three bits are position. 0x08 == 1000
|
||||||
|
NIBBLETYPE OtherMeta = a_Meta & 0x08;
|
||||||
|
// Mirrors defined by by a table. (Source, mincraft.gamepedia.com) 0x07 == 0111
|
||||||
|
switch (a_Meta & 0x07)
|
||||||
|
{
|
||||||
|
case 0x00: return 0x01 + OtherMeta; // Down -> Up
|
||||||
|
case 0x01: return 0x00 + OtherMeta; // Up -> Down
|
||||||
|
}
|
||||||
|
// Not Facing Up or Down; No change.
|
||||||
|
return a_Meta;
|
||||||
|
}
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,11 +8,11 @@
|
|||||||
|
|
||||||
|
|
||||||
class cBlockEnderchestHandler :
|
class cBlockEnderchestHandler :
|
||||||
public cBlockEntityHandler
|
public cMetaRotater<cBlockEntityHandler,0x07,0x02,0x05,0x03,0x04>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cBlockEnderchestHandler(BLOCKTYPE a_BlockType)
|
cBlockEnderchestHandler(BLOCKTYPE a_BlockType)
|
||||||
: cBlockEntityHandler(a_BlockType)
|
: cMetaRotater<cBlockEntityHandler,0x07,0x02,0x05,0x03,0x04>(a_BlockType)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,11 +8,11 @@
|
|||||||
|
|
||||||
|
|
||||||
class cBlockFenceGateHandler :
|
class cBlockFenceGateHandler :
|
||||||
public cBlockHandler
|
public cMetaRotater<cBlockHandler,0x03,0x02,0x03,0x00,0x01>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cBlockFenceGateHandler(BLOCKTYPE a_BlockType) :
|
cBlockFenceGateHandler(BLOCKTYPE a_BlockType) :
|
||||||
cBlockHandler(a_BlockType)
|
cMetaRotater<cBlockHandler,0x03,0x02,0x03,0x00,0x01>(a_BlockType)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
82
src/Blocks/MetaRotater.h
Normal file
82
src/Blocks/MetaRotater.h
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
template<class Base, NIBBLETYPE BitFilter, NIBBLETYPE North, NIBBLETYPE East, NIBBLETYPE South, NIBBLETYPE West>
|
||||||
|
class cMetaRotater : public Base
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
cMetaRotater(BLOCKTYPE a_BlockType) :
|
||||||
|
Base(a_BlockType)
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual ~cMetaRotater() {}
|
||||||
|
|
||||||
|
virtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) override;
|
||||||
|
virtual NIBBLETYPE MetaRotateCW(NIBBLETYPE a_Meta) override;
|
||||||
|
virtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta) override;
|
||||||
|
virtual NIBBLETYPE MetaMirrorYZ(NIBBLETYPE a_Meta) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<class Base, NIBBLETYPE BitFilter, NIBBLETYPE North, NIBBLETYPE East, NIBBLETYPE South, NIBBLETYPE West>
|
||||||
|
NIBBLETYPE cMetaRotater<Base, BitFilter, North, East, South, West>::MetaRotateCW(NIBBLETYPE a_Meta)
|
||||||
|
{
|
||||||
|
NIBBLETYPE OtherMeta = a_Meta & (~BitFilter);
|
||||||
|
switch (a_Meta & BitFilter)
|
||||||
|
{
|
||||||
|
case South: return West | OtherMeta;
|
||||||
|
case West: return North | OtherMeta;
|
||||||
|
case North: return East | OtherMeta;
|
||||||
|
case East: return South | OtherMeta;
|
||||||
|
}
|
||||||
|
ASSERT(!"Invalid Meta value");
|
||||||
|
return a_Meta;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Base, NIBBLETYPE BitFilter, NIBBLETYPE North, NIBBLETYPE East, NIBBLETYPE South, NIBBLETYPE West>
|
||||||
|
NIBBLETYPE cMetaRotater<Base, BitFilter, North, East, South, West>::MetaRotateCCW(NIBBLETYPE a_Meta)
|
||||||
|
{
|
||||||
|
NIBBLETYPE OtherMeta = a_Meta & (~BitFilter);
|
||||||
|
switch (a_Meta & BitFilter)
|
||||||
|
{
|
||||||
|
case South: return East | OtherMeta;
|
||||||
|
case East: return North | OtherMeta;
|
||||||
|
case North: return West | OtherMeta;
|
||||||
|
case West: return South | OtherMeta;
|
||||||
|
}
|
||||||
|
ASSERT(!"Invalid Meta value");
|
||||||
|
return a_Meta;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<class Base, NIBBLETYPE BitFilter, NIBBLETYPE North, NIBBLETYPE East, NIBBLETYPE South, NIBBLETYPE West>
|
||||||
|
NIBBLETYPE cMetaRotater<Base, BitFilter, North, East, South, West>::MetaMirrorXY(NIBBLETYPE a_Meta)
|
||||||
|
{
|
||||||
|
NIBBLETYPE OtherMeta = a_Meta & (~BitFilter);
|
||||||
|
switch (a_Meta & BitFilter)
|
||||||
|
{
|
||||||
|
case South: return North | OtherMeta;
|
||||||
|
case North: return South | OtherMeta;
|
||||||
|
}
|
||||||
|
// Not Facing North or South; No change.
|
||||||
|
return a_Meta;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<class Base, NIBBLETYPE BitFilter, NIBBLETYPE North, NIBBLETYPE East, NIBBLETYPE South, NIBBLETYPE West>
|
||||||
|
NIBBLETYPE cMetaRotater<Base, BitFilter, North, East, South, West>::MetaMirrorYZ(NIBBLETYPE a_Meta)
|
||||||
|
{
|
||||||
|
NIBBLETYPE OtherMeta = a_Meta & (~BitFilter);
|
||||||
|
switch (a_Meta & BitFilter)
|
||||||
|
{
|
||||||
|
case West: return East | OtherMeta;
|
||||||
|
case East: return West | OtherMeta;
|
||||||
|
}
|
||||||
|
// Not Facing East or West; No change.
|
||||||
|
return a_Meta;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user