#tooldev-general

1 messages · Page 135 of 1

worthy cape
worthy cape
#

pool's closed.

simple ravine
#

Or rather... Why are you like this, Python -.-

frank drift
#

oh man that brings back memories of all the fiddly windows version checks one program I worked on had

silent tree
#

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

civic crane
silent tree
#

ta

#

been a while since having to mess with those lol

worthy cape
#

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.

golden bane
#

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":
    ...
simple ravine
worthy cape
#

I don't trust anything that's under the Apache Foundation umbrella.

#

That's where software goes to die.

simple ravine
#

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

worthy cape
#

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.

simple ravine
#

I guess there are a couple of exceptions that confirms the rule

worthy cape
#

Spotify intentionally avoided Apache for their Luigi pipeline software, as they felt it'd be a net negative.

simple ravine
#

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

cursive haven
#

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!

worthy cape
#

Fairly topical 🙂

cursive haven
#

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

worthy cape
#

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

cursive haven
#

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

hazy fiber
cursive haven
#

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?

hazy fiber
# cursive haven is that through the API? so it should be easy for me to pull the ladder, parse b...

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

cursive haven
#

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?

cursive haven
#

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

velvet fog
#

there are 3 ways to access the ladder

cursive haven
#

I see the Type Definitions section has some stuff about jewels so I'm trying to understand what it means.

velvet fog
cursive haven
#

I see Character and ItemJewelData, I assume that's the info I'll want.

velvet fog
cursive haven
#

Thanks, this should be a good start!

velvet fog
graceful ember
#

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.

silent tree
#

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

worthy cape
#

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.

silent tree
#

i'm assuming chuanhsing does it manually otherwise a quest wouldn't have fallen off

worthy cape
#

@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.

silent tree
#

god damnit i was just typing about that

#

table looking like a flag

golden bane
#

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)?

velvet fog
#

ggg removed quest vendor rewards years ago to prevent data mining, it's manual edited

worthy cape
#

Ah, I thought there was a bit of resurgence this league with new DATs, but I haven't actually looked at their format 😄

worthy cape
#

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.

velvet fog
worthy cape
#

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"

worthy cape
#

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.

simple ravine
#

What worries me when I hear discussions like this around Go is... Kubernetes is built with Go. It's kind of a defacto standard

gilded tree
#

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 😦

rapid pagoda
gilded tree
formal kraken
#

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?

worthy cape
#

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.

formal kraken
#

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)

civic crane
#

awakened poe trade does this so shrugR

formal kraken
#

Maybe I'll have to look throught the ggpk try to extract the assets and host them myself, but that seems very tedious

formal kraken
worthy cape
#

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?

formal kraken
formal kraken
worthy cape
#

@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.

civic crane
#

haha, yeah I know, it's special folder as well as Art, but fix is not the same 😄

worthy cape
formal kraken
#

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 😦

worthy cape
#

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.

formal kraken
#

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) 😦

worthy cape
formal kraken
#

oh nice

#

that helps a lot

worthy cape
#

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.

formal kraken
#

even if I cant use it directly, helps a lot to have something I can use as a reference

worthy cape
#

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.

formal kraken
#

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

worthy cape
#

I'm still building my personal data delivery service tho, so can't really let you at that.

formal kraken
#

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)

golden bane
#

@formal kraken If you go the Rust route, remember to use an arena allocator for any tree data structure stuff

formal kraken
#

I was thinking of mmap'ing the entire thing

#

not sure if that actually works (compression?)

golden bane
#

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

worthy cape
#

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.

golden bane
#

It's about ~50k GGPK records and ~700k bundle files currently

formal kraken
#

but yeah I dont know enough about the format to say anything competent, just guessing

worthy cape
#

@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 😛

golden bane
#

Kernel, huh.... I wish Windows supported mmap.madvise()

formal kraken
#

oh yeah, I wouldn't care about Windows ^^

worthy cape
golden bane
#

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

worthy cape
#

@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.

formal kraken
#

ah, so that was the "fix" to make steam updates not patch forever

golden bane
#

Yeah

formal kraken
golden bane
#

The bundles have FNV-1a hashed path names

formal kraken
#

oh I see

#

I thought it was an optimization somewhere in your code

golden bane
#

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)

formal kraken
#

I've had very good results with replacing std HashMap with FxHashMap in my AoC this year

golden bane
#

Curiously, there isn't a maintained native FNV library currently for Python, so I had to use one from Rust

odd sail
#

has anyone here successfully issued trade api requests that specified a sorting other than price ascending?

civic crane
#

how is this different from usual cycle: wonder about new filter, look what browser sends, send same thing yourself.

odd sail
#

@civic crane as 👆 said, it seems to be ignored in API query string (perhaps @compact isle can confirm / fix when vacation ends)

civic crane
#

@odd sail you can paste url here 🙂

odd sail
#

At work currently… so can’t. Later sure

#

Curious what it specifies for weighted sum sorting

twilit field
#

are u allowed to make skin changers?

carmine merlin
#

@compact isle I wanted to ask some questions about the trade website in DMs if you're free

compact isle
#

this has practically been my day so far: notify

twilit field
#

@compact isle are skin changers allowed

civic crane
#

@twilit field I think you're talking about Minecraft?

twilit field
#

no. I do this in league of legends

civic crane
#

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

frank drift
compact isle
#

we probably should (via the query string method) though ¯_(ツ)_/¯

odd sail
#

@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

compact isle
odd sail
#

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

odd sail
#

@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.

compact isle
#

it's not something public and can change when mods / stats become legacy

odd sail
#

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

compact isle
#

unfortunately the text you see is only loosely related to stats >_>

candid ridge
#

another one bites the dust 😦

grave wren
#

Aw rip

golden bane
#

Maybe they just forgot to renew it. I know I do from time to time

frank drift
#

no autorenew?

hushed relic
#

Noo

#

I liked poe-profile

formal kraken
#

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

carmine merlin
#

You could extract them from the game files in high res

formal kraken
#

yeah, I guess I have to look at that soon, thanks

carmine merlin
#

@mortal bone was looking into grabbing 4K assets a couple months ago for the skill tree. Might be able to help you

mortal bone
#

@formal kraken those images are in Art/2DArt/UImages/Common and Art/2DArt/UImages/Common/4K. They are all the Icon*.png files

formal kraken
#

awesome, thanks

mortal bone
#

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

formal kraken
#

aight, the 181x141 should be big enough, I just want a higher res thumbnail

odd sail
#

@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
worthy cape
#

There were overlapping events this December, wasn't there?

odd sail
#

yep

#

so perhaps the events need specific name

frank drift
#

matching the behavior of the website seems reasonable

formal kraken
#

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

grave wren
#

Can you share the full XML?

formal kraken
#

yeah, 1 sec

formal kraken
grave wren
#

tried to do a more minimal example with an empty build and cwc cyclone firestorm

#

and only mainActiveSkillchanges depending on what skill is selected

formal kraken
#

the problem is, it only changes to 1 and 2, even if FR is the last in the socket group

grave wren
#

ah

#

it only indexes active skills so i guess you need to filter the supports

formal kraken
#

[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

grave wren
#

in my bot i use the following

formal kraken
#

I guess filtering on "support" suffix could use

worthy cape
#

At some point, it might make more sense to look into augmenting PoB itself with the ability to select things.

grave wren
#
    def determine_active(self):
        return False if not self.id else "Support".lower() not in self.id.lower()
worthy cape
#

Rather than relying on implementation detail.

formal kraken
grave wren
#

i mean it is an actual format just very specific :p

formal kraken
worthy cape
#

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.

grave wren
#

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

formal kraken
#

@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

formal kraken
grave wren
#

welcome

#

headless client is way more resources tho zao

#

i dont know if that is suitable for real time parsing/querying

#

well "real time"

worthy cape
#

Ah, I understood the original desire to be to change the entry to refer to a different skill, not offline interpretation of the XML.

golden bane
#

I'd be interested to add interfacing with headless PoB to pobapi. Just never got around to do it. PRs are welcome 😄

odd sail
#

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.

formal kraken
#

Yes

#

It's very useful for displaying a summary of the pob

odd sail
#

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.

formal kraken
#

(e.g. the pob preview bot on the subreddit depends on it)

odd sail
#

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 },
formal kraken
odd sail
#

@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

formal kraken
#

I dont have an XML at hand right now, but is it actually repeated 3 times in the XML?

#

nvm, that answers it

grave wren
frank drift
#

opening a new window is fine, some/most price checking tools already do that

formal kraken
#

Mh this is interesting, so that probably means I cannot embed the tree as iframe?

worthy cape
#

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.

rapid pagoda
#

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

primal schooner
#

Anybody w/ JS / React / Laravell skills interested in working on a POE project?

frank drift
#

what sort of project?

primal schooner
#

website driven Trade platform

frank drift
#

might want to implement https for starters

worthy cape
#

I managed to provoke a rather surprising bug with a local httpd today. I ran out of ports doing bulk downloads 😄

frank drift
#

nice achievement

worthy cape
#

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.

primal schooner
#

it's just a concept site.

frank drift
primal schooner
#

it's just to illustrate concept

#

i'll get certs if I move the site to production

primal schooner
#

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

formal kraken
#

@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

slim pilot
#

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

civic crane
#

@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

oak estuary
#

There's only 9 listed and one of them is listed for 2 mirrors

slim pilot
#

oh.

#

i thought it was 60c...

#

wait 20 23 is expensive.

#

yeah this works.

#

thanks guys.

oak estuary
#

60c is probably what you'd pay, but ninja does an average (with some fuzzing so people can't game it, I believe)

slim pilot
#

I will use this anyway lol.

oak estuary
#

But yeah if there's only a few listed it's not going to be super accurate

slim pilot
#

the real challenge will be

#

getting every skill gem prices from level 1 to 20

#

seems headache i will delete skill gem from code

grizzled seal
slim pilot
#

and guys one more and final stupid question I need to mail there to get a client ID right? thanks

frank drift
#

another Dark Souls 3 RCE

worthy cape
#

Gotta love taking console security to the desktop.

frank drift
#

interpreting arbitrary user-supplied strings, brilliant

worthy cape
#

Saw some unsubstantiated claims about one, but no details.

frank drift
#

already happened once so I'm willing to believe it

#

there's vods from at least 3 streamers of it supposedly happening

worthy cape
#

Yeah, not doubting it exists.

civic crane
#

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% ? 🤔

night nexus
#

do divination scarabs work for delirium rewards ?

worthy cape
#

You're probably looking for a general chat, not tooldev.

night nexus
#

sorry

#

didn't see

#

must've missclicked

gray forum
worthy cape
#

For someone living under a rock and which can’t open the website due to https shenanigans on mobile, what is it? 🙂

frank drift
#

was a site for buying/selling harvest crafts

frank drift
formal kraken
#

Is there a PoB specific discord?

carmine merlin
formal kraken
carmine merlin
#

haha, we had also kinda been working on something like that in the past but it was in very early stages afaik

formal kraken
#

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)

carmine merlin
formal kraken
#

thanks, joined

slim pilot
#

oh it is TFT services fetcher i guess

#

still repos seemed confusing to me xD

mortal bone
worthy cape
rapid pagoda
rapid pagoda
#

…or, you know, however long it takes for the patch to come up

#

(patch is up now btw)

worthy cape
#

It's been so long since last time that I don't remember on which server my scripts are 😄

rapid pagoda
#

I still see files in Audio/Dialogue/NPC/. Maybe they were just changing FMOD stuff?

worthy cape
#

Quite possibly.

#

Ooh, they added Japanese DATs.

#

Pretty much every FMOD bank has been touched.

frank drift
#

wonder if they finally fixed the text corruption bug

#

10 years later

rapid pagoda
#

I'm still curious what's going on there. Texture atlas getting repacked? Memory corruption?

worthy cape
#

Long term plan: get job at GGG, fix text bug, die happy.

rapid pagoda
#

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

worthy cape
#

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.

rapid pagoda
#

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

velvet fog
worthy cape
#

@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.

worthy cape
#

Also fairly lost on NPCs and things like stashes and other objects that inherit strange bases.

odd sail
compact isle
#

I don't see any reason for us to do that

swift beacon
#

@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.

velvet fog
#

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

rapid pagoda
#

what jumps out at me about ElderDarkseerPet is that it's got the wrong icon -- as if it were copied from another row

worthy cape
#

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 😄

#

QGraphicsScene/View is just the right complexity for an editor view, at least on a more abstract detail level.

swift beacon
worthy cape
#

.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.

velvet fog
#

any idea why they use .fmt and .smd at the same time

worthy cape
#

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.

#

This particular tool seems broken tho, sadly.

odd sail
# compact isle I don't see any reason for us to do that

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.

compact isle
#

we don't have any concept of "tmpstandard" etc

#

that's up to you to provide

worthy cape
#

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.

drowsy narwhal
worthy cape
#

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.

rapid pagoda
timber path
# odd sail goal was to replicate web-browser behavior. Right now if I put this in my browse...

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.

hazy fiber
timber path
# hazy fiber 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 😄

drowsy narwhal
#

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;
fluid wave
#

Will the new atlas passives be added to the API?

compact isle
#

yep (for OAuth)

#

and have tree support on the website

hazy fog
#

soo who's going to throw together a program for atlas passive planning

#

is it... Emmitt PauseChamp

compact isle
#

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)

cursive haven
#

😮

compact isle
#

pls give some energy to your favourite tool developers altBlessA

worthy cape
#

Weekend saved.

civic crane
#

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. chaosthinking

worthy cape
#

Better and/or worse for APT, eh?

civic crane
#

no change for me, I already can match-translate in both sides, but probably will stop work without update for people playing in russian...

worthy cape
#

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.

civic crane
#

don't worry it will be gone soon, so people can spam in other tool-dev channels 😄

worthy cape
#

Oh hey, missed that news post. WokeOrb

#

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 😄

frank drift
#

considering they forgot two pantheon map bosses last time...

mortal bone
#

I didn't realize people were using hard-coded values for the orbit index angle...

compact isle
#

I think the 40 index one is already not a linear formula

hazy fiber
#

40 index is every 10 degrees and every 15 degrees right?

mortal bone
#

Um, you don't need a linear formula

#

2 * Math.PI * orbitIndex / skillsPerOrbit[orbit] gives you the correct angle

compact isle
#

not for orbits with 40 and now 16 nodes

#

(40 is exclusively cluster jewels IIRC?)

hazy fiber
frank drift
#

he meant nonlinear

hazy fiber
compact isle
#

maybe I don't make the rules ¯_(ツ)_/¯

worthy cape
#

Anything fun for the trade site this league, or just more influences and bulk currencies to jam in everywhere?

compact isle
#

monka2Years monkaW

worthy cape
#

Are there ways to count the number of new/old influence types on an item?

compact isle
mortal bone
#

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 😄

hazy fiber
worthy cape
#

The fizzbuzz of orbits.

mortal bone
#

Oh, I see. The skillsPerOrbit are different for cluster jewels

worthy cape
hazy fiber
#

yes

compact isle
worthy cape
#

Ah, nice. Might just be me confused about wording then.

compact isle
#

they're more akin to synthesised items really

#

I think we're going with "Eldritch" as the keyword to describe them (sorry Elder)

compact isle
worthy cape
#

Was thinking about whether there were ranks, but that's already a thing for crafted mods I guess.

stoic mason
#

Does anyone have a link on the logic of how items are rolled?

#

Or the best guess the community has?

mortal bone
#

3.17.0 is up 🙂

worthy cape
mortal bone
#

Warning: Massive Image, but here are the differences from 3.16

clear pulsar
#

Discord doesn't like it, but it loads in a browser fine

hazy fog
mortal bone
#

Yeah, well, I am lazy and I didn't want to crop the output 😄

empty patio
#

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

hazy fiber
empty patio
#

i just hope the blight nodes are good

#

im a freak who likes blight 🙂

#

all blighted silos time 😎

hazy fiber
#

cant wait for a year from now when they let me put jewels into the atlas passive tree

stoic mason
hazy fog
empty patio
rapid pagoda
safe pulsar
#

POB devs, need a hand? Happy to help. Haven’t worked with Poe tools before though

rapid pagoda
frank drift
#

in rare cases potentially relevant to know what maps are what level at each stone I guess

#

like mfing

civic crane
cursive haven
#

all this league hype has me hype to try playing with API data

worthy cape
#

do eet

cursive haven
#

gotta brush up on my python for job stuff anyways, what better way than to play with my favorite game's API data

cursive haven
#

will the atlas tree end up in pob? i might've missed that talked about above

worthy cape
#

TBD, it's a bit off-scope for a build planner.

cursive haven
#

i figured as much, was just curious. some type of atlas planner would be neat but pob is more of a character builder

carmine merlin
#

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

cursive haven
#

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

worthy cape
#

(unless the current official web actually lets you plan trees already)

carmine merlin
#

Yeah it does let you plan

civic crane
#

input: league mechanic tierlist you like
output: optimized pathing graph

golden bane
dull roost
mortal bone
#

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 :)

snow whale
#

is the atlas skill tree background image asset available?

fickle yew
#

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.

rapid pagoda
dense shore
slim pilot
#

seems like GGG headquarters are busy for league, waiting for oauth since last friday lmao

drifting merlin
#

(colors don't mean anything, just to know which stroke is from which part of the code)

mortal bone
#

Nice, are you using canvas or webgl?

drifting merlin
velvet fog
drifting merlin
#

Didnt peek at this one, mostly his C# and POB's functions for rendering, but I'll take a look!

stoic mason
stoic mason
#

Yeah I found that, but it doesn't have much in the way of parameters

#

Thanks though

stoic mason
#

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?

formal kraken
#

you can just find that out yourself, open your browser, hit F12 and check what gets sent to the api

worthy cape
#

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.

stoic mason
#

Oh, I see. That should've been obvious, thanks

mortal bone
formal kraken
#

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

drifting merlin
#

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)

worthy cape
#

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.

drifting merlin
#

yeah, because when my stuff happened to me I was like "but how does vscode handle big files then ?!"

worthy cape
#

"it doesn't"

#

Large file viewing is a completely different domain from general purpose and expressive editors 😄

drifting merlin
#

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 shrugR

#

but it's a known limitation

formal kraken
#

Just electron things

drifting merlin
#

some people decided to run a small tcp server in both processes for communication, others built a small http server

civic crane
drifting merlin
civic crane
#

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 😄

drifting merlin
#

actually I've never fiddled with worker threads yet, I might add this to the list

mortal bone
# formal kraken it's really bad if you do it with a curved mask

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

formal kraken
#

the curved mask has absolute dog water performance

#

I really gotta stop being lazy and make that renderer into a web component

mortal bone
formal kraken
#

feel free to yoink if it helps

#

iirc after fixing the arcs I hit stable 60 fps on my relatively old laptop

mortal bone
#

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

formal kraken
#

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 😦

glad plaza
#

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.

worthy cape
#

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.

oak estuary
velvet fog
#

program to read xml and output more useful statistics

worthy cape
#

"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.

glad plaza
#

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

worthy cape
#

Like Wires says, it might be something that might be more fruitful to do and contribute to PoB itself.

glad plaza
#

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

velvet fog
#

manual edit mod list

#

ggg removed all delve and incursion tags and weights

worthy cape
#

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.

worthy cape
ebon oasis
#

anybody knows how to edit base dmg for spells in pob ?

hazy fiber
ebon oasis
#

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..

oak estuary
#

See the example in the docs I posted right above your message

ebon oasis
#

uuh, thats a pretty nice coincidence that you posted that just before :D

ebon oasis
#

cheers, that worked

civic crane
#

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? chrisThinking
@worthy cape

worthy cape
#

Nice and easy question… gotta run but might leave some stuff thoughts later.

worthy cape
#

Was gonna look at the dat viewer on my phone while waiting for the döner. No go.

#

Bundle processing breaks on this Safari 😄

civic crane
drifting merlin
#

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

livid mist
#

Someone just pointed me at this channel

#

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?

drifting merlin
#

yep!

#

didnt know the atlas json was out 😮

livid mist
#

it's not

#

my first version is basically manually made

drifting merlin
#

you mean you imagined a skill tree ?

#

with teased stuff ?

slim pilot
#

holy fuck

slim pilot
dense shore
#

but what is procrastination then

worthy cape
# civic crane So we have a modern game engine with Tasks and ParallelFor. Let's say it has PoB...

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.

livid mist
#

and put zone info about which clusters are related to what mechanics

drifting merlin
worthy cape
#

Horn arcs jilt a lot of people 😄

drifting merlin
#

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) ?

civic crane
# worthy cape Also fun problems like "what if you don't have enough frame time left in your bu...

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 🤷‍♂️

pastel marten
#

@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

livid mist
#

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

pastel marten
#

yeah the stat summary will probably be real weird

#

how much dps does your atlas have

livid mist
#

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

drifting merlin
#

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

pastel marten
#

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

drifting merlin
#

yeah i had the exact same reaction when I opened the website and saw the dom

pastel marten
#

oh i didnt even realize theirs was dom-based too

#

oh you mean moowiz's tree, gotcha

livid mist
#

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

mortal bone
frank drift
velvet fog
#

no eta for atlas json file

frank drift
#

"when it's done"

velvet fog
#

"When it's done, it's done."

mortal bone
#

Haha maybe I have to buy another domain

#

I really wish .tree was a TLD

frank drift
#

it can be with enough money

velvet fog
#

poeatlas.tree

mortal bone
#

Yeah, and poeskill.tree would be cool haha

mortal bone
frank drift
#

google says as low as $225K up front, cheap

worthy cape
#

Gotta fight cabbage vendors for domains there too.

mortal bone
#

Yikes

carmine merlin
#

How much is that in exalts?

frank drift
#

31500 apparently

#

or about 57 mirrors

rapid pagoda
golden bane
stoic mason
#

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

rapid pagoda
stoic mason
#

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

mortal bone
#

I love unused nodes 😄

snow whale
#

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

carmine merlin
molten hatch
hazy fiber
#

I can summon him I guess

formal kraken
hazy fiber
#

@formal kraken

molten hatch
#

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

formal kraken
#

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

molten hatch
#

and if possible, show gem links without needing to enter pob?

formal kraken
#

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

hazy fiber
#

it does

molten hatch
#

hm. nvm then

hazy fiber
#

with the one weird caveat of gems grants by items are in their own group

formal kraken
#

still might be possible if the socketed information is properly selected

#

e.g. 2 groups socketed in boots

molten hatch
#

can you check for active/inactive skill groups?

#

and then list em based on this group

formal kraken
#

I'll see if pob has the info

#

but I fear this might blow up the list even more

molten hatch
mortal bone
#

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

drifting merlin
#

yep it's not linear anymore

hazy fiber
mortal bone
#

Yeah, I just have never implemented cluster jewels, so it didn't matter

hazy fiber
#

fair

mortal bone
#

poor shadow still hasn't been fixed 😦

oak estuary
#

...now I'm never going to unsee this

mortal bone
#

It was like this in 3.16 as well haha

drifting merlin
#

yea I did something similar, but I took pob's code and adapted it in js

mortal bone
#

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

drifting merlin
#

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

oak estuary
#

Isn't it just a BFS algorithm? I haven't actually looked at that code because it Just Works ™️

drifting merlin
#

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

mortal bone
#

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

drifting merlin
#

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

odd sail
#

@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).

civic crane
odd sail
#

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

drifting merlin
#

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 ?

civic crane
#

imo you should limit yourself in web to one thread/worker and use Comlink library

mortal bone
#

you shouldn't need a web worker to do shortest path. It should be way faster than 280ms

#

these are entire tree traversals basically

drifting merlin
#

🤯

#

i'll investigate

mortal bone
#

This is basically a uniform cost search algorithm (dijkstra's for infinite graphs).

livid mist
#

My BFS takes very little time

#

I haven't checked but it's never been an issue in my experience

compact nova
#

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?

worthy cape
#

Kind of has to if it's to use OAuth.

compact nova
#

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?

tawny agate
#

You are not authorized to do anything else

worthy cape
#

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.

velvet fog
odd sail
#

@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

drifting merlin
#

found the json 😄

dull roost
drifting merlin
#

silently hardcoded in the page

mortal bone
#

the passive tree json is also in the page 😉

worthy cape
#

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.

compact isle
#

I'll do a JSON export on the github soon! Just been pre-occupied with the abomination you see before you 😅

worthy cape
compact isle
#

as well as the various other abominations required for 3.17 monkaSTEER

worthy cape
#

Would be interesting to see heat maps for the atlas tree a bit into the league, see how much people think the same.

compact isle
#

it's part of the canvas

#

I think there's a full-sized one in the press kit?

worthy cape
#

I've had some feedback that the tree is a bit low contrast and hard to read.

mortal bone
#

gonna have some work to do on this one 😄

mortal bone
#

Most of my code apparently requires a class index for the starting node lol whoops

livid mist
#

I have something basically working

#

yeah i just noticed

#

not sure why but i'll work on fixing it

livid mist
#

It looks like the json they're using has incorrect min (and maybe max) values

#

or, hmm

#

should be fixed

worthy cape
#

@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.

livid mist
#

that does not surprise me lol

#

let me test with different DPI

worthy cape
#

Haven't tried on 100% DPI as all my monitors are cool these days 😄

livid mist
#

yeah i only use 100% DPI

shrewd ridge
#

I can't deselect nodes either

livid mist
#

oh weird ok, i'll look into that

#

removing nodes should work now

shrewd ridge
#

Nice. Now my only issue currently is that the very top node is cut off

livid mist
#

oh huh

shrewd ridge
#

I had the same problem on the left side but you fixed that earlier 🙂

#

Right side looks good though

compact nova
#

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 ><

compact nova
#

which part?

worthy cape
#

While a cottage industry is neat, it's indeed hampered a bit.

compact nova
#

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)

mortal bone
#

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

compact nova
#

@mortal bone they already do that via headers in the legacy API

mortal bone
#

Not everyone is nice enough to put the proper headers in

worthy cape
#

I see the primary purpose to be protecting end-user computers as well as restricting what a tool is allowed to do.

livid mist
#

it should be working now

compact nova
#

@mortal bone true, though they could put in browser reasonable rate limiting if you do not, which would force anyone to really do it.

compact isle
#

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 nova
#

@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.

worthy cape
# livid mist it should be working now

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.

worthy cape
compact isle
compact nova
#

@compact isle I didn't know about the access token delegation, that sounds like something better then just proxying all api requests! Thank you.

compact isle
#

always happy to take feedback on the docs... which it seems I need to here

livid mist
compact isle
#

"application credentials" = your client_id and client_secret, not the subsequent access_token's you get per account

compact nova
#

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.

compact isle
#

it's important that the docs are accessible 😄

compact nova
#

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 😦

compact isle
#

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

mortal bone
#

getting there 😄

livid mist
#

nice

mortal bone
livid mist
#

@mortal bone the Y 0 point is the top

#

not the middle now

mortal bone
#

Yeah, I see that

#

that is weird...

livid mist
#

I had to manually adjust things

#

to get it to look reasonable

mortal bone
#

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 😄

compact isle
#

the eldritch implicits (searing / eater of worlds) will have a filter option but not on release

#

(subject to change)

livid mist
#

Yeah i did see that

#

pretty funny

worthy cape
#

wizardry

mortal bone
#

anyone know if we have access to a zoom level 1 AtlasPassiveSkillScreenStart? the "Assets" are wrong in the json

livid mist
#

i haven't been using zoom level stuff like at all

#

so i have no clue 🙂

livid mist
mortal bone
compact isle
#

the rendering for the tree on the website isn't doing anything special

mortal bone
#

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.

compact isle
#

yeah in-game it's around the same size

mortal bone
#

Yeah, there are little blue marks where the connections path through

#

The background is definitely the wrong scale though 😄

compact isle
#

yeah the real scale was hefty levels of mbs

#
// The actual file dimensions are smaller so multiply by 2.8
mortal bone
#

that makes sense

#

it should actually be 2.6 😄

compact isle
#

ah we're copying from the game

#

who knows where that came from ¯_(ツ)_/¯

mortal bone
#

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?

compact isle
#

yeah looks that way

mortal bone
#

close enough to push 😄

#

whoops...apparently backgroundOverride: 0 means don't override 😄

compact isle
#

yep sorry for lack of information I wasn't too involved in the implementation this time around

#

team web together strong 💪

livid mist
#

that fits much nicer than mine does lol

mortal bone
mortal bone
hazy fiber
#

nice

livid mist
#

yeah that has very nice performance

#

mine isn't as smooth 😦

mortal bone
#

Yeah, the performance on the atlas tree is buttery smooth. The default tree is like ~20fps or something which is kinda sad

mortal bone
#

Fixed up a few things. It is looking alright now 🙂

livid mist
#

@mortal bone

#

Long text box lol

#

I just saw the same issue in mine

mortal bone
#

Lol the reminder text normally has new lines in it to force wrapping

#

This one apparently doesn't

livid mist
#

yup

#

I made mine be at most 25% of the horizontal viewport's size

#

and then wrap

mortal bone
#

I need to work on my tooltips lol

livid mist
#

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

carmine merlin
livid mist
#

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?

carmine merlin
#

That's how we've always gotten the tree assets for PoB

frank drift
#

one download fine, hotlinking definitely not fine

#

I expect they have hotlinking protection already in place

formal kraken
#

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?

mortal bone
#

I could render at a lower zoom level on mobile devices

#

That would help a ton

formal kraken
#

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

formal kraken
#

Maybe it just needs proper culling

dense shore
#

So which one of the moowiz' or emmitt's tree planner's passive count is correct? Moo has 121pts Emmi 128pts

ebon oasis
#

official has 128

livid mist
#

i'm wrong I think

#

i just copied that number from somewhere lol

ebon oasis
#

121 is normal passive tree without bandit points

livid mist
#

just changed mine

#

🙂

#

Floats are fun sometimes 🙂

worthy cape
#

@mortal bone first thing I tried was comparing the tree against a passive skill tree. Mobile browser fell over a few times 😄

formal kraken
#

@mortal bone you're constantly rendering the tree, you should only render when there is interaction with the tree

worthy cape
#

Had someone wonder why his CPU fan was going bananas aPES_Giggle

formal kraken
#
    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"

formal kraken
livid mist
#

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

slim pilot
#

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?

livid mist
#

We haven't tested it out a whole lot, but it seems to implement the rate limits correctly from what i've seen

slim pilot
formal kraken
#

hehe I think there is a bugged node @mortal bone at the delirium cluster

formal kraken
#

oh

mortal bone
worthy cape
#

The 3.17 megathread on reddit says: "Points: 117 from maps, 11 from Maven, 4 from final bosses"

#

Is that inaccurate?

mortal bone
formal kraken
#

I am using the same!

formal kraken
#

the noTicker is the important part

mortal bone
#

Ah, I might steal your code there haha

formal kraken
#

yeah go for it

mortal bone
#

I was thinking about noTicker just wasn't sure the interactions would get messed up

formal kraken
#

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

mortal bone
#

I only render things when they change but that ticker is annoying

formal kraken
#

so I have a bunch of markDirty()'s around, for window resize, mouse over, etc. (viewport can mark itself as dirty)

dull roost
#

Maybe only 7 from maven and 4 from the final?

dense shore
dull roost
#

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

mortal bone
formal kraken
mortal bone
#

Ah, there are various other dirty flags like Sprites and Graphics. I thought the renderer had one as well whoops

mortal bone
#

@formal kraken those sweet frames

#

apparently there are 2 tickers in pixi v6 😄

formal kraken
#

this should be vsync'ed with requestAnimationFrame

mortal bone
#

I just had to stop 2 tickers in order to prevent them from rendering the renderer

#
PIXI.Ticker.shared.stop();
PIXI.Ticker.system.stop();
formal kraken
#

autoStart: false

fickle yew
#

@compact isle Any ETA on currency / base type changes?

mortal bone
#

I just set it to use the shared ticker then stopped it 😄 I probably could have done autoStart: false...

slim pilot
#

I just yeeted time.sleep()

gilded tree
eager rivet
proper rock
#

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.

livid mist
eager rivet
livid mist
#

yeah

#

didn't know about this as a thing 🙂

mortal bone
#

implemented the hover for masteries 🙂

civic crane
#

btw can you imrpove text rendering to not be blurry?

mortal bone
#

how do you mean? sorry

civic crane
#

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

mortal bone
#

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;
civic crane
#

devicePixelRatio = 1 🥲

mortal bone
#

Yeah, but the tooltip is scaled based on the width of the viewable area 😄

#

@civic crane is this any better?

civic crane
keen dragon
#

blue (selected) / teal (search) are difficult to differentiate, maybe a different color for search

mortal bone
#

Yeah, I think I will need to switch to sdf text because webgl

inland kestrel
#

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

mortal bone
#

Yeah, no problem 🙂

livid mist
mortal bone
#

That one feels like they ripped the official planner lol

formal kraken
#

The author forgot to remove sourcemaps

#

it's actually some react framework for <canvas> (not a fan)

livid mist
#

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?

formal kraken
#

the website you linked

civic crane
#

Emmitt's tree has best performance (as official one), for me it misses max zoom limit and no textures antialiasing (same issue in pob)

worthy cape
#

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.

pastel marten
#

I was def gonna buy that domain too

#

sadge

compact isle
fickle yew
slate rover
livid mist
#

Works on mobile, nice

#

I like the passive point swinging when you look at the allocated stats

frank drift
#

do any of the planners have a list of allocated stats yet?

livid mist
#

Mine tries to

#

So does poeplanner and pathofatlas

frank drift
slate rover
#

Yeah I noticed, will fix it soon

mortal bone
frank drift
#

yeah probably a lot of work

mortal bone
#

It isn't the amount of work just the requests for more work 😄 everyone wants things to work like POB

worthy cape
#

I strongly recommend never having users.

livid mist
#

Lol

compact isle
livid mist
#

Oh nice

mortal bone
worthy cape
#

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 teri_think

#

(coming up with features is way more fun when I don't have to implement them)

mortal bone
#

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

slate rover
compact isle
#

ah nice find I'll pass it along again

mortal bone
#

implemented culling, so performance should be a lot better on small devices

mortal bone
#

doesn't look great but we got stats 😄

golden bane
#

Next up your users will ask you to calculate the final values. One step further into PoB territory 😉

mortal bone
#

That is the plan, I just haven't implemented attribute parsing haha you can get pretty far with a generic regex replace/calculate/replace

dense shore
#

As long as I remember I'll unpin that on launch

snow whale
livid mist