Hilfe für meinen Sohn benötigt

Stelle Fragen zur Automatisierung von Spielen

Moderator: jNizM

Hummelchen
Posts: 7
Joined: 03 Nov 2014, 04:35

Hilfe für meinen Sohn benötigt

03 Nov 2014, 04:49

Guten Morgen zusammen!

Ich bin auf der Suche nach einem Skript für meinen Sohn, der leider mit ein paar Fingern weniger auf die Welt kam, damit ihm das daddeln am PC ein wenig leichter fällt.

Es geht bei ihm um das Spiel ‚Diablo 3‘ wo er sich eine total konfuse Tastenbelegung, aufgrund seiner ‚Behinderung‘ zusammengewurstet hat und er sich da ständig einen abbricht.

Jetzt hatte ich bereist schon <HIER> um Hilfe gebeten und auch schon einen pfiffigen, hilfsbereiten Programmierer vom Fach an der Hand, doch sein Ansatz sieht schon echt super aus, doch in der Realität funktioniert es nicht so wie gewünscht, doch dazu nachher mehr.

Wunschvater des Gedanken:
Nutzung eines Skriptes welches …
a) … mit der Taste ‚q‘ …
a-1) … gestartet
a-2) … direkt bei erstmaliger Betätigung der Taste ‚q‘ die Tasten (1~4 + rechte Maustaste) drückt (-> der Toggle soll in Unendlichschleife laufen und die Tasten in bestimmten Zeitintervallen automatisch betätigt werden bis Skript gestoppt wird)
und
a-3) … bei nochmaligem Druck von ‚q‘ wieder gestoppt wird.

Hintergrund:
Mein Sohn erklärte mir, dass wenn er durch die Welten, er nannte es ‚Dungeons‘, läuft, normal rumläuft und einzelne Gegner nur durch Mausklicks erledigen kann, jedoch bei bestimmten Gegnern die Tasten ständig drücken muss, damit bestimmte Fertigkeitssynergien aktiviert werden, was weiß ich. Alles böhmische Dörfer für mich als Papa.

zu den Tasten/Abklingzeiten:
Zahl ‚1‘ Fertigkeit 1 mit Abklingzeit 60 Sekunden
Zahl ‚2‘ Fertigkeit 2 mit Abklingzeit 40 Sekunden
Zahl ‚3‘ Fertigkeit 3 mit Abklingzeit 15 Sekunden
Zahl ‚4‘ Fertigkeit 4 mit Abklingzeit 0,2 Sekunden
---
rechte Maustaste Fertigkeit 5 mit Abklingzeit 2 Sekunden

Nachfolgend mal zwei Ansätze:

1) meine Eigenkreation:
Probleme gleich vorneweg:
- Taste ‚q‘ muss ständig gedrückt gehalten werden
- Taste ‚q‘ ist nicht Ein-/Ausschalter des Skriptes
--- zum Beenden muss eine der Tasten 2~3 gedrückt werden
- Tasten 1~4 werden ständig gedrückt und nicht erst nach Ablauf der Abklingzeiten
--- Script soll mit ‚q‘ gestartet werden und dann sollen DIREKT die Tastentoggles von 1~4 und der Toggle der rechten Maustaste betätigt werden
- rechte Maustaste ist nicht mit enthalten

Code:
'ifwinactive; Diablo III ahk_class D3 Main Window Class
q::
send1
while GetKeyState ("1","p")
{
send 1
sleep 60000
}
send2
while GetKeyState ("2","p")
{
send 2
sleep 40000
}
send3
while GetKeyState ("3","p")
{
send 3
sleep 15000
}
send4
while GetKeyState ("4","p")
{
send 4
sleep 200
}
return
#ifwinactive

2) Ansatz des erwähnten Forumnutzers von http://www.autohotkey.com:
Probleme gleich vorneweg:
- Taste ‚q‘ als Ein-/Ausschlter des ganzen Skriptes geht nicht
- SPAM1 nicht bekannt -> AHK bringt Fehlermeldung: Error: Call to nonexisten function / Specifically: set_timer("D3_spam1", 60000) / …
- SPAM2 geht, ich muss die Taste jedoch gedrückt halten
- ESC-Code geht nicht
- rechte Maustaste nicht enthalten

Code:
; Diese sendmodes kannst Du einzeln auch durchprobieren, d.h. ";" am Zeilenanfang entfernen und Ccript neu laden.
;sendmode, input
;sendmode, play

SetKeyDely,,100

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Label (Timer) Perioden hier festlegen:

set_timer("D3_spam1", 60000)
set_timer("D3_spam1", "off")
; jetzt weiss ahk welche Periode der Timer D3_spam1 haben soll. Das ist wichtig, da der Timer nachher ohne Angabe der Periode an und aus gestellt werden soll!


set_timer("D3_spam2", 40000)
set_timer("D3_spam2", "off")
; Für den Fall man hat ein Label D3_spam2 und will es mit der Periode 40 sec anspringen.

set_timer("D3_spam3", 15000)
set_timer("D3_spam3", "off")

set_timer("D3_spam4", 200)
set_timer("D3_spam4", "off")

set_timer("D3_spamesc", 5000)
set_timer("D3_spamesc", "off")
; nur zum testen.

; hier weitere Perioden festlegen...

return ; Ende der Auto Execution Section, die Skript-Start-Subroutine ist hier beendet.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Hotkeys hierhin:

; Alt + Strg + Escape beendet das Skript.
!^escape::
exitapp
return

#ifwinactive, Diablo III ahk_class D3 Main Window Class

q::
; Der Timer, der zum Label D3_spam1 gehört, wird an bzw. aus geschaltet im Wechsel:
set_timer("D3_spam1", "toggle")
return

p::
set_timer("D3_spamesc", "toggle")
return

2::
if (set_timer("D3_spam2", "toggle") != "off"){
; wenn man den timer anmacht, soll auch gleich 2 gesendet werden:
send 2
}
return
#ifwinactive

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Label hierhin:
; unteres D3_spam1 ist ein Label:

D3_spam1:
ifwinnotactive, Diablo III ahk_class D3 Main Window Class
{
; wenn das spiel nicht mehr aktiv ist, wird der Timer dieses Label
; ausgestellt:
set_timer("D3_spam1", "off")
return
}
send 1
return

D3_spam2:
ifwinnotactive, Diablo III ahk_class D3 Main Window Class
{
set_timer("D3_spam2", "off")
return
}
send 2
return

D3_spam3:
ifwinnotactive, Diablo III ahk_class D3 Main Window Class
{
; wenn das spiel nicht mehr aktiv ist, wird der Timer dieses Label
; ausgestellt:
set_timer("D3_spam3", "off")
return
}
send 3
return

D3_spam4:
ifwinnotactive, Diablo III ahk_class D3 Main Window Class
{
set_timer("D3_spam4", "off")
return
}
send 4
return

D3_spamesc:
ifwinnotactive, Diablo III ahk_class D3 Main Window Class
{
set_timer("D3_spamesc", "off")
return
}
send {escape}
return

; Hier weitere Label, die (periodisch) angesprungen werden sollen.
; die label-Namen muss man sich selbst _ausdenken_, im obersten Teil des Skriptes werden
; die Perioden für die Labels festgelegt.


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


set_timer(label, m, p = ""){
static a := {}
if (!islabel(label)){
msgbox, Das Label %label% existiert nicht. Anwendung wird geschlossen.
exitapp
}
if (m = "toggle") {
m := a[label]
m := (m = "off" || m = "") ? "on" : "off"
}
a[label] := m
settimer,% label,% m,% p
return m
}

Hat hier ggf. jemand noch eine Idee da Etwas Lauffähiges hinzubekommen oder wo der Hase im Pfeffer liegt? Wie gesagt kenne ich mich überhaupt nicht aus und möchte meinem Sohn einfach irgendwie das Ganze erleichtern.

Ich danke Euch
User avatar
Ragnar
Posts: 613
Joined: 30 Sep 2013, 15:25

Re: Hilfe für meinen Sohn benötigt

03 Nov 2014, 09:04

Da ich selbst Diablo 3 habe, kann ich sagen, dass strobo's Lösung ziemlich gut funktioniert. Man muss sie natürlich dementsprechend den eigenen Wünschen anpassen.
Taste ‚q‘ als Ein-/Ausschlter des ganzen Skriptes geht nicht
Die Auswirkung der Taste Q hättest du erst nach 60 Sekunden gesehen, weil hier nur ein Timer enthalten ist, der auf 60000 ms gestellt ist.
SPAM1 nicht bekannt -> AHK bringt Fehlermeldung: Error: Call to nonexisten function / Specifically: set_timer("D3_spam1", 60000) / …
Kann nicht sein. Vermutlich beim Kopieren & Einfügen ein Teil des Codes vergessen, wie bereits erwähnt wurde.
SPAM2 geht, ich muss die Taste jedoch gedrückt halten
Das liegt an die etwas merkwürdige spezielle Lösung, die bei Taste 2 gemacht wurde.
ESC-Code geht nicht
Sollte funktionieren. Vielleicht mit der Tastenkombo ALT+STRG+ESC verwechselt? Damit wird nur das komplette Script beendet.

Glücklicherweise scheinen D3 und AHK gut zu harmonisieren, so dass man ControlSend anstelle von Send verwenden kann. Zum einen ist das zuverlässiger und zum anderen spart man sich ein paar Code-Zeilen. Ich habe das Script entsprechend geändert:

Code: Select all

#NoEnv
#SingleInstance, force
SetBatchLines, -1
SendMode, Input

D3_Fenster  := "Diablo III ahk_class D3 Main Window Class"

;                Taste        Abklingzeit
; ---------------------------------------
TastenListe := { 1:           60000
               , 2:           40000
               , 3:           15000
               , 4:           200
               , Rechtsklick: 2000  }

#If WinActive(D3_Fenster)

q::
Schalter := !Schalter
for LabelName, AbklingZeit in TastenListe
{
    if Schalter
    {
        Gosub, % LabelName
        SetTimer, % LabelName, % AbklingZeit
    }
    else
        SetTimer, % LabelName, Off
}
Return

1:
ControlSend,, 1, % D3_Fenster
Return

2:
ControlSend,, 2, % D3_Fenster
Return

3:
ControlSend,, 3, % D3_Fenster
Return

4:
ControlSend,, 4, % D3_Fenster
Return

Rechtsklick:
MouseGetPos, MausX, MausY
ControlClick, x%MausX% y%MausY%, % D3_Fenster,, Right
Return
Hummelchen
Posts: 7
Joined: 03 Nov 2014, 04:35

Re: Hilfe für meinen Sohn benötigt

04 Nov 2014, 01:28

Servus!
Vielen Dank Dir (auch nochmals an STROBO: Nicht denken ich fand das nicht gut oder war nicht damit zufrieden oder so).

Zu diesem Ansatz hier:
1) Obwohl Abklingzeiten angegeben sind (stehen bei den Fertigkeiten dabei), die auch verwendet wurden, werden die 'Tasten' nicht entsprechend ausgeführt (also CD läuft runter, abgelaufen, 0,010 delay [bis dato noch nicht im Skript], erneut drücken, ...)

2) Rein informativ gefragt: Wie kann man denn die genauen CDs herausbekommen wenn die CDs, die bei der Fertigkeit stehen, anscheinend nicht die richtigen sind?

3) Experimentel gefragt: Wie müsste der Code aussehen, wenn wir bei Deinem Beispiel bleiben, wenn er die Tasten 3+4 zusammen permanent spammen soll?

Wäre das dann einfach ...?
34:
ControlSend,, 34, % D3_Fenster
Return

4) Würden Dir, es sieht so aus als ob Du Dich mit Diablo 3 auskennst, die Fertigkeiten helfen da ggf. was ändern zu können?
Taste 1 = Offenbarung + Wüstenschleicher
Taste 2 = Odem des Himmels + Lichterfüllt
Taste 3 = Mantra der Entrückung + Wendigkeit
Taste 4 = Reissender Wind + Innerer Sturm
li. Maus = Weg der Hundert Fäuste + Fäuste des Zorns
re. Maus = Rasender Angriff + Feuriger Glanz

Ich Danke,
Hummelchen
User avatar
Ragnar
Posts: 613
Joined: 30 Sep 2013, 15:25

Re: Hilfe für meinen Sohn benötigt

04 Nov 2014, 07:17

1) Obwohl Abklingzeiten angegeben sind (stehen bei den Fertigkeiten dabei), die auch verwendet wurden, werden die 'Tasten' nicht entsprechend ausgeführt (also CD läuft runter, abgelaufen, 0,010 delay [bis dato noch nicht im Skript], erneut drücken, ...)
Ganz einfach. Das Script drückt die Taste einen kleinen Tick zu früh, weil erstens der SetTimer-Befehl nicht 100% genau ist, und zweitens auch die Latenz eine Rolle spielen kann (in diesem Fall also, wann die Information, dass eine Fertigkeit abgeklungen ist, bei dir ankommt). Du musst solange an den Abklingzeiten rumspielen, bis es hinhaut. Zum Beispiel müsstest du bei "Odem des Himmels" (hat eine Abklingzeit von 15 s -> 15000 ms) einfach ein paar Millisekunden dazu addieren; bei mir funktioniert beispielsweise 15200 ms.
2) Rein informativ gefragt: Wie kann man denn die genauen CDs herausbekommen wenn die CDs, die bei der Fertigkeit stehen, anscheinend nicht die richtigen sind?
Die im Spiel angegebenen Abklingzeiten, sofern vorhanden, sind korrekt. Es ist allein das Script daran Schuld. Wie gesagt, du musst an den Abklingzeiten bzw. Timer-Werten im Script "rumschrauben". Desweiteren musst du den Verbrauch der Fertigkeiten beachten, die keine Abklingzeit haben; umso geringer der Timer-Wert, desto schneller wird die Energie deiner Spielfigur verbraucht.
3) Experimentel gefragt: Wie müsste der Code aussehen, wenn wir bei Deinem Beispiel bleiben, wenn er die Tasten 3+4 zusammen permanent spammen soll?
Einfach in der TastenListe oben bei den Tasten 3 und 4 gleiche Abklingzeiten verwenden. Zum Beispiel:

Code: Select all

, 3:           1000
, 4:           1000
4) Würden Dir, es sieht so aus als ob Du Dich mit Diablo 3 auskennst, die Fertigkeiten helfen da ggf. was ändern zu können?
Taste 1 = Offenbarung + Wüstenschleicher
Taste 2 = Odem des Himmels + Lichterfüllt
Taste 3 = Mantra der Entrückung + Wendigkeit
Taste 4 = Reissender Wind + Innerer Sturm
li. Maus = Weg der Hundert Fäuste + Fäuste des Zorns
re. Maus = Rasender Angriff + Feuriger Glanz
Nur ein Beispiel, das halbwegs funktioniert (zumindest bei mir). Erste Fertigkeit konnte ich nicht testen, weil das Addon fehlt:

Code: Select all

TastenListe := { 1:           60200
               , 2:           15200
               , 3:           10000
               , 4:           6200
               , Rechtsklick: 2000  }
Das hängt natürlich wieder von mehreren Faktoren ab: Verbrauch der Fertigkeiten, Abklingzeiten, Energiegewinn im Kampf etc. Was du da nun optimal ist, überlasse ich euch.
Hummelchen
Posts: 7
Joined: 03 Nov 2014, 04:35

Re: Hilfe für meinen Sohn benötigt

04 Nov 2014, 08:18

Servus

Das ist mal Hammer. Das muss man(n) ja auch erst einmal wissen was da alles für Faktoren zusammenspielen!

Das mit den paar ms-onTop probiere ich natürlich umgehend aus

Hummelchen
Hummelchen
Posts: 7
Joined: 03 Nov 2014, 04:35

Re: Hilfe für meinen Sohn benötigt

04 Nov 2014, 18:19

< NACHTRAG >

Servus!

Nach erfolgreichem Test meines Sohnes meinte er Folgendes:
- Taste 1 hängt manchmal ein wenig -> Script wird gestartet -> 1 gedrückt -> CD von 38/39 Sekunden (Sohn hat sog. CDR drauf) -> Fertigkeit ist ready -> Scriptausführung Taste 1 kommt dann 4-5 Sekunden später *confused*
--> muss ich dann die Zeit um 4-5 Sekunden erhöhen, was ich probierte und was leider nicht half?

- Rechte Maustaste funktioniert nicht einwandfrei -> CD-zeit ist wohl falsch, werde ich ausprobieren
--> erneuter Test mit anderer CD-zeit half nicht

Hast Du da noch irgendwelche Ideen?

Merci Dir,
Hummelchen
User avatar
Ragnar
Posts: 613
Joined: 30 Sep 2013, 15:25

Re: Hilfe für meinen Sohn benötigt

05 Nov 2014, 06:45

- Taste 1 hängt manchmal ein wenig -> Script wird gestartet -> 1 gedrückt -> CD von 38/39 Sekunden (Sohn hat sog. CDR drauf) -> Fertigkeit ist ready -> Scriptausführung Taste 1 kommt dann 4-5 Sekunden später *confused*
--> muss ich dann die Zeit um 4-5 Sekunden erhöhen, was ich probierte und was leider nicht half?
Kommt darauf an, ob die Abklingzeit von 38/39 Sek relativ konstant bleibt. Vielleicht gibt es CDRs (Cooldown Reduction), die nur temporär wirken. Theoretisch müsste ein Timer-Wert von 39200 angegeben werden.
Wenn die Abklingzeit stark variiert und die Fertigkeit sofort angewendet werden soll, hast du auch die Möglichkeit, einen geringen Timer-Wert anzugeben (z. B. 1000). Das heißt, dass die Taste immer wieder gedrückt wird - die Abklingzeit spielt dann keine Rolle mehr. Der Nachteil ist, dass man dann öfters die hörbare Meldung erhält, dass die Fertigkeit noch nicht bereit ist, was auf Dauer nervig sein kann. Vielleicht gibt es dazu eine Option in den Spiel-Einstellungen, um das auszuschalten.
- Rechte Maustaste funktioniert nicht einwandfrei -> CD-zeit ist wohl falsch, werde ich ausprobieren
--> erneuter Test mit anderer CD-zeit half nicht
Siehe oben.
Hummelchen
Posts: 7
Joined: 03 Nov 2014, 04:35

Re: Hilfe für meinen Sohn benötigt

06 Nov 2014, 07:37

Hi,

wie müssten die Codes denn aussehen, wenn man das Folgende, unter Berücksichtigung der bekannten Abklingzeiten, machen möchte (interessehalber)?

spamming von einer Taste (am Beispiel von Taste 1):
- Druck von Taste 1 -> Spamstart -> Druck von Taste 1 -> Spamstop -> Druck von Taste 1 -> Spamstart -> usw.

spamming von zwei Tasten gleichzeitig mit nur einem Tastendruck (am Beispiel der Tasten 1 und 2):
- Druck von Taste 1 ODER Taste 2 -> Spamstart von Taste 1 u. 2 -> Druck von Taste 1 ODER Taste 2 -> Spamstop -> usw.

Ist das überhaupt realisierbar?

Danke
User avatar
Ragnar
Posts: 613
Joined: 30 Sep 2013, 15:25

Re: Hilfe für meinen Sohn benötigt

06 Nov 2014, 14:16

Ja, ist es. Du kannst die Code-Abschnitte jeweils an das untere Ende des aktuellen Codes setzen.
- Druck von Taste 1 -> Spamstart -> Druck von Taste 1 -> Spamstop -> Druck von Taste 1 -> Spamstart -> usw.

Code: Select all

1::
Schalter1 := !Schalter1
if Schalter1
{
    Gosub, 1
    SetTimer, 1, 1000
}
else
    SetTimer, 1, Off
Return
- Druck von Taste 1 ODER Taste 2 -> Spamstart von Taste 1 u. 2 -> Druck von Taste 1 ODER Taste 2 -> Spamstop -> usw.

Code: Select all

1::
2::
Schalter12 := !Schalter12
if Schalter12
{
    Gosub, 12
    SetTimer, 12, 1000
}
else
    SetTimer, 12, Off
Return

12:
ControlSend,, 12, % D3_Fenster
Return
Hummelchen
Posts: 7
Joined: 03 Nov 2014, 04:35

Re: Hilfe für meinen Sohn benötigt

07 Nov 2014, 07:33

Sauber!
Ich danke Dir und melde, wenn es so klappt, das der Kleine ohne sich einen abbrechen zu müssen spielen kann!
Puuuuh, was für eine Steißlagengeburt ... ^^
Hummelchen
Hummelchen
Posts: 7
Joined: 03 Nov 2014, 04:35

Re: Hilfe für meinen Sohn benötigt

10 Nov 2014, 01:13

Servus!
Läuft wie gewünscht!
Ich danke u. Sohn ist glücklich (-> Hauptsache).
Hummelchen

Return to “Spiele”

Who is online

Users browsing this forum: No registered users and 37 guests