BlockType.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "BlockType.h"
  2. #include "ItemType.h"
  3. #include "BasicBlocks.h"
  4. using namespace Framework;
  5. BlockType::BlockType( int id )
  6. : ReferenceCounter(),
  7. id( id )
  8. {
  9. StaticRegistry<BlockType>::INSTANCE.registerT( this, id );
  10. }
  11. void BlockType::loadSuperBlock( Block *zBlock, Framework::StreamReader *zReader )
  12. {
  13. zBlock->loadInventory( zReader );
  14. zReader->lese( (char *)&zBlock->transparent, 1 );
  15. zReader->lese( (char *)&zBlock->passable, 1 );
  16. zReader->lese( (char *)&zBlock->hp, 4 );
  17. zReader->lese( (char *)&zBlock->maxHP, 4 );
  18. zReader->lese( (char *)&zBlock->hardness, 4 );
  19. zReader->lese( (char *)&zBlock->speedModifier, 4 );
  20. int effectiveToolId;
  21. zReader->lese( (char *)&effectiveToolId, 4 );
  22. zBlock->zTool = StaticRegistry<ItemType>::INSTANCE.zElement( effectiveToolId );
  23. }
  24. void BlockType::saveSuperBlock( Block *zBlock, Framework::StreamWriter *zWriter )
  25. {
  26. zBlock->saveInventory( zWriter );
  27. zWriter->schreibe( (char *)&zBlock->transparent, 1 );
  28. zWriter->schreibe( (char *)&zBlock->passable, 1 );
  29. zWriter->schreibe( (char *)&zBlock->hp, 4 );
  30. zWriter->schreibe( (char *)&zBlock->maxHP, 4 );
  31. zWriter->schreibe( (char *)&zBlock->hardness, 4 );
  32. zWriter->schreibe( (char *)&zBlock->speedModifier, 4 );
  33. int effectiveToolId = zBlock->zTool->getId();
  34. zWriter->schreibe( (char *)&effectiveToolId, 4 );
  35. }
  36. void BlockType::createSuperBlock( Block *zBlock, Item *zItem )
  37. {
  38. BasicBlockItem *item = dynamic_cast<BasicBlockItem *>( zItem );
  39. if( !item )
  40. {
  41. throw "BlockType::createSuperBlock was called with an item witch was not an instance of BasicBlockItem";
  42. }
  43. zBlock->transparent = item->transparent;
  44. zBlock->passable = item->passable;
  45. zBlock->hp = item->hp;
  46. zBlock->maxHP = item->maxHP;
  47. zBlock->hardness = item->hardness;
  48. zBlock->speedModifier = item->speedModifier;
  49. zBlock->zTool = StaticRegistry<ItemType>::INSTANCE.zElement( item->toolId );
  50. }
  51. void BlockType::createSuperItem( Block *zBlock, Item *zItem )
  52. {
  53. BasicBlockItem *item = dynamic_cast<BasicBlockItem *>( zItem );
  54. if( !item )
  55. {
  56. throw "BlockType::createSuperItem was called with an item witch was not an instance of BasicBlockItem";
  57. }
  58. item->transparent = zBlock->transparent;
  59. item->passable = zBlock->passable;
  60. item->hp = zBlock->maxHP; // reset hp
  61. item->maxHP = zBlock->maxHP;
  62. item->hardness = zBlock->hardness;
  63. item->speedModifier = zBlock->speedModifier;
  64. item->toolId = zBlock->zTool->getId();
  65. }
  66. Block *BlockType::loadBlock( Framework::Vec3<int> position, Game *zTarget, Framework::StreamReader *zReader )
  67. {
  68. Block *result = createBlock( position, zTarget );
  69. loadSuperBlock( result, zReader );
  70. return result;
  71. }
  72. void BlockType::saveBlock( Block *zBlock, Framework::StreamWriter *zWriter )
  73. {
  74. saveSuperBlock( zBlock, zWriter );
  75. }
  76. Item *BlockType::getItemFromBlock( Block *zBlock, Game *zTarget )
  77. {
  78. Item *result = createItem( zTarget );
  79. createSuperItem( zBlock, result );
  80. return result;
  81. }
  82. Block *BlockType::createBlockAt( Framework::Vec3<int> position, Game *zTarget, Item *zUsedItem )
  83. {
  84. Block *result = createBlock( position, zTarget );
  85. createSuperBlock( result, zUsedItem );
  86. return result;
  87. }
  88. int BlockType::getId() const
  89. {
  90. return id;
  91. }