ago

[RELEASED] Server mod loader + priest + crops + seasons + server packs + bag of holding

Recommended Posts

Any ideas why everything appears to be working normally... and then when my server "is connected to steam" it never shows up in the list?


 


If I run the normal launcher without changing anything - my server shows up in the list.


Share this post


Link to post
Share on other sites

So, have been tinkering around, and while I was learning how to work with 0.5.1 you moved up to 0.7.  Rather impressed with your extra harvest solution, rather inspired.  On the priest improving penalties though, I did it differently and thought I'd share.  Here's the part that goes in PreInit (once you've checked the appropriate boolean):



try {
    CtClass ctMethodsItems = HookManager.getInstance().getClassPool().get("com.wurmonline.server.behaviours.MethodsItems");
    ctMethodsItems.getDeclaredMethod("improveItem").instrument(new IsPriestSuppressor());
    ctMethodsItems.getDeclaredMethod("polishItem").instrument(new IsPriestSuppressor());
    ctMethodsItems.getDeclaredMethod("temper").instrument(new IsPriestSuppressor());
}
catch (NotFoundException | CannotCompileException e) {
    throw new HookException(e);
}

And here's that IsPriestSuppressor, along with the debug boolean I've been using to turn on and off debugging statements:



class IsPriestSuppressor extends ExprEditor {
    public void edit(MethodCall m)
            throws CannotCompileException {
        if (m.getClassName().equals("com.wurmonline.server.creatures.Creature")
                && m.getMethodName().equals("isPriest")) {
            String replacementString = "";
            if(bDebug) replacementString += "System.out.println(\"isPriest suppressed to false\");\nSystem.out.flush();\n";
            m.replace(replacementString + "$_ = false;");
        }
    }
}
private static boolean bDebug = false;

I don't pretend to know whether creating Exceptions is any better or worse than my method, but it does have the virtue of only applying / being run on IsPriest() calls from those three functions and those three functions only.


 


Hmm.  Should refactor that call to ClassPool to HookManager.getInstance().getClassPool() now that I think of it.  (EDIT: Did)


 


Oh, and I wouldn't have thought of the bytecode editing to alter the harvest quantity, but I instead targeted bonusYield (which is set only once), and more importantly, also did the same trick in TileFieldBehavior, so that players with high Farming skill examining the tile will count the bonus yield in their yield estimates.  The function you're looking for is "action" and the parameters are:



CtClass[] actionParamTypes = {
        HookManager.getInstance().getClassPool().get("com.wurmonline.server.behaviours.Action"),
        HookManager.getInstance().getClassPool().get"com.wurmonline.server.creatures.Creature"),
        CtPrimitiveType.intType,
        CtPrimitiveType.intType,
        CtPrimitiveType.booleanType,
        CtPrimitiveType.intType,
        CtPrimitiveType.shortType,
        CtPrimitiveType.floatType
};

Thanks a bunch for this mod framework, it is fantastic!


Edited by WalkerInTheVoid
  • Like 1

Share this post


Link to post
Share on other sites

Yeah, ExprEditor has its limitations (can't do what you did with extra harvests, since it can't even see local variables in methods), but lemme share another use I had for it.  In CropMod's preInit() :



if (disableWeeds) {
try {
CtClass ctCropTilePoller = HookManager.getInstance().getClassPool().get("com.wurmonline.server.zones.CropTilePoller");
//pollCropTiles is where the server runs through all the fields to call checkForFarmGrowth on them.
//But it keeps all the tiles in one list. We get that method...
CtMethod ctPollCropTiles = ctCropTilePoller.getDeclaredMethod("pollCropTiles");
//Now to employ a new ExprEditor that marks tiles of age 6 as for removal, and skips the
//checkForFarmGrowth call. If it's not age 6, continue as normal.
ctPollCropTiles.instrument(new ExprEditor() {
public void edit(MethodCall m)
throws CannotCompileException {
if (m.getClassName().equals("com.wurmonline.server.zones.CropTilePoller")
&& m.getMethodName().equals("checkForFarmGrowth")) {
//A quick statement to the console if the debugging flag is set...
Debug("Replacing checkFarmGrowth");
String replaceString = "if (((data >> 4) & 0x7) == 6) {\n";
//And another debug message placed in the new code itself to send messages when it runs.
if(bDebug)
replaceString += " System.out.println(\"Removing aged tile from polled tiles\");\n" +
" System.out.flush();\n";
//Now for the removal, and the else clause to call checkForFarmGrowth on younger tiles...
replaceString += " toRemove.add(cTile);\n" +
"}\n" +
"else {\n" +
" checkForFarmGrowth(currTileId, cTile.getX(), cTile.getY(), "
+ "type, (byte)data, meshToUse, cTile.isOnSurface());\n" +
"}\n$_ = null;";
m.replace(replaceString);
}
}
});
} catch (NotFoundException | CannotCompileException e) {
throw new HookException(e);
}
}

This one marks any tile that is too old (age 6) for removal from the polled field tiles list.  This prevents checkForFarmGrowth from being called on it entirely, and the server never even reprocesses that particular field tile until the next restart (where it considers it once, the above code removes it from the list, and checkForFarmGrowth is never used on it).  Though personally, I left the hook in checkForFarmGrowth in place, just in case.


 


I have to thank you again for the mod framework.  Got a couple mods of my own in the works, if I can only figure out GitHub then I'll share those too :)


  • Like 1

Share this post


Link to post
Share on other sites

Okay, found an odd bug for you.  Not sure which part is the bug, but here goes.


 


As things currently stand, a mod can be Configurable, PreInitable, and Initable independently.  Personally, I don't think that's the bug, that's a feature, a mod can "register" for whichever parts apply to it, simply by implementing the respective interface.


 


But I just tracked down a bug where preInit() was being called before configure().  Tracked the thing down to Modloader.java:



// new style mods with initable will do configure, preInit, init
mods.stream().filter(modEntry -> modEntry.mod instanceof Initable && modEntry.mod instanceof Configurable).forEach(modEntry -> ((Configurable) modEntry.mod).configure(modEntry.properties));

mods.stream().filter(modEntry -> modEntry.mod instanceof PreInitable).forEach(modEntry -> ((PreInitable)modEntry.mod).preInit());

mods.stream().filter(modEntry -> modEntry.mod instanceof Initable).forEach(modEntry -> ((Initable)modEntry.mod).init());

// old style mods without initable will just be configure, but they are handled last
mods.stream().filter(modEntry -> !(modEntry.mod instanceof Initable) && modEntry.mod instanceof Configurable).forEach(modEntry -> ((Configurable) modEntry.mod).configure(modEntry.properties));

If you saw the problem right now, you're doing better than I did.  The problem was the mod in question was Configurable and PreInitable....but NOT Initable, since it did all the work it needed to do in the PreInit "phase".  This meant ModLoader thought it was an old Configurable-only mod (since the check is for Initable & Configurable, not at all for PreInitable), and so skipped calling its configure() method until later...but there's no such check on init() or preInit() >_<  Thus such a mod would have preInit() called, then configure(). 


 


If you share my opinion that this is the bug, here's a fix for you:



// new style mods with initable or preinitable will do configure, preInit, init
mods.stream().filter(modEntry -> (modEntry.mod instanceof Initable || modEntry.mod instanceof PreInitable ) && modEntry.mod instanceof Configurable).forEach(modEntry -> ((Configurable) modEntry.mod).configure(modEntry.properties));

mods.stream().filter(modEntry -> modEntry.mod instanceof PreInitable).forEach(modEntry -> ((PreInitable)modEntry.mod).preInit());

mods.stream().filter(modEntry -> modEntry.mod instanceof Initable).forEach(modEntry -> ((Initable)modEntry.mod).init());

// old style mods without initable or preinitable will just be configure, but they are handled last
mods.stream().filter(modEntry -> !(modEntry.mod instanceof Initable) && !(modEntry.mod instanceof PreInitable) && modEntry.mod instanceof Configurable).forEach(modEntry -> ((Configurable) modEntry.mod).configure(modEntry.properties));

Edited by WalkerInTheVoid
  • Like 1

Share this post


Link to post
Share on other sites

Well, if you're taking suggestions, here's another one I just came across.  I'm working with a remote server whose console I can't get to, so I can't see any Debug messages or otherwise figure out why none of my mods are working over there (they're working fine on my machine).  But along the way, I put this is ModLoader:



public static final void createLoggers() {
final Logger logger = Logger.getLogger("org.gotti");
logger.setUseParentHandlers(false);
final Handler[] h = logger.getHandlers();
System.out.println("org.gotti logger handlers: " + Arrays.toString(h));
for (int i = 0; i != h.length; ++i) {
logger.removeHandler(h[i]);
}
try {
final String logsPath = Paths.get("mods") + "/logs/";
final File newDirectory = new File(logsPath);
if (!newDirectory.exists()) {
newDirectory.mkdirs();
}
final FileHandler fh = new FileHandler(String.valueOf(logsPath) + "mods.log", 10240000, 200, true);
fh.setFormatter(new SimpleFormatter());
logger.addHandler(fh);
if (Constants.devmode) {
logger.addHandler(new ConsoleHandler());
}
}
catch (IOException ie) {
System.err.println("no redirection possible, stopping server");
System.exit(1);
}
}


This function points the loggers to a log file in mods/logs.  Why?  So that we can call it at the beginning of loadModsFromModDir, and now all the logger information makes it into that mods/logs folder, instead of going to the console (and in my current case, then being lost).  Hope that helps :)


 


 


  • Like 1

Share this post


Link to post
Share on other sites

Frustrating.  After making the change above, adding logging calls throughout, the best I've been able to come up with is, that ProxyServerHook registers the Server.startRunning hook...which just never gets called.  At all.  No exception I can find, nothing.  Just never called.  It of course works fine on my local machine, so I'm at a bit of a loss.


 


Similarly, all the mods run their preinits and inits without issue, but none of the changes seem to stick.


 


Unfortunately, I am working with a modified server.jar, because I am unable to change how the server is started.  A line of code into WurmGuiServerMain, a line commented out in DelegatedLauncher, and I had a solution that, while I consider it inferior to yours because it requires modifying the server.jar, it worked under what I thought was the current conditions.  Note that I'm able to get this solution to work on my local machine under the exact same conditions (running via WurmServerLauncher.exe), with the exact same jars and properties files...I'm at a loss.


Edited by WalkerInTheVoid

Share this post


Link to post
Share on other sites

is it possible to be a priest in single player without "cheating" aka just suddenly having it? in wurm online you had to work hard...very hard to become a priest 


Share this post


Link to post
Share on other sites

is it possible to be a priest in single player without "cheating" aka just suddenly having it? in wurm online you had to work hard...very hard to become a priest 

 

Ayep.  You have to go to the Altar of Three to become a follower solo, and again to become a priest.

Share this post


Link to post
Share on other sites

Frustrating.  After making the change above, adding logging calls throughout, the best I've been able to come up with is, that ProxyServerHook registers the Server.startRunning hook...which just never gets called.  At all.  No exception I can find, nothing.  Just never called.  It of course works fine on my local machine, so I'm at a bit of a loss.

 

Similarly, all the mods run their preinits and inits without issue, but none of the changes seem to stick.

 

Unfortunately, I am working with a modified server.jar, because I am unable to change how the server is started.  A line of code into WurmGuiServerMain, a line commented out in DelegatedLauncher, and I had a solution that, while I consider it inferior to yours because it requires modifying the server.jar, it worked under what I thought was the current conditions.  Note that I'm able to get this solution to work on my local machine under the exact same conditions (running via WurmServerLauncher.exe), with the exact same jars and properties files...I'm at a loss.

 

To load the modified classes a 2nd classloader is used.

 

To include the loader in the server.jar a few steps are required to get the class loading right:

 

* rename com.wurmonline.server.gui.WurmServerGuiMain to com.wurmonline.server.gui.WurmServerGuiMainDeferred

* create a new com.wurmonline.server.gui.WurmServerGuiMain with just a static void main(String[]) that calls org.gotti.wurmunlimited.serverlauncher.ServerLauncher

* in org.gotti.wurmunlimited.serverlauncher.DelegatedLauncher replace call to WurmServerGuiMain to WurmServerGuiMainDeferred

 

So the call chain should be:

 

WurmServerGuiMain (replacement) -> ServerLauncher -> DelegatedLauncher -> WurmServerGuiMainDeferred -> Game

 

Everything starting with DelegatedLauncher will be loaded with the 2nd classloader and can be altered with javassist. Everthing else will use the regular classloader which uses the unmodified class files server.jar

  • Like 1

Share this post


Link to post
Share on other sites

If you two could release a working server.jar that would allow players with rented remote servers who cannot change what gets started to still use modloader, that would be amazing.


Share this post


Link to post
Share on other sites

To load the modified classes a 2nd classloader is used.

 

To include the loader in the server.jar a few steps are required to get the class loading right:

 

* rename com.wurmonline.server.gui.WurmServerGuiMain to com.wurmonline.server.gui.WurmServerGuiMainDeferred

* create a new com.wurmonline.server.gui.WurmServerGuiMain with just a static void main(String[]) that calls org.gotti.wurmunlimited.serverlauncher.ServerLauncher

* in org.gotti.wurmunlimited.serverlauncher.DelegatedLauncher replace call to WurmServerGuiMain to WurmServerGuiMainDeferred

 

So the call chain should be:

 

WurmServerGuiMain (replacement) -> ServerLauncher -> DelegatedLauncher -> WurmServerGuiMainDeferred -> Game

 

Everything starting with DelegatedLauncher will be loaded with the 2nd classloader and can be altered with javassist. Everthing else will use the regular classloader which uses the unmodified class files server.jar

 

Tried this this morning, recompiled, added in the modified classes....and we're in business!  Again, I do agree this method is inferior, but it's the only one available to me currently.  Hopefully that will change in the future.  Another downside is such a solution requires modifying the modloader, code for it to work, hence why I've been naming the jarfile I've been using for the modloader code modloader.jar in the hopes of avoiding any confusion with modlauncher.jar.

 

As for posting a working server.jar...bear in mind that a .jar file is for all intents and purposes a .zip file, and is openable - and modifiable - by any zip program (7z, etc).  At worst, as soon as I figure out posting to GitHub (note to self: get on that) I can at the least post a the code modifications needed / class files to place in the appropriate jar files.  I haven't even touched the rest of the .class files inside the server.jar.

Share this post


Link to post
Share on other sites

Ok, im at a total loss as to what to do. I have currently tried every single answer and suggestion on here and I obviously am just not understanding something. But I keep getting one of two errors it is either that it cant find the specified path or that its unable to access jar file modlauncher.jar. I seem to get the unable to access when i change anything, and when i leave everything as it comes it cant find the specified path. I have no idea what im doing wrong but any help and/or input would be greatly appreciated. 


Share this post


Link to post
Share on other sites

https://github.com/ago1024/WurmServerModLauncher/releases/tag/v0.8.1

v0.8.1

new Feature: Bag of Holding priest spell

The spell reuses the courier enchantment to allow a priest to magicly distort space and time to create a larger volume on the inside. The spell power determines how much space is bend.

* added Linux shell script

* Startup scripts check for logging.properties

* Check for Initable or PreInitable on init (WalkerInTheVoid)

* Mods can elect to use the main class loader (sharedClassLoader property)

* Added callPrivateMethod to ReflectionUtil

* SpellMod: Replaced isPriest detection with bytecode editing (WalkerInTheVoid)

* CropMod: Replaced overgrowth check with bytecode editing (WalkerInTheVoid)

* BagOfHolding: Added mod to enlarge containers using a priest spell

* CreatureAgeMod: Replaced agePoll check with bytecode editing

  • Like 1

Share this post


Link to post
Share on other sites

* added Linux shell script

 

 

Hello,

 

first, thx for your awesome work :)

 

I try to run modloader with my linux installation.

It fails with libsteam_api.so no such file or directory (you will find log below).

I have no problem with standard WurmServerLauncher.

 

Here is the java command extracted from your script:

  

java "-Dworkdir=$PWD" "-Djava.library.path=$PWD/nativelibs" $LOGGING -Xmn256M -Xms512m -Xmx12048m -XX:+OptimizeStringConcat -XX:+AggressiveOpts -jar ./modlauncher.jar "$*"

Any suggestion ?

 

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException

at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)

at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)

at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)

at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)

at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)

at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)

at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)

at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)

at javafx.event.Event.fireEvent(Event.java:198)

at javafx.scene.Node.fireEvent(Node.java:8411)

at javafx.scene.control.Button.fire(Button.java:185)

at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)

at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)

at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)

at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)

at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)

at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)

at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)

at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)

at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)

at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)

at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)

at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)

at javafx.event.Event.fireEvent(Event.java:198)

at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)

at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)

at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)

at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)

at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:352)

at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275)

at java.security.AccessController.doPrivileged(Native Method)

at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:388)

at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)

at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:387)

at com.sun.glass.ui.View.handleMouseEvent(View.java:555)

at com.sun.glass.ui.View.notifyMouse(View.java:937)

at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)

at com.sun.glass.ui.gtk.GtkApplication.lambda$null$49(GtkApplication.java:139)

at java.lang.Thread.run(Thread.java:745)

Caused by: java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)

at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)

at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)

... 60 more

Caused by: java.lang.UnsatisfiedLinkError: /home/steam/steamcmd/wurm/nativelibs/libSteamServerJni.so: libsteam_api.so: cannot open shared object file: No such file or directory

at java.lang.ClassLoader$NativeLibrary.load(Native Method)

at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1938)

at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)

at java.lang.Runtime.loadLibrary0(Runtime.java:870)

at java.lang.System.loadLibrary(System.java:1122)

at SteamJni.SteamServerApi.<clinit>(SteamServerApi.java:26)

at com.wurmonline.server.steam.SteamHandler.<init>(SteamHandler.java:40)

at com.wurmonline.server.Server.<init>(Server.java:451)

at com.wurmonline.server.Server.getInstance(Server.java:476)

at com.wurmonline.server.ServerLauncher.runServer(ServerLauncher.java:105)

at com.wurmonline.server.gui.WurmServerGuiController.startButtonClicked(WurmServerGuiController.java:278)

Share this post


Link to post
Share on other sites
this is the error i get with it being fresh, nothing changed.

 

C:\Program Files (x86)\Steam\steamapps\common\Wurm Unlimited Dedicated Server\Wu

rmServerModLauncher-0.7>runtime\bin\java "-Dworkdir=C:\Program Files (x86)\Steam

\steamapps\common\Wurm Unlimited Dedicated Server\WurmServerModLauncher-0.7" "-D

java.library.path=C:\Program Files (x86)\Steam\steamapps\common\Wurm Unlimited D

edicated Server\WurmServerModLauncher-0.7\nativelib" -Xmn256M -Xms512m -Xmx2048m

 -XX:+AggressiveOpts -jar modlauncher.jar

The system cannot find the path specified.

 

here i have changed the runtime\bin\java to just java and i get this 

 




C:\Program Files (x86)\Steam\steamapps\common\Wurm Unlimited Dedicated Server\Wu

rmServerModLauncher-0.7>java "-Dworkdir=C:\Program Files (x86)\Steam\steamapps\c

ommon\Wurm Unlimited Dedicated Server\WurmServerModLauncher-0.7" "-Djava.library

.path=C:\Program Files (x86)\Steam\steamapps\common\Wurm Unlimited Dedicated Ser

ver\WurmServerModLauncher-0.7\nativelib" -Xmn256M -Xms512m -Xmx2048m -XX:+Aggres

siveOpts -jar modlauncher.jar

Error: Unable to access jarfile modlauncher.jar

 

this last error is what i get whenever i have tried to change anything that has been suggested here in the forums.



 

 



 

 

Share this post


Link to post
Share on other sites

Copy the contents of modlauncher.zip into the folder "C:\Program Files (x86)\Steam\steamapps\common\Wurm Unlimited Dedicated Server" and start modlauncher.bat from the folder "C:\Program Files (x86)\Steam\steamapps\common\Wurm Unlimited Dedicated Server\"

You're trying to start it from the subfolder "WurmServerModLauncher-0.7"

Share this post


Link to post
Share on other sites

Caused by: java.lang.UnsatisfiedLinkError: /home/steam/steamcmd/wurm/nativelibs/libSteamServerJni.so: libsteam_api.so: cannot open shared object file: No such file or directory

It can't find the steam libs. Try this:

 

#!/usr/bin/env bashif test -e "logging.properties"; then	LOGGING=-Djava.util.logging.config.file=logging.propertiesfiLD_LIBRARY_PATH="$PWD:$PWD/nativelibs" ./runtime/jre1.8.0_60/bin/java "-Dworkdir=$PWD" "-Djava.library.path=$PWD/nativelibs" $LOGGING -Xmn256M -Xms512m -Xmx2048m -XX:+OptimizeStringConcat -XX:+AggressiveOpts -jar ./modlauncher.jar "$*"
Edited by ago

Share this post


Link to post
Share on other sites

i have moved it all into the server folder and tried to start it again and i get this 


 


C:\Program Files (x86)\Steam\steamapps\common\Wurm Unlimited Dedicated Server>ja

va "-Dworkdir=C:\Program Files (x86)\Steam\steamapps\common\Wurm Unlimited Dedic

ated Server" "-Djava.library.path=C:\Program Files (x86)\Steam\steamapps\common\

Wurm Unlimited Dedicated Server\nativelib" -Xmn256M -Xms512m -Xmx2048m -XX:+Aggr

essiveOpts -jar modlauncher.jar

Error: Unable to access jarfile modlauncher.jar

 

 

i did try having it in different locations before but everything i have tried doesnt seem to want to work.

Edited by Akantenshu

Share this post


Link to post
Share on other sites

Does modlauncher.jar exist in "C:\Program Files (x86)\Steam\steamapps\common\Wurm Unlimited Dedicated Server"

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.