001/*
002 * PlotSquared, a land and world management plugin for Minecraft.
003 * Copyright (C) IntellectualSites <https://intellectualsites.com>
004 * Copyright (C) IntellectualSites team and contributors
005 *
006 * This program is free software: you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published by
008 * the Free Software Foundation, either version 3 of the License, or
009 * (at your option) any later version.
010 *
011 * This program is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014 * GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
018 */
019package com.plotsquared.core.queue;
020
021import com.plotsquared.core.configuration.Settings;
022import com.plotsquared.core.queue.subscriber.ProgressSubscriber;
023import com.sk89q.jnbt.CompoundTag;
024import com.sk89q.worldedit.entity.Entity;
025import com.sk89q.worldedit.function.pattern.Pattern;
026import com.sk89q.worldedit.math.BlockVector2;
027import com.sk89q.worldedit.regions.CuboidRegion;
028import com.sk89q.worldedit.util.SideEffectSet;
029import com.sk89q.worldedit.world.World;
030import com.sk89q.worldedit.world.biome.BiomeType;
031import com.sk89q.worldedit.world.block.BaseBlock;
032import com.sk89q.worldedit.world.block.BlockState;
033import org.checkerframework.checker.nullness.qual.NonNull;
034import org.checkerframework.checker.nullness.qual.Nullable;
035
036import java.util.ArrayList;
037import java.util.List;
038import java.util.Set;
039import java.util.function.Consumer;
040
041/**
042 * Queue that delegates to a parent queue.
043 */
044public class DelegateQueueCoordinator extends QueueCoordinator {
045
046    private final QueueCoordinator parent;
047
048    public DelegateQueueCoordinator(QueueCoordinator parent) {
049        super(parent == null ? null : parent.getWorld());
050        this.parent = parent;
051
052        if (parent != null) {
053            this.setForceSync(parent.isForceSync());
054            this.setShouldGen(parent.isShouldGen());
055        }
056    }
057
058    public QueueCoordinator getParent() {
059        return parent;
060    }
061
062    @Override
063    public int size() {
064        if (parent != null) {
065            return parent.size();
066        }
067        return 0;
068    }
069
070    @Override
071    public void setModified(long modified) {
072        if (parent != null) {
073            parent.setModified(modified);
074        }
075    }
076
077    @Override
078    public boolean setBlock(int x, int y, int z, @NonNull Pattern pattern) {
079        if (parent != null) {
080            return parent.setBlock(x, y, z, pattern);
081        }
082        return false;
083    }
084
085    @Override
086    public boolean setBlock(int x, int y, int z, @NonNull BaseBlock id) {
087        if (parent != null) {
088            return parent.setBlock(x, y, z, id);
089        }
090        return false;
091    }
092
093    @Override
094    public boolean setBlock(int x, int y, int z, @NonNull BlockState id) {
095        if (parent != null) {
096            return parent.setBlock(x, y, z, id);
097        }
098        return false;
099    }
100
101    @Override
102    public @Nullable BlockState getBlock(int x, int y, int z) {
103        if (parent != null) {
104            return parent.getBlock(x, y, z);
105        }
106        return null;
107    }
108
109    @Override
110    public boolean setBiome(int x, int z, @NonNull BiomeType biome) {
111        if (parent != null) {
112            return parent.setBiome(x, z, biome);
113        }
114        return false;
115    }
116
117    @Override
118    public boolean setBiome(int x, int y, int z, @NonNull BiomeType biome) {
119        if (parent != null) {
120            return parent.setBiome(x, y, z, biome);
121        }
122        return false;
123    }
124
125    @Override
126    public boolean isSettingBiomes() {
127        if (parent != null) {
128            return parent.isSettingBiomes();
129        }
130        return false;
131    }
132
133    @Override
134    public void setBiomesEnabled(final boolean enabled) {
135        if (parent != null) {
136            parent.setBiomesEnabled(enabled);
137        }
138    }
139
140    @Override
141    public boolean setEntity(@NonNull Entity entity) {
142        if (parent != null) {
143            return parent.setEntity(entity);
144        }
145        return false;
146    }
147
148    @Override
149    public void regenChunk(int x, int z) {
150        if (parent != null) {
151            parent.regenChunk(x, z);
152        }
153    }
154
155    @Override
156    public @Nullable World getWorld() {
157        if (parent != null) {
158            return parent.getWorld();
159        }
160        return null;
161    }
162
163    @Override
164    public boolean setTile(int x, int y, int z, @NonNull CompoundTag tag) {
165        if (parent != null) {
166            return parent.setTile(x, y, z, tag);
167        }
168        return false;
169    }
170
171    @Override
172    public boolean isSettingTiles() {
173        if (parent != null) {
174            return parent.isSettingTiles();
175        }
176        return false;
177    }
178
179    @Override
180    public boolean enqueue() {
181        if (parent != null) {
182            return parent.enqueue();
183        }
184        return false;
185    }
186
187    @Override
188    public void start() {
189        if (parent != null) {
190            parent.start();
191        }
192    }
193
194    @Override
195    public void cancel() {
196        if (parent != null) {
197            parent.cancel();
198        }
199    }
200
201    @Override
202    public Runnable getCompleteTask() {
203        if (parent != null) {
204            return parent.getCompleteTask();
205        }
206        return null;
207    }
208
209    @Override
210    public void setCompleteTask(Runnable whenDone) {
211        if (parent != null) {
212            parent.setCompleteTask(whenDone);
213        }
214    }
215
216    @Override
217    public @Nullable Consumer<BlockVector2> getChunkConsumer() {
218        if (parent != null) {
219            return parent.getChunkConsumer();
220        }
221        return null;
222    }
223
224    @Override
225    public void setChunkConsumer(@NonNull Consumer<BlockVector2> consumer) {
226        if (parent != null) {
227            parent.setChunkConsumer(consumer);
228        }
229    }
230
231    @Override
232    public void addProgressSubscriber(@NonNull ProgressSubscriber progressSubscriber) {
233        if (parent != null) {
234            parent.addProgressSubscriber(progressSubscriber);
235        }
236    }
237
238    @Override
239    public @NonNull LightingMode getLightingMode() {
240        if (parent != null) {
241            return parent.getLightingMode();
242        }
243        return LightingMode.valueOf(Settings.QUEUE.LIGHTING_MODE);
244    }
245
246    @Override
247    public void setLightingMode(@Nullable LightingMode mode) {
248        if (parent != null) {
249            parent.setLightingMode(mode);
250        }
251    }
252
253    @Override
254    public SideEffectSet getSideEffectSet() {
255        if (parent != null) {
256            return parent.getSideEffectSet();
257        }
258        return null;
259    }
260
261    @Override
262    public void setSideEffectSet(final SideEffectSet sideEffectSet) {
263        if (parent != null) {
264            parent.setSideEffectSet(sideEffectSet);
265        }
266    }
267
268    @Override
269    public @NonNull List<BlockVector2> getReadChunks() {
270        if (parent != null) {
271            return parent.getReadChunks();
272        }
273        return new ArrayList<>();
274    }
275
276    @Override
277    public void addReadChunks(@NonNull Set<BlockVector2> readChunks) {
278        if (parent != null) {
279            parent.addReadChunks(readChunks);
280        }
281    }
282
283    @Override
284    public void addReadChunk(@NonNull BlockVector2 chunk) {
285        if (parent != null) {
286            parent.addReadChunk(chunk);
287        }
288    }
289
290    @Override
291    public boolean isUnloadAfter() {
292        if (parent != null) {
293            return parent.isUnloadAfter();
294        }
295        return false;
296    }
297
298    @Override
299    public void setUnloadAfter(boolean setUnloadAfter) {
300        if (parent != null) {
301            parent.setUnloadAfter(setUnloadAfter);
302        }
303    }
304
305    @Override
306    public @Nullable CuboidRegion getRegenRegion() {
307        if (parent != null) {
308            return parent.getRegenRegion();
309        }
310        return null;
311    }
312
313    @Override
314    public void setRegenRegion(@NonNull CuboidRegion regenRegion) {
315        if (parent != null) {
316            parent.setRegenRegion(regenRegion);
317        }
318    }
319
320}