Added first implementation.

This commit is contained in:
Andrew Lalis 2022-03-05 14:17:03 +01:00
parent 8adcf29bca
commit afad438104
4 changed files with 177 additions and 0 deletions

56
pom.xml Normal file
View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>nl.andrewl.</groupId>
<artifactId>randomhotbar</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.formdev</groupId>
<artifactId>flatlaf</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>com.github.kwhat</groupId>
<artifactId>jnativehook</artifactId>
<version>2.2.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>nl.andrewl.randomhotbar.RandomHotbar</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,72 @@
package nl.andrewl.randomhotbar;
import com.github.kwhat.jnativehook.GlobalScreen;
import com.github.kwhat.jnativehook.mouse.NativeMouseEvent;
import com.github.kwhat.jnativehook.mouse.NativeMouseInputListener;
import com.github.kwhat.jnativehook.mouse.NativeMouseWheelEvent;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class BlockPlaceListener implements NativeMouseInputListener {
private final Random rand = new Random();
private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
private final List<SlotSetting> settings;
private float randSum;
private int currentSlot = 1;
public BlockPlaceListener(List<SlotSetting> settings) {
randSum = 0;
for (var v : settings) {
randSum += v.chance();
}
this.settings = settings;
for (var v : settings) {
float percent = (v.chance() / randSum) * 100.0f;
System.out.printf("Will use slot %d, %.1f%% of the time.\n", v.slot(), percent);
}
System.out.printf("Starting at slot %d. Please select this slot if it is not selected already, then start right-clicking. Do not hold right-click.\n", currentSlot);
}
private int getNextSlot() {
float idx = rand.nextFloat(randSum);
float sum = 0;
int i = 0;
while (sum < idx) {
sum += settings.get(i++).chance();
}
return settings.get(Math.max(0, i - 1)).slot();
}
private void moveToSlot(int slot) {
final int dir = slot < currentSlot ? 1 : -1;
int n = Math.abs(currentSlot - slot);
for (int i = 0; i < n; i++) {
executor.schedule(() -> {
GlobalScreen.postNativeEvent(new NativeMouseWheelEvent(
2505,
0,
500,
500,
1,
NativeMouseWheelEvent.WHEEL_UNIT_SCROLL,
1,
dir,
NativeMouseWheelEvent.WHEEL_VERTICAL_DIRECTION
));
}, i * 50L, TimeUnit.MILLISECONDS);
}
currentSlot = slot;
}
@Override
public void nativeMouseClicked(NativeMouseEvent nativeEvent) {
if (nativeEvent.getButton() == 2) {
int newSlot = getNextSlot();
moveToSlot(newSlot);
}
}
}

View File

@ -0,0 +1,45 @@
package nl.andrewl.randomhotbar;
import com.github.kwhat.jnativehook.GlobalScreen;
import com.github.kwhat.jnativehook.NativeHookException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RandomHotbar {
public static void main(String[] args) {
try {
GlobalScreen.registerNativeHook();
} catch (NativeHookException e) {
e.printStackTrace();
}
var settings = parseSettings(String.join(",", args));
var listener = new BlockPlaceListener(settings);
GlobalScreen.addNativeMouseListener(listener);
}
public static final Pattern SETTINGS_PATTERN = Pattern.compile("([1-9])\\s*:\\s*(\\d*\\.\\d+|\\d+)%?");
public static List<SlotSetting> parseSettings(String s) {
List<SlotSetting> settings = new ArrayList<>(9);
Matcher m = SETTINGS_PATTERN.matcher(s);
while (m.find()) {
int slot = Integer.parseInt(m.group(1));
float value = Float.parseFloat(m.group(2));
for (var setting : settings) {
if (setting.slot() == slot) {
throw new IllegalArgumentException("A setting for slot " + slot + " is already defined.");
}
}
settings.add(new SlotSetting(slot, value));
}
settings.sort(Comparator.comparing(SlotSetting::slot));
if (settings.isEmpty()) {
for (int i = 1; i <= 9; i++) {
settings.add(new SlotSetting(i, 1));
}
}
return settings;
}
}

View File

@ -0,0 +1,4 @@
package nl.andrewl.randomhotbar;
public record SlotSetting(int slot, float chance) {
}