Kungenn
Veteran OT User
Okay so I were searching around forums yesterday cause we had ping attacks on our server and I found something interesting that might not just be good for ping attacks but for all the time.
I can find the codes again if this sounds interesting and post them here and perhaps someone can make them flawless
Anyway so what it does is simply if a player dies the server check if it can connect to a certain website, (this could a option in config.cfg perhaps checksite = "www.google.com") and if it can connect the player dies and lose skill blabla just like a normal death.
BUT if it can't connect to the website given the player that dies simply ends up in the temple with same skills & level & items.
This would prevent people from losing levels if its the server internet that disconnects..
I think this is a really good thing and imo even cip should use it
I'll find the codes and post them soon.
Thanks for reading! (;
COPIED FROM Proglin
Problem: your server is constantly under DDoS / Flood / Nuke attack and players are dying.
One possible solution: when player dies try to reach a computer outside to see if your server connection is ok.
Comments: I have developed this solution because my server in constantly under DDoS attack. I used SVN revision from begining of December, but you can use this code as base to your personal necessity.
Modifications:
@ game.cpp
After:
C++:
#include "talkaction.h"
#include "spells.h"
#include "configmanager.h"
Add:
C++:
#include "tools.h"
After:
C++:
Game::Game()
{
Add:
C++:
#ifdef __UCB_DDOS_PROTECTION__
connectionTestFalseValidUntil = std::time(NULL) + 2*60; //Ignore verification in first 2 minutes
connectionTestTrueValidUntil = connectionTestFalseValidUntil;
connectionTestOk = true;
#endif
At botton add:
C++:
#ifdef __UCB_DDOS_PROTECTION__
bool Game::isOutSideWorldResponding(){
OTSYS_THREAD_LOCK_CLASS lockClass(gameLock, "Game::isOutSideWorldResponding()");
uint32_t now = std::time(NULL);
if( !connectionTestOk ){
if( now > connectionTestFalseValidUntil ){
//Redo test
connectionTestOk = isWorldReachable();
connectionTestFalseValidUntil = now + 60; //False result is valid for 60 seconds
}
} else {
if( now > connectionTestTrueValidUntil ){
//Redo test
connectionTestOk = isWorldReachable();
connectionTestTrueValidUntil = now + 10; //Ok result is valid for 10 secongs
}
}
return connectionTestOk;
}
#endif
@ game.h
After:
C++:
void internalCreatureChangeVisible(Creature* creature, bool visible);
void changeLight(const Creature* creature);
#ifdef __SKULLSYSTEM__
void changeSkull(Player* player, Skulls_t newSkull);
#endif
Add:
C++:
#ifdef __UCB_DDOS_PROTECTION__
bool isOutSideWorldResponding();
#endif
After:
C++:
uint32_t inFightTicks;
uint32_t exhaustionTicks;
uint32_t fightExhaustionTicks;
Add:
C++:
#ifdef __UCB_DDOS_PROTECTION__
bool connectionTestOk;
uint32_t connectionTestTrueValidUntil;
uint32_t connectionTestFalseValidUntil;
#endif
@ tools.cpp
Add at bottom:
C++:
#ifdef __UCB_DDOS_PROTECTION__
bool isWorldReachable(){
int32_t ret;
#if defined __WINDOWS__
ret = system("<span class="highlight">ping</span> -n 1 -w 500 google.com > NUL");
#else
ret = system("<span class="highlight">ping</span> -q -c 1 -w 1 google.com > /dev/null");
#endif
return (ret == 0);
}
#endif
@ tools.h
Add at bottom:
C++:
#ifdef __UCB_DDOS_PROTECTION__
bool isWorldReachable();
#endif
@ player.cpp
Change this line:
C++:
if(skillLoss){
To:
C++:
#ifdef __UCB_DDOS_PROTECTION__
if(skillLoss && g_game.isOutSideWorldResponding()){
#else
if(skillLoss){
#endif
Chage this other line:
C++:
experience -= getLostExperience();
To:
C++:
#ifdef __UCB_DDOS_PROTECTION__
if( g_game.isOutSideWorldResponding() ){
experience -= getLostExperience();
}
#else
experience -= getLostExperience();
#endif
Now rebuild all and test (remeber to use flag: -D__UCB_DDOS_PROTECTION__
Note: you can change the part "google.com" for anyone that you think is better. For test if this is ok, change this part to a site that you know that is not responding and kill youself in server. If it works ok you will go to temple with full life.
Have new year
Later I could improve this code.
Have FUN
-- This code is free to use and modify. Original credits will be fine --
I can find the codes again if this sounds interesting and post them here and perhaps someone can make them flawless
Anyway so what it does is simply if a player dies the server check if it can connect to a certain website, (this could a option in config.cfg perhaps checksite = "www.google.com") and if it can connect the player dies and lose skill blabla just like a normal death.
BUT if it can't connect to the website given the player that dies simply ends up in the temple with same skills & level & items.
This would prevent people from losing levels if its the server internet that disconnects..
I think this is a really good thing and imo even cip should use it
I'll find the codes and post them soon.
Thanks for reading! (;
COPIED FROM Proglin
Problem: your server is constantly under DDoS / Flood / Nuke attack and players are dying.
One possible solution: when player dies try to reach a computer outside to see if your server connection is ok.
Comments: I have developed this solution because my server in constantly under DDoS attack. I used SVN revision from begining of December, but you can use this code as base to your personal necessity.
Modifications:
@ game.cpp
After:
C++:
#include "talkaction.h"
#include "spells.h"
#include "configmanager.h"
Add:
C++:
#include "tools.h"
After:
C++:
Game::Game()
{
Add:
C++:
#ifdef __UCB_DDOS_PROTECTION__
connectionTestFalseValidUntil = std::time(NULL) + 2*60; //Ignore verification in first 2 minutes
connectionTestTrueValidUntil = connectionTestFalseValidUntil;
connectionTestOk = true;
#endif
At botton add:
C++:
#ifdef __UCB_DDOS_PROTECTION__
bool Game::isOutSideWorldResponding(){
OTSYS_THREAD_LOCK_CLASS lockClass(gameLock, "Game::isOutSideWorldResponding()");
uint32_t now = std::time(NULL);
if( !connectionTestOk ){
if( now > connectionTestFalseValidUntil ){
//Redo test
connectionTestOk = isWorldReachable();
connectionTestFalseValidUntil = now + 60; //False result is valid for 60 seconds
}
} else {
if( now > connectionTestTrueValidUntil ){
//Redo test
connectionTestOk = isWorldReachable();
connectionTestTrueValidUntil = now + 10; //Ok result is valid for 10 secongs
}
}
return connectionTestOk;
}
#endif
@ game.h
After:
C++:
void internalCreatureChangeVisible(Creature* creature, bool visible);
void changeLight(const Creature* creature);
#ifdef __SKULLSYSTEM__
void changeSkull(Player* player, Skulls_t newSkull);
#endif
Add:
C++:
#ifdef __UCB_DDOS_PROTECTION__
bool isOutSideWorldResponding();
#endif
After:
C++:
uint32_t inFightTicks;
uint32_t exhaustionTicks;
uint32_t fightExhaustionTicks;
Add:
C++:
#ifdef __UCB_DDOS_PROTECTION__
bool connectionTestOk;
uint32_t connectionTestTrueValidUntil;
uint32_t connectionTestFalseValidUntil;
#endif
@ tools.cpp
Add at bottom:
C++:
#ifdef __UCB_DDOS_PROTECTION__
bool isWorldReachable(){
int32_t ret;
#if defined __WINDOWS__
ret = system("<span class="highlight">ping</span> -n 1 -w 500 google.com > NUL");
#else
ret = system("<span class="highlight">ping</span> -q -c 1 -w 1 google.com > /dev/null");
#endif
return (ret == 0);
}
#endif
@ tools.h
Add at bottom:
C++:
#ifdef __UCB_DDOS_PROTECTION__
bool isWorldReachable();
#endif
@ player.cpp
Change this line:
C++:
if(skillLoss){
To:
C++:
#ifdef __UCB_DDOS_PROTECTION__
if(skillLoss && g_game.isOutSideWorldResponding()){
#else
if(skillLoss){
#endif
Chage this other line:
C++:
experience -= getLostExperience();
To:
C++:
#ifdef __UCB_DDOS_PROTECTION__
if( g_game.isOutSideWorldResponding() ){
experience -= getLostExperience();
}
#else
experience -= getLostExperience();
#endif
Now rebuild all and test (remeber to use flag: -D__UCB_DDOS_PROTECTION__
Note: you can change the part "google.com" for anyone that you think is better. For test if this is ok, change this part to a site that you know that is not responding and kill youself in server. If it works ok you will go to temple with full life.
Have new year
Later I could improve this code.
Have FUN
-- This code is free to use and modify. Original credits will be fine --
Last edited: