/* * This file is a part of the SteamWar software. * * Copyright (C) 2025 SteamWar.de-Serverteam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package de.steamwar.bausystem.region; import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.bausystem.worlddata.WorldData; import de.steamwar.sql.SchematicNode; import lombok.NonNull; import java.util.HashMap; import java.util.Map; public abstract class RegionData { protected final WorldData.RegionEntry data; protected final Map flagData; protected final Runnable onChange; protected final Map, Flag.Value> flagMap = new HashMap<>(); private SchematicNode testblockSchematic; protected RegionData(WorldData.RegionEntry data, Runnable onChange) { this.data = data; this.flagData = data.getFlags(); this.onChange = onChange; initialize(); for (final Flag flag : Flag.getFlags()) { if (!has(flag).isWritable()) continue; try { String s = flagData.get(flag.name()); flagMap.put(flag, flag.valueOfValue(s)); } catch (Exception e) { flagMap.put(flag, (Flag.Value) flag.getDefaultValue()); } } if (data.getTestblockSchematic() != null) { testblockSchematic = SchematicNode.byId(data.getTestblockSchematic()); } } protected void initialize() { } @NonNull public abstract & Flag.Value> RegionFlagPolicy has(@NonNull Flag flag); /** * Returns true if the flag was changed and did not already contain the provided value */ public final & Flag.Value> boolean set(@NonNull Flag flag, @NonNull T value) { if (has(flag).isWritable()) { if (flagMap.put(flag, value) != value) { flagData.put(flag.name(), value.name()); onChange.run(); return true; } } return false; } @NonNull public final & Flag.Value> FlagOptional get(@NonNull Flag flag) { return FlagOptional.of(flag, (T) flagMap.get(flag)); } public final void clear() { for (Flag flag : Flag.getFlags()) { if (has(flag).isWritable()) { flagMap.remove(flag); flagData.remove(flag.name()); } } testblockSchematic = null; data.setTestblockSchematic(null); onChange.run(); } public final Map, Flag.Value> getBackedMap() { return flagMap; } public SchematicNode getTestblockSchematic() { return testblockSchematic; } public void setTestblockSchematic(SchematicNode schematic) { testblockSchematic = schematic; data.setTestblockSchematic(schematic == null ? null : schematic.getId()); onChange.run(); } @Override public final String toString() { return getClass().getSimpleName() + "{" + "flagMap=" + flagMap + '}'; } }