diff options
| author | Teetime <teetimetw@yahoo.de> | 2011-11-05 18:03:33 +0100 |
|---|---|---|
| committer | Teetime <teetimetw@yahoo.de> | 2011-11-05 18:03:33 +0100 |
| commit | 744018aaafb218321907c4e0c0e0b4472fb7e1b9 (patch) | |
| tree | 50323eec409c701dfd16c5275ef17d795b85efc9 /src | |
| parent | 24718cc8d6f8021f6c54e1c2207f7e68b75a22c3 (diff) | |
| download | zcatch-744018aaafb218321907c4e0c0e0b4472fb7e1b9.tar.gz zcatch-744018aaafb218321907c4e0c0e0b4472fb7e1b9.zip | |
Added possibility to freeze players and improved and extended anticamper
Diffstat (limited to 'src')
| -rw-r--r-- | src/game/server/entities/character.cpp | 19 | ||||
| -rw-r--r-- | src/game/server/entities/character.h | 2 | ||||
| -rw-r--r-- | src/game/server/gamecontext.cpp | 15 | ||||
| -rw-r--r-- | src/game/server/gamemodes/zcatch.cpp | 6 | ||||
| -rw-r--r-- | src/game/server/player.cpp | 31 | ||||
| -rw-r--r-- | src/game/server/player.h | 1 | ||||
| -rw-r--r-- | src/game/variables.h | 1 |
7 files changed, 67 insertions, 8 deletions
diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index 06c1c913..d09bc714 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -541,6 +541,12 @@ void CCharacter::OnPredictedInput(CNetObj_PlayerInput *pNewInput) void CCharacter::OnDirectInput(CNetObj_PlayerInput *pNewInput) { + if(m_pPlayer->m_FreezeTicks) + { + ResetInput(); + return; + } + mem_copy(&m_LatestPrevInput, &m_LatestInput, sizeof(m_LatestInput)); mem_copy(&m_LatestInput, pNewInput, sizeof(m_LatestInput)); @@ -579,6 +585,11 @@ void CCharacter::Tick() m_Core.m_Input = m_Input; m_Core.Tick(true); + //Set weapon back to the last one + if(m_pPlayer->m_FreezeTicks == 1) + SetWeapon(m_LastWeapon); + + // handle death-tiles and leaving gamelayer if(GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || @@ -894,3 +905,11 @@ void CCharacter::Snap(int SnappingClient) pCharacter->m_PlayerFlags = GetPlayer()->m_PlayerFlags; } + +void CCharacter::Freeze(int Ticks) +{ + m_pPlayer->m_FreezeTicks = Ticks; + m_LastWeapon = m_ActiveWeapon; + m_ActiveWeapon = WEAPON_NINJA; + GameServer()->CreateSound(m_Pos, SOUND_PLAYER_PAIN_LONG); +} diff --git a/src/game/server/entities/character.h b/src/game/server/entities/character.h index a311a6f9..f90e4d80 100644 --- a/src/game/server/entities/character.h +++ b/src/game/server/entities/character.h @@ -64,6 +64,8 @@ public: bool IsAlive() const { return m_Alive; } class CPlayer *GetPlayer() { return m_pPlayer; } + void Freeze(int Tick); + private: // player controlling this character class CPlayer *m_pPlayer; diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index a34890e5..1900b314 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -1124,13 +1124,18 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID) else if (MsgID == NETMSGTYPE_CL_KILL && !m_World.m_Paused) { /* begin zCatch*/ - if(pPlayer->m_LastKill && pPlayer->m_LastKill + Server()->TickSpeed()*15 > Server()->Tick()) - { - if((pPlayer->GetTeam() == TEAM_SPECTATORS) || (pPlayer->m_LastKillTry && pPlayer->m_LastKillTry+Server()->TickSpeed()*2 > Server()->Tick())) - return; - SendChatTarget(ClientID, "Only one kill in 15sec is allowed."); + if((pPlayer->GetTeam() == TEAM_SPECTATORS) || (pPlayer->m_LastKillTry && pPlayer->m_LastKillTry+Server()->TickSpeed()*2 > Server()->Tick())) + return; + + if(pPlayer->m_FreezeTicks) + { + SendChatTarget(ClientID, "You can't kill yourself while you're frozen"); pPlayer->m_LastKillTry = Server()->Tick(); } + else if(pPlayer->m_LastKill && pPlayer->m_LastKill + Server()->TickSpeed()*15 > Server()->Tick()) + { + SendBroadcast("Only one kill in 15sec is allowed.", ClientID); + } else { pPlayer->m_LastKill = Server()->Tick(); diff --git a/src/game/server/gamemodes/zcatch.cpp b/src/game/server/gamemodes/zcatch.cpp index eac8a4d3..4699166f 100644 --- a/src/game/server/gamemodes/zcatch.cpp +++ b/src/game/server/gamemodes/zcatch.cpp @@ -94,7 +94,10 @@ int CGameController_zCatch::OnCharacterDeath(class CCharacter *pVictim, class CP if(WeaponID == WEAPON_SELF || WeaponID == WEAPON_WORLD) pVictim->GetPlayer()->m_Score -= 15; } - + + // Unfreeze the victim if he dies + pVictim->GetPlayer()->m_FreezeTicks = 0; + for(int i=0; i < MAX_CLIENTS; i++) { if(GameServer()->m_apPlayers[i]) @@ -151,6 +154,7 @@ void CGameController_zCatch::StartRound() GameServer()->m_apPlayers[i]->m_Deaths = 0; GameServer()->m_apPlayers[i]->m_TicksSpec = 0; GameServer()->m_apPlayers[i]->m_TicksIngame = 0; + GameServer()->m_apPlayers[i]->m_FreezeTicks = 0; } } char aBufMsg[256]; diff --git a/src/game/server/player.cpp b/src/game/server/player.cpp index 7464e3c7..e165d0b6 100644 --- a/src/game/server/player.cpp +++ b/src/game/server/player.cpp @@ -32,6 +32,7 @@ CPlayer::CPlayer(CGameContext *pGameServer, int ClientID, int Team) m_TicksSpec = 0; m_TicksIngame = 0; m_ChatTicks = 0; + m_FreezeTicks = 0; } CPlayer::~CPlayer() @@ -60,7 +61,14 @@ void CPlayer::Tick() if(m_ChatTicks > 0) m_ChatTicks--; - if(g_Config.m_SvAnticamper && m_pCharacter && !GameServer()->m_World.m_Paused) + if(m_FreezeTicks) + { + if(Server()->Tick() % Server()->TickSpeed() == 0) + GameServer()->CreateDamageInd(m_ViewPos, 0, m_FreezeTicks/Server()->TickSpeed()+1); + m_FreezeTicks--; + } + + if(g_Config.m_SvAnticamper) Anticamper(); /* end zCatch*/ @@ -193,6 +201,9 @@ void CPlayer::OnPredictedInput(CNetObj_PlayerInput *NewInput) if((m_PlayerFlags&PLAYERFLAG_CHATTING) && (NewInput->m_PlayerFlags&PLAYERFLAG_CHATTING)) return; + if(m_FreezeTicks) + return; + if(m_pCharacter) m_pCharacter->OnPredictedInput(NewInput); } @@ -218,6 +229,9 @@ void CPlayer::OnDirectInput(CNetObj_PlayerInput *NewInput) if(m_pCharacter) m_pCharacter->OnDirectInput(NewInput); + if(m_FreezeTicks) + return; + if(!m_pCharacter && m_Team != TEAM_SPECTATORS && (NewInput->m_Fire&1)) m_Spawning = true; @@ -308,6 +322,13 @@ void CPlayer::TryRespawn() int CPlayer::Anticamper() { + if(GameServer()->m_World.m_Paused || m_FreezeTicks || m_Team == TEAM_SPECTATORS || !m_pCharacter) + { + m_CampTick = -1; + m_SentCampMsg = false; + return 0; + } + int AnticamperTime = g_Config.m_SvAnticamperTime; int AnticamperRange = g_Config.m_SvAnticamperRange; @@ -334,7 +355,13 @@ int CPlayer::Anticamper() // Kill him if((m_CampTick <= Server()->Tick()) && (m_CampTick > 0)) { - m_pCharacter->Die(m_ClientID, WEAPON_ANTICAMPER); + if(g_Config.m_SvAnticamperFreeze) + { + m_pCharacter->Freeze(Server()->TickSpeed()*g_Config.m_SvAnticamperFreeze); + GameServer()->SendBroadcast("You have been freezed due camping", m_ClientID); + } + else + m_pCharacter->Die(m_ClientID, WEAPON_ANTICAMPER); m_CampTick = -1; m_SentCampMsg = false; return 1; diff --git a/src/game/server/player.h b/src/game/server/player.h index 99de2952..20c6256d 100644 --- a/src/game/server/player.h +++ b/src/game/server/player.h @@ -113,6 +113,7 @@ public: bool m_SentCampMsg; int m_CampTick; vec2 m_CampPos; + int m_FreezeTicks; private: CCharacter *m_pCharacter; diff --git a/src/game/variables.h b/src/game/variables.h index 3f0d7bf9..f4f9738a 100644 --- a/src/game/variables.h +++ b/src/game/variables.h @@ -101,6 +101,7 @@ MACRO_CONFIG_INT(SvChatValue, sv_chat_value, 250, 100, 1000, CFGFLAG_SERVER, "A MACRO_CONFIG_INT(SvChatThreshold, sv_chat_threshold, 1000, 250, 10000, CFGFLAG_SERVER, "If this threshold will exceed by too many messages the player will be muted") MACRO_CONFIG_INT(SvMuteDuration, sv_mute_duration, 60, 0, 3600, CFGFLAG_SERVER, "How long the player will be muted (in seconds)") MACRO_CONFIG_INT(SvAnticamper, sv_anticamper, 1, 0, 1, CFGFLAG_SERVER, "Toggle to enable/disable Anticamper") +MACRO_CONFIG_INT(SvAnticamperFreeze, sv_anticamper_freeze, 5, 0, 15, CFGFLAG_SERVER, "If a player should freeze on camping (and how long) or die") MACRO_CONFIG_INT(SvAnticamperTime, sv_anticamper_time, 10, 5, 120, CFGFLAG_SERVER, "How long to wait till the player dies/freezes") MACRO_CONFIG_INT(SvAnticamperRange, sv_anticamper_range, 200, 0, 1000, CFGFLAG_SERVER, "Distance how far away the player must move to escape anticamper") #endif |