void zone_manager::add( const std::string &name, const zone_type_id &type, const bool invert, const bool enabled, const tripoint &start, const tripoint &end, std::shared_ptr<zone_options> options ) { zone_data new_zone = zone_data( name, type, invert, enabled, start, end, options ); //the start is a vehicle tile with cargo space if( const cata::optional<vpart_reference> vp = g->m.veh_at( g->m.getlocal( start ) ).part_with_feature( "CARGO", false ) ) { // TODO:Allow for loot zones on vehicles to be larger than 1x1 if( start == end && query_yn( _( "Bind this zone to the cargo part here?" ) ) ) { // TODO: refactor zone options for proper validation code if( type == zone_type_id( "FARM_PLOT" ) ) { popup( _( "You cannot add that type of zone to a vehicle." ), PF_NONE ); return; } create_vehicle_loot_zone( vp->vehicle(), vp->mount(), new_zone ); return; } } //Create a regular zone zones.push_back( new_zone ); cache_data(); }
void zone_manager::add( const std::string &name, const std::string &type, const bool invert, const bool enabled, const tripoint &start, const tripoint &end ) { zones.push_back( zone_data( name, type, invert, enabled, start, end ) ); cache_data(); }
void zone_manager::zone_edited( zone_data &zone ) { if( zone.get_is_vehicle() ) { //Check if this zone has already been stored for( auto &changed_vzone : changed_vzones ) { if( &zone == changed_vzone.second ) { return; } } //Add it to the list of changed zones changed_vzones.push_back( std::make_pair( zone_data( zone ), &zone ) ); } }
bool zone_manager::remove( zone_data &zone ) { for( auto it = zones.begin(); it != zones.end(); ++it ) { if( &zone == &*it ) { zones.erase( it ); return true; } } zone_data old_zone = zone_data( zone ); //If the zone was previously edited this session //Move original data out of changed for( auto it = changed_vzones.begin(); it != changed_vzones.end(); ++it ) { if( it->second == &zone ) { old_zone = zone_data( it->first ); changed_vzones.erase( it ); break; } } bool added = false; //If the zone was added this session //remove from added, and don't add to removed for( auto it = added_vzones.begin(); it != added_vzones.end(); ++it ) { if( ( *it ) == &zone ) { added = true; added_vzones.erase( it ); break; } } if( !added ) { removed_vzones.push_back( old_zone ); } if( !g->m.deregister_vehicle_zone( zone ) ) { debugmsg( "Tried to remove a zone from an unloaded vehicle" ); return false; } cache_vzones(); return true; }