|
@@ -16,6 +16,73 @@ DimensionMap::~DimensionMap()
|
|
|
chunks->release();
|
|
|
}
|
|
|
|
|
|
+void DimensionMap::api(Framework::InMemoryBuffer* zRequest,
|
|
|
+ NetworkMessage* zResponse,
|
|
|
+ Entity* zSource,
|
|
|
+ Dimension* zDimension)
|
|
|
+{
|
|
|
+ char type;
|
|
|
+ zRequest->lese(&type, 1);
|
|
|
+ switch (type)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ {
|
|
|
+ Framework::Punkt location;
|
|
|
+ zRequest->lese((char*)&location.x, 4);
|
|
|
+ zRequest->lese((char*)&location.y, 4);
|
|
|
+ location = Game::getChunkCenter(location.x, location.y);
|
|
|
+ char addr[8];
|
|
|
+ zDimension->getAddrOfWorld(location, addr);
|
|
|
+ ChunkMap* res = getMap(addr, 8, location);
|
|
|
+
|
|
|
+ if (!res) res = new ChunkMap(location);
|
|
|
+ zResponse->sendMap(res);
|
|
|
+ zResponse->setUseBackground();
|
|
|
+ res->release();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 1:
|
|
|
+ {
|
|
|
+ cs.lock();
|
|
|
+ observers.add(zSource->getId());
|
|
|
+ cs.unlock();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 2:
|
|
|
+ {
|
|
|
+ cs.lock();
|
|
|
+ observers.removeValue(zSource->getId());
|
|
|
+ cs.unlock();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 3:
|
|
|
+ {
|
|
|
+ InMemoryBuffer buff;
|
|
|
+ int count = 0;
|
|
|
+ for (Entity* entity : *zDimension->entities)
|
|
|
+ {
|
|
|
+ if (entity->zType()->getId() == EntityTypeEnum::PLAYER)
|
|
|
+ {
|
|
|
+ Player* p = dynamic_cast<Player*>(entity);
|
|
|
+ char len = (char)textLength(p->getName());
|
|
|
+ buff.schreibe(&len, 1);
|
|
|
+ buff.schreibe(p->getName(), len);
|
|
|
+ Vec3<float> pos = p->getPosition();
|
|
|
+ buff.schreibe((char*)&pos.x, 4);
|
|
|
+ buff.schreibe((char*)&pos.y, 4);
|
|
|
+ buff.schreibe((char*)&pos.z, 4);
|
|
|
+ count++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ char* msg = new char[4 + buff.getSize()];
|
|
|
+ *(int*)msg = count;
|
|
|
+ buff.lese(msg + 4, (int)buff.getSize());
|
|
|
+ zResponse->sendPlayerPositions(msg, 4 + (int)buff.getSize());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
ChunkMap* DimensionMap::load(Framework::Punkt chunkCenter)
|
|
|
{
|
|
|
Framework::Datei file;
|
|
@@ -44,11 +111,58 @@ void DimensionMap::loadMap(char* addr, int addrLen, Chunk* zChunk)
|
|
|
return;
|
|
|
}
|
|
|
ChunkMap* map = load(zChunk->getCenter());
|
|
|
- if (!map) map = new ChunkMap(zChunk);
|
|
|
+ if (!map)
|
|
|
+ {
|
|
|
+ map = new ChunkMap(zChunk);
|
|
|
+ for (auto iterator = observers.begin(); iterator;)
|
|
|
+ {
|
|
|
+ Entity* e = Game::INSTANCE->zEntity(iterator.val());
|
|
|
+ if (!e)
|
|
|
+ {
|
|
|
+ iterator.remove();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ NetworkMessage* msg = new NetworkMessage();
|
|
|
+ msg->sendMap(map);
|
|
|
+ msg->setUseBackground();
|
|
|
+ Game::INSTANCE->sendMessage(msg, e);
|
|
|
+ }
|
|
|
+ iterator++;
|
|
|
+ }
|
|
|
+ }
|
|
|
chunks->set(addr, addrLen, map);
|
|
|
cs.unlock();
|
|
|
}
|
|
|
|
|
|
+void DimensionMap::onMapUpdated(char* addr, int addrLen)
|
|
|
+{
|
|
|
+ cs.lock();
|
|
|
+ ChunkMap* map = chunks->z(addr, addrLen);
|
|
|
+ if (map)
|
|
|
+ {
|
|
|
+ for (auto iterator = observers.begin(); iterator;)
|
|
|
+ {
|
|
|
+ Entity* e = Game::INSTANCE->zEntity(iterator.val());
|
|
|
+ if (!e)
|
|
|
+ {
|
|
|
+ iterator.remove();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ NetworkMessage* msg = new NetworkMessage();
|
|
|
+ msg->sendMap(map);
|
|
|
+ msg->setUseBackground();
|
|
|
+ Game::INSTANCE->sendMessage(msg, e);
|
|
|
+ }
|
|
|
+ iterator++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ cs.unlock();
|
|
|
+}
|
|
|
+
|
|
|
void DimensionMap::saveMap(char* addr, int addrLen)
|
|
|
{
|
|
|
cs.lock();
|