Jak niektórzy zauważyli jest wysyp botów wysyłających keyloggery albo reklamy do wszystkich graczy online na podstawie who is online. Myślałem jak to zatrzymać od strony lua ale nie da rady bo sam kanał private nie posiada własnego ID więc tutaj brak pomysłów. Zrobiłem łopatologicznie (absolutnie wzorując się na poradnikach bo nie jestem dobry w c++) ograniczenie w źródłach aby można było max 3 priv rozmowy prowadzić i dlatego jak ktoś ma czas żeby to przejrzeć czy nie będzie przypadkiem powodować lagów albo crashy bym był wzdięczny lub jeśli ktoś chce korzystać ;p
Skrypt powoduje limit na rozmowy prywatne do maksymalnie 3 osób, jeśli gracz ma poniżej 100 levelu. (możesz ustawić limit jaki chcesz, ważne aby spammerowi nie chciało się levelować każdego chara po to aby zaspamować serwer).
Z 3 osobami, z którymi się rozmawia na priv nie ma żadnych opuźnień itp. ale żeby rozpocząć rozmowe z 4 trzeba odczekać 30 minut.
Ogranicza to boty rozsyłające reklamy do otsów, które w ciągu kilku minut wysyłaja wiadomości do wszystkich graczy na priv które są online. W ostatnim czasie rozmnożyło się takich spamerów.
Aby obejść ten limit spammer musiałby stworzyć pierdyliant postaci aby każdemu wysłać reklame lub wysyłać do 3 graczy co 30minut co wysładnie do 100 graczy zajeło by mu ok. 20 godzin.
W player.h tworzymy std::multimap, który będzie przechowywać guid graczy rozmawiających oraz czas wysłania ost. wiadomości:
nad:
dodajemy:
w game.cpp nad:
dodajemy:
Niby działa dobrze ;pp ale może ktoś zaawansowany przejrzy i jakoś zoptymalizuje ;p
Skrypt powoduje limit na rozmowy prywatne do maksymalnie 3 osób, jeśli gracz ma poniżej 100 levelu. (możesz ustawić limit jaki chcesz, ważne aby spammerowi nie chciało się levelować każdego chara po to aby zaspamować serwer).
Z 3 osobami, z którymi się rozmawia na priv nie ma żadnych opuźnień itp. ale żeby rozpocząć rozmowe z 4 trzeba odczekać 30 minut.
Ogranicza to boty rozsyłające reklamy do otsów, które w ciągu kilku minut wysyłaja wiadomości do wszystkich graczy na priv które są online. W ostatnim czasie rozmnożyło się takich spamerów.
Aby obejść ten limit spammer musiałby stworzyć pierdyliant postaci aby każdemu wysłać reklame lub wysyłać do 3 graczy co 30minut co wysładnie do 100 graczy zajeło by mu ok. 20 godzin.
W player.h tworzymy std::multimap, który będzie przechowywać guid graczy rozmawiających oraz czas wysłania ost. wiadomości:
nad:
Code:
protected:
Code:
typedef std::multimap<uint32_t, std::pair<uint32_t, uint32_t> > PrivMsgMap;
static PrivMsgMap privMsgMap;
w game.cpp nad:
Code:
if(type == SPEAK_PRIVATE_RED && !player->hasFlag(PlayerFlag_CanTalkRedPrivate))
Code:
if(player->getLevel() <= [B]100[/B]) // ponizej jakiego lvlu bedzie ograniczenie
{
uint32_t seconds = time (NULL);
uint32_t to_PID = toPlayer->getGUID();
uint32_t from_PID = player->getGUID();
bool exist_priv = false;
uint32_t count_privs = 0;
for(std::multimap<uint32_t, std::pair<uint32_t, uint32_t> >::iterator it = privMsgMap.begin(); it != privMsgMap.end(); ++it)
{
if(it->first == from_PID)
{
if(to_PID == it->second.first)
{
// Znaleziono taka aktywna rozmowe, wprowadzono date wywolania i przerwana iteracje
it->second.second = seconds;
exist_priv = true;
count_privs += 1;
continue;
}
if(it->second.second + (60*30) < seconds)
{
// Znaleziono nieaktywna rozmowe (od ponad 30 min.) - usunieto ja z listy
privMsgMap.erase(it);
continue;
}
count_privs += 1;
}
}
if(!exist_priv)
{
if(count_privs >= [B]3[/B]) // ile maksymalnie może być rozmów priv
{
// Rozmowa nie istnieje i przekroczono limit rozmow (max 3)
player->sendTextMessage(MSG_STATUS_SMALL, "Ponizej 100 lvlu mozesz prowadzic max 3 rozmowy prywatne. Stare rozmowy sa kasowane po 30min.");
return false;
}
else
{
// Rozmowa nie istnieje i gracz nie prowadzi zbyt wielu rozmow (max 3)
privMsgMap.insert(std::make_pair(from_PID, std::make_pair(to_PID, seconds)));
}
}
}
Niby działa dobrze ;pp ale może ktoś zaawansowany przejrzy i jakoś zoptymalizuje ;p
Last edited: