{$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;