#tooldev-general
1 messages · Page 135 of 1
pool's closed.
Or rather... Why are you like this, Python -.-
oh man that brings back memories of all the fiddly windows version checks one program I worked on had
don't suppose anyone's fiddled with protobuf at some point and knows how to have visual studio automatically rebuild .protos when i build my solution?
having to do it via terminal every time i make a change is grating my patience already
I fought for a good four hours just the other night to get gRPC (and thus protobuf) generating properly with CMake.
Still torn between gRPC, Cap'n Proto and (badly) rolling my own.
That reminds me that I still need to sort out the build events for the JSON DAT schema in my tools, using post-build events and it doesn't invoke to copy the new file to the install dir when the project itself is up to date.
FYI: You can compare tuples in Python. Also, sys.platform.startswith("win") might match future operating systems that are not supported.
Your code would be more concise as
if (4, 0, 0) > sys.version_info >= (3, 8, 0) and sys.platform == "win32":
...
Apparently Avro is all the hype, haven't looked into the difference though.. Anyone else?
I don't trust anything that's under the Apache Foundation umbrella.
That's where software goes to die.
hehe
well, Apache Kafka still lives
but yeah I don't get the value-add of Apache Foundation?
nor CNCF and so on for that matter
In my mind, it's where somewhat usable software goes when no-one wants to maintain it anymore and there's not much of a community.
I guess there are a couple of exceptions that confirms the rule
Spotify intentionally avoided Apache for their Luigi pipeline software, as they felt it'd be a net negative.
On the note of Spotify, I've been wanting to try their developer portal thing called Backstage (https://backstage.io)
But what I really would like to see is a serverless option for Azure (mainly because that is what we work most with), but would be cool to see similar for other hyperscalers as well
I'm looking to do a data project to brush up on my python skills. I'm hoping to use the GGG API and play around with some ladder data. Is this the right place to look for advice or pointers on that?
Let me know if I should look elsewhere, thanks!
Fairly topical 🙂
the short version is that I've never used an API before so I'm having difficulty envisioning that part of the process. I'm a data programmer so once I get a data table figured out I'm good, but mapping the API-to-data-table process has been challenging
For most of the other APIs that aren't documented in the pinned docs webpage, the easiest way tends to be to look at what requests a browser would make to the endpoints in the network tab, or see if someone else has gathered the data already, like poe.ninja
I think what I'd like to do is learn how poe.ninja works and basically build a snapshot of it on my end. I personally would love to be able to search poe.ninja for the number of large clusters a build uses to cut out the super-scaling 12-cluster builds. So figuring out how to do that would be nice
Of course I don't want to just ask for all of someone's code so I can learn that way but I'm not really sure where to start
ggg actually gives us cluster data now, to allocate nodes, iirc rasmuskl doesnt do it for poe ninja becouse it would require an extra api call to ggg
so you can take a build from poe ninja, and then ask ggg to give you the proper tree data for clusters and it should just fix the dps
is that through the API? so it should be easy for me to pull the ladder, parse builds for cluster info, and filter out builds with lots of clusters?
why even filter out lots of clusters if the points allocated are correct? the issue with poe ninja is builds put in clusters and then dont have all the points allocated, overestimating dps etc
if you have the points correctly allocated then the dps should be correct and you dont need to filter them out, just lower their dps to the correct value for whatever internal sorting/filtering you plan to do?
but yes
not sure of poeninja has an api for builds though havnt checked
it's more just personal curiosity to see builds that don't use them. It's less about getting the raw DPS of the build correct and more just using it as a filter point
But yeah, it's good to know it's all there to be played with.
How is data stored on the API side? Like pulling the top 1000 builds on the ladder and getting to a point where I can filter builds by how many large clusters they have. Does that process require linking a ton of endpoints together (like one to grab character IDs on the ladder, one to grab equipped items per character, one to grab ascendancy for each character, etc.) or is it more straightforward?
Yep I've been trying to figure out how to interpret all that, there's a wee bit of language I'm not familiar with
there are 3 ways to access the ladder
I see the Type Definitions section has some stuff about jewels so I'm trying to understand what it means.
- oauth (200 per query, oauth needed)
- old api https://api.pathofexile.com/ladders/Scourge?Realm=pc&sort=xp&limit=50&offset=200 (200 per query)
- export-csv https://www.pathofexile.com/ladder/export-csv/league/Scourge from forum link (2000 per query)
I see Character and ItemJewelData, I assume that's the info I'll want.
https://poedb.tw/poe-api check here for 2. and 3. information
Thanks, this should be a good start!
https://web.poecdn.com/image/item/popup/seperator-unique.png typo: seperator
Is there a compiled list of gems with information about unlocking? what act, quest reward, vendor availability. Something like poedb lists for each gem but a compilation of all gems. poedb itself has https://poedb.tw/us/QuestVendorRewards but I am not sure how correct it is because it lacks Corrupting Fever that should be possible to buy with Templar in act 2.
PoEDB provides things come out each league, as well as items, uniques, skills and passives. Path of Exile Wiki editing functions.
not really a list but wiki should have tables on each gem about where u can buy them
seems like the reason it's not on that page is because the intruders in black quest is missing
From the wiki side, I don't believe we've investigated yet whether the current DAT files for rewards are sufficient to map out rewards or if it's still something that needs manual curation.
i'm assuming chuanhsing does it manually otherwise a quest wouldn't have fallen off
@velvet fog What's your approach for quest vendor rewards? By the way, the Fallen from Grace listing for All classes has no spacing between names on that page.
I'm not sure what it is that you're trying to do here, but your function is better expressed with a defaultdict and your class with types.SimpleNamespace. Also what's wrong with just putting the counter variable in a module (possibly its own)?
ggg removed quest vendor rewards years ago to prevent data mining, it's manual edited
Ah, I thought there was a bit of resurgence this league with new DATs, but I haven't actually looked at their format 😄
Thanks for reminding me of how Go for the longest while refused to care about TLS ClientHello larger than a surprisingly small byte size.
Lost approximately all faith in the language fighting to justify a very concrete use case in high-energy physics as upstream went "lol, no-one would have that many CAs".
When negotiating a TLS handshake involving client certificates you also tend to communicate the CAs that client certificates may be signed by to allow the client to make an intelligent choice.
When the party involved is a trust federation, there's a lot of CAs.
That reasoning... amazing.
Libraries are the ones that should be extremely flexible.
only quest rewards, quest vendor rewards are still missed
The reasoning from upstream was that it interfered with their malicious client detection, which boiled down to "is the first packet larger than X bytes? clearly up to no good and want to DoS"
Ah, that clears it up. Subtle 🙂
We were within the RFC suggested amounts, fwiw.
RFC recommendation was something like 12 KiB, we were 8-10 KiB, Go bailed at like 2 KiB.
It's supposedly fixed since then, but it was formative enough that I don't want anything to do with that despotic ecosystem.
What worries me when I hear discussions like this around Go is... Kubernetes is built with Go. It's kind of a defacto standard
Is somebody here tracking individual stash tab sizes from the stash tab endpoint? Or maybe even amount of items? I would love to get like five ids which are quite big. I sadly never tracked the size 😦
haven't looked myself but I have to imagine that public map/divination card/unique tabs could get pretty huge
Arg, maybe I phrased it wrong. Searching for complete ones, not sizes of specific tabs in one change id.
Is there a generic API to get image links for assets, like item bases, uniques etc? Poe-Planner seems to have a database for that (at least there is an items.bin being queried), but is there something like that publicly available?
In general, the only links you have are ones that you can obtain through trade searches and official links to assets.
They're pretty much all in the form of /gen/ links with guess protection and embedded encoded metadata for the asset you require.
yeah and that's my problem, I don't want to trade search for every base/unique just to build that database (which could be invalidated at any point)
awakened poe trade does this so 
Maybe I'll have to look throught the ggpk try to extract the assets and host them myself, but that seems very tedious
that might work for tools which search for items anyways, but I basically want to add images to PoB (where there is no reference to an actual ingame item)
Thus far PoB has gotten by with shipping just the (web) skill tree assets graciously provided.
Additional assets would have to be pre-mined and shipped somehow then, which is a bit ickier than shipping baked data tables from the exporter.
There's definitely prior art in the wiki and their quite capable PyPoE-fueled exporter.
(disclaimer, I have my fingers in all the jars)

@formal kraken Have you had any chats with the team (assuming Community Fork) about this initiative?
nah, not actually planning on doing that, just used as an example
is there a reference to the base type as well? Like BodyDex2A = Carnal Armour (or whatever it actually is)
@civic crane By the way, I have fat fingers and keep clicking on CachedHLSLShaders in the file browser on poe-dat-viewer, which breaks the tree.
haha, yeah I know, it's special folder as well as Art, but fix is not the same 😄
Item visual identities (including 2D item art paths in DDSFile) are in ItemVisualIdentity.dat, referenced from BaseItemTypes.dat via ItemVisualIdentityKey.
Thanks, I'll have a look at that then. Still would prefer if there was a manifest online somewhere, like there is for trade currency 😦
So you have Metadata/Items/Armours/BodyArmours/BodyDexInt17 ("Carnal Armour") in BIT referencing row 5627 in IVI, BodyDexInt4C with a DDSFile of Art/2DItems/Armours/BodyArmours/BodyDexInt4C.dds.
Guess I have to write a GGPK parser in Rust now as well 😦
too many things at once I never keep finishing (like a basically complete poe tree webcomponent) 😦
I don't think I ever brought my Rust implementation into the bundle age post September 2020: https://gitlab.com/zao/poe-rs
Not sure if there's much to be reused from in there, but the GGPK parser probably works at least, but you don't have any of the bundle stuff.
If you want loose files and can handle using tools, bun_extract_file works on both Steam and Standalone installations.
even if I cant use it directly, helps a lot to have something I can use as a reference
If you're in the web world, SnosMe did work on decompressing bundles on the fly in the browser.
That reminds me, I need to do the DAT thing for Barks any decade now.
Half Web, half not. That's probably just something I'd hack together to export the assets and upload it to b2 with a manifest
I'm still building my personal data delivery service tho, so can't really let you at that.
thanks for the pointers, still got a bit of other stuff to do first, since I just scrapped my frontend and starting fresh (with wasm rust for some stupid reason)
@formal kraken If you go the Rust route, remember to use an arena allocator for any tree data structure stuff
I was thinking of mmap'ing the entire thing
not sure if that actually works (compression?)
I guess you don't need to build a tree if all you want is to extract some data
Memory maps map the location of data, not the content itself
As long as you're on a 64 bit system, you'll be fine
The GGPK is uncompressed and has TLV-type chunks with offsets pointing at other chunks.
You need to traverse chunk links to get to dirs and files, but as everything is in bundles now, the GGPK layer is much slimmer than before.
It's about ~50k GGPK records and ~700k bundle files currently
sure, but I can mmap the file and the kernel handles the access for me
but yeah I dont know enough about the format to say anything competent, just guessing
so many more bookmarks!
@golden bane Fun stats: the total number of files in all public PoE releases ever (excluding macOS binaries) is around 252 million.
There are around 2 million unique files ever, and almost one million unique paths.
Guess where my current headaches lie 😛
Kernel, huh.... I wish Windows supported mmap.madvise()
oh yeah, I wouldn't care about Windows ^^
From experience, mmap for the GGPK is perfectly fine as long as you're a 64-bit process. A common acceleration technique if you're going to need many files is to do a linear sweep up-front and find all the chunks linearly rather than random-access, even on SSDs.
For few files, chasing offsets is fine.
This is all the Rust in my current GGPK parser: 😄
use std::hash::Hasher;
use fnv::FnvHasher;
use pyo3::prelude::*;
#[pyfunction]
fn fnv1a_64(bytes: &[u8]) -> u64 {
let mut hasher = FnvHasher::default();
hasher.write(bytes);
hasher.finish()
}
#[pymodule]
fn fnv1a(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(fnv1a_64, m)?)?;
Ok(())
}
Needed to delete the rest bc design was bad. Maybe I should pick it up again
@formal kraken If you control your environment, I recommend using the Steam files instead, there the bundles are loose on disk instead of in a GGPK.
ah, so that was the "fix" to make steam updates not patch forever
Yeah
TIL about FnvHash did you try other hashers as well, like Fx?
The bundles have FNV-1a hashed path names
But for the Rust version, I've also replaced the standard SIP HashMap with FnvHashMap for some extra speedup (it was only a couple ms though, iirc)
I've had very good results with replacing std HashMap with FxHashMap in my AoC this year
Curiously, there isn't a maintained native FNV library currently for Python, so I had to use one from Rust
has anyone here successfully issued trade api requests that specified a sorting other than price ascending?
how is this different from usual cycle: wonder about new filter, look what browser sends, send same thing yourself.
@civic crane as 👆 said, it seems to be ignored in API query string (perhaps @compact isle can confirm / fix when vacation ends)
@odd sail you can paste url here 🙂
At work currently… so can’t. Later sure
Curious what it specifies for weighted sum sorting
are u allowed to make skin changers?
@compact isle I wanted to ask some questions about the trade website in DMs if you're free
this has practically been my day so far: 
@compact isle are skin changers allowed
@twilit field I think you're talking about Minecraft?
no. I do this in league of legends
then define what is it, how everyone expected to know what is it. You're not allowed to change game files, one day ggg can flip flag to ban people for mismatched file Hash @twilit field
don't @ GGG employees for stupid shit
yeah we don't support loading queries that have a pre-set sort state
we probably should (via the query string method) though ¯_(ツ)_/¯
@compact isle Well, at least in my tool, it would reduce the fetch counts as I would only want the top 10-20 if I could sort by what is important (e.g., ‘sort { “weight”: “desc” }’).
I understand there is probably a separate and deeper discussion to be had if such capability is “good for the game” or not
if you're programmatically making requests and not using the query string method then do this ^
or apparently sort { statgroup.0: "desc" }
@compact isle did you already implement it??? b/c now it works
or I guess I wasn't doing it right before... anyways .. nothing to see here
@compact isle in {"id":"explicit.stat_3913282911","text":"#% to Chaos Damage over Time Multiplier with Attack Skills","type":"explicit"} how is the # value of the stat calculated? I tried comparing it to the Stats.dat Hash and FNV-1a encoding and it doesn't match. Curious if it's deterministic.
it's not something public and can change when mods / stats become legacy
if it matched the hash of the stat it would be easily updatable with new leagues, but all good. at least you guys provide a comprehensive list in the api/trade/data/stats
unfortunately the text you see is only loosely related to stats >_>
another one bites the dust 😦
Aw rip
Maybe they just forgot to renew it. I know I do from time to time
no autorenew?
Is there a list of just general purpose poe assets somewhere, e.g. ascendancy pictures like on the wiki, just a bit higher res?
mh I guess these pictures are in the skill tree json
nvm, I can only find them in the sprites, which are really low res again
You could extract them from the game files in high res
yeah, I guess I have to look at that soon, thanks
@mortal bone was looking into grabbing 4K assets a couple months ago for the skill tree. Might be able to help you
@formal kraken those images are in Art/2DArt/UImages/Common and Art/2DArt/UImages/Common/4K. They are all the Icon*.png files
awesome, thanks
The 4k icons are 181x141. If you need something higher res than that, you can always grab the skill tree background art for the ascendancy classes (they don't have that for the base classes). Those are in Art/2DArt/UImages/InGame/Classes or the illustrations in Art/2DArt/BaseClassIllustrations
aight, the 181x141 should be big enough, I just want a higher res thumbnail
@compact isle any chance the Trade API could accept tmpstandard as league name that's resolved appropriately? Web-browser's behavior seems to be that if it doesn't explicitly match a known league it defaults to the temporary league name.
something like:
{ label = "League SC", name = "tmpstandard" },
{ label = "League HC", name = "tmphardcore" },
{ label = "Standard", name = "Standard" },
{ label = "Hardcore", name = "Hardcore" },
{ label = "Event SC", name = "eventstandard" },
{ label = "Event HC", name = "eventhardcore" }```
would be useful
There were overlapping events this December, wasn't there?
matching the behavior of the website seems reasonable
can anyone help me map the mainActiveSkill from pob to the actually active skill? Forbidden Rite is the 2nd in the drop down, which sets the mainActiveSkill to 2:
<Skill mainActiveSkillCalcs="1" includeInFullDPS="false" label="" groupCount="nil" enabled="true" slot="Body Armour" mainActiveSkill="2">
<Gem enableGlobal2="false" level="18" enableGlobal1="true" skillId="Cyclone" qualityId="Default" gemId="Metadata/Items/Gems/SkillGemCyclone" quality="20" enabled="true" count="1" nameSpec="Cyclone"/>
<Gem enableGlobal2="false" level="19" enableGlobal1="true" skillId="SupportParallelProjectiles" qualityId="Default" gemId="Metadata/Items/Gems/SupportGemParallelProjectiles" quality="0" enabled="true" count="1" nameSpec="Volley"/>
<Gem enableGlobal2="false" level="18" enableGlobal1="true" skillId="SupportVoidManipulation" qualityId="Default" gemId="Metadata/Items/Gems/SupportGemVoidManipulation" quality="0" enabled="true" count="1" nameSpec="Void Manipulation"/>
<Gem enableGlobal2="false" level="19" enableGlobal1="true" skillId="ForbiddenRite" qualityId="Default" skillPart="2" gemId="Metadata/Items/Gems/SkillGemForbiddenRite" quality="20" enabled="true" count="1" nameSpec="Forbidden Rite"/>
<Gem enableGlobal2="false" level="1" enableGlobal1="true" skillId="SupportCastOnCritPlus" qualityId="Default" gemId="Metadata/Items/Gems/SupportGemCastOnCritPlus" quality="0" enabled="true" count="1" nameSpec="Awakened Cast On Critical Strike"/>
<Gem enableGlobal2="false" level="17" enableGlobal1="true" skillId="SupportPowerChargeOnCrit" qualityId="Default" gemId="Metadata/Items/Gems/SupportGemPowerChargeOnCrit" quality="0" enabled="true" count="1" nameSpec="Power Charge On Critical"/>
</Skill>
But the 2nd item in the XML is Volley, FR is 4th, how do I map the index to the correct skill gem?
does the meaning of mainActiveSkill change when it's > 1 and there are skillParts?
it feels like a bug though
I guess it's literally just the dropdown index and not the index of the skill
Can you share the full XML?
yeah, 1 sec
Gist with both XMLs, first is exported with Cyclone selected, second is exported with FR selected: https://gist.github.com/Dav1dde/617045eb97e4bb611e8703fcdf840bae
Just in case, that's it encoded: https://pastebin.com/ECKCwwdi
This may be relevant, but I don't see where the values are coming from: https://github.com/PathOfBuildingCommunity/PathOfBuilding/blob/master/src/Modules/Build.lua#L535-L540
https://github.com/PathOfBuildingCommunity/PathOfBuilding/blob/a1226d69c5f267aa690343259939e77c0ba839b6/src/Modules/Build.lua#L1117-L1119 maybe val should be set instead of index in the callback?
tried to do a more minimal example with an empty build and cwc cyclone firestorm
and only mainActiveSkillchanges depending on what skill is selected
cyclone selected
firestorm selected
the problem is, it only changes to 1 and 2, even if FR is the last in the socket group
[Cyclone, Volley, FR, ...] <-> Cyclone selected=1, FR selected=2 (should be 3)
mh, that makes sense, but that means I need an indicator of what an active skill is
in my bot i use the following
I guess filtering on "support" suffix could use
At some point, it might make more sense to look into augmenting PoB itself with the ability to select things.
def determine_active(self):
return False if not self.id else "Support".lower() not in self.id.lower()
Rather than relying on implementation detail.
you mean extend pob to make the exported xml an actual format not just a convenient dump?
i mean it is an actual format just very specific :p
without stability guarantee
Nah, more that it you're using the headless client, that you can interact with it to make those choices in the same manner they're done in the UI.
If you're intent on mutating XML, it'd probably help to read the actual code to see what actually happens.
its pretty stable so far
havent had many hiccups with @regal mural
and for the code snippet above: gemIdin the xml helps you with determining support or skill gem
@worthy cape half and half, for now I just want to import at some point I might work on an export functionality (like poe.ninja) but that's far down on the todo list
right, I missed that, thanks
welcome
headless client is way more resources tho zao
i dont know if that is suitable for real time parsing/querying
well "real time"
maybe also helpful: https://github.com/ppoelzl/PathOfBuildingAPI
Ah, I understood the original desire to be to change the entry to refer to a different skill, not offline interpretation of the XML.
I'd be interested to add interfacing with headless PoB to pobapi. Just never got around to do it. PRs are welcome 😄
So question for folks leveraging PoB in headless or not mode: do you guys need the PlayerStat information that gets saved in the XML (derived through dumping the output of the analytics passes) or no? Example:
<?xml version="1.0" encoding="UTF-8"?>
<PathOfBuilding>
<Build level="96" targetVersion="3_0" pantheonMajorGod="None" bandit="None" className="Witch" ascendClassName="Occultist" mainSocketGroup="1" viewMode="TREE" pantheonMinorGod="None">
<PlayerStat stat="AverageDamage" value="4654.0393701665"/>
<PlayerStat stat="Speed" value="1.62"/>
<PlayerStat stat="TotemPlacementTime" value="0.21084337349398"/>
<PlayerStat stat="PreEffectiveCritChance" value="11.725"/>
<PlayerStat stat="CritChance" value="11.13875"/>
<PlayerStat stat="CritMultiplier" value="1.5"/>
I ask as it all gets re-calculated on a Load anyways and not used so it takes up space that is unnecessary unless someone is using it.
okay, I'll leave it in. I'm about to submit a PR though that cleans it up a bit and removes duplicate entries or entries that should not apply due to conditions not being matched.
(e.g. the pob preview bot on the subreddit depends on it)
As an example currently all XML dumps have Speed repeated 3 times b/c our current Save process disregards the boolean evaluation of the condFunc(). I'm fixing that in the PR
{ stat = "Speed", label = "Attack Rate", fmt = ".2f", compPercent = true, flag = "attack", condFunc = function(v,o) return v > 0 and (o.TriggerTime or 0) == 0 end },
{ stat = "Speed", label = "Cast Rate", fmt = ".2f", compPercent = true, flag = "spell", condFunc = function(v,o) return v > 0 and (o.TriggerTime or 0) == 0 end },
{ stat = "Speed", label = "Effective Trigger Rate", fmt = ".2f", compPercent = true, condFunc = function(v,o) return (o.TriggerTime or 0) ~= 0 and o.ServerTriggerRate ~= o.Speed end },
So this would turn into AttackRate, CastRate and EffectiveTriggerRate?
@formal kraken no, it stays Speed, but is only saved once
currently (before this PR) it looks like this:
<PlayerStat stat="AverageDamage" value="84768.780421338"/>
<PlayerStat stat="Speed" value="1.6375"/>
<PlayerStat stat="Speed" value="1.6375"/>
<PlayerStat stat="Speed" value="1.6375"/>
just wastes space
I dont have an XML at hand right now, but is it actually repeated 3 times in the XML?
nvm, that answers it
Yes my bot uses these for any output
opening a new window is fine, some/most price checking tools already do that
Mh this is interesting, so that probably means I cannot embed the tree as iframe?
My interpretation of that part is that the context kind of is in the browser, about embedding parts of the website on another website.
The intent as I see it is that you shall not scrape, and you should not intermix the site with your own content.
A free-standing application that can pop out a browser window which it otherwise doesn't interact with is a bit different. I'd reckon that they rather not have you pop the actual website inside your own process, as that means exposing sign-in details and such to your control.
A standalone browser uses the existing sign-in information and is vettable. Your own app is way more icky.
I've seen "framing" clauses like this before and they're usually just legacy language from before web sites could effectively control framing with X-Frame-Options. I wouldn't be surprised if that were the case here too
Anybody w/ JS / React / Laravell skills interested in working on a POE project?
what sort of project?
website driven Trade platform
I have http://poenexus.com up for concept
Web site created using create-react-app
might want to implement https for starters
I managed to provoke a rather surprising bug with a local httpd today. I ran out of ports doing bulk downloads 😄
nice achievement
I see connection reuse and pipelining in my future.
Something like 20.7k requests full blast across all threads, while also decompressing data and persisting it to disk.
Considering the typical ephemeral range is what, 16k ports, definitely achievable to eat them all.
Not sure if it was on the server or client side, think client.
it's just a concept site.
you're collecting passwords, right? either have https or don't collect information
Anybody w/ JS / React / Laravel skills interested in working on a POE project? Looking for a Dev to head the project. PM me for details
@worthy cape bad OS and httpd settings, with a little tuning you can get around that (connection pooling where possible, setting net.ipv4.tcp_tw_reuse etc.), but you probably already know that
Guys anyone knows a place to fetch skill gems and base types prices?
poe.ninja API is way off on them rest seems fine
a side note my code is not wrong kek
@slim pilot poe.ninja is honest with you and says that it's low confidence, why you're trying to blame it. You will not see these listings on website whout checking checkbox
There's only 9 listed and one of them is listed for 2 mirrors
oh.
i thought it was 60c...
wait 20 23 is expensive.
yeah this works.
thanks guys.
60c is probably what you'd pay, but ninja does an average (with some fuzzing so people can't game it, I believe)
oh I see...
I will use this anyway lol.
But yeah if there's only a few listed it's not going to be super accurate
the real challenge will be
getting every skill gem prices from level 1 to 20
seems headache i will delete skill gem from code
I wrote something to pull gem prices fairly recently to calculate gem corruption profit margins. Anything with less than 10 listings was frequently unusable and needed filtering: https://pastebin.com/UtJ4nfnZ
Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
and guys one more and final stupid question I need to mail there to get a client ID right? thanks
another Dark Souls 3 RCE
Gotta love taking console security to the desktop.
interpreting arbitrary user-supplied strings, brilliant
Saw some unsubstantiated claims about one, but no details.
already happened once so I'm willing to believe it
there's vods from at least 3 streamers of it supposedly happening
Yeah, not doubting it exists.
roll within one tier is a normal distribution?
it's not, why would I think so? 😄
however, number of items rolled with <50% should be equal to >50% ? 🤔
do divination scarabs work for delirium rewards ?
You're probably looking for a general chat, not tooldev.
Hi, Reforge become open-source now. Check out our repos and lend me your hands 😛
Backend: https://github.com/namlehong/reforge-api
Frontend: https://github.com/namlehong/reforge-angular
For someone living under a rock and which can’t open the website due to https shenanigans on mobile, what is it? 🙂
was a site for buying/selling harvest crafts
the site is returning an invalid cert, I assume you took it down at some point?
Is there a PoB specific discord?
There is for dev stuff. If its a general questions I'm happy to answer here
aight, I've been working on a pob pastebin and was wondering if there is any interest in moving it to the PoBCommunity and making it something 'official'
haha, we had also kinda been working on something like that in the past but it was in very early stages afaik
It's still wip: https://pobb.in/qO7_QpuQLeDd
But I was on planning to finish it this week and put it in a state that it works (well it already does, but in a state where I feel like people can use it)
Just sent you an inv to the server btw
thanks, joined
he didn't wrote a readme
oh it is TFT services fetcher i guess
still repos seemed confusing to me xD
I ended up updating the ggpk parser I wrote to work with the dat-schema file from here: https://github.com/poe-tool-dev/dat-schema
@rapid pagoda 3.16.3 notes that just dropped talks about "updates to how audio files are stored": https://www.pathofexile.com/forum/view-thread/3228816
oh boy, guess I get to find out what that means in 20 minutes…
…or, you know, however long it takes for the patch to come up
(patch is up now btw)
It's been so long since last time that I don't remember on which server my scripts are 😄
I still see files in Audio/Dialogue/NPC/. Maybe they were just changing FMOD stuff?
Quite possibly.
Ooh, they added Japanese DATs.
Font license suggests using https://en.wikipedia.org/wiki/M%2B_FONTS
Pretty much every FMOD bank has been touched.
I'm still curious what's going on there. Texture atlas getting repacked? Memory corruption?
Long term plan: get job at GGG, fix text bug, die happy.
It's interesting that the corruption always seems to swap characters around within a font. Never seen it display content from the wrong font, or other graphics
Kerning and largely deterministic character swaps.
I love how amounts in currency/essence tabs often become other digits.
7 instead of 1, 9 instead of 3, etc.
More than one miscrafted.
Possibly because digits are the only characters which typically get rendered for that font/size combination?
I'm imagining that there's some process that renders individual characters to textures on demand. Rendering out the entire font at once would be impractical for CJK fonts
https://poedb.tw/jp/ Japanese locale
PoEDB provides things come out each league, as well as items, uniques, skills and passives. Path of Exile Wiki editing functions.
@velvet fog I had completely forgotten that one can have pets in hideouts and as such am on the hunt for the .aoc files that correspond to them.
I can find the entries in BaseItemTypes.dat64 from the hash value in the .hideout file.
I can find the entries in Pet.dat64 from the BaseItemTypes row ID.
I can often find an .ot file by naively appending the extension to the string Id from Pet.dat64, but there's one pet that doesn't seem to have such a file (BIT Id Metadata/Items/Pets/ElderDarkseerPet, Pet Id Metadata/Pet/ElderDarkseer/ElderDarkseer, https://poedb.tw/us/Elder_Darkseer_Pet).
Do you know if that's the intended way to find an .ot file in general, or is there some mapping somewhere I'm missing, or is it just something that magically happens outside of client control?
Hmm, was that pet ever included in a release? Maybe that's why it's not there.
Also fairly lost on NPCs and things like stashes and other objects that inherit strange bases.
@compact isle and thoughts on: https://discordapp.com/channels/174993814845521922/175290321695932416/932097112248819742 ?
I don't see any reason for us to do that
@worthy cape I checked to see how I do the pets. When generating a directory of 3D models, I take the Id column from Pet.dat and just append .ao (.aoc should work too I think).
The NPCs are more complicated in my experience.
BaseItemTypes.dat:Id is not used for game path, Metadata/Items/Pets/ElderDarkseerPet should be correct but I don't know why it was missed
what jumps out at me about ElderDarkseerPet is that it's got the wrong icon -- as if it were copied from another row
This often holds but not always, the swarm pets have different bases for ao/aoc for example.
After a lot of hair tearing, the robust solution is to append .ot to the Pet.dat Id and look for animated_object entries recursively through the inheritance hierarchy.
I forget if recursion was needed for Pets but definitely needed for some of the hideout doodads that have no variations, as the meshes are defined in the .ot formed by HideoutDoodads.InheritsFrom.
Before I went to bed I had reached a point where all doodad and pets parsed out meshes and I had to update my .fmt parser as I only support version 4-7 and many are 8 by now.
Still quite behind on .smd too not to mention .tgm, but that’s a future headache.
On the missing pet, I hard assume it’s WIP that didn’t pan out.
Went on a great detour last night too misparsing the Demonic waypoint and map device as my data files were pre-release and had the wrong base 😄
I’m afraid to say this but I’m starting to think that Qt was probably the correct choice for UI now… https://cdn.discordapp.com/attachments/731706036804780095/935571093064916992/unknown.png
QGraphicsScene/View is just the right complexity for an editor view, at least on a more abstract detail level.
Yeah you're right. It looks like I append .ao since that works for most, but if the file isn't found I use the .ot instead.
.fmt v9 flips a lot of the format around by the way, multiple sections of indices and vertices.
Haven't looked at too many files, gonna be interesting to see what it does.
any idea why they use .fmt and .smd at the same time
My understanding is that .fmt is for fixed meshes while .smd is for skinned meshes. Primary difference is that .smd has a vertex format with bone weights for skeletal animations and a bit richer in what bonus sections it contains.
Having a specialized format for static meshes with less complexity is probably worth it for memory footprint and processing efficiency.
There's also the third geometry format, .tgm, again specialized to hold data particular to tiles (and passability?).
I have yet to figure out how and where heights and walkability are stored and derived.
As a partially parsed example, Art/Models/Terrain/Act3/Gardens/garden_path_v01_01_gardenpath01.fmt:
Between versions 6 and 9 it lost a bunch of initial header stuff around tri/vertex count but grew a second block of indices and vertices.
Haven't visualised the geometry so I don't know if it's the same or complementary, but it's odd that it has grown another set while still only having one shape name and one material path in the string section.
Once again I need to get some of my tooling rebuilt to actually do wider parser runs to find the interesting data files with odd header values and counts.
I really like these Rosetta stone files that show file format history over time for the "same" contents.
I would like to build something around this in the future too, I love the overlap between bioinformatics and reverse engineering: https://twitter.com/8051Enthusiast/status/1381955607364796418
This particular tool seems broken tho, sadly.
goal was to replicate web-browser behavior. Right now if I put this in my browser: https://www.pathofexile.com/trade/search/PUT_WHATEVER_I_WANT_HERE/85GqTV it works and redirects to https://www.pathofexile.com/trade/search/Scourge/85GqTV. (Exception being other legit league names like Hardcore, Standard, Hardcore%20Scourge.
However, that is not the behavior using the trade API. If I set the league name wrong it just returns an error using API.
Interesting note, at some point in time the vertex format for the tangent frame seems to have changed, they're biased by 128 from v6 to v9.
Probably explains why some of my lighting is inconsistent between meshes.
alternatively, you can do an api call to https://api.pathofexile.com/leagues?type=main&compact=1 and grab the league name, save it somewhere, and use it on the actual api call you want to use
Woo, I think I have mapped out the structure of v9 .fmt now for my sample files. It now makes sense why some things have moved around.
In case anyone missed it, some interesting insights into how More modifiers work: https://www.reddit.com/r/pathofexile/comments/scpbhq/and_then_we_tripled_it/huesey1/
wasnt this already known?
Why not work around this on your side? You know Standard & Hardcore are the two "fixed leagues" (= always existing), any other values are 99% likely (never seen an event trade league occur since I started doing tool development, but you never know...) to be the "temp leagues" (soft/hardcore). With this info you could easily retrieve the leagues list from PoE API (at regular intervals?), and parse keep/update your own mapping. Let your users choose "tmpleague" and internally map it to the correct league name when composing the PoE API url you'd like to access.
didnt the events in decemeber have trade?
🤔 maybe you're right on thatone though... I didn't play the events since I was done with the league back in november and didn't bother to look into the events in december. Even if it were the case, such events are unlikely to start at league launch anyway, so you could update league list frequently, but only update the internal mapping when you get exactly 4 leagues (and skip updating any other time). It's kinda dirty, but should work
Or you could also simply host your own leagues json (could use github/lab for this I think?) using "tmpstandard", and update that one manually every new league and have your tool periodically update its leagues list using your own hosted leagues json 😄
this is exactly what we were doing - filter fixed league keyword, and grab the first league id from the api. Events most of the time are at the bottom of the list so it's almost guaranteed to grab the league name this way. at least our code is working fine throughout last december
sample code of how it looks like
if (response.data instanceof Array)
for (const league of response.data)
if (!league.id.match('SSF|Standard|Hardcore|Royale'))
return league.id;
Will the new atlas passives be added to the API?

soo who's going to throw together a program for atlas passive planning
is it... Emmitt 
we should be releasing atlas tree data around mid next week (same format as regular tree, different art, not many surprises from a code perspective hopefully)
and passive tree data is out... now
https://github.com/grindinggear/skilltree-export/releases/tag/3.17.0
😮
pls give some energy to your favourite tool developers 
Weekend saved.
The Advanced Mod Descriptions of an item will now display the English name of base item types and Unique items when playing Path of Exile in languages other than English. 
Better and/or worse for APT, eh?
no change for me, I already can match-translate in both sides, but probably will stop work without update for people playing in russian...
All we need now is a window message or a special key like VK_F24 you could send to PoE to reliably trigger an advanced copy and all support requests will be gone.
I had to mute the Discord, took too much energy.
don't worry it will be gone soon, so people can spam in other tool-dev channels 😄
Oh hey, missed that news post. 
With all the changes in 3.17, the one that strikes me as oddest is removing a rare hideout-granting map from the rotation. I wonder if it was considered or just forgotten that they exist 😄
considering they forgot two pantheon map bosses last time...
😄 we shall see. If it is just the same format different stuff it would be pretty easy
I didn't realize people were using hard-coded values for the orbit index angle...
I think the 40 index one is already not a linear formula
40 index is every 10 degrees and every 15 degrees right?
Um, you don't need a linear formula
2 * Math.PI * orbitIndex / skillsPerOrbit[orbit] gives you the correct angle
thats linear, which is wrong (slightly)
he meant nonlinear
arnt the big wheels on the tree 40?
maybe I don't make the rules ¯_(ツ)_/¯
Anything fun for the trade site this league, or just more influences and bulk currencies to jam in everywhere?
monka2Years 
Are there ways to count the number of new/old influence types on an item?
deleting prophecies after I just added them to bulk exchange 
the angle will change with the number of nodes in the orbit. If I put the numbers from your table into that formula I get the correct results (in radians :D)
I think I might just be dumb right now, and I will figure it out later 😄
iirc for 40 its every 10 and 15 degrees
so 10, 15, 20, 30, 40, 45, 50, 60... etc
The fizzbuzz of orbits.
Oh, I see. The skillsPerOrbit are different for cluster jewels
Is that supposed to have 15?
yes
these new things aren't influences as such sooooo should be separate
Ah, nice. Might just be me confused about wording then.
they're more akin to synthesised items really
I think we're going with "Eldritch" as the keyword to describe them (sorry Elder)
erm to continue this and since we released lots of info:
- Class Restrictions exist now due that jewel so that's new
- Searing Exarch and Eater of Worlds mods have some internal jank to them which I don't think will be too much of a problem for tool devs hopefully... but will keep me busy until release

Was thinking about whether there were ranks, but that's already a thing for crafted mods I guess.
Does anyone have a link on the logic of how items are rolled?
Or the best guess the community has?
Turns out that three are removed, three are added, easy to forget about all the old master ones.
Warning: Massive Image, but here are the differences from 3.16
Discord doesn't like it, but it loads in a browser fine
all that to show 9 nodes?

Yeah, well, I am lazy and I didn't want to crop the output 😄
i hope we get the atlas passive tree sooner than later
i just want something i can hover for tooltips on, doesnt have to be a full on interactive planner thing
I doubt its finished, either nodes arent implemented or aren't final, otherwise they would give it now
i just hope the blight nodes are good
im a freak who likes blight 🙂
all blighted silos time 😎
cant wait for a year from now when they let me put jewels into the atlas passive tree
@empty patio
I'm still waiting for corruptable flasks


"Fermented"
POB devs, need a hand? Happy to help. Haven’t worked with Poe tools before though
oh heh, just realized that https://oriath.net/atlas/ is going to be basically irrelevant in 3.17 🙂
in rare cases potentially relevant to know what maps are what level at each stone I guess
like mfing
I wanted to be a good a guy and bump thread, but after some time they are frozen, so will 🔴 you here instead @compact isle https://www.pathofexile.com/forum/view-thread/3109852
all this league hype has me hype to try playing with API data
do eet
gotta brush up on my python for job stuff anyways, what better way than to play with my favorite game's API data
will the atlas tree end up in pob? i might've missed that talked about above
TBD, it's a bit off-scope for a build planner.
i figured as much, was just curious. some type of atlas planner would be neat but pob is more of a character builder
You'd be able to build it on the website right?
I get the feeling that after a few weeks into the league people will have a good idea what they want their tree to look like
yep that'll probably be the solution since the atlas tree is gonna be relatively static
by static i mean people figure out what they like and stick with that
My impression is that the website is a viewer, not necessarily a builder, much like the current tree.
(unless the current official web actually lets you plan trees already)
Yeah it does let you plan
input: league mechanic tierlist you like
output: optimized pathing graph
It does let you plan. It just doesn't do any calculations for you
If we bug Emmitt enough, maybe he'll put it into poeskilltree, which already has pathing algorithms
The problem is PoESkillTree is you can only have 1 tree loaded at a time. There isn't really any concept of switching trees, but maybe I can add that...
I will definitely put it up on the website though :)
is the atlas skill tree background image asset available?
Hmm it shouldn't be. I'll have to take a closer look.
Ah so in pob it shows up as linked for the others as well? It looks fine on the site.
We've made the background for the new Atlas Passive Skill Tree from the Siege of the Atlas expansion background available to download.
Yoink 👉https://t.co/EfZP9IXJit
1138
has planning, but no stat breakdown
seems like GGG headquarters are busy for league, waiting for oauth since last friday lmao
Spent all day doing this, finally working, pog (wanted to build this in JS)
https://i.imgur.com/ayVuTl8.png
(colors don't mean anything, just to know which stroke is from which part of the code)
Nice, are you using canvas or webgl?
Canvas (with fabric.js), I found more performances issues with webGL (could be the library I was using
)
Emmitt has a similar project https://github.com/EmmittJ/SkillTree_TypeScript
Didnt peek at this one, mostly his C# and POB's functions for rendering, but I'll take a look!
Could someone point me to the documentation on the trade api? All I can find is this https://www.pathofexile.com/developer/docs/reference which doesn't have anything about trade
#tooldev-general message
best you will get is https://poedb.tw/us/poe-api
Can anyone help me out with building a json for the trade api? Like, when searching for a +3 minion wand, would you put those two mods in the trade filters or stats? And would you refer to them by their mod ID or what?
you can just find that out yourself, open your browser, hit F12 and check what gets sent to the api
Isn't the common way to determine how the trade site works to look at requests/responses?
Or squint at third party tooling like APT or PoB.
Oh, I see. That should've been obvious, thanks
This one is mostly pixijs, but I really want to redo the architecture a bit. Also, I definitely don't use pixijs correctly lol the performance is kind of bad
I have pretty good performance with pixijs
just gotta render the curves "correctly"
it's really bad if you do it with a curved mask
speaking of performance, I spent the evening moving the logic from the renderer to the main process (using electron), so the main process would feed the renderer with data and the renderer gives updates to the main process (like "this node is allocated"...)
but I realised IPC doesn't do well with large objects (like the ~2400 nodes there's on the tree)
so I gave up and decided to manage states with Redux (everything is built in a react app, don't ask why)
Performance? I tried drawing a coordinate grid for the hideout editor last night.
80k line items apparently makes QGraphicsView a bit sluggish when all visible.
Gotta love when naive approaches don't work anymore and you have to think.
yeah, because when my stuff happened to me I was like "but how does vscode handle big files then ?!"
"it doesn't"
Large file viewing is a completely different domain from general purpose and expressive editors 😄
like, for a ~5000 keys object, despite using asynchronous communication, the renderer still freeze for ~10 seconds
it's already weird enough that async freezes the renderer 
but it's a known limitation
Just electron things
some people decided to run a small tcp server in both processes for communication, others built a small http server
why would main process boost performance? unless you mean using node c++ plugin
it wasn't truly about performance, I wanted to move the computation logic to the main process to lighten the renderer and to handle the state management there
ahh so you wanted to not block ui thread for cpu task, then better use worker threads in renderer. using main process is like getting only +1 thread 😄
actually I've never fiddled with worker threads yet, I might add this to the list
Yeah, I end up placing the curves correctly, but I go lazy on trimming the ends and just use a curved mask which is the issue.
Also, I don't use pixijs spritesheets and just create the textures adhoc. I just haven't gotten around to fixing any of the issues
the way I did it was, check how many curve parts I need (depending on angle, if > 90 = 2), and just clip the leftover on on eside with a simple triangle/quad mask
the curved mask has absolute dog water performance
I really gotta stop being lazy and make that renderer into a web component
I actually just use a graphics object with an arc as the mask lol https://github.com/EmmittJ/SkillTree_TypeScript/blob/df98d5eafbf12ba503187c2875b0e507e6431241/models/PIXISkillNodeRenderer.ts#L386
https://gist.github.com/Dav1dde/5374eb787912add1b939a235a60e7ea4 I think this is the part
feel free to yoink if it helps
iirc after fixing the arcs I hit stable 60 fps on my relatively old laptop
Ah, cool. I will have to look at it more, but the main difference I see is you create a render texture after the mask and what not. Also, I guess you only need a mask after the first rotation if there are 2 needed
mh I think I pasted you the wrong thing, it's a working one (my latest git commit), but I also had a version where I didnt draw an arc and masked it with a rectangle .. man I wish I finished the tree when I was still working/using it 😦
Might be the wrong channel for this, but is anyone aware of a way to both pull values from a PoB build file and input things into the custom modifiers through the file? I'm looking to write a program to automatically take values from the PoB and do some calculations to then apply that to the custom modifiers on the file itself, but I'm not sure if that is remotely possible.
Not sure what capabilities the headless PoB scripts have and how much you'd have to reimplement, but if you need it to actually process stuff and not just read the build XML, that's the route that I'd look into.
Many bots just go for passively reading stuff out of the XML that happens to be stored in a friendly fashion.
What kind of calculations are you looking to do? PoB would probably appreciate a PR to put those directly into the program instead of making a separate app for it 🙂
program to read xml and output more useful statistics
"custom modifiers" to me sounds like the pane of the Configuration pane where you can add any mod you like.
Anything that does actual computation and application kind of needs the actual engine, unless the only intent is to modify the XML to make it load differently in a proper PoB later.
Unfortunately I know next to nothing about Lua, but I'm just trying to dynamically get the accurate amount of fuses for burning arrow for personal use. The calculations for that with totem would just be attack rate * duration mod * totem count rounded down. Using that value you can then apply a custom modifier to your 1 fuse dps to get an accurate dps reading.
I honestly should have checked if they were readable xml first before asking haha. Couldn't find the build files before asking that, but it'd be to just load into PoB later rather than do any modification to the engine. Probably just going to write a python script for it that listens for me saving the file with any of the above values different if I can
Like Wires says, it might be something that might be more fruitful to do and contribute to PoB itself.
@velvet fog How do you gather modifiers like uncraftable Delve mods? Had someone notice that there's a mod that's not on CoE nor PoEDB, but is present in the river: https://www.pathofexile.com/trade/search/Scourge/RBn87nWh7
I would if I knew how to contribute in lua. I'll take a look at the files and see if I can find any that do special calcs like that to get an idea of how they do it
In other news, I've gotten FMT v9 somewhat sorted now but it's not in widespread use yet.
Most interesting part of it is that it has multiple separate geometry sections of possibly different triangle and vertex count, each of which has the usual shape division inside.
I suspect that they are LoD meshes, thus far I've only seen two levels, sometimes with the same polycount and sometimes halved.
Oh, I thought that the tagging was still there, but if it's all just detection based on zero-weight, I guess it's hard.
Probably want to start by looking here https://github.com/PathOfBuildingCommunity/PathOfBuilding/blob/dev/src/Data/Skills/act_dex.lua#L3233 Here is the tutorial page for adding/editing skills as well: https://github.com/PathOfBuildingCommunity/PathOfBuilding/blob/dev/docs/addingSkills.md#combined-data
anybody knows how to edit base dmg for spells in pob ?
a pain to do, but you can go to a file like act_int.lua, and change it there, the stat map tells you which numbers do what at what level, generally the first 2 are min damage and max damage using the formula
yeah i kinda got that far, but no clue what to change the numbers to to get the values, since its not just 371 -> 537 for min dmg..
See the example in the docs I posted right above your message
uuh, thats a pretty nice coincidence that you posted that just before :D
cheers, that worked
So we have a modern game engine with Tasks and ParallelFor.
Let's say it has PoB and fires task to calculate Node Power. It does this over a few frames.
Fair scheduling of frame time: my first idea is to measure one loop iteration in a task and not start the next one if it would exceed time limit for task.
Is this how engines work? Would you implement it that way? 
@worthy cape
Nice and easy question… gotta run but might leave some stuff thoughts later.
Was gonna look at the dat viewer on my phone while waiting for the döner. No go.
Bundle processing breaks on this Safari 😄
no simd in safari https://webassembly.org/roadmap/
but I didn't add touch and responsive support anyway
damn the last two days were tedious af, i spent the whole two days rebuilding everything 3 times
but now I ended up with web workers computing the tree, then storing everything in IndexedDB, and then telling the app it can start rendering the tree
but now i can properly store nodes and connectors updates and states
and performance is waaay better, fun fact I was wondering why it was lagging, ended up closing the dev tools, and no more freezing when moving the canvas
Someone just pointed me at this channel
I made https://moowiz-atlas-planner.fly.dev/ over the weekend
I also have a passive tree renderer written in JS which uses DOM elements to render the passive tree
Mostly wrote this to get something working for the atlas passives whenever GGG releases info
@drifting merlin you're working on something similar it seems?
holy fuck
i will call this boredom is the best motivator
but what is procrastination then
On measurement: in non-interactive lightweight task schedulers like TBB and HPX, bulk processing like regular and blocked parallel_for tends to run a few test items up-front to feel out the characteristics of the work and then partition it as it feels across a thread pool in chunks of good granularity.
For games and interactive simulation you have some fun with the main thread being fairly special when it comes to window/GPU thread affinity and the need to have parts of tasks execute briefly on that thread for things like allocating resources and submitting accelerator work.
A typical game engine, at least a bunch of years ago, tended to go for explicit declaration of dependency edges for a frame's tasks and the next frame, working off whatever is ready. Main thread might steal some work if there's time, but most of the time is fairly busy with submit.
Long-running amortized jobs are a bit weird and don't quite fit in well.
PoB has two kinds of concurrency, coroutines and subscripts. Coroutines are cooperatively scheduled and run piecemeal, subscripts run off-thread and have callbacks/fire-and-forget calls to the main thread.
On the specific problem here, it's more like the coroutines case where you want to run slivers of the tasks piecemeal to make some progress on them with temporary returns, or structure it into manual tasks to make it possible to run a predictable amount of it.
Also fun problems like "what if you don't have enough frame time left in your budget".
Suck too much and it's possible that you never make forward progress.
I used the image they released of the skill tree and semi-manually placed a bunch of notables
and put zone info about which clusters are related to what mechanics
yup
btw i found that the maven is not centered on the atlas background...
https://i.imgur.com/49aKFEe.jpeg
Horn arcs jilt a lot of people 😄
this is weird, my artwork is literally in 0,0
i took it from GGG's tweet from a few days ag
unless the scion's location isn't (0,0) ?
Yeah funny when each optional task has time only to run one iteration per frame 😄 I guess solution here is to have minimal required progress per frame, and if you hit 30fps lower settings.
I'm just exploring what concurrency languages like swift, kotlin, go offer and seems they do not allign with mind model I have for such soft real time stuff 😢 but good for writing backends 🤷♂️
@drifting merlin @livid mist do you guys have plans for any features beyond simple planning? i built a renderer a while back for fun and was planning to use it to build out some specific planning features that i'd like to see
but if y'all are planning to open source i would be happy to work together
I'm mostly just making this for the atlas tree
my plan is to make it display a plan that gets stored in the URL
and the UI will do a hacky summary of your stats
but other than that I don't have any plans
my code is terribly hacky but I can throw it on github at some point
yeah the stat summary will probably be real weird
how much dps does your atlas have

I'm not planning on doing any DPS stuff
or items
just passives
this is basically the end UI I'm planning on
maybe prettier though
I'm aiming at getting a low budget pob-like for atlas, as a standalone with basic features (save, load, import/export, calculations)
but I'm trying to build something easily maintainable and expandable
the first versions will probably be a bit messy though since I'm trying to get something working before friday
but my head is currently hurting in front of recursive node allocation
but definitely open-source yes, but I don't want to bother with git before everything is done
yeah of course
well good luck, i'll keep my eyes on the channel for updates
surprised you were able to do that with dom nodes without perf issues, pretty neat
yeah i had the exact same reaction when I opened the website and saw the dom
oh i didnt even realize theirs was dom-based too
oh you mean moowiz's tree, gotcha
yeah i mean
it seems to work
i'm just as surprised 🙂
to be fair, i don't have all the real art
so maybe that'll add more bad stuff but idk
I will try to support the atlas tree on: https://poeskilltree.com/
poeskillatlastree.com
no eta for atlas json file
"when it's done"
"When it's done, it's done."
it can be with enough money
poeatlas.tree
Yeah, and poeskill.tree would be cool haha
No way am I paying the 7k per quarter or whatever haha
google says as low as $225K up front, cheap
Gotta fight cabbage vendors for domains there too.
Yikes
How much is that in exalts?
and the cost of time travelling back to 2012 to submit the application
https://pathofbuilding.community really fell into place nicely
A powerful build planner for Path of Exile
Is craft of exile, when in true calculation mode, an actual true calculation? Craft of exile does some permutation/combination magic that I can't really remember how works, but I built a brute-force calculator that comes up with slightly different numbers. I'm not sure if his true calc isn't really true or if my code is off
my first blind guess would be that you aren't taking modifier groups into account
I am. It's a pretty minor difference (one result is .535% by CoE, and .529% by my math), but if I'm off I'd like to know where
I love unused nodes 😄
anyone have insight on which of these is correct for 3.17 regarding node orbit positioning? the one with evenly spaced nodes is from poeplanner and the other is from poeskilltree. seems like the orbit indices and the skillsPerOrbit changed in 3.17 which leads me to believe that the poeskilltree.com version is correct
Top image is the same way we have it looking in PoB, is also the same way it looks in game
I can summon him I guess
hi
@formal kraken
i've got a one simple nitpick with the pobb.in build preview. do you think it'd be possible to add in which gear slot are gems socketed?
psn in body armour, shield charge in main hand etc
yes for the most part, I just had no way to properly display it
if you have ideas on a design, I'll gladly take it
and if possible, show gem links without needing to enter pob?
I also want to hide offhand gems 😦
I'll have to check if link information is in PoB, I think pob has separate groups for links, so every group would be fully linked atm
it does
hm. nvm then
with the one weird caveat of gems grants by items are in their own group
still might be possible if the socketed information is properly selected
e.g. 2 groups socketed in boots
can you check for active/inactive skill groups?
and then list em based on this group
That is actually something I need to fix as well. Here are the orbit changes: https://github.com/grindinggear/skilltree-export/tree/master#3170
This is how I have been calculating the orbit angle for a long time now: 2 * Math.PI * SkillsPerOrbitIndex / SkillsPerOrbit[OrbitRadiiIndex] which is now wrong with the SkillsPerOrbit changes
yep it's not linear anymore
it was always wrong for 40, just by such small amounts it didnt matter
Yeah, I just have never implemented cluster jewels, so it didn't matter
fair
poor shadow still hasn't been fixed 😦
...now I'm never going to unsee this
It was like this in 3.16 as well haha
@drifting merlin I just pushed up a patch and should be live in a couple minutes: https://github.com/EmmittJ/SkillTree_TypeScript/commit/2fa356a67c577a872d882e1b5f96aa086a33dd6f
yea I did something similar, but I took pob's code and adapted it in js
Yeah, I assume they do something similar.
The official website does some recursive algorithm which is funny. That is what we used to do in the desktop version of poeskilltree
i spent the whole day trying to figure how PoB was so fast calculating the shortest path when allocating a node
it's so fucking clever
Isn't it just a BFS algorithm? I haven't actually looked at that code because it Just Works ™️
yep mostly, but the starting point is set to the latest node in the allocated tree and it's recomputed every time you allocate a node
i mean, every time you allocate a nodes it performs a BFS starting from that node so you know the path from that node to every other node on the tree
so next time you allocate a node, it already knows which path to take
Does it calculate all the paths to that node? I remember a feature that you could hold alt and scroll through the paths or something
I really need to update my shortest path. It takes like 60ms in the browser and is pretty noticeable
Yep, it looks like: https://github.com/PathOfBuildingCommunity/PathOfBuilding/blob/dev/src/Classes/PassiveSpec.lua#L582-L618
and BuildPathFromNode is called in BuildAllDependsAndPaths which itself is called by (and others) AllocNode
but yeah there's also if you hold shift you can trace your own path that will override the shortest one
@compact isle or anyone else who might know - is there a programmatic way to find out if the data here https://www.pathofexile.com/api/trade/data/stats has been updated? (without pulling it down and hash comparing... trying to determine if it needs to be pulled down in the first place).
what do you mean by updated? new stats appear there only when players put item in public stash tab, translations on already visible stats updated with client update
well, I'm trying to prevent 250k users pulling that file down locally at some frequency. I wanted to code in a way to determine that "it's been updated" before pulling it down to reduce stress on their servers
hmm my BFSs are taking too long 🤔
280ms on average
any web worker expert here ? I'm wondering if it's a better practice to terminate a worker once it's done (and create one when needed) or if I should create a kind of pool of workers that I reuse ?
imo you should limit yourself in web to one thread/worker and use Comlink library
you shouldn't need a web worker to do shortest path. It should be way faster than 280ms
these are entire tree traversals basically
This is basically a uniform cost search algorithm (dijkstra's for infinite graphs).
My BFS takes very little time
I haven't checked but it's never been an issue in my experience
I'm sure this is asked a lot, but how are desktop tools solving the PoE API Auth (OAuth IIRC) requirement? I'm thinking of tools like exilence next. are they proxying requests through a web api they host?
Kind of has to if it's to use OAuth.
yes, that's what I meant with OAuth
what a colossal waste of bandwidth and monetary burden 😦
no other creative solutions people have come up with?
You are not authorized to do anything else
Not sure what other decent ways there are to delegate granular permissions to third parties.
Like, you could build something around macarons or something, but it's an icky space.
The preferred delivery method of a PoE app is as a web app after all, an ecosystem in which OAuth fits quite well in.
Encouraging people to run third party apps on their own computers is a great way of getting rooted after all.
@compact isle some nodes on the Atlas Skill web-tree don't "do" anything
the tooltip displays, I can path through them, but they don't blue-illuminate
found the json 😄
yoinked the json
silently hardcoded in the page
the passive tree json is also in the page 😉
If someone is struggling with masteries:
It's basically an icon within each cluster that shows you other related ones when you hover over it. It's just a navigation aid.
cheers, passed it along
I'll do a JSON export on the github soon! Just been pre-occupied with the abomination you see before you 😅

as well as the various other abominations required for 3.17 
Would be interesting to see heat maps for the atlas tree a bit into the league, see how much people think the same.
I've had some feedback that the tree is a bit low contrast and hard to read.
gonna have some work to do on this one 😄
Most of my code apparently requires a class index for the starting node lol whoops
I have something basically working
yeah i just noticed
not sure why but i'll work on fixing it
It looks like the json they're using has incorrect min (and maybe max) values
or, hmm
should be fixed
@livid mist Seems to behave very strangely in my Firefox at 150% DPI.
Starts out sized somewhat oddly, and if I scroll it shrinks the tree and doesn't reveal more, dragging is erratic and the background is missing from the lower half.
yeah i only use 100% DPI
I can't deselect nodes either
Nice. Now my only issue currently is that the very top node is cut off
oh huh
I had the same problem on the left side but you fixed that earlier 🙂
Right side looks good though
sure, though most PoE apps currently run on people's comp as it's MUCH cheaper and simpler for the dev. But that goes away if you force the dev to have web api...
makes the barrier to entry very high, especially since GGG doesn't allow you to monetize any app that uses their API or assets
though they don't seem to police that much given there is a few out there doing so (like poe lurker)
if the legacy api disapeared tomorrow and forced OAuth I'd say more than half the tools people use would break
there has got to be a better way ><
That's kind of the point lol
which part?
While a cottage industry is neat, it's indeed hampered a bit.
anyways, sorry I didn't mean to start some big discussion, I'm just not super familiar with OAuth and was wondering if there was another way to get around the requirement then a proxy api you pay for, and if that was indeed what Exilence Next is doing (since IIRC they got hard banned off the legacy api)
The point is the barrier to entry is a bit higher than normal. It also allows GGG to see what apps are accessing what data. They can revoke that service at any point
@mortal bone they already do that via headers in the legacy API
Not everyone is nice enough to put the proper headers in
can you test again?
I see the primary purpose to be protecting end-user computers as well as restricting what a tool is allowed to do.
it should be working now
@mortal bone true, though they could put in browser reasonable rate limiting if you do not, which would force anyone to really do it.
I feel like the docs are super clear about the reasoning behind requiring a server...
This means that any distributed application (one that runs on a user's machine) will need to be backed by a secure server in order to keep your application credentials secret.
It's also only required for the initial token exchange. Afterwards the app can make requests from a PC with the access token
@compact isle fair enough, thanks for weighing in. I guess I just wish the dev didn't have to pay for cloud/web assets to keep it running, or had a way to offset that cost that worked better than patreon.
Background seems correct now. Sufficiently zoomed out (including default) zooms still has everything cut off on the right side. Zoom in enough and it fills the viewport.
Ooh, neat. Didn't know of the delegation part.
the alternative is no accountability which just makes things worse for everyone
@compact isle I didn't know about the access token delegation, that sounds like something better then just proxying all api requests! Thank you.
always happy to take feedback on the docs... which it seems I need to here
Cool. Yeah there's still stuff to fix but it roughly works now which is good.
"application credentials" = your client_id and client_secret, not the subsequent access_token's you get per account
well don't create work for yourself based on my question, I don't know OAuth at all really, but if more experienced people here also didn't know about that approach, maybe.
it's important that the docs are accessible 😄
I am trully happy that GGG provides an API at all, in whatever form. (something they are not required to do in any way). Just want to make My Cool Tool and not have to shell out money to keep it running ontop of my time 😦
plenty of free cloud services that can handle the requirements if you're not adverse to taking a look around
I recently learned about... Oracles free cloud offerings
getting there 😄
nice
I think you are correct. It is like double the height or something 😄
also, it looks like the background and atlas start should be full size not based on zoom level
Also, I love how all these images are part of a forum post somewhere 😄
the eldritch implicits (searing / eater of worlds) will have a filter option but not on release
(subject to change)
wizardry
anyone know if we have access to a zoom level 1 AtlasPassiveSkillScreenStart? the "Assets" are wrong in the json
wrong how?
also I yoinked a domain name: http://poeatlasplanner.com/ 😄
it looks really small
the rendering for the tree on the website isn't doing anything special
like the scale seems off
Ohhh, I see
I missed that the nodes are connected to the start node
I don't draw the connections on start nodes.
Yeah, there are little blue marks where the connections path through
The background is definitely the wrong scale though 😄
yeah the real scale was hefty levels of mbs
// The actual file dimensions are smaller so multiply by 2.8
oh wow 😄 that is a strange size
that means the anchor is all messed up too haha
@compact isle backgroundOverride is just changing which background gets drawn instead of calculating it based on orbits right?
yeah looks that way
close enough to push 😄
whoops...apparently backgroundOverride: 0 means don't override 😄
yep sorry for lack of information I wasn't too involved in the implementation this time around
team web together strong 💪
that fits much nicer than mine does lol
No worries. I have gone through releases with less 😄
webgl is nice 😄
https://poeskilltree.com/?v=3.17.0-atlas it's alive
nice
Yeah, the performance on the atlas tree is buttery smooth. The default tree is like ~20fps or something which is kinda sad
Fixed up a few things. It is looking alright now 🙂
Lol the reminder text normally has new lines in it to force wrapping
This one apparently doesn't
I need to work on my tooltips lol
I uhh
screenshotted the border things from in game
and then use them here lol
sorta hacky
i'm really surprised it looks as good as it does
You can download them from the passive tree page btw
yeah i realized that today lol
it's good enough for now
but i should probably
they're weirdly scaled
do we know how GGG feels about us downloading assets like that?
I assume they don't want us hot-linking to their assets?
That's how we've always gotten the tree assets for PoB
one download fine, hotlinking definitely not fine
I expect they have hotlinking protection already in place
The assets are all cached by the cdn, doubt they would even notice
@mortal bone it's lagging on my phone (pixel 6), you think there is a chance to improve mobile performance?
I have the same phone haha the performance is pretty ass...also apparently touch doesn't work anymore.
I could render at a lower zoom level on mobile devices
That would help a ton
You can allocate nodes but yeah pretty limited with touch
Wonder why performance is so bad, it must be not hw accelerated
chrome://gpu says it is hw accelerated mh
Maybe it just needs proper culling
So which one of the moowiz' or emmitt's tree planner's passive count is correct? Moo has 121pts Emmi 128pts
official has 128
121 is normal passive tree without bandit points
@mortal bone first thing I tried was comparing the tree against a passive skill tree. Mobile browser fell over a few times 😄
@mortal bone you're constantly rendering the tree, you should only render when there is interaction with the tree
Had someone wonder why his CPU fan was going bananas 
private _tick(): void {
const newTime = Date.now();
let deltaTime = newTime - this._lastTick;
this._lastTick = newTime;
if (deltaTime < 0) {
deltaTime = 0;
}
if (deltaTime > 1000) {
deltaTime = 1000;
}
this.viewport.update(deltaTime);
if (this._dirty || this.viewport.dirty) {
this._app.render();
this._dirty = this.viewport.dirty = false;
}
requestAnimationFrame(() => this._tick());
}
}
that's in my tree
you still request animation frames, but you just don't render if the tree isn't "dirty"
yeah but hey, it hit constant 120 fps ^^
I'm having issues lining up the background image with my rendered tree
how are you supposed to match them up?
oh, missed the scale factor from earlier
My last 2 brain cells (1.5 probably) is not clever enough to implement this rate limits in Python, can anyone help from DM or somewhere?
We haven't tested it out a whole lot, but it seems to implement the rate limits correctly from what i've seen
Stealing your code, thanks!
shit, 30 max hit in 300 period is too much? (X-Rate-Limit-Account: 15:10:60,30:300:300)
hehe I think there is a bugged node @mortal bone at the delirium cluster
its on gggs side not his
oh
The points are now part of the tree :) so it is 128
The 3.17 megathread on reddit says: "Points: 117 from maps, 11 from Maven, 4 from final bosses"
Is that inaccurate?
Yeah, I need to fix that. I am using a plugin called pixi-viewport and the ticket is always going off
I am using the same!
this.viewport = new Viewport({
interaction: this._app.renderer.plugins.interaction,
stopPropagation: true,
noTicker: true
});
the noTicker is the important part
Ah, I might steal your code there haha
yeah go for it
I was thinking about noTicker just wasn't sure the interactions would get messed up
basically just initializing the viewport that way with the tick function from above and on every interaction with the tree I mark the renderer dirty to force a new frame
I only render things when they change but that ticker is annoying
so I have a bunch of markDirty()'s around, for window resize, mouse over, etc. (viewport can mark itself as dirty)
from the data, so there's some change then
Maybe only 7 from maven and 4 from the final?
Dear tree planner devs, include this somewhere on plain sight
The issue is that its "wrong" though, and we're probably not sure ones actually give the bonus, because its only 128 points, and 128-117=11 points bonus
Yeah, I can pretty easily implement that. Doesn't pixi have a dirty flag on the renderer though?
not that I am aware, but definitely possible
doesn't look like it: https://pixijs.download/dev/docs/PIXI.Renderer.html
Ah, there are various other dirty flags like Sprites and Graphics. I thought the renderer had one as well whoops
mh?
this should be vsync'ed with requestAnimationFrame
I just had to stop 2 tickers in order to prevent them from rendering the renderer
PIXI.Ticker.shared.stop();
PIXI.Ticker.system.stop();
this._app = new Application({autoStart: false, ...options}); does this work?
autoStart: false
@compact isle Any ETA on currency / base type changes?
I just set it to use the shared ticker then stopped it 😄 I probably could have done autoStart: false...
I just yeeted time.sleep()
I hope soon, I am not at home on Friday so I have to update everything before that. Or just hope nothing breaks lol.
Wrote a quick script that generates the smallest atlas tree that goes to specified nodes if anyone is interested. https://gist.github.com/tuvangezer/fff8637ff4a83493cd8ba40c64f55632
Uses some approximations so it is not guaranteed to be optimal but it is nearly optimal. (its essentially the traveling salesman problem)
I don't know if this is the right channel, but I was wondering if there was a way to extract the background of Maven and the Exarch and Eater from the new Atlas Passive Tree. I went mucking around in the CSS on the website with inspect element, and there doesn't seem to be an "easy" way to do it.
Amazing. Thank you.
Oh that's neat! I had assumed calculating that tree was too slow to be feasible but I guess I was wrong! If I have time I'll probably implement that in my planner
Cool, FYI the mathematical problem is https://en.wikipedia.org/wiki/Steiner_tree_problem some languages have libraries with approximate steiner tree calculation I used one of those so it was just one function call
implemented the hover for masteries 🙂
btw can you imrpove text rendering to not be blurry?
how do you mean? sorry
when you zoom in tree you can clearly see that it doesnt use subpixel font rendering, I guess because pixi uses webgl instead of canvas api
Oh, I see what you mean. I think that is because I am scaling the tooltip based on the screen space and the device pixel ratio
const scaleX = tooltip.width / bounds.width / devicePixelRatio;
const scaleY = tooltip.height / bounds.height / devicePixelRatio;
devicePixelRatio = 1 🥲
Yeah, but the tooltip is scaled based on the width of the viewable area 😄
@civic crane is this any better?
this is still grayscale antialiasing but at least it's not blurry 👍
blue (selected) / teal (search) are difficult to differentiate, maybe a different color for search
Yeah, I think I will need to switch to sdf text because webgl
Emmitt, thanks for the atlas addition. not being able to enable all nodes leading to a target on the official site is big oof. anyways... i appreciate you :3
Yeah, no problem 🙂
I found another one! https://pathofatlas.com/
Path of Exile Atlas tree building tool
That one feels like they ripped the official planner lol
The author forgot to remove sourcemaps
it's actually some react framework for <canvas> (not a fan)
How do you mean?
The official planner? Or the GGG passive tree on their website
also why does everyone start with canvas? Do they assume it won't work with regular elements?
the website you linked
Emmitt's tree has best performance (as official one), for me it misses max zoom limit and no textures antialiasing (same issue in pob)
I would love to continue work on a better PoB renderer past the ANGLE prototype, but there's way too much stuff to do everywhere.
uh you mean item filter info? Should be today
Awesome. Thanks.
here is another atlas planner https://poeplanner.com/atlas-tree 😛
Works on mobile, nice
I like the passive point swinging when you look at the allocated stats
do any of the planners have a list of allocated stats yet?
you might want to make a redirect from https://poeplanner.com/atlas-tree/ to https://poeplanner.com/atlas-tree because the former 404s
Yeah I noticed, will fix it soon
I really don't want to do this because then you end up having to add more and more features 😄
yeah probably a lot of work
It isn't the amount of work just the requests for more work 😄 everyone wants things to work like POB
I strongly recommend never having users.
Lol
oh I guess some folks didn't see but the atlas .JSON export was updated to fix all that node jazz yesterday: https://github.com/grindinggear/skilltree-export/tree/atlas
Oh nice
I don't mind doing it for actual users 😄 it just isn't really what I have envisioned for the site
One thing that I've seen people desire from these is shortened links.
I wonder if one could implement a tree minimap in the embed 
(coming up with features is way more fun when I don't have to implement them)
I would love to do a tree minimap that would be cool. That was kind of the original idea of the project. Just have a nice way to view trees without much else
For an embed though you need to sever side render the tree or at least the embed preview
You could do a cool shortener + embed
seems like not all is fixed, at least the node nest to Call of Xesht-Ula seems wrong https://www.pathofexile.com/fullscreen-atlas-skill-tree/AAAABgAACTpGU2FWalrJZX19Pq7nsy3jcAAA
ah nice find I'll pass it along again
implemented culling, so performance should be a lot better on small devices
doesn't look great but we got stats 😄
Next up your users will ask you to calculate the final values. One step further into PoB territory 😉
That is the plan, I just haven't implemented attribute parsing haha you can get pretty far with a generic regex replace/calculate/replace
As long as I remember I'll unpin that on launch
asset links in the new JSON will give 404s until launch though right?
That's how I'm calculating the stats in my app
