diablorun / diablointerface Goto Github PK
View Code? Open in Web Editor NEWDiablo 2 Interface for Streamers/Speedrunners
License: MIT License
Diablo 2 Interface for Streamers/Speedrunners
License: MIT License
In settings window, when entering font family by hand instead of selecting it from dropdown, clicking save button pops up a dialog that asks if the settings should be saved. This dialog is not needed.
Now I see the process name is fixed defined in file D2Reader/D2DataReader.cs.
Can you please make it configurable? I want use it in case run D2 with a different process name.
Add the feature to auto-split on acquiring a specific item for the first time or with a specific count.
How should auto-splits with the same item interact with each other?
Autosplit triggers when settings are saved, because the autosplits are reset on setting changes. the character is still the same tho (a valid autosplit char). the game start autosplit has no other requirements other than a valid autosplit char, so splits immediately.
Especially painful because settings are saved as a whole: tooling (server, http push, etc) together with run related (runes, splits, ...)
Hi,
I can't seem to make the autosplit work. No matter what hotkey I try it just simply wont split. (the test hotkey in the settings does nothing either)
Yes, I have used the same hotkey on all: Diablo, Livesplit and the Interface.
Yes, I have tried to start all programs as admin. (Which I always did for the interface)
Yes, I have checked the "Enable Autosplit" checkbox.
Yes, I have named the Splits the same way on both Livesplit and the Interface settings.
Greets Teo1904
Add reading of skill tree information.
Currently we only read single skills, no combination with others (synergies, route in tree, etc).
I followed the steps exactly as posted. I am running everything as an administrator, I have global hot keys set and using the test causes the LiveSplit to start without a problem. When I initially installed this all last night, it was working fine. But it randomly decided upon doing a new run to not auto-split and I have been unable to figure out why. DiabloInterface starts up upon making a new character, but it just isn't starting the split anymore.
I attached my generated log after deleting it and retrying.
Hi,
I noticed yesterday that the shown resistances get updated, but not for the difficulty i am actually in.
I made a video to clarify this a little more:
https://youtu.be/Wy2EqEnXpl0
It Shows that on nightmare it shows the resistances of normal. Yes they get updated when I change resistances on my gear, but it just shows the resistances how they would be in normal.
That is a big issue for viewers that are really curious about those. ;)
greetz Teo1904
reported by BlazerFlamewing
hey there, apparently sometimes the interface displays a different number sometimes for Increased Attack Speed
eg: I built my grail zon for 95 IAS (the max) - the display says 105. the secondary stats dash that PlugY has says 95 too
95 is the maximum breakpoint, but you can go higher but it would be ineffective, like gettinng 215 FCR on a sorc when 200 is the last breakpoint you can reach
but the math on all the gear doesn't check out on paper, either
should be 95, DI reads 105, plugy reads 95
she is wearing Treachery (45%), Highlords Wrath (20%), Moser's Blessed Circle with 2x 15% IAS jewels (30%) = 95%
yeah, it's a bit different and makes a difference when you for example use the 95% breakpoint i have with a different weapon with a different base speed, it might not work out to be the best
Weapon is Titans
which has a base 10% IAS
we currently incude the base ias in the shown value, but maybe this is confusing and we should be able to turn it off
How feasible is it to be able to handle each item generation event (thinking mostly of items dropped by monsters, but other sources like chests and npc shops could be relevant too)?
Placeholder ticket to investigate high cpu usage in some cases with the code in develop branch vs master (or even vs a version way back?) reported by BlazerFlamewing and the_SaltySpitoon
Chat extract from discord:
i encountered this issue when i was first developing the extension, it's actually the reason i used the old DI code vs. the new code
because randomly after periods of time it would enter some kind of infinite loop where it just hammers on the cpu
sometimes it takes 30 minutes, sometimes it takes 2 hours
but it's happening in the main memory reading function from what i could tell
only happens in the develop branch code, not the old code
never figured out what was causing it
@Zutatensuppe
it happened to blazer tonight on his stream
oops i thought all of those messages were about that
well i think blazer is going to message you about it
i think i have a VS profile of it in action but it's like 300MB because it took so long for it to enter that state
i'll see if i can find it
When saving settings while running with a autosplit-char that has game-start autosplit, saving settings will result in a split being triggered.
Add information about mercenary
important information:
What i mean by this is sth like that (example of an amazon):
Must have runes:
Tal Eth
Optional runes:
Ral Ral Tir Tir
Must have runes nightmare:
Shael Shael Eth Thul Amn Ort
Optional runes nightmare:
Ort Sol
In a matter that it first "checks" the must have runes so that they get highlighted as "we got that"
in this case -> first eth rune from "must have" and the ort from "must have nightmare" get highlighted first.
I think this would be very helpfull for hell speedruns for viewers.
Hope i made any sense :D
Faster Run/Walk and Increased Attack Speed currently show only the sum of those attributes on items equipped by player.
They do currently not include modifiers from skills.
There should be an option to turn on "real" values, including skills (and possibly even heavy armor run/walk reduction etc.?)
Skills FRW:
Skills IAS:
(list incomplete)
I installed the build, ran as Admin. It will not pull data from my diablo client no matter what I do. Please help. Tried re-installing the interface as well as DII and Expansion
Create a http server plugin so that people can open a url to view stats by di. Makes the layout more adjustable in general.
Maybe obsolete when ppl use diablo.run browsersource, but if someone wants this locally without running an own server, this could help.
I'm developing a program that reads on an interval basis from AllItemsRequestHandler. The program stores its own inventory state and diffs it with incoming data from AllItemsRequestHandler before pushing the delta to a web server. What I've noticed is that occasionally items that are actually equipped aren't returned in the payload from the request handler. My assumption is that the item reader thread is still writing to the character state while the request handler is reading it. This seemingly makes accurate delta compression impossible. I don't have a ton of time to study the develop source, nor am I particularly experienced in C#, so I figured I'd post this as you know a lot more about the source than I do :).
Would love to have the interface running via wine, that way I don't need to boot into windows to play. The interface is looking for game.exe atm.
Quality-of-life improvement: Allow loading settings file from main window context menu.
Example: context->load->Sorceress Hell
where Sorceress Hell
is the file Sorceress Hell.conf
.
The idea is to allow quickly switching configuration when switching characters or run type without having to go through the route of opening up the settings window, locating the save file, etc...
Required features:
Same idea as the vertical runes
example how it could look:
example.zip
At some random spots the autosplitter is just not doing anything.
Hi, I actually was working on a similar project about a year ago, but my skill set wasn't adequate enough to work with live game data. I was able to develop a program that read the save file periodically, but got stuck on parsing item data.
I just spent some time working around Underbent's BH Maphack for Slash Diablo and I've learned a great deal. I was trying to implement a web socket client that forwarded data to a specified web server where people could view stats in real time. Implementing that in C++ has been unfortunately more difficult than I had hoped for, but C# has some more robust libraries that seem easier to use.
I'd like to implement this feature into your program. I see that you have a server stream for item data, which exports in JSON data. I think the next step would be to use web sockets and allow viewers to connect via their browser to a server and see data update in real time. I'm going to begin implementing this and I think it could add to satisfying the goals of the program. I know a lot of effort has been put into developing a nice GUI that can be shown alongside the game in a stream, but I think this is the next logical approach since item and skill data is going to become very difficult to show well visibly on screen, especially if the streamer only has one screen to place apps.
OverseerShenk:
I think on entering the game, DiabloInterface initially sends the last Area ID you were in from your previous game. Do you think this could be fixed?
For the races we have a disqualification system so that your players setting can only be different in town.
To mitigate this problem we could check on a new char if the area is one of the towns (be aware of the -act ... parameter, which makes new chars start in different acts). If we detect a new char but area is not the according town, we could skip sending an event and just reread.
When the weapons are switched (secondary - primary) the game will give us the currently active weapon as "Primary".
For display on diablo.run for example it would make sense to know which weapon/shield is actually primary/secondary to make it display nicely without it switching back/forth.
For 100% speedruns this might be interesting:
100% = all quest in all difficulties + cow kings in all difficulties
-> 84 quests ~ around 1.19% each
so completing den + talking to akara would make 1.19% / 100
Possible to break down into:
Normal x% / 100%
Nightmare x% / 100%
Hell x% / 100%
Total x% / 100%
it does not include waypoints (SDA rules)
Not really a pressious issue - could be sth that puts 100% runs on the boards though.
Some keys can not be used as a hotkey yet:
Mouse Keys (for example m4,m5)
Some special input (for example - +)
Set item bonuses are missing from the item descriptions and should be added.
Settings that are only tooling related (http client, pipe server, etc) should be stored separately from the run related settings (autosplits, rune settings, etc.). Or at least "settings changed" should trigger separately and only if the according section actually changed.
Wondering if it's possible to make this useful tool usable with the 1.13 version of this game, I don't have much experience so I'm not sure if it's a hard task or not. I'm also a bit confused on how to make my chat bot interface with the "simple pipe" of the program, apologies if this is something I've overlooked.
Either way I appreciate the hard work, the tool works wonderfully for the current patches!
Add support for use in LAN games/private multiplayer.
currently runes only can be displayed horizontally.
todo: add vertical runes display (left or right to other stats)
The "Game started" split is executed multiple times, even for an old character, if that character is still level 1 and has no experience. The split should only be done if a new character is started.
reproduction steps
Note: we could check for new character name, but sometimes an old character is deleted from the game and a new one is created with the same name, so maybe it makes sense to check something like if part of the map has been scouted.
Opening the debug window or querying items through the pipe server throws:
Exception: System.FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.
at System.Text.StringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args)
at System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args)
at System.String.Format(String format, Object arg0)
at Zutatensuppe.D2Reader.Readers.RangeStatDamage._toString(StringLookupTable stringLookupTable, Int32[] args, UInt16stringId) in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\Readers\RangeStatData.cs:line 50
at Zutatensuppe.D2Reader.Readers.RangeStatDamage.ToString(StringLookupTable stringLookupTable) in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\Readers\RangeStatData.cs:line 37
at Zutatensuppe.D2Reader.Readers.RangeStatData.TryHandleStat(D2Stat stat, String& description) in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\Readers\RangeStatData.cs:line 232
at Zutatensuppe.D2Reader.Readers.ItemReader.<>c__DisplayClass49_0.<GetMagicalStrings>g__getDescription0(D2Stat stat)in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\Readers\ItemReader.cs:line 865
at Zutatensuppe.D2Reader.Readers.ItemReader.<>c__DisplayClass49_0.<GetMagicalStrings>b__4(<>f__AnonymousType1`2 <>h__TransparentIdentifier0) in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\Readers\ItemReader.cs:line 877
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.<ReverseIterator>d__74`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Zutatensuppe.D2Reader.Readers.ItemReader.GetMagicalStrings(D2Unit item) in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\Readers\ItemReader.cs:line 874
at Zutatensuppe.D2Reader.D2DataReader.ReadEquippedItemStrings() in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\D2DataReader.cs:line 444
at Zutatensuppe.D2Reader.D2DataReader.ProcessEquippedItemStrings() in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\D2DataReader.cs:line 425
at Zutatensuppe.D2Reader.D2DataReader.ProcessGameData() in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\D2DataReader.cs:line 349
at Zutatensuppe.D2Reader.D2DataReader.RunReadOperation() in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\D2DataReader.cs:line 266Exception: System.FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.
at System.Text.StringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args)
at System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args)
at System.String.Format(String format, Object arg0)
at Zutatensuppe.D2Reader.Readers.RangeStatDamage._toString(StringLookupTable stringLookupTable, Int32[] args, UInt16stringId) in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\Readers\RangeStatData.cs:line 50
at Zutatensuppe.D2Reader.Readers.RangeStatDamage.ToString(StringLookupTable stringLookupTable) in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\Readers\RangeStatData.cs:line 37
at Zutatensuppe.D2Reader.Readers.RangeStatData.TryHandleStat(D2Stat stat, String& description) in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\Readers\RangeStatData.cs:line 232
at Zutatensuppe.D2Reader.Readers.ItemReader.<>c__DisplayClass49_0.<GetMagicalStrings>g__getDescription0(D2Stat stat)in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\Readers\ItemReader.cs:line 865
at Zutatensuppe.D2Reader.Readers.ItemReader.<>c__DisplayClass49_0.<GetMagicalStrings>b__4(<>f__AnonymousType1`2 <>h__TransparentIdentifier0) in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\Readers\ItemReader.cs:line 877
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.<ReverseIterator>d__74`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Zutatensuppe.D2Reader.Readers.ItemReader.GetMagicalStrings(D2Unit item) in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\Readers\ItemReader.cs:line 874
at Zutatensuppe.D2Reader.D2DataReader.ReadEquippedItemStrings() in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\D2DataReader.cs:line 444
at Zutatensuppe.D2Reader.D2DataReader.ProcessEquippedItemStrings() in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\D2DataReader.cs:line 425
at Zutatensuppe.D2Reader.D2DataReader.ProcessGameData() in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\D2DataReader.cs:line 349
at Zutatensuppe.D2Reader.D2DataReader.RunReadOperation() in C:\Users\Ryan\Programming\Diablo\DiabloInterface\src\D2Reader\D2DataReader.cs:line 266
EDIT: Happens on both 1.13 and 1.14. Only appears to trigger when certain items are equipped. Will try to narrow it down.
EDIT#2: Seems to be triggered by War Travelers being equipped, oddly enough.
EDIT#3: It's any item that has a Adds X-Y damage
stat (war travs add 15-20
damage). Elemental damage seems to be okay.
EDIT#4: Actually seems to affect all damage stats, but it only throws exceptions for phys damage. Elemental damage just doesn't show up in the stat readout at all (e.g. SoJ stats don't include 1-12 lightning damage
)
Add an option to autosplit on non-new chars (to for example train from a savegame). This should by default be turned off.
Just the same as shown on the character tab, for both hands.
The Rune display doesnt update, if you have your inventory open while picking up a rune
and put it into an item right away.
Can you make it so that the interface automatically acknowledge which char is being played to set the rune display automatically?
Like that: Starting Assa -> Tal Eth Tir Ral Ral Ral
Starting Sorc -> Tal Eth Tir Tir Ral Ral
etc.
would be convinient. (maybe do save states for norm / hell spedrun settings)
norm ama -> Tal Eth Ral Ral
hell ama -> Tal Eth Ral Ral Shael Eth Ort Eth Shael Thul Amn Ort Sol
Not sure if that is possible ^^ just a thought
Could you add a 1.14b version in the latest updates?
My first three splits are the special game start, Black Marsh and outer cloister. The first split will automatically start when I run hit town after creating my character and the second split will trigger when I reach Black Marsh. After doing Countess runs for X period of time, I continue off, but at this point I no longer get the splits happening automatically. When I reach the outer cloister, the time keeps going with no update.
Wondering if there is a reason for this.
EDIT: After testing, it looks like quitting the game and logging back in is causing it to stop auto splitting anything it hasn't yet. Any work around for this?
Hi, I'm having some problems with diablo interface through d2se
nvm.. an older version worked
somehow seems that v0.4.11 doesnt work for all cases where v0.4.10 worked.
so maybe should bring back the fallback from v0.4.10 (1.13c string check.. kind of strange but seems to work?)
Reported by Blazer-flamewing:
running into a bit of a graphical bug when I'm trying to use the Vertical layout setting - some of the stat numbers are being cut off at the third digit, it seems to only happen to FRW/FHR/FCR/IAS
https://www.twitch.tv/videos/401708714
Greetings.
I do not know English well, so I use google.translate.
The split program does not work well with the 3dfx mode. The game after alt + tab "freezes" and after that the split does not work.
Everything was fine in version 0.31
Todo: Add Save/Apply/Cancel buttons again. Menu should be kept for things like loading/saving different config file.
Game started
should be recognized when using -act5
command line switch
see https://www.speedrun.com/d2lod/thread/4x987
related to #30
Version checker should pop up only once (or with checkbox to not show again).
Currently it is popping up every start of the tool, if newer version is available and option is turned on in settings.
I have noticed that if I modify this program to not run as admin (set "asInvoker" in manifest), it cannot attach to diablo 2 process. I've debugged it a bit and notice that Process::Modules call gets an "access denied" exception.
Have you looked into this, if there is a workaround for this? My game.exe is not running elevated (i.e. not as admin). Also tried turning off UAC Virtualization for it in the task manager, didn't help either.
There should be an option to show the current /players
value from the game.
Recently there have been a few requests to show it on stream as /players X
and /players 8
categories have been added to the leaderboard.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.