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:
parent
c63448c1ab
commit
07e35df17a
132
src/main/java/net/wurstclient/util/AbstractChunkCoordinator.java
Normal file
132
src/main/java/net/wurstclient/util/AbstractChunkCoordinator.java
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user