RunUO Community

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

Ultima Live - In Game Map Editing Framework

Praxiiz

Sorceror
That's how I was doing my experiments, altering the tiledata flags and art locally outside the framework.

Maybe more useful than trying to mimic a single effect would be to include the ability to change tiledata & art based on the map you are on. That would greatly expand the ability to make the maps different. You could theoretically have a different tile set for each map.
 
Ultima Live : Editor

This is just a quick couple of scripts to create a interface for the in game map editor.

All credit for Ultima Live goto Praxiiz for creating such a wonderful system!

Features :

Raise/Lower Statics and Land Tiles w/set values.
Set/Change Stratic and Land Tile IDs
Add/Delete/Freeze & Move Statics
Player GPS(get xyz)

This is just a quick system to help the author, it is still considered in Alpha!

To use :

Unzip into your scripts folder and restart shard
[add ULRing
Equip ring to mark the rings password which makes it harder to get into the wrong hands.
System auto starts when equiped, or restart system by double clicking ring when equiped.
Must pick land or static menu in order to start using either editor.

Please post any problems, I do plan on cleaning this code up in the future if all goes well.
 

Attachments

  • UL_Editor.zip
    96.8 KB · Views: 26
  • ULE.jpg
    ULE.jpg
    93.7 KB · Views: 127

Praxiiz

Sorceror
GoldDraco13 said:
Ultima Live : Editor

Awesome. I welcome any and all additions :)

Thank you.

Any server side code you (and anyone else) adds will allow me to work on features that have more to do with client side functionality and stability.
 

Pure Insanity

Sorceror
Once you release your next version. I'm sure a few of us will be more inclined to help out like GD13 just did (Nice feature filled visual editor.) Having Pandora support your system would be pretty easy too in the near future. Can't wait to see what this system does for the UO community over time. =D
 

Praxiiz

Sorceror
UltimaLive 0.50 Alpha released.

I do not expect this to be a flawless release. There are going to be issues, I will post instructions on the first page. I've been working on trying to get it stable, but I haven't been able to test it on a wide variety of clients. I'm hoping that people will help me with that and report errors back. As far as I know this hasn't been attempted before (adding additional maps) so there are bound to be problems. Lets find the bugs and get them fixed!

See the first post for the release.
 
Awesome. I welcome any and all additions :)

Thank you.

Any server side code you (and anyone else) adds will allow me to work on features that have more to do with client side functionality and stability.

No Problem,

If you want, I can continue and script a better interface, this was just a quick interface, nothing I would consider full featured.
 
If anyone has any success or problems with 0.50 I'd love to hear about it :)

Not sure what changed in this to effect the item packet, but if you drop an item into the backpack, it disappears and like wise for placing items onto the world map, then a message appears about query, locks up the open paperdoll/backpack etc etc.

Code:
RunUO - [www.runuo.com] Version 2.1, Build 4272.35047
Core: Running on .NET Framework Version 2.0.50727
Core: Optimizing for 2 processors
Scripts: Compiling C# scripts...tested ( 4 warnings)
Warnings:
+ Engines/ServerFiles/MapOperations.cs:
    CS0108: Line 61: 'UltimaLive.MapOperationSeries.BlockNumber' hides inherited
member 'UltimaLive.BaseMapOperation.BlockNumber'. Use the new keyword if hiding
was intended.
    CS0108: Line 66: 'UltimaLive.MapOperationSeries.MapNumber' hides inherited m
ember 'UltimaLive.BaseMapOperation.MapNumber'. Use the new keyword if hiding was
intended.
+ Engines/ServerFiles/MapChangeTracker.cs:
    CS0168: Line 136: The variable 'e' is declared but never used
    CS0168: Line 213: The variable 'e' is declared but never used
    CS0168: Line 300: The variable 'ecc' is declared but never used
+ Engines/ServerFiles/MapRegistry.cs:
    CS0436: Line 81: The type 'Server.Network.LoginComplete' in 'c:\Users\Tory B
ertram\Downloads\RunUO-2.2\Scripts\Engines\ServerFiles\packets.cs' conflicts wit
h the imported type 'Server.Network.LoginComplete' in 'c:\Users\Tory Bertram\Dow
nloads\RunUO-2.2\RunUO.exe'. Using the one in 'c:\Users\Tory Bertram\Downloads\R
unUO-2.2\Scripts\Engines\ServerFiles\packets.cs'.
+ Engines/ServerFiles/UltimaLive.cs:
    CS0219: Line 613: The variable 'newTileCount' is assigned but its value is n
ever used
 

Praxiiz

Sorceror
Check to see if auto-queueing is turned on in razor. Is this happening when you're on a normal map or an auxiliary map?

Also I will clean up those warnings before the next release.
 

Pure Insanity

Sorceror
Check to see if auto-queueing is turned on in razor. Is this happening when you're on a normal map or an auxiliary map?

Also I will clean up those warnings before the next release.

Does your Razor "addon" not disable auto-queueing? If not...anyone remember if you can turn that off via the Razor Negotiator thingy?
 

Praxiiz

Sorceror
I can just turn it off when a player moves to an auxiliary map. I'd rather fix it so it works like it normally would, I'm working on this now.
 

Praxiiz

Sorceror
I took a break from debugging the auto-queue today, and decided to start researching random terrain & dungeon generation.

I implemented a diamond squares algorithm, here's some early results:

diamondSquares.jpg

mountainSquares.jpg

The height range of course is a parameter. This is the first of many terrain algorithms that are available. This command will be available in the next small release I am preparing for.
 

Pure Insanity

Sorceror
Pretty sweet. The really sad thing is about this system, I bet that OSI will end up using it to fix all the issues with their old maps and/or make new maps. Because clearly how ever the hell they make their maps, suck (you'll find tons of crap in walls, under the ground, bad transitions, ect.) You're doing some of the most awesome work I've seen done for UO in a while, Praxiiz. Keep up the awesome work, and happy holidays! :D

Btw, I'd like to see some map cleanup tools too eventually. Perhaps something to wipe just the trees/greenery in an area. Or something to wipe statics that are under the ground in a set area. Really there is just so much you can do with this system, it's really amazing.
 

alexsperi

Sorceror
Hi, first of all I would like to tell you that you mod is awesome! You rock man :D

I have downloaded the latest package (0.50) and patched a vanilla runuo 2.2 server built from sources with the scripts that come from the compiled package. Then I patched my razor install (1.0.13), copied a new map on the server as Trammel map and in a couple of seconds I watched the server streaming the new map to the client (7.0.15.1) while I moved around... it works like a charm! :)

The next step was trying to use the map-switch feature, so I grabbed another map (6144x4096 pre-ml map of an old shard) copied it to the mulfiles server directory (renaming the files as map32,statics32 and staidx32) and at last added the line:

Code:
RegisterMap(32, 32, 32, 6144, 4096, 0, "CustomMap", MapRules.TrammelRules);

to MapDefinitions.cs. Now the bad news: when I launched the server, immediately after logging in, razor raised an infinite number of exceptions. I looked at the logfile and contained several rows filled with:

Code:
ERROR UltimaLive.UltimaShared - Could not find entry: mapX.mul_addr
ERROR UltimaLive.UltimaShared - Could not find entry: staidxX.mul_addr
ERROR UltimaLive.UltimaShared - Could not find entry: staticsX.mul_addr

where X goes from 0 to 5. I think the mod cannot locate the address of maps in memory (maybe unsupported ultima online client version?), but it's only my guess.

Any ideas?

PS: I have attached the logfile with the highest loglevel set, I hope it helps. :p
 

Attachments

  • UltimaLive.zip
    1.5 KB · Views: 7

Praxiiz

Sorceror
The error you are seeing is caused by UltimaLive not finding the memory addresses that are setup by the client. There is a file called clientalterations.dll that gets loaded when you start the client using razor. This file sets up a space for UltimaLive to use to store parts of maps, and to communicate with the UltimaLive portion that is running inside of Razor.

The errors are basically saying that the clientalterations.dll didn't do it's job properly. There are a few things you can check. First, look inside the reloader.cfg and make sure that it looks something like this:
Code:
ClientAlterations.dll, OnAttach;
#The final parameter in the following line is the log level and determines the log granularity.
#Valid values are info, warn, error, fatal, and none
!UltimaLive.dll, UltimaLive.RazorUtility, InitializeUltimaLive, info;

The top line (without anything to the left of it) instructs the reloader to inject the clientalterations.dll into the client and to execute its onattach method. If this is done correctly, then the definitions should be setup. If they aren't setup, then something is preventing the clientalterations.dll from loading the clients maps in shared mode. This could be caused by several things. If your server is running off the same machine as the client, and if its using the same client files, then you'll have problems.

Also, check to see if the razor process is still running, or the client process is still running. Make sure that razor has truly closed (using task manager).

It shouldn't be caused by not finding the addresses. (Although it is possible, I think it would cause other noticeable problems) The client end just reports addresses that were mapped during the client load. The razor portion does the actual searching, and you would see a log message if they weren't found.

Let me know if you get it to work, and meanwhile I'll test the same version of the client out as soon as I can to see if there is anything else that could be causing it to fail.

Up to this point I only have logging enabled for the razor part of this project. I need to add support for logging in the other parts of the system. They are written in C++ so I need to find a logger for C++ that isn't too much hassle.

When I get the C++ logger in place, then it will be much easier to track these sorts of problems.
 

alexsperi

Sorceror
I checked the reloader.cfg and it looks like the one you posted. I forgot to mention previously that the server is looking for mulfiles in a separate directory so the client cannot "lock" (at least I presume :p) the files preventing the server to write on them. As a proof of that I tried to "addstatic/delstatic" several items and all seems to go fine.

Could you tell me what's your client version so I can check if the error it's not client-related?
 

alexsperi

Sorceror
I downloaded ML packet and updated 'til 7.0.1.1 like yours. The previous problem is partially resolved as the mod now seems to be able to find map addresses, but now the client raise an error window with the message "Unknown Facet 32" when I try to "[go custommap". The logfile now is:

Code:
INFO UltimaLive.RazorUtility - ----------------------------------------------------------------------------------------------------------------------------
INFO UltimaLive.RazorUtility - Starting UltimaLive v.0.50 ALPHA
INFO UltimaLive.RazorUtility - Waiting for Razor's MainForm...
INFO UltimaLive.RazorUtility - Found Razor's MainForm
INFO UltimaLive.RazorUtility - Importing UltimaLive Razor tab into Razor
INFO UltimaLive.AuxMapData - Initializing Map Data
INFO UltimaLive.RazorUtility - Initializing OSI Map Slots:
INFO UltimaLive.RazorUtility - Registering Packet Handlers:
INFO UltimaLive.RazorUtility -              Client To Server  OnClientPacketDropReq
INFO UltimaLive.RazorUtility -              Server To Client  OnServerPacketWorldItem
INFO UltimaLive.RazorUtility -              Server To Client  OnServerPacketLoginConfirm
INFO UltimaLive.RazorUtility -              Server To Client  OnServerPacketMobileUpdate
INFO UltimaLive.RazorUtility -              Server To Client  OnServerPacketMovementRej
INFO UltimaLive.RazorUtility -              Server To Client  OnServerPacketAcceptMovement
INFO UltimaLive.RazorUtility -              Server To Client  OnServerPacketDragEffect
INFO UltimaLive.RazorUtility -              Server To Client  OnServerPacketReceiveUltimaLiveCommand
INFO UltimaLive.RazorUtility -              Server To Client  OnServerPacketReceiveLandUpdate
INFO UltimaLive.RazorUtility -              Server To Client  OnClientPacketAccountLoginRequest
INFO UltimaLive.RazorUtility -              Server To Client  OnServerPacketPlaySound
INFO UltimaLive.RazorUtility -              Server To Client  OnServerPacketLoginComplete
INFO UltimaLive.RazorUtility -              Client To Server  OnClientPacketTargetResponse
INFO UltimaLive.RazorUtility -              Server To Client  OnServerPacketMobileMoving
INFO UltimaLive.RazorUtility -              Server To Client  OnServerPacketMobileIncoming
INFO UltimaLive.RazorUtility -              Server To Client  OnServerQuestPointer
INFO UltimaLive.RazorUtility -              Server To Client  OnServerPacketGenericCommand
INFO UltimaLive.RazorUtility -              Server To Client  OnServerPacketHuedEffect
INFO UltimaLive.RazorUtility -              Server To Client  OnServerParticleEffect
INFO UltimaLive.RazorUtility -              Server To Client  OnServerSAPacketWorldItem
INFO UltimaLive.MapManager - Client sent account Login Request
INFO UltimaLive.MapManager - Received 6 Map Definitions
INFO UltimaLive.MapManager - PACKET: MobileUpdate
ERROR UltimaLive.MapManager - Failed to convert PseudoPoint
INFO UltimaLive.MapManager - PACKET: MobileUpdate
ERROR UltimaLive.MapManager - Failed to convert PseudoPoint
INFO UltimaLive.MapManager - PACKET: MobileUpdate
ERROR UltimaLive.MapManager - Failed to convert PseudoPoint
INFO UltimaLive.MapManager - PACKET: Mobile Incoming
ERROR UltimaLive.MapManager - Failed to convert PseudoPoint
INFO UltimaLive.MapManager - PACKET: MobileUpdate
ERROR UltimaLive.MapManager - Failed to convert PseudoPoint
INFO UltimaLive.MapManager - PACKET: Mobile Incoming
ERROR UltimaLive.MapManager - Failed to convert PseudoPoint
INFO UltimaLive.MapManager - PACKET: Login Complete
INFO UltimaLive.MapManager - Received Ultima Live Login Complete Command, loading map
ERROR UltimaLive.Client - Received Check CRC for map 32, but its not active

I forgot to mention that I use Windows 7 64bit, do you know of any issues with x64 architecture?
I see in the logfile that map32 it's not active, do I need to patch some other file in the server in order to activate new map?

Edit:

The previous problem is fully resolved as the mod now seems to be able to find map addresses, and to switch to a new custom map (I forgot to re-enable the map definition line in MapRegistry, dumb me! :().

I noticed that when the custom map is missing from client files the mod creates necessary files with the size of the map stored on the server. If I shutdown the server and change the map with another one bigger in size, when I restart my client the mod does not notice this size change and throw a list of out of range errors.
I think it's not really an issue, because this can be handled simply by manually deleting the affected files from the client installation directory, but it would be nice to have a command that could make the server to resend map size and then reset/resize the map files on the client. :)

I'm here waiting for any new improvements you will make to this exceptional mod :D

Edit2:

Ok Praxiiz don't hate me please! :p

Now that map switching works, but adding/deleting statics with [addstatic [delstatic crash the server with a null reference exception. I debugged it until I found that for some strange reason MapRegistry::Configure is called by the server AFTER MapChangeTracker::Configure so the hashtable array m_StaticsChanges it's not filles at all because MapRegistry.Definitions has no entries.

I suspect that it's a threading issue but I'll investigate further in order to solve it.

Edit3:

Ok, I've done it! It was an ordering issue. You only need to decorate affected Configure methods with CallPriority Attribute like following examples.

In MapChangeTracker.cs file:
Code:
// Add this with an integer number where the lower values are the highest priority
[CallPriorityAttribute(Int32.MaxValue)]
public static void Configure()
{
    ....

and in MapRegistry.cs:
Code:
// Add this with an integer number where the lower values are the highest priority
[CallPriorityAttribute(Int32.MaxValue - 1)]
 
public static void Configure()
{
    ....
so that the server compiler run MapRegistry::Configure always before MapChangeTracker::Configure().

I hope it helps! :D
 
Top