remove tile data and set repair to 0 for derelict buildings

This commit is contained in:
Crypto City 2019-10-23 23:10:12 +00:00
parent 475ff2dcdb
commit 210882c66f
6 changed files with 62 additions and 0 deletions

View File

@ -1856,6 +1856,7 @@ public:
virtual void set_cc_flag_active(uint32_t id, bool active) = 0;
virtual uint32_t get_num_cc_flags() const = 0;
virtual bool find_cc_flag(uint32_t x, uint32_t y, uint32_t &id) const = 0;
virtual void remove_cc_flag_blocks(uint32_t id) = 0;
virtual void add_cc_used_nonce(uint64_t nonce) = 0;
virtual void remove_cc_used_nonce(uint64_t nonce) = 0;

View File

@ -5558,6 +5558,47 @@ bool BlockchainLMDB::find_cc_flag(uint32_t x, uint32_t y, uint32_t &id) const
return true;
}
void BlockchainLMDB::remove_cc_flag_blocks(uint32_t id)
{
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
check_open();
mdb_txn_cursors *m_cursors = &m_wcursors;
CURSOR(cc_flags)
CURSOR(cc_tiles)
// find flag id
MDB_val_set(k, id);
MDB_val v;
int result = mdb_cursor_get(m_cur_cc_flags, &k, &v, MDB_SET);
if (result)
throw0(DB_ERROR(lmdb_error("Flag " + std::to_string(id) + " not found: ", result).c_str()));
if (v.mv_size < sizeof(mdb_cc_flag_data))
throw0(DB_ERROR("Unexpected flag data size"));
const mdb_cc_flag_data &fd = *(const mdb_cc_flag_data *)v.mv_data;
const uint32_t owner_id = fd.owner;
// delete all tile data
for (uint32_t y = fd.y0; y <= fd.y1; ++y)
{
for (uint32_t x = fd.x0; x <= fd.x1; ++x)
{
uint64_t tile_id = (((uint64_t)y) << 32) | x;
mdb_cc_tile_data td;
td.flag = id;
td.height = 0;
k.mv_data = (void*)&tile_id;
k.mv_size = sizeof(tile_id);
v.mv_data = (void*)&td;
v.mv_size = sizeof(td);
result = mdb_cursor_put(m_cur_cc_tiles, &k, &v, 0);
if (result)
throw0(DB_ERROR(lmdb_error("Failed to add tile data to db transaction: ", result).c_str()));
}
}
}
void BlockchainLMDB::add_cc_used_nonce(uint64_t nonce)
{
LOG_PRINT_L3("BlockchainLMDB::" << __func__);

View File

@ -480,6 +480,7 @@ private:
void set_cc_flag_active(uint32_t id, bool active);
uint32_t get_num_cc_flags() const;
bool find_cc_flag(uint32_t x, uint32_t y, uint32_t &id) const;
void remove_cc_flag_blocks(uint32_t id);
virtual void add_cc_used_nonce(uint64_t nonce);
virtual void remove_cc_used_nonce(uint64_t nonce);

View File

@ -195,6 +195,7 @@ public:
virtual void set_cc_flag_active(uint32_t id, bool active) {}
virtual uint32_t get_num_cc_flags() const { return 0; }
virtual bool find_cc_flag(uint32_t x, uint32_t y, uint32_t &id) const { return 0; }
virtual void remove_cc_flag_blocks(uint32_t id) {}
virtual void add_cc_used_nonce(uint64_t nonce) {}
virtual void remove_cc_used_nonce(uint64_t nonce) {}

View File

@ -120,6 +120,8 @@ static bool execute_city(cryptonote::BlockchainDB &db, const cryptonote::cc_comm
}
for (const auto &derelict: city.derelict)
{
db.remove_cc_flag_blocks(derelict.id);
db.set_cc_flag_repair(derelict.id, 0);
db.set_cc_flag_role(derelict.id, ROLE_EMPTY, 0, 0);
}
for (const auto &defaulted: city.defaulted)

View File

@ -451,6 +451,22 @@ public:
}
}
virtual void remove_cc_flag_blocks(uint32_t id)
{
const uint32_t x0 = state.flags[id].x0;
const uint32_t y0 = state.flags[id].y0;
const uint32_t x1 = state.flags[id].x1;
const uint32_t y1 = state.flags[id].y1;
unsigned int idx = 0;
for (uint32_t y = y0; y <= y1; ++y)
{
for (uint32_t x = x0; x <= x1; ++x)
{
state.tiles.erase(std::make_pair(x, y));
}
}
}
virtual uint32_t get_num_cc_flags() const override
{
size_t c = 0;