Skip to content

Commit 149afe0

Browse files
committed
#versions reports versions for modloader, game and loaded mods (where available)
1 parent 46b566f commit 149afe0

File tree

4 files changed

+78
-6
lines changed

4 files changed

+78
-6
lines changed

modules/modlauncher/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<dependency>
1818
<groupId>org.gotti.wurmunlimited</groupId>
1919
<artifactId>modloader-shared</artifactId>
20-
<version>0.13</version>
20+
<version>0.14</version>
2121
</dependency>
2222
<dependency>
2323
<groupId>org.gotti.wurmunlimited</groupId>

modules/modlauncher/src/main/java/org/gotti/wurmunlimited/modloader/server/Listeners.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,51 @@
1212

1313
import org.gotti.wurmunlimited.modloader.interfaces.WurmServerMod;
1414

15+
/**
16+
* Listeners management
17+
*
18+
* @param <T> Listener type
19+
* @param <V> Listener return type
20+
*/
1521
public class Listeners<T, V> {
1622

1723
private static final Logger LOGGER = Logger.getLogger(Listeners.class.getName());
1824

1925
private List<T> listeners = new CopyOnWriteArrayList<>();
2026
private Class<T> listenerClass;
2127

28+
/**
29+
* Create listeners manager
30+
* @param listenerClass listener class type
31+
*/
2232
public Listeners(Class<T> listenerClass) {
2333
this.listenerClass = listenerClass;
2434
}
2535

36+
/**
37+
* Add a mod if it implements the listener
38+
* @param mod mod to add
39+
*/
2640
public void add(WurmServerMod mod) {
2741
if (this.listenerClass.isInstance(mod) && !listeners.contains(mod)) {
2842
listeners.add(listenerClass.cast(mod));
2943
}
3044
}
3145

46+
/**
47+
* Add a listener
48+
* @param listener listener to add
49+
*/
50+
public void add(T listener) {
51+
if (!listeners.contains(listener)) {
52+
listeners.add(listener);
53+
}
54+
}
55+
56+
/**
57+
* Process listeners
58+
* @param handler consumer which is called for each listener
59+
*/
3260
public void fire(Consumer<T> handler) {
3361
listeners.forEach(listener -> {
3462
try {
@@ -39,6 +67,13 @@ public void fire(Consumer<T> handler) {
3967
});
4068
}
4169

70+
/**
71+
* Process listeners
72+
* @param handler consumer which is called for each listener
73+
* @param onFailure supplier which is called if a listener threw an exception
74+
* @param combiner combine results of each listener
75+
* @return combined results
76+
*/
4277
public Optional<V> fire(Function<T, V> handler, Supplier<V> onFailure, BinaryOperator<V> combiner) {
4378
return listeners
4479
.stream()

modules/modlauncher/src/main/java/org/gotti/wurmunlimited/modloader/server/ServerHook.java

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package org.gotti.wurmunlimited.modloader.server;
22

3+
import java.util.ArrayList;
34
import java.util.Arrays;
45
import java.util.List;
56

67
import org.gotti.wurmunlimited.modcomm.ModComm;
78
import org.gotti.wurmunlimited.modloader.interfaces.ChannelMessageListener;
89
import org.gotti.wurmunlimited.modloader.interfaces.ItemTemplatesCreatedListener;
910
import org.gotti.wurmunlimited.modloader.interfaces.MessagePolicy;
11+
import org.gotti.wurmunlimited.modloader.interfaces.ModEntry;
1012
import org.gotti.wurmunlimited.modloader.interfaces.PlayerLoginListener;
1113
import org.gotti.wurmunlimited.modloader.interfaces.PlayerMessageListener;
1214
import org.gotti.wurmunlimited.modloader.interfaces.ServerPollListener;
@@ -15,6 +17,7 @@
1517
import org.gotti.wurmunlimited.modloader.interfaces.WurmServerMod;
1618

1719
import com.wurmonline.server.Message;
20+
import com.wurmonline.server.MiscConstants;
1821
import com.wurmonline.server.creatures.Communicator;
1922
import com.wurmonline.server.players.Player;
2023
import com.wurmonline.server.villages.PvPAlliance;
@@ -36,12 +39,41 @@ public class ServerHook {
3639
protected ServerHook() {
3740
}
3841

39-
public void addMods(List<WurmServerMod> wurmMods) {
40-
wurmMods.forEach(mod -> {
41-
handlers.forEach(handler -> handler.add(mod));
42+
public void addMods(List<? extends ModEntry<WurmServerMod>> wurmMods) {
43+
wurmMods.forEach(entry -> {
44+
handlers.forEach(handler -> handler.add(entry.getWurmMod()));
4245
});
4346
}
4447

48+
private String formatVersion(String name, String version) {
49+
return String.format("%s version: %s", name, version == null ? "unversioned" : version);
50+
}
51+
52+
public void addVersionHandler(String modloaderVersion, String gameVersion, List<? extends ModEntry<WurmServerMod>> wurmMods) {
53+
playerMessage.add(new PlayerMessageListener() {
54+
55+
@Override
56+
public MessagePolicy onPlayerMessage(Communicator communicator, String message, String title) {
57+
if (communicator.getPlayer().getPower() > MiscConstants.POWER_HERO && message != null && message.startsWith("#versions")) {
58+
List<String> versions = new ArrayList<>();
59+
versions.add(formatVersion("game", gameVersion));
60+
versions.add(formatVersion("modloader", modloaderVersion));
61+
wurmMods.forEach(entry -> versions.add(formatVersion(entry.getName(), entry.getWurmMod().getVersion())));
62+
63+
versions.forEach(version -> communicator.sendNormalServerMessage(version));
64+
return MessagePolicy.DISCARD;
65+
}
66+
return MessagePolicy.PASS;
67+
}
68+
69+
@Override
70+
public boolean onPlayerMessage(Communicator communicator, String message) {
71+
// unused legacy
72+
return false;
73+
}
74+
});
75+
}
76+
4577
public void fireOnServerStarted() {
4678
ModComm.serverStarted();
4779
serverStarted.fire(listener -> listener.onServerStarted());

modules/modlauncher/src/main/java/org/gotti/wurmunlimited/serverlauncher/DelegatedLauncher.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import org.gotti.wurmunlimited.modloader.ModLoader;
99
import org.gotti.wurmunlimited.modloader.classhooks.HookManager;
10+
import org.gotti.wurmunlimited.modloader.interfaces.ModEntry;
1011
import org.gotti.wurmunlimited.modloader.interfaces.WurmServerMod;
1112
import org.gotti.wurmunlimited.modloader.server.ServerHook;
1213

@@ -15,8 +16,12 @@ public class DelegatedLauncher {
1516
public static void main(String[] args) {
1617

1718
try {
18-
List<WurmServerMod> wurmMods = new ModLoader().loadModsFromModDir(Paths.get("mods"));
19-
ServerHook.createServerHook().addMods(wurmMods);
19+
ModLoader modLoader = new ModLoader();
20+
List<? extends ModEntry<WurmServerMod>> wurmMods = modLoader.loadModsFromModDir(Paths.get("mods"));
21+
22+
ServerHook serverHook = ServerHook.createServerHook();
23+
serverHook.addMods(wurmMods);
24+
serverHook.addVersionHandler(modLoader.getVersion(), modLoader.getGameVersion(), wurmMods);
2025
HookManager.getInstance().initCallbacks();
2126

2227
String[] classes = {

0 commit comments

Comments
 (0)