; Mit diesem Programm kann man stoppen, wieviel Zeit man in Minecraft verbracht hat. ; Die Zeit wird solange aufaddiert, bis das Programm beendet wird. Bei Neustart beginnt die Uhr wieder bei 0. ; Um zu erkennen, ob Minecraft aktiv ist (und nicht im Pausenmode), wird zunächst überprüft, ob das Fenster, das den Fokus hat, ; den Namen Minecraft besitzt. ; Zusätzlich werden 5 verschiedene Pixel überprüft. Diese haben nur im Pausenmode die überprüften Farben. ; Stimmen dort alle Farben, dann läuft Minecraft im Pausenmodus, und die Zeit wird angehalten. Ansonsten wird sie gezählt. ; Somit ist sichergestellt, dass der Timmer auch dann nicht läuft, wenn zufällig mal die Farben der Minecraft-Welt teilweise ; den gleichen Wert haben wie das Pausen-Menü. Aber alle 5 Werte werden dort nicht auftauchen, das ist zu unwahrscheinlich. ; Vermutlich funktioniert das nur mit dem Docm77 Basic 2.0 -Texture Pack, da sonst die Schrift im Pausenmenü eine andere ist. ; Entwicklungsideen: ; Für den Fall eines anderen Textur-Packs müsste man die veränderten Farbwerte mittels aktivierter Zeile 71 ermitteln und ; dann in den Zeilen 94 bis 127 verändern. ; Ein andere Überlegung wäre, vielleicht automatisch das gewählte Texturpack zu ermitteln (ini oder so?) und dann die passenden ; Farbwerte zu vergleichen. Ist aber aufwändiger. ; Hier ist auch sehr gut ein Lernmodus denkbar. Am Anfang klickt man im Programm auf Learn, während Minecraft pausiert. Dann ; bewegt man die Maus kurz über die Schaltfläche Zurück zum Spiel und Optionen.... Das Programm speichert daraufhin die neuen ; Farben und das verwendete Texturpack (sofern man das auslesen kann) und dessen Namen in einer Liste ab und kann so immer sofort ; zum gewählten Textur-Pack die richtigen Farben wählen. Ist ein Pack nicht bekannt, dann gibt es eine Meldung mit dem Hinweis, ; einen Learn-Vorgang zu starten. ; Weiterhin denkbar; ein kleines Optionen-Menü, wo man z.B. die Quarat-Anzeige ausblenden kann. ; Ebenfalls denkbar: Ablegen der Tages-Spielzeit mit Datum in einer Liste, die man weiterführend auch statistisch auswerten ; könnte. EnableExplicit Define EventID.l ; für das Ereignis, z.B. Klicken auf das Schließsymbol Define Color1 ; Color 1-5 enthalten die Pixelfarben der 5 Testpixel Define Color2 Define Color3 Define Color4 Define Color5 Define punkte.b ; Übereinstimmungslevel. Nur wenn alle Pixel übereinstimmen, ist dieser Wert maximal ; (und Minecraft im Pausenmodus) Define mconalt.b ; Gamemodes; wenn Minecraft aktiv ist, ist dieser Wert auf 1. ; Trennung in neu und alt, um Änderungen zu erkennen Define mconneu.b ; siehe mconalt Global sek.b ; Sekunden-Zähler für Minecraft-Spieldauer Global min.b ; Minuten-Zähler für Minecraft-Spieldauer Global std.b ; Stunden-Zähler für Minecraft-Spieldauer Define s.b ; Kurzzeitspeicher für Sekunden für Vergleich mit Date Define ActhWnd Define MChWnd Define hDC ; für den Zeiger auf die Desktop-Grafik? mconalt = 0 ; Spiel anfangs aus mconneu = 0 sek = 0 ; Zeit anfangs anfangs auf 0 min = 0 std = 0 s = 0 ; Vergleichsekunden auf 0, d.h. keine Timeraktivierung Procedure zeitaus() ; hier wird die Zeit ausgegeben mit der Formatierung hh:mm:ss SetGadgetText(1,Right("00" + Str(std), 2) + ":" + Right("00" + Str(min), 2) + ":" + Right ("00" + Str(sek), 2)) EndProcedure CreateImage(1,30,30,32) ; Fensterausgabe If OpenWindow(0,0,1007,125,12,"MC-Uhr",#PB_Window_SystemMenu) TextGadget(1,79,0,50,14,"",0) StickyWindow(0,1) zeitaus() ; Spielzeit wird erstmalig ausgeben. Ist jetzt natürlich noch auf 0 ; Hauptschleife: Repeat EventID=WaitWindowEvent(100) ; 10 mal pro Sekunde abfragen hDC = GetDC_(0) ; eine API-Abfrage, holt ein Handle auf die Desktop-Grafik oder so ; 5 Pixelfarben testen auf Pausenmenü Color1 = GetPixel_(hDC, 862, 198) ; G von Gamemenü, weiß Color2 = GetPixel_(hDC, 799, 340) ; Z von Zurück, hell Color3 = GetPixel_(hDC, 807, 366) ; Z von Zurück, Schatten Color4 = GetPixel_(hDC, 668, 628) ; O von Optionen, hell Color5 = GetPixel_(hDC, 670, 656) ; O von Optionen, Schatten ; mit dieser Zeile kann überprüft werden, welche Farben tatsächlich an der Prüfpixel-Position erscheint. ; das kann nützlich sein bei anderen Texture-Packs. Die entsprechenden Farben müssen dann beim Pixelvergleich angepasst ; werden. Die jeweilige colorx ersetzen! ; Debug Str(Red(color5))+","+Str(Green(color5))+","+Str(Blue(color5)) ReleaseDC_(0, hDC) ; gibt hinterher die Ressourcen wieder frei. Sonst stürzt das Programm nach 17 min ab. StartDrawing(WindowOutput(0)) punkte = 0 ; für Pixeltest zunächst mal alle Zähler auf 0 ; Herausfinden, ob das Minecraft-Fenster den Focus hat (Antwortpost aus dem PB-Forum) ActhWnd = GetForegroundWindow_() MChWnd = FindWindow_("SunAwtFrame", "Minecraft") If ActhWnd = MChWnd Box(5,1,10,10, RGB(0, 255, 0)) punkte = 10 Else Box(5,1,10,10, RGB(255, 0, 0)) EndIf ; hier werden die Pixelwerte mit den nötigen Werten verglichen und entweder ein rotes Quadrat (nicht identisch) oder ; ein grünes Quadrat (identisch) angezeigt ; Diese Quadratanzeige ist zwar unnötig, aber ein kleines Feedback-Extra. ; es müssen (bis auf das erste) immer 2 verschiedene Farben geprüft werden, weil sich die Farben ändern, ; wenn der Mauspfeil über derSchaltfläche ist If Red(Color1) = 255 And Green(Color1) = 255 And Blue(Color1) = 255 Box(17,1,10,10, RGB(255, 0, 0)) punkte - 1 Else Box(17,1,10,10, RGB(0, 255, 0)) EndIf If (Red(Color2) = 255 And Green(Color2) = 255 And Blue(Color2) = 160) Or (Red(Color2) = 224 And Green(Color2) = 224 And Blue(Color2) = 224) Box(29,1,10,10, RGB(255, 0, 0)) punkte - 1 Else Box(29,1,10,10, RGB(0, 255, 0)) EndIf If (Red(Color3) = 63 And Green(Color3) = 63 And Blue(Color3) = 40) Or (Red(Color3) = 56 And Green(Color3) = 56 And Blue(Color3) = 56) Box(41,1,10,10, RGB(255, 0, 0)) punkte - 1 Else Box(41,1,10,10, RGB(0, 255, 0)) EndIf If (Red(Color4) = 255 And Green(Color4) = 255 And Blue(Color4) = 160) Or (Red(Color4) = 224 And Green(Color4) = 224 And Blue(Color4) = 224) Box(53,1,10,10, RGB(255, 0, 0)) punkte - 1 Else Box(53,1,10,10, RGB(0, 255, 0)) EndIf If (Red(Color5) = 63 And Green(Color5) = 63 And Blue(Color5) = 40) Or (Red(Color5) = 56 And Green(Color5) = 56 And Blue(Color5) = 56) Box(65,1,10,10, RGB(255, 0, 0)) punkte - 1 Else Box(65,1,10,10, RGB(0, 255, 0)) EndIf StopDrawing() ; Timer aktivieren oder deaktivieren If punkte > 5 ; wenn maximal 4 von 5 Pausenmenü-Pixel übereinstimmen und Minecraft den Focus hat mconneu = 1 If mconalt = 0 mconalt = 1 s = Second(Date()) EndIf Else mconneu = 0 If mconalt = 1 mconalt = 0 s = 0 EndIf EndIf ; Timer entsprechend aktualisieren, wenn nötig If mconneu = 1 ; falls Timer aktiv If s <> Second(Date()) ;Wenn eine Sekunde vergangen sek + 1 ; Spielsekunden um eins höher If sek >= 60 ; falls eine Minute verstrichen min + 1 ; Minutenzähler um eins höher sek = 0 ; Sekunden zurück If min = 60 ; falls eine Stunde verstrichen std + 1 ; Stundenzähler um eins höher min = 0 ; Minuten zurück EndIf EndIf zeitaus() ; Spielzeit erneut ausgeben s = Second (Date()) ; und nächste Sekunde holen EndIf EndIf Until EventID = #PB_Event_CloseWindow ; bis das Schließsymbol geklickt wird EndIf ; IDE Options = PureBasic 4.60 (Windows - x86) ; CursorPosition = 28 ; FirstLine = 57 ; Folding = - ; Executable = minecraft-uhr 1.0.exe