Open lamo2k123 opened 7 years ago
@lamo2k123 do you think it is better to get JSON map data & tile data with REST API or through websockets?
Example:
If you need to get tile IDs at (x, y), you call up GET /map?x=123&y=123
. Response is JSON. Good because async, but bad because of new connection needed.
With the websocket, you send {"type": "map", "data": {"x": 123, "y": 123}}
to websocket. Websocket responds with JSON string. Good because single persistent connection.
Websocket
tile texture gives the server? or server gives texture id?
Both.
GET /land?id=168
: PNG of landGET /static?id=1
: PNG of staticGET /map...
or websocket: JSON of map data, looks like this:Example map request at (1, 1):
[{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5},{"ID":168,"Z":-5}]
Right now, returns the 8x8 block (http://wpdev.sourceforge.net/docs/formats/csharp/maps.html)
Need to clean up response, so it is easier to use and read
png gives the game server?
Yes... The game server runs the image and data server.
The image/data server runs through ServUO. It can run independently too though.
I thought that all the static is stored in the client.
It is, but it would make more sense to have a server that can serve images for the game client.
Trying to move the images to the client would add too much complexity and wouldn't be as efficient.
Hmmm....
Static content is over 1GB, so the client would need to download it every load.
The server can send images as needed... so many smaller requests vs one big request...
how much more work on this task?
I'll try getting something up tonight after work :)
Here's an example of the map data:
http://107.161.24.129:2590/map?y=500&x=500
I can't get images working. It looks like Mono/libgdiplus doesn't support ARGB1555, which is needed for Ultima.dll to get images. 😞
Right now, everything is written in C#. In the future, I want to use nodejs OR nodejs+node-gyp+libpng or something.
😞
I'm updating Ultima.dll to use ARGB8888 instead of ARGB1555 later tonight, so we should be able to get images working.
I also need to update it so it returns a 32x32 square instead of a 44x44 rectangle... That way we use a texture in THREE and just map the image directly without the need for rotations. - this probably can't be done...
Loads with ARGB8888 👍
http://107.161.24.129:2590/land?id=4 http://107.161.24.129:2590/land?id=168
@lamo2k123 - should I wait for you to finish the refactoring before starting implementing the graphics?
Mmm... Use branch 'refactoring'.
Hmm.. Origin client size textures 64x64 and 128x128. And rotate 0
In 'refactoring', I npm installed history
, hook-redux
, and react-router-async
.
Any other packages needed?
In console:
[HMR] Waiting for update signal from WDS... index.js:111 Object {length: 2, action: "POP", location: Object} core.js:97 action @ 20:12:34.197 @@router/START_TRANSITION (in 0.20 ms) index.js:291 Uncaught (in promise) TypeError: route.action is not a function at Router.
(index.js:291) at step (index.js:40) at Object.next (index.js:21) at fulfilled (index.js:12) (anonymous) @ index.js:291 step @ index.js:40 (anonymous) @ index.js:21 fulfilled @ index.js:12 client?8505:38 [WDS] Hot Module Replacement enabled. client?8505:38 [WDS] Warnings while compiling.
I'll commit today with corrections
Sweet, thank you. :)
Have you used https://www.npmjs.com/package/request before?
I need to grab JSON and wondering if this is good to install or not. Could also just use XMLHttpRequest too.
Use the 'window.fetch'
which package contains data on the location of the character on the map?
I think it is either packet 0x1B or packet 0x20:
https://github.com/kevinhikaruevans/uojs2/blob/master/src/client/state/player/actions.js#L34
https://github.com/kevinhikaruevans/uojs2/blob/master/src/client/state/player/actions.js#L54
http://107.161.24.129:2590/map?y=3503&x=2574 here are the coordinates I got
there mapId need?
it's using blocks, so you'll need to do 3503/8 = 437, 2574/8 = 321, so you'll get:
http://107.161.24.129:2590/map?y=437&x=321
There is a map ID but I need to implement it still. Right now, it's using Felucca.
We'll probably need to create a system to detect as the player moves, preload each map block when they move near it.
8x8 block small :(((
Yeah, block is too small, so we'll have to load multiple blocks at once.
I'm trying to import THREE: https://github.com/kevinhikaruevans/uojs2/compare/refactoring...refactoring-map-additions
but import * as THREE from 'three'
doesn't seem to work. Any ideas? 😕
Do you commit the res server for me to hook up on my vps? :)
In ServUO's Scripts directory:
Then in Data/Assemblies.cfg, I'm including these:
Newtonsoft.Json.dll
websocket-sharp.dll
(you'll need to download the binary dlls)
You might be able to run it as a standalone application (it has a Main function) but you'll need to compile it.
It's just easier to use http://107.161.24.129:2590/ for now, or at least until I can get it as a standalone application in javascript...
And where you can view the source code for parsing files map.mul
I'm using Ultima.dll to do that.
can nodejs to try to parse map file and make the api?
Yeah, but it'll take a long time to do.
I would like to just getting the tiles to rewrite.
It's just a matter of porting over Ultima.dll to nodejs. Should I work on doing that?
I want more convenient and flexible API to obtain data on the surrounding tiles. But we need to understand how to read the map file map (x) .uop
It's being done here: https://github.com/ServUO/ServUO/blob/master/Ultima/TileMatrix.cs#L414
Should I create repo for nodejs port package?
created. I think it will take much time.
Do you have a link for it?
I did not create. you create the repository.?
Ooh, just did:
nice 👍
Should it use uodatareader in server/index.js and send map responses through the websocket? Then we can send map JSON data and stuff through it.
of course yes
I'm working on this now. :)
Right now, I have a script that integrates with servuo and it returns map data, tiledata, and art.