{$VERSION 2.6.0}
type
TEvulPlayer = record
Nick,IP: String;
Level: Byte;
end;
const
BADWORD_LIST = 'scripts/badwords.txt';
PUNISH_KICK = 2;
PUNISH_BAN = 4;
PUNISH_BAN_TIME = 180;
PUNISH_WARN_MSG = 'Stop Swearing!';
PUNISH_KICK_MSG = 'You have been warned! KICKED!';
PUNISH_BAN_MSG = 'Enough is enough! BANNED!';
var
BadWords: TStringArray;
EvulPlayers: Array of TEvulPlayer;
procedure SayToID(Const ID:integer;const Text:String);
begin
if (ID=255) then WriteLn(Text)
else SayToPlayer(ID,Text);
end;
procedure LoadBadWords;
begin
BadWords:= xsplit(ReadFile(BADWORD_LIST),#13#10);
if BadWords[ArrayHigh(BadWords)] = '' then
SetArrayLength(BadWords,ArrayHigh(BadWords));
end;
procedure ActivateServer();
begin
ThreadFunc([],'LoadBadWords');
end;
procedure AddBadWord(const ID: Byte; BadWord: String);
begin
BadWord:=LowerCase(Trim(BadWord));
WriteLnFile(BADWORD_LIST,BadWord);
SetArrayLength(BadWords,GetArrayLength(BadWords)+1);
BadWords[ArrayHigh(BadWords)]:= BadWord;
SayToID(ID,'Badword "'+BadWord+'" added');
end;
procedure DelBadWord(const ID: Byte; BadWord: String);
var
i,z:integer;
s:string;
found: Boolean;
begin
BadWord:=LowerCase(Trim(BadWord));
for i:=0 to ArrayHigh(BadWords) do begin
if (BadWord=BadWords[i]) then begin
for z:=i to ArrayHigh(BadWords)-1 do begin
BadWords[z]:= BadWords[z+1];
end;
SetArrayLength(BadWords,ArrayHigh(BadWords));
Found:= true;
break;
end;
end
if Found then begin
for i:=0 to ArrayHigh(BadWords) do begin
s:=s+BadWords[i]+chr(13)+chr(10);
end;
WriteFile(BADWORD_LIST,s);
SayToID(ID,'BadWord "'+BadWord+'" deleted');
end else SayToID(ID,'BadWord "'+BadWord+ ' not found');
end;
function OnCommand(ID: Byte; Text: string): boolean;
begin
//NOTE: This function will be called when an admin types a / command.
Result := false; // Return true if you want to ignore the command typed.
if (Copy(Text,1,11) = '/addbadword') then AddBadWord(ID,Copy(Text,13,200))
else if (Copy(Text,1,11) = '/delbadword') then DelBadWord(ID,Copy(Text,13,200));
end;
//NETWORKCORE.PAS
procedure ForgiveEvuls;
var
i,z:Integer;
begin
for i:=0 to GetArrayLength(EvulPlayers)-1 do begin
if EvulPlayers[i].Level = 1 then begin
for z:=i to GetArrayLength(EvulPlayers)-2 do begin
EvulPlayers[z]:= EvulPlayers[z+1];
end;
SetArrayLength(EvulPlayers,GetArrayLength(EvulPlayers)-1);
end else
EvulPlayers[i].Level := EvulPlayers[i].Level -1;
end;
end;
procedure OnMapChange(NewMap: string);
begin
ThreadFunc([],'ForgiveEvuls');
end;
procedure PunishEvulPlayer(ID: Byte);
var
i,z:integer;
sIP,sNick:String;
Found: Boolean;
begin
sIP:= IDToIP(ID);
sNick:= IDtoName(ID);
for i:=0 to GetArrayLength(EvulPlayers)-1 do begin
if ((sIP = EvulPlayers[i].IP) or (sNick = EvulPlayers[i].Nick)) then begin
EvulPlayers[i].Level := EvulPlayers[i].Level + 1;
if (PUNISH_BAN <= EvulPlayers[i].Level) then begin
SayToID(ID,PUNISH_BAN_MSG);
BanPlayer(ID,PUNISH_BAN_TIME);
end else if (PUNISH_KICK <= EvulPlayers[i].Level) then begin
SayToID(ID,PUNISH_KICK_MSG);
KickPlayer(ID);
end else begin
Command('/kill '+IntToStr(ID));
SayToID(ID,PUNISH_WARN_MSG);
end;
Found:= True;
break;
end;
end;
if not found then begin
SetArrayLength(EvulPlayers,GetArrayLength(EvulPlayers)+1);
z:= GetArrayLength(EvulPlayers)-1;
EvulPLayers[z].Nick:= sNick;
EvulPLayers[z].IP:= sIP;
EvulPLayers[z].Level:= 1;
Command('/kill '+IntToStr(ID));
SayToID(ID,PUNISH_WARN_MSG);
end;
end;
procedure CheckBadWords(const ID:Byte; var Text:String);
var
i: integer;
begin
for i:=0 to ArrayHigh(BadWords) do begin
if MaskCheck(Text,BadWords[i]) then begin
PunishEvulPlayer(ID);
break;
end;
end;
end;
procedure OnPlayerSpeak(ID: byte; Text: string);
begin
ThreadFunc([ID,Lowercase(Text)],'CheckBadWords');
end;