Dafür gibts DateAdd
[autoit]#include <Date.au3>
ConsoleWrite(_DateAdd('D', 1, _NowCalc()) & @CRLF)
lg
M
Dafür gibts DateAdd
[autoit]#include <Date.au3>
ConsoleWrite(_DateAdd('D', 1, _NowCalc()) & @CRLF)
lg
M
Da der Computer mich grade 7x hintereinander gnadenlos Abgezogen hat dachte ich zunächst der Computer zieht einfach immer das Richtige
Dann hab ich mir den Quelltext mal zu gemüte geführt und siehe da: Es war keine böse Absicht, sondern Pech
Hab nur kurz drübergeschaut.
1. Ein Bild das nur Grau enthält kann durch eine Graue Brush + FillRect ersetzt werden (schöner und effizienter)
2. Angenommen du willst Texte Hinzufügen oder aus verschiedenen Textpaketen wählen. Nutze einfach folgendes: $aPakete[] = Stringsplit('Paket1#Paket2#...') und anschließend einen Stringsplit mit | als Trennzeichen um an die Sätze zu kommen. Dann kannst du relativ einfach ohne hunderte einzelne Zeilen sehr viel Text einbauen.
lg
Mars
Sehr Performant ist es wirklich nicht, aber sehr zweckmäßig.
Wie oft habe ich schon einzelne Screenshots von Hand zusammengebastelt und damit meine Zeit verschwendet ?
Funktioniert bei mir schonmal einwandfrei.
lg
M
Vielen Dank
Habe es gerade getestet und der RegEx tut genau das was er soll.
Die Rekursion lässt sich damit sehr einfach realisieren, indem man den RegEx auf die einzelnen Splits erneut anwendet. Somit müsste es möglich sein eine beliebige "Tiefe" zu erreichen.
Durch den blicke ich jetzt tatsächlich nicht mehr durch, kommt natürlich in die Sammlung
lg
Mars
Gehackt werden kann so gut wie alles. Da würde ich hinten anstellen, bis es wirklich soweit ist, dass es sich lohnt zu hacken.
Übertriebene Darstellung: Man investiert die Hälfte in Sicherheit und kommt deshalb nicht zu einer Spielbaren Version. In diesem Szenario würde sowieso niemand versuchen etwas zu hacken, da das Spiel nicht fertig ist. Anderstherum ist es meiner Meinung nach besser, erstmal muss alles laufen, dann kümmert man sich darum, dass es die Skriptkinder nicht so leicht haben (die richtigen Bastler kann man mit unserer Kenntniss sowieso nicht stoppen).
Genauso ist es bei allem anderen. Musik, Texturen, Items, Blocktypen, usw usw.
Erstmal muss man das Gerüst stehen haben. Dieses sollte so gebaut sein, dass Einzelheiten mit weniger als einer Hand voll Zeilen eingebunden werden können.
z.B. _AddBlockTyp($sBlockData)
$sBlockData = 'TexturStr|SoundStr|Namen|Abbaugeschwindigkeit|MaxStack|Vorkommen|usw' (ggf Base64 Codiert in einer Block.dat mit Header usw, dann müsste man nichtmal das Skript ändern um neue Objekte hinzuzufägen, sondern nur in einem Ordner nach geeigneten Dateien sichen.)
Das Skript muss dann dieses Objekt seöbstständig einbinden. Wenn man z.B. für einen neuen Blocktyp erst 50 verstreute Zeilen ändern muss ist der Ansatz des Grundgerüsts falsch.
Dann hoffen wir mal, dass AutoIt nicht mehr lange Neuland, sondern bald altbekannt ist
Leider heiße ich auch nicht Christoph, dennoch ein herzliches Willkommen !
Und weiter geht der Krimi...
Gefunden werden sollen alle Parameter einer Funktion (auch wenn diese Parameter wieder Funktionen oder Verknüpfungen enthalten).
Ein Beispiel gibts hier:
[autoit]Global $sPattern = '(,.+,)|(\(.+,)|(,.+\))|(\(.+\))'
Global $sSTR = 'MyFunc($Param1, $Param2, Hex(255, 2), AnotherFunc(1, 2, 3, 4))'
$sSTR = StringRegExpReplace($sSTR, '(\s)|(["][^"]*["]|' & "['][^']*['])", "$2")
Global $aSPLIT = StringRegExp($sSTR, $sPattern, 1)
For $i = 0 To UBound($aSPLIT) - 1 Step 1
ConsoleWrite($aSPLIT[$i] & @CRLF)
Next
Ich scheitere daran, dass StringRegExp kein Array zurückgibt.
Das Pattern sollte eigentlich alles was sich Zwischen Klammern, Kommata, Klammer+Komma, Komma+Klammer liegt zurückgeben.
Weitere Ergänzungen kommen noch hinzu, zuerst muss aber mal das Array exisiteren um es zu testen.
lg
Mars
Wenn deine Maus weniger als 30€ Wert ist (evtl auch persönlicher Wert) solltest du einfach eine neue kaufen.
Stell dir vor du hättest einen Stundenlohn von 10€. Wie viele Stunden ist die Maus dir Wert ?
Du hast jetzt schon ne ganze Weile den Thread hier auf und einige Antworten erhalten. Angenommen jeder braucht im Schnitt 5Min für seine Antwort, bei 20 Antworten sind das schon 100Min = 1h und 40Min. Wenn du jetzt noch mehr als 1h und 20Min reinsteckst ist es die Sache nicht Wert.
Das klingt jetzt ziemlich seltsam, aber so mache ich meistens fest, ob es sich lohnt etwas zu reparieren, oder zu ersetzen.
(Gilt auch für allgemeine Kosten Nutzen rechnungen, immer die Zeit beachten die du und deine Freunde investieren)
Rechnen braucht ja auch Zeit
Wer weniger rechnet ist schneller fertig
Hatte aber eine Alte Version des Skripts, es gab noch eine schnellere. Da ich mich aber noch an die Änderungen erinnern kann (so in etwa jedenfalls) hab ich das grade mal eingebaut.
Global $a[256], $c[11111112]
_ArrayFuellen()
$hWnd=GUICreate('Echtzeit Binärumwandlung',600,300,-1)
$hInputEdit=GUICtrlCreateEdit('',0,0,600,150,4096+64)
$hOutputEdit=GUICtrlCreateEdit('',0,150,600,135,2048+64)
GUICtrlSetFont(-1, 6, 400, 0 , 'Courier New', 5)
$hLabel = GUICtrlCreateLabel('', 5, 285, 600, 15)
GUIRegisterMsg(0x0111,'WM_COMMAND')
GUISetState(@SW_SHOW)
While Not (GUIGetMsg() = -3)
WEnd
Func WM_COMMAND($hWinHandle,$iMsg,$wParam,$lParam)
Local $t
If _WinAPI_HiWord($wParam)=0x300 And _WINAPI_LoWord($wParam)=$hInputEdit Then
Local $read = GUICtrlRead($hInputEdit)
If Not StringReplace(StringReplace($read, '0', ''), '1', '') Then
$t = TimerInit()
$bEncrypted=_BinToString($read)
$t = TimerDiff($t)
GUICtrlSetData($hOutputEdit,$bEncrypted)
GUICtrlSetData($hLabel, 'Binär -> String - ' & Round($t*1000) & ' µs')
Else
$t = TimerInit()
$bEncrypted=_StringToBin($read)
$t = TimerDiff($t)
GUICtrlSetData($hLabel, 'String -> Binär - ' & Round($t*1000) & ' µs')
GUICtrlSetData($hOutputEdit,$bEncrypted)
EndIf
EndIf
EndFunc
Func _WinAPI_HiWord($iLong)
Return BitShift($iLong, 16)
EndFunc ;==>_WinAPI_HiWord
Func _WinAPI_LoWord($iLong)
Return BitAND($iLong, 0xFFFF)
EndFunc ;==>_WinAPI_LoWord
Func _StringToBin($s) ; String rein, Nullen und Einsen raus !
Local $h = StringToBinary($s), $r
For $i = 3 To StringLen($s) * 2 + 2 Step 2 ; 1 Zeichen -> 2 Hex
$r &= $a['0x' & StringMid($h, $i, 2)]
Next
Return $r
EndFunc ;==>_StringToBin
Func _BinToString($b) ; Nullen und Einsen rein, String raus !
Local $s
For $i = 1 To StringLen($b) Step 8 ; 1 Zeichen -> 8 Bit
$s &= $c[Int(StringMid($b, $i, 8))]
Next
Return BinaryToString('0x' & $s)
EndFunc ;==>_BinToString
Func _DecToBin($iD) ; Modulomethode -> Nicht sehr schnell. Unwichtig, da sie nur zum Initialisieren von 0 bis 255 genutzt wird.
Local $sR
Do
$sR = Mod($iD, 2) & $sR
$iD = Floor($iD / 2)
Until $iD = 0
Return StringRight('0000000' & $sR, ; Es werden 8 Stellen ausgegeben !
EndFunc ;==>_DecToBin
Func _ArrayFuellen() ; Damit alle Werte von 0 bis 255 direkt vorliegen und keine Berechnungen nötig sind.
For $i = 0 To 255 Step 1
$a[$i] = _DecToBin($i)
Next
For $i = 16 To 255 Step 1
$c[Int(_DecToBin($i))] = Hex($i, 2)
Next
EndFunc ;==>_ArrayFuellen
Dazu gabs auch schonmal einen Geschwindigkeitsvergleich.
Und wenn ich mich nicht irre war die folgende Variante so ziemlich die schnellste:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Version=Beta
#AutoIt3Wrapper_Icon=..\InconTransfer32.ico
#AutoIt3Wrapper_UseUpx=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;~ #include <WindowsConstants.au3>
;~ #include <EditConstants.au3>
;~ #include <WinApi.au3>
Global $a[256]
_ArrayFuellen()
$hWnd=GUICreate('Echtzeit Binärumwandlung',600,300,-1)
$hInputEdit=GUICtrlCreateEdit('',0,0,600,150,4096+64)
$hOutputEdit=GUICtrlCreateEdit('',0,150,600,135,2048+64)
GUICtrlSetFont(-1, 6, 400, 0 , 'Courier New', 5)
$hLabel = GUICtrlCreateLabel('', 5, 285, 600, 15)
GUIRegisterMsg(0x0111,"WM_COMMAND")
GUISetState(@SW_SHOW)
While Not (GUIGetMsg() = -3)
WEnd
Func WM_COMMAND($hWinHandle,$iMsg,$wParam,$lParam)
Local $t
If _WinAPI_HiWord($wParam)=0x300 And _WINAPI_LoWord($wParam)=$hInputEdit Then
Local $read = GUICtrlRead($hInputEdit)
If Not StringReplace(StringReplace($read, '0', ''), '1', '') Then
$t = TimerInit()
$bEncrypted=_BinToString($read)
$t = TimerDiff($t)
GUICtrlSetData($hOutputEdit,$bEncrypted)
GUICtrlSetData($hLabel, 'Binär -> String - ' & Round($t*1000) & ' µs')
Else
$t = TimerInit()
$bEncrypted=_StringToBin($read)
$t = TimerDiff($t)
GUICtrlSetData($hLabel, 'String -> Binär - ' & Round($t*1000) & ' µs')
GUICtrlSetData($hOutputEdit,$bEncrypted)
EndIf
EndIf
EndFunc
Func _WinAPI_HiWord($iLong)
Return BitShift($iLong, 16)
EndFunc ;==>_WinAPI_HiWord
Func _WinAPI_LoWord($iLong)
Return BitAND($iLong, 0xFFFF)
EndFunc ;==>_WinAPI_LoWord
Func _StringToBin($s) ; String rein, Nullen und Einsen raus !
Local $h = StringTrimLeft(StringToBinary($s), 2), $r
For $i = 1 To StringLen($s) * 2 Step 2 ; 1 Zeichen -> 2 Hex
$r &= $a['0x' & StringMid($h, $i, 2)]
Next
Return $r
EndFunc ;==>_StringToBin
Func _BinToString($b) ; Nullen und Einsen rein, String raus !
Local $s
For $i = 1 To StringLen($b) Step 8 ; 1 Zeichen -> 8 Bit
Switch Int(StringMid($b, $i, 4))
Case 0
$s &= '0'
Case 1
$s &= '1'
Case 10
$s &= '2'
Case 11
$s &= '3'
Case 100
$s &= '4'
Case 101
$s &= '5'
Case 110
$s &= '6'
Case 111
$s &= '7'
Case 1000
$s &= '8'
Case 1001
$s &= '9'
Case 1010
$s &= 'A'
Case 1011
$s &= 'B'
Case 1100
$s &= 'C'
Case 1101
$s &= 'D'
Case 1110
$s &= 'E'
Case 1111
$s &= 'F'
EndSwitch
Switch Int(StringMid($b, $i+4, 4))
Case 0
$s &= '0'
Case 1
$s &= '1'
Case 10
$s &= '2'
Case 11
$s &= '3'
Case 100
$s &= '4'
Case 101
$s &= '5'
Case 110
$s &= '6'
Case 111
$s &= '7'
Case 1000
$s &= '8'
Case 1001
$s &= '9'
Case 1010
$s &= 'A'
Case 1011
$s &= 'B'
Case 1100
$s &= 'C'
Case 1101
$s &= 'D'
Case 1110
$s &= 'E'
Case 1111
$s &= 'F'
EndSwitch
Next
Return BinaryToString('0x' & $s)
EndFunc ;==>_BinToString
Func _DecToBin($iD) ; Modulomethode -> Nicht sehr schnell. Unwichtig, da sie nur zum Initialisieren von 0 bis 255 genutzt wird.
Local $sR
Do
$sR = Mod($iD, 2) & $sR
$iD = Floor($iD / 2)
Until $iD = 0
Return StringRight('0000000' & $sR, ; Es werden 8 Stellen ausgegeben !
EndFunc ;==>_DecToBin
Func _ArrayFuellen() ; Damit alle Werte von 0 bis 255 direkt vorliegen und keine Berechnungen nötig sind.
For $i = 0 To 255 Step 1
$a[$i] = _DecToBin($i)
Next
EndFunc ;==>_ArrayFuellen
Func Random($nMin, $nMax, $bInt)
Return 1
EndFunc
3x DDR hintereinander passiert mit (1/16)^3 = 2,44%
Hier gibts keine konstruktive Kritik mehr. In der Moderation schwirrte ein offensichtlicher Botthread von cfberlin95 herum (sogar 2x), und hier kann man, aufgrund des unglaublich (selbst Spiderman ist enttäuscht) schlechten Sprachgebrauchs, nur erahnen um was es geht. Wenn es eine Regelkonforme Anfrage ist, soll er sie bitte anschaulich und leserlich nochmals stellen, ansonsten gibts hier sowieso keinen Support.
Von meiner Seite sollte hier dicht gemacht werden.
lg
M
Ich hab ne Frage und_zwar, wie kann ich beim Koda FormDesigner,
wenn ich z.B. ein Button habe, festlegen, dass wenn ich draufklicke eine Funktion ausgeführt wird. Ich hab mal den Code hier beigelegt. Beispielsweise möchte ich dem Button sagen, schreibe "hallo welt" in die Box da unten ? Oder öffne den Editor ? Schreibe in den Editor dies oder das!
Jedenfalls will ich, dass ein Button etwas schreibt, ein Button etwas öffnet, und einer für "stop". Aber so, dass wenn man auf den "start" Button drückt, der Editor wieder geöffnet wird.
Ich bin kein Deutschlehrer, und ich habe nichts gegen Umgangssprache, aber DAS ist unlesbar !
Vielen Dank, funktioniert bisher einwandfrei
Um es zu verstehen versuche ich es mal zu entschlüsseln. (Mein Bedürfnis ist es ja nicht euch ewig um RegExen zu bitten...)
Was ich noch nicht verstanden habe ist das "$2".
lg
Mars
Moin,
Hab Guugel schon ein wenig gequält und die RegEx lib durchsucht, leider ohne Erfolg.
Gesucht wird: RegEx welches bei Whitespace (jegliche nicht dargestellten Zeichen wie z.B. Tab, Leerzeichen, usw) anschlägt.
Der Whitespace darf sich aber nicht in Stringdeklarationen via " oder ' befinden.
Vorher: $iVar = 5 + 27 + Funktion01('Hallo ihr da " A B C "', "Hallo ihr da", 55, True) <- Der ist in der SciTE Konsole sogar Rosa
Nachher: $iVar=5+27+Funktion01('Hallo ihr da " A B C "',"Hallo ihr da",55,True)
(Hab die Leerzeichen jetzt von Hand entfernt, es können Fehler enthalten sein, Beobachtung auf eigene Gefahr !)
Das Pattern für das Entfernen eines Leerzeichens ist ja relativ simpel
[autoit]Local $Str = '$iVar = 5 + 27 + Funktion01(''Hallo ihr da " A B C "'', "Hallo ihr da", 55, True)'
ConsoleWrite($Str & @CRLF)
$Str = StringRegExpReplace($Str, '\s', '')
ConsoleWrite($Str & @CRLF)
Aber wie Prüft man, ob sich der Whitespace in Anführungen befindet ?
lg
Mars
Noch ein kleiner Indikator für Bots, die NomadMemory UDF !
Ich kenne bisher vllt 1-2 (von unzähligen) Fällen in denen diese UDF nicht dazu eingesetzt werden sollte irgendwelche Spiele clientseitig zu manipulieren. Daher schätze ich, dass es sich in mindestens 80-90% der Fälle um einen Bot/Hack oder ähnliches handelt, sobald diese UDF auftaucht.
Dann noch allgemein "Pointer". Hier ist die Sache wesentlich schwammiger, da der DLL/ASM Zugriff auf einige Daten in AutoIt (z.B. Structs, Bitmaps, Callbacks usw) hauptsächlich über Pointer funktioniert. In anderen Kreisen stehen (relative) "Pointer" aber hoch im Kurs um an die Daten in laufenden Programmen zu kommen und diese zu manipulieren. Da CE und Konsorten von einigen Spielen mittlerweile erkannt und geblockt werden gibt es auch eine Hand voll Leute die mit AutoIt herumbasteln wollen.
Handelt sich zwar nur um einen Bruchteil der hier Auffälligen, passt aber denke ich am besten hier hin.
Lustige Zitate habe ich leider keine zu bieten; bin wohl nicht vertrauenserweckend genug PN Anfragen zu erhalten
Edit: Soeben ist ein Vorzeigethread entstanden der alles oben genannte abdeckt Hier (wobei die wahre Absicht, wie fast immer, hinterm Berg bleibt...)
lg
Mars
Das Beispielskript ist korrekt. Da wird "nur" der Geschwindigkeitsvektor dargestellt und die Kugel geht praktisch nur einen Schritt.
Und genau das Durchquerungs-ohne-Berührungs Problem soll damit gelöst werden, sonst hätte die ganze Vektorrechnung ja überhaupt keinen Sinn. (Dann würde ein einfaches IsInRect(Kugelmitte) ausreichen)
lg
M
Wenn er es linear berechnet ist die 88 auch falsch.
88h = 136, Damit das die Mitte ist müsste es ja ein paar Farben mehr geben als sich mit 8Bit darstellen lassen.
Mit Berechnungen unter Berücksichtigung des optischen Eindrucks habe ich schon herumgespielt, Du kannst z.B. den Farbraum Umrechner benutzen um ins XYZ oder LAB Format zu wechseln. In diesen Räumen müsste der lineare Abstand in etwa dem Empfundenen Abstand entsprechen.
BugFix : Sei nicht so bescheiden, immerhin hast du die Funktionen für soetwas bereitgestellt
lg
M
Sieht ja schon fast "flüssig" aus. Interessanter Effekt mit einfachen Mitteln...
Dazu fällt mir direkt folgendes ein
Youtube Filmchen
Damit lässt sich doch bestimmt auch irgendwas zaubern.
lg
M