void CGameControllerEXP::Tick() { IGameController::Tick(); TickBots(); TickEnvironment(); for(int fi = 0; fi < m_CurFlag+1; fi++) { CFlag *f = NULL; if(fi == m_CurFlag) f = m_FlagEnd; else f = m_aFlagsCP[fi]; if(!f) // if there isn't flag end continue; CCharacter *apCloseCharacters[MAX_CLIENTS]; int Num = GameServer()->m_World.FindEntities(f->GetPos(), CFlag::ms_PhysSize, (CEntity**)apCloseCharacters, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); for(int i = 0; i < Num; i++) { if(!apCloseCharacters[i]->IsAlive() || apCloseCharacters[i]->GetPlayer()->IsBot() || apCloseCharacters[i]->GetPlayer()->GetTeam() == -1) continue; int id = apCloseCharacters[i]->GetPlayer()->GetCID(); if(fi == m_CurFlag) { // END if(!m_Boss.m_Exist || GameServer()->m_apPlayers[id]->m_GameExp.m_BossKiller) StopClient(id); } else { // REGEN if((float)Server()->Tick() > apCloseCharacters[i]->GetPlayer()->m_GameExp.m_RegenTimer + GameServer()->Tuning()->m_RegenTimer*Server()->TickSpeed()) { if(apCloseCharacters[i]->m_Health < 10) //regen health { apCloseCharacters[i]->m_Health++; apCloseCharacters[i]->GetPlayer()->m_GameExp.m_RegenTimer = (float)Server()->Tick(); } else if(apCloseCharacters[i]->m_Armor < apCloseCharacters[i]->GetPlayer()->m_GameExp.m_ArmorMax) //regen armor { apCloseCharacters[i]->m_Armor++; apCloseCharacters[i]->GetPlayer()->m_GameExp.m_RegenTimer = (float)Server()->Tick(); } else // regen ammo { int WID = apCloseCharacters[i]->m_ActiveWeapon; if(apCloseCharacters[i]->m_aWeapons[WID].m_Ammo != -1) { int MaxAmmo = g_pData->m_Weapons.m_aId[WID].m_Maxammo; if(apCloseCharacters[i]->m_aWeapons[WID].m_Ammo < MaxAmmo) { apCloseCharacters[i]->m_aWeapons[WID].m_Ammo++; apCloseCharacters[i]->GetPlayer()->m_GameExp.m_RegenTimer = (float)Server()->Tick(); } } } } // SAVE if(apCloseCharacters[i]->GetPlayer()->m_GameExp.m_LastFlag != fi+1) { apCloseCharacters[i]->GetPlayer()->m_GameExp.m_LastFlag = fi+1; GameServer()->SendChatTarget(apCloseCharacters[i]->GetPlayer()->GetCID(), "Checkpoint reached."); //apCloseCharacters[i]->GetPlayer()->m_GameExp.m_SaveTimer = (float)Server()->Tick() + 5.0f*Server()->TickSpeed(); } } } } }
void CPlayer::OnDirectInput(CNetObj_PlayerInput *NewInput) { if(GameServer()->m_World.m_Paused) { m_PlayerFlags = NewInput->m_PlayerFlags; return; } if(NewInput->m_PlayerFlags&PLAYERFLAG_CHATTING) { // skip the input if chat is active if(m_PlayerFlags&PLAYERFLAG_CHATTING) return; // reset input if(m_pCharacter) m_pCharacter->ResetInput(); m_PlayerFlags = NewInput->m_PlayerFlags; return; } m_PlayerFlags = NewInput->m_PlayerFlags; if(m_pCharacter) m_pCharacter->OnDirectInput(NewInput); if(!m_pCharacter && m_Team != TEAM_SPECTATORS && (NewInput->m_Fire&1)) Respawn(); if(!m_pCharacter && m_Team == TEAM_SPECTATORS && (NewInput->m_Fire&1)) { if(!m_ActiveSpecSwitch) { m_ActiveSpecSwitch = true; if(m_SpecMode == SPEC_FREEVIEW) { CCharacter *pChar = (CCharacter *)GameServer()->m_World.ClosestEntity(m_ViewPos, 6.0f*32, CGameWorld::ENTTYPE_CHARACTER, 0); CFlag *pFlag = (CFlag *)GameServer()->m_World.ClosestEntity(m_ViewPos, 6.0f*32, CGameWorld::ENTTYPE_FLAG, 0); if(pChar || pFlag) { if(!pChar || (pFlag && pChar && distance(m_ViewPos, pFlag->GetPos()) < distance(m_ViewPos, pChar->GetPos()))) { m_SpecMode = pFlag->GetTeam() == TEAM_RED ? SPEC_FLAGRED : SPEC_FLAGBLUE; m_pSpecFlag = pFlag; m_SpectatorID = -1; } else { m_SpecMode = SPEC_PLAYER; m_pSpecFlag = 0; m_SpectatorID = pChar->GetPlayer()->GetCID(); } } } else { m_SpecMode = SPEC_FREEVIEW; m_pSpecFlag = 0; m_SpectatorID = -1; } } } else if(m_ActiveSpecSwitch) m_ActiveSpecSwitch = false; // check for activity if(NewInput->m_Direction || m_LatestActivity.m_TargetX != NewInput->m_TargetX || m_LatestActivity.m_TargetY != NewInput->m_TargetY || NewInput->m_Jump || NewInput->m_Fire&1 || NewInput->m_Hook) { m_LatestActivity.m_TargetX = NewInput->m_TargetX; m_LatestActivity.m_TargetY = NewInput->m_TargetY; m_LastActionTick = Server()->Tick(); m_InactivityTickCounter = 0; } }