World.cpp 2.6 KB

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