You can just send a message(packet) from client to server.
Then in your IMessageHandler, you can get the player instance from MessageContext.
You can make the player invisible with the instance.
Check if the metadata of the block to be replaced is 1(Granite).
If you cannot, please post the code.
EDIT: Do not use metadata. You might be able to get the state 'Granite', and just compare it with state of a block.
That is not an excuse. You should check the field:
Main.CastleWall1
Since you can still be able to break and place a block when the field with the block is null.
(Then you might be registered another new instance of a block.)
For each block with TileEntity on specific world position, there is a TileEntity matches the block.
So you can store data as normal field, and read and save the data using readFromNBT & writeToNBT
There are plenty of tutorials describing how to make TileEntity, so you would easily be able to make one.
You can scale the rendering using GL11.glScalef(float xScale, float yScale, float zScale).
Note that you should work on new matrix when scaling, using GL11.pushMatrix() and GL11.popMatrix().
(So pushMatix -> scale -> rendering -> popMatrix)