Many modern games use a product called Awesomium to render their GUIs. I think it can be used to make modern looking GUMPS for Ultima Online.

What is awesomium?
It is essentially google chrome in a c++ / c# library.

What does that mean?
You can develop gumps / GUIs using html, css, javascript and even silverlight and flash. They can be used directly inside the game client.

Want to show a movie as part of a quest?

Proof of Concept
Using UltimaLive, I spawned a child window inside the game client and made it the target of Awesomium. I then told it to load the UO website.

This window is not floating above the game client, it's a child window much like a gump is. Of course an actual gump wouldn't need to have scrollbars.

This proof of concept would be implemented as a plugin to UltimaLive and not part of the UltimaLive core. I still have to figure out what the interface would look like on the ServUO server side.

ai22.photobucket.com_albums_b347_Praxiiz_in_game_browser.png

The downside is that 9 additional files have to placed in the client folder to support awesomium.

Anyone familiar with Everquest Next landmark has seen their launcher application. This UI was built using Awesomium:

ai22.photobucket.com_albums_b347_Praxiiz_eqnlandmark.png
 
Praxizz - the only way you could become more awesome than you already are in my book is by figuring out how to dupe yourself so we can have two of you pushing the limits of UO!

Awesome stuff!
 
Thanks, but it's not done yet. This is still just concept stuff.

Another in-game GUI done using Awesomium:
ai22.photobucket.com_albums_b347_Praxiiz_eqnlandmark_ingame_market.png

There are many options for serving up the webpages, including using ServUO to send the pages as text directly to the client. Awesomium has client callbacks which would need to be defined in UltimaLive.

I need to figure out what those callbacks would look like. If anyone has any input (i.e. what would a ServUO script look like) I'd love to hear it.
 
Last edited:
In case anyone wanted more information about Awesomium: https://awesomium.codeplex.com/

Edit: Being able to have the window in uo would be nice rather then it opening their browser outside the game. It has been possible to open webpages in gumps for some time,"this is just the next step"

INB4 someone adds browser gump for real money "donation" store. *spits*
 
Last edited:
As I have said before, we have yet to fully realize the capabilities of ultima live. Good work.

I see a need for something like this for things like new player guides as well as in game stats and rankings.
 
How? I remember seeing a post about it some time ago but can't find it anymore.

Traditional gumps just support text sent to them through the normal gump interface. If you specify an HTML element on a gump, it works like a label with an optional background and scroll bars. You can then specify some traditional elements in the HTML gump element.

You can't presently tell a gump to load a full webpage or specify an external image or anything fancy. It is basically just a glorified gump label. You can include links but they open in an external web browser.

You cannot mix fonts with different heights in the same line.

Supported HTML Tags: (tags are closed using </tag>)

  • <H1>
  • <H2>
  • <H3>
  • <B>
  • <I>
  • <U>
  • <BR>
  • <BODY>
  • <CENTER>
  • <div align=left>
  • <div align=center>
  • <a href=>
  • <BASEFONT COLOR= SIZE= FACE= >
Sample Tags:
H1, H2, H3, H4, H5, A
ai22.photobucket.com_albums_b347_Praxiiz_html_text_samples_1.png

<BASEFONT COLOR= SIZE= FACE= >abcdefghijklmnopqrstuvwxyz</BASEFONT>

The size setting seems to have limited effect. Only a few face settings are known. There are many more fonts in the .mul files, but it is unknown how to specify them.

Size 3,4,5 are the only sizes that seem to make a difference.

Core Fonts:
ai22.photobucket.com_albums_b347_Praxiiz_coreFonts.png

Decorated Core Fonts:
ai22.photobucket.com_albums_b347_Praxiiz_font_decorations.png

Gargish:

ai22.photobucket.com_albums_b347_Praxiiz_gargish.png

Runic:

ai22.photobucket.com_albums_b347_Praxiiz_runic.png
 
The nice thing about using awesomium is that you are in fact loading a page into a client window, not just using an extremely small subset of HTML.
 
Thanks, but it's not done yet. This is still just concept stuff.
I need to figure out what those callbacks would look like. If anyone has any input (i.e. what would a ServUO script look like) I'd love to hear it.

Something similar to gumps, I mean:

class AwesomiumInterface
constructor: (string url, int x, int y, int width, int height) // display a specific web page
constructor: (CustomAwesomiumInterface cai) //maybe the server can send custom HTML content to the client?
method: RelayInfo(Info info) //call back when the client fill a form specified on the web page (if form action="ULRelay_FormName1/2/3" so they can answer different forms and still fill web forms)

PlayerMobile
SendAwesomiumInterface( AwesomiumInterface interface); //same as SengGump();

It is a bit hard to think how it could be without knowing what is needed o use them, but I think closer to the gumps is better, unless a very specific code is needed


Anyway, great work Praxiis! can't wait to see it running :)
 
Unfortunately, Awesomium doesn't have a license that is compatible with GPL.

I am now looking at the Chromium Embedded Framework (CEF3). It has the three clause BSD license and should be GPL compliant.

It will be extra work to get it integrated, and it has a higher learning curve, but I think it's doable.
 
I'm really interested in trying this out. A fully working page would be amazing, but I'd be happy just get to get a linked image to show up.
 
This Idea would be so amazing if a player just hit [donate and it loaded all that kind of stuff. Dear goodness.
 
I've been making good progress on getting the Chromium Embedded Framework (CEF3) integrated as a plugin for Ultima Live:

ai22.photobucket.com_albums_b347_Praxiiz_in_game_browser_1.png

On the browser side (inside the client), gumps will be built up using HTML and javascript. javascript will be the only method for pushing data back to ServUO.

I also need to develop a way to programmatically determine which UltimaLive plugins a particular player has installed. This would allow a shard to check to see if they have the web gump plugin installed before trying to send web gumps, and send a normal gump if the player doesn't have the plugin.
 
Ahh, well in that case I can't imagine too much progress has been made then. Praxiiz is pretty much out of the scene, and turned over a lot of his releases to gametec; and I think he's been focusing on his mapping software.
 
Because of licensing conflicts, I switched over to CEF3 which is more compatible with the GPL.

UltimaLive 0.98 is attached here. It is a cleaned up version of 0.97 that has a better debug window with some better handing code when function signatures can't be found. It also has some hooks for the web gumps system which isn't finished.

The web gumps code is also attached. Please feel free to take it and use it and continue work on it. It was never my intention to keep this code from everyone, it just wasn't finished. I hope that someone will pick it up and finish it. I am happy to share what I know about it, and the challenges I encountered when I wrote it.
 

Attachments

  • UltimaLive_working_copy - Plugin - 0.98.zip
    491.9 KB · Views: 94
what do I do with UOLive 097? Just delete the folder and drop this one in?

And thank you for the resource.

*****************************
I read the entire post finally, if its not a working copy, I probably should not use it, right?
 
Noob (when it comes to Ultima Live) questions...

How do you install or use this? Core folder goes in Server folder to be compiled? Other folder goes in Scripts?

What about all the cpp files, do you compile them, or put them in a folder?
 
The way I'd like to approach this, is to release a Core version of UltimaLive without the map streaming but with the capability to have plugins. It would be the igrping.dll and would contain code for logging, subscribing to packets, and other common functionality.

The map streamer would then become a plugin to the core system, and the web gump system would be another plugin.

Basically you would drop the igrping.dll into the client folder, and then you would also have a folder called plugins.

Each plugin would consist of dropping one or more additional dlls into the plugins folder, and UltimaLive would auto detect and load them.

If I restructure in this way, then a shard could just use web gumps or they could use maps or both. It makes the system much more modular.
[doublepost=1492967754][/doublepost]
Noob (when it comes to Ultima Live) questions...

How do you install or use this? Core folder goes in Server folder to be compiled? Other folder goes in Scripts?

What about all the cpp files, do you compile them, or put them in a folder?

Right now it's not complete, but the way it will work is .cpp files are compiled into client side DLLs. That get put into the client folder.

The .cs files in the server side folder are dropped into ServUO and handle the server side logic.

DLLs add new client functionality. I provide the source code so that people can develop their own, but it's not necessary. I post compiled copies as well.
 
Right now it's not complete

I am confused. I have seen this work, so I know it does. I just need to know what I need to do on my end to get the Lumberjacking part working on my test shard. I am not talking about the new web gump system, and I am not talking about what you are hoping to achieve long-term. Those things sound great, but right now my needs are limited and few. Or maybe even one. Just the tree chopping thing. Thanks.
 
To get lumberjacking working, you need to get UltimaLive up and working first. There are two parts to this: client side and server side.

Client Side
Each player needs to replace a file in their client folder called igrping.dll with the one provided with UltimaLive.

You can download it here: https://github.com/praxiiz/UltimaLive/raw/master/igrping/Release/Igrping.dll

Just copy it into your Ultima Online client folder and replace the existing file.

Server Side

Download the UltimaLive project from github. If you dont want to mess around with git, you can just
download the zip file here: https://github.com/praxiiz/UltimaLive/archive/master.zip

Inside that zip file is a folder called ServerSideScripts.

Inside your ServUO scripts folder, find an appropriate place to put the UltimaLive server side files.

e.g. Scripts/Services/UltimaLive

Copy the Core and GraphicBasedHarvestSystems folders.

e.g.
Scripts/Services/UltimaLive/Core
Scripts/Services/UltimaLive/GraphicBasedHarvestSystems

Alter UltimaLiveSettings.cs and change the unique shard identifier to something unique to your shard.

Make the following modifications to PlayerMobile.cs:

Find the class declaration of PlayerMobile:
Code:
  public class PlayerMobile : Mobile, IHonorTarget

Add the keyword partial before the keyword class:

Code:
  public partial class PlayerMobile : Mobile, IHonorTarget

Look in playermobile and find the SetLocation method and the OnMapChange method.
Code:
  public override void SetLocation( Point3D loc, bool isTeleport )

Code:
  protected override void OnMapChange( Map oldMap )

Add this to the bottom of the SetLocation method and to the top of the OnMapChange method

Code:
  /* Begin UltimaLive Mod */
  if (BlockQuery != null)
  {
  m_PreviousMapBlock = BlockQuery.QueryMobile(this, m_PreviousMapBlock);
  }
  /* End UltimaLive Mod */

You will need to go into the MapRegistry.cs and define the additional physical maps you want to use. You can see existing examples in the file.

You will also need to define maps in your regular server/misc/mapdefinitions.cs, for example

Code:
  AddMapDefinition(33, 0, new Point2D(181, 181), new Point2D(181, 181));

If you don't want to use additional maps, just make sure the normal Ultima Online maps in server/misc/mapdefinitions.cs are also defined in MapRegistry.cs.
 
Last edited:
Thanks for that tutorial, it was very useful.

If I may, I seem to have a snag. I appear to have done everything:

1. Replaced the file in my client folder called igrping.dll with the one provided with UltimaLive.
2. Downloaded Zip file.
3. Dropped UltimaLive folder into Scripts/Services
4. Modified PlayerMobile - partial class definition, SetLocation and OnMapChange methods.
5. I don't have any custom maps, using latest ServUO, so MapRegistry should be all set.
6. I also found I needed to change BaseAxe to use UltimaLiveLumberjacking as the Harvest Method.

Now, when I hit a tree I notice a couple things:

1. The leaves shake the first and sometimes second time I hit it.
2. I get no feedback (there is not enough wood, you place logs into backpack, etc.)
3. After first or second hit, following hits do nothing at all. No feedback, no changes, nothing.
4. The trees never fall.

Did I miss anything?
 
Next I would verify that UltimaLive is working. Use the [addstatic itemid (no spaces between add and static) and make sure that the system is capable of new static items. If that works, use [delstatic to remove it.

e.g. [addstatic 127
e.g. [delstatic

You should also be able to [props your character and see the UltimaLive major and minor version number that the server thinks you are using.
[doublepost=1493084625][/doublepost]On the first swing you should see the leaves falling animation and the leaves static object should be removed from the tree leaving just the tree without leaves. On the second swing the tree graphic should be replaced by a tree stump and a fallen log graphic if you are using the stock graphics. A third swing on the fallen log should remove half of it.

You should get a change in graphics as your feedback each time you harvest unless UO Live isn't working.
 
Seeing that the version number is 0 for both major and minor means that the server side scripts never received the version packet from UltimaLive on the client side.

The console message is normal. It just indicates that it resets the version it has for your character each time you disconnect / reconnect. The version info then gets updated when you login and the client sends the version packet.

Also when you login, you should get a ULTIMALIVE v.0.98 in your journal near the top.

I would check the client side again. Check the size of Igrping.dll in the client folder and make sure it's ~567k. Also make sure that if you are using razor that it is pointing to the same client folder where igrping.dll was copied.
 
Works. I was using a registry switching file, counting on it to redirect Razor for me, but evidently it wasn't working, because when I manually pointed Razor at the right directory it worked.

Thanks.
 
Cool. I've been following that thread as well and I must say that it looks promising. Look forward to seeing both. On a semi-related question, does UltimaLive 0.98 work out of the box with the 7.0.59.5 client, or is there some modification needed?
 
I haven't done any testing on that client. I suppose I should come up with a series of tests to use with new clients to ensure compatibility. The first thing that you do to check is to run the debug client and see if you get any failures anywhere. I should tell you if it fails to find any internal structures that it needs.
 
Back