Nottinghster
Tibia World RPG Developer
- Joined
- Oct 24, 2007
- Messages
- 1,570
- Solutions
- 6
- Reaction score
- 437
- Location
- Brazil - Rio de Janeiro
- GitHub
- Nottinghster
Player don't lose level and skills
-- This code is free to use and modify. Credits go to 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:
Add:PHP:#include "talkaction.h" #include "spells.h" #include "configmanager.h"
After:PHP:#include "tools.h"
Add:PHP:Game::Game() {
At botton add:PHP:#ifdef __UCB_DDOS_PROTECTION__ connectionTestFalseValidUntil = std::time(NULL) + 2*60; //Ignore verification in first 2 minutes connectionTestTrueValidUntil = connectionTestFalseValidUntil; connectionTestOk = true; #endif
@ game.hPHP:#ifdef __UCB_DDOS_PROTECTION__ bool 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
After:
Add:PHP:void internalCreatureChangeVisible(Creature* creature, bool visible); void changeLight(const Creature* creature); #ifdef __SKULLSYSTEM__ void changeSkull(Player* player, Skulls_t newSkull); #endif
After:PHP:#ifdef __UCB_DDOS_PROTECTION__ bool isOutSideWorldResponding(); #endif
Add:PHP:uint32_t inFightTicks; uint32_t exhaustionTicks; uint32_t fightExhaustionTicks;
@ tools.cppPHP:#ifdef __UCB_DDOS_PROTECTION__ bool connectionTestOk; uint32_t connectionTestTrueValidUntil; uint32_t connectionTestFalseValidUntil; #endif
Add at bottom:
@ tools.hPHP:#ifdef __UCB_DDOS_PROTECTION__ bool isWorldReachable(){ int32_t ret; #if defined __WINDOWS__ ret = system("ping -n 1 -w 500 google.com > NUL"); #else ret = system("ping -q -c 1 -w 1 google.com > /dev/null"); #endif return (ret == 0); } #endif
Add at bottom:
@ player.cppPHP:#ifdef __UCB_DDOS_PROTECTION__ bool isWorldReachable(); #endif
Change this line:
To:PHP:if(skillLoss){
Chage this other line:PHP:#ifdef __UCB_DDOS_PROTECTION__ if(skillLoss && g_game.isOutSideWorldResponding()){ #else if(skillLoss){ #endif
To:PHP:experience -= getLostExperience();
PHP:#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. Credits go to Proglin --
Rep++ ME!