avatar_SmallHabit

Анти-Мат система для MU Online разработки Узнайте, как работает Анти-Мат система для MU Online разра

Автор SmallHabit, 2010 Нояб. 20, 21:22

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

SmallHabit

Антим Мат система с подменой матных слов на "*",есть наказаниями, для работы наказаний, требует новых глоб. переменных,и место где хранить уровень наказаний.

AntiMat.h
#include "StdAfx.h"

#define MAX_ANTIMAT 2000

struct ANTIMATDATA
{
int aIndex;
char szWord[200];
};

class CAntiMat
{
public:
void Init();
void LoadFile(char *filename);
void Manager(int aIndex,char* Msg);

void Insert(int iIndex, char *szWord);

ANTIMATDATA m_Anti[MAX_ANTIMAT];

int PunishZen;
int PunishPoints;
int PunishDC;

}; extern CAntiMat ANTIMAT;

AntiMat.cpp
#include "AntiMat.h"
#include "GameServer.h"
#include "Protocol.h"
#include "SMDToken.h"
#include "Log.h"
#include "NewQuery.h"
#include "PCPoint.h"
#include "DuelSystem.h"

CAntiMat ANTIMAT;
ANTIMATS AntiMat[OBJ_MAX];

void CAntiMat::Init()
{
for(int i=0;i<MAX_ANTIMAT;i++)
{
this->m_Anti[i].aIndex = -1;
}

PunishZen = GetPrivateProfileInt("AntiMat","PunishZen",100000,"./LCTeam.ini");
PunishPoints = GetPrivateProfileInt("AntiMat","PunishPoints",2,"./LCTeam.ini");
PunishDC = GetPrivateProfileInt("AntiMat","PunishDC",1,"./LCTeam.ini");
}

void CAntiMat::LoadFile(char *filename)
{
this->Init();

if((SMDFile = fopen(filename, "r")) == NULL)
{
MessageBoxA(0,"CAntiMat::LoadFile() error","CRITICAL ERROR",0);
ExitProcess(1);
return;
}

SMDToken Token;
int iIndex;
char szWord[200] = {0};

while(true)
{
Token = GetToken();

if(Token == END)
break;

if(Token == NUMBER)
{
iIndex = TokenNumber;

while(true)
{
Token = GetToken();

if(strcmp("end",TokenString) == 0)
break;

iIndex = TokenNumber;

Token = GetToken();
memcpy(szWord,TokenString,sizeof(szWord));

this->Insert(iIndex,szWord);
//Log.outError("Added[%d][%s]",iIndex,szWord);
}
}
}

fclose(SMDFile);
return;
}

void CAntiMat::Insert(int iIndex, char *szWord)
{
this->m_Anti[iIndex].aIndex = iIndex;
strcpy(this->m_Anti[iIndex].szWord,szWord);
}

void CAntiMat::Manager(int aIndex, char *Msg)
{
OBJECTSTRUCT *gObj = (OBJECTSTRUCT*)OBJECT_POINTER(aIndex);

int count=0;
for(int i=0;i<MAX_ANTIMAT;i++)
{
if(this->m_Anti[i].aIndex != -1)
{
if(_tcsstr(Msg, _T(this->m_Anti[i].szWord)))
{
char * pch;
pch = strstr (Msg,this->m_Anti[i].szWord);
strncpy (pch,"*****************",strlen(this->m_Anti[i].szWord)-1);
Log.outError("Used Word : %s",this->m_Anti[i].szWord);
Log.outError("Msg : %s",Msg);
count++;
//return;
}
}
}

Log.outError("%d",count);

if(count > 0)
{
AntiMat[aIndex].Warning++;
Messages.outNormal(aIndex,"Stop using bad words. Warning [%d/8].",AntiMat[aIndex].Warning);

char dateStr [9];
char timeStr [9];
_strdate(dateStr);
_strtime(timeStr);

FILE* FileHwnd2;
FileHwnd2 = fopen("MyAntiMat.log","a+");
fprintf(FileHwnd2,""%s"    "%s"    "%s"n",gObj->Name,Msg,timeStr);
fclose(FileHwnd2);
}

if(AntiMat[aIndex].Warning == 3 && count > 0)
{
//AntiMat[aIndex].Warning = 0;
if(PunishZen > 0)
{
Messages.outNormal(aIndex,"You have been punished.");
gObj->Money -= PunishZen;
GCMoneySend(aIndex,gObj->Money);
Log.outNormal("Punished[%s][%s] Zen[%d][%d]",gObj->AccountID,gObj->Name,PunishZen,gObj->Money);
}
}

if(AntiMat[aIndex].Warning == 5 && count > 0)
{
if(PunishPoints > 0)
{
Messages.outNormal(aIndex,"You have been punished.");
gObj->Money -= PunishZen*2;
GCMoneySend(aIndex,gObj->Money);
Log.outNormal("Punished[%s][%s] Zen[%d][%d]",gObj->AccountID,gObj->Name,PunishZen*2,gObj->Money);
//    Messages.outNormal(aIndex,"You have been punished.");
/*        gObj->Strength -= PunishPoints;
gObj->Dexterity -= PunishPoints;
gObj->Vitality -= PunishPoints;
gObj->Energy -= PunishPoints;
gObj->Leadership -= PunishPoints;
GCUseEffectItem(gObj, 2, 1, 9, 0);*/
//    Log.outNormal("Punished[%s][%s] Points[%d]",gObj->AccountID,gObj->Name,PunishPoints);
}
}

if(AntiMat[aIndex].Warning == 8 && count > 0)
{
AntiMat[aIndex].Warning = 0;

if(PunishDC > 0)
{
Messages.outNormal(aIndex,"You have been punished.");
CloseClient(aIndex);
Log.outNormal("Punished[%s][%s] Disconnected",gObj->AccountID,gObj->Name);
}
}
}

Protocol.cpp
case 0x00: //Chat proto
ChatDataSend(aIndex,aRecv);
break;

Commands.cpp
void ChatDataSend(DWORD gObjId,LPBYTE Protocol)
{
ANTIMAT.Manager(gObjId,(char*)Protocol+13);
}

Пример конфига :
0
//ID    Word
0    "suka"
1    "pidor"
2    "лох"
3    "пидор"
end

Спасибо :
SmallHabit

[P4F]v1ru5

#1
:facepalm:
Спойлер
[свернуть]
Спойлер
[свернуть]

это была приватная тулзинка

SmallHabit

Цитироватьэто была приватная тулзинка

И она усовершенствовалась  ^_^

LeGrand

#3
Спойлер
Блин, смотрю на C++ код, мне противно :(((
[свернуть]

Похожие темы (5)

Сообщений: 17
Просмотров: 7411

Сообщений: 1
Просмотров: 1469

Сообщений: 11
Просмотров: 2477