• Are you planning to upload your awesome tool to Hive? Please review the rules here.
    July 9, 2018: The rules for the Tool Section have been revised. Please be sure to read the revisions.

Warsmash Mod Engine (Alpha)

This bundle is marked as approved. It works and satisfies the submission rules.
This is the first binary distribution of the Warsmash Mod Engine for Warcraft III. In this Alpha version, you should expect that most likely nothing will work. You need to be ready to laugh at bugs. That is the way to enjoy this current build. If you manage to get into a single player game and have a good time, please post back here and leave a comment because that means you have already exceeded my expectations.

Warsmash is a Warcraft III modding project that aspires to eventually make Warcraft III modding easier by providing a replacement component for the game program that can be more easily modified -- while still requiring the Blizzard Warcraft III game and assets to be installed on the computer only from Blizzard. In short, buy Warcraft III from Blizzard, and then you can begin to use this mod engine with it.
Note:
This is not an anti-Reforged product. I had many amazing conversations with Kam while those guys were making Reforged, and I submitted bug reports to them and was treated with great kindness and got the impression that they were working hard. I posted about the idea of Warsmash here on the Hive in 2016 before Reforged was invented. I have had longer than the Reforged team had to do what I am doing, and I have achieved less, because I am a hobbyist. It is wrong to look at the matter in any way other than this, and when I suggest anything to the contrary I am most likely only doing so for comedic value or to help stimulate Reforged's growth.

Project Setup:
I have only tested this binary distribution with the English Warcraft III edition, Patch 1.22. Based on my tests, this program should be able to function if you reconfigure warsmash.ini to point to your Reforged installation, however when you do so, some of the features of this program will be missing.

For Patch 1.22 or similar patches, unzip the contents of Warsmash.zip and create a folder as a subdirectory of your Warcraft III installation, like this:
189057-a8f0aacd8019610a9116dfae70b97c82.png

Then, inside this Warsmash folder, you should see the Warsmash EXE as well as the necessary files.
It should look like this:
189058-4af075dbe283586544adf97abbaadb6d.png

If you double-click on this EXE, then this should launch the Warcraft III game using the Warsmash Mod Engine (so a lot of the features that are not Warsmash-supported yet will be disabled, but you should be able to click around and maybe even have some fun!). For many users the game will not launch at this time, because your hardware is not supported, so do not be surprised if it does not work. However, when that happens, feel free to report back here and discuss the nature of the problem. Most likely I will very soon publish a build of this tool that has improved error logging support.

Command-Line Options
At the time of writing, Warsmash supports two possible command line arguments. You can make a shortcut to Warsmash and either of these arguments to your shortcut:
Code:
-windowed
-loadfile <name>
The "loadfile" argument searches within the Warsmash game data, and not in any maps folder yet, so it is best if you test with builtin maps. One example would be "-loadfile (2)bootybay.w3m" that should work regardless of your Warcraft III version, for example. It should also load map files from the "Warsmash" folder in your game install if you are using the default configuration suggested above.
The "windowed" argument currently fights with the mouse capture system and can create nuisances that squash the render window and crash the game because it cannot process having a pixel height of 0 for the game window. When I settle on what the best bug tracker should be for this project, we can add that to the list of known bugs.

Open Source
Most of the entire point of Warsmash is to be an open source project. If you would like to build Warsmash yourself from source, you can download all of the necessary files at this location:
https://github.com/Retera/WarsmashModEngine
Warsmash is a Gradle Java project, which means that some of the dependencies are not included in the repo above, and instead they are downloaded as a part of the build process from their respective online locations.

The source code of the Warsmash EXE that I have included in this binary build for ease of use is here:
https://github.com/Retera/WarsmashWindowsWrapper
(This is a very tiny do-nothing program that launches Java, as well as forwarding the -loadfile style arguments to the Java program.)

Check out the Hosted Project Forums here: https://www.hiveworkshop.com/forums/warsmash-mod-engine.780/
Previews
Contents

Warsmash Mod Engine (Alpha) (Binary)

Reviews
eejin
A very cool project that shows a lot of promise. Launching it is kind of inconvenient as you have to obtain the Warcraft 1.22 game data files from somewhere. I think it would really help in adoption if you'd make it default to loading data from the...

Retera

Hosted Project: WME
Level 37
Joined
Apr 19, 2008
Messages
1,320

Here is the download for the Fel Orc Adventure map that I posted videos of myself playing on this engine a few times. I just played the map and was able to collect all 6 Fat Lewt items in about 30 minutes in my adventure. I launched the game by using this binary build, as well as the command line command:

Code:
.\Warsmash.exe -loadfile Maps\UndergroundFelOrcAdventure.w3x

In order for this to work, I created a custom folder inside the Warsmash folder called Maps, so this was basically at the location:

Code:
<War3Install>\Warsmash\Maps\

Here is a video of today's adventure in Warsmash:

I had to work really hard because there is currently no way to heal or revive my heroes, but I wanted Gor'thok to survive until the end, so I exploited kiting mechanics that do not work the same yet as in the base Warcraft III game, because the Warsmash kiting is simpler and creeps who attack one of my units will keep trying to attack that unit forever, so I was able to use this to keep Gor'thok alive all the way until the end to make sure that I had all the Fat Lewts collected at one time.
 

Retera

Hosted Project: WME
Level 37
Joined
Apr 19, 2008
Messages
1,320
Amazing what you have achieved :)
Thanks! But to me what I aspire to achieve in the future is a bit more amazing, since for most people the bundle here will probably still have a lot of issues when they try to use it. There is a lot of work to do for this project that I am aspiring towards, so this bundle only contains a binary snapshot of the current repo that I have been working on for the purposes of letting people tinker with it and get a general concept of what I am trying to achieve even if it is still under construction.
 

eejin

Tool Moderator
Level 11
Joined
Mar 6, 2017
Messages
201
A very cool project that shows a lot of promise. Launching it is kind of inconvenient as you have to obtain the Warcraft 1.22 game data files from somewhere. I think it would really help in adoption if you'd make it default to loading data from the WC3 Reforged game files. Right now you have to manually set that in a text file and I didn't manage to make it work.

It's missing a lot of functionality compared to WC3, but a lot of work has already been done too. The thing I missed most was drag selecting units. I'm looking forward to seeing more of the progress you are making and what kind of impact an open source WC3 will have on the community.
 

Retera

Hosted Project: WME
Level 37
Joined
Apr 19, 2008
Messages
1,320
Launching it is kind of inconvenient as you have to obtain the Warcraft 1.22 game data files from somewhere.
You can make it run with Reforged, but I just did not bother because then the unit shadows and some of the sounds do not load because I do not support them yet. I just tested with this same binary alpha build and unzipped it into my Reforged folder:

1618170326880.png

Then after this, I replaced my "warsmash.ini" to have these contents that specify to use the Reforged installation:
INI:
[DataSources]
Count=4
Type00=CASC
Path00=".."
Prefixes00=war3.w3mod,war3.w3mod\_deprecated.w3mod,war3.w3mod\_locales\enus.w3mod
Type01=MPQ
Path01="resources.MPQ"
Type02=Folder
Path02="C:\Users\MyUsername\Documents\Warcraft III\Maps"
Type03=Folder
Path03="."

You will have to change the INI config sample above since Reforged is not a self-contained product and uses My Documents, and currently this configuration wants to know the location of your Maps directory (the one provided uses the sample username "MyUsername" and needs to be changed).

Once I have this data configuration specified, I click the Warsmash EXE that I have located as follows (NOTE: It will not work if you put inside 2 folders instead of inside 1 folder due to the contents of the INI)

1618170538793.png

After I do this, the EXE will launch me to a menu that loads the legacy game client's menu definitions but from the Reforged installation. This looks about the same as with Patch 1.22, but it has the Korean note on the upper left, and it has the Reign of Chaos version button on the upper right.

1618170671326.png

Also, there is some bug with the Reforged support, so if you click the Campaign button to play campaign missions it will crash. So to get around this, you want to launch your maps with -loadfile from the command line instead. I think that this can be fixed later, though.

Edit:
Actually, I thought about this a bit more, and you probably do not want to do the above process unless you recompile the engine with MAX_PLAYERS=28 instead of MAX_PLAYERS=16. Maybe later we can change that constant to be a config value, or based on map save version.


Edit 2:
Here's a test image from a sourcecode mod to support Reforged campaign data. Apparently Reforged still includes all the metadata to build the old campaign UI, except that they are unified together so that the RoC/TFT distinction is gone. [Dropdown for Difficulty is missing because the Warsmash FDF parser does not support dropdowns -- not because it is missing in Reforged]
1618172185690.png
 
Last edited:
Level 6
Joined
Jul 21, 2019
Messages
153
Not realistic of me to promise i'll learn coding any time soon just to help you, when i can barely make GUI triggers work, (i think i could but by the time i become useful you'd probably be done already). But as i said i'm happy to serve as a guinea pig of sorts, i will eventually provide feedback which you can study in order to understand how accesible Warsmash is to average dummies who just play the game (unless it is meant only for users with coding skills).

Anyway, i have faith in you, what you're doing is far beyond my rodent comprehension, and i may not understand coding, but i can see you're commited to your project, that and the fact that you're clearly skilled already make me believe you're capable of finishing this, just don't give up!
 

Rui

Rui

Level 40
Joined
Jan 7, 2005
Messages
7,495
I am not a very experienced programmer myself. When I looked into your repository, I went to search for Main.java to try and figure out what happens from there, but no success. :p In any case, I'm skeptical whether the lot of it is understandable by the average mortal without further documentation?
 

Retera

Hosted Project: WME
Level 37
Joined
Apr 19, 2008
Messages
1,320
When I looked into your repository, I went to search for Main.java to try and figure out what happens from there, but no success.
Sorry, instead of Main it is named DesktopLauncher.java. This is the default bame if you create a new LibGDX project.
Retera/WarsmashModEngine

i will eventually provide feedback which you can study in order to understand how accesible Warsmash is to average dummies who just play the game
Were you able to run the EXE ? o_O
 
  • Like
Reactions: Rui
Level 2
Joined
May 13, 2020
Messages
14
It’s amazing, how far the project has come already :thumbs_up:

I know, I’m a bit late to the party, but here are some of my “findings” from testing out the game:

I had no issues starting a single player game. Campaign maps worked for the most part and custom maps seem to work out too for the most part.

Interestingly, these campaign maps wont load for me:

  • NightElf01
  • NightElf04
  • Orc04Interlude
  • NightElfX02
  • NightElfX03
  • NightElfX05
  • NightElfX07
  • NightElfX08
  • NightElfX08Finale
  • HumanX01
  • HumanX02
  • HumanX03Interlude
  • HumanX03
  • HumanX04
  • HumanX05
  • UndeadX04
  • UndeadX05
  • UndeadX07b
  • UndeadX08
  • UndeadX08Finale
Which is strange, since they – or some of them at least – seem to load just fine in the showcase videos. Maybe it is because I used version 1.21 or because I have a German copy of Warcraft.

Other than that, the German localization works without issues. The non-English letters are displayed perfectly fine too.

Also, unless there is a lot of fighting going on, or the map was just loaded, the frame rate is rather good. I usually got above 120 fps during normal gameplay.

Some minor issues, I have not yet seen documented anywhere else would be: The cliff and ground textures in Undead04 seem to be broken for some reason. And the portrait of the Unbroken model is unanimated (which is most likely because its only animation is named “stand” instead of “portrait”).

I’ve only had limited time to look at the code lately, so I can’t really make much of a statement about how it currently looks.

I hope there is some – at least slightly – helpful information in my short review :)
 

Retera

Hosted Project: WME
Level 37
Joined
Apr 19, 2008
Messages
1,320
Bundle has been updated. New version includes rudimentary support for some stuff such as
  • Healing potions
  • Reviving heroes
  • Network play, but in order to use it you have to enable it with command line and it's very hacked together right now, less than 1 week old network code
  • Multiple unit selection with drag-box-select
Unfortunately, I'm behind on testing the maps reported above by MfromAzeroth, so those campaign missions might still not work. I need to try that.
 
Level 2
Joined
May 13, 2020
Messages
14
Bundle has been updated. New version includes rudimentary support for some stuff such as
  • Healing potions
  • Reviving heroes
  • Network play, but in order to use it you have to enable it with command line and it's very hacked together right now, less than 1 week old network code
  • Multiple unit selection with drag-box-select
Unfortunately, I'm behind on testing the maps reported above by MfromAzeroth, so those campaign missions might still not work. I need to try that.
Really nice :grin:

Also, thanks for mentioning the thing with the crashes. It’s amazing how much progress you make and you can’t do everything at once :)

I tried it out with the new version and only the following maps still don’t work:
  • Orc04Interlude
  • NightElf01
  • NightElf04
  • NightElfX05
  • NightElfX07
  • NightElfX08
  • NightElfX08Finale
  • HumanX01
  • HumanX02
  • HumanX03
  • HumanX03Interlude
  • HumanX04
  • HumanX05
  • UndeadX04
  • UndeadX05
  • UndeadX07b
  • UndeadX08
  • UndeadX08Finale
NightElfX02 and NightElfX03 work perfectly well now. So, something you did must have fixed that too. :thumbs_up:

And could maybe you elaborate a bit on how the multiplayer mode works? From looking at the code I understood that it is activated with the command line argument “-client <address>” and that the server main is implemented in the WarsmashServer.java, but I didn’t quite figure out how to get it to run yet. I'd love to test it out but I don't have too much time to look at the code and figure it out myself.

I tested most of the new features: The hero-revive worked too, but it took a bit long until the revive was available (until the descend animation finishes).
Multi-unit-selection works fine (unless an unreasonable number of them is selected) and the frame rate seems a bit more stable when a lot is going on (or at least I perceived it that way). :)
 

Retera

Hosted Project: WME
Level 37
Joined
Apr 19, 2008
Messages
1,320
And could maybe you elaborate a bit on how the multiplayer mode works? From looking at the code I understood that it is activated with the command line argument “-client <address>” and that the server main is implemented in the WarsmashServer.java, but I didn’t quite figure out how to get it to run yet. I'd love to test it out but I don't have too much time to look at the code and figure it out myself.
I don't really think it's worth trying yet. It's in a weird place. Over LAN the latency was fine and I had a more-or-less acceptable game with 2 other players that lasted for 1.5 hrs.

But when I tried to play over a long distance with someone in a different timezone it was basically non-functional. There has to be some inherent latency in the design, similar to how the Gameplay Constants of Warcraft III allow the user to control a built-in latency of 200 ms or 250 ms or whatever it is.

Basically I was doing ping-pong with packets for every step of game logic, so I think the goal would be that if we have 200 ms of network latency, it's OK because that just means that each command given by the player doesn't start activating on his screen until 200 ms later.

Instead I was doing something basically equivalent to 200 ms from client to server to submit commands, 200 ms from server back to client to inform client that commands were accepted, meanwhile the world pauses for 400 ms waiting for the server to tell the client that the step of game logic has finished, and then after the 400 ms sum we do another round trip, so there is a constant step-step-step of choppy horrible gameplay. Then in my test game, the other player spammed the Rally Point ability and somehow got the game to just stop responding entirely.

Since then I tried to hack the code to make it able to work a bit differently, but then when I was testing it there were bugs and it was nonfunctional due to the bugs. I did not yet fix the bugs and instead I took a break. I'm not certain that I uploaded the code I was working on at the time onto github yet, but basically if you're pulling something down for multiplayer and trying to use it, it's going to be one of these experimental builds that is most likely not what you want and not going to work.

In concept, you are correct that the way I was playing was to launch WarsmashServer.java's main method, then join that game by using -client <ip address of server> as a command-line argument. This requires both clients to launch their game this way and each have a copy of a map, and each launch the game also with -loadfile <map> at startup, so that they instantly enter the game in parallel in the same map. After this, both map worlds appear frozen until the stdin of the WarsmashServer command line program receives the text "start" followed by a newline. It's incredibly hacky and just a test, and probably won't do what you want.

Other than that, great to hear that you're doing cool things and testing! Today was a work day for me so I probably won't do much Warsmash, but I might stop by again sometime soon and check in more about your other notes. Your evaluation of the state of things is very on-point. The hero revive system required me to hackily set the heroes that I was using to "does not decay" in the object editor (and even then it still hit some bug cases). Frame drops were almost 100% due to the path-finding evaluation system trying to find how a unit could reach a point -- in its failure case, it searches the entire map in a slow way that created almost all FPS drops that I have basically ever seen on Warsmash. The current builds have not fixed that slowness, but rather have opted to tell that path finding system to "give up sooner" which means that on a big map you could not right click and have your unit find his way from one side to the other. Also, units will more often stand and wait to think before moving even after the user tries to right click and tell them to move. This is instead of the entire engine, and the frames, waiting. So, it's like one step forward and another step back, maybe, but it's something.
 
Level 2
Joined
May 13, 2020
Messages
14
I don't really think it's worth trying yet. It's in a weird place. Over LAN the latency was fine and I had a more-or-less acceptable game with 2 other players that lasted for 1.5 hrs.

But when I tried to play over a long distance with someone in a different timezone it was basically non-functional. There has to be some inherent latency in the design, similar to how the Gameplay Constants of Warcraft III allow the user to control a built-in latency of 200 ms or 250 ms or whatever it is.

Basically I was doing ping-pong with packets for every step of game logic, so I think the goal would be that if we have 200 ms of network latency, it's OK because that just means that each command given by the player doesn't start activating on his screen until 200 ms later.

Instead I was doing something basically equivalent to 200 ms from client to server to submit commands, 200 ms from server back to client to inform client that commands were accepted, meanwhile the world pauses for 400 ms waiting for the server to tell the client that the step of game logic has finished, and then after the 400 ms sum we do another round trip, so there is a constant step-step-step of choppy horrible gameplay. Then in my test game, the other player spammed the Rally Point ability and somehow got the game to just stop responding entirely.

Since then I tried to hack the code to make it able to work a bit differently, but then when I was testing it there were bugs and it was nonfunctional due to the bugs. I did not yet fix the bugs and instead I took a break. I'm not certain that I uploaded the code I was working on at the time onto github yet, but basically if you're pulling something down for multiplayer and trying to use it, it's going to be one of these experimental builds that is most likely not what you want and not going to work.

In concept, you are correct that the way I was playing was to launch WarsmashServer.java's main method, then join that game by using -client <ip address of server> as a command-line argument. This requires both clients to launch their game this way and each have a copy of a map, and each launch the game also with -loadfile <map> at startup, so that they instantly enter the game in parallel in the same map. After this, both map worlds appear frozen until the stdin of the WarsmashServer command line program receives the text "start" followed by a newline. It's incredibly hacky and just a test, and probably won't do what you want.
That sounds pretty much like what I expected for a hacked together network code to be honest. ;)
Also, I intended to try it out over LAN too anyways.

I mean the network code is still pretty new. Things like that are to be expected. The last (much much simpler) network game I made (in a few days) was pretty broken too at that initial state. I’m not all that experienced with network programming and didn’t have much time to look at your code but in the unlikely case that I have an idea how to improve performance, I’ll let you know.

About trying the multiplayer: I thought it might be cool to see how far it is at the moment and have some fun messing around with it with a friend or two, so I’m happy with what I get, really. I mainly want to try it because I think the project is so cool and I’m curious about its progress and inner workings

I didn’t yet manage to import and compile the new version into my IDE (I only had about 15 minutes to try as it’s a bit stressful at the moment) but I hope I’ll have some time to try it next week.

Other than that, great to hear that you're doing cool things and testing! Today was a work day for me so I probably won't do much Warsmash, but I might stop by again sometime soon and check in more about your other notes. Your evaluation of the state of things is very on-point.
Thanks, I’m really happy to hear that! :D
Testing the engine is fun and I find it fascinating. Also thanks for the praise of my evaluation ;)
The hero revive system required me to hackily set the heroes that I was using to "does not decay" in the object editor (and even then it still hit some bug cases). Frame drops were almost 100% due to the path-finding evaluation system trying to find how a unit could reach a point -- in its failure case, it searches the entire map in a slow way that created almost all FPS drops that I have basically ever seen on Warsmash. The current builds have not fixed that slowness, but rather have opted to tell that path finding system to "give up sooner" which means that on a big map you could not right click and have your unit find his way from one side to the other. Also, units will more often stand and wait to think before moving even after the user tries to right click and tell them to move. This is instead of the entire engine, and the frames, waiting. So, it's like one step forward and another step back, maybe, but it's something.
That explains a lot. I guess, the decay mode explains my waiting time for the revive. Yeah, breaking off an algorithm sooner is a nice way to “fix” slowness, but often it works quite nicely and it’s quick to do (From your code, I’ve gathered you use A* but I haven’t quite figured out where everything is implemented nor do I feel confident that I would be able to make suggestions for optimizations when I find out.) Also, the waiting time for the commands brings back memories of Warcraft II. That is nice too I guess ;)

It’s definitely something! I think the engine is making great progress! :thumbs_up:
 
Level 2
Joined
May 13, 2020
Messages
14
I didn’t yet manage to import and compile the new version into my IDE (I only had about 15 minutes to try as it’s a bit stressful at the moment) but I hope I’ll have some time to try it next week.

Quick update: I still didn't manage to get the project into my IDEs propperly (I tried IntelliJ and Eclipse. Also I'm - as is evident from this situation - pretty terrible with build tools and importing) and couldn't test it out. But I'll keep trying when I have time.
 

Retera

Hosted Project: WME
Level 37
Joined
Apr 19, 2008
Messages
1,320
In my experience, IntelliJ support for the gradle plugin was often better and it would just instantly open and load Warsmash and let me run it with the green play button as long as (1) IntelliJ was treating it as a gradle project and (2) the War3 asset configuration was correct.

But actually it's true that I personally wrote most of the project while using Eclipse. And I like to use an older Eclipse version because I find that the newer versions had weird bugs and didn't properly support the gradle configuration that I was using. I'm not sure if maybe Eclipse will fix that at some point. Maybe not always wanting the updates is a feeling I get after doing too much Warcraft III modding.

Most of the gradle project configuration was automatically generated by the LibGDX project generator and then I start to forget how it works and just use it since it opens in a fairly easy and straightforward way on all of my computers.
 
Level 15
Joined
Jun 26, 2020
Messages
1,180
I wanna test it, but it doesn't clear to me how?, because there don't apear maps, and don't work the "loadfile" (is creating a shotcut and add it in the properties? or is other thing, or is the version? because I don't have the 1.22, I just have 1.26, 1.27 and 1.32).

Also I wanna look at the source, but also is not clear to me how, it says "Run ./gradlew desktop:dist" but what means that?.

Sorry if I'm asking things that a programmer must know.
 
Level 2
Joined
May 13, 2020
Messages
14
But actually it's true that I personally wrote most of the project while using Eclipse. And I like to use an older Eclipse version because I find that the newer versions had weird bugs and didn't properly support the gradle configuration that I was using. I'm not sure if maybe Eclipse will fix that at some point. Maybe not always wanting the updates is a feeling I get after doing too much Warcraft III modding.
Yeah, I heard lots of good things about IntelliJ too but pretty much only use Eclipse (or less frequently NetBeans) when I code (also, I saw that you used Eclipse on YouTube and figured that getting the project to compile there should be possible). Turns out the drive I stored the project on didn’t work out with the IDEs and when I moved it to a different drive, I had already ruined the gradle configuration (as I said, not my greatest strength).

(I was using the newest version of Eclipse so that may have been a contributing factor to my failure. Also, speaking of versions, the feeling of not trusting updates is all too familiar. Some of my largest Warcraft Mods stopped working somewhere between 1.21 and 1.27 and I still have the old installation on my device for that.)

Regardless, I managed to test the server without recompiling the project and managed to connect two players to it (using the pre-compiled version of the server from the .jar in the download here). Units wouldn’t respond to orders, but every order was logged on the server. I got disconnected with one client once but was immediately reconnected and changed from player 1 to player 3.

Also, I downloaded the project from git again and (finally) got to get it to run in IntelliJ. Thanks for clarifying how it should work again :)
This time I only needed to change the JDK and add a running-config and was ready to go. I briefly tested the server as it is on git, and it worked pretty well. (Units respond in this version and everything.) I’ll test it a bit further in the next days and let you know if I find out anything interesting.
 
Level 2
Joined
May 13, 2020
Messages
14
I wanna test it, but it doesn't clear to me how?, because there don't apear maps, and don't work the "loadfile" (is creating a shotcut and add it in the properties? or is other thing, or is the version? because I don't have the 1.22, I just have 1.26, 1.27 and 1.32).

Maybe I can help. If you want to specify a map it would be best to run the cmd in the warsmash folder and then type "Warsmash.exe -loadfile <the-path-to-the-map>". This path should lead to the map-file directly. (It also works for files in the mpqs, if you use 1.26 for instance.) The path is relative to the warsmash folder. So, if you place a map directly in it, just write the name.w3x or .w3m.

Also I wanna look at the source, but also is not clear to me how, it says "Run ./gradlew desktop:dist" but what means that?.

For me it worked to just open the project in IntelliJ and see if the graddle JVM is ok. (If not: crtl+alt+s and go to Build, Execution, Development / Gradle and set it to a functioning version. 1.8 worked for me) and then click on Add Configuration on the top right of the window. There you need to choose the same Java version in the first drop box, Warsmash(or however the project is called).<what you want to test>(for instance: .core.main) and then select the main class (e.g.: for the server: com.etheller.warsmash.networking.WarsmashServer)

Sorry if I'm asking things that a programmer must know.
Don't worry. It's not all so clear, if you're not familiar with coding or the project (and sometimes even if you are).

I hope I could help you. I can also record a short video on how I did it tomorrow, if you want. Don't hesitate to ask if you need anything. :) I'll be happy to help you if I can.
 
Level 15
Joined
Jun 26, 2020
Messages
1,180
@MfromAzeroth Thanks, but
Maybe I can help. If you want to specify a map it would be best to run the cmd in the warsmash folder and then type "Warsmash.exe -loadfile <the-path-to-the-map>". This path should lead to the map-file directly. (It also works for files in the mpqs, if you use 1.26 for instance.) The path is relative to the warsmash folder. So, if you place a map directly in it, just write the name.w3x or .w3m.
Where is that cmd?
For me it worked to just open the project in IntelliJ and see if the graddle JVM is ok. (If not: crtl+alt+s and go to Build, Execution, Development / Gradle and set it to a functioning version. 1.8 worked for me) and then click on Add Configuration on the top right of the window. There you need to choose the same Java version in the first drop box, Warsmash(or however the project is called).<what you want to test>(for instance: .core.main) and then select the main class (e.g.: for the server: com.etheller.warsmash.networking.WarsmashServer)
Do I need some specific editors to run it?, I though just use the VSCode.
 

Retera

Hosted Project: WME
Level 37
Joined
Apr 19, 2008
Messages
1,320
I briefly tested the server as it is on git, and it worked pretty well.
Cool! Yes, I believe for a short time the binary on the Hive got ahead of the version in git. I was doubtful that anybody was using the binary on the Hive, and was trying to do a long distance multiplayer test, so I uploaded untested changes to the Hive binary to try playing with someone over long distance internet. Unfortunately, it didn't work and the binary currently on Hive is worse for multiplayer than the git solution (probably) was at the time that you pulled it down. Basically, the only working version that ever existed is able to handle 20 ms ping from a LAN but breaks over long distance internet due to design flaws. And there's a version that attempts to fix that for the long distance play, but it's busted and doesn't even work on LAN.

Do I need some specific editors to run it?, I though just use the VSCode.

In general, although I have not personally used VSCode for java, I find it highly likely that using VSCode for java is probably a bad idea. My experience with VSCode is that it was operating as a glorified text editor. When coding in java, I find it's more effective to use IntelliJ/Eclipse if you're going to spend time writing serious amounts of code. The Java-specific editors can operate almost more on the level of a symbol editor than a text editor, because java is sometimes a very verbose language and so there are times when it is much more efficient to be developing code in a human-augmentation way than to actually type all of the code yourself (I prefer where the machine writes 50% of the code or whatever). Obviously we could have ideological arguments all day about whether a verbose language with automatic code generation is a good or a bad idea, but I think the goal here is to just get something nice working for you as quickly as possible. To that end, I find that if people download the community version of IntelliJ and "open as gradle project", then the Warsmash build will generally work almost instantly if they just press the green play button -- as long as it finds your Warcraft III installation, which is something you may need to configure.

When we talk about "Warsmash.exe -loadfile" this is referring to the binary distribution here on the Hive and not to the source code. The source code is building the same system, so that command exists in the sourcecode version as well, but forwarding it to the program is slightly less convenient. For me in IntelliJ, I use -Pargs="-loadfile MyTestMap.w3x"

Edit: For setting up Warsmash to find your Warcraft III installation, I suggest this: Overview and Setup
 
Level 15
Joined
Jun 26, 2020
Messages
1,180
@Retera, the bad thing is I still don't know what to do, because I follow what says the Overview and Setup and that made the program don't run and where should I run that command?, in the command prompt?

(Yes, sadly we reach a point that I need you explain me step by step, sorry).
 
Level 2
Joined
May 13, 2020
Messages
14
@Retera, the bad thing is I still don't know what to do, because I follow what says the Overview and Setup and that made the program don't run and where should I run that command?, in the command prompt?

(Yes, sadly we reach a point that I need you explain me step by step, sorry).
I made a short tutorial on how I opened and ran the project in IntelliJ. Maybe that will help you:


I thought that could be useful since video is often easier to follow and you see how things should look like.

Also, concerning your previous message:
@MfromAzeroth Thanks, but

Where is that cmd?
The cmd is the command line of the operating system. If you enter cmd in the search bar it should pop up. That can be used if you want to start the .exe with the command line parameters (e.g. -windowed).
Do I need some specific editors to run it?, I though just use the VSCode.
I agree with Retera here. Using a Java specific IDE might be easier here. Using VSCode is most likely possible but certainly not as convenient.
 
Level 15
Joined
Jun 26, 2020
Messages
1,180
I guess that depends on the errors. What does it say?
Displays this:
Java:
14:25:46: Executing task ':desktop:DesktopLauncher.main()'...

Starting Gradle Daemon...
Gradle Daemon started in 24 s 130 ms
:fdfparser:generateGrammarSource UP-TO-DATE
:fdfparser:compileJava UP-TO-DATE
:fdfparser:processResources NO-SOURCE
:fdfparser:classes UP-TO-DATE
:fdfparser:jar UP-TO-DATE
:jassparser:generateGrammarSource UP-TO-DATE
:jassparser:compileJava UP-TO-DATE
:jassparser:processResources NO-SOURCE
:jassparser:classes UP-TO-DATE
:jassparser:jar UP-TO-DATE
:core:compileJava UP-TO-DATE
:core:processResources NO-SOURCE
:core:classes UP-TO-DATE
:core:jar UP-TO-DATE
:desktop:compileJava UP-TO-DATE
:desktop:processResources NO-SOURCE
:desktop:classes UP-TO-DATE
:desktop:DesktopLauncher.main()
LwjglGraphics: created OpenGL 3.3+ core profile (GLES 3.0) context. This is experimental!
Renderer: AMD 15D8:C9
Loaded
Wasting memory with conversion from InputStream to buffer in MdxModel
Loading TOC file: UI\FrameDef\FrameDef.toc
line 1:0 token recognition error at: '?'
line 1:0 token recognition error at: '?'
line 1:0 token recognition error at: '?'
line 1:0 token recognition error at: '?'
line 1:0 token recognition error at: '?'
line 1:0 token recognition error at: '?'
Loading TOC file: UI\FrameDef\SmashFrameDef.toc
line 53:5 missing ',' at 'Width'
TOC file loaded 73 lines
UI\FrameDef\SmashUI\ToolTip.fdf:53:5: line 53:5 missing ',' at 'Width'
TOC file loaded 4 lines
RealmSelectOKBackdrop wants edge file: null
RealmSelectOKBackdrop got edge file: null
SmallButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
SmallButtonBackdropTemplate got edge file: [email protected]
SmallButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
SmallButtonPushedBackdropTemplate got edge file: [email protected]
SmallButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
SmallButtonDisabledBackdropTemplate got edge file: [email protected]
RealmSelectCancelBackdrop wants edge file: null
RealmSelectCancelBackdrop got edge file: null
SmallButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
SmallButtonBackdropTemplate got edge file: [email protected]
SmallButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
SmallButtonPushedBackdropTemplate got edge file: [email protected]
SmallButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
SmallButtonDisabledBackdropTemplate got edge file: [email protected]
SinglePlayerBackdrop wants edge file: null
SinglePlayerBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
BattleNetBackdrop wants edge file: null
BattleNetBackdrop got edge file: null
RealmButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button2-BackdropBorder.blp
RealmButtonBackdropTemplate got edge file: [email protected]
RealmButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button2-BackdropBorder-Down.blp
RealmButtonPushedBackdropTemplate got edge file: [email protected]
RealmButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button2-BackdropBorder-Disabled.blp
RealmButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
LocalAreaNetworkBackdrop wants edge file: null
LocalAreaNetworkBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
OptionsBackdrop wants edge file: null
OptionsBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
CreditsBackdrop wants edge file: null
CreditsBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
ExitBackdrop wants edge file: null
ExitBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: ReplaceableTextures\.blp
java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(ImageIO.java:1350)
    at com.etheller.warsmash.viewer5.handlers.blp.BlpTexture.load(BlpTexture.java:30)
    at com.etheller.warsmash.viewer5.Resource.loadData(Resource.java:28)
    at com.etheller.warsmash.viewer5.ModelViewer.load(ModelViewer.java:197)
    at com.etheller.warsmash.viewer5.handlers.mdx.MdxModel.load(MdxModel.java:186)
    at com.etheller.warsmash.viewer5.handlers.mdx.MdxModel.load(MdxModel.java:315)
    at com.etheller.warsmash.viewer5.Resource.loadData(Resource.java:28)
    at com.etheller.warsmash.viewer5.ModelViewer.load(ModelViewer.java:197)
    at com.etheller.warsmash.parsers.fdf.GameUI.setSpriteFrameModel(GameUI.java:958)
    at com.etheller.warsmash.viewer5.handlers.w3x.ui.MenuUI.main(MenuUI.java:260)
    at com.etheller.warsmash.WarsmashGdxMenuScreen.show(WarsmashGdxMenuScreen.java:213)
    at com.badlogic.gdx.Game.setScreen(Game.java:61)
    at com.etheller.warsmash.desktop.DesktopLauncher$1.run(DesktopLauncher.java:77)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.executeRunnables(LwjglApplication.java:309)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:236)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:138)
StandardEditBoxBackdrop wants edge file: UI\Widgets\BattleNet\bnet-inputbox-border.blp
StandardEditBoxBackdrop got edge file: [email protected]
AddProfileBackdrop wants edge file: null
AddProfileBackdrop got edge file: null
SmallButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
SmallButtonBackdropTemplate got edge file: com.badlogic.gdx.graphics.Texture[email protected]
SmallButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
SmallButtonPushedBackdropTemplate got edge file: [email protected]
SmallButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
SmallButtonDisabledBackdropTemplate got edge file: [email protected]
DeleteProfileBackdrop wants edge file: null
DeleteProfileBackdrop got edge file: null
SmallButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
SmallButtonBackdropTemplate got edge file: [email protected]
SmallButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
SmallButtonPushedBackdropTemplate got edge file: [email protected]
SmallButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
SmallButtonDisabledBackdropTemplate got edge file: [email protected]
SelectProfileBackdrop wants edge file: null
SelectProfileBackdrop got edge file: null
SmallButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
SmallButtonBackdropTemplate got edge file: [email protected]
SmallButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
SmallButtonPushedBackdropTemplate got edge file: [email protected]
SmallButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
SmallButtonDisabledBackdropTemplate got edge file: [email protected]
CancelBackdrop wants edge file: null
CancelBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignBackdrop wants edge file: null
CampaignBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
LoadSavedBackdrop wants edge file: null
LoadSavedBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
ViewReplayBackdrop wants edge file: null
ViewReplayBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
CustomCampaignBackdrop wants edge file: null
CustomCampaignBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
SkirmishBackdrop wants edge file: null
SkirmishBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
ProfileButtonBackdrop wants edge file: null
ProfileButtonBackdrop got edge file: null
RealmButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button2-BackdropBorder.blp
RealmButtonBackdropTemplate got edge file: [email protected]
RealmButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button2-BackdropBorder-Down.blp
RealmButtonPushedBackdropTemplate got edge file: [email protected]
RealmButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button2-BackdropBorder-Disabled.blp
RealmButtonDisabledBackdropTemplate got edge file: [email protected]
ListBoxBackdrop wants edge file: UI\Widgets\BattleNet\bnet-inputbox-border.blp
ListBoxBackdrop got edge file: [email protected]
MapInfoBackdrop wants edge file: null
MapInfoBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
AdvancedOptionsBackdrop wants edge file: null
AdvancedOptionsBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
PlayGameBackdrop wants edge file: null
PlayGameBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
CancelBackdrop wants edge file: null
CancelBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
Wasting memory with conversion from InputStream to buffer in MdxModel
CampaignButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignButtonBackdropTemplate got edge file: [email protected]
CampaignButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignButtonPushedBackdropTemplate got edge file: [email protected]
CampaignButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignDifficultyBackdrop wants edge file: EscMenuEditBoxBorder
CampaignDifficultyBackdrop got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: com.badlo[email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
CampaignArrowButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder.blp
CampaignArrowButtonBackdropTemplate got edge file: [email protected]
CampaignArrowButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Down.blp
CampaignArrowButtonPushedBackdropTemplate got edge file: [email protected]
CampaignArrowButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-CampaignButton-BackdropBorder-Disabled.blp
CampaignArrowButtonDisabledBackdropTemplate got edge file: [email protected]
DialogBackdrop wants edge file: UI\Widgets\BattleNet\bnet-dialoguebox-border.blp
DialogBackdrop got edge file: [email protected]
DialogIcon wants edge file: null
DialogIcon got edge file: null
DialogButtonOKBackdrop wants edge file: null
DialogButtonOKBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
DialogButtonNoBackdrop wants edge file: null
DialogButtonNoBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
DialogButtonYesBackdrop wants edge file: null
DialogButtonYesBackdrop got edge file: null
ButtonBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder.blp
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Down.blp
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: UI\Widgets\Glues\GlueScreen-Button1-BackdropBorder-Disabled.blp
ButtonDisabledBackdropTemplate got edge file: [email protected]
LOADING SCREEN INT: -1
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Loaded custom data for the ability CURSE whose MetaData field, 'Crs', is the only 3 letter War3ID in the game. This might cause unexpected errors, so watch your % chance to miss in custom curse abilities carefully.
pathing size:
pathing size:
pathing size:
pathing size:
pathing size:
pathing size:
pathing size:
pathing size:
pathing size:
pathing size:
pathing size:
pathing size:
pathing size:
pathing size:
pathing size:
pathing size:
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Warning: missing sound file: Doodads\LordaeronSummer\Terrain\GateGateEpicDeath.wav
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: ReplaceableTextures\Shadows\none.blp
java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(ImageIO.java:1350)
    at com.etheller.warsmash.viewer5.handlers.blp.BlpTexture.load(BlpTexture.java:30)
    at com.etheller.warsmash.viewer5.Resource.loadData(Resource.java:28)
    at com.etheller.warsmash.viewer5.ModelViewer.load(ModelViewer.java:197)
    at com.etheller.warsmash.viewer5.handlers.w3x.environment.Terrain.addShadow(Terrain.java:1158)
    at com.etheller.warsmash.viewer5.handlers.w3x.War3MapViewer.loadDoodadsAndDestructibles(War3MapViewer.java:941)
    at com.etheller.warsmash.viewer5.handlers.w3x.War3MapViewer.loadMap(War3MapViewer.java:843)
    at com.etheller.warsmash.viewer5.handlers.w3x.ui.MenuUI.update(MenuUI.java:769)
    at com.etheller.warsmash.WarsmashGdxMenuScreen.render(WarsmashGdxMenuScreen.java:537)
    at com.badlogic.gdx.Game.render(Game.java:46)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:259)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:138)
Wasting memory with conversion from InputStream to buffer in MdxModel
ROTATED BOUNDS TO: [657.107,-1519.259,1117.3931,1117.394]
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Renderer: AMD 15D8:C9
Loaded
Loading TOC file: UI\FrameDef\FrameDef.toc
line 1:0 token recognition error at: '?'
line 1:0 token recognition error at: '?'
line 1:0 token recognition error at: '?'
line 1:0 token recognition error at: '?'
line 1:0 token recognition error at: '?'
line 1:0 token recognition error at: '?'
TOC file loaded 73 lines
Loading TOC file: UI\FrameDef\SmashFrameDef.toc
line 53:5 missing ',' at 'Width'
UI\FrameDef\SmashUI\ToolTip.fdf:53:5: line 53:5 missing ',' at 'Width'
TOC file loaded 4 lines
EscMenuBackdrop wants edge file: EscMenuBorder
EscMenuBackdrop got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
ButtonBackdropTemplate wants edge file: EscMenuButtonBorder
ButtonBackdropTemplate got edge file: [email protected]
ButtonPushedBackdropTemplate wants edge file: EscMenuButtonPushedBorder
ButtonPushedBackdropTemplate got edge file: [email protected]
ButtonDisabledBackdropTemplate wants edge file: EscMenuButtonDisabledBorder
ButtonDisabledBackdropTemplate got edge file: [email protected]
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
SmashToolTipBackdrop wants edge file: ToolTipBorder
SmashToolTipBackdrop got edge file: [email protected]
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: ReplaceableTextures\.blp
java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(ImageIO.java:1350)
    at com.etheller.warsmash.viewer5.handlers.blp.BlpTexture.load(BlpTexture.java:30)
    at com.etheller.warsmash.viewer5.Resource.loadData(Resource.java:28)
    at com.etheller.warsmash.viewer5.ModelViewer.load(ModelViewer.java:197)
    at com.etheller.warsmash.viewer5.handlers.mdx.MdxModel.load(MdxModel.java:186)
    at com.etheller.warsmash.viewer5.handlers.mdx.MdxModel.load(MdxModel.java:315)
    at com.etheller.warsmash.viewer5.Resource.loadData(Resource.java:28)
    at com.etheller.warsmash.viewer5.ModelViewer.load(ModelViewer.java:197)
    at com.etheller.warsmash.parsers.fdf.GameUI.setSpriteFrameModel(GameUI.java:958)
    at com.etheller.warsmash.viewer5.handlers.w3x.ui.MeleeUI.main(MeleeUI.java:935)
    at com.etheller.warsmash.WarsmashGdxMapScreen.show(WarsmashGdxMapScreen.java:220)
    at com.badlogic.gdx.Game.setScreen(Game.java:61)
    at com.etheller.warsmash.viewer5.handlers.w3x.ui.MenuUI.update(MenuUI.java:799)
    at com.etheller.warsmash.WarsmashGdxMenuScreen.render(WarsmashGdxMenuScreen.java:537)
    at com.badlogic.gdx.Game.render(Game.java:46)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:259)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:138)
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Unknown unit ID: sloc
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Warning: missing sound file: Units\Critters\VillagerWoman\VillagerFemaleDeath1.wav
Attempting to load non-existant file: Objects\Spawnmodels\Other\NPCBlood\NpcBloodVillagerWoman.mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
java.lang.NullPointerException
    at org.apache.commons.compress.utils.IOUtils.copy(IOUtils.java:87)
    at org.apache.commons.compress.utils.IOUtils.copy(IOUtils.java:62)
    at org.apache.commons.compress.utils.IOUtils.toByteArray(IOUtils.java:247)
    at com.etheller.warsmash.viewer5.handlers.mdx.MdxModel.load(MdxModel.java:97)
    at com.etheller.warsmash.viewer5.handlers.mdx.MdxModel.load(MdxModel.java:315)
    at com.etheller.warsmash.viewer5.Resource.loadData(Resource.java:28)
    at com.etheller.warsmash.viewer5.ModelViewer.load(ModelViewer.java:197)
    at com.etheller.warsmash.viewer5.handlers.mdx.EventObjectEmitterObject.load(EventObjectEmitterObject.java:215)
    at com.etheller.warsmash.viewer5.handlers.mdx.EventObjectEmitterObject.<init>(EventObjectEmitterObject.java:175)
    at com.etheller.warsmash.viewer5.handlers.mdx.MdxModel.load(MdxModel.java:256)
    at com.etheller.warsmash.viewer5.handlers.mdx.MdxModel.load(MdxModel.java:315)
    at com.etheller.warsmash.viewer5.Resource.loadData(Resource.java:28)
    at com.etheller.warsmash.viewer5.ModelViewer.load(ModelViewer.java:197)
    at com.etheller.warsmash.viewer5.handlers.w3x.War3MapViewer.createNewUnit(War3MapViewer.java:1314)
    at com.etheller.warsmash.viewer5.handlers.w3x.War3MapViewer.loadUnitsAndItems(War3MapViewer.java:1133)
    at com.etheller.warsmash.viewer5.handlers.w3x.War3MapViewer.loadAfterUI(War3MapViewer.java:879)
    at com.etheller.warsmash.WarsmashGdxMapScreen.show(WarsmashGdxMapScreen.java:227)
    at com.badlogic.gdx.Game.setScreen(Game.java:61)
    at com.etheller.warsmash.viewer5.handlers.w3x.ui.MenuUI.update(MenuUI.java:799)
    at com.etheller.warsmash.WarsmashGdxMenuScreen.render(WarsmashGdxMenuScreen.java:537)
    at com.badlogic.gdx.Game.render(Game.java:46)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:259)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:138)
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Unknown event object ID: SNDKPES
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Unknown unit ID: sloc
Unknown unit ID: sloc
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Unknown event object ID: SNDKTR1
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
java.lang.NullPointerException
    at org.apache.commons.compress.utils.IOUtils.copy(IOUtils.java:87)
    at org.apache.commons.compress.utils.IOUtils.copy(IOUtils.java:62)
    at org.apache.commons.compress.utils.IOUtils.toByteArray(IOUtils.java:247)
    at com.etheller.warsmash.viewer5.handlers.mdx.MdxModel.load(MdxModel.java:97)
    at com.etheller.warsmash.viewer5.handlers.mdx.MdxModel.load(MdxModel.java:315)
    at com.etheller.warsmash.viewer5.Resource.loadData(Resource.java:28)
    at com.etheller.warsmash.viewer5.ModelViewer.load(ModelViewer.java:197)
    at com.etheller.warsmash.viewer5.handlers.w3x.War3MapViewer.createNewUnit(War3MapViewer.java:1303)
    at com.etheller.warsmash.viewer5.handlers.w3x.War3MapViewer.loadUnitsAndItems(War3MapViewer.java:1133)
    at com.etheller.warsmash.viewer5.handlers.w3x.War3MapViewer.loadAfterUI(War3MapViewer.java:879)
    at com.etheller.warsmash.WarsmashGdxMapScreen.show(WarsmashGdxMapScreen.java:227)
    at com.badlogic.gdx.Game.setScreen(Game.java:61)
    at com.etheller.warsmash.viewer5.handlers.w3x.ui.MenuUI.update(MenuUI.java:799)
    at com.etheller.warsmash.WarsmashGdxMenuScreen.render(WarsmashGdxMenuScreen.java:537)
    at com.badlogic.gdx.Game.render(Game.java:46)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:259)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:138)
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
Unknown unit ID: sloc
Unknown unit ID: sloc
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
Unknown unit ID: sloc
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
Unknown event object ID: SNDKPES
Wasting memory with conversion from InputStream to buffer in MdxModel
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Attempting to load non-existant file: .mdx
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
Wasting memory with conversion from InputStream to buffer in MdxModel
starting job with smoothing=true
beginning findNaiveSlowPath for  3057.8416,905.36316,2906.805,993.5149
using cells
init path [Point2D.Float[2960.0, 1008.0], Point2D.Float[2906.805, 993.5149]]
Task 1 took 10 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -473.1917,608.10986,-794.1502,403.12857
using corners
init path [Point2D.Float[-448.0, 544.0], Point2D.Float[-480.0, 544.0], Point2D.Float[-576.0, 448.0], Point2D.Float[-794.1502, 403.12857]]
Task 1 took 94 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  352.26218,-1376.7809,284.51337,-1224.8304
using corners
init path [Point2D.Float[352.0, -1408.0], Point2D.Float[192.0, -1408.0], Point2D.Float[192.0, -1248.0], Point2D.Float[224.0, -1216.0], Point2D.Float[284.51337, -1224.8304]]
Task 2 took 52 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  455.01004,-1335.7601,284.51337,-1224.8304
using corners
init path [Point2D.Float[416.0, -1280.0], Point2D.Float[416.0, -1184.0], Point2D.Float[284.51337, -1224.8304]]
Task 3 took 93 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  508.4501,-1147.9037,284.51337,-1224.8304
using corners
starting job with smoothing=true
beginning findNaiveSlowPath for  284.51337,-1224.8304,325.63504,-1039.3337
using corners
init path [Point2D.Float[288.0, -1056.0], Point2D.Float[320.0, -1024.0], Point2D.Float[325.63504, -1039.3337]]
Task 1 took 312 iterations and 0 job loops!
[Point2D.Float[352.0, -1408.0], Point2D.Float[192.0, -1408.0], Point2D.Float[224.0, -1216.0], Point2D.Float[284.51337, -1224.8304]]
We think we reached  Point2D.Float[352.0, -1408.0] because we are at 352.0,-1408.0
new target: 192.0,-1408.0
new delta: -160.0,0.0
[Point2D.Float[-448.0, 544.0], Point2D.Float[-480.0, 544.0], Point2D.Float[-794.1502, 403.12857]]
Wasting memory with conversion from InputStream to buffer in MdxModel
We think we reached  Point2D.Float[-448.0, 544.0] because we are at -448.0,544.0
new target: -480.0,544.0
new delta: -32.0,0.0
init path [Point2D.Float[480.0, -1184.0], Point2D.Float[284.51337, -1224.8304]]
Task 4 took 4828 iterations and 10 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -540.8999,556.9144,-794.1502,403.12857
using corners
init path [Point2D.Float[-544.0, 544.0], Point2D.Float[-672.0, 416.0], Point2D.Float[-794.1502, 403.12857]]
Task 5 took 25 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -1245.0784,435.75565,-794.1502,403.12857
using corners
init path [Point2D.Float[-794.1502, 403.12857]]
Task 6 took 20 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  325.32797,-1410.6748,284.67874,-1197.1946
using corners
Task 7 took 53 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  2906.805,993.5149,2777.2556,1069.1256
using corners
init path [Point2D.Float[2777.2556, 1069.1256]]
Task 2 took 8 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -448.0,544.0,-794.1502,403.12857
using corners
Task 8 took 33 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  482.19278,-1154.1699,286.5771,-1187.8862
using corners
Task 9 took 278 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  298.3334,-1410.1333,290.37378,-1169.2695
using corners
Task 10 took 45 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  482.19278,-1154.1699,292.27213,-1159.9612
using corners
Task 11 took 237 iterations and 0 job loops!
[Point2D.Float[-480.0, 576.0], Point2D.Float[-480.0, 608.0], Point2D.Float[-640.0, 608.0], Point2D.Float[-794.1502, 403.12857]]
We think we reached  Point2D.Float[-480.0, 576.0] because we are at -480.0,576.0
new target: -480.0,608.0
new delta: 0.0,32.0
starting job with smoothing=true
beginning findNaiveSlowPath for  271.33884,-1409.5918,296.06882,-1141.3445
using corners
Task 12 took 34 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  494.2234,-1160.2948,297.96716,-1132.0361
using corners
Task 13 took 241 iterations and 0 job loops!
[Point2D.Float[-480.0, 608.0], Point2D.Float[-640.0, 608.0], Point2D.Float[-794.1502, 403.12857]]
We think we reached  Point2D.Float[-480.0, 608.0] because we are at -480.0,608.0
new target: -640.0,608.0
new delta: -160.0,0.0
starting job with smoothing=true
beginning findNaiveSlowPath for  244.34427,-1409.0503,301.76385,-1113.4194
using corners
Task 14 took 25 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  303.6622,-1104.1111,325.63504,-1039.3337
using corners
Task 3 took 170 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  501.8448,-1171.4377,303.6622,-1104.1111
using corners
Task 15 took 263 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -480.0,608.0,-794.1502,403.12857
using corners
Task 16 took 42 iterations and 0 job loops!
[Point2D.Float[192.0, -1408.0], Point2D.Float[192.0, -1216.0], Point2D.Float[288.0, -1120.0], Point2D.Float[301.76385, -1113.4194]]
We think we reached  Point2D.Float[192.0, -1408.0] because we are at 192.0,-1408.0
new target: 192.0,-1216.0
new delta: 0.0,192.0
starting job with smoothing=true
beginning findNaiveSlowPath for  192.0,-1408.0,294.9176,-1076.9872
using corners
Task 17 took 21 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  504.7632,-1211.8323,294.9176,-1076.9872
using corners
Task 18 took 343 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  262.68948,-1323.2762,291.94366,-1067.9647
using corners
init path [Point2D.Float[256.0, -1088.0], Point2D.Float[288.0, -1056.0], Point2D.Float[291.94366, -1067.9647]]
Task 19 took 14 iterations and 0 job loops!
[Point2D.Float[288.0, -1056.0], Point2D.Float[320.0, -1024.0], Point2D.Float[325.63504, -1039.3337]]
We think we reached  Point2D.Float[288.0, -1056.0] because we are at 288.0,-1056.0
new target: 320.0,-1024.0
new delta: 32.0,32.0
starting job with smoothing=true
beginning findNaiveSlowPath for  -794.1502,403.12857,-980.8389,367.81107
using corners
init path [Point2D.Float[-864.0, 384.0], Point2D.Float[-928.0, 320.0], Point2D.Float[-980.8389, 367.81107]]
Task 1 took 25 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  300.885,-1042.0923,325.63504,-1039.3337
using corners
Task 4 took 53 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  191.47067,-1354.0177,300.885,-1042.0923
using corners
Task 20 took 26 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  509.62717,-1279.1569,300.885,-1042.0923
using corners
Task 21 took 297 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  267.78043,-1269.517,300.885,-1042.0923
using corners
Task 22 took 11 iterations and 0 job loops!
[Point2D.Float[2777.2556, 1069.1256]]
We think we reached  Point2D.Float[2777.2556, 1069.1256] because we are at 2777.2556,1069.1256
starting job with smoothing=true
beginning findNaiveSlowPath for  300.885,-1042.0923,325.63504,-1039.3337
using corners
Task 5 took 50 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  300.885,-1042.0923,325.63504,-1039.3337
using corners
Task 6 took 50 iterations and 0 job loops!
[Point2D.Float[512.0, -1312.0], Point2D.Float[384.0, -1312.0], Point2D.Float[256.0, -1440.0], Point2D.Float[128.0, -1440.0], Point2D.Float[128.0, -1216.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[512.0, -1312.0] because we are at 512.0,-1312.0
new target: 384.0,-1312.0
new delta: -128.0,0.0
starting job with smoothing=true
beginning findNaiveSlowPath for  300.885,-1042.0923,325.63504,-1039.3337
using corners
Task 7 took 42 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -565.97266,522.2445,-818.36096,388.09232
using corners
Task 23 took 20 iterations and 0 job loops!
starting job with smoothing=false
beginning findNaiveSlowPath for  300.885,-1042.0923,325.63504,-1039.3337
using corners
Task 8 took 42 iterations and 0 job loops!
starting job with smoothing=false
beginning findNaiveSlowPath for  300.885,-1042.0923,325.63504,-1039.3337
using corners
Task 9 took 42 iterations and 0 job loops!
starting job with smoothing=false
beginning findNaiveSlowPath for  300.885,-1042.0923,325.63504,-1039.3337
using corners
Task 10 took 41 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -592.37427,517.76385,-842.5717,373.05606
using corners
Task 24 took 19 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  427.1535,-1231.8418,300.885,-1042.0923
using corners
Task 25 took 225 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -619.35254,516.6812,-866.7825,358.0197
using corners
Task 26 took 17 iterations and 0 job loops!
[Point2D.Float[416.0, -1248.0], Point2D.Float[416.0, -1312.0], Point2D.Float[288.0, -1312.0], Point2D.Float[256.0, -1344.0], Point2D.Float[128.0, -1344.0], Point2D.Float[128.0, -1152.0], Point2D.Float[224.0, -1056.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[416.0, -1248.0] because we are at 416.0,-1248.0
new target: 416.0,-1312.0
new delta: 0.0,-64.0
starting job with smoothing=true
beginning findNaiveSlowPath for  -646.3308,515.5986,-890.9932,342.98343
using corners
[Point2D.Float[192.0, -1152.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[192.0, -1152.0] because we are at 192.0,-1152.0
new target: 288.0,-1056.0
new delta: 96.0,96.0
[Point2D.Float[384.0, -1312.0], Point2D.Float[256.0, -1440.0], Point2D.Float[128.0, -1440.0], Point2D.Float[128.0, -1216.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[384.0, -1312.0] because we are at 384.0,-1312.0
new target: 256.0,-1440.0
new delta: -128.0,-128.0
[Point2D.Float[-928.0, 320.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-928.0, 320.0] because we are at -928.0,320.0
new target: -980.8389,367.81107
new delta: -52.83893,47.811066
starting job with smoothing=true
beginning findNaiveSlowPath for  414.23447,-1245.2173,300.885,-1042.0923
using corners
Task 28 took 296 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -646.3308,515.5986,-923.27423,322.93497
using corners
Task 29 took 32 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  198.47049,-1152.7047,300.885,-1042.0923
using corners
Task 30 took 9 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  198.47049,-1152.7047,300.885,-1042.0923
using corners
Task 31 took 9 iterations and 0 job loops!
[Point2D.Float[448.0, -1248.0], Point2D.Float[448.0, -1408.0], Point2D.Float[288.0, -1408.0], Point2D.Float[96.0, -1216.0], Point2D.Float[96.0, -1120.0], Point2D.Float[160.0, -1056.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[448.0, -1248.0] because we are at 448.0,-1248.0
new target: 448.0,-1408.0
new delta: 0.0,-160.0
starting job with smoothing=true
beginning findNaiveSlowPath for  -700.28735,513.4333,-950.094,337.43628
using corners
starting job with smoothing=true
beginning findNaiveSlowPath for  197.12718,-1139.2717,356.10318,-1239.9788
using corners
init path [Point2D.Float[192.0, -1248.0], Point2D.Float[356.10318, -1239.9788]]
Task 33 took 23 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -700.28735,513.4333,-977.1262,364.14307
using corners
Task 34 took 390 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -660.44196,428.4233,-977.1262,364.14307
using corners
starting job with smoothing=true
beginning findNaiveSlowPath for  -977.1262,364.14307,-980.8389,367.81107
using corners
Task 2 took 0 iterations and 0 job loops!
Task 35 took 183 iterations and 1 job loops!
[Point2D.Float[-736.0, 512.0], Point2D.Float[-864.0, 384.0], Point2D.Float[-864.0, 320.0], Point2D.Float[-992.0, 320.0], Point2D.Float[-992.0, 352.0], Point2D.Float[-977.1262, 364.14307]]
We think we reached  Point2D.Float[-736.0, 512.0] because we are at -736.0,512.0
new target: -864.0,384.0
new delta: -128.0,-128.0
starting job with smoothing=true
beginning findNaiveSlowPath for  2777.2556,1069.1256,2647.7063,1144.7362
using corners
init path [Point2D.Float[2720.0, 1088.0], Point2D.Float[2647.7063, 1144.7362]]
Task 11 took 5 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  197.12718,-1139.2717,356.10318,-1239.9788
using corners
Task 36 took 23 iterations and 0 job loops!
[Point2D.Float[256.0, -1440.0], Point2D.Float[128.0, -1440.0], Point2D.Float[128.0, -1216.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[256.0, -1440.0] because we are at 256.0,-1440.0
new target: 128.0,-1440.0
new delta: -128.0,0.0
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
starting job with smoothing=true
beginning findNaiveSlowPath for  -762.6259,486.06134,-992.0,352.0
using corners
Task 37 took 433 iterations and 0 job loops!
[Point2D.Float[448.0, -1408.0], Point2D.Float[288.0, -1408.0], Point2D.Float[96.0, -1216.0], Point2D.Float[96.0, -1120.0], Point2D.Float[160.0, -1056.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[448.0, -1408.0] because we are at 448.0,-1408.0
new target: 288.0,-1408.0
new delta: -160.0,0.0
[Point2D.Float[-768.0, 416.0], Point2D.Float[-864.0, 320.0], Point2D.Float[-1024.0, 320.0], Point2D.Float[-977.1262, 364.14307]]
We think we reached  Point2D.Float[-768.0, 416.0] because we are at -768.0,416.0
new target: -864.0,320.0
new delta: -96.0,-96.0
starting job with smoothing=true
beginning findNaiveSlowPath for  356.10318,-1239.9788,175.16177,-1182.0115
using corners
init path [Point2D.Float[320.0, -1248.0], Point2D.Float[256.0, -1312.0], Point2D.Float[128.0, -1312.0], Point2D.Float[175.16177, -1182.0115]]
Task 12 took 183 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -979.56335,365.5732,-980.8389,367.81107
using corners
Task 3 took 0 iterations and 0 job loops!
[Point2D.Float[192.0, -1248.0], Point2D.Float[356.10318, -1239.9788]]
We think we reached  Point2D.Float[192.0, -1248.0] because we are at 192.0,-1248.0
new target: 348.53778,-1245.7246
new delta: 156.53778,2.2753906
[Point2D.Float[128.0, -1440.0], Point2D.Float[128.0, -1216.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[128.0, -1440.0] because we are at 128.0,-1440.0
new target: 128.0,-1216.0
new delta: 0.0,224.0
starting job with smoothing=true
beginning findNaiveSlowPath for  -834.574,355.50726,-993.7911,353.8909
using corners
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
[Point2D.Float[288.0, -1408.0], Point2D.Float[96.0, -1216.0], Point2D.Float[96.0, -1120.0], Point2D.Float[160.0, -1056.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[288.0, -1408.0] because we are at 288.0,-1408.0
new target: 96.0,-1216.0
new delta: -192.0,192.0
[Point2D.Float[2647.7063, 1144.7362]]
We think we reached  Point2D.Float[2647.7063, 1144.7362] because we are at 2647.7063,1144.7362
starting job with smoothing=true
beginning findNaiveSlowPath for  -985.3533,358.78757,-980.8389,367.81107
using corners
Task 4 took 0 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  239.36115,-1278.5342,175.16177,-1182.0115
using corners
Task 13 took 95 iterations and 0 job loops!
[Point2D.Float[-992.0, 512.0], Point2D.Float[-1024.0, 480.0], Point2D.Float[-1024.0, 352.0], Point2D.Float[-992.0, 352.0], Point2D.Float[-992.0, 352.0]]
We think we reached  Point2D.Float[-992.0, 512.0] because we are at -992.0,512.0
new target: -1024.0,480.0
new delta: -32.0,-32.0
starting job with smoothing=true
beginning findNaiveSlowPath for  251.23851,-1304.0844,175.16177,-1182.0115
using corners
Task 14 took 186 iterations and 0 job loops!
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
[Point2D.Float[128.0, -1216.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[128.0, -1216.0] because we are at 128.0,-1216.0
new target: 288.0,-1056.0
new delta: 160.0,160.0
starting job with smoothing=true
beginning findNaiveSlowPath for  -985.54486,358.97003,-980.8389,367.81107
using corners
Task 5 took 0 iterations and 0 job loops!
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
starting job with smoothing=true
beginning findNaiveSlowPath for  2647.7063,1144.7362,2518.1567,1220.3466
using corners
init path [Point2D.Float[2518.1567, 1220.3466]]
Task 15 took 6 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -985.37085,358.80475,-980.8389,367.81107
using corners
Task 6 took 0 iterations and 0 job loops!
Task 38 took 18789 iterations and 37 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  241.1452,-1354.9414,300.885,-1042.0923
using corners
Task 39 took 152 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  127.770355,-1222.4081,300.885,-1042.0923
using corners
Task 40 took 16 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  127.770355,-1222.4081,300.885,-1042.0923
using corners
Task 41 took 16 iterations and 0 job loops!
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
[Point2D.Float[192.0, -1312.0], Point2D.Float[64.0, -1312.0], Point2D.Float[64.0, -1152.0], Point2D.Float[160.0, -1056.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[192.0, -1312.0] because we are at 192.0,-1312.0
new target: 64.0,-1312.0
new delta: -128.0,0.0
[Point2D.Float[128.0, -1152.0], Point2D.Float[224.0, -1056.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[128.0, -1152.0] because we are at 128.0,-1152.0
new target: 224.0,-1056.0
new delta: 96.0,96.0
starting job with smoothing=true
beginning findNaiveSlowPath for  -985.5287,358.95502,-980.8389,367.81107
using corners
Task 7 took 0 iterations and 0 job loops!
[Point2D.Float[2518.1567, 1220.3466]]
We think we reached  Point2D.Float[2518.1567, 1220.3466] because we are at 2518.1567,1220.3466
[Point2D.Float[64.0, -1312.0], Point2D.Float[64.0, -1152.0], Point2D.Float[160.0, -1056.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[64.0, -1312.0] because we are at 64.0,-1312.0
new target: 64.0,-1152.0
new delta: 0.0,160.0
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
starting job with smoothing=true
beginning findNaiveSlowPath for  -985.3854,358.81885,-980.8389,367.81107
using corners
Task 8 took 0 iterations and 0 job loops!
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
[Point2D.Float[64.0, -1152.0], Point2D.Float[160.0, -1056.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[64.0, -1152.0] because we are at 64.0,-1152.0
new target: 160.0,-1056.0
new delta: 96.0,96.0
starting job with smoothing=true
beginning findNaiveSlowPath for  -987.71356,360.478,-980.8389,367.81107
using corners
Task 9 took 0 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  103.33195,-1101.9307,300.885,-1042.0923
using corners
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
Task 42 took 2091 iterations and 4 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  2518.1567,1220.3466,2388.6072,1295.9568
using corners
init path [Point2D.Float[2464.0, 1248.0], Point2D.Float[2388.6072, 1295.9568]]
Task 16 took 42 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -985.5026,358.93066,-980.8389,367.81107
using corners
Task 10 took 0 iterations and 0 job loops!
[Point2D.Float[96.0, -1056.0], Point2D.Float[128.0, -1056.0], Point2D.Float[160.0, -1024.0], Point2D.Float[224.0, -1024.0], Point2D.Float[256.0, -1056.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[96.0, -1056.0] because we are at 96.0,-1056.0
new target: 128.0,-1056.0
new delta: 32.0,0.0
starting job with smoothing=true
beginning findNaiveSlowPath for  96.0,-1056.0,300.885,-1042.0923
using corners
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
Task 43 took 1660 iterations and 3 job loops!
[Point2D.Float[96.0, -1056.0], Point2D.Float[128.0, -1056.0], Point2D.Float[160.0, -1024.0], Point2D.Float[224.0, -1024.0], Point2D.Float[256.0, -1056.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[96.0, -1056.0] because we are at 96.0,-1056.0
new target: 128.0,-1056.0
new delta: 32.0,0.0
starting job with smoothing=true
beginning findNaiveSlowPath for  109.5,-1056.0,300.885,-1042.0923
using corners
starting job with smoothing=true
beginning findNaiveSlowPath for  -987.583,360.4107,-980.8389,367.81107
using corners
Task 11 took 0 iterations and 0 job loops!
Task 44 took 1606 iterations and 3 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  109.5,-1056.0,300.885,-1042.0923
using corners
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
Task 45 took 1606 iterations and 3 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  109.5,-1056.0,300.885,-1042.0923
using corners
[Point2D.Float[2388.6072, 1295.9568]]
We think we reached  Point2D.Float[2388.6072, 1295.9568] because we are at 2388.6072,1295.9568
Task 46 took 1606 iterations and 3 job loops!
starting job with smoothing=false
beginning findNaiveSlowPath for  109.5,-1056.0,300.885,-1042.0923
using corners
starting job with smoothing=true
beginning findNaiveSlowPath for  -985.6011,359.02164,-980.8389,367.81107
using corners
Task 12 took 0 iterations and 0 job loops!
Task 47 took 1137 iterations and 2 job loops!
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
[Point2D.Float[96.0, -1056.0], Point2D.Float[96.0, -1184.0], Point2D.Float[192.0, -1184.0], Point2D.Float[288.0, -1088.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[96.0, -1056.0] because we are at 96.0,-1056.0
new target: 96.0,-1184.0
new delta: 0.0,-128.0
starting job with smoothing=true
beginning findNaiveSlowPath for  -987.4744,360.35278,-980.8389,367.81107
using corners
Task 13 took 0 iterations and 0 job loops!
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
[Point2D.Float[96.0, -1184.0], Point2D.Float[192.0, -1184.0], Point2D.Float[288.0, -1088.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[96.0, -1184.0] because we are at 96.0,-1184.0
new target: 192.0,-1184.0
new delta: 96.0,0.0
starting job with smoothing=true
beginning findNaiveSlowPath for  -985.6854,359.0976,-980.8389,367.81107
using corners
Task 14 took 0 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  121.02283,-1191.6313,300.885,-1042.0923
using corners
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
Task 48 took 2201 iterations and 4 job loops!
[Point2D.Float[128.0, -1184.0], Point2D.Float[192.0, -1184.0], Point2D.Float[192.0, -1152.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[128.0, -1184.0] because we are at 128.0,-1184.0
new target: 192.0,-1184.0
new delta: 64.0,0.0
starting job with smoothing=true
beginning findNaiveSlowPath for  123.61803,-1189.8286,300.885,-1042.0923
using corners
Task 49 took 2335 iterations and 4 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -987.38226,360.3022,-980.8389,367.81107
using corners
Task 15 took 0 iterations and 0 job loops!
[Point2D.Float[128.0, -1184.0], Point2D.Float[192.0, -1184.0], Point2D.Float[192.0, -1152.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[128.0, -1184.0] because we are at 128.0,-1184.0
new target: 192.0,-1184.0
new delta: 64.0,0.0
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
[Point2D.Float[192.0, -1184.0], Point2D.Float[192.0, -1152.0], Point2D.Float[288.0, -1056.0], Point2D.Float[300.885, -1042.0923]]
We think we reached  Point2D.Float[192.0, -1184.0] because we are at 192.0,-1184.0
new target: 192.0,-1152.0
new delta: 0.0,32.0
starting job with smoothing=true
beginning findNaiveSlowPath for  199.00548,-1172.46,300.885,-1042.0923
using corners
Task 50 took 1238 iterations and 2 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -985.7588,359.1622,-980.8389,367.81107
using corners
Task 16 took 0 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  199.00548,-1172.46,300.885,-1042.0923
using corners
Task 51 took 1238 iterations and 2 job loops!
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
starting job with smoothing=true
beginning findNaiveSlowPath for  199.00548,-1172.46,300.885,-1042.0923
using corners
Task 52 took 1238 iterations and 2 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  199.00548,-1172.46,300.885,-1042.0923
using corners
Task 53 took 1238 iterations and 2 job loops!
starting job with smoothing=false
beginning findNaiveSlowPath for  199.00548,-1172.46,300.885,-1042.0923
using corners
starting job with smoothing=true
beginning findNaiveSlowPath for  -987.3028,360.25748,-980.8389,367.81107
using corners
Task 17 took 0 iterations and 0 job loops!
Task 54 took 594 iterations and 1 job loops!
starting job with smoothing=false
beginning findNaiveSlowPath for  199.00548,-1172.46,300.885,-1042.0923
using corners
Task 55 took 1238 iterations and 2 job loops!
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
starting job with smoothing=false
beginning findNaiveSlowPath for  199.00548,-1172.46,300.885,-1042.0923
using corners
starting job with smoothing=true
beginning findNaiveSlowPath for  2396.745,1216.2948,2207.0496,1205.5421
using corners
init path [Point2D.Float[2207.0496, 1205.5421]]
Task 18 took 5 iterations and 0 job loops!
Task 56 took 1238 iterations and 2 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -985.82336,359.21796,-980.8389,367.81107
using corners
Task 19 took 0 iterations and 0 job loops!
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
starting job with smoothing=true
beginning findNaiveSlowPath for  -987.23334,360.21762,-980.8389,367.81107
using corners
Task 20 took 0 iterations and 0 job loops!
[Point2D.Float[2207.0496, 1205.5421]]
We think we reached  Point2D.Float[2207.0496, 1205.5421] because we are at 2207.0496,1205.5421
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
starting job with smoothing=true
beginning findNaiveSlowPath for  2513.737,1222.9264,2207.0496,1205.5421
using cells
init path [Point2D.Float[2207.0496, 1205.5421]]
Task 2 took 20 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -988.1549,360.68707,-980.8389,367.81107
using corners
Task 21 took 0 iterations and 0 job loops!
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
starting job with smoothing=true
beginning findNaiveSlowPath for  -985.1938,358.62762,-980.8389,367.81107
using corners
Task 22 took 0 iterations and 0 job loops!
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
starting job with smoothing=true
beginning findNaiveSlowPath for  2207.0496,1205.5421,2017.3541,1194.7891
using corners
init path [Point2D.Float[2017.3541, 1194.7891]]
Task 23 took 11 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  -987.9295,360.58377,-980.8389,367.81107
using corners
Task 24 took 0 iterations and 0 job loops!
[Point2D.Float[-992.0, 352.0], Point2D.Float[-980.8389, 367.81107]]
We think we reached  Point2D.Float[-992.0, 352.0] because we are at -992.0,352.0
new target: -980.8389,367.81107
new delta: 11.161072,15.811066
starting job with smoothing=true
beginning findNaiveSlowPath for  -987.5067,360.3702,-980.8389,367.81107
using corners
Task 25 took 0 iterations and 0 job loops!
[Point2D.Float[2017.3541, 1194.7891]]
We think we reached  Point2D.Float[2017.3541, 1194.7891] because we are at 2017.3541,1194.7891
starting job with smoothing=true
beginning findNaiveSlowPath for  2017.3541,1194.7891,1827.6587,1184.0358
using corners
init path [Point2D.Float[1827.6587, 1184.0358]]
Task 26 took 6 iterations and 0 job loops!
starting job with smoothing=false
beginning findNaiveSlowPath for  199.00548,-1172.46,300.885,-1042.0923
using corners
Task 57 took 1238 iterations and 2 job loops!
[Point2D.Float[1827.6587, 1184.0358]]
We think we reached  Point2D.Float[1827.6587, 1184.0358] because we are at 1827.6587,1184.0358
starting job with smoothing=true
beginning findNaiveSlowPath for  1827.6587,1184.0358,1637.9633,1173.2827
using corners
init path [Point2D.Float[1637.9633, 1173.2827]]
Task 27 took 6 iterations and 0 job loops!
[Point2D.Float[1637.9633, 1173.2827]]
We think we reached  Point2D.Float[1637.9633, 1173.2827] because we are at 1637.9633,1173.2827
starting job with smoothing=false
beginning findNaiveSlowPath for  199.00548,-1172.46,300.885,-1042.0923
using corners
Task 58 took 1238 iterations and 2 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  1779.9163,1181.3296,1677.0208,1381.7311
using cells
init path [Point2D.Float[1680.0, 1296.0], Point2D.Float[1677.0208, 1381.7311]]
Task 3 took 20 iterations and 0 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  1677.0208,1381.7311,1590.2368,1550.7534
using corners
init path [Point2D.Float[1600.0, 1472.0], Point2D.Float[1590.2368, 1550.7534]]
Task 28 took 8 iterations and 0 job loops!
[Point2D.Float[1590.2368, 1550.7534]]
We think we reached  Point2D.Float[1590.2368, 1550.7534] because we are at 1590.2368,1550.7534
starting job with smoothing=true
beginning findNaiveSlowPath for  1590.2368,1550.7534,1503.4531,1719.7759
using corners
init path [Point2D.Float[1568.0, 1664.0], Point2D.Float[1503.4531, 1719.7759]]
Task 29 took 13 iterations and 0 job loops!
starting job with smoothing=false
beginning findNaiveSlowPath for  199.00548,-1172.46,300.885,-1042.0923
using corners
Task 59 took 1238 iterations and 2 job loops!
[Point2D.Float[1503.4531, 1719.7759]]
We think we reached  Point2D.Float[1503.4531, 1719.7759] because we are at 1503.4531,1719.7759
starting job with smoothing=true
beginning findNaiveSlowPath for  1503.4531,1719.7759,1416.6696,1888.7985
using corners
init path [Point2D.Float[1408.0, 1824.0], Point2D.Float[1416.6696, 1888.7985]]
Task 30 took 12 iterations and 0 job loops!
[Point2D.Float[1416.6696, 1888.7985]]
We think we reached  Point2D.Float[1416.6696, 1888.7985] because we are at 1416.6696,1888.7985
starting job with smoothing=true
beginning findNaiveSlowPath for  1416.6696,1888.7985,1329.886,2057.821
using corners
init path [Point2D.Float[1344.0, 1984.0], Point2D.Float[1329.886, 2057.821]]
Task 31 took 10 iterations and 0 job loops!
[Point2D.Float[1329.886, 2057.821]]
We think we reached  Point2D.Float[1329.886, 2057.821] because we are at 1329.886,2057.821
Selecting a unit at 63.050262,3857.5735
Selecting a unit at 297.5528,3880.3757
Selecting a unit at 297.5528,3880.3757
Selecting a unit at 177.07642,4108.4263
Selecting a unit at 787.03723,4013.8247
Selecting a unit at 620.4074,3937.4165
Selecting a unit at 620.4074,3937.4165
Selecting a unit at 590.1126,4005.3408
Selecting a unit at 787.03723,4013.8247
Selecting a unit at 787.03723,4013.8247
Selecting a unit at 632.0437,3994.7048
Selecting a unit at 787.03723,4013.8247
Selecting a unit at 787.03723,4013.8247
starting job with smoothing=true
beginning findNaiveSlowPath for  787.03723,4013.8247,632.0437,3994.7048
using cells
init path []
Task 4 took 20001 iterations and 40 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  774.3041,3961.3472,788.2587,3927.9192
using cells
init path [Point2D.Float[788.2587, 3927.9192]]
Task 5 took 1 iterations and 0 job loops!
[Point2D.Float[788.2587, 3927.9192]]
We think we reached  Point2D.Float[788.2587, 3927.9192] because we are at 788.2587,3927.9192
starting job with smoothing=true
beginning findNaiveSlowPath for  788.2587,3927.9192,894.8555,3959.3665
using cells
init path [Point2D.Float[894.8555, 3959.3665]]
Task 6 took 5 iterations and 0 job loops!
[Point2D.Float[894.8555, 3959.3665]]
We think we reached  Point2D.Float[894.8555, 3959.3665] because we are at 894.8555,3959.3665
starting job with smoothing=true
beginning findNaiveSlowPath for  894.8555,3959.3665,632.0437,3994.7048
using cells
init path [Point2D.Float[720.0, 3984.0], Point2D.Float[688.0, 4016.0], Point2D.Float[656.0, 4016.0], Point2D.Float[624.0, 3984.0], Point2D.Float[632.0437, 3994.7048]]
Task 7 took 496 iterations and 1 job loops!
starting job with smoothing=true
beginning findNaiveSlowPath for  632.0437,3994.7048,483.77332,4017.418
using corners
init path [Point2D.Float[640.0, 4064.0], Point2D.Float[483.77332, 4017.418]]
Task 1 took 16 iterations and 0 job loops!
[Point2D.Float[640.0, 4064.0], Point2D.Float[483.77332, 4017.418]]
We think we reached  Point2D.Float[640.0, 4064.0] because we are at 640.0,4064.0
new target: 483.77332,4017.418
new delta: -156.22668,-46.58203
Selecting a unit at 625.4696,4063.6912
starting job with smoothing=true
beginning findNaiveSlowPath for  774.8183,3972.8335,554.17505,4040.4087
using cells
starting job with smoothing=true
beginning findNaiveSlowPath for  774.8183,3972.8335,525.6572,4031.096
using cells
Task 9 took 61 iterations and 0 job loops!
Selecting a unit at 754.2948,3990.355
Selecting a unit at 791.14294,3734.4453
starting job with smoothing=true
beginning findNaiveSlowPath for  744.32007,3999.452,497.1394,4021.7827
using cells
Task 10 took 29 iterations and 0 job loops!
[Point2D.Float[483.77332, 4017.418]]
We think we reached  Point2D.Float[483.77332, 4017.418] because we are at 483.77332,4017.418
[Point2D.Float[656.0, 4080.0], Point2D.Float[528.0, 4080.0], Point2D.Float[497.1394, 4021.7827]]
We think we reached  Point2D.Float[656.0, 4080.0] because we are at 656.0,4080.0
new target: 528.0,4080.0
new delta: -128.0,0.0
starting job with smoothing=true
beginning findNaiveSlowPath for  622.72015,4076.4417,483.77332,4017.418
using cells
Task 11 took 6 iterations and 0 job loops!
Selecting a unit at 483.77332,4017.418
Selecting a unit at 483.77332,4017.418
starting job with smoothing=true
beginning findNaiveSlowPath for  483.77332,4017.418,348.25604,3953.1135
using corners
init path [Point2D.Float[348.25604, 3953.1135]]
Task 2 took 9 iterations and 0 job loops!
Selecting a unit at 420.55377,3987.4192
[Point2D.Float[348.25604, 3953.1135]]
We think we reached  Point2D.Float[348.25604, 3953.1135] because we are at 348.25604,3953.1135
Selecting a unit at 609.2297,4076.9485
starting job with smoothing=true
beginning findNaiveSlowPath for  609.2297,4076.9485,348.25604,3953.1135
using cells
Task 12 took 18 iterations and 0 job loops!
[Point2D.Float[496.0, 4080.0], Point2D.Float[348.25604, 3953.1135]]
We think we reached  Point2D.Float[496.0, 4080.0] because we are at 496.0,4080.0
new target: 348.25604,3953.1135
new delta: -147.74396,-126.886475
Selecting a unit at 451.5551,4045.7034
Selecting a unit at 297.5528,3880.3757
Selecting a unit at 590.1126,4005.3408
Selecting a unit at 590.1126,4005.3408
Selecting a unit at 451.5551,4045.7034
Selecting a unit at 620.4074,3937.4165
Selecting a unit at 611.55695,3779.9563
Selecting a unit at 620.4074,3937.4165
Selecting a unit at 611.55695,3779.9563
Selecting a unit at 621.9995,3723.0334
Selecting a unit at 620.4074,3937.4165
Selecting a unit at 590.1126,4005.3408
Selecting a unit at 451.5551,4045.7034
Selecting a unit at 297.5528,3880.3757
Selecting a unit at 177.07642,4108.4263
Selecting a unit at 791.14294,3734.4453
Selecting a unit at 791.14294,3734.4453
Selecting a unit at 564.6771,3704.917
:desktop:DesktopLauncher.main() FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':desktop:DesktopLauncher.main()'.
> Process 'command 'C:/Users/SEBAS/.jdks/corretto-1.8.0_302/bin/java.exe'' finished with non-zero exit value -1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 2m 34s

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
See https://docs.gradle.org/4.6/userguide/command_line_interface.html#sec:command_line_warnings
10 actionable tasks: 1 executed, 9 up-to-date
14:28:28: Task execution finished ':desktop:DesktopLauncher.main()'.
What remark is this:
Java:
Execution failed for task ':desktop:DesktopLauncher.main()'.
> Process 'command 'C:/Users/SEBAS/.jdks/corretto-1.8.0_302/bin/java.exe'' finished with non-zero exit value -1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
 
Level 2
Joined
May 13, 2020
Messages
14
@HerlySQR these warnings seem fine to me. I get most of these messages as well. None of them seem to be too problematic as the program can run regardless. Does it run for you?

The final error message usually appears when I close the program and guess that is because the IDE interprets closing the game as unintended behaviour.

So on first sight it doesn't seem like a problem to me. But I’m not really an expert either.
 

Retera

Hosted Project: WME
Level 37
Joined
Apr 19, 2008
Messages
1,320
Something fun you could try with the code as a developer, from easiest to hardest:
  1. Create a new blank map using your editor of choice and get so you can pay this map from IntelliJ or your code editor
  2. Create a new custom unit in the map based on Sheep 'nshe' but give him Channel 'ANcl' and verify you can cast your 'ANcl' ability from within Warsmash
  3. Copy 'ANcl' to create 'A000' (still outside the code, in your map editor) and change name and icon of your new 'A000'. Add it to your sheep. Verify your sheep can cast 'A000' on Warsmash engine. At this point you will have verified you have your setup runnable and a relatively new version that supports custom skills.
  4. Give your custom sheep 1000 hit point and place a combat unit such as footman to attack him. But give your sheep 1.0 hp regen per second. Notice how Warsmash does not honor the health regeneration but Warcraft III does. Consider this a possible fun little task to do something I never implemented: Try upgrading the Warsmash engine to honor hit point regeneration.
    1. Query the value from data for any unit type while loading a new unit type in CUnitData. For now it should be fine to read it as a Java float. If we ever get to the point of actually needing fixed point, there will be a ton of work and revamps required for that, so for now I am relying on JVM and StrictMath for multiplayer consistency. (tl;dr for now the coding paradigm is to live the easy life and store floating point numbers in a java "float" primitive)
    2. Pass value to CUnitType constructor to save it off per unit type.
    3. In CUnit.update(), go ahead and add the health per second on each game simulation step to any unit who is not dead, not full health, and has HP regen. The value you will have is per second, but you need it to be per tick when you add it, so divide the value by game turn ticks per second before adding it to the unit health. You can query turn ticks per second from WarsmashConstants class.
    4. After adjusting hit points, call on the unit state notifier in CUnit to make sure the UI updates. The stateNotifier.lifeChanged() function already exists and will handle things for you if we're lucky.
    5. If you made it this far, test attacking your beefy sheep in game on Warsmash and see if it regenerates health. If so, make a pull request so I can include your code in the official version if you are willing to share. Code currently is under the MIT license, so I would interpret your contribution to be MIT licensed as well. HP regen is something I did not implement yet. But if you never do, eventually I will.
    6. As a next step of advancement, if you're interested, try to implement the "Only during the night" regeneration of the Night Elves. You can query the in-game clock using a function on CSimulation, although I don't recall if it has a way to actually determine whether it is day or night yet. If not, it would be reasonable to add new functions (as a sort of future internal API) such as CSimulation.isNightTime() and CSimulation.isDayTime(). These would just be a convenience that are implemented by comparing CSimulation.getGameTimeOfDay() against CSimulation.getGameplayConstants().getDawnTimeGameHours() and CSimulation.getGameplayConstants().getDuskTimeGameHours()
  5. Place a Paladin next to your sheep on your custom map and notice how his Strength probably does not currently contribute to his Hit Point Regeneration. Play around and see if you can make Strength increase regemeration similar to how it currently increases the hit points.
  6. If you're feeling ambitious, and somehow already achieved the above, then I would play with seeing if you could get Night Elf Ancients to consume the wisp who builds them. That was another thing I did not do yet, and in theory it would probably not be exceedingly complicated to do. If that goes well for you, maybe you could implement Human Build. I added an unfinished Human Repair ability but it's still true that if we tell a Peasant to build something, he just gets confused and stands idle because the Human Build is not programmed yet.

Again, all these are just ideas I noted down on a tablet laptop late in the evening. These are things I did not try implementing myself yet, even though I consider them to be likely straightforward to implement when the time comes.

Edit: I added to the suggestions above
 
Last edited:
Level 2
Joined
May 13, 2020
Messages
14
Something fun you could try with the code as a developer, from easiest to hardest:
  1. Create a new blank map using your editor of choice and get so you can pay this map from IntelliJ or your code editor
  2. Create a new custom unit in the map based on Sheep 'nshe' but give him Channel 'ANcl' and verify you can cast your 'ANcl' ability from within Warsmash
  3. Copy 'ANcl' to create 'A000' (still outside the code, in your map editor) and change name and icon of your new 'A000'. Add it to your sheep. Verify your sheep can cast 'A000' on Warsmash engine. At this point you will have verified you have your setup runnable and a relatively new version that supports custom skills.
Should anything happen when the spell is cast? Because when I test it with the most recent version from git, the spell is there but casting it doesn't cause any effects to appear.
  1. Give your custom sheep 1000 hit point and place a combat unit such as footman to attack him. But give your sheep 1.0 hp regen per second. Notice how Warsmash does not honor the health regeneration but Warcraft III does. Consider this a possible fun little task to do something I never implemented: Try upgrading the Warsmash engine to honor hit point regeneration.
    1. Query the value from data for any unit type while loading a new unit type in CUnitData.
What might not be clear to everone here: the internal id for hit point regeneration is 'uhpr' (see UnitMetaData.slk)
  1. For now it should be fine to read it as a Java float. If we ever get to the point of actually needing fixed point, there will be a ton of work and revamps required for that, so for now I am relying on JVM and StrictMath for multiplayer consistency. (tl;dr for now the coding paradigm is to live the easy life and store floating point numbers in a java "float" primitive)
  2. Pass value to CUnitType constructor to save it off per unit type.
  3. In CUnit.update(), go ahead and add the health per second on each game simulation step to any unit who is not dead, not full health, and has HP regen. The value you will have is per second, but you need it to be per tick when you add it, so divide the value by game turn ticks per second before adding it to the unit health. You can query turn ticks per second from WarsmashConstants class.
  4. After adjusting hit points, call on the unit state notifier in CUnit to make sure the UI updates. The stateNotifier.lifeChanged() function already exists and will handle things for you if we're lucky.
  5. If you made it this far, test attacking your beefy sheep in game on Warsmash and see if it regenerates health. If so, make a pull request so I can include your code in the official version if you are willing to share. Code currently is under the MIT license, so I would interpret your contribution to be MIT licensed as well. HP regen is something I did not implement yet. But if you never do, eventually I will.
I tried it and it seems to work for me :thumbs_up:
I'll gladly share the code but if someone else (e.g. @HerlySQR) wants to contribute I don't want to be in the way. I just thought trying these seems fun and wanted to provide some furhter insights. Also if somebody wants to try these and is unsure about, I'll gladly help as best I can.

A further comment for others who might want to try some of the suggestions:
  1. As a next step of advancement, if you're interested, try to implement the "Only during the night" regeneration of the Night Elves. You can query the in-game clock using a function on CSimulation, although I don't recall if it has a way to actually determine whether it is day or night yet. If not, it would be reasonable to add new functions (as a sort of future internal API) such as CSimulation.isNightTime() and CSimulation.isDayTime(). These would just be a convenience that are implemented by comparing CSimulation.getGameTimeOfDay() against CSimulation.getGameplayConstants().getDawnTimeGameHours() and CSimulation.getGameplayConstants().getDuskTimeGameHours()
Hit point regeneration type would be 'uhrt' in terms of internal ids (again, see UnitMetaData.slk).
 
Level 15
Joined
Jun 26, 2020
Messages
1,180
Hello, sorry of asking too late, I'm busy with a lot of things those I don't even end yet, I will check what you said @Retera for now, is there a place to comunicate us to not doing it in this tread?

Edit: I can't run Warsmash with the -loadfile command, I only could do it with the route "Maps\Campaing\Human01", but with other I can't, what am I doing bad?
 
Last edited:
Level 2
Joined
May 13, 2020
Messages
14
Edit: I can't run Warsmash with the -loadfile command, I only could do it with the route "Maps\Campaing\Human01", but with other I can't, what am I doing bad?
As Retera said, there could be several reasons but the most likely reason - I guess - would be that the file you want to load can't be found. Where is the map you want in relation to your Warsmash directory? How did you try to load it?

If it is in the Warsmash Folder (where e.g. warsmash.ini is), just typing the filename should work, usually. If it is in a subdirectory use subdirectoryname\filename. And if it is outside (for instance in your Warcraft folder) using ../filename or ../directoryname/filename should do the trick. In my experience there are a few maps which do not load but most should work fine

If all that is correct and it still doesn't work, looking at the logs like Retera suggested would be the best approach to see what is wrong.
 
Level 1
Joined
Sep 8, 2021
Messages
2
Had to create an account to show my support for this. Been lurking and following the progress for a while. Can't believe how far you've come with the latest teaser video showing some triggers and authentic-looking unit selection. Truly wish I could contribute to this project right now.
 

Retera

Hosted Project: WME
Level 37
Joined
Apr 19, 2008
Messages
1,320
Can't believe how far you've come with the latest teaser video showing some triggers and authentic-looking unit selection.

Thanks! It's cool to have people following the project enough to specifically pick out what I had most recently been working on.

Truly wish I could contribute to this project right now.
Is someone preventing you from contributing? :vw_wtf:

Edit: (The only fork on github of my project is someone whose only change to the repo was to illegally delete my tiny license TXT file. You could change literally anything, or nothing, and do better than that.)
 
Last edited:
Level 1
Joined
Sep 8, 2021
Messages
2
Is someone preventing you from contributing? :vw_wtf:

If I'm being totally honest with myself, I'd have to point the finger at me. After finishing a monstrous home lab project, what I'd love to do more than anything with my contributions is to try to load Warsmash as a Minecraft mod. However, learning Java, your source code, and Minecraft modding seems overwhelming coming from a place of total inexperience. Though, if I could set up a shared inventory between Minecraft and Warcraft 3, dynamically turning every Minecraft item into a Warcraft 3 item and every Warcraft 3 item into a Minecraft item, I could rig up some level of a shared economy between the two games. The passion is there, but I'm not sure the time is. If I do wind up down this path, I'm sure I'll get familiar enough with the codebase where I could upstream improvements to the actual Warsmash engine. Definitely will revisit this chain of thought once I have a solid development environment.

Edit: I took a look at that GitHub fork. I don't see any sign of a deleted license. Looks like the user just created an account, forked the engine, and hasn't done anything with it yet.
 
Last edited:

Retera

Hosted Project: WME
Level 37
Joined
Apr 19, 2008
Messages
1,320
I don't see any sign of a deleted license.
Oh, hey, yea he might have fixed it after I messaged him about it at some point. Cool! Maybe he's a pretty nice guy after all.

what I'd love to do more than anything with my contributions is to try to load Warsmash as a Minecraft mod
It seems to me like this would end up being a lot of effort depending on how you did it. The item sharing might be something you could get up and running fairly quickly if you got familiar with the codebases, but sharing game characters between systems would be a bit of work. Last time I was inside the sourcecode of Minecraft, and this was quite a while back, the 3d art such as for example the Minecraft sheep which I recall modifying was artwork specified inside of a code file. I assume it was much easier for Notch to have done this originally as a few-man smaller project. Minecraft and Warsmash at a fundamental level do share LWJGL as their low level for getting OpenGL driver access in java, but above that layer Minecraft is (or was, my info on this is from a 2014 foray into MC modding) drawing these characters with its own draw calls in its own way. Meanwhile, Warsmash includes LibGDX for simplicity but fights its own libraries and renders assets through its own draw calls (via calls to the LibGDX wrapper that end up going almost directly to LWJGL) instead of using LibGDX's high level 3d model and 3d camera APIs and systems. Essentially the reason for this is that while I was still learning how these things work, and I was eager to make a Warcraft III modding centered project, I attempted a 1:1 port of the viewer made for hive. I don't know how familiar you are with that but whenever we go to download a Model from the Models section on this website, there is a "View in 3D" button to get a very accurate preview of how the Warcraft 3 character model will look in-game. Matching the old game that closely is its own sort of work of art, and in this repo that part was basically done for me but in a different language, and so I read through the code and recreated it in Java which both forced me to learn how it worked, and gave me access to it as the fundamental system for how Warsmash draws its world.
And I know I've written about this in other places on Warsmash related media so depending how much you've read into that I might be repeating myself here and if so I apologize. But basically Warsmash is already kind of fighting its own system, using the viewer port instead of LibGDX for the 3d world while using LibGDX a bit more as a basis for 2d UI when trying to draw stuff parsed from Warcraft 3 UI format in 2d. When I try to imagine putting minecraft stuff into that 3d render pipeline, the closest thing that we probably would want as our goal initially would be rendering minecraft into that world such as a minecraft sheep as a Wc3 unit and it would still be really annoying to set up because the ModelInstance api that was originally modular in the Hive 3d model viewer ended up getting somewhat less modular in Warsmash in my attempts to get things done. A lot of places end up basically stipulating at runtime that unit models in the Warsmash game logic I've been writing have to be MdxComplexInstance instead of any subclass of ModelInstance as how it would have been nice. This would likewise be a problem for example if we wanted to port the Starcraft 2 model loader and renderer from that viewer I linked into Warsmash. In theory it would be much easier to do than Minecraft stuff since the code would be so similar to Warsmash, since as I said I originally copied from that repo. But just as soon as we set up M3ModelInstance from the SC2 model parser from that link inside Warsmash, the Warsmash gameplay stuff would throw java exceptions trying to play the Stand animation or whatever in a very Warcraft-3-centric way due to java.lang.ClassCastException: Class M3ModelInstance cannot be cast to MdxComplexInstance I assume. And that's just theoretical.

So, MinecraftModelInstance if we made a small wrapper to wrap those minecraft java classes that call lwjgl draw directly or whatever is something we could probably plop into the Warsmash 3d scene if we gave it a few hours but applying this to a unit would just be a royal pain and a lot more work requiring Warsmash to become more extensible. Initially it would be far easier to get that thing to render into the world even though it would not be a Warcraft 3 unit, just a 3d model instance drawn into the same scene. And to even do that would still require getting the Warsmash camera matrices shoved into the Minecraft model camera stuff which probably wouldnt be compatible out the door.
Going in the reverse direction, and for example lets say putting Warsmash as a game that could itself be played ingame in Minecraft on an ingame computer screen that you interact with as your Minecraft character might be substantially easier. You'd probably have to hack around my code in WarsmashGdxMapGame.render() and try to call this after some LWJGL to convince Warsmash to render to an offscreen FrameBuffer and then read the pixels and put them as the texture on the ingame Minecraft component. It probably wouldn't look good and it might have fps problems but I could imagine someone decently familiar with both repos might be able to pull it off. Of course, you could try to do the opposite and have Minecraft playing on an ingame TV screen doodad in Warsmash but it would be much harder to see from the bird's eye camera and harder to control because Warsmash isn't as emersive like that, so I don't know why you'd do it that way.

So, maybe that's not even really what you meant.

Though, if I could set up a shared inventory between Minecraft and Warcraft 3, dynamically turning every Minecraft item into a Warcraft 3 item and every Warcraft 3 item into a Minecraft item, I could rig up some level of a shared economy between the two games.
Going back to this, if I imagine for a minute that we somehow do subclass ModelInstance on Warsmash and make model insntances that call to the function to render those little Minecraft item objects, which are a little 3d thing with a round black picture of a shadow on the ground (similar to War3 as I recall) even assuming we overcome this hurdle I'm still not sure what we do with it from there. Suppose I have a hero wandering through a Warcraft 3 custom map mission inside Warsmash and I encounter a Diamond Pickaxe and put it into my hero inventory. I guess you would want to enforce somehow that this only happens on your particular game server so that I cannot simply edit the custom map for Warsmash and make a way to get infinite copies of the item. But this is going to be much more easily said than done because Warsmash's early networking code is already aspiring to use something akin to lock step instead of a direct client/server model, which means that knowledge of the item is part of something happening on the repeat game simulation per player's physical computer machine instead of a bean-countable collection based on the remote server. So even if my Warsmash hero can drop his Diamond Pickaxe into a Circle of Power that then calls to a Send to Minecraft Server function and beams up the item into Minecraft, it's unclear to me how you would prevent any arbitrary user from sending items to the server in the same way basically. So I'm not sure how it would become a functioning economy instead of a free-for-all of users giving themselves whatever items they like by abusing the differences in the scope of a play session of the two game systems

But I guess if it was single player and targeting users who were not going to touch the code, I could imagine if I have these two games basically both running under one Java process with a hotkey like tilde or something that switches between the Warsmash pipeline outputting the screen or the Minecraft pipeline outputting to the screen, maybe that would be more reasonable than I was giving it credit for. That way, it's assumed you're playing one single player Minecraft world at the same time as one Warsmash map file, so we constrain the scope of our system to have a meaningful continuation of what it means to have an item. In that single player idea, I guess I assume once we loaded a minecraft world and war3 style map both, connecting them could be kind of fun. Maybe instead of pressing the tilde key, it could be like a nether portal but where you have to make the blocks in the shape of The Dark Portal from WoW instead, and when you step through we swap pipelines to Warsmash outputting to the screen. Something like that and if it always used the same set of custom Warsmash map files when the game jumped to Warsmash, that might be more reasonable. It's still going to be a problem that the character inventory of the minecraft player who steps into The Dark Portal would be so much larger than on Warsmash. Assuming the player is spawned into the Warsmash map by calling a Trigger Editor action function similar to how campaign hero save/load between maps will probably work on Warsmash once I get there (I intend to continue to be highly inspired by War3 internal systems, so we can sort of assume War3 triggers conceptually as how this future system might look) then presumably the Warsmash context launches after stepping through the Dark Portal with a new Hero unit spawned corresponding to our single player guy who stepped into the portal. But even this doesn't work since Minecraft has 10 items even just on the bottom hotbar, but CAbilityInventory on Warsmash currently renders via a UI that is contrained to 6 slots because of artwork. I have shown videos of a modified Warsmash client where I increased this constant to 9 items but even if we put a much larger value to match Minecraft inventory size, we would start to want a better UI for this. So assuming we take one of these WC3 systems that already exist such as this one from TriggerHappy and force it into Warsmash by adding any missing Warcraft 3 stuff necessary to get the inventory library running, you might hit the ground running but I'd question greatly whether the War3 modding technology for this kind of inventory would be compatible with the epic work of art spaghetti codebase you would be running theoretically at this point. It might honestly be easier to rewrite the UI system for that kind of Minecraft inventory natively into Warsmash directly, or I guess port the Minecract UIs for it directly although I can't speak to how feasible that would be due to lack of familiarity with how the Minecraft inventory UI was written. It might be very easy or it might not. It might be that I never looked at that part of Minecraft; my 2014 foray into Minecraft modding mostly included stapling the wings of the Ender Dragon onto a sheep and filling the sky with sheep monsters that threw Ghast blasts and destroyed the entire world. Then I gave myself a custom item with infinite uses and the icon of a brown brick that threw Ghast blasts with 3-5x blast radius back at the Flying Sheep whenever I right clicked holding the item. So I wasn't very focused on how the Minecraft UI was made, and in the end I destroyed the world and had a good laugh and then took a break from this.

So, let's liberally assume for the sake of example that we spawn a hero with a new Warsmash ability "CAbilityMinecraftInventory" on Warsmash that lets us open a Minecraft inventory for the currently selected hero in Warsmash, and it maps back to the inventory of our active (but sort of paused) Minecraft session and character. I guess we could have part of the game where I walk to a Goblin Merchant and sell my diamond pickaxe from a bird's eye view for a ton of gold and then walk back through The Dark Portal into Minecraft, but at this point we would have been programming for many hours or possibly days to get this sort of gimmick entertainment. I'm not quite sure where we go from there. Maybe that's up to you and that's what being creative is all about.

So, in summary, there are some of my first thoughts when I go to imagine myself doing what you describe. But I have not investigated at all whether the modern Microsoft Minecraft would still be amenable to doing this at all. Even back then in 2014 Minecraft was closed-source like Warcraft 3, not like Warsmash where we can just download the code. So when I made the Flying Sheep I was using some "Minecraft coder pack" thing that converted the Minecraft java binaries which were intentionally obfuscated trash with names like "aa.class" and "ab.class" and "ac.class" back into meaningful names like "WaterBlock.java" or "LavaBlock.java" or "SheepMob.java" or whatever. It's been a long time so these are just conceptual names, not the MCP technical terms that were in use even back then. So anyway I don't know if Minecraft would be against that or not. A former Blizzard employee suggested to me with Warsmash that I should "do whatever I want" I believe were his words, or something akin to this, so I have done my project personally under the assumption that as long as I only distribute code that I wrote myself or got from other open source projects with obvious open source licenses, then no big company nor affiliate will ever have any legal grounds to question me or prevent me from doing whatever I want to entertain myself. But I don't know how that applies to Minecraft. Last time I tried to download Minecraft, even though when we bought the game from Notch the license specifically said there will never be DLC for all time and that this purchase was the only purchase, in the modern 2021 day someone told me to log in to get free stuff from my 2010-2011 account and Microsoft's thing said to log in as Mojang and Mojang said we dropped support for your login. If you go long enough, and your game changes hands between big money bosses and companies enough, I think it stops mattering what was legally written in advance and the rule and authority in human society deteriorates into actually just being whoever has the most money (and lawyers). So because of that I probably have to pay Microsoft for nothing in return basically in order to redownload Minecraft again via a new license, similar to how this month Microsoft took away office on my PC and want me to pay them again for nothing in return except for just unlocking office again for me which obviously costs them basically nothing except for some server maintenance. It's that flawed premise of software as a service that started with games like World of Warcraft and eventually got us to where we are today. That's why eventually companies like Microsoft will likewise have Bill Cosby rape cults similar to Blizzard because in this world, that becomes acceptable if you can create a societal reason for people in mass to give you money for almost nothing in return. Or at least, this last bit was my personal cynical opinion and how it looks like things are, sometimes, but maybe I'm just tainted by too much time at the PC during a pandemic.
 
Last edited:
Top