Esempio n. 1
0
NBT_Value* Furnace::getSlotEntity(int8_t slotNumber)
{
  // Return null of we don't have anything in this slot
  if(m_slots[slotNumber].count == 0)
  {
    return NULL;
  }

  // Create a new slot NBT entity and add it's data
  NBT_Value* slot = new NBT_Value(NBT_Value::TAG_COMPOUND);
  slot->Insert("Count", new NBT_Value(m_slots[slotNumber].count));
  slot->Insert("Damage", new NBT_Value(m_slots[slotNumber].damage));
  slot->Insert("Slot", new NBT_Value(slotNumber));
  slot->Insert("id", new NBT_Value(m_slots[slotNumber].id));

  return slot;
}
Esempio n. 2
0
void Map::initMap()
{
#ifdef MSDBG
  printf("initMap()\n");
#endif

  this->mapDirectory = Conf::get().sValue("mapdir");
  if(this->mapDirectory == "Not found!")
  {
    std::cout << "Error, mapdir not defined!" << std::endl;
    exit(EXIT_FAILURE);
  }

  std::string infile = mapDirectory+"/level.dat";

  struct stat stFileInfo;
  if(stat(infile.c_str(), &stFileInfo) != 0)
  {
    std::cout << "Error, map not found!" << std::endl;
    exit(EXIT_FAILURE);
  }

  NBT_Value *root = NBT_Value::LoadFromFile(infile);

  NBT_Value &data = *((*root)["Data"]);

  spawnPos.x() = (sint32)*data["SpawnX"];
  spawnPos.y() = (sint32)*data["SpawnY"];
  spawnPos.z() = (sint32)*data["SpawnZ"];


  root->SaveToFile("test.nbt");

  delete root;

  std::cout << "Spawn: (" << spawnPos.x() << "," << spawnPos.y() << "," << spawnPos.z() << ")"<<
  std::endl;
}
Esempio n. 3
0
void BlockChest::onStartedDigging(User* user, int8_t status, int32_t x, int16_t y, int32_t z, int map, int8_t direction)
{
  // Locksystem
  if (user->inv[36 + user->currentItemSlot()].getType() == ITEM_WOODEN_AXE)
  {
    int chunk_x = blockToChunk(x);
    int chunk_z = blockToChunk(z);

    sChunk* chunk = ServerInstance->map(map)->loadMap(chunk_x, chunk_z);

    if (chunk == NULL)
    {
      return;
    }

    NBT_Value* entityList = (*(*(chunk->nbt))["Level"])["TileEntities"];

    if (!entityList)
    {
      entityList = new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND);
      chunk->nbt->Insert("TileEntities", entityList);
    }

    if (entityList->GetType() == NBT_Value::TAG_LIST)
    {
      if (entityList->GetListType() != NBT_Value::TAG_COMPOUND)
      {
        entityList->SetType(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND);
      }

      std::vector<NBT_Value*> *entities = entityList->GetList();
      std::vector<NBT_Value*>::iterator iter = entities->begin(), end = entities->end();

      //bool done = false; // Unused variable

      for (; iter != end; iter++)
      {
        if ((**iter)["x"] == NULL || (**iter)["y"] == NULL || (**iter)["z"] == NULL ||
            (**iter)["x"]->GetType() != NBT_Value::TAG_INT ||
            (**iter)["y"]->GetType() != NBT_Value::TAG_INT ||
            (**iter)["z"]->GetType() != NBT_Value::TAG_INT)
        {
          continue;
        }

        if ((int32_t)(*(**iter)["x"]) == x && (int32_t)(*(**iter)["y"]) == y && (int32_t)(*(**iter)["z"]) == z)
        {
          int8_t locked;
          NBT_Value* nbtLockdata = (**iter)["Lockdata"];
          if (nbtLockdata != NULL)
          {
            std::string player = *(*nbtLockdata)["player"]->GetString();
            // Toggle lock if player is the owner of block
            if (player == user->nick)
            {
              locked = *(*nbtLockdata)["locked"];
              locked = (locked == 1) ? 0 : 1;
              *(*nbtLockdata)["locked"] = locked;

              if (locked == 1)
              {
                ServerInstance->chat()->sendMsg(user, MC_COLOR_RED + "Chest locked", Chat::USER);
              }
              else
              {
                ServerInstance->chat()->sendMsg(user, MC_COLOR_RED + "Chest opened", Chat::USER);
              }

            }
          }
          else
          {
            // If lockdata is missing (old chest)
            NBT_Value* nbtLock = new NBT_Value(NBT_Value::TAG_COMPOUND);
            nbtLock->Insert("player", new NBT_Value(user->nick));
            nbtLock->Insert("locked", new NBT_Value((int8_t)1));
            (*iter)->Insert("Lockdata", nbtLock);
          }
          break;
        }
      }
    }
  }
}
Esempio n. 4
0
void NetherGen::generateChunk(int x, int z, int map)
{
  NBT_Value* main = new NBT_Value(NBT_Value::TAG_COMPOUND);
  NBT_Value* val = new NBT_Value(NBT_Value::TAG_COMPOUND);

  val->Insert("Sections", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND)); 

  val->Insert("HeightMap", new NBT_Value(heightmap));
  val->Insert("Entities", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND));
  val->Insert("TileEntities", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND));
  val->Insert("LastUpdate", new NBT_Value((int64_t)time(NULL)));
  val->Insert("xPos", new NBT_Value(x));
  val->Insert("zPos", new NBT_Value(z));
  val->Insert("TerrainPopulated", new NBT_Value((char)1));

  main->Insert("Level", val);

  /*  uint32_t chunkid;
  ServerInstance->map()->posToId(x, z, &chunkid);

  ServerInstance->map()->maps[chunkid].x = x;
  ServerInstance->map()->maps[chunkid].z = z; */

  sChunk* chunk = new sChunk();
  //chunk->blocks = &((*t_blocks)[0]);
  //chunk->data = &((*t_data)[0]);
  //chunk->blocklight = &((*t_blocklight)[0]);
  //chunk->skylight = &((*t_skylight)[0]);
  chunk->heightmap = &(heightmap[0]);
  chunk->nbt = main;
  chunk->x = x;
  chunk->z = z;

  ServerInstance->map(map)->chunks.insert(ChunkMap::value_type(ChunkMap::key_type(x, z), chunk));

  memset(chunk->blocks, 0, 16*16*256);
  memset(chunk->addblocks, 0, 16*16*256/2);
  memset(chunk->data, 0, 16*16*256/2);
  memset(chunk->blocklight, 0, 16*16*256/2);
  memset(chunk->skylight, 0, 16*16*256/2);
  chunk->chunks_present = 0xffff;

  generateWithNoise(x, z, map);

  // Update last used time
  //ServerInstance->map()->mapLastused[chunkid] = (int)time(0);

  // Not changed
  //ServerInstance->map()->mapChanged[chunkid] = ServerInstance->config()->bData("save_unchanged_chunks");

  //ServerInstance->map()->maps[chunkid].nbt = main;

  if (addOre)
  {
    AddOre(x, z, map, BLOCK_GLOWSTONE);
    AddOre(x, z, map, BLOCK_STATIONARY_LAVA);
  }

  // Add trees
  if (addTrees)
  {
    AddTrees(x, z, map,  fastrand() % 2 + 3);
  }

  if (expandBeaches)
  {
    ExpandBeaches(x, z, map);
  }

}
Esempio n. 5
0
void MapGen::generateChunk(int x, int z, int map)
{
  NBT_Value *main = new NBT_Value(NBT_Value::TAG_COMPOUND);
  NBT_Value *val = new NBT_Value(NBT_Value::TAG_COMPOUND);

  val->Insert("Blocks", new NBT_Value(blocks));
  val->Insert("Data", new NBT_Value(blockdata));
  val->Insert("SkyLight", new NBT_Value(skylight));
  val->Insert("BlockLight", new NBT_Value(blocklight));
  val->Insert("HeightMap", new NBT_Value(heightmap));
  val->Insert("Entities", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND));
  val->Insert("TileEntities", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND));
  val->Insert("LastUpdate", new NBT_Value((int64_t)time(NULL)));
  val->Insert("xPos", new NBT_Value(x));
  val->Insert("zPos", new NBT_Value(z));
  val->Insert("TerrainPopulated", new NBT_Value((int8_t)1));

  main->Insert("Level", val);

  /*  uint32_t chunkid;
  Mineserver::get()->map()->posToId(x, z, &chunkid);

  Mineserver::get()->map()->maps[chunkid].x = x;
  Mineserver::get()->map()->maps[chunkid].z = z; */

  std::vector<uint8_t> *t_blocks = (*val)["Blocks"]->GetByteArray();
  std::vector<uint8_t> *t_data = (*val)["Data"]->GetByteArray();
  std::vector<uint8_t> *t_blocklight = (*val)["BlockLight"]->GetByteArray();
  std::vector<uint8_t> *t_skylight = (*val)["SkyLight"]->GetByteArray();
  std::vector<uint8_t> *heightmap = (*val)["HeightMap"]->GetByteArray();

  sChunk *chunk = new sChunk();
  chunk->blocks = &((*t_blocks)[0]);
  chunk->data = &((*t_data)[0]);
  chunk->blocklight = &((*t_blocklight)[0]);
  chunk->skylight = &((*t_skylight)[0]);
  chunk->heightmap = &((*heightmap)[0]);
  chunk->nbt = main;
  chunk->x = x;
  chunk->z = z;
  Mineserver::get()->map(map)->chunks.linkChunk(chunk, x, z);
  if(Mineserver::get()->config()->bData("mapgen.flatgrass"))
    generateFlatgrass(x, z, map);
  else
    generateWithNoise(x, z, map);


  // Update last used time
  //Mineserver::get()->map()->mapLastused[chunkid] = (int)time(0);

  // Not changed
  chunk->changed = Mineserver::get()->config()->bData("map.save_unchanged_chunks");

  //Mineserver::get()->map()->maps[chunkid].nbt = main;
  
  if(addOre)
  {
    AddOre(x, z, map, BLOCK_COAL_ORE);
    AddOre(x, z, map, BLOCK_IRON_ORE);
    AddOre(x, z, map, BLOCK_GOLD_ORE);
    AddOre(x, z, map, BLOCK_DIAMOND_ORE);
    AddOre(x, z, map, BLOCK_REDSTONE_ORE);
    AddOre(x, z, map, BLOCK_LAPIS_ORE);
  }
  
  AddOre(x, z, map, BLOCK_GRAVEL);
  
  // Add trees
  if(addTrees)
    AddTrees(x, z, map);  // add trees will make a *kind-of* forest of 16*16 chunks
    
  if(expandBeaches)
    ExpandBeaches(x, z, map);
    
}
Esempio n. 6
0
void HeavenGen::generateChunk(int x, int z, int map)
{
  NBT_Value* main = new NBT_Value(NBT_Value::TAG_COMPOUND);
  NBT_Value* val = new NBT_Value(NBT_Value::TAG_COMPOUND);

  generateWithNoise(x, z, map);

  val->Insert("Blocks", new NBT_Value(heavenblocks));
  val->Insert("Data", new NBT_Value(blockdata));
  val->Insert("SkyLight", new NBT_Value(skylight));
  val->Insert("BlockLight", new NBT_Value(blocklight));
  val->Insert("HeightMap", new NBT_Value(heightmap));
  val->Insert("Entities", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND));
  val->Insert("TileEntities", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND));
  val->Insert("LastUpdate", new NBT_Value((int64_t)time(NULL)));
  val->Insert("xPos", new NBT_Value(x));
  val->Insert("zPos", new NBT_Value(z));
  val->Insert("TerrainPopulated", new NBT_Value((char)1));

  main->Insert("Level", val);

  /*  uint32_t chunkid;
  Mineserver::get()->map()->posToId(x, z, &chunkid);

  Mineserver::get()->map()->maps[chunkid].x = x;
  Mineserver::get()->map()->maps[chunkid].z = z; */

  std::vector<uint8_t> *t_blocks = (*val)["Blocks"]->GetByteArray();
  std::vector<uint8_t> *t_data = (*val)["Data"]->GetByteArray();
  std::vector<uint8_t> *t_blocklight = (*val)["BlockLight"]->GetByteArray();
  std::vector<uint8_t> *t_skylight = (*val)["SkyLight"]->GetByteArray();
  std::vector<uint8_t> *heightmap = (*val)["HeightMap"]->GetByteArray();

  sChunk* chunk = new sChunk();
  chunk->blocks = &((*t_blocks)[0]);
  chunk->data = &((*t_data)[0]);
  chunk->blocklight = &((*t_blocklight)[0]);
  chunk->skylight = &((*t_skylight)[0]);
  chunk->heightmap = &((*heightmap)[0]);
  chunk->nbt = main;
  chunk->x = x;
  chunk->z = z;

  Mineserver::get()->map(map)->chunks.linkChunk(chunk, x, z);

  // Update last used time
  //Mineserver::get()->map()->mapLastused[chunkid] = (int)time(0);

  // Not changed
  //Mineserver::get()->map()->mapChanged[chunkid] = Mineserver::get()->config()->bData("save_unchanged_chunks");

  //Mineserver::get()->map()->maps[chunkid].nbt = main;

  if (addOre)
  {
    AddOre(x, z, map, BLOCK_STATIONARY_WATER);
  }

  // Add trees
  if (addTrees)
  {
    AddTrees(x, z, map,  fastrand() % 2 + 3);
  }

  if (expandBeaches)
  {
    ExpandBeaches(x, z, map);
  }

}
Esempio n. 7
0
void NBT_Value::Write(std::vector<uint8> &buffer)
{
  int storeAt = buffer.size();;
  switch(m_type)
  {
  case TAG_BYTE:
    buffer.push_back(m_value.byteVal);
    break;
  case TAG_SHORT:
    buffer.resize(storeAt + 2);
    putSint16(&buffer[storeAt], m_value.shortVal);
    break;
  case TAG_INT:
    buffer.resize(storeAt + 4);
    putSint32(&buffer[storeAt], m_value.intVal);
    break;
  case TAG_LONG:
    buffer.resize(storeAt + 8);
    putSint64(&buffer[storeAt], m_value.longVal);
    break;
  case TAG_FLOAT:
    buffer.resize(storeAt + 4);
    putFloat(&buffer[storeAt], m_value.floatVal);
    break;
  case TAG_DOUBLE:
    buffer.resize(storeAt + 8);
    putDouble(&buffer[storeAt], m_value.doubleVal);
    break;
  case TAG_BYTE_ARRAY:
    {
      int arraySize = m_value.byteArrayVal ? m_value.byteArrayVal->size() : 0;
      buffer.resize(storeAt + 4 + arraySize);
      putSint32(&buffer[storeAt], arraySize);
      storeAt += 4;
      if(arraySize)
        memcpy(&buffer[storeAt], &(*m_value.byteArrayVal)[0], arraySize);
      break;
    }
  case TAG_STRING:
    {
      int stringLen = m_value.stringVal ? m_value.stringVal->size() : 0;
      buffer.resize(storeAt + 2 + stringLen);
      putSint16(&buffer[storeAt], (sint16)stringLen);
      storeAt += 2;
      if(stringLen>0)
        memcpy(&buffer[storeAt], m_value.stringVal->c_str(), stringLen);
      break;
    }
  case TAG_LIST:
    {
      buffer.resize(storeAt + 5);
      int listCount = m_value.listVal.data ? m_value.listVal.data->size() : 0;
      buffer[storeAt] = m_value.listVal.type;
      storeAt++;
      putSint32(&buffer[storeAt], listCount);
      for(int i=0;i<listCount;i++)
        (*m_value.listVal.data)[i]->Write(buffer);
      break;
    }
  case TAG_COMPOUND:
    {
      int compoundCount = m_value.compoundVal ? m_value.compoundVal->size() : 0;
      if(compoundCount)
      {
        std::map<std::string, NBT_Value*>::iterator iter = m_value.compoundVal->begin(), end = m_value.compoundVal->end();
        for( ; iter != end; iter++)
        {
          const std::string &key = iter->first;
          int keySize = key.size();
          NBT_Value *val = iter->second;
          int curPos = buffer.size();
          buffer.resize(curPos + 3 + keySize);
          buffer[curPos] = (uint8)val->GetType();
          curPos++;
          putSint16(&buffer[curPos], keySize);
          curPos += 2;
          if(keySize)
            memcpy(&buffer[curPos], key.c_str(), keySize);
          val->Write(buffer);
        }
      }
      buffer.push_back(TAG_END);
      break;
    }
  case TAG_END:
    break; //for completeness
  }
}
Esempio n. 8
0
void BiomeGen::generateChunk(int x, int z, int map)
{
  NBT_Value* main = new NBT_Value(NBT_Value::TAG_COMPOUND);
  NBT_Value* val = new NBT_Value(NBT_Value::TAG_COMPOUND);

  val->Insert("Sections", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND));

  val->Insert("HeightMap", new NBT_Value(heightmap));
  val->Insert("Entities", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND));
  val->Insert("TileEntities", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND));
  val->Insert("LastUpdate", new NBT_Value((int64_t)time(NULL)));
  val->Insert("xPos", new NBT_Value(x));
  val->Insert("zPos", new NBT_Value(z));
  val->Insert("TerrainPopulated", new NBT_Value((int8_t)1));

  main->Insert("Level", val);

  sChunk* chunk = new sChunk();
  //chunk->blocks = new uint8_t[16 * 16 * 256];
  //chunk->addblocks = new uint8_t[16 * 16 * 256 / 2];
  //chunk->data = new uint8_t[16 * 16 * 256 / 2];
  //chunk->blocklight = new uint8_t[16 * 16 * 256 / 2];
  //chunk->skylight = new uint8_t[16 * 16 * 256 / 2];
  chunk->heightmap = &((*(*val)["HeightMap"]->GetIntArray())[0]);
  heightmap_pointer = chunk->heightmap;
  chunk->nbt = main;
  chunk->x = x;
  chunk->z = z;

  memset(chunk->blocks, 0, 16*16*256);
  memset(chunk->addblocks, 0, 16*16*256/2);
  memset(chunk->data, 0, 16*16*256/2);
  memset(chunk->blocklight, 0, 16*16*256/2);
  memset(chunk->skylight, 0, 16*16*256/2);
  chunk->chunks_present = 0xffff;

  ServerInstance->map(map)->chunks.insert(ChunkMap::value_type(ChunkMap::key_type(x, z), chunk));

  if (ServerInstance->config()->bData("mapgen.flatgrass"))
  {
    generateFlatgrass(x, z, map);
  }
  else
  {
    generateWithNoise(x, z, map);
  }


  // Update last used time
  //ServerInstance->map()->mapLastused[chunkid] = (int)time(0);

  // Not changed
  chunk->changed = ServerInstance->config()->bData("map.save_unchanged_chunks");

  //ServerInstance->map()->maps[chunkid].nbt = main;

  if (addOre)
  {
    AddOre(x, z, map, BLOCK_COAL_ORE);
    AddOre(x, z, map, BLOCK_IRON_ORE);
    AddOre(x, z, map, BLOCK_GOLD_ORE);
    AddOre(x, z, map, BLOCK_DIAMOND_ORE);
    AddOre(x, z, map, BLOCK_REDSTONE_ORE);
    AddOre(x, z, map, BLOCK_LAPIS_ORE);
  }

  AddOre(x, z, map, BLOCK_GRAVEL);

  // Add trees
  if (addTrees)
  {
    AddTrees(x, z, map);  // add trees will make a *kind-of* forest of 16*16 chunks
  }

}
Esempio n. 9
0
bool User::saveData()
{
  std::string outfile = Map::get().mapDirectory+"/players/"+this->nick+".dat";
  // Try to create parent directories if necessary
  struct stat stFileInfo;
  if(stat(outfile.c_str(), &stFileInfo) != 0)
  {
    std::string outdir = Map::get().mapDirectory+"/players";

    if(stat(outdir.c_str(), &stFileInfo) != 0)
    {
#ifdef WIN32
      if(_mkdir(outdir.c_str()) == -1)
#else
      if(mkdir(outdir.c_str(), 0755) == -1)
#endif

        return false;
    }
  }

  NBT_Value val(NBT_Value::TAG_COMPOUND);
  val.Insert("OnGround", new NBT_Value((sint8)1));
  val.Insert("Air", new NBT_Value((sint16)300));
  val.Insert("AttackTime", new NBT_Value((sint16)0));
  val.Insert("DeathTime", new NBT_Value((sint16)0));
  val.Insert("Fire", new NBT_Value((sint16)-20));
  val.Insert("Health", new NBT_Value((sint16)20));
  val.Insert("HurtTime", new NBT_Value((sint16)0));
  val.Insert("FallDistance", new NBT_Value(54.f));

  NBT_Value *nbtInv = new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND);

  //Start with main items
  Item *slots   = (Item *)&inv.main;
  char slotid   = 0;
  char itemslot = 0;
  for(int i = 0; i < 36+4+4; i++)
  {
    //Crafting items after main
    if(i == 36)
    {
      slots    = (Item *)&inv.crafting;
      itemslot = 80;
      slotid   = 0;
    }
    //Equipped items last
    else if(i == 36+4)
    {
      slots    = (Item *)&inv.equipped;
      itemslot = 100;
      slotid   = 0;
    }
    if(slots[(uint8)slotid].count)
    {
    NBT_Value *val = new NBT_Value(NBT_Value::TAG_COMPOUND);
    val->Insert("Count", new NBT_Value((sint8)slots[(uint8)slotid].count));
    val->Insert("Slot", new NBT_Value((sint8)itemslot));
    val->Insert("Damage", new NBT_Value((sint16)slots[(uint8)slotid].health));
    val->Insert("id", new NBT_Value((sint16)slots[(uint8)slotid].type));
    nbtInv->GetList()->push_back(val);
    }

    slotid++;
    itemslot++;
  }

  val.Insert("Inventory", nbtInv);

  NBT_Value *nbtPos = new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_DOUBLE);
  nbtPos->GetList()->push_back(new NBT_Value((double)pos.x));
  nbtPos->GetList()->push_back(new NBT_Value((double)pos.y));
  nbtPos->GetList()->push_back(new NBT_Value((double)pos.z));
  val.Insert("Pos", nbtPos);
  

  NBT_Value *nbtRot = new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_FLOAT);
  nbtRot->GetList()->push_back(new NBT_Value((float)pos.yaw));
  nbtRot->GetList()->push_back(new NBT_Value((float)pos.pitch));
  val.Insert("Rotation", nbtRot);


  NBT_Value *nbtMotion = new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_DOUBLE);
  nbtMotion->GetList()->push_back(new NBT_Value((double)0.0));
  nbtMotion->GetList()->push_back(new NBT_Value((double)0.0));
  nbtMotion->GetList()->push_back(new NBT_Value((double)0.0));
  val.Insert("Motion", nbtMotion);

  val.SaveToFile(outfile);

  return true;

}
Esempio n. 10
0
void MapGen::generateChunk(int x, int z)
{
  NBT_Value *main = new NBT_Value(NBT_Value::TAG_COMPOUND);
  NBT_Value *val = new NBT_Value(NBT_Value::TAG_COMPOUND);

  if(Mineserver::get()->config()->bData("mapgen.flatgrass"))
    generateFlatgrass();
  else
    generateWithNoise(x, z);

  val->Insert("Blocks", new NBT_Value(blocks, 16*16*128));
  val->Insert("Data", new NBT_Value(blockdata, 16*16*128/2));
  val->Insert("SkyLight", new NBT_Value(skylight, 16*16*128/2));
  val->Insert("BlockLight", new NBT_Value(blocklight, 16*16*128/2));
  val->Insert("HeightMap", new NBT_Value(heightmap, 16*16));
  val->Insert("Entities", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND));
  val->Insert("TileEntities", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND));
  val->Insert("LastUpdate", new NBT_Value((sint64)time(NULL)));
  val->Insert("xPos", new NBT_Value(x));
  val->Insert("zPos", new NBT_Value(z));
  val->Insert("TerrainPopulated", new NBT_Value((char)1));

  main->Insert("Level", val);

  /*  uint32 chunkid;
  Mineserver::get()->map()->posToId(x, z, &chunkid);

  Mineserver::get()->map()->maps[chunkid].x = x;
  Mineserver::get()->map()->maps[chunkid].z = z; */

  std::vector<uint8> *t_blocks = (*val)["Blocks"]->GetByteArray();
  std::vector<uint8> *t_data = (*val)["Data"]->GetByteArray();
  std::vector<uint8> *t_blocklight = (*val)["BlockLight"]->GetByteArray();
  std::vector<uint8> *t_skylight = (*val)["SkyLight"]->GetByteArray();
  std::vector<uint8> *heightmap = (*val)["HeightMap"]->GetByteArray();

  sChunk *chunk = new sChunk();
  chunk->blocks = &((*t_blocks)[0]);
  chunk->data = &((*t_data)[0]);
  chunk->blocklight = &((*t_blocklight)[0]);
  chunk->skylight = &((*t_skylight)[0]);
  chunk->heightmap = &((*heightmap)[0]);
  chunk->nbt = main;
  chunk->x = x;
  chunk->z = z;

  Mineserver::get()->map()->chunks.LinkChunk(chunk, x, z);

  // Update last used time
  //Mineserver::get()->map()->mapLastused[chunkid] = (int)time(0);

  // Not changed
  //Mineserver::get()->map()->mapChanged[chunkid] = Mineserver::get()->config()->bData("save_unchanged_chunks");

  //Mineserver::get()->map()->maps[chunkid].nbt = main;
  
  if(addOre)
    AddOres(x, z);
  
  // Add trees
  if(addTrees)
    AddTrees(x, z);
    
  if(expandBeaches)
    ExpandBeaches(x, z);
    
}
Esempio n. 11
0
void EximGen::generateChunk(int x, int z, int map)
{
	NBT_Value* main = new NBT_Value(NBT_Value::TAG_COMPOUND);
	NBT_Value* val = new NBT_Value(NBT_Value::TAG_COMPOUND);

	val->Insert("Sections", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND));

	val->Insert("HeightMap", new NBT_Value(heightmap));
	val->Insert("Entities", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND));
	val->Insert("TileEntities", new NBT_Value(NBT_Value::TAG_LIST, NBT_Value::TAG_COMPOUND));
	val->Insert("LastUpdate", new NBT_Value((int64_t)time(nullptr)));
	val->Insert("xPos", new NBT_Value(x));
	val->Insert("zPos", new NBT_Value(z));
	val->Insert("TerrainPopulated", new NBT_Value((int8_t)1));

	main->Insert("Level", val);

	sChunk* chunk = new sChunk();

	NBT_Value* val1 = (*val)["HeightMap"];
	chunk->heightmap = val1->GetIntArray()->data();
	chunk->nbt = main;
	chunk->x = x<<4;
	chunk->z = z<<4;
	ServerInstance->map(map)->chunks.insert(ChunkMap::value_type(ChunkMap::key_type(x, z), chunk));

	memset(chunk->blocks, 0, 16*16*256);
	memset(chunk->addblocks, 0, 16*16*256/2);
	memset(chunk->data, 0, 16*16*256/2);
	memset(chunk->blocklight, 0, 16*16*256/2);
	memset(chunk->skylight, 0, 16*16*256/2);
	chunk->chunks_present = 0xffff;

	ChunkInfo info(chunk);


	if (ServerInstance->config()->bData("mapgen.flatgrass")) {
		generateFlatgrass(x, z, map);
	} else {
		generateWithNoise(info);
	}


	// Not changed
	chunk->changed = ServerInstance->config()->bData("map.save_unchanged_chunks");

	if (false && addOre) {
		AddOre(x, z, map, BLOCK_COAL_ORE);
		AddOre(x, z, map, BLOCK_IRON_ORE);
		AddOre(x, z, map, BLOCK_GOLD_ORE);
		AddOre(x, z, map, BLOCK_DIAMOND_ORE);
		AddOre(x, z, map, BLOCK_REDSTONE_ORE);
		AddOre(x, z, map, BLOCK_LAPIS_ORE);
	}

	//AddOre(x, z, map, BLOCK_GRAVEL);
	//AddOre(x, z, map, BLOCK_DIRT); // guess what, dirt also exists underground

	// Add trees
	if (addTrees) {
		//AddTrees(x, z, map);
	}

	if (expandBeaches) {
		//ExpandBeaches(x, z, map);
	}

	// AddRiver(x, z, map);

}