Hello !

Has anyone given a try to MyRunUO ?

I have activated it on my shard. After struggling with database configuration, ODBC drivers and MySQL Workbench .... it finally works ! :)
Although, when it comes to display the Paperdolls correctly, all the characters are "naked", which means one can't see the items they wear.

I've searched the forums about such problems... there was one on RunUO forums (but the thread is locked now), and @Voxpire was publishing a version of his Paperdoll.php. So I tried it, but I'm stuck at the same point : all characters displayed have no clothes, items, etc.

But : when I activate the DEBUG option of Voxpire's script, I can see that there is a problem with the "wearable" flag.
Has the flag changed (again ...) ?
I'm using client 7.0.34.6 ...
I have tried 0x00400000 ... and 0x404002 ... none seems to be working.
Checking with an hex editor, it seems to be "0x404002" still ...

Help on this issue would really be appreciated. :)

Thank you,

-Regnak-
 
Keeping my eye keenly on this thread. Surely someone has the answer? :) - I've seen this functional in many places.

Thanks in advance! :)

~Ce Jayce~ (UO Broceliande & The Shire)
 
I can see that there is a problem with the "wearable" flag.
Has the flag changed (again ...) ?
I'm using client 7.0.34.6 ...
-Regnak-

Client 7.0.34.6:
Yes, I believe the flags have changed. I've been hunting for them with no success.
I'm having an issue with "sitting naked with custom clothing".
I think this is also why new custom mounts are invisible.
(body of rider without any mount or just standing with no mount animation)
 
Has anyone figured out how to get this to display? I haven't seen it working on any server that is on an up to date client. Some posts from Voxpire on RunUO basically said that paperdoll.php had to be rewritten to show correctly.

@Voxpire Have you undertaken this task? Or what would it take to get you to undertake this task since it seems you know a bit more about this than most?
 
I still haven't found how to fix this issue ...
But I should say I haven't tried much since my last post. :p

Would it be an issue with UOP files ?
How could we fix it ?
Any idea where to look ?

I'll give it a try again :)
 
I would also love to see MyRunUO working with newer clients. Patching past 7.0.9+ breaks it because, as Voxpire points out in his reply on the post linked below:

The new TileData for clients 7.0.9+ have an extra 4 bytes per entry, the TileFlags data was upgraded from a 32-bit integer to a 64-bit long and the Paperdoll PHP file has not been re-coded for this change.
Unless someone updates it for the data extension, it will never support client files for versions over 7.0.9


Perhaps we can figure it out together.

Here is work I've done previously on this:

http://www.runuo.com/community/thre...ysql-for-linux-mono-and-windows-runuo.505519/
 
Last edited:
Yeah, I still haven't found the logic in the new Tiledata.mul ...

I think the issue lies in the new structure of the file. The FSEEK function is returning weird values, which seem picked from random spots.

And I have made some tests with 64-bits long, and it seems to work (both with Voxpire's new method or by converting them manually ... A workaround found on Google ;-) )

I think there are news blocks and stuff, and it's not easy to determine them.

But we'll get there !
 
I'm definitely interested in updating MyRunUO. It seems due for a rewrite. Why not call the replacement MyServUO? I've been playing around with tiledata.mul and have not been able to figure out the past 7.0.9x version. I could not get Voxpire's code to work with any version, but have been making progress with the original. Anyone have anything new to share with regard to MyRunUO?
 
I was working on something using the art api, even added paperdoll functionality to the system but never got to finish it.

Functionality is still in the api though.

This is what the endpoint expects: <BodyHue>:<Isfemale>,<ItemID>:<Hue>,<ItemID>:<Hue>,<ItemID>:<Hue>,<ItemID>:<Hue>,......

An example of this is:
Code:
http://services.servuo.com/uoapi/paperdoll?gear=1003:false,50434:849,50543:0,50480:1711,50544:0,50542:0,50546:0,50545:0,50984:0,50560:0,

Which will result in aservices_servuo_com_uoapi_paperdoll_47221d3642a1d849a201139b7e5e9472._.png
 
Are you successfully reading gumps from post 7.0.9.x muls? If so, would you mind sharing your code? Thanks!
 
Thanks Voxpire,

I had to make some changes to field names, and also added a MUL_PATH constant for the file path.

The muls were created using a newly compiled LegacyMulConverter from: https://code.google.com/archive/p/runuo/downloads

i.e.: LegacyMULCL.exe -x "C:\Program Files (x86)\Electronic Arts\Ultima Online Classic"

Here is a demo of the original paperdoll.php using the older AOS mul files, above your version using the latest mul files.

http://www.clutch.net/myservuo/players.php

The config file has a read only login to my test database.

Your paperdoll.php does not seem to be working. Here is an output from the debug log:

Code:
Initializing Database...
Done!
Initializing Character...
Query Database: SELECT * FROM myservuo_characters WHERE char_id='2221'
Done!
Initializing Mul files...
Done!
Removing Guild Strings...
Done!
Setting Body Index...
Index: 12 * Female: 0
Done!
Setting BodyHue...
BodyHue: 33357 * Gump: 1
Done!
Set Dimesions: W:266 H:285
Initializing Items...
Query Database: SELECT * FROM myservuo_characters_layers WHERE char_id='2221' ORDER BY layer_id
Found Item - Parsing...
Item ID: 12227 * Layer: 0 * Hue: 707
Found Item - Parsing...
Item ID: 12228 * Layer: 1 * Hue: 0
Found Item - Parsing...
Item ID: 12232 * Layer: 2 * Hue: 707
Found Item - Parsing...
Item ID: 12229 * Layer: 3 * Hue: 707
Found Item - Parsing...
Item ID: 12231 * Layer: 4 * Hue: 707
Found Item - Parsing...
Item ID: 12230 * Layer: 5 * Hue: 707
Found Item - Parsing...
Item ID: 11573 * Layer: 6 * Hue: 0
Found Item - Parsing...
Item ID: 5201 * Layer: 7 * Hue: 0
Insert Items into Variables...
Index-> 12,12227,12228,12232,12229,12231,12230,11573,5201
Female-> 0,0,0,0,0,0,0,0,0
Gump-> 1,0,0,0,0,0,0,0,0
Hue-> 33357,707,0,707,707,707,707,0,0
Done!
Building The Gump...
Verifying Mul Files:
TileData: Resource id #3
Hues: Resource id #2
Gump: Resource id #4
Gump Index: Resource id #5
Done!
Parsing Values...
Done!
Parsing Each Item...
Index: 12 * Female: 0 * Hue: 33357 * Gump: 1
Load The Raw Gump...
Index: 12227 * Female: 0 * Hue: 707 * Gump: 0
Flags Say NOT WEARABLE, move to next Item...
Index: 12228 * Female: 0 * Hue: 0 * Gump: 0
Flags Say NOT WEARABLE, move to next Item...
Index: 12232 * Female: 0 * Hue: 707 * Gump: 0
Flags Say NOT WEARABLE, move to next Item...
Index: 12229 * Female: 0 * Hue: 707 * Gump: 0
Flags Say NOT WEARABLE, move to next Item...
Index: 12231 * Female: 0 * Hue: 707 * Gump: 0
Flags Say NOT WEARABLE, move to next Item...
Index: 12230 * Female: 0 * Hue: 707 * Gump: 0
Flags Say NOT WEARABLE, move to next Item...
Index: 11573 * Female: 0 * Hue: 0 * Gump: 0
Flags Say NOT WEARABLE, move to next Item...
Index: 5201 * Female: 0 * Hue: 0 * Gump: 0
Flags Say NOT WEARABLE, move to next Item...
 

Attachments

  • vorspire_v2.zip
    6 KB · Views: 23
I've been working at this for a few hours without success. This is on running with php 7.1.

The gumps for the clothing layers are not being read from the file and I can't get it to return anything other than "0." Everything is not wearable.

Code:
array(4) { ["char1"]=> int(-112) ["char2"]=> int(-36) ["char3"]=> int(15) ["char4"]=> int(0) } array(4) { ["char1"]=> int(-112) ["char2"]=> int(-36) ["char3"]=> int(15) ["char4"]=> int(0) } array(4) { ["char1"]=> int(8) ["char2"]=> int(84) ["char3"]=> int(0) ["char4"]=> int(0) } array(4) { ["char1"]=> int(8) ["char2"]=> int(84) ["char3"]=> int(0) ["char4"]=> int(0) } array(4) { ["char1"]=> int(-19) ["char2"]=> int(0) ["char3"]=> int(4) ["char4"]=> int(1) } array(4) { ["char1"]=> int(-19) ["char2"]=> int(0) ["char3"]=> int(4) ["char4"]=> int(1) } array(8) { ["char1"]=> int(0) ["char2"]=> int(0) ["char3"]=> int(0) ["char4"]=> int(0) ["char5"]=> int(0) ["char6"]=> int(0) ["char7"]=> int(0) ["char8"]=> int(0) } array(8) { ["char1"]=> int(0) ["char2"]=> int(0) ["char3"]=> int(0) ["char4"]=> int(0) ["char5"]=> int(0) ["char6"]=> int(0) ["char7"]=> int(0) ["char8"]=> int(0) } array(8) { ["char1"]=> int(0) ["char2"]=> int(0) ["char3"]=> int(2) ["char4"]=> int(64) ["char5"]=> int(64) ["char6"]=> int(4) ["char7"]=> int(2) ["char8"]=> int(1) } array(8) { ["char1"]=> int(0) ["char2"]=> int(0) ["char3"]=> int(2) ["char4"]=> int(64) ["char5"]=> int(64) ["char6"]=> int(4) ["char7"]=> int(2) ["char8"]=> int(1) } array(8) { ["char1"]=> int(0) ["char2"]=> int(0) ["char3"]=> int(0) ["char4"]=> int(8) ["char5"]=> int(0) ["char6"]=> int(0) ["char7"]=> int(3) ["char8"]=> int(0) } array(8) { ["char1"]=> int(0) ["char2"]=> int(0) ["char3"]=> int(0) ["char4"]=> int(8) ["char5"]=> int(0) ["char6"]=> int(0) ["char7"]=> int(3) ["char8"]=> int(0) } array(8) { ["char1"]=> int(64) ["char2"]=> int(64) ["char3"]=> int(4) ["char4"]=> int(9) ["char5"]=> int(1) ["char6"]=> int(46) ["char7"]=> int(0) ["char8"]=> int(0) } array(8) { ["char1"]=> int(64) ["char2"]=> int(64) ["char3"]=> int(4) ["char4"]=> int(9) ["char5"]=> int(1) ["char6"]=> int(46) ["char7"]=> int(0) ["char8"]=> int(0) } array(8) { ["char1"]=> int(64) ["char2"]=> int(64) ["char3"]=> int(0) ["char4"]=> int(3) ["char5"]=> int(2) ["char6"]=> int(38) ["char7"]=> int(0) ["char8"]=> int(0) } array(8) { ["char1"]=> int(64) ["char2"]=> int(64) ["char3"]=> int(0) ["char4"]=> int(3) ["char5"]=> int(2) ["char6"]=> int(38) ["char7"]=> int(0) ["char8"]=> int(0) } array(8) { ["char1"]=> int(2) ["char2"]=> int(64) ["char3"]=> int(68) ["char4"]=> int(0) ["char5"]=> int(1) ["char6"]=> int(14) ["char7"]=> int(0) ["char8"]=> int(0) } array(8) { ["char1"]=> int(2) ["char2"]=> int(64) ["char3"]=> int(68) ["char4"]=> int(0) ["char5"]=> int(1) ["char6"]=> int(14) ["char7"]=> int(0) ["char8"]=> int(0) } array(8) { ["char1"]=> int(0) ["char2"]=> int(0) ["char3"]=> int(2) ["char4"]=> int(64) ["char5"]=> int(64) ["char6"]=> int(0) ["char7"]=> int(7) ["char8"]=> int(13) } array(8) { ["char1"]=> int(0) ["char2"]=> int(0) ["char3"]=> int(2) ["char4"]=> int(64) ["char5"]=> int(64) ["char6"]=> int(0) ["char7"]=> int(7) ["char8"]=> int(13) } array(8) { ["char1"]=> int(0) ["char2"]=> int(0) ["char3"]=> int(0) ["char4"]=> int(0) ["char5"]=> int(0) ["char6"]=> int(0) ["char7"]=> int(0) ["char8"]=> int(0) } array(8) { ["char1"]=> int(0) ["char2"]=> int(0) ["char3"]=> int(0) ["char4"]=> int(0) ["char5"]=> int(0) ["char6"]=> int(0) ["char7"]=> int(0) ["char8"]=> int(0) } array(8) { ["char1"]=> int(2) ["char2"]=> int(0) ["char3"]=> int(64) ["char4"]=> int(0) ["char5"]=> int(0) ["char6"]=> int(11) ["char7"]=> int(0) ["char8"]=> int(0) } array(8) { ["char1"]=> int(2) ["char2"]=> int(0) ["char3"]=> int(64) ["char4"]=> int(0) ["char5"]=> int(0) ["char6"]=> int(11) ["char7"]=> int(0) ["char8"]=> int(0) } Initializing Database...
Done!
Initializing Character...
Query Database: SELECT * FROM myrunuo_characters WHERE char_id='18431'
Done!
Initializing Mul files...
Done!
Removing Guild Strings...
Done!
Setting Body Index...
Index: 12 * Female: 0
Done!
Setting BodyHue...
BodyHue: 33788 * Gump: 1
Done!
Set Dimesions: W:266 H:285
Initializing Items...
Query Database: SELECT * FROM myrunuo_characters_layers WHERE char_id='18431' ORDER BY layer_id
Found Item - Parsing...
Item ID: 5397 * Layer: 0 * Hue: 2418
Found Item - Parsing...
Item ID: 5104 * Layer: 1 * Hue: 0
Found Item - Parsing...
Item ID: 5905 * Layer: 2 * Hue: 1864
Found Item - Parsing...
Item ID: 5102 * Layer: 3 * Hue: 0
Found Item - Parsing...
Item ID: 5100 * Layer: 4 * Hue: 0
Found Item - Parsing...
Item ID: 7939 * Layer: 5 * Hue: 2418
Found Item - Parsing...
Item ID: 5042 * Layer: 6 * Hue: 0
Found Item - Parsing...
Item ID: 8267 * Layer: 7 * Hue: 1126
Found Item - Parsing...
Item ID: 8261 * Layer: 8 * Hue: 1126
Insert Items into Variables...
Index-> 12,5397,5104,5905,5102,5100,7939,5042,8267,8261
Female-> 0,0,0,0,0,0,0,0,0,0
Gump-> 1,0,0,0,0,0,0,0,0,0
Hue-> 33788,2418,0,1864,0,0,2418,0,1126,1126
Done!
Building The Gump...
Verifying Mul Files:
TileData: Resource id #7
Hues: Resource id #6
Gump: Resource id #8
Gump Index: Resource id #9
Done!
Parsing Values...
Done!
Parsing Each Item...
Index: 12 * Female: 0 * Hue: 33788 * Gump: 1
Load The Raw Gump...
Get Value From GumpIndex: returned ...
Get Value From GumpIndex: returned ...
Get Value From GumpIndex: returned ...
Index: 5397 * Female: 0 * Hue: 2418 * Gump: 0
Get Value From TileData: returned ...
Flags Say NOT WEARABLE, move to next Item...
Index: 5104 * Female: 0 * Hue: 0 * Gump: 0
Get Value From TileData: returned ...
Flags Say NOT WEARABLE, move to next Item...
Index: 5905 * Female: 0 * Hue: 1864 * Gump: 0
Get Value From TileData: returned ...
Flags Say NOT WEARABLE, move to next Item...
Index: 5102 * Female: 0 * Hue: 0 * Gump: 0
Get Value From TileData: returned ...
Flags Say NOT WEARABLE, move to next Item...
Index: 5100 * Female: 0 * Hue: 0 * Gump: 0
Get Value From TileData: returned ...
Flags Say NOT WEARABLE, move to next Item...
Index: 7939 * Female: 0 * Hue: 2418 * Gump: 0
Get Value From TileData: returned ...
Flags Say NOT WEARABLE, move to next Item...
Index: 5042 * Female: 0 * Hue: 0 * Gump: 0
Get Value From TileData: returned ...
Flags Say NOT WEARABLE, move to next Item...
Index: 8267 * Female: 0 * Hue: 1126 * Gump: 0
Get Value From TileData: returned ...
Flags Say NOT WEARABLE, move to next Item...
Index: 8261 * Female: 0 * Hue: 1126 * Gump: 0
Get Value From TileData: returned ...
Flags Say NOT WEARABLE, move to next Item...
[doublepost=1482030219][/doublepost]
I was working on something using the art api...

My struggle right now seems to be with getting image data out of mul files from the current client. I am able to use mul files from before patch 7.0.9x, but can't seem to figure out how to do it with the latest muls.

I've found a clue on reddit, with a post by Voxpire:
https://www.reddit.com/r/ultimaonli..._assistance_with_myrunuo_paperdoll_generator/

Code:
 $flags = read_big_to_little_endian($tiledata, 8);

Code:
function read_big_to_little_endian($file, $length)
{
  if (($val = fread($file, $length)) == FALSE)
    return -1;

  switch($length)
  {
    case 8: $val = unpack('q', $val); break;
	case 4: $val = unpack('l', $val); break;
    case 2: $val = unpack('s', $val); break;
    case 1: $val = unpack('c', $val); break;
    default: $val = unpack('l*', $val); return $val;
  }
  return ($val[1]);
}

If anyone knows to do this, would appreciate some guidance.
 
I'm a little rusty with PHP binary operations, it's possible that unpack()'s arguments have changed since writing the script.

PHP's support for 64-bit integers is lacking and isn't the same across all builds, so we probably have to do some magic here, since the FLAGS are 64-bit in the latest TileData file...

  • a - NUL-padded string
  • A - SPACE-padded string
  • h - Hex string, low nibble first
  • H - Hex string, high nibble first
  • c - signed char
  • C - unsigned char
  • s - signed short (always 16 bit, machine byte order)
  • S - unsigned short (always 16 bit, machine byte order)
  • n - unsigned short (always 16 bit, big endian byte order)
  • v - unsigned short (always 16 bit, little endian byte order)
  • i - signed integer (machine dependent size and byte order)
  • I - unsigned integer (machine dependent size and byte order)
  • l - signed long (always 32 bit, machine byte order)
  • L - unsigned long (always 32 bit, machine byte order)
  • N - unsigned long (always 32 bit, big endian byte order)
  • V - unsigned long (always 32 bit, little endian byte order)
  • f - float (machine dependent size and representation)
  • d - double (machine dependent size and representation)
  • x - NUL byte
  • X - Back up one byte
  • Z - NUL-padded string
  • @ - NUL-fill to absolute position

This is a best guess, but try this mod:

Code:
    case 8: $val = unpack('V2', $val); break; // if V2 doesn't work, try d (doubles are usually 8-bytes)
    case 4: $val = unpack('V', $val); break;
    case 2: $val = unpack('v', $val); break;
    case 1: $val = unpack('c', $val); break;
    default: $val = unpack('c*', $val); return $val;
 
Back