Compare commits

...

3 commits

Author SHA1 Message Date
81fa6440a0
Improve hardcore RNG
All checks were successful
/ build (push) Successful in 57s
2025-01-02 13:19:23 +01:00
6ad6550f5d
Fix logging in updater 2025-01-02 12:54:08 +01:00
0d87ca8f76
Add to README 2025-01-01 16:32:28 +01:00
7 changed files with 53 additions and 19 deletions

View file

@ -83,11 +83,16 @@ Issue messages that the player needs to read to keep playing, and that make an a
### Remote redstone ### Remote redstone
Adds a "gateway" item that are controlled over internet. \ Adds a "gateway" item that are controlled over internet. \
[RETSTONE.md for more info](/Minecon724/tweaks724/src/branch/master/RETSTONE.md) [RETSTONE.md for more info](/Minecon724/tweaks724/src/branch/master/docs/RETSTONE.md)
### Knockback ### Knockback
Control knockback dealt by entities Control knockback dealt by entities
### Kill switch
Quickly kills (terminates) the server on trigger, via command or HTTP request.
[KILLSWITCH.md for more info](/Minecon724/tweaks724/src/branch/master/docs/KILLSWITCH.md)
### Utility commands ### Utility commands
- `/ping` - displays player ping \ - `/ping` - displays player ping \

3
docs/README.md Normal file
View file

@ -0,0 +1,3 @@
Here's the documentation.
Click above on a file to read more about a topic.

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- <!--
~ Copyright (C) 2024 Minecon724 ~ Copyright (C) 2025 Minecon724
~ Tweaks724 is licensed under the GNU General Public License. See the LICENSE.md file ~ Tweaks724 is licensed under the GNU General Public License. See the LICENSE.md file
~ in the project root for the full license text. ~ in the project root for the full license text.
--> -->

View file

@ -45,7 +45,7 @@ public record TweaksConfig(
boolean updaterEnabled, boolean updaterEnabled,
boolean hardcoreEnabled, boolean hardcoreEnabled,
float hardcoreChance, double hardcoreChance,
boolean sleepEnabled, boolean sleepEnabled,
boolean sleepInstant, boolean sleepInstant,
@ -117,7 +117,7 @@ public record TweaksConfig(
boolean updaterEnabled = config.getBoolean("updater.enabled"); boolean updaterEnabled = config.getBoolean("updater.enabled");
boolean hardcoreEnabled = config.getBoolean("hardcore.enabled"); boolean hardcoreEnabled = config.getBoolean("hardcore.enabled");
float hardcoreChance = (float) config.getDouble("hardcore.chance"); double hardcoreChance = config.getDouble("hardcore.chance");
boolean sleepEnabled = config.getBoolean("sleep.enabled"); boolean sleepEnabled = config.getBoolean("sleep.enabled");
boolean sleepInstant = config.getBoolean("sleep.instant"); boolean sleepInstant = config.getBoolean("sleep.instant");

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2024 Minecon724 * Copyright (C) 2025 Minecon724
* Tweaks724 is licensed under the GNU General Public License. See the LICENSE.md file * Tweaks724 is licensed under the GNU General Public License. See the LICENSE.md file
* in the project root for the full license text. * in the project root for the full license text.
*/ */
@ -8,14 +8,40 @@ package eu.m724.tweaks.hardcore;
import com.comphenix.protocol.PacketType; import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.*; import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import eu.m724.tweaks.DebugLogger;
import eu.m724.tweaks.TweaksConfig; import eu.m724.tweaks.TweaksConfig;
import net.minecraft.world.level.levelgen.RandomSupport;
import net.minecraft.world.level.levelgen.Xoroshiro128PlusPlus;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import java.math.BigDecimal;
import java.math.BigInteger;
// how we do it is much faster than any Random
public class HardcoreManager { public class HardcoreManager {
private final float chance = TweaksConfig.getConfig().hardcoreChance(); private final double chance = TweaksConfig.getConfig().hardcoreChance();
private final long chanceLong = BigInteger.valueOf(Long.MIN_VALUE)
.add(
new BigDecimal(
BigInteger.valueOf(Long.MAX_VALUE).subtract(BigInteger.valueOf(Long.MIN_VALUE))
).multiply(
BigDecimal.valueOf(chance)
).toBigInteger()
).longValue();
private final Xoroshiro128PlusPlus rng = new Xoroshiro128PlusPlus(
RandomSupport.generateUniqueSeed(),
RandomSupport.generateUniqueSeed()
);
public void init(Plugin plugin) { public void init(Plugin plugin) {
DebugLogger.fine("Chance long: " + chanceLong);
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter( ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(
plugin, plugin,
ListenerPriority.NORMAL, ListenerPriority.NORMAL,
@ -24,9 +50,8 @@ public class HardcoreManager {
@Override @Override
public void onPacketSending(PacketEvent event) { public void onPacketSending(PacketEvent event) {
PacketContainer packet = event.getPacket(); PacketContainer packet = event.getPacket();
int entityId = packet.getIntegers().read(0);
if (chance > ((48271 * entityId) % 65537) / 65537f) // gotta be fast if (rng.nextLong() < chanceLong)
// the "is hardcore" boolean https://wiki.vg/Protocol#Login_.28play.29 // the "is hardcore" boolean https://wiki.vg/Protocol#Login_.28play.29
packet.getBooleans().write(0, true); packet.getBooleans().write(0, true);
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2024 Minecon724 * Copyright (C) 2025 Minecon724
* Tweaks724 is licensed under the GNU General Public License. See the LICENSE.md file * Tweaks724 is licensed under the GNU General Public License. See the LICENSE.md file
* in the project root for the full license text. * in the project root for the full license text.
*/ */
@ -19,26 +19,28 @@ import java.util.HashSet;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionException;
import java.util.logging.Logger;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class UpdateChecker extends BukkitRunnable { public class UpdateChecker extends BukkitRunnable {
private final Logger logger;
private final Set<VersionedResource> resources; private final Set<VersionedResource> resources;
static final Set<VersionedResource> availableUpdates = new HashSet<>(); static final Set<VersionedResource> availableUpdates = new HashSet<>();
static LocalTime lastChecked = null; static LocalTime lastChecked = null;
UpdateChecker(Set<VersionedResource> resources) { UpdateChecker(Logger logger, Set<VersionedResource> resources) {
this.logger = logger;
this.resources = resources; // TODO make a copy? this.resources = resources; // TODO make a copy?
} }
private void checkAll() { private void checkAll() {
//logger.info("Checking for updates"); DebugLogger.fine("Checking for updates");
lastChecked = LocalTime.now(ZoneOffset.UTC); lastChecked = LocalTime.now(ZoneOffset.UTC);
availableUpdates.clear(); availableUpdates.clear();
for (VersionedResource versionedResource : Set.copyOf(resources)) { for (VersionedResource versionedResource : Set.copyOf(resources)) {
String pluginName = versionedResource.resource().plugin().getName(); String pluginName = versionedResource.resource().plugin().getName();
//logger.info(versionedResource.resource().resourceId() + " " + versionedResource.resource().plugin().getName());
int page = versionedResource.running() != null ? versionedResource.running().page() : 1; int page = versionedResource.running() != null ? versionedResource.running().page() : 1;
try { try {
@ -46,14 +48,13 @@ public class UpdateChecker extends BukkitRunnable {
if (!versionedResource.equals(newResource)) { if (!versionedResource.equals(newResource)) {
resources.remove(versionedResource); resources.remove(versionedResource);
if (newResource.running() == null) { if (newResource.running() == null) {
DebugLogger.info("Unable to find installed version of %s".formatted(pluginName)); logger.warning("Unable to find installed version of %s".formatted(pluginName));
if (versionedResource.running() != null) { if (versionedResource.running() != null) {
DebugLogger.info("Did you downgrade %s? If so, clear cache".formatted(pluginName)); logger.warning("Did you downgrade %s? If so, clear cache".formatted(pluginName));
} }
} else { } else {
if (!newResource.running().equals(newResource.latest())) { if (!newResource.running().equals(newResource.latest())) {
availableUpdates.add(newResource); availableUpdates.add(newResource);
//logger.info("Update available for %s. %d -> %d".formatted(pluginName, newResource.running().updateId(), newResource.latest().updateId()));
} }
} }
resources.add(newResource); resources.add(newResource);
@ -67,11 +68,11 @@ public class UpdateChecker extends BukkitRunnable {
private void alert() { private void alert() {
int n = availableUpdates.size(); int n = availableUpdates.size();
if (n == 0) return; if (n == 0) return;
DebugLogger.info(Language.getString("updateAvailableNotice", n)); logger.info(Language.getString("updateAvailableNotice", n));
availableUpdates.stream() availableUpdates.stream()
.map(u -> "- %s (%s -> %s)".formatted(u.resource().name(), u.running().label(), u.latest().label())) .map(u -> "- %s (%s -> %s)".formatted(u.resource().name(), u.running().label(), u.latest().label()))
.forEach(DebugLogger::info); .forEach(logger::info);
} }
@Override @Override

View file

@ -60,7 +60,7 @@ public class UpdaterManager {
)).collect(Collectors.toSet()); )).collect(Collectors.toSet());
new UpdateChecker(versionedResources) new UpdateChecker(plugin.getLogger(), versionedResources)
.runTaskTimerAsynchronously(plugin, 600, 12 * 3600 * 20); .runTaskTimerAsynchronously(plugin, 600, 12 * 3600 * 20);
updatesCommand.setExecutor(new UpdaterCommands()); updatesCommand.setExecutor(new UpdaterCommands());