BasicBlock.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "AddEntityUpdate.h"
  2. #include "BasicBlocks.h"
  3. #include "Game.h"
  4. #include "ItemEntity.h"
  5. #include "TreeSeblingBlock.h"
  6. BasicBlock::BasicBlock(int typeId, ItemType* zTool, Framework::Vec3<int> pos)
  7. : BasicBlock(typeId, zTool, pos, false)
  8. {}
  9. BasicBlock::BasicBlock(
  10. int typeId, ItemType* zTool, Framework::Vec3<int> pos, bool hasInventory)
  11. : Block(typeId, zTool, pos, hasInventory)
  12. {}
  13. bool BasicBlock::onTick(TickQueue* zQueue, int numTicks, bool& blocked)
  14. {
  15. return 0;
  16. }
  17. void BasicBlock::onPostTick() {}
  18. AdditionalItemSpawningBlock::AdditionalItemSpawningBlock(
  19. int typeId, ItemType* zTool, Framework::Vec3<int> pos)
  20. : BasicBlock(typeId, zTool, pos)
  21. {}
  22. void AdditionalItemSpawningBlock::addSpawn(SpawnConfig config)
  23. {
  24. spawns.add(config);
  25. }
  26. void AdditionalItemSpawningBlock::onDestroy()
  27. {
  28. for (const SpawnConfig& config : spawns)
  29. {
  30. if ((double)rand() / RAND_MAX < config.chance)
  31. {
  32. int amount = config.min
  33. + (int)((config.max - config.min)
  34. * ((double)rand() / RAND_MAX));
  35. if (amount > 0)
  36. {
  37. ItemStack* spawnedItems = StaticRegistry<ItemType>::INSTANCE
  38. .zElement(config.itemType)
  39. ->createItemStack(amount);
  40. if (spawnedItems)
  41. {
  42. ItemEntity* itemEntity
  43. = (ItemEntity*)StaticRegistry<EntityType>::INSTANCE
  44. .zElement(EntityTypeEnum::ITEM)
  45. ->createEntity(location
  46. + Framework::Vec3<float>(
  47. 0.5f, 0.5f, 0.5f),
  48. getDimensionId(),
  49. Game::INSTANCE->getNextEntityId());
  50. itemEntity->unsaveAddItem(spawnedItems, NO_DIRECTION, 0);
  51. spawnedItems->release();
  52. Game::INSTANCE->requestWorldUpdate(
  53. new AddEntityUpdate(itemEntity, getDimensionId()));
  54. }
  55. }
  56. }
  57. }
  58. BasicBlock::onDestroy();
  59. }
  60. BasicBlockType::BasicBlockType(
  61. int typeId, int itemTypeId, ModelInfo model, const char* name, int mapColor)
  62. : BasicBlockType(
  63. typeId,
  64. itemTypeId,
  65. model,
  66. [typeId](Framework::Vec3<int> pos) {
  67. return new BasicBlock(typeId, 0, pos);
  68. },
  69. name,
  70. mapColor)
  71. {}
  72. BasicBlockType::BasicBlockType(int typeId,
  73. int itemTypeId,
  74. ModelInfo model,
  75. std::function<Block*(Framework::Vec3<int>)> creatBlockCustom,
  76. const char* name,
  77. int mapColor)
  78. : BasicBlockType(
  79. typeId, itemTypeId, model, creatBlockCustom, name, mapColor, 0)
  80. {}
  81. BasicBlockType::BasicBlockType(int typeId,
  82. int itemTypeId,
  83. ModelInfo model,
  84. std::function<Block* (Framework::Vec3<int>)> creatBlockCustom,
  85. const char* name,
  86. int mapColor,
  87. bool modelSubscription)
  88. : BlockType(typeId, 0, model, 1, 100, 0, name, modelSubscription, mapColor),
  89. itemType(itemTypeId),
  90. transparent(0),
  91. passable(0),
  92. hardness(1.f),
  93. zTool(0),
  94. speedModifier(1.f),
  95. interactable(1),
  96. creatBlockCustom(creatBlockCustom)
  97. {}
  98. void BasicBlockType::createSuperBlock(Block* zBlock, Item* zItem) const
  99. {
  100. BasicBlock* block = dynamic_cast<BasicBlock*>(zBlock);
  101. block->transparent = transparent;
  102. block->passable = passable;
  103. block->hp = (float)getInitialMaxHP();
  104. block->maxHP = (float)getInitialMaxHP();
  105. block->hardness = hardness;
  106. block->zTool = zTool;
  107. block->speedModifier = speedModifier;
  108. block->interactable = interactable;
  109. BlockType::createSuperBlock(zBlock, zItem);
  110. }
  111. Block* BasicBlockType::createBlock(Framework::Vec3<int> position) const
  112. {
  113. return creatBlockCustom(position);
  114. }
  115. Item* BasicBlockType::createItem() const
  116. {
  117. return StaticRegistry<ItemType>::INSTANCE.zElement(itemType)->createItem();
  118. }
  119. BasicBlockType* BasicBlockType::setHardness(float hardness)
  120. {
  121. this->hardness = hardness;
  122. return this;
  123. }
  124. BasicBlockType* BasicBlockType::setTransparent(bool transparent)
  125. {
  126. this->transparent = transparent;
  127. return this;
  128. }