refactor: attempt to make the bot more thread-safe (specifically the core)
This commit is contained in:
parent
1e6421a17c
commit
517e685c8d
4 changed files with 31 additions and 36 deletions
build-number.txt
src/main/java/me/chayapak1/chomens_bot/plugins
|
@ -1 +1 @@
|
|||
2245
|
||||
2248
|
|
@ -53,7 +53,7 @@ public class ChatPlugin extends Bot.Listener {
|
|||
|
||||
public final List<Component> chatTypes = new ArrayList<>();
|
||||
|
||||
private final ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
|
||||
private final Queue<String> queue = new ConcurrentLinkedQueue<>();
|
||||
|
||||
public final int queueDelay;
|
||||
|
||||
|
|
|
@ -27,14 +27,12 @@ import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.inventory.S
|
|||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.player.ServerboundPlayerActionPacket;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.player.ServerboundUseItemOnPacket;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class CorePlugin
|
||||
extends Bot.Listener
|
||||
|
@ -46,7 +44,7 @@ public class CorePlugin
|
|||
|
||||
private final List<Listener> listeners = new ArrayList<>();
|
||||
|
||||
public boolean ready = false;
|
||||
public volatile boolean ready = false;
|
||||
|
||||
private ScheduledFuture<?> refillTask;
|
||||
|
||||
|
@ -56,12 +54,12 @@ public class CorePlugin
|
|||
public Vector3i from;
|
||||
public Vector3i to;
|
||||
|
||||
public Vector3i block = null;
|
||||
public volatile Vector3i block = null;
|
||||
|
||||
public final ConcurrentLinkedQueue<String> placeBlockQueue = new ConcurrentLinkedQueue<>();
|
||||
public final Queue<String> placeBlockQueue = new ConcurrentLinkedQueue<>();
|
||||
|
||||
private int commandsPerTick = 0;
|
||||
private int commandsPerSecond = 0;
|
||||
private final AtomicInteger commandsPerTick = new AtomicInteger(0);
|
||||
private final AtomicInteger commandsPerSecond = new AtomicInteger(0);
|
||||
|
||||
private boolean shouldRefill = false;
|
||||
|
||||
|
@ -83,7 +81,7 @@ public class CorePlugin
|
|||
|
||||
if (hasRateLimit() && hasReset()) {
|
||||
bot.executor.scheduleAtFixedRate(
|
||||
() -> commandsPerSecond = 0,
|
||||
() -> commandsPerSecond.set(0),
|
||||
0,
|
||||
bot.options.coreRateLimit.reset,
|
||||
TimeUnit.MILLISECONDS
|
||||
|
@ -97,22 +95,18 @@ public class CorePlugin
|
|||
|
||||
@Override
|
||||
public void onTick () {
|
||||
if (commandsPerTick > 0) commandsPerTick--;
|
||||
if (commandsPerTick.get() > 0) commandsPerTick.decrementAndGet();
|
||||
|
||||
try {
|
||||
if (placeBlockQueue.size() > 300) {
|
||||
placeBlockQueue.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
final String command = placeBlockQueue.poll();
|
||||
|
||||
if (command == null) return;
|
||||
|
||||
forceRunPlaceBlock(command);
|
||||
} catch (Exception e) {
|
||||
bot.logger.error(e);
|
||||
if (placeBlockQueue.size() > 300) {
|
||||
placeBlockQueue.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
final String command = placeBlockQueue.poll();
|
||||
|
||||
if (command == null) return;
|
||||
|
||||
forceRunPlaceBlock(command);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -136,7 +130,7 @@ public class CorePlugin
|
|||
}
|
||||
|
||||
public boolean isRateLimited () {
|
||||
return commandsPerSecond > bot.options.coreRateLimit.limit;
|
||||
return commandsPerSecond.get() > bot.options.coreRateLimit.limit;
|
||||
}
|
||||
|
||||
private void forceRun (String command) {
|
||||
|
@ -144,7 +138,7 @@ public class CorePlugin
|
|||
// to still run the command, even if forced.
|
||||
if (!ready || command.length() > 32767) return;
|
||||
|
||||
commandsPerTick++;
|
||||
commandsPerTick.incrementAndGet();
|
||||
|
||||
if (!bot.serverFeatures.hasNamespaces) command = StringUtilities.removeNamespace(command);
|
||||
|
||||
|
@ -193,7 +187,7 @@ public class CorePlugin
|
|||
|
||||
forceRun(command);
|
||||
|
||||
if (hasRateLimit()) commandsPerSecond++;
|
||||
if (hasRateLimit()) commandsPerSecond.incrementAndGet();
|
||||
} else if (command.length() < 256) {
|
||||
bot.chat.send("/" + command);
|
||||
}
|
||||
|
@ -324,9 +318,9 @@ public class CorePlugin
|
|||
int y = -64;
|
||||
int z = toSize.getZ();
|
||||
|
||||
while (commandsPerTick > (16 * 16)) {
|
||||
while (commandsPerTick.get() > 16 * 16) {
|
||||
y++;
|
||||
commandsPerTick -= 16 * 16;
|
||||
commandsPerTick.getAndAdd(-(16 * 16));
|
||||
}
|
||||
|
||||
toSize = Vector3i.from(x, y, z);
|
||||
|
@ -388,7 +382,7 @@ public class CorePlugin
|
|||
position.getZ() >= from.getZ() && position.getZ() <= to.getZ();
|
||||
}
|
||||
|
||||
private void incrementBlock () {
|
||||
private synchronized void incrementBlock () {
|
||||
int x = block.getX() + 1;
|
||||
int y = block.getY();
|
||||
int z = block.getZ();
|
||||
|
@ -451,7 +445,7 @@ public class CorePlugin
|
|||
reset();
|
||||
}
|
||||
|
||||
public void recalculateRelativePositions() {
|
||||
public void recalculateRelativePositions () {
|
||||
final int botChunkPosX = (int) Math.floor(bot.position.position.getX() / 16);
|
||||
final int botChunkPosZ = (int) Math.floor(bot.position.position.getZ() / 16);
|
||||
|
||||
|
|
|
@ -23,11 +23,12 @@ import java.io.IOException;
|
|||
import java.net.URL;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
// Author: _ChipMC_ & chayapak <3
|
||||
// Author: _ChipMC_ & hhhzzzsss
|
||||
public class MusicPlayerPlugin extends Bot.Listener implements CorePlugin.Listener {
|
||||
public static final String SELECTOR = "@a[tag=!nomusic,tag=!chomens_bot_nomusic,tag=!custompitch]";
|
||||
public static final String CUSTOM_PITCH_SELECTOR = "@a[tag=!nomusic,tag=!chomens_bot_nomusic,tag=custompitch]";
|
||||
|
@ -45,7 +46,7 @@ public class MusicPlayerPlugin extends Bot.Listener implements CorePlugin.Listen
|
|||
}
|
||||
|
||||
public Song currentSong;
|
||||
public final List<Song> songQueue = new ArrayList<>();
|
||||
public final List<Song> songQueue = Collections.synchronizedList(new LinkedList<>());
|
||||
public SongLoaderThread loaderThread = null;
|
||||
public Loop loop = Loop.OFF;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue