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        }
055    }
056
057    public QueueCoordinator getParent() {
058        return parent;
059    }
060
061    @Override
062    public int size() {
063        if (parent != null) {
064            return parent.size();
065        }
066        return 0;
067    }
068
069    @Override
070    public void setModified(long modified) {
071        if (parent != null) {
072            parent.setModified(modified);
073        }
074    }
075
076    @Override
077    public boolean setBlock(int x, int y, int z, @NonNull Pattern pattern) {
078        if (parent != null) {
079            return parent.setBlock(x, y, z, pattern);
080        }
081        return false;
082    }
083
084    @Override
085    public boolean setBlock(int x, int y, int z, @NonNull BaseBlock id) {
086        if (parent != null) {
087            return parent.setBlock(x, y, z, id);
088        }
089        return false;
090    }
091
092    @Override
093    public boolean setBlock(int x, int y, int z, @NonNull BlockState id) {
094        if (parent != null) {
095            return parent.setBlock(x, y, z, id);
096        }
097        return false;
098    }
099
100    @Override
101    public @Nullable BlockState getBlock(int x, int y, int z) {
102        if (parent != null) {
103            return parent.getBlock(x, y, z);
104        }
105        return null;
106    }
107
108    @Override
109    public boolean setBiome(int x, int z, @NonNull BiomeType biome) {
110        if (parent != null) {
111            return parent.setBiome(x, z, biome);
112        }
113        return false;
114    }
115
116    @Override
117    public boolean setBiome(int x, int y, int z, @NonNull BiomeType biome) {
118        if (parent != null) {
119            return parent.setBiome(x, y, z, biome);
120        }
121        return false;
122    }
123
124    @Override
125    public boolean isSettingBiomes() {
126        if (parent != null) {
127            return parent.isSettingBiomes();
128        }
129        return false;
130    }
131
132    @Override
133    public void setBiomesEnabled(final boolean enabled) {
134        if (parent != null) {
135            parent.setBiomesEnabled(enabled);
136        }
137    }
138
139    @Override
140    public boolean setEntity(@NonNull Entity entity) {
141        if (parent != null) {
142            return parent.setEntity(entity);
143        }
144        return false;
145    }
146
147    @Override
148    public void regenChunk(int x, int z) {
149        if (parent != null) {
150            parent.regenChunk(x, z);
151        }
152    }
153
154    @Override
155    public @Nullable World getWorld() {
156        if (parent != null) {
157            return parent.getWorld();
158        }
159        return null;
160    }
161
162    @Override
163    public boolean setTile(int x, int y, int z, @NonNull CompoundTag tag) {
164        if (parent != null) {
165            return parent.setTile(x, y, z, tag);
166        }
167        return false;
168    }
169
170    @Override
171    public boolean isSettingTiles() {
172        if (parent != null) {
173            return parent.isSettingTiles();
174        }
175        return false;
176    }
177
178    @Override
179    public boolean enqueue() {
180        if (parent != null) {
181            return parent.enqueue();
182        }
183        return false;
184    }
185
186    @Override
187    public void start() {
188        if (parent != null) {
189            parent.start();
190        }
191    }
192
193    @Override
194    public void cancel() {
195        if (parent != null) {
196            parent.cancel();
197        }
198    }
199
200    @Override
201    public Runnable getCompleteTask() {
202        if (parent != null) {
203            return parent.getCompleteTask();
204        }
205        return null;
206    }
207
208    @Override
209    public void setCompleteTask(Runnable whenDone) {
210        if (parent != null) {
211            parent.setCompleteTask(whenDone);
212        }
213    }
214
215    @Override
216    public @Nullable Consumer<BlockVector2> getChunkConsumer() {
217        if (parent != null) {
218            return parent.getChunkConsumer();
219        }
220        return null;
221    }
222
223    @Override
224    public void setChunkConsumer(@NonNull Consumer<BlockVector2> consumer) {
225        if (parent != null) {
226            parent.setChunkConsumer(consumer);
227        }
228    }
229
230    @Override
231    public void addProgressSubscriber(@NonNull ProgressSubscriber progressSubscriber) {
232        if (parent != null) {
233            parent.addProgressSubscriber(progressSubscriber);
234        }
235    }
236
237    @Override
238    public @NonNull LightingMode getLightingMode() {
239        if (parent != null) {
240            return parent.getLightingMode();
241        }
242        return LightingMode.valueOf(Settings.QUEUE.LIGHTING_MODE);
243    }
244
245    @Override
246    public void setLightingMode(@Nullable LightingMode mode) {
247        if (parent != null) {
248            parent.setLightingMode(mode);
249        }
250    }
251
252    @Override
253    public SideEffectSet getSideEffectSet() {
254        if (parent != null) {
255            return parent.getSideEffectSet();
256        }
257        return null;
258    }
259
260    @Override
261    public void setSideEffectSet(final SideEffectSet sideEffectSet) {
262        if (parent != null) {
263            parent.setSideEffectSet(sideEffectSet);
264        }
265    }
266
267    @Override
268    public @NonNull List<BlockVector2> getReadChunks() {
269        if (parent != null) {
270            return parent.getReadChunks();
271        }
272        return new ArrayList<>();
273    }
274
275    @Override
276    public void addReadChunks(@NonNull Set<BlockVector2> readChunks) {
277        if (parent != null) {
278            parent.addReadChunks(readChunks);
279        }
280    }
281
282    @Override
283    public void addReadChunk(@NonNull BlockVector2 chunk) {
284        if (parent != null) {
285            parent.addReadChunk(chunk);
286        }
287    }
288
289    @Override
290    public boolean isUnloadAfter() {
291        if (parent != null) {
292            return parent.isUnloadAfter();
293        }
294        return false;
295    }
296
297    @Override
298    public void setUnloadAfter(boolean setUnloadAfter) {
299        if (parent != null) {
300            parent.setUnloadAfter(setUnloadAfter);
301        }
302    }
303
304    @Override
305    public @Nullable CuboidRegion getRegenRegion() {
306        if (parent != null) {
307            return parent.getRegenRegion();
308        }
309        return null;
310    }
311
312    @Override
313    public void setRegenRegion(@NonNull CuboidRegion regenRegion) {
314        if (parent != null) {
315            parent.setRegenRegion(regenRegion);
316        }
317    }
318
319}