World.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include <Network.h>
  2. #include <Welt3D.h>
  3. #include "World.h"
  4. #include "Globals.h"
  5. #include "WorldUpdate.h"
  6. #include "Constants.h"
  7. using namespace Network;
  8. using namespace Framework;
  9. World::World( Bildschirm3D *zScreen )
  10. : Thread()
  11. {
  12. renderedWorld = new Welt3D();
  13. dimensions = new RCArray<Dimension>();
  14. currentPlayer = new CurrentPlayer();
  15. zScreenPtr = zScreen;
  16. kam = new Kam3D();
  17. kam->setWelt( renderedWorld );
  18. zScreen->addKamera( kam );
  19. start();
  20. }
  21. World::~World()
  22. {
  23. zScreenPtr->removeKamera( kam );
  24. dimensions->release();
  25. currentPlayer->release();
  26. }
  27. void World::update()
  28. {
  29. NetworkReader *serverMessageReader = 0;
  30. const char type = 0;
  31. while( serverMessageReader = network->zFactoryClient()->getNextMessage() )
  32. {
  33. serverMessageReader->lese( (char *)&type, 1 );
  34. if( type == 2 ) // WORLD UPDATE
  35. {
  36. int id = 0;
  37. serverMessageReader->lese( (char *)&id, 4 );
  38. StaticRegistry<WorldUpdateType>::INSTANCE.zElement( id )->applyUpdate( serverMessageReader );
  39. }
  40. if( type == 3 ) // API MESSAGE
  41. {
  42. // TODO: process messages
  43. }
  44. if( type == 4 ) // POSITION UPDATE
  45. {
  46. Vec3<float> pos, dir;
  47. serverMessageReader->lese( (char *)&pos.x, 4 );
  48. serverMessageReader->lese( (char *)&pos.y, 4 );
  49. serverMessageReader->lese( (char *)&pos.z, 4 );
  50. kam->setPosition( pos );
  51. serverMessageReader->lese( (char *)&dir.x, 4 );
  52. serverMessageReader->lese( (char *)&dir.y, 4 );
  53. dir.z = 0;
  54. if( dir.getLengthSq() > 0 )
  55. kam->setAusrichtung( pos + dir * 10 );
  56. }
  57. }
  58. }
  59. void World::setChunk( Chunk *chunk, int dimensionId )
  60. {
  61. Dimension *zDim = zDimension( dimensionId );
  62. if( !zDim )
  63. {
  64. zDim = new Dimension( dimensionId );
  65. dimensions->add( zDim );
  66. }
  67. zDim->addChunk( chunk );
  68. zDim->updateVisibility();
  69. }
  70. void World::thread()
  71. {
  72. while( true )
  73. {
  74. zScreenPtr->lock();
  75. if( currentGame != this )
  76. {
  77. zScreenPtr->unlock();
  78. return;
  79. }
  80. update();
  81. zScreenPtr->unlock();
  82. Sleep( 10 );
  83. }
  84. }
  85. Block *World::zBlockAt( Framework::Vec3<int> location, int dimension ) const
  86. {
  87. Dimension *dim = zDimension( dimension );
  88. if( dim )
  89. return dim->zBlock( location );
  90. return 0;
  91. }
  92. Dimension *World::zDimension( int id ) const
  93. {
  94. for( auto dim = dimensions->getIterator(); dim; dim++ )
  95. {
  96. if( dim->getDimensionId() == id )
  97. return dim;
  98. }
  99. return 0;
  100. }
  101. void World::setVisibility( Framework::Model3D *zModel, bool visible )
  102. {
  103. if( visible )
  104. renderedWorld->addZeichnung( dynamic_cast<Framework::Model3D *>(zModel->getThis()) );
  105. else
  106. renderedWorld->removeZeichnung( zModel );
  107. }
  108. Framework::Bildschirm3D *World::zScreen() const
  109. {
  110. return zScreenPtr;
  111. }
  112. Framework::Punkt World::getChunkCenter( int x, int y ) const
  113. {
  114. return Punkt( (x / CHUNK_SIZE) * CHUNK_SIZE + (x < 0 ? -CHUNK_SIZE : CHUNK_SIZE) / 2, (y / CHUNK_SIZE) * CHUNK_SIZE + (y < 0 ? -CHUNK_SIZE : CHUNK_SIZE) / 2 );
  115. }