gw2raidar
gw2raidar copied to clipboard
ARC Positional Logging
ARC has provided test DLL for tracking positions. Nothing needs to be done yet, but just want to be able to see if logging works correctly and if it is usable data:
CBTS_POSITION = 19,
CBTS_VELOCITY = 20
cast dst_agent to a float[3]
x/y/z stored in binary order
ev->src_agent = ag->m_ptr_agent; ev->time = timegettime64(); ev->is_statechange = CBTS_POSITION; ag->GetPos((D3DXVECTOR3*)&ev->dst_agent);
I'm going to say... I don't think it is working? I don't see any events of that type from a log from that dll.
Hmm is it not an additional field thingy at the end of current recorded events? I dont think it's it's own event
CBTS_POSITION = 19, CBTS_VELOCITY = 20 cast dst_agent to a float[3] if the results look manageable for size and programming ill run it past cc feel free to share those links with the devs
that was the full thingy from DELTA, what encounter were you looking at for the position data? Also is log larger than what you would expect?
I created a new golem log. The description from delta suggests they are new state change events.
20180618-232304 VG.evtc.zip 20180618-225215 KC.evtc.zip 20180618-221709 MO.evtc.zip 20180618-215435 Cairn.evtc.zip 20180618-214930 Sloth.evtc.zip 20180618-212524 SH.evtc.zip
Confirmed error with DLL, will need new test logs. Updated DLL attached below. Some source code:
if (timewithin(ag->m_cbt_lastvelocity_poll, 250)) {
D3DXVECTOR3 v;
ag->GetVelocity(&v);
if (v != ag->m_cbt_lastvelocity) {
ag->m_cbt_lastvelocity = v;
ag->m_cbt_lastvelocity_poll = timegettime64();
/* create event */
if (getlock(m_cbtevents_area_hlock, 0, 0)) {
cbtevent_extended* ev = &m_ar_cbtevents_area[m_cbtevents_area_tail_raw];
ev->src_agent = ag->m_ptr_agent;
ev->time = timegettime64();
ev->is_statechange = CBTS_VELOCITY;
ag->GetVelocity((D3DXVECTOR3*)&ev->dst_agent);
m_cbtevents_area_tail_raw = (m_cbtevents_area_tail_raw + 1) % RB_STR_ELEMENTS;
postlock(m_cbtevents_area_hready);
postlock(m_cbtevents_area_hlock);
}
}
}
/* healthmax update */
if (m_area_cbt_cid && ag->m_is_in_species_list) {
float new_healthmax = ag->GetHealthMax(0);
if (new_healthmax != ag->m_cbt_health_max) {
ag->m_cbt_health_max = new_healthmax;
/* create event */
if (getlock(m_cbtevents_area_hlock, 0, 0)) {
cbtevent_extended* ev = &m_ar_cbtevents_area[m_cbtevents_area_tail_raw];
ev->src_agent = ag->m_ptr_agent;
ev->time = timegettime64();
ev->is_statechange = CBTS_HEALTHMAXUPDATE;
ev->dst_agent = (uintptr_t)new_healthmax;
m_cbtevents_area_tail_raw = (m_cbtevents_area_tail_raw + 1) % RB_STR_ELEMENTS;
postlock(m_cbtevents_area_hready);
postlock(m_cbtevents_area_hlock);
}
}
}
was cleaning up timing stuff instead of having a hundred if (time < x + something) everywhere that are sometimes written backwards simplified to a macro and mightve swapped the < with an > not even thinking about how it should work miracle it didnt crash anywhere Attachment file type: unknown d3d9_arcdps_buildtemplates.dll 200.00 KB Attachment file type: unknown d3d9.dll 472.50 KB these will be good pos and velocity every 300ms if changed since previous
YAY LOGS \o/. They also aren't super big
20180620-230505.evtc.zip 20180620-225110.evtc.zip 20180620-224258.evtc.zip 20180620-223802.evtc.zip 20180620-223128.evtc.zip 20180620-222231.evtc.zip 20180620-221822.evtc.zip 20180620-214414.evtc.zip
@deltaconnected FYI
Draft replay format, in json - json isn't a requirement, but convenient for a web renderer and a decent enough way to explore the structure more of a simple way to consider structure:
{
"info" : {
"encounter" : "Deimos",
"time" : "date+time",
"duration" : 123.5,
},
"maps" : [
{
"image" : "url",
"region" : {
"x" : 2,
"y" : 3,
"width" : 100,
"height" : 100
},
"coordinates" : {
"x" : 200,
"y" : 30000,
"width" : 900,
"height" : 900
},
"vertical-range" : {
"lower" : 200,
"upper" : 400
}
}
],
"actors" : [
{
"name" : "Bert",
"id" : 1,
"type" : "Class/Enemy",
"display" : {
"default" : {
"icon-texture" : "",
"icon-region" : {
...
}
},
"up" : {
},
"down" : {
},
"dead" : {
}
}
},
{
"name" : "Deimos",
"type" : "Boss",
...
}
],
"tracks" : [
{
"path" : ["Bert","position","x"],
"data-type" : "numeric",
"update-type" : "interval"
"interpolation" : "lerp",
"start-time" : 10,
"frequency" : 0.5,
"data" : [1,1,1,1,2,2,2,2,2,...]
},
{
"path" : ["Bert","position","y"],
"data-type" : "numeric",
"update-type" : "interval"
"interpolation" : "lerp",
"start-time" : 12,
"frequency" : 0.5,
"data" : [1,1,1,1,2,2,2,2,2,...]
},
{
"path" : ["Bert","state"],
"data-type" : "state",
"update-type" : "delta"
"data" : [
{
"time" : 0,
"value": "up"
},
{
"time" : 20,
"value": "down"
},
{
"time" : 24,
"value": "dead"
}]
},
]
}
i should mention that i don't actually know which coordinate system the ones i report are part of (game internals use something different for rendering/transform raw, skills/map/ui?, and mumble interface/api, in a split that i'm also unsure of)
I'm sure we can figure out...given a relative position XD
I was assuming I would need to capture some boundary positions and math it out from there anyway, so no worries.
Demo of progress at http://immortius.net.au/gw2continuumsplit/
@deltaconnected Is it possible to get facing information, possibly instead of velocity (which isn't as generally useful I don't think, as we can somewhat derive velocity from the change in position, but facing cannot be replicated from velocity)? Facing could possibly use as little as a byte depending on the amount of preprocessing you are willing to do (0-255, with 0 as North, 64 as East, 128 as South etc)
Sure. I include velocity because I know it's the only way to reliably check if someone got hit by a red orb on xera (dodge and the lift are unique). CBTS_FACING = 21 (next in the enum list), https://pastebin.com/D1XU6XBy for copy pasta code. Included in https://www.deltaconnected.com/arcdps/dev/ which will make it to live... eventually
Released in 18th of July arc update jul.18.2018: evtc: added facing statechange (21) for players and boss, polled at 500ms, post-encounter logs only. jul.18.2018: evtc: above use dst_agent as x/y (cast &dst_agent to float*, use as float[2], xy)
Facing in action http://immortius.net.au/gw2continuumsplit/
Log Dump 20180718
20180723-232632 Vale Guardian.evtc.zip 20180723-231725 Xera.evtc.zip 20180723-225156 Keep Construct.evtc.zip 20180723-222705 Deimos.evtc.zip 20180723-221655 Samarog.evtc.zip 20180723-220800 MO.evtc.zip 20180723-220254 Cairn.evtc.zip 20180723-234027 Gorseval.evtc.zip 20180723-234854 Sabetha.evtc.zip 20180723-215822 Matthias.evtc.zip 20180723-204822 SoullessHorror.evtc.zip 20180723-213526 Slothasor.evtc.zip 20180723-212506 Dhuum.evtc.zip
Added in pos/vel/fac for some raid mechanic NPC's (seekers, other guardians, spirits, sab phases, matthias spirits, etc.), don't remember which is which as of latest
@ajrdesign for if you have time soonish to see how best to add this to the encounter pages. Demo can be viewed on divide's site above and i'm sure there's some styling changes possible as well.