diff --git a/run/options.txt b/run/options.txt index 6670f4b0..2d57a4ae 100644 --- a/run/options.txt +++ b/run/options.txt @@ -1,4 +1,4 @@ -version:2586 +version:2975 autoJump:false autoSuggestions:true chatColors:true @@ -11,19 +11,21 @@ discrete_mouse_scroll:false invertYMouse:false realmsNotifications:false reducedDebugInfo:false -snooperEnabled:false showSubtitles:false touchscreen:false fullscreen:false bobView:false toggleCrouch:false toggleSprint:false +darkMojangStudiosBackground:false +hideLightningFlashes:false mouseSensitivity:0.40316900610923767 fov:0.0 screenEffectScale:0.5 fovEffectScale:1.0 gamma:1.0 renderDistance:12 +simulationDistance:12 entityDistanceScaling:1.0 guiScale:4 particles:1 @@ -31,12 +33,14 @@ maxFps:260 difficulty:2 graphicsMode:0 ao:2 +prioritizeChunkUpdates:0 biomeBlendRadius:4 renderClouds:true -resourcePacks:["vanilla","programer_art"] +resourcePacks:["vanilla"] incompatibleResourcePacks:[] lastServer:124.227.80.185:25227 lang:zh_cn +soundDevice: chatVisibility:0 chatOpacity:1.0 chatLineSpacing:0.019366197288036346 @@ -44,12 +48,12 @@ textBackgroundOpacity:0.5 backgroundForChatOnly:true hideServerAddress:false advancedItemTooltips:true -pauseOnLostFocus:true +pauseOnLostFocus:false overrideWidth:0 overrideHeight:0 heldItemTooltips:true chatHeightFocused:1.0 -chatDelay: 0.0 +chatDelay:0.0 chatHeightUnfocused:0.44366195797920227 chatScale:0.6214788556098938 chatWidth:1.0 @@ -63,9 +67,13 @@ mouseWheelSensitivity:1.0 rawMouseInput:true glDebugVerbosity:1 skipMultiplayerWarning:true +skipRealms32bitWarning:false hideMatchedNames:true joinedFirstServer:true +hideBundleTutorial:false syncChunkWrites:true +showAutosaveIndicator:true +allowServerListing:true key_key.attack:key.mouse.left key_key.use:key.mouse.right key_key.forward:key.keyboard.w diff --git a/src/main/java/club/mcams/carpet/commands/rule/commandPing/pingCommandRegistry.java b/src/main/java/club/mcams/carpet/commands/rule/commandPing/pingCommandRegistry.java index b5044de5..bfbc48d7 100644 --- a/src/main/java/club/mcams/carpet/commands/rule/commandPing/pingCommandRegistry.java +++ b/src/main/java/club/mcams/carpet/commands/rule/commandPing/pingCommandRegistry.java @@ -65,26 +65,12 @@ public static void register(CommandDispatcher dispatcher) { } private static int executePing(PlayerEntity player, String targetIpOrDomainName, int pingQuantity) { - Thread pingThread = new Thread(() -> { - int successfulPings = 0; - int failedPings = 0; - long totalDelay = 0; - try { - boolean isFirstPing = true; - for (int i = 0; i < pingQuantity; i++) { - long delay = ping(player, targetIpOrDomainName, isFirstPing); - if (delay >= 0) { - successfulPings++; - totalDelay += delay; - } else { - failedPings++; - } - isFirstPing = false; - Thread.sleep(1000); - } - sendFinishMessage(player, pingQuantity, successfulPings, failedPings, successfulPings > 0 ? totalDelay / successfulPings : 0); - } catch (InterruptedException ignored) {} - }); + PingThread thread = (PingThread) PING_THREADS.get(player); + // 如果重新ping时之前的线程没有执行完,则先将原有的线程终止 + if (thread != null) { + thread.setInterrupted(); + } + Thread pingThread = new PingThread(pingQuantity,player,targetIpOrDomainName); pingThread.start(); PING_THREADS.put(player, pingThread); return 1; @@ -132,9 +118,9 @@ private static long ping(PlayerEntity player, String targetIpOrDomainName, boole private static int stopPing(PlayerEntity player) { String stopPing = translator.tr("stop_ping").getString(); String activePingIsNull = translator.tr("active_ping_is_null").getString(); - Thread pingThread = PING_THREADS.get(player); - if (pingThread != null && pingThread.isAlive()) { - pingThread.interrupt(); + PingThread pingThread = (PingThread)PING_THREADS.get(player); + if (pingThread != null) { + pingThread.setInterrupted(); player.sendMessage(LiteralTextUtil.compatText(String.format("§b%s §4%s", MSG_HEAD, stopPing)), false); } else { player.sendMessage(LiteralTextUtil.compatText(String.format("§b%s §4%s", MSG_HEAD, activePingIsNull)), false); @@ -160,4 +146,46 @@ private static void sendFinishMessage(PlayerEntity player, int totalPings, int s false ); } + static class PingThread extends Thread { + private volatile boolean interrupted = false; + private final int pingQuantity; + private final PlayerEntity player; + private final String targetIpOrDomainName; + private PingThread(int pingQuantity, PlayerEntity player, String targetIpOrDomainName) { + this.pingQuantity = pingQuantity; + this.player = player; + this.targetIpOrDomainName = targetIpOrDomainName; + } + @Override + public void run() { + int successfulPings = 0; + int failedPings = 0; + long totalDelay = 0; + try { + boolean isFirstPing = true; + for (int i = 0; i < pingQuantity; i++) { + if (interrupted){ + return; + } + long delay = ping(player, targetIpOrDomainName, isFirstPing); + if (delay >= 0) { + successfulPings++; + totalDelay += delay; + } else { + failedPings++; + } + isFirstPing = false; + Thread.sleep(1000); + } + sendFinishMessage(player, pingQuantity, successfulPings, failedPings, successfulPings > 0 ? totalDelay / successfulPings : 0); + } catch (InterruptedException ignored) { + } finally { + // 线程执行完毕后释放资源 + PING_THREADS.remove(player); + } + } + private void setInterrupted(){ + this.interrupted = true; + } + } }