forked from townforge/townforge
remove tile data and set repair to 0 for derelict buildings
This commit is contained in:
parent
475ff2dcdb
commit
210882c66f
@ -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;
|
||||
|
@ -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__);
|
||||
|
@ -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);
|
||||
|
@ -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) {}
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user