0
0
mirror of https://github.com/Wurst-Imperium/Wurst7.git synced 2024-09-20 01:12:13 +02:00

Add abstract parent class for ChunkSearcherCoordinator and ChunkVertexBufferCoordinator

This commit is contained in:
Alexander01998 2024-09-10 16:21:28 +02:00
parent c63448c1ab
commit 07e35df17a
3 changed files with 142 additions and 197 deletions

View File

@ -0,0 +1,132 @@
/*
* Copyright (c) 2014-2024 Wurst-Imperium and contributors.
*
* This source code is subject to the terms of the GNU General Public
* License, version 3. If a copy of the GPL was not distributed with this
* file, You can obtain one at: https://www.gnu.org/licenses/gpl-3.0.txt
*/
package net.wurstclient.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.function.BiPredicate;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.dimension.DimensionType;
import net.wurstclient.WurstClient;
import net.wurstclient.events.PacketInputListener;
import net.wurstclient.settings.ChunkAreaSetting;
public abstract class AbstractChunkCoordinator implements PacketInputListener
{
protected final HashMap<ChunkPos, ChunkSearcher> searchers =
new HashMap<>();
protected final ChunkAreaSetting area;
private BiPredicate<BlockPos, BlockState> query;
protected final Set<ChunkPos> chunksToUpdate =
Collections.synchronizedSet(new HashSet<>());
public AbstractChunkCoordinator(BiPredicate<BlockPos, BlockState> query,
ChunkAreaSetting area)
{
this.query = Objects.requireNonNull(query);
this.area = Objects.requireNonNull(area);
}
public boolean update()
{
DimensionType dimension = WurstClient.MC.world.getDimension();
HashSet<ChunkPos> chunkUpdates = clearChunksToUpdate();
boolean searchersChanged = false;
// remove outdated ChunkSearchers
for(ChunkSearcher searcher : new ArrayList<>(searchers.values()))
{
boolean remove = false;
ChunkPos searcherPos = searcher.getPos();
// wrong dimension
if(dimension != searcher.getDimension())
remove = true;
// out of range
else if(!area.isInRange(searcherPos))
remove = true;
// chunk update
else if(chunkUpdates.contains(searcherPos))
remove = true;
if(remove)
{
searchers.remove(searcherPos);
searcher.cancel();
onRemove(searcher);
searchersChanged = true;
}
}
// add new ChunkSearchers
for(Chunk chunk : area.getChunksInRange())
{
ChunkPos chunkPos = chunk.getPos();
if(searchers.containsKey(chunkPos))
continue;
ChunkSearcher searcher = new ChunkSearcher(query, chunk, dimension);
searchers.put(chunkPos, searcher);
searcher.start();
searchersChanged = true;
}
return searchersChanged;
}
protected void onRemove(ChunkSearcher searcher)
{
// Overridden in ChunkVertexBufferCoordinator
}
public void reset()
{
searchers.values().forEach(ChunkSearcher::cancel);
searchers.clear();
chunksToUpdate.clear();
}
public boolean isDone()
{
return searchers.values().stream().allMatch(ChunkSearcher::isDone);
}
public void setQuery(BiPredicate<BlockPos, BlockState> query)
{
this.query = Objects.requireNonNull(query);
searchers.values().forEach(ChunkSearcher::cancel);
searchers.clear();
}
public void setTargetBlock(Block block)
{
setQuery((pos, state) -> block == state.getBlock());
}
protected HashSet<ChunkPos> clearChunksToUpdate()
{
synchronized(chunksToUpdate)
{
HashSet<ChunkPos> chunks = new HashSet<>(chunksToUpdate);
chunksToUpdate.clear();
return chunks;
}
}
}

View File

@ -7,35 +7,17 @@
*/
package net.wurstclient.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.function.BiPredicate;
import java.util.stream.Stream;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.dimension.DimensionType;
import net.wurstclient.WurstClient;
import net.wurstclient.events.PacketInputListener;
import net.wurstclient.settings.ChunkAreaSetting;
import net.wurstclient.util.ChunkSearcher.Result;
public final class ChunkSearcherCoordinator implements PacketInputListener
public final class ChunkSearcherCoordinator extends AbstractChunkCoordinator
{
private final HashMap<ChunkPos, ChunkSearcher> searchers = new HashMap<>();
private final ChunkAreaSetting area;
private BiPredicate<BlockPos, BlockState> query;
private final Set<ChunkPos> chunksToUpdate =
Collections.synchronizedSet(new HashSet<>());
public ChunkSearcherCoordinator(ChunkAreaSetting area)
{
this((pos, state) -> false, area);
@ -44,8 +26,7 @@ public final class ChunkSearcherCoordinator implements PacketInputListener
public ChunkSearcherCoordinator(BiPredicate<BlockPos, BlockState> query,
ChunkAreaSetting area)
{
this.query = Objects.requireNonNull(query);
this.area = Objects.requireNonNull(area);
super(query, area);
}
@Override
@ -57,90 +38,8 @@ public final class ChunkSearcherCoordinator implements PacketInputListener
chunksToUpdate.add(chunkPos);
}
public boolean update()
{
DimensionType dimension = WurstClient.MC.world.getDimension();
HashSet<ChunkPos> chunkUpdates = clearChunksToUpdate();
boolean searchersChanged = false;
// remove outdated ChunkSearchers
for(ChunkSearcher searcher : new ArrayList<>(searchers.values()))
{
boolean remove = false;
ChunkPos searcherPos = searcher.getPos();
// wrong dimension
if(dimension != searcher.getDimension())
remove = true;
// out of range
else if(!area.isInRange(searcherPos))
remove = true;
// chunk update
else if(chunkUpdates.contains(searcherPos))
remove = true;
if(remove)
{
searchers.remove(searcherPos);
searcher.cancel();
searchersChanged = true;
}
}
// add new ChunkSearchers
for(Chunk chunk : area.getChunksInRange())
{
ChunkPos chunkPos = chunk.getPos();
if(searchers.containsKey(chunkPos))
continue;
ChunkSearcher searcher = new ChunkSearcher(query, chunk, dimension);
searchers.put(chunkPos, searcher);
searcher.start();
searchersChanged = true;
}
return searchersChanged;
}
public void reset()
{
searchers.values().forEach(ChunkSearcher::cancel);
searchers.clear();
chunksToUpdate.clear();
}
public boolean isDone()
{
return searchers.values().stream().allMatch(ChunkSearcher::isDone);
}
public Stream<Result> getMatches()
{
return searchers.values().stream().flatMap(ChunkSearcher::getMatches);
}
public void setTargetBlock(Block block)
{
setQuery((pos, state) -> block == state.getBlock());
}
public void setQuery(BiPredicate<BlockPos, BlockState> query)
{
this.query = Objects.requireNonNull(query);
searchers.values().forEach(ChunkSearcher::cancel);
searchers.clear();
}
private HashSet<ChunkPos> clearChunksToUpdate()
{
synchronized(chunksToUpdate)
{
HashSet<ChunkPos> chunks = new HashSet<>(chunksToUpdate);
chunksToUpdate.clear();
return chunks;
}
}
}

View File

@ -7,47 +7,33 @@
*/
package net.wurstclient.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.client.gl.VertexBuffer;
import net.minecraft.client.render.BuiltBuffer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.dimension.DimensionType;
import net.wurstclient.WurstClient;
import net.wurstclient.events.PacketInputListener;
import net.wurstclient.settings.ChunkAreaSetting;
import net.wurstclient.util.ChunkSearcher.Result;
public final class ChunkVertexBufferCoordinator implements PacketInputListener
public final class ChunkVertexBufferCoordinator extends AbstractChunkCoordinator
{
private final HashMap<ChunkPos, ChunkSearcher> searchers = new HashMap<>();
private final HashMap<ChunkPos, VertexBuffer> buffers = new HashMap<>();
private final ChunkAreaSetting area;
private BiPredicate<BlockPos, BlockState> query;
private final BiFunction<ChunkSearcher, Iterable<Result>, BuiltBuffer> renderer;
private final Set<ChunkPos> chunksToUpdate =
Collections.synchronizedSet(new HashSet<>());
public ChunkVertexBufferCoordinator(BiPredicate<BlockPos, BlockState> query,
BiFunction<ChunkSearcher, Iterable<Result>, BuiltBuffer> renderer,
ChunkAreaSetting area)
{
this.query = Objects.requireNonNull(query);
super(query, area);
this.renderer = Objects.requireNonNull(renderer);
this.area = Objects.requireNonNull(area);
}
@Override
@ -62,69 +48,19 @@ public final class ChunkVertexBufferCoordinator implements PacketInputListener
chunksToUpdate.add(new ChunkPos(x, z));
}
public boolean update()
@Override
protected void onRemove(ChunkSearcher searcher)
{
DimensionType dimension = WurstClient.MC.world.getDimension();
HashSet<ChunkPos> chunkUpdates = clearChunksToUpdate();
boolean searchersChanged = false;
// remove outdated ChunkSearchers
for(ChunkSearcher searcher : new ArrayList<>(searchers.values()))
{
boolean remove = false;
ChunkPos searcherPos = searcher.getPos();
// wrong dimension
if(dimension != searcher.getDimension())
remove = true;
// out of range
else if(!area.isInRange(searcherPos))
remove = true;
// chunk update
else if(chunkUpdates.contains(searcherPos))
remove = true;
if(remove)
{
searchers.remove(searcherPos);
searcher.cancel();
VertexBuffer buffer = buffers.remove(searcherPos);
if(buffer != null)
buffer.close();
searchersChanged = true;
}
}
// add new ChunkSearchers
for(Chunk chunk : area.getChunksInRange())
{
ChunkPos chunkPos = chunk.getPos();
if(searchers.containsKey(chunkPos))
continue;
ChunkSearcher searcher = new ChunkSearcher(query, chunk, dimension);
searchers.put(chunkPos, searcher);
searcher.start();
searchersChanged = true;
}
return searchersChanged;
VertexBuffer buffer = buffers.remove(searcher.getPos());
if(buffer != null)
buffer.close();
}
public void reset()
{
searchers.values().forEach(ChunkSearcher::cancel);
searchers.clear();
super.reset();
buffers.values().forEach(VertexBuffer::close);
buffers.clear();
chunksToUpdate.clear();
}
public boolean isDone()
{
return searchers.values().stream().allMatch(ChunkSearcher::isDone);
}
public Set<Entry<ChunkPos, VertexBuffer>> getBuffers()
@ -151,26 +87,4 @@ public final class ChunkVertexBufferCoordinator implements PacketInputListener
VertexBuffer.unbind();
buffers.put(searcher.getPos(), vertexBuffer);
}
public void setTargetBlock(Block block)
{
setQuery((pos, state) -> block == state.getBlock());
}
public void setQuery(BiPredicate<BlockPos, BlockState> query)
{
this.query = Objects.requireNonNull(query);
searchers.values().forEach(ChunkSearcher::cancel);
searchers.clear();
}
private HashSet<ChunkPos> clearChunksToUpdate()
{
synchronized(chunksToUpdate)
{
HashSet<ChunkPos> chunks = new HashSet<>(chunksToUpdate);
chunksToUpdate.clear();
return chunks;
}
}
}