Guten Tag,
wie kann man bei AHK eine Anti-Commandspam einbauen dass in der Sekunde nicht mehr als 6 Commands abgeschickt werden.
Ich hoffe dass ihr mir helfen kann?
Grüße
Guten Tag,
wie kann man bei AHK eine Anti-Commandspam einbauen dass in der Sekunde nicht mehr als 6 Commands abgeschickt werden.
Ich hoffe dass ihr mir helfen kann?
Grüße
Ich gehe mal davon aus, dass du die UDF nutzt. Wenn du das nur für den Keybinder selber haben möchtest, kannst du entweder vor jedes SendChat eine Abfrage schreiben, über eine Counter-Variable oder direkt die SendChat Funktion ändern und dort die Abfrage einbauen. Die Variable wird mit jedem Mal hochgezählt, wenn ein Command ausgeführt wird und ein 1000ms Timer sorgt dafür, dass die Variable resettet wird. Wenn du alle Commands mitzählen willst, auch die die du händisch eingibst, musst du ein System schreiben, welches die Commands erst abfängt, bevor sie abgeschickt werden.
Edit: Wenn ich so darüber nachdenke, glaube ich nicht, dass es möglich ist, per Hand 6 Commands die Sekunde zu schicken
Also wie? Ein Timer der nach 1 Sekunde die Variable auf 0 setzt und eine die Abfragt ob die Variable bei 6 ist oder wie?
Zum Beispiel so:
global commandCounter := 0
SetTimer, CommandReset, 1000
CommandReset:
commandCounter := 0
return
SendChat(wText) {
if (!checkHandles())
return false
if (SubStr(wText, 1, 1) == "/") {
if (commandCounter >= 6)
return false
dwFunc := dwSAMP + FUNC_SAMP_SENDCMD
commandCounter++
}
else
dwFunc := dwSAMP + FUNC_SAMP_SENDSAY
return callWithParams(hGTA, dwFunc, [["s", wText]], false)
}
Alles anzeigen
Allerdings bleibt die Frage, wie genau das Anti-Spam System vom Server eingestellt ist. Denn mit dem Code oben könnte es passieren, dass du 6 Commands schickst, dann praktisch sofort danach der Timer ausgeführt wird und die Variable zurücksetzt und dann wieder 6 Commands verschickt werden. Daher dann eher so:
global commandCounter := 0
CommandReset:
commandCounter := 0
return
SendChat(wText) {
if (!checkHandles())
return false
if (SubStr(wText, 1, 1) == "/") {
if (commandCounter >= 6)
return false
if (commandCounter == 0) {
SetTimer, CommandReset, 1000, 1
}
dwFunc := dwSAMP + FUNC_SAMP_SENDCMD
commandCounter++
}
else
dwFunc := dwSAMP + FUNC_SAMP_SENDSAY
return callWithParams(hGTA, dwFunc, [["s", wText]], false)
}
Alles anzeigen
Edit: Wenn counter gleich 0 nicht 1.
Der Timer funktioniert nicht, b.z wird nicht auf 0 gesetzt
Also bei mir funktioniert's. Pack mal in den Timer ein AddChatMessage rein, um zu sehen, ob er funktioniert (bzw. je nach Editor eine Nachricht in die Debug Konsole). Gleiches für commandCounter in der SendChat Funktion.
Das Problem liegt daran. Die Befehle gehen nur bis 6 und dann wird es aber nicht resetet
Wird der Timer denn ausgeführt?
Nein
Steht global commandCounter := 0 oben im Script unter den Deklarationen vor dem ersten Return?
Steht global commandCounter := 0 oben im Script unter den Deklarationen vor dem ersten Return?
Einfach oben zu den anderen Deklarationen hinsetzen, falls du keine hast, vor dem ersten Return
Es klappt immernoch nicht. Wenn ich es ohne Timer mache, dann kann ich nur bis 6 Commands abschicken, wenn ich es aber mit Timer mache, dann werde ich trotzdem gekickt.
global cCounter := 0
SetTimer, ResetTimer, 1800
ResetTimer:
cCounter := 0
return
SendChat(wText) {
if (!checkHandles())
return false
if (SubStr(wText, 1, 1) == "/") {
if(cCounter >= 6)
{
return false
}
dwFunc := dwSAMP + FUNC_SAMP_SENDCMD
cCounter++
}
else
dwFunc := dwSAMP + FUNC_SAMP_SENDSAY
return callWithParams(hGTA, dwFunc, [["s", wText]], false)
}
Alles anzeigen
Dann probier mal bitte dieses Script, am besten auf einem Testserver auf dem du nicht gekickt wirst:
#NoEnv
#SingleInstance, Force
#Include SAMP.ahk
global commandCounter := 0
return
SendChat(wText) {
if (!checkHandles())
return false
if (SubStr(wText, 1, 1) == "/") {
if (commandCounter >= 6)
return false
if (commandCounter == 0)
SetTimer, CommandReset, 1000, 1
dwFunc := dwSAMP + FUNC_SAMP_SENDCMD
commandCounter++
}
else
dwFunc := dwSAMP + FUNC_SAMP_SENDSAY
return callWithParams(hGTA, dwFunc, [["s", wText]], false)
}
CommandReset:
commandCounter := 0
return
#If WinActive("GTA:SA:MP") && !isInChat()
!1::
Loop, 10
SendChat("/Test")
return
Alles anzeigen
Die SendChat-Funktion in der SAMP.ahk logischerweise ausklammern.