#tooldev-general
1 messages · Page 11 of 1
sending a letter to ggg asking for a "deposit all" button in game would be your best bet
also in the end its up to GGG to decide what is and what isnt against the tos
The best I have is freewheeling your mouse if that's still allowed, or using alternate input methods that hurt less.
damn, alright thanks for the info guys
ill try to think of another loophole if there even is any
Ultimately you're trying to do a lot with one action, regardless of method.
using something like xmouse to rebind shift click to mousewheel down and just waving it around your inventory might help a bit with clicking induced rsi
used to do that to save my wrists when linking items
While it's unfortunate that the game is built in a way that may be harmful, the constraints and justification for the rules is to keep the game fair and to avoid having mandatory third party tools for the gameplay loop.
i guess ill just have to do that then :<
yea ig thats true too
fwiw you might also still want to just use mousewheel down as left click and hold shift manually just to be sure
alright tysm guys

my dreams were crushed today
It's a bit unfortunate that the controller UI isn't hot-switchable, as that has different ergonomic properties.
yeah controller depositing nad looting are so good
if only
Some table differences in 3.24.1 from a 3.24.0b: https://gist.github.com/zao/d6c4e1e2c79814520a9901e112edabf8
Fun fact, one really small youtuber gave me more returning people than 3 posts (90 000 views) on reddit.
is there anything like acquisition still around?
There's some peep that tries to keep it alive and up to date; taking up the mantle of maintainership.
Yeah I've seen but it seems to error out when updating forum shop with selection of tabs
Not sure where they're at with it currently. Most people tend to use web-based tooling like poestack, wealthyexile, the tft bulk tool; or standalone tools like Exilence CE
I guess your best recourse there is probably to file good issues and work towards getting the problem understood and solved.
Yep, was just wondering if there was an alternative for now
dont want to buy stashtabs
let me be one of the first to say I fucking hate the pob redesign on reddit please do not
(I know its totally a mock up not realted to actualy people working on it)
Heh, thought you were upset about the the new runtime 😄
nah I'm upset by clowns with rounded edges
Why am I reading Internet Comments?
Unscrewing the runtime is such a nice vacation from the Cursed Pixel UI Code.
Best tofu outside Japan.
There's a lot of things one could do about the UI - but they all require having a revamped UI library to go with it.
Something webby like flexboxes, tables for everyone, Qt-style expanding controls, Java SWT?
A Figma design isn't worth much if there's no connection to the actual underlying tech - current or future evolution.
That's the kind of UI work we need, co-evolution of platform and UI.
Why is everyone obsessed with whitespace? Who wants to scroll to see all of their items?
It's a reddit post from someone who redesigned it for some reason
I see
Can someone help me contact the pob devs here? Getting an app crash on startup
Have you looked at the issue tracker? Is it a fun hard runtime crash or the usual red-bordered white box that you get inside the tool itself?
Fun hard crash. I have the windows error log crash details if that's helpful. It's in glfw3.dll
There's one other person who reported a similar crash and someone suggested replacing the dll with an older one, which I tried to no avail.
What's weird though is I wasn't having this issue just earlier today and I haven't changed anything.
the primary cause of those was invalid window sizes in the config file, which should be fixed in current releases.
I just uninstalled/reinstalled the latest version
I'm dead tired, but do you have any crash dumps you could share with me in DM?
(they're in %LOCALAPPDATA%\CrashDumps)
Yup will do. Obviously no rush needed on this.
how is wealthyexile's stash resync so damn fast?
Magic, and capping to max 15 to beat rate limits?
20 different oauth tokens
Choose the netlify edge worker nodes in texas
Or Vercel rather
@green rose Where you do you run your edge functions for WE?
Everything for WE runs out of IAD
@exotic egret while we're on the subject, is that the same region where account stash data lives?
The servers that serve the requests are in that region
So iad is probably closest you can get with Vercel 😛
(That's Washington D.C. for others who don't want to look that up)
aka us-east-1 for AWS folks, or us-east4-* for GCP
@velvet foghttps://poedb.tw/us/Unrevealed
Could you please add a menu for "Unrevealed Item"? (Currency, Fragment etc.)
https://www.reddit.com/r/pathofexile/comments/1c1iyp1/new_scarabs_available_on_trading_website_that_are/
I love seeing these unreleased data on poedb. Thank you for running poedb.
I remember one project storing stash tabs, so you can see them by account name. Does anyone know its name?
maaaaybe it was it, sadly it's dead.
What you want to do? Do you only need the ids from current players or you want a bigger history?
@gilded tree i'm basically creating it myself, so for research wanted to see similar projects 🙂
I have the data from active players via the river but deleting them after they go inactive
Ahh okay
do you have something interactable, or just an api?
No, I am not exposing it - just storing it for internal stuff. I could do it for you but if you’re already building it … 😄
all latest tools are more about bulk \trading, and I wanna continue dig deeper into regular items
Awr cool
huh, poedb doesn't seem to have a list of vaal vessel mods
or even like diviner's strongbox mods
only the generic mods
need some vaal vessel mods image to analyse
there's the prefixes, hard to take screenshots without dying, I'll look for one with specific suffixes
on second thought I guess the vessel suffixes are probably hidden
whether they'd even be in the data I don't know
https://www.poewiki.net/wiki/List_of_strongbox_suffix_mods wiki has the divination etc suffixes that I didn't see on poedb
List of suffix modifiers that can appear on Strongboxes.
ru:Список суффиксов ларцов
funny error 😛
"you don't exist, go away"
It's fixed in dev and will be in a future release, some highly competent developer didn't look at what the return value from std::filesystem::remove actually meant 😉
(me)
😄
Interesting that windows doesn't care about swapping the path separator midway through on that one
I'll be normalizing more into all forward slashes going forward, but most APIs don't indeed care.
A slash is a slash is a slash!!!
C:|Users|Bobby Tables|OneDrive|Documents
That is not a slash but I approve of both your use of Bobby Tables and the most heinous of folders, OneDrive
it's the compromise slash
best to be sure by escaping it though \\C\\:\\\\\\|\\U\\s\\e\\r\\s\\\\\\|\\B\\o\\b\\b\\y\\ \\T\\a\\b\\l\\e\\s\\\\\\O\\n\\e\\D\\r\\i\\v\\e\\\\\\|D\\o\\c\\u\\m\\e\\n\\t\\s
hey guys, is there a difference between
base_strength_and_intelligence and additional_strength_and_intelligence?
eg this is a additional_strength_and_intelligence
and it simply adds to the str, int stats
Haven't seen those particular stats before, but they remind me of how they recently redid projectiles.
im probably gonna hardcode it, but is there somewhere data describing what does the Eramir quest do? (in case it changes, rather use data than hardcoded behaviour)
Data/QuestStaticRewards.dat
I would guess for Omniscience it does not work with the base stats
Hello guyz , please i feel so bad , i connect my account to the mainsite , but now when i start the game on steam i have no onne caracter .... i dont know how to get back my main account .... please help 😦
Contact support@grindinggear.com, we do community tools here. It's a common mistake to make and they have routines to fix it for you.
Does anyone know how poeDB localizes all of the content on the site to other languages? People have been asking me to localize WealthyExile, so was wondering how poeDB localized the content. @velvet fog 🙏
Has anyone set up PoE OAuth with next-auth, and if so, are willing to give any pointers?
In the Data/ directory, such as Data/Russian/, the file structure is the same as that in Data/, but the text will be localized text.
Basically, this is what I have for now. It... mostly works. But on the callback Next auth is expecting the userinfo endpoint (which GGG doesn't have/I don't need) - so I get some cryptic error message.
Hmm... Maybe I'm missing the code_challenge, but it seems to work without...
I dont use nextAuth, I just do everything by hand :/
I heard bad things about nextAuth so never tried it out
Yeah it's not... optimal, was just hoping I could get an MVP out the door because it's one of the more requested features right now
by hand too, it's easy
Yea I'm going to switch to doing it by hand
thank you for the reply. So I assume none of the other sites localize stuff items (poeninja) because GGG's stash api doesnt support it, wheres parsing the files is easy because its all right there on disk
GGG's stash api support multi lang
👀 how
https://www.pathofexile.com/account/view-stash ? you can use https://ru.pathofexile.com/account/view-stash for russian lang
Path of Exile is a free online-only action RPG under development by Grinding Gear Games in New Zealand.
im talking about this API: https://www.pathofexile.com/developer/docs/reference#stashes
or oauth2 stash api? should be worked the same way too
try https://ru.pathofexile.com/api/stash/<league>
also looking at my code you need state and code challenge params
nextauth generates state automatically, but i do indeed need the challenge params
my base url is this: https://api.pathofexile.com
not poe.com/api
When trying to call .com/api I get a 401
Okay, I got the OAuth working. Is there now an easy way for me to match the items in the stash tab API to items. Specifically I'm looking to map corpses.
Also - how can I avoid getting ratelimied to oblivion when fetching stash tabs? I need to find all the tabs where there are corpses.
I'm guessing I have to map item id -> name via game files?
That it has bad design + docs? Or something else?
The problem with NextAuth is that a lot of things don't work well with App routers
Which is... a problem with Next.js itself
(App router was a mistake, at least the way it's implemented now)
just hard to use
yea app router sucks
you are going to get rate limited hard, because you cant automatically find the coffins in their tabs
yup noticed
jesus the rate limits are rough
hmm might just make a dropdown where they can select which tabs to load from
I am using it in plenty of apps with svelte and it works quite alright, the library design is imo. their biggest drawback which makes it hard to use as you said. Lucia is a good alternative, but can't talk about their react implementation.
how does sudos import your stash?
i dont see the UI anywhere I might be blind
no clue
i'm not a huge fan of sudos ui
that's why i made my own tool 
seems to be in the shopping list on the right
I was a bit surprised to see a reasonably small tab limit (15?) for WealthyExile, but it's probably for the better 😄
@green rose how come the server costs for WE is >= 500 per month?
because I have 100k users
Should still be scaleable for less
But I see you're getting it covered from Patreon so doesn't -really- matter
of course, vercel just gouges you on server costs
Yeah facts
I'm running the graveyard planner on Vercel for now, but might migrate it if it keeps scaling
just need to think about time to market vs cost
yup for sure
vercel allowed me to ship very quickly, so id say it was worth it for me
exactly the same for me
allowed me to just focus on the code not the infra
down the line worth moving to a cheap droplet somewhere tho
Yea theres always time to optimize down the road, which ive basically been spending the past 2 weeks doing
I'm happy I don't have users for things like Inya. Would scale abysmally given that it has all data on HDDs.
Pobbin is chilling
Although it's workload is also like nothing
I still want to setup some Gigantic data hoarder of all things poe with a nice searchable api, so many ideas which ultimately nobody needs and no one has time for
LFG as CSS enthusiast:
Maybe your hideout tool would have millions!
Silently breaks for ancient releases that predate DAT64, but hey.
Of course, as soon as I published, I realize that it doesn't quite catch all changes like changes to columns of primitive type in the fixed area.
Future zao's problem.
Are there any web libraries available to render sockets based on input?
eg
Sockets: W-W-W-W
I could write something myself, but if someone has something already: even better
@green rose The site has the most informative graphs if it's been like ten days since you last checked your wealth 😄
Both me and my mate was wondering where the graph had gone on loading the site, as it was missing completely until doing an overdue sync ^_^
I tried to make dat-meta export the keys for BaseItemTypes and ItemVisualIdentity per release so that one could tell in which release an ID was added or removed.
"oops, 500 megs of JSON"
A more reasonable approach is probably to transpose the problem and accumulate additions/removals chronologically per-file. Imagine thinking before doing something 😛
Another follow-up to the previous: What is the up to date version of extracting base types along with their corresponding images from the game files, or any other place? I see eg. poe.ninja leads to poecdn. It wouldn't be beneath me to scrape poe.ninja for the information (sorry @fickle yew), but I'd also like to actually generate it myself.
I was going to say something, but I see IV_IS is typing 
base items are at https://lvlvllvlvllvlvl.github.io/RePoE/base_items.json, and the art is at the same path as the .visual_identity.dds_file https://lvlvllvlvllvlvl.github.io/RePoE/Art/2DItems/Rings/
Some peeps use the public stash river and trade to get kosher links to the CDN, cool peeps use the maintained RePoE, some pull some information off the wiki, some krangle DAT tables and data file assets themselves.
An upside of the CDN is that you get precomposed art for things like maps, flasks, transfigured skill gems, etc.
(also the wiki, as we do our own composition there)
the code for how repoe does it is at https://github.com/lvlvllvlvllvlvl/RePoE/blob/master/RePoE/parser/modules/base_items.py. idk how to get cdn links.
trans gems are a whole other thing since they're just variations of the same base type
Ah sick 👀 Thanks!
I just need base-mirror-able items so not really needing flasks/gems
But this helps a ton, thanks!
hmm guess i need to make a mapper that maps Blizzard Crown <-> HelmetStrIntRitual1
shouldn't Blizzard crown be DexIntRitual3?
BaseItemTypes.dat has all the info you need in it
I found a way to generate the CDN links
https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvQXJtb3Vycy9IZWxtZXRzL0hlbG1ldERleEludFIiLCJ3IjoyLCJoIjoyLCJzY2FsZSI6MX1d/9da7af13c1/HelmetDexIntR.png this is blizzard crown, the long string in the middle is just base64 decoded to this: [25,14,{"f":"2DItems/Armours/Helmets/HelmetDexIntR","w":2,"h":2,"scale":1}]
So seems... simple enough
Unsure what the 25 and 14 means
w h seems to correspond to inventory_width and inventory_height from the data export
The problem is /9da7af13c1/ which is an opaque hash intended to prevent speculative construction and possibly also for cache busting.
25 and 14 indicate the type of thing it describes, one of them may be the "domain".
The contents of the base64 path segment varies across item types, where item types like maps and flasks have their own fields.
Ugh, gotcha
So probably the easiest is just to download the images I need and host them myself
Realistically I won't need more than like 50-ish items
That's probably the most pragmatic way.
It's fun to do build something like RePoE or do custom data extraction, but at some point there's the actual thing you're trying to build.
Yeah I'm not trying to reinvent the wheel, this is literally just going to be used to display a certain number of base items on a webpage for a mirror shop
So a) because it's a mirror shop we're limited to most of the "best" base-types b) it's a very specific usecase, no need to overengineer
Some day I should add the ability to indicate the desired content-type and file extension for Inya URLs, one has to rename something like this explicitly to .dds: https://inya.zao.se/poe-data/cad/3ba412dc45c9811565d53437e137cadd9d3db9816f7326ddea966467d0647d82
On the other hand, that might lead to more hotlinks >_>
(that's HelmetDexIntR.dds)
I wonder if anyone has made a DDS converter in WASM; I wrote my own BC5 decoder from spec for the wiki before finding Compressonator.
There's https://github.com/remixer-dec/dds.wasm which turns a DDS image into a data url you could use for the src attribute of an img tag
Judging by the linked library, it only does legacy formats like DXT1-5, not BC7 that PoE does since Heist.
Ah, fair
I didn't look too deeply into it
Why does DDS require something like webassembly anyway?
Is it too complicated of a format to performantly decode in pure JS? (Or too complicated to justify writing a new decoder for?)
You probably could, but it's a lot of bit-twiddling.
I see
Would you want to use something like this to display the files directly on your website?
Yeah. If you had some site build process and your own hosting, you'd convert them offline.
I might play around with some Rust stuff for this, wanted to mess around with webassembly anyway
I think someone made a Rust lib, so could just compile that to wasm
If you wanted to build say a model viewer that pulled all data from elsewhere, it'd be more fun if you could process the original files yourself.
ye, I was looking at https://crates.io/crates/image_dds
That one doesn't work iirc
Interesting
I tried that and had to use image Magick
The DDS ecosystem in general is miserable as a lot of them are implemented in the dark ages and never got around doing the newer formats.
I'm not seeing any direct dependency on image magick for it
Ah nvm maybe thinking of something else this looks different
Yeah I've only ever seen DDS used in games for some reason
Back then I tried all that added support for the image crate
Maybe I can finally get rid of Magick
I use GLI (for DDS file scaffolding) and AMD Compressonator's cmp_core for decompression in pydds.
Compressonator is very embeddable C or HLSL for everything.
(I accidentally said BC5 above, PoE is BC7)
The original purpose was pretty much metadata around GPU surface formats for DirectDraw; as there was (and are) extremely few good container formats around somewhat opaque graphics data intended for GPU consumption.
It's the AVI of textures 😛
You squint at the headers, then throw slabs of it into texture memory.
The compressed texture formats are typically not decompressed CPU-side; they're in block compressed formats intended for use by the GPU's texture units natively.
GGG re-encoded pretty much all of their assets using lossless source materials from using DXT1-5 to BC7 when they revised their engine for Heist.
The block compression there is pretty much having small tiles of 4x4 or so, defining a subset of the colours and expressing the rest of the tile in terms of those; using clever patterns.
As each tile (block) is individually encoded, the GPU can random-access decode any block to evaluate one or all the texels it covers.
As the files are just compressed at a fixed ratio compared to raw colour data; you typically put another (format-aware) layer of compression for data at rest on top of it; in the case of Path of Exile it's RAD's Oodle suite of file compression.
They also have cool stuff like a texture compressor that searches for BC7 coefficients in a way that the resulting texture is more compressible with Oodle than if you optimized solely for perceptual metrics.
Graphics is such a wild topic
As someone who has mainly worked with "backend-y" stuff and some webdev, all these optimizations sound like black magic to me
BC7 is fairly straightforward to decompress as it's typically implemented in hardware units. Meanwhile formats like that are a big task with heuristics to compress as the search space grows with the complexity of the format.
Ericsson invented some format (ATSC?) for mobiles that was super expressive, but turbo-hell to write a good compressor for.
There's a lot to nerd down into for sure in all fields.
I feel like for webdev the only thing to nerd out about is how many js frameworks you can list off the top of your head /s
I read up on the itty bitty details of this as I implemented a whole BC7 decoder for pydds and general PoE tooling before finding Compressonator 😄
The last one I used, if you can call it a framework still, was jQuery in 2008-2011 😛
hi guys, i need some "ModTypeID" and their "Name". is it possible? for example;
{"ID":"4113","ModTypeID":"254","Name":"Plentiful","Code":"FlaskExtraCharges2__","Level":"22","ModDomainsID":"2","ModGenerationTypeID":"1","ModFamilyList":["FlaskNumCharges"],"WeightList":["600"],"DropChance":600,"str"
@worthy cape as I'm not knowledgeable about how these images are handled internally, this is my result of going DDS->PNG in-browser with some rudimentary Rust/WASM
Is it supposed to have a black background or am I losing the alpha channel somewhere
interesting. Going for WebP instead fixed it
Seems to be hitting 640kb for the full bundle right now
actual performance seems to be kinda weird? Looking at ~15ms to load that image
idk if 640kb is much in frontend land
No idea at all about that kind of stuff either, but I assume/hope it's cached.
Nice job, regardless.
Yeah, after the image is loaded once it seems to be cached in some way; takes ~2ms every time I hit the button past the first load
It really wasn't much, just wrapping an existing library in some wasm boilerplate. Maybe 20 lines of actual Rust code
The frontend/JS portion was way more horrendous
theres no official json for the atlas itself right?
With map connections and whatnot? Nah, that's only in DAT tables.
Thanks, now I want to play Elite: Dangerous again.
Atlas: Dangerous
what does this represent?
represent?
like, where are you pulling the extra 3rd axis out of? and what does it mean?
oh I gave all maps a Z value, they dont have one
ah, so it's just a random Z?
the atlas is more than it seems 😉
One fun thing you can pull out of the DAT tables are the controls points for the connecting splines.
I could try and update my data extractor to pull that out
lemme check
any idea which dat's it's in?
I would assume AtlasNode.
Looks like GGG's api stopped letting you request from localhost cc @exotic egret
well, the coordinates are there
I think you could guess from the numbers which one they are and label the columns
how do you reference which 2 nodes the control point is for
that will be for you to figure out I think
@covert perch ok, extracted both AtlasNode and AtlasNodeDefinition as both might be interesting to you. https://github.com/Vilsol/go-pob-data/tree/main/data/3.24/raw
you can get them via:
- https://go-pob-data.pages.dev/data/3.24/raw/AtlasNode.json.gz
- https://go-pob-data.pages.dev/data/3.24/raw/AtlasNodeDefinition.json.gz
just pass them through gzip and then you get the raw json data
amazing thank you so much
ping me if you manage to get anything useful out of them, and if you manage to figure out the names of those VarXX fields, you can contribute them here: https://github.com/poe-tool-dev/dat-schema/blob/main/dat-schema/_Core.gql#L455-L489
oof
Are pieces of the UI as images accesible anywhere?
Everything needed for the tree is in the export, everything else in the game files. Your best bet is RePoE atm for them
The UI framing itself is in sprite sheets, indeed by art/uiimages1.txt
Just want to say that I fixed this before the patch, but missed the cut-off. So expect to see that get fixed at some point
blame Scopey, got it
there's truly some egregious spelling errors hiding in the deep dark depths of the data files... btw if you ever need someone to maintain a PoE dictionary so you can actually spell-check your code, i'm your man. https://github.com/Nightblade/pob-dict (shameless plug)
I've had a theory that the reason the updated Merveil model hasn't made it into the game is because it's spelled Merviel and no one can find it.
I'd like to point out that some tables changed shape from 3.24.1 to 3.24.2: https://pale-court.github.io/dat-scope/?from=14077440&to=14147059
a table with +-delta number would be much better
"patches welcome" 😉
Quick hack to get it more expressive than the manual diffs I ran before, I could probably pivot it better.
build system: no
framework: no
jQuery: Not even.
the data is there and I'm looking at shipping a hash next shape revision version too.
toss in some picocss 😉

why poe trade stopped showing mods and price search with them
@desert panther https://snosme.github.io/awakened-poe-trade/no-item-mods.html
What stash tab holds scarabs
Hi, everybody
I'm trying to find any documentation for POE trading platform api, but the only API that I found is https://www.pathofexile.com/developer/docs/reference and there is nothing there about how to interact with the trading platform.
Does anyone know where I can find a Trading Platform API documentation with API request and Models.
Can anybody help me with that?
There's nothing official for it, you can do your queries and check how the browser does send requests but that's it. Alternatively you can look at awakened trade or other tools and check how they did it
Do you mean Awakened POE Trade GitHub?
The trade API is of those weird beings that people can look at the queries and imitate them based on their own stat choices and weights; it wasn't really intended to be too machine-driven and the most reasonable way to interact with it is to submit the occasional user-initiated query like is being done with tools like Awakened PoE Trade "Price check" and Path of Building's "Trade for this item" and "Find timeless jewel" functionalities.
For more encompassing market information the good way to go is still to consume the public stash API ("the river").
Note that you can also get some amount of economy information from poe.ninja, but their API much like the official trade one can change over time as well.
I'm not certain what you're asking. Is there a tool that you believe should support something it doesn't?
If it's game feature requests, they don't go here.
My psychic debugging hat tells me that it's probably about the spelling of the currency tags for bulk listing in the game and the trade help page.
More Defense Modifiers -
more-defense-modifiers-coffin
Rarer Defence Modifiers -rarer-defence-modifiers-coffin
@compact isle There's a bit of an inconsistency here in wording, yay for English.
Also, the atlas tree JSON has flipped orbit arcs for the three small Scarab masteries in the inner circle of the tree (screens show game vs. website):
They're an amorphous crew manning the cannons, with Novynn being the historical primary point of contact.
Ah, it was Novynn
For some reason I thought Novynn was mainly doing work on the atlas tree stuff
Probably having a chill weekend night atm 🙂
There's so many typos and mistakes in everything in the data files; I'm not at all surprised that this got mixed up.
Slightly annoying to fix probably, as there's historical listings for the wrong wording, both in stashes and built into tools by now.
Referer
Mhm
"we were going to make Necropolis core but we could get rid of a typo if we didn't"
Don't give GGG any ideas
I just took a closer look at my atlas tree there, the web tree doesn't show all the allocated nodes nor the line connectors leading up to the groups.
Maybe Novynn was feeling a bit more American when he added more defense modifiers
🐔 👋 Hey guys. Is there an API for guild stash?
I guess, there is only stash history with POESSID
Indeed, there's the stash history with pagination that you can pull down and collect to keep track of any excess removals or other policies you'd like to enforce.
There's no guild stash API in the public documentation.
I wrote stash-snitch to build a local database of past stash transaction history to make it easier to query, there's probably alternatives there as well.
If you're looking to build something a bit more like poestack or wealthyexile or a group-oriented tool for stash valuation or introspection, there's nothing.
So I'm looking at DAT-files and was wondering if someone could me give me a quick rundown of how these files are structured.
My understanding so far is that the first 4 bytes is the amount of rows, then a "fixed-sized table" follows, after that a "magic seperator" (\xBB\xBB\xBB\xBB\xBB\xBB) and after that a "variable-sized table". From scrolling through some old github repositories the format of the "variable-sized table" seems to be not self-descriptive, but the fixed-size table is?
uint32 entry_size;
variableSized data_table: // row_size=(pos(magic_seperator)-4)/entry_size
char[8] magic_seperator; //0xBB
variableSized append_table;
you can get data_table schema at https://github.com/poe-tool-dev/dat-schema
@worthy cape I've been looking into model viewing for some of the POE objects, I noticed you had done most of the work on the original model viewer but that work seems to have gone out of date. I was wondering if you had any writeups on the subject?
The core model file formats are fairly stable over time, only some minor changes ever since they adopted the same internal mLOD geometry.
The challenges are still primarily on the material side of things as you kind of need to compile the material graphs yourself according to the same rules that the engine does. A lot of the visuals are represented in parameters and values of the graphs, the textures are only part of the picture.
I assume you mean poedb's viewer or something? I've got my own DX11 one that somewhat works, but thats not public.
No real write-ups past what I have for my parsers, they're not of much use for anyone who aren't going down the full path like I was.
I spent most of the recent research on terrain tile metadata, and the bulk of my time on PoB's engine these days.
I am talking about poedb's viewer. I think I'm* going pretty far down the path, and also focusing on terrain metadata. Knowing the general shape of some of the newer models would be pretty useful.
The big crux of the material compiler is that it builds fragments of HLSL based on an ever growing set of text nodes in the game data files, all PC (and console) shaders are built from that single HLSL source.
This means for the web, you need a runtime that can either do shaders that are transpiled from at least DX11-era HLSL or do some huge work in emulating the shader graph semantics.
I went for DX11 generation verbatim, was the least horrible choice for me as I'm standalone with the hideout editor.
I'm a bit reluctant to publish too much information as most consumers are cheaters, asset rippers and modders, things I don't want to encourage.
I understand completely, and you'd have no reason to trust my motives no matter what I tell you. Knowing now that a lot of the work is with vertex shaders (something I've barely wet my toes with) I'll probably have to focus on other things. Would it be okay to request 2d renders of 3d objects? I dont really need to rip any assets, just know what they look like. Im looking into fishing and other secrets' possibilities.
The stages of the materials essentially hook into different places of the larger VS and PS flows, going from vertex input, skinning and transformation, vertex output, to all aspects of shading like sampling textures and doing the whole lighting process, contributing to the different material aspects like metalness, emissiveness, albedo, etc.
At the core of it a lot of models are fairly boring, but some do some rather cute tricks in there, like how the Delirium mirror morphs and orients toward the player, and how some materials are raymarched.
For fishing purposes with tikiheme, I've mostly converted meshes to glTF for preview in common tools. That misses out on all materials and transforms but tend to give a good idea of what you have.
Im actually going down the same road tikihime did then, now. I saw your glTF exports of the fishcatcher and the possible ship. Those wireframe renders are what I'm trying to recreate, but including a few more models.
Would you be willing to do more glTF exports if I put together a small list of objects?
Not sure what the state of that repo is now, but quite busy today.
Of course, I wouldnt want to do it right away either, but if its something we can arrange I'd like give others in the community a chance to include objects I might not be thinking about too.
I'd have to see if the code is salvageable at all.
I don't think I even changed it over to Inya yet for file access.
No worries, Ill hang around here on this discord and if you have the time feel free to DM me. If I don't hear from you I'll assume its too much of a hastle and move on. Sound good?
Poke me later if I forget, in a bit of flux lately.
I also have a working model viewer that can export in different formats, including glTF. The materials rendering is much less advanced than zao's though. But I may be able to help if needed.
Here's the fishcatcher model, if this is what you're referring to?
Rendering terrain still needs some work. But it can handle most other things.
Activate Windows 
It used to be activated but I had to replace my motherboard and a couple other components, and now it doesn't recognise it as the same computer. And I don't feel like buying a new license.
Other than the annoying message in the corner it doesn't really make a difference.
Oh yeah, and I can't change my desktop background. But I never look at that anyway, lol.
There's definitely some value in squinting past the actual graphs and duct-taping on the raw textures 
Yeah, I basically just grab the texture files and do my best to map them to the texture types glTF uses.
My first model I translated for real by hand was Tāne - not the easiest one 😄
Copper metallic suit, emissive glows, lots of glass, many little parameters to shift values here and there.
There's a few models, but yes that is the fishcatcher in question. A few models Im personally interested in are the blacksmith golem, the extinguish pillar (not sure if this has a model associated, but it does have a rig), and the foresttown frozen models (including the fishcatcher you posted).
Yeah, this is about the best I can do at the moment.
The best I can do at the moment:
You just want them exported to glTF?
I mean, screenshots work too, but glTF would be best.
Okay. Give me a few minutes and I'll pm you.
I've looked at some of the Lost Ark models out of curiosity, and I'm always impressed at how high-poly they are. The newer stuff in POE isn't too far behind though.
LA Slayer vs. POE King in the Mists:
bet the PoE2 models are pretty nice
I'm guessing the newer stuff in POE is the same quality we'll see in POE 2. I think the first Sanctum mini boss (the candle guy) is an area boss in POE 2?
Though I think Jonathan did say that even the earlier stuff made for POE 2 is no longer up to the quality of the newer stuff, so they had to replace some of it.
Sisyphean models.
Yup.
Makes sense since the first ones were probably made with the intention of still being in the same game as poe1
Hmm, I'd explain it a bit differently. Data files aren't really self-describing at all; they're constructed with the assumption that the application consuming them knows the structure of the data it's loading. (In fact, I'm fairly certain the rows get loaded directly into memory, with pointers fixed up at load time.) The content in rows ("fixed-size table") follows a fixed structure for each row, and some of the fields in those rows can reference data outside the row data (strings, arrays, etc). There's no enforced structure on that "variable data", but the process of packing the table ends up placing data there in a mostly linear fashion which can be used to guess at the structure.
If you're just getting started with a parser, a few files I'd recommend using as test cases are:
ExperienceLevels.dat- super simple, just a few integersVoteType.dat,Tips.dat,Tags.dat- introducing stringsAscendancy.dat- introducing arraysRealms.dat,NPCAudio.dat- arrays of strings
Thanks, that makes sense to me.
Quite a nifty way actually.
From the recent GDG talk, their visual table design tool directly generates C++ code which pretty much overlays a row struct on the fixed data section of the table; with members that are either primitive data or perform any indirection into the varying section or referencing other tables.
Much like formats like protobuf, you don't have any inline metadata. It's all implied by the loading code being in sync with the saving code.
;o interesting that this was revealed
Very interesting. Is this talk available to watch somewhere?
Ah, found it: https://www.youtube.com/watch?v=mYry9Vl_Hh8
In this talk, Jonathan Rogers from Grinding Gear Games takes us to a brief look into the Path of Exile game engine; What challenges were faced, and how you can make one yourself (now in 4K)
🎮 Who is the Game Developer Guild? 🎮
The Game Developer Guild is Auckland University’s club dedicated to physical and digital game development. The Gu...
hello. This is my first time leaving a message. If there are any mistakes, please be generous and correct them.
Is there an official API that provides information about the passive skill tree in JSON format using the following URL? ↓↓↓
https://www.pathofexile.com/api/trade/data/items
I already saw that document. Basically, the information on github only shows English data, so I asked just in case. Thanks for your answer!
In the craftofexile graveyard calculator; I tried an item with -2 Explicits for the best way to get only 1 specific mod (a prefix) and got a chance of close to 30%. the I tried adding a suffix to the requirements and let it make the best selection again and the chance went up to almost 36%. So I'm wondering if this is about something I don't know how the calculation should work or if i'm missinterpretating the numbers or what is happening here? Edit: tried just putting all suffixes in the condition and it went down to 5%
Anyone know if there is a repository of item pngs? I could scrape them from the wiki but that sounds extremely tedious
This is amazing
which language are you after? You can generally get the same information as the github links on the live page themselves by viewing their source
@civic crane your dat viewer has competition https://youtu.be/mYry9Vl_Hh8?t=1528
In this talk, Jonathan Rogers from Grinding Gear Games takes us to a brief look into the Path of Exile game engine; What challenges were faced, and how you can make one yourself (now in 4K)
🎮 Who is the Game Developer Guild? 🎮
The Game Developer Guild is Auckland University’s club dedicated to physical and digital game development. The Gu...
pretty sure me and everyone else has analyzed this vid 3years ago 😄
would like to see more leaks in next ep
Looking forward to the next infodump.
aw ok
I've got the Twitch VoD for that video, might be slightly higher quality than the YouTube version.
Larger at least.
I wonder what tools they've made up since last time, has there been any cool tech announced since Exilecon'23?
I got baited/encouraged into working on the Hideout Editor again last week.
I feel a side quest coming up, where I am "just" to add a websocket snout to Inya to bulk download assets without exhausting TCP ports.
I can't get connection reuse for HTTP(S) to work well, not even without Cloudflare.
Had the bright idea to instead of shipping a hundred megs of JSON for each manifest index, I ship a sqlite3 database.
I've got 111 GiB of those now.
At least it's faster than parsing JSON, I think.
try some binary storage method e.g. msgpack or flatbuffers
literally rewrote my pob web thing on top of msgpack because they are smaller and parse faster
im storing msgpack inside sqlite 
please no
I kind of want a storage method that is both OK for download and also could be used for lookups both in C++, Pythong and weirdo webpages.
I still want to have a big index that crosses all releases that I can query, but I don't seem to be able to tease the RDBMS to respond within reasonable time on queries; the DB indices are larger than my RAM by far.
My desktop tool actually pulls down the NDJSON, shotguns the parse across all cores for like 10-15 CPU-seconds and generates a bespoke "binary manifest" it dumps to persistent disk cache.
Easier to invent a custom format than wire up existing s11n to C++.
Hey, Im trying to parse items for a personal project, but just noticed that flask implicits are not denoted in the game. Is there a way around this , without having to write custom logic for flasks specifically?
if by implicits you mean flask buffs, then yeah you will need custom logic
in APT i just skip section that contains them https://github.com/SnosMe/awakened-poe-trade/blob/master/renderer/src/parser/Parser.ts#L672-L673
Web stash viewer for standard remove-only scarab tabs needs some love 😉
What do you mean it looks fine to me
Has anyone studied poe patching protocol version 6? After version 5, encryption/compression is added, which feels a bit like Oodle, but it cannot be solved correctly.
@neon plume @civic crane Interestingly enough, I'm now looking at using size-prefixed msgpack as the fundamental message unit of my WebSocket protocol.
I was fooled up-front about how WS was all "message-oriented" and all, which turns out to have been a filthy lie and it's more like an un-framed stream with extra steps.
I'm going to make so many mistakes in designing this, I wonder if I can version this kind of protocol meaningfully or just throw everything away every once in a while 😉
Size-prefixed with a fixed-size integer I can read before each message as there's very few, if any, msgpack parsers that can incrementally consume a stream and only bite off the amount they need for one message.
I assumed that I could use the message concept in WS as the implicit framing for my msgpack messages, but it seems like many runtimes are very keen on merging/splitting them fairly arbitrarily, so I probably need my own additional framing.
Maybe even go full pants-on-head with [total-size][header-size][msgpack header][raw trailer] to avoid having to wrap large binary payloads, but I'm probably incurring enough copies already that it doesn't matter.
I can't say I've seen Oodle used anywhere but in Bundles2 thus far.
Why not protobuf?
if you're already going binary and effectively msgpack with extra steps
it's encryption/compression
Not super keen on wrangling protocol files around, and I'm not sure how well it will deal with said partial payloads and bulk data either.
wait so what are you even making?
I see. My thought was that protocol files would help explicitly document the format, but I understand not wanting to handle them too
A service talking websockets (or something), to which you can ask for downloads of individual data files (in chunks) to be streamed down in-band, and also ask about file listings for particular releases or across releases.
yeah websockets are message oriented, I'd like to read/try one day https://rsocket.io/ which is stream-first.
My current scheme is "here's a few hundred megs of NDJSON" for file listings and "HTTP GET" for individual file downloads doesn't scale well.
oh and I'm stroing protobuff in sqlite, not msgpack 😄
What about WebRTC?
The problem I've gathered from the interwebs is that you can't really trust message boundaries to stay intact across runtimes, so I can't use that for framing alone.
that should give you a stream, no?
any particular reason you went with WS rather than GRPC?
ah wait, webrtc is for p2p stuff
it's a stream of messages, best of both
Apart from really not liking Google tech and how it seems a bit overkill with arbitrary RPC? Not much.
mm
I have very little idea what I'm doing here and would like to get something minimally functioning here so I can get to the actual stuff I want to do.
very fair
afaik the Go lib I use can do arbitrary reading
1s
Core problem - I run out of HTTP ports on the client when requesting too many files in sequence, even with all the connection reuse I can muster.
Wild solution - don't do that, pipeline yourself in some persistent connection.
I'd speak plain TCP if I could, but web clients don't do that.
is this so you can stream resources as needed into something like a model viewer?
can you use QUIC?
yeah, I literally just read out the element count, and then loop over reading each message, you can make the input reader read from WS instead of byte buffer, and voila: https://github.com/Vilsol/go-pob-data/blob/main/loader/raw_loader.go#L68
Pretty much, for the hideout editor, model viewer, interactive Python format exploration.
Clients are likely going to be standalone non-async Python programs, C++, maybe browser JS.
I've got a large local cache of file contents, but sometimes I touch older releases and need to bulk populate stuff.
iirc websockets are message based but you don't have control over the size of the underlying messages? I believe it just splits them and adds a marker to the header to signify it isn't the end of the current "message" yet
I've read through the WS spec ages ago and partially implemented it once but don't quite remember anymore
I didn't quite follow all the discussion around it, there's both messages and frames, but it seems like messages may not quite be the same size end-to-end.
a message is made up of frames
There's also arbitrary implementation limits on message sizes.
yuck
did you try having some sort of request buffering, where you debounce requests up to 1ms with a limit of like 10 or whatever, and then request 10 assets at once from the server?
Of course all the research I did yesterday is lost to the mists of time as my browser history doesn't want to play ball.
As far as I can tell, I use the client libraries correctly but they seem extremely reluctant to reuse anything, both with cpr/curl in C++ and requests in Python.
could you do some sort of long polling?
In C++ land I've got a system of bulk requests that grab hundreds if not thousands of files together.
well, no, this wouldn't be actual connection reuse
and just keep a HTTP request going effectively forever while streaming the response?
There's not even cloudflare in the way when stripping it down, just plain non-TLS nginx + fastapi.
but instead of firing off a request for an asset as soon as you need it, you wait 1ms for any more requests to come in, and then send off all in a single request
The current API only has endpoints for a single file, not sure how a request and response for multiple files would look in in HTTP.
so does it currently return the raw file as is?
Do you want to download files over more than one connection? What about creating a "download session" which you can add arbitrary files to with some sort of session token and then ask to download all of them at once (invalidating the session in the process)
if so, you have 2 options, either use something like json and then base64 the data, or invent your own binary format, where you send [size][data][size][data] up until however many resources client requested
if a requested thing doesn't exist, size is 0
or, actually, you are using msgpack now, right?
One problem with mutilating this simple interface is that it makes it harder to hand-drive it from JS or the command line.
then literally do this
I don't use any msgpack yet, that was the plan for the WS application protocol.
well, msgpack isn't required really for this
as long as you just length-prefix all data
(or pull an unreal engine and do length-prefix-null-terminated because why not)
In the WS protocol I've got some latent wishes to be able to cancel downloads; which is why I went for something more chunked that would let me stop sending chunks once told so from the client.
Say that I pick a release in the model viewer, decide that I don't want it but it has already queued up a gigabyte of files; being able to cancel those and start on the next correct choice would be helpful.
you can always cancel an HTTP request
literally just close the connection
just make sure you handle the case that the output stream gets closed on the server and you don't write to it
Might be possible, but I'm still vary of exhausting client ports.
you can also gate how many connections you make from client
It's really annoying to not understand why it's so reluctant to do the right thing, as it completely stalls out all connection initiation on the system for minutes until timeouts release.
e.g. only allow 10 parallel requests
each pulling 100 assets or something
use a semaphore or something for that
That whole bulk system fits extremely poorly into the architecture of things, especially when you've got piecemeal loading that by definition can't be batched.
wdym?
Obtain and parse a DGR to find the TSI, parse the TSI to find the RS, the set of ARM, TDT, etc.
By its very nature, you've got single file request chains as you need the previous file to know what to do next.
right, but you have multiple "initial" files, right?
so that's why you buffer by time
Sometimes. Depends on how much I can work on at a time as processing them can take significant memory.
basically, think of a clock that ticks every 1ms or every 10ms
I've got like three different file acquisition strategies in poe-cpp, and a lot of the code runs in the poorest.
when it strikes, you fire off all asset requests, and return to their requestors
I can't really stall most of the types of requests, all it'd do would be to incur an additional penalty for those ladders of files.
And as I mentioned, I can't really go too wide on processing.
you aren't really stalling them though, 1ms isn't that much, and also, when you send off the request, you can make sure to sort it so requests that expect more data to be revealed get placed first in the request
this doesn't require anything that you can't do on any system
The current strategies are "just get a file", "get all these files, notifying on a queue when results come in", "stream a set of correlated requests, dispatching them as it goes".
The first can't leverage any batching, the second one would be mapped to a streaming solution but would take a fair bit of work to do so, the final one is a right mess and mostly built around caching decompressed bundles.
(memory is a bit vague as I've spent a few months improving the data ingestion system and only now getting back to finally doing format work again)
You can still use all these strategies, but then on top of them all, they all call to an abstracted away HTTP client, which buffers those requests and handles routing
Can't share any relevant code as the codebase isn't public.
y no public huh?
I think you underestimate just how cursed this codebase is 😄
oh I can imagine
I've hit this exact issue, and I solved it the exact way I described 😆
The same reason why I stopped documenting a lot of file formats in poe-doc, the primary consumers are ill-doers.
mmmm
kinda painful that ill-intended people cause the closure/privatization of open projects
privatization might be the wrong word
could turn it into invite-only org or smth?
would still have to vet everyone you give access to it
which is lots of organizational work
I also had some historical desire to not expose directly how I obtained all the game files for it.
I used to run Inya on my home internet and even now when it's on a dedicated server, it's just two spinning harddrives on gigabit.
Inya?
The name for the described data delivery system - gets you any game file from any release, poorly.
haha
god now I really want to work on go-pob again but I don't have time
😦
although at this point I'd make a huge rewrite of the frontend, as currently it's a pain to use
What's go-pob about? Rewriting pob in Go? Go bindings to make use of pob's existing calculations?
In any way, thanks for the ideas and feedback, got some stuff to ponder now.
complete rewrite of PoB in Go, with a browser frontend
interesting
browser frontend as in compiled to wasm, or hosting a local server that is opened in your browser?
compiled to WASM
that sounds fun
even worse, the WASM runs in an Async Worker, to not block the rendering thread
but this means that whenever I want to release as a desktop app, I just have to change the compilation target
if only I knew any sort of Go haha
I mean technically you could also just slap it all into something like electron or tauri
or is wails the equivalent to tauri for go?
this
I see
fuck electron
I am not opposed to Rust, but I just can't get efficient with it
Oh god I just found out that there's nightly builds of GHC that let you compile Haskell to wasm
it constantly stands in my way
now I have to figure out how to do stupid GUI stuff with that
oh god haskell
hahaha
if that already makes you go "oh god", back during sentinel I made an all-prolog web-app for filtering items with extractable anoints
why in the fuck would you ever pick prolog for that
I am scared of your definition of fun
nowadays you can compile SWIPL to wasm so that probably makes it a bit easier
I think at least the backend is rather elegant
https://github.com/MagnificentPako/Derrick/blob/master/derrick.pl
actual frontend, not so much https://github.com/MagnificentPako/Derrick/blob/master/static/app.pl
You can be quite fast, you just have to know some "tricks". For prototyping you can e.g. clone everything and refactor later.
There are a couple of talks / videos about this, just look for something like "easy rust".
https://www.youtube.com/watch?v=33FG6O3qejM
It sadly takes a bit of time... yeah. I am mainly a Go dev so I totally feel you 😄
Rust is often considered a hard to learn language. And sure enough, on just about every topic you can go arbitrarily deep and find new and fascinating things about how computers and/or math work. Also if you write code most of the community deems 'good', you'll invariably run into some hard topics, like ownership and lifetimes, async internals...
I've written a few projects in Rust, so I'm not completely rusty, but sometimes I do hit the occasional error, that no god or anime character can help me with, so I just start poking at random shit, and for whatever reason, some unrelated thing, in a different file, I add or remove clone, send, or something else, and it just fixes everything
although I think I've had to deal with the worst of the worst in that case, e.g. writing a thing that translates GRPC, HTTP and D-Bus calls into hardware network configuration and other physical shit on an embedded device.... that was the first thing I ever had to write in Rust... in the hell of async, single-core runtimes, and other weird quirks when you start colliding with the virtual and physical world, you just start to hate everything within your arms reach, and NGL I was tempted to throw the device at a wall on a few too many occasions... the only thing stopping me was the safety deposit on the apartment
single threaded executor makes some stuff actually easier (no Send/Sync requirements) :p
was it using embassy?
hahaaa I wish, but because this thing had to handle async shit, and requests coming out of nowhere, everything had to "somehow" run concurrently
although once I learned enough tokio it was not awful
You either love or hate async
it was using whatever I wrote it to use, but not embassy
still leaves you with no Send and Sync requirements, aka you can use a RefCell instead of a mutex (which works on embedded)
wait tokio on embedded?
the box was running a stripped down Linux with very few modules and weird limitations that I stopped to question when I realized it's running a release from 7 years ago
okay I think we have a different definition of embedded
aight, I was thinking no kernel embedded
nah, this was for an industrial manufacturer that wanted remote control and monitoring over their robotic arms and shit
funnily enough, their own developers at first told me "oh, all our shit runs in JS, please write this in JS as well", I told them that won't happen unless your thing has a GB of memory (which they had 128MB of), but their dumbass PM insisted, so at first I wrote the project in both JS and Rust until they realized that the box is OOM'ing anytime they make a request to the JS server
the main takeaway you need to realize from that, is that there are factories out there, where the robotic arms are controlled with JS...
....which apparently all run on embedded devices that are on the brink of running out of heap space
this thing looks interesting though, might dig out my stock of microcontrollers and try something with it
using it to automate an irrigation system now, ended up spending most of the time building an axum clone for embedded ... actually building/flashing the esp32 was a lot less time
tldr embassy is cool
but hey, now I have an axum framework with fully implemented extractors and state completely allocation and std free ...
seems interesting, but why on earth would you want to run an HTTP server on an esp32?
so I can talk to it 8)
just open raw TCP socket and scream 5head
That’s not that rare
https://github.com/Dav1dde/low-profile - the actual http logic in that thing is pretty slim
not sure, might replace it with mqttt at some point, but that was a neat project and enough to get me going, device just needs to get a request and set a pin to high for N seconds
That's peak rust code here https://github.com/Dav1dde/low-profile/blob/master/src/handler.rs#L113-L154
yeah that sounds like absurd overkill to run an HTTP server for
it is, but kinda nice to just test stuff with curl
yeah ig
can always just cat pipe into netcat
I've actually considered writing an ultra lightweight HTTP server designed around only no-body no-header requests, basically reads first line and yells back the response
but surprisingly it's not that simple
I need to rework the header handling to make it lazy, but then that's pretty much that
currently just allocates space for N headers on the stack, but ideally it would be lazy
Using JS to test this was a mistake, but hey:
looks good, is this with the request buffering?
WebSocket messages with MsgPack inside, taking file request messages and sending back a stream of response messages with parts of the file in each.
Chunking to ~256k, which ought to be conservative enough for any language consuming it.
Stalls a fair bit on larger files, but works in theory. Still don't handle compressed files nor failure.
Gonna treat this as domain exploration, see how it ends up looking.
I'm not 100% sure how anything persistently connected like this will work in a synchronous tool like a Jupyter notebook, that I'm not sure can be made async much.
Unironically maybe consider https://livebook.dev instead
Automate code & data workflows with interactive notebooks
Elixir and in extension Erlang/BEAM might be a very nice platform
Cute idea, but the goal here is to use languages that I somewhat know to do somewhat interactive bulk format exploration, prototyping parsers for the real project.
l added schemas to RePoE, and validate the output data against them with pydantic. apologies if that broke anything anyone was using (in theory it shouldn't have, since the schemas were generated from the existing data, but l've already found and fixed a couple of issues)
Deleting your client log has no effect on the game, right? Mine's grown quite large and I wanted to do some experimentation with the stuff the game logs without always having to load hundreds of MB
Correct, it's just for your personal use, and maybe support.
You can delete or move it away when the game isn't running.
Great, thanks
Wanted to update mapwatch to work with t17 maps but noticed its an elm app inside electron, on top of some botched together JS for data extraction so I might as well spend the time that'd go into untangling this on building something from the ground up 
I feel your pain, I'm currently trying to add some dependencies (websocketpp, msgpack11) to the hideout editor and am not sure which one of the scripts and files actually does that 😄
Do you happen to have a link to, er, I believe it was called PoE RE? iirc PyPoE isn't maintained anymore and I assume I'll have to dump some voiceline transcriptions to properly track stuff
This IV_IS fork is the current and awesome one.
There's non-awesome ones?
The wiki has an active fork of PyPoE, maintained by among others IV_IS.
Their RePoE builds on top of that.
ahhh
It's easy to end up on brather1ng's original RePoE otherwise, which is stale since 3.18-3.19 or so.
I searched for the wrong name so found nothing except for an old PyPoE repo haha
Whenever we lost 32-bit DAT files and tooling rotted a bit.
Was the format changed so significantly that people didn't bother maintaining tools anymore?
A lot of tools that touched tables used 32-bit DATs since the dawn of time and had their specs built around those field sizes.
The migration isn't that rough, but you still need to sort some things out like new sizes for foreign and internal references, lists, strings, integers.
It was easy to accidentally have the wrong type for fields you didn't look at before, throwing the row width off as you went.
In brather1ng's case, they had stopped playing a few leagues before and were willing to merge in patches if someone contributed them.
At that point in time I fixed up the wiki's fork as we were an active project and took a stab at basing RePoE off that codebase; but didn't want to commit to maintaining yet another project.
IV_IS took up the cape for both PyPoE and RePoE later on.
I mostly poke at my own tools, PoB's runtime and UI rendering research now.
When using the Ninja API, is there a way to retrieve information for multiple items you want to search for at once?
For example, is it possible to fetch data for items like Headhunter, Mageblood, and Mirror in a single request?
@fervent idol yes, but it will be pure economy data without item icons etc #tooldev-general message
Checked it.
But I only want to get data for some items
For example, just to see syndicate unique
Cane of Kulemak, The Devouring Diadem, Cinderswallow Urn ...more
Is it possible to filter?
I ended up replacing my WebSocket+MessagePack homebrewn janky RPC with actual gRPC.
I'm a bit disappointed, it works way too well and I feel robbed of the chance to rant and hackfix.
The saving grace is probably the pain of integrating it into the C++ build for the Hideout Editor platform, as GENie has innovative ideas about custom build tasks and how gRPC links to a bajillion individual little libraries.
I guess that this technically probably rules out web clients unless I set up some sort of gRPC gateway, but web users can use the old HTTPS API.
There's nothing worse than having nothing to complain about.
Hi !
A few days ago I started receiving public stashes from service:psapi. But they are very old.
It looks like the league will end faster than I start getting the first stashes from it 🙂
Maybe some of you still have an next_change_id closer to the beginning of the Necropolis league?
Thanks !
if you want a current id https://poe.ninja/stats
somebody else might have a necropolis id for you
The last one is not very interesting, I will probably miss most of the positions on the market and never know them
By the way, I don’t fully understand when a player appears online - are his stashes updated or not? If they are updated, then the last ID suits me..
Stash tabs are published after a modification, either when players change zones or when enough time passes. The psapi river will not contain old versions of a stash tab, only the change ID that has the current state of the stash tab at the time will contain the tab; past occurences will have placeholders.
If you want to see things listed from the start of the league, you need to start at the ID correpsonding to that timepoint and sweep forward, eventually catching up.
If you only care about stash tab contents from now onward, you can start from the current ID at https://www.pathofexile.com/api/trade/data/change-ids.
Whenever a single item in a stash tab changes, the whole tab is published.
If say someone prices a tab at the start of the league and doesn't touch it afterward, it won't be published again.
And oh, the river is on a delay compared to the game and the trade site, around five minutes.
Thank you !
Ah, you're the fella in my DMs on the PoE website, nice to see you found your way here yourself 
first change id for necropolis:
2344539017-2329312315-2255196571-2500537352-2429799140
Looks like there's options? https://github.com/grpc/grpc-web
I've also seen some stuff in regards to webassembly
The core problem around web gRPC is (at least historically) that it's hard if not impossible to get hold of crucial parts of the HTTP/2 requests and responses in a browser for gRPC, particularly trailers.
A common approach is some sort of janky "gateway" that translates it to something weirder.
Ah, seems like "grpc-web" tries to codify that kind of gateway weirdness by implementing it in proxies like Envoy.
And it doesn't do client streaming nor bi-directional streaming; which is a bit of a bummer.
Would work for my current use case, but still icky.
Does anyone have a rough estimate for how many requests to the stash API you need to make per second to keep up with the stream (assuming start of the league). I have been averaging 2.6 seconds per request over 4.5hrs (This average includes transforming the data and saving it to a database)
May I ask why you are synchronously processing the data? Couldn't you fetch as fast as you can and then process afterwards/on the side?
I am doing bigger batches before I start processing the data, but I havent optimized around batch sizes yet.
Back when the servers were overloaded many leagues ago I was pushing something like 2/s at 5 MiB/s.
I recommend that you leverage the header that gets you the next change ID so you can pipeline requests better, if you're not right up against the rate limit you might be losing ground.
(X-Next-Change-Id according to chat history)
Yes I discovered that one recently but after I had made my script, might speed things up. Currently I am doing some filtering with async requests going to avoid keeping too much unnecessary data in memory. I might try to add another layer of batches before filtering.
How do people know what time a next change ID was generated? I assume they are generated at a dynamic pace, so the time between two IDs can vary widely. Or is there something I am simply not getting? I haven't seen anyone mention it. Simply keeping up with the stream works for current data, but I'm mostly interested in data from around league start
There's no known fixed timeframe for them, the only documentation you have around pacing is:
If the stashes array is empty then you have reached the end of the stream. Polling this endpoint with the same
next_change_idwill then return new results once they become available
Each section in the ID corresponds to some sort of sharding each number is non-decreasing.
If you want to work on historical data, you need an old ID to start from or start further back and look for signs that you're in a particular league like the league field or by looking at what kind of items you see.
Novynn gracefully shared the first change ID for Necropolis a bit up in #tooldev-general message. There's no formal source for them, only people who note them down as the league arrives or people who can dig into the databases.
I will probably end up launching the site as a proof of concept, and then have a major disclaimer about the assumptions made about timing.
And hopefully next league I will be ready to keep up with the stream
The stash API will never have historical data. Even if you start from the stash ID from the beginning of necropolis, the items returned will be the items as they're currently listed in the stash. The only way to get data from around league start is to be consuming the feed at league start.
as an aid to understanding: am I correct in understanding that the stash tab river currently returns what is effectively SELECT items FROM stashes ORDER BY update_time (ignoring implementation details like sharding)?
SELECT items FROM stashes WHERE change_id > ? ORDER BY change_id LIMIT X
I'm a bit confused. I've advised people based on that if a historical stash tab entry had been superseded, you got an "empty" change for it and would eventually see the current state later in the stream when you reach the most recent evolution of it.
Am I off?
the empty ones are ones that: were public at some point but their last state is private, or are deleted stash tabs (usually subtabs from map or unique stashes)
Ah, fun.
I keep catching myself thinking "it'd be fun to have API credentials so I can test things out" and then realize I have mountains of projects and things to do already 😄
Ah that is very useful to know, must have missed that or perhaps not have had the necessary knowledge to understand it at the time. Thank you for the answer.
I enabled the model viewer, there may be many issues https://poedb.tw/model
howdy - requests to the public leagues endpoint from my api testing client (bruno) and my app, Chaos Recipe Enhancer are being blocked by the (automated?) CloudFlare rules it seems
Is there a way to see what may have caused this or if it was in error could we perhaps get this reversed. using the auth'd / private leagues endpoint can eat into our rate limits in a significant way so i'd love to retain access to the public endpoint from our client
happy to make further modifications to limit how many hits this gets from our client. can't imagine it's too many right now but can continue to investigate.
if i had to guess the app clients for popular browsers (chrome, edge, firefox, etc.) were strictly added to an allow list and all other clients are being blocked now
make sure you're setting a user agent in line with the guidelines
forgot to include this line when i split out my auth'd and public http clients, also lol @ comments
// this useragent isn't strictly required, but it's good practice to include it (they ask for it in the spec)
// the api will not spit back an error if we don't include it
client.DefaultRequestHeaders.UserAgent.ParseAdd(PoeApiConfig.UserAgent);
thanks! seems to be working, will put out a hotfix for my app
im consuming the stream: how can i know if a stash item has changed/been deleted(or unlisted/removed from public stash)?
Is there a way to quickly compare or refer them?
@jolly panther for changed, need deep compare or some canonical serialized format and byte compare.
for removed items set diff of item ids and remember that item could actually be not removed but moved (also these two stashes can appear in separate change batches).
i see, thanks!
Be happy that you dont do terrain files, they're more and more cursed lately.
I haven't gotten around looking at any new iterations of fixed/skinned meshes. Did you try animating anything yet?
Nope, i skipped the newer version, just convert old format
The worst part of animations was probably the nested Oodle compression of the animation payload and figuring out just how to construct the basis matrices, there's way too many ways to permute those computations.
I did it for my offline viewer, once you've gotten the matrix palette it's quite straightforward skinning.
regarding the Id field of PublicStashChange object; is that unique to the actual stash tab, or just a universally unique value?
item/stash ids are globally unique, but it has some account data mixed in, so the same traded item will have different id on different accounts
so would the item id be unique on the same character? say if the price was changed
I have the latest versions of .smd, .fmt, and .ast working, so if you have any questions I might be able to help (though will be mostly afk until tomorrow).
I've been working on .tdt files recently, and have them mostly working through version 7, though haven't figured out the compression scheme for the walkability values yet in versions 4+.
There have been a lot of changes recently though that I haven't gotten to yet. Just in the last 3 leagues or so they have gone from version 8 all the way up to 13.
I suspect some POE2 stuff is being backported into POE1, which might be why the formats are changing so rapidly.
The .tdt compression was great fun, it's been that way for a long while and newer versions adopts it almost universally for more fields.
If you only care about new releases the minimal version is 8 since a few, everything old has been universally updated
I won't dig into it further myself, way too time consuming and convoluted.
Got more immediately productive endeavours for greater good. 😄
Yeah, the main reason I've been spending time on these things is because I have nothing better to do.
Think I figured it out. Seems to be LZ4 compression.
Yep. It's LZ4. Took me several months to reach that conclusion.
There's some added layers of transformation inside that, but the outer routine is indeed bog-standard LZ4 😄
Weird that they'd use LZ4 when they've already got Oodle in process
It's used all over the place for very diverse purposes, so probably a "we already have it". It may actually predate Oodle by years and years.
Yeah, they started using LZ4 in 2.3, and Oodle in 3.11.2 IIRC.
The patch server also use LZ4 compression with protocol version 5 and 6.
It's what I found while researching it two weeks ago.
I'm doing some big-time cleaning on my bulk storage and are eyeing the 18-20 terabytes of PoE release originals.
I'm considering deleting all my historical league start torrent GGPKs as they're upwards of half a terabyte now. Does anyone see a meaningful archival reason to hold on to them?
I'm also looking at cutting up my GGPK files, stripping out all the FREE blocks and sorting the PDIR/FILE entries; with the intent to be able to synthesise new GGPK files with different offsets but all the actual data file contents.
Similarly there, is there any archival reason to have intact GGPK files with all the FREE garbage, eventual orphan files and all the files/dirs at the exact original offsets?
I just had a trip scheduled for the end of July, so I probably won’t be able to update it in time this time.
maybe there'll be a delay
I'll probably be quite busy with a move and new job for league start. Probably during the time leading up to and after it as well.
Give the community a taste of an information-less league start 
grats on the new job
I've got a new job and move too, but I suspect it'll be a bit after leaguestart
So I should be good to do some path of pathing stuff
So I am trying really hard to optimize my code in order to approach rate-limit for the ps-api. Currently I am using a separate thread that always sends out new requests and retrieve the next change id from the headers before loading the response json. I am doing this in python using asyncio and aiohttp. This has gotten my average time spent per request down to ~1.5sec, whch seems ... bad? At this point I am not sure how much more I can improve it. Keep in mind this is without any processing of the data I receive and no part of the 1.5 seconds are spent on thread communication. I'll happily share some code if anyone wants to help. I cant really find many examples online for dealing with similiar APIs to the ps-api.
I once more enter here to ask about a proper API for guild stashes 
I made you an API but I eated it.
Mangled Simpsons quote from Ralph.
The audit log still worked in early Necro for our purposes at least.
Not optimal of course.
We've used the CSV download this league and it's just very painful.
Escpecially since I messed up the dynamic datetime parsing and some officers just couldn't upload their CSV files
I just don't know if it's worth implementing the audit log when Novynn mentioned guild API stuff being on his todo half a year ago. Considering it's also not officially legal to use.
Step 1) clone Novynn
Step 2) ???
Living the tweet
, that one is one of my favourite tales.
There's many fine reasons why I have never applied to a web wrangler job, you wouldn't want me designing an API.
Inya serves individual files over HTTPS, you run out of ports on the client if you ever grab them in bulk.
I might have found another solution that still requires the officers to manually download the CSV file. But I made a script that adds a "Better CSV" button to the page. That includes the darn ID and properly formats the timestamp.
The CSV escort has a bad timestamp by default? 
Human-readable, IIRC.
Probably in the local timezone so might complicate it if you don't single-source the data.
Hmm, no. It's a timestamp alright.
My Rust is almost write-only 😉
please 😭
Maybe if there isn't enough data to analyse
need to clone zao too, cross with Novynn's and make SUPER MEGA BRAIN CODER thingo person
The thought of a zao novynn hybrid scares me. They'd easily take over the world.
The guild API is a bit difficult to use, just like the API from 20 years ago
the history API? It reflects the interface available to the website 🥲
I thought that my first job would be to download product information from ftp every hour and update it to the database on the website after processing.
But is it legal to use? I understood that it wasn't and thus avoided it (instead waiting for the "proper" api that you mentioned being on your todo in december 😉 )
It's human readable and formatted according to a localized format. So when I want multiple officers from all around the world to be able to upload their CSV to my thingy I need to do some elaborate guessing on what the format could be.
And since the CSV doesn't include the ID by default I need the correct timestamp so I don't import data twice
still not according to the terms of use I'm afraid, and lots of my free time has been taken up by this PoE2 thing :/
Hey i have kind of a noob developer question - is it possible to get an auth token for post requests without having to register an app (on the docs it says you need to send an email with exactly what scopes you want and why). Can I just use the auth token that is being used by another app I've already given access to, e.g. wealthy exile? Thanks!
you should be registering your own app of course
@hazy fog dude its you ferret 😄
I wanted to grab passive-skill-tree from the official website, but was rejected.
You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page.
Cloudflare Ray ID: 8968880b99b1f1fa
no user agent
I haven't encountered any problems before, so it's the new rule.
nope
just works, thanks
why not just grab it from the github?
ahh forgot that the github is only english
Is there a possibility to add the Harbinger icon to the minimap? It's probably the only content without an icon?
Or maybe there is a reason for not including it?
Not something you can do with third party tools without breaking the ToS no, and if it's a suggestion to GGG, those go on https://www.pathofexile.com/forum/view-forum/feedback
Also the github isn't fully up to date. I forget what the change was but there's differences between website/ingame and the github tree
yap, github is't fully up to date, so I always fetch it from the website.
For the atlas tree, it's:
effect of explicit modifiers vs effect of modifiers, destructive play wording, deadly prey wording, back to basics remindertext and explicit modifiers vs modifiers wording, condensed souls nerf (25% live, 100% github) and mod tier rating in general, devoted modifier chance changed to devoted modifier effect, fear of the light wording clarified,
Out of curiosity, how do you fetch it from the website? It's always a hassle to do the way I know to do it
public function fetchPassiveSkillTreeData(string $url)
{
$curl = new \Curl\Curl();
$curl->setUserAgent(self::USER_AGENT);
$curl->get($url);
$contents = $curl->response;
$lines = explode(PHP_EOL, $contents);
$treeData = '';
foreach ($lines as $line) {
$line = trim($line);
if (strstr($line, "var passiveSkillTreeData =")) {
$treeData .= $line;
continue;
}
if ($treeData) {
$treeData .= $line;
if ($line == '};') {
break;
}
}
}
return $treeData;
}
Now that's way smarter than what I was doing
Hate to ping here but been waiting a few days to hear back about registering a new app. email/account name same as my name here. It's been quicker than this for me in the past so just checking in.
I'd suggest sending them a follow-up email
Don't think the people who handle oauth requests frequent this channel
they do
It's currently weekend in NZ, so I wouldn't expect a reply until early next week at least, either here or via email.
did they get Friday off?
It's currently like 2am Saturday in new Zealand
NZ is almost as far ahead in time as you can get
yes, i'm aware, i'm GMT+10 myself 🙂 at the time the question was asked (TeaTrey's), it was still early afternoon in NZ on Friday 😛
Sure, but I don't expect they monitor this chat so closely that they saw it in the few hours before the end of the day
Has the way the game writes its log changed since the last update? I've been using something based on ReadDirectoryChangesW to check for changes on Windows and it stopped working recently (only firing whenever I manually modify the file by e.g. opening it in notepad, reading its properties, etc)
It feels like the file isn't being flushed anymore unless read by a different process or the game is closed
Haven't noticed, but sounds fun. Does ProcessMon report anything interesting about CreateFile/WriteFile usage? Guess it's hard to compare to an older client by now.
I'll try running another program I know parses your log in real time to see if it has the same problem for now
My "workaround" has been to poll the file's metadata to see if there's been any changes once a second which leads to choppy/slow reads at times
Seems like PoE Lurker is not having this problem
Weird. I've been able to replicate it both with Rust and Python
Reminds me of the recently released game asset build tool - they use Windows USN journals to tell if files change - https://github.com/jlaumon/AssetCooker
HUH I am running my program again now, no changes to the code
and it almost works
but somehow it is delayed in when it receives new data??
Before clogging up this channel more I'll have to investigate further

Okay. The delay was caused by me still running a polling watcher instead of the ReadDirectoryChangesW based one. Switched and now it works again though
Feels like Windows/ReadDirectoryChangesW is just very inconsistent in when/if it reports changes??
probably waits for a flush or something
Yesterday I've waited for over 30 minutes without a flush happening
yeah l had the same issue. l think it's just a limitation of windows https://github.com/jmagnuson/linemux/issues/18 . looks like poe lurker polls at 500ms https://github.com/C1rdec/Poe-Lurker/blob/master/src/Lurker/ClientLurker.cs#L311
Thanks for pointing that out, that's really interesting
I would've expected for this to just... work, but Windows do be Windows
Do we already have info if PoE2 will use the same API / Endpoints than PoE1 ?
no, also I doubt they have decided what they want to do with APIs in poe2
I assume they would want them to be similar where possible, but iirc we have no info on it yet
A similar api would be great tbh
They saw all the horrors you peeps did with PoE1 and went "yeah, nah" 😉
(I don't think they've said much if anything about the API situation)
Loads of neat potential in the api but we'll see
Poe stash tab viewer. Just published on npm 🤗
https://github.com/shonya3/poe-custom-elements
navigate with arrows, copy item info in two formats(ctrl+C or J), show sockets(ALT)
using it already in my divicards desktop app
looks cool, well done
Am I understanding this workflow correctly:
To request an API Key I need to already know my applications precise callback URL? (like https://myfancydomain.net/app/api/signin-success )
And when in development I'd realise that it would need to be /app/api/auth/signin-success I'd need to request that change again via mail?
I am considering a project and would like to work on a very basic MVP, but I don't wanna bother the oauth folks again and again if stuff changes.
Also anyone got pointers on how to even attempt to debug something like that? Redirect the domain to my dev machine?
for development you are probably interested in client credentials grant as it doesn't require redirect uri
https://www.pathofexile.com/developer/docs/authorization#grants-client-credentials
at the cost of being able to interact only with your account iirc
That sounds like a bit of a hack to me. That client type is intended for apps which can't use a secure backend for whatever reason and comes with a bunch of limitations
When would this exact problem arise? Are you using some existing OAuth library and it enforces the URL?
Although then you'd be able to know it's convention.
It's specified as a required info for the key request.
And it'll only work with the specified URI
And yeah, the client credentials solution would not work. I want to avoid doing unnecessary requests to the auth team and also the client credentials auth doesn't grant access to the APIs that I'd need
I guess that'd allow me to check my very basic implementation of the Oauth process. Then when I get that working I can make a minimal project and figure out the endpoint.
is it a hack? maybe. it gets the job done though and that's what Rory recommended to me some years ago, so unless something changed since then it's probably still fine
Yes but I can't think of a reason other than "I am using this existing oauth lib that is forcing me to call it /abc/redirect and not /xyz/redirect"
And I've only ever encountered this level of integration in stuff like Ruby on Rails and Elixir's Phoenix
If you haven't done OAuth2 before, it could probably be a bit daunting to make up an URI that will stand the test of time - especially if you're not sure about the flow and how it'll work if you ever do multiple apps or however you deploy in prod.
Remind me in a bunch of months to try all this out.
And yeah, public clients have a subset of the scopes, way shorter token lifetimes, shared rate limits between all the user's public clients, and must use a local URL in the flow.
Kind of meant for tools like PoB that would like to act on an user's behalf in a restricted manner, but should be considered compromised/modified from the start.
Arguably the exact path of the redirect URI matters zilch though. Users never navigate to it manually, GGG will only every redirect your users to it on a successful sign-up and the expectation is that you then redirect to something like your homepage or the last visited page
I mean, the flow URI you specify might be a bit tied to whatever framework you use, or how you've deployed your application(s) behind proxies or in some weird serverless world.
It's never something that user's will see or persist or anything, indeed, but it's still something you need to figure out up-front when getting started.
full redirect URIs are preferred for security reasons, ie: https://datatracker.ietf.org/doc/html/rfc6819#section-5.2.3.5
This document gives additional security considerations for OAuth, beyond those in the OAuth 2.0 specification, based on a comprehensive threat model for the OAuth 2.0 protocol. This document is not an Internet Standards Track specification; it is published for informational purposes.
less of a concern during development where we can accommodate partial ones
the preferred method is for you to use your system's hosts file to redirect your hostname to your local dev server while checking things
Duh, now I get it. I somehow thought that the poe server would make the request, but of course it's just the client that's given the necessary information who passes it along with the redirect to my server. Thanks, that makes sense.
Tbf, nothing is obvious until you get it.
@fickle yew this price history page is broken: https://poe.ninja/economy/necropolis/unique-armours/doppelgänger-guise-sadist-garb
pages for other uniques load fine for me
ä has entered the chat.
I conjectured that but Maelström of Chaos loads fine
however the URL is normalized to just say maelstrom: https://poe.ninja/economy/necropolis/unique-maps/maelstrom-of-chaos-t8
manually editing the url to say doppelganger doesn't work either though
i hate those ös and äs.. I'll fix it tonight.
Thanks!
No, you did the right thing.
alright ^^
I need to fix The Black Mórrigan as well..
@fickle yew which language do you write the backend for poe.ninja in? might just want to add unicode normalization there
in Python for example you can strip accents like this by normalizing to unicode NFKD (which splits up symbols like ó into o + combiner '), then encoding the resulting string as ascii, ignoring any combining marks
>>> unicodedata.normalize('NFKD', 'The Black Mórrigan').encode("ASCII", "ignore")
b'The Black Morrigan'
>>> unicodedata.normalize('NFKD', 'Maelström of Chaos').encode("ASCII", "ignore")
b'Maelstrom of Chaos'
There's also tooling like this that go quite hard: https://github.com/anyascii/anyascii
C#. There's just been too few instances that I haven't bothered and fixed them one off.. 😉
@fickle yew another bug report: the 'open in path of building' shortcut button stopped functioning
pob://poeninja/overview/code?account=DieWaldF333&name=KineticBlastopolisCF&overview=necropolis&type=exp&timeMachine=day-6
but that might be an upstream issue
manually importing the code still works fine
Can confirm, hasn't worked for a while on any build I've clicked.
Alright. I'll take a look. I know that it doesn't work on the pob page. But normal builds should work.
I recently changed the way builds are stored behind the scenes, so the pob issue probably happened then
@lusty musk Both should be fixed now. Thanks for the tip about normalization - I hadn't used that before. It did send me down a crazy rabbit hole since my docker image used global invariant culture which doesn't do anything when normalizing strings - and so I had a great case of different behavior locally and in production.. 😄
we all suffer so GGG can have cool edgy item names 
Now they can go nuts for all I care 🙂
"challenge accepted"
Pob is also not happy about it. I was already removing some in that part as well.
4 different uniques differing only by diacritics? 😄
cool edgy names
as a German I feel hurt
The fact that you can't write Mjölner in global chat in game is the worst offence in my opinion
Please, GGG, add an exception to that filter specifically for mj followed by ö followed by lner
Or just item names in general
What if you try to ask if anyone has one?
just ask Regisle to link one of his? 😁
would be nice to be able to use our whole alphabet in chat when the language is officially supported by ggg anyway
Swedish often partially slips through when it comes to online games. ESO allowed ä and ö thanks to the Germans, but couldn't do å.
I guess you refer to the English globals, as everything else seems to support most of Unicode:
just do it yourself! :p
A finger on the monkey paw curls - your people will now have their own set of German globals with no ability to talk to others 😉
huh interesting, assumed usernames == chat message
nööö
It's a reasonable safeguard to keep globals that are arguably for a particular language speaking that language.
The rough edges are when you've got "the unofficial Swahili global" and diverse communities that gather in global numbers which would be fine with people speaking their own languages or creoles.
Character names are weird, you probably have to limit them somewhat but still cater to the supported languages.
I'm mostly bit by it when I paste some patch notes or smart quotes into "our" community global and it eats the whole message.
yeah makes sense
AFAIK the limitation is collateral damage to prevent flashbangs/toucans? Might be wrong though
If it's part of the web stuff, which I doubt but might be the case in some API thing or something, then maybe I will!!
One thing I'd like to see is community channels that had actual ownership with their own additional moderation.
Going back to the community channel that we inhabit, it's just some particular global where disruptive and unwanted people can pop in and even worse, only leave on their own initiative.
The reason we have a shared global instead of just the guild chat is because people already are in other guilds but still want to carry on the same camraderie from Twitch and Discord in-game.
Same, same
given stuff like Position Proxies, masteries, etc, how do PoB etc. figure out how to handle certain nodes? Is it "hardcoded" and based off of the name/a match on the icon's path? Are there other "tells"?
There's a bit of preprocessing in the scope-creepingly named fix_ascendancy_positions.py script.
(I have no idea past that)
Someone that works on the game/Lua side of things could probably answer the actual question 🙂
@daring moss what are you interested in? In the skill tree all nodes have their stats embedded, that should be all you need
Name, icon, stats, it's all there
I was trying to render a tree similar to pob and poeplanner as a way to play around with Rust in a non-trivial way
Maybe helpful, my SVG tree "renderer" for pobbin in Rust: https://github.com/Dav1dde/poe-tmm/
all the data is in the json and just attached to the final object
(doesn't handle cluster jewels, cause I am lazy)
The fix_ascendancy script is just to move the ascendancies to nicer positions. They used to be in ok positions but at one point they were overlapping so I moved them next to their class and someone made the python script so I didn't have to do it manually anymore. We also added stuff like the Wildwood ascendancies and special Forbidden Flesh/Flame jewels but it's a bit of a mess atm
Ohhh, yeah, I kinda see what you mean
I feel giga dumb; trying to render notables in this thing and for some reason the size of the icon is the same as for normal nodes? Is the assumption that you scale it up based on if "isNotable" is true or not?
thats what i did for @regal murals preview
size depends on isNotable/isKeystone in my svg renderer
I see. I'm thinking of how you'd approach it given GGG's textures because right now it looks really scuffed
based solely off of the w/h given in the sprite's coords
so I assume I have to scale by 2 in both directions?
looks like it, i only did a stylized preview like pobbin so cant really say more
