wowsims / tbc

23 stars 23 forks source link

Import raid from WCL #702

Closed lologarithm closed 2 years ago

lologarithm commented 2 years ago

rough example here: https://pastebin.com/JyXSK8S7

this will allow an entire raid to be populated instead of requiring manual inputting

We should be able to pull items, enchants, gems, weapon oils/imbues.
buffs:

  1. Include all raid buffs correctly (especially paladin buffs) Checking for existing is probably enough ( no need to simulate exact uptime for like arcane int because it might have fallen off)
  2. Temp buff targets should be able to be extracted (PI, Innervate, etc)
Bengejd commented 2 years ago

So I have a basic version of this that I'm working on in Google Sheets. It's far from complete, and really rough around the edges. I've only tested it on myself in one raid log, so it'll at least output the correct Player Details for BM Hunters.

Road Blocks:

Talents

WCL cannot provide (or does not provide) specific talent choices. The best I've been able to find over the last few years is the standard 41/20/0 format for talents. So these would have to run under the assumption of standard spec talents.

Enchants

WCL provides enchants in the form of the actual ID of the enchant, whereas WoW Sim uses the Spell ID to identify enchants.

E.g: Glyph of Ferocity WoW Sim ID: 29192 - item URL ID WCL ID: 3003 - Enchant Item: +34 Attack Power and +16 Hit Rating (3003).

Consumes

WCL provides consumables in the form of the buff ID, whereas WoWSIM uses a TypeNAME format e.g: WeaponImbueAdamantiteSharpeningStone

Unimplemented / Untested:

Reasons for not making an actual PR of this:

I don't really know much GO, and a lot of the process requires that you add additional UI elements to the project, which I'm unsure if that is actually going to be well received. I'm happy to keep working on this though, as I do think that it has value, it just needs some refinement / expansion once some of those roadblocks are discussed & figured out how to handle, without having to manually code all of the different id mappings.

Bengejd commented 2 years ago

So I just got back from vacation, and worked on this some more.

Party makeup is probably the shakiest thing I have right now, since it's based on some reliably party-wide buffs, such as: Sanc Aura (20218), Conc Aura (19746), Battle Shout (2048), Leader of the Pack (24932), Greater Drums (24932).

lologarithm commented 2 years ago

so I have this mostly implemented in the sim already https://github.com/wowsims/tbc/blob/master/ui/raid/import_export.ts#L124

EDIT: I think we cannot do party makeup with 100% certainty (unless WCL starts to provide that)

Bengejd commented 2 years ago

@lologarithm I must have completely missed the experimental flag in the raid sim, so that's good to hear that it's mostly implemented!

As for party makeup, yeah it's not going to be 100% reliable, but using the auras that I listed above, I was able to get the DPS groups almost perfect, with very little moving around required. It obviously requires a bit of finessing on which auras are going to be reliable, but this was what I found to be the best indication.

I used WCL's V2 GraphQL API in my version, which used the following query:

 let query = `{
          reportData {
            report(code: "${reportID}") {
              table(dataType: Buffs, startTime: ${startTime}, endTime: ${endTime}, sourceID: ${this.id}, viewBy: Target, abilityID: ${buffId}, hostilityType: Friendlies)
            }
          }
        }`

And only ran it on Warriors, Paladins, and Druids (for the time being).

Bengejd commented 2 years ago

So for example using Leader of the Pack, you'd end up with a query that would look like:

{
  reportData {
    report(code: "rbYpNZVMcxykjFd3") {
      table(dataType: Buffs, startTime: 668627, endTime: 749429, sourceID: 44, viewBy: Target, abilityID: 24932, hostilityType: Friendlies)
    }
  }
}

And would result in a list of the players who had that aura from sourceID: 44, which would be:

image.

Then you can just link those players together in a group, add them to a party, and continue on your way. Filtering out Player pets is also required, but that's the general idea that I was utilizing.

lologarithm commented 2 years ago

Here is my query so far

{"query":"{reportData { report(code: \\"${reportID}\\") { guild { name faction {id} } playerDetails(fightIDs: [${fightID}], endTime: 99999999)  events(fightIDs: [${fightID}], dataType:CombatantInfo, endTime: 99999999) {data}  fights(fightIDs: [${fightID}]) { startTime endTime } buffs: events(fightIDs: [${fightID}], dataType:Buffs, endTime: 99999999, abilityID: 29166){ data }}}}"}

I pull guild data to get horde/alliance (and maybe use guild name as a name for the raid group)

I pull out combatant info + player details to get names and specs. I then match the spec (X/Y/Z) to the closest spec we have pre-built.

I pull buff data right now just to see who cast innervate (to setup innervate targets). Paladin buffs for now are just using our sim defaults (each class has a priority order)

There are a few small things missing/broken

Bengejd commented 2 years ago

I'll reach out to you on Discord with some of my thoughts, I have some of this information readily available in my Google sheet, unrelated to the WowSim stuff.

lologarithm commented 2 years ago

Going to close this issue as we now have it working and released. We can create new issues if we want to track specific features to be added.