From: ZephyrsFury
Basically what an autoresponder is:
- Check for other players' chat.
- Cross reference the players' chat with what you're looking for.
- If players' chat matches what you're looking for then respond.
Step 1, usually pretty simple. You just need some place to find what other people are saying. Its easiest to use the chatbox as it shows all the text in a small area. (I've seen people trying to use the mainscreen too though). Try having a look at Chat.scar for functions that Get the ChatBox Text or Find the chat box text.
Step 2, I'd say this is the hardest part as it can get very complicated. For small autoresponders this is isn't too hard but as you try to add lots of triggers and responses it can get very inefficient and slow. A simple method is to get the chat box text in the last line then just checking if your deserved trigger words are in that line.
Step 3. You have to be careful here too. You must have a variety of responses so that you don't look like a bot and respond to everything with the same phrase. In a simple responder you could just randomly choose the phrases. Then use TypeSend() to type the text into the game.
So final result: Simple autoresponder (that you probably shouldn't use without major modifications).
procedure AutoRespond;
var
RandomNum: Integer;
LastLineText: string;
begin
LastLineText := Lowercase(GetChatBoxText(8, clBlue)); //Step 1
if (Pos('hi', LastLineText) > 0) or (Pos('hello', LastLineText) > 0) or (Pos('hey', LastLineText) > 0) then //Step 2
begin
WriteLn('Found autoresponder text');
RandomNum := Random(3);
case RandomNum of //Step 3
0: TypeSend('hello');
1: TypeSend('hi');
2: TypeSend('hey');
end;
Exit;
end;
if (Pos('wc lvl', LastLineText) > 0) or (Pos('wc level', LastLineText) > 0) or (Pos('cutting lvl', LastLineText) > 0) then //Step 2
begin
WriteLn('Found autoresponder text');
RandomNum := Random(3);
case RandomNum of //Step 3
0: TypeSend(IntToStr(YourWCLevel));
1: TypeSend('my wc is ' + IntToStr(YourWCLevel));
2: TypeSend('my wc level is ' + IntToStr(YourWCLevel));
end;
Exit;
end;
end;
Using "if"s for the responder is slow when you have like 5+ "if"s. Use a case and it will go a lot faster. Change that ^ into a case and it will basically look like my responder I gave.
Ill show you my full autoresponder that Im still adding to.
procedure AutoRespond;
var
MyLevel: integer;
begin
MyLevel:= GetMySkill(14,true);
case lowercase(GetChatBoxText(8, clChat)) of
'lvl?':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'lvl':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'lvls?':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'lvls':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'level?':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'level':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'levels?':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'levels':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mining lvl?':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mining lvl':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mining lvls?':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mining lvls':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mining level?':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mining level':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mining levels?':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mining levels':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mine lvl?':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mine lvl':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mine lvls?':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mine lvls':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mine level?':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mine level':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mine levels?':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'mine levels':
begin
case Random(3) of
0: TypeSend(IntToStr(MyLevel));
1: TypeSend(AddMistakes('I have ',25)+IntToStr(MyLevel)+AddMistakes('mining',25));
2: QCSayLevel('mining');
end;
Wait(RandomRange(500,750));
end;
'hi':
begin
case Random(3) of
0: TypeSend('Hi');
1: TypeSend('Hey');
2: QCSayLevel('Hello');
end;
Wait(RandomRange(500,750));
end;
'hey':
begin
case Random(3) of
0: TypeSend('Hi');
1: TypeSend('Hey');
2: QCSayLevel('Hello');
end;
Wait(RandomRange(500,750));
end;
'hello':
begin
case Random(3) of
0: TypeSend('Hi');
1: TypeSend('Hey');
2: QCSayLevel('Hello');
end;
Wait(RandomRange(500,750));
end;
'what is your level in mining?': QCSayLevel('mining');
'what pickaxe are you using?':
begin
case Random(4) of
0: TypeSend(AddMistakes(MyPick,20));
1: TypeSend(AddMistakes('I am using a ',25)+MyPick+AddMistakes('pickaxe',25));
1: TypeSend(AddMistakes('Im using a ',25)+MyPick+AddMistakes('pickaxe',25));
2:
begin
QCOpenMenu('Skill',['i',4]);
case MyPick of
'bronze': Mouse(22, 400, 6, 2, true);
'iron': Mouse(22, 414, 6, 2, true);
'steel': Mouse(22, 455, 6, 2, true);
'mithril': Mouse(22, 427, 6, 2, true);
'adamant': Mouse(22, 386, 6, 2, true);
'rune': Mouse(22, 442, 6, 2, true);
end;
end;
end;
end;
'what ore are you mining?':
begin
case Random(2) of
0: TypeSend(AddMistakes('Im mining ',25)+Players[CurrentPlayer].Strings[0]+'ore');
1: TypeSend(Players[CurrentPlayer].Strings[0]);
end;
Wait(RandomRange(500,750));
end;
end;
end;
Responds in less than a second.