From e0b3de17f6fbd3bb1998c7b860301dea3c647bfc Mon Sep 17 00:00:00 2001 From: hiker Date: Thu, 10 Dec 2015 17:35:31 +1100 Subject: [PATCH] Added new isLocalPlayerKart() function to controller, which is used to detect when sfx and graphical effects should be shown. The isPlayerKart funtion is used to detect a (local or remote) player, e.g. for rubber-banding the AI, or finding the Xth player kart. --- src/graphics/hit_effect.hpp | 8 ++++---- src/graphics/hit_sfx.cpp | 4 ++-- src/graphics/hit_sfx.hpp | 3 ++- src/graphics/slip_stream.cpp | 10 +++++----- src/items/attachment.cpp | 8 ++++---- src/items/plunger.cpp | 2 +- src/items/powerup.cpp | 8 ++++---- src/items/swatter.cpp | 4 ++-- src/karts/controller/ai_base_controller.hpp | 2 +- src/karts/controller/controller.hpp | 8 +++++++- .../controller/network_player_controller.hpp | 4 ++-- src/karts/controller/player_controller.hpp | 2 +- src/karts/kart.cpp | 8 ++++---- src/modes/linear_world.cpp | 2 +- src/modes/world.cpp | 9 ++++----- .../protocols/client_lobby_room_protocol.cpp | 10 +++++----- src/race/race_manager.cpp | 3 +-- src/states_screens/race_gui.cpp | 2 +- src/states_screens/race_gui_base.cpp | 8 ++++---- src/states_screens/race_gui_overworld.cpp | 6 +++--- src/states_screens/race_result_gui.cpp | 16 ++++++++-------- src/utils/debug.cpp | 2 +- 22 files changed, 67 insertions(+), 62 deletions(-) diff --git a/src/graphics/hit_effect.hpp b/src/graphics/hit_effect.hpp index cf07a7bb5..39cbbdea9 100644 --- a/src/graphics/hit_effect.hpp +++ b/src/graphics/hit_effect.hpp @@ -34,11 +34,11 @@ class HitEffect: public NoCopy private: /** True if this effect affected a player kart. Used to play certain SFX * less loud if only an AI is hit. */ - bool m_player_kart_hit; + bool m_local_player_kart_hit; public: /** Constructor for a hit effect. */ - HitEffect() {m_player_kart_hit = false; } + HitEffect() {m_local_player_kart_hit = false; } virtual ~HitEffect() {} /** Updates a hit effect. Called once per frame. * \param dt Time step size. @@ -49,10 +49,10 @@ public: /** Sets that this SFX affects a player kart, which can be used to * make certain sfx louder/less loud. Default is that the affect * does not affect a player kart. */ - virtual void setPlayerKartHit() { m_player_kart_hit = true; } + virtual void setLocalPlayerKartHit() { m_local_player_kart_hit = true; } // ------------------------------------------------------------------------ /** Returns if this effect affects a player kart. */ - bool getPlayerKartHit() const { return m_player_kart_hit; } + bool getLocalPlayerKartHit() const { return m_local_player_kart_hit; } }; // HitEffect #endif diff --git a/src/graphics/hit_sfx.cpp b/src/graphics/hit_sfx.cpp index c187b58ae..0fb3157c8 100644 --- a/src/graphics/hit_sfx.cpp +++ b/src/graphics/hit_sfx.cpp @@ -49,11 +49,11 @@ HitSFX::~HitSFX() * played louder than for a non-player kart if split screen is used). * If this sfx is for a player kart in split screen, make it louder again. */ -void HitSFX::setPlayerKartHit() +void HitSFX::setLocalPlayerKartHit() { if(race_manager->getNumLocalPlayers()) m_sfx->setVolume(1.0f); -} // setPlayerKartHit +} // setLocalPlayerKartHit //----------------------------------------------------------------------------- /** Updates the hit sfx, called one per time step. If this function returns diff --git a/src/graphics/hit_sfx.hpp b/src/graphics/hit_sfx.hpp index 3386777a8..0fe6431d4 100644 --- a/src/graphics/hit_sfx.hpp +++ b/src/graphics/hit_sfx.hpp @@ -20,6 +20,7 @@ #define HEADER_HIT_SFX_HPP #include "graphics/hit_effect.hpp" +#include "utils/cpp2011.hpp" class SFXBase; @@ -36,7 +37,7 @@ public: HitSFX(const Vec3& coord, const char* explosion_sound); ~HitSFX(); virtual bool updateAndDelete(float dt); - virtual void setPlayerKartHit(); + virtual void setLocalPlayerKartHit() OVERRIDE; }; // HitSFX diff --git a/src/graphics/slip_stream.cpp b/src/graphics/slip_stream.cpp index 1cb52b9da..169b68202 100644 --- a/src/graphics/slip_stream.cpp +++ b/src/graphics/slip_stream.cpp @@ -441,7 +441,7 @@ void SlipStream::update(float dt) m_kart->getPlayerDifficulty()->getSlipstreamMinSpeed()) { if(UserConfigParams::m_slipstream_debug && - m_kart->getController()->isPlayerController()) + m_kart->getController()->isLocalPlayerController()) m_target_kart->getSlipstream() ->setDebugColor(video::SColor(255, 0, 0, 0)); @@ -459,7 +459,7 @@ void SlipStream::update(float dt) if(delta.length2_2d() > l*l) { if(UserConfigParams::m_slipstream_debug && - m_kart->getController()->isPlayerController()) + m_kart->getController()->isLocalPlayerController()) m_target_kart->getSlipstream() ->setDebugColor(video::SColor(255, 0, 0, 128)); continue; @@ -472,7 +472,7 @@ void SlipStream::update(float dt) break; } if(UserConfigParams::m_slipstream_debug && - m_kart->getController()->isPlayerController()) + m_kart->getController()->isLocalPlayerController()) m_target_kart->getSlipstream() ->setDebugColor(video::SColor(255, 0, 0, 255)); } // for i < num_karts @@ -480,7 +480,7 @@ void SlipStream::update(float dt) if(!is_sstreaming) { if(UserConfigParams::m_slipstream_debug && - m_kart->getController()->isPlayerController()) + m_kart->getController()->isLocalPlayerController()) m_target_kart->getSlipstream() ->setDebugColor(video::SColor(255, 255, 0, 0)); @@ -506,7 +506,7 @@ void SlipStream::update(float dt) } // if !is_sstreaming if(UserConfigParams::m_slipstream_debug && - m_kart->getController()->isPlayerController()) + m_kart->getController()->isLocalPlayerController()) m_target_kart->getSlipstream()->setDebugColor(video::SColor(255, 0, 255, 0)); // Accumulate slipstream credits now m_slipstream_time = m_slipstream_mode==SS_NONE ? dt diff --git a/src/items/attachment.cpp b/src/items/attachment.cpp index 3fb4fef28..bd1ac0bf8 100644 --- a/src/items/attachment.cpp +++ b/src/items/attachment.cpp @@ -255,8 +255,8 @@ void Attachment::hitBanana(Item *item, int new_attachment) { add_a_new_item = false; HitEffect *he = new Explosion(m_kart->getXYZ(), "explosion", "explosion_bomb.xml"); - if(m_kart->getController()->isPlayerController()) - he->setPlayerKartHit(); + if(m_kart->getController()->isLocalPlayerController()) + he->setLocalPlayerKartHit(); projectile_manager->addHitEffect(he); ExplosionAnimation::create(m_kart); clear(); @@ -454,8 +454,8 @@ void Attachment::update(float dt) if(m_time_left<=0.0) { HitEffect *he = new Explosion(m_kart->getXYZ(), "explosion", "explosion_bomb.xml"); - if(m_kart->getController()->isPlayerController()) - he->setPlayerKartHit(); + if(m_kart->getController()->isLocalPlayerController()) + he->setLocalPlayerKartHit(); projectile_manager->addHitEffect(he); ExplosionAnimation::create(m_kart); diff --git a/src/items/plunger.cpp b/src/items/plunger.cpp index 403340972..a36bafe1d 100644 --- a/src/items/plunger.cpp +++ b/src/items/plunger.cpp @@ -165,7 +165,7 @@ bool Plunger::hit(AbstractKart *kart, PhysicalObject *obj) if(kart) { kart->blockViewWithPlunger(); - if (kart->getController()->isPlayerController()) + if (kart->getController()->isLocalPlayerController()) SFXManager::get()->quickSound("plunger"); } diff --git a/src/items/powerup.cpp b/src/items/powerup.cpp index b354b7aff..a01e051fe 100644 --- a/src/items/powerup.cpp +++ b/src/items/powerup.cpp @@ -154,7 +154,7 @@ void Powerup::adjustSound() { // player karts played at full volume; AI karts much dimmer - if (m_owner->getController()->isPlayerController()) + if (m_owner->getController()->isLocalPlayerController()) { m_sound_use->setVolume( 1.0f ); } @@ -308,7 +308,7 @@ void Powerup::use() // or the kart "throwing" the anvil? Ideally it should be both. // Meanwhile, don't play it near AI karts since they obviously // don't hear anything - if(kart->getController()->isPlayerController()) + if(kart->getController()->isLocalPlayerController()) m_sound_use->setPosition(kart->getXYZ()); else m_sound_use->setPosition(m_owner->getXYZ()); @@ -341,7 +341,7 @@ void Powerup::use() ->set(Attachment::ATTACH_PARACHUTE, stk_config->m_parachute_time_other); - if(kart->getController()->isPlayerController()) + if(kart->getController()->isLocalPlayerController()) player_kart = kart; } } @@ -350,7 +350,7 @@ void Powerup::use() // or the kart "throwing" the anvil? Ideally it should be both. // Meanwhile, don't play it near AI karts since they obviously // don't hear anything - if(m_owner->getController()->isPlayerController()) + if(m_owner->getController()->isLocalPlayerController()) m_sound_use->setPosition(m_owner->getXYZ()); else if(player_kart) m_sound_use->setPosition(player_kart->getXYZ()); diff --git a/src/items/swatter.cpp b/src/items/swatter.cpp index 326b47cbd..c5d2a77eb 100644 --- a/src/items/swatter.cpp +++ b/src/items/swatter.cpp @@ -309,8 +309,8 @@ void Swatter::squashThingsAround() { // make bomb explode kart->getAttachment()->update(10000); HitEffect *he = new Explosion(m_kart->getXYZ(), "explosion", "explosion.xml"); - if(m_kart->getController()->isPlayerController()) - he->setPlayerKartHit(); + if(m_kart->getController()->isLocalPlayerController()) + he->setLocalPlayerKartHit(); projectile_manager->addHitEffect(he); ExplosionAnimation::create(kart); } // if kart has bomb attached diff --git a/src/karts/controller/ai_base_controller.hpp b/src/karts/controller/ai_base_controller.hpp index 72cbb8269..864cf95d2 100644 --- a/src/karts/controller/ai_base_controller.hpp +++ b/src/karts/controller/ai_base_controller.hpp @@ -110,8 +110,8 @@ public: virtual void collectedItem(const Item &item, int add_info=-1, float previous_energy=0) {}; virtual void setPosition(int p) {}; - virtual bool isNetworkController() const { return false; } virtual bool isPlayerController() const { return false; } + virtual bool isLocalPlayerController() const { return false; } virtual void action(PlayerAction action, int value) {}; virtual void skidBonusTriggered() {}; virtual bool disableSlipstreamBonus() const; diff --git a/src/karts/controller/controller.hpp b/src/karts/controller/controller.hpp index 689972bb6..1e5e18953 100644 --- a/src/karts/controller/controller.hpp +++ b/src/karts/controller/controller.hpp @@ -69,8 +69,14 @@ public: virtual void crashed (const AbstractKart *k) = 0; virtual void crashed (const Material *m) = 0; virtual void setPosition (int p) = 0; + /** This function checks if this is a local player. A local player will get + * special graphical effects enabled, has a camera, and sound effects will + * be played with normal volume. */ + virtual bool isLocalPlayerController () const = 0; + /** This function checks if this player is not an AI, i.e. it is either a + * a local or a remote/networked player. This is tested e.g. by the AI for + * rubber-banding. */ virtual bool isPlayerController () const = 0; - virtual bool isNetworkController() const = 0; virtual bool disableSlipstreamBonus() const = 0; // --------------------------------------------------------------------------- /** Sets the controller name for this controller. */ diff --git a/src/karts/controller/network_player_controller.hpp b/src/karts/controller/network_player_controller.hpp index fba1f70ef..b7e1ec4dd 100644 --- a/src/karts/controller/network_player_controller.hpp +++ b/src/karts/controller/network_player_controller.hpp @@ -28,8 +28,8 @@ public: float previous_energy=0); virtual void skidBonusTriggered(); virtual void setPosition (int p); - virtual bool isPlayerController() const { return false; } - virtual bool isNetworkController() const { return true; } + virtual bool isPlayerController() const { return true; } + virtual bool isLocalPlayerController() const { return false; } virtual void reset (); void resetInputState (); virtual void finishedRace (float time); diff --git a/src/karts/controller/player_controller.hpp b/src/karts/controller/player_controller.hpp index 4431a0f19..3f043159c 100644 --- a/src/karts/controller/player_controller.hpp +++ b/src/karts/controller/player_controller.hpp @@ -68,7 +68,7 @@ public: virtual void skidBonusTriggered(); virtual void setPosition (int p); virtual bool isPlayerController() const {return true;} - virtual bool isNetworkController() const { return false; } + virtual bool isLocalPlayerController() const {return true;} virtual void reset (); void resetInputState (); virtual void finishedRace (float time); diff --git a/src/karts/kart.cpp b/src/karts/kart.cpp index 94d3bd2c0..7d4056339 100644 --- a/src/karts/kart.cpp +++ b/src/karts/kart.cpp @@ -737,7 +737,7 @@ void Kart::startEngineSFX() // player karts twice as loud as AIs toghether const float players_volume = (np * 2.0f) / (np*2.0f + np); - if (m_controller->isPlayerController()) + if (m_controller->isLocalPlayerController()) m_engine_sound->setVolume( players_volume / np ); else m_engine_sound->setVolume( (1.0f - players_volume) / nai ); @@ -808,7 +808,7 @@ void Kart::finishedRace(float time) // in modes that support it, start end animation setController(new EndController(this, m_controller->getPlayer(), m_controller)); - if (m_controller->isPlayerController()) // if player is on this computer + if (m_controller->isLocalPlayerController()) // if player is on this computer { PlayerProfile *player = PlayerManager::getCurrentPlayer(); const ChallengeStatus *challenge = player->getCurrentChallengeStatus(); @@ -1475,7 +1475,7 @@ void Kart::handleMaterialSFX(const Material *material) // multiple listeners. This would make the sounds of all AIs be // audible at all times. So silence AI karts. if (s.size()!=0 && (race_manager->getNumPlayers()==1 || - m_controller->isPlayerController() ) ) + m_controller->isLocalPlayerController() ) ) { m_terrain_sound = SFXManager::get()->createSoundSource(s); m_terrain_sound->play(); @@ -1557,7 +1557,7 @@ void Kart::handleMaterialGFX() // has the 'below surface' flag set. Detect if there is a surface // on top of the kart. // -------------------------------------------------------------- - if (m_controller->isPlayerController() && !hasFinishedRace()) + if (m_controller->isLocalPlayerController() && !hasFinishedRace()) { for(unsigned int i=0; igetController()->isPlayerController()) + if (!m_karts[i]->getController()->isLocalPlayerController()) return; float wrongway_counter = m_karts[i]->getWrongwayCounter(); diff --git a/src/modes/world.cpp b/src/modes/world.cpp index d79513c70..1c7abb8e8 100644 --- a/src/modes/world.cpp +++ b/src/modes/world.cpp @@ -1079,9 +1079,9 @@ void World::updateHighscores(int* best_highscore_rank, int* best_finish_time, continue; } - // Only record times for player karts and only if + // Only record times for local player karts and only if // they finished the race - if(!m_karts[index[pos]]->getController()->isPlayerController()) + if(!m_karts[index[pos]]->getController()->isLocalPlayerController()) continue; if (!m_karts[index[pos]]->hasFinishedRace()) continue; @@ -1126,8 +1126,7 @@ AbstractKart *World::getPlayerKart(unsigned int n) const unsigned int count=-1; for(unsigned int i=0; igetController()->isPlayerController() || - m_karts[i]->getController()->isNetworkController()) + if(m_karts[i]->getController()->isPlayerController()) { count++; if(count==n) return m_karts[i]; @@ -1170,7 +1169,7 @@ void World::eliminateKart(int kart_id, bool notify_of_elimination) } // for i < number of cameras } // if notify_of_elimination - if(kart->getController()->isPlayerController()) + if(kart->getController()->isLocalPlayerController()) { for(unsigned int i=0; igetController()->isPlayerController() || - kart->getController()->isNetworkController()) + if(kart->getController()->isPlayerController()) m_num_finished_players++; } // kartFinishedRace diff --git a/src/states_screens/race_gui.cpp b/src/states_screens/race_gui.cpp index 476d97d92..9a2cedfb4 100644 --- a/src/states_screens/race_gui.cpp +++ b/src/states_screens/race_gui.cpp @@ -382,7 +382,7 @@ void RaceGUI::drawGlobalMiniMap() // int marker_height = m_marker->getSize().Height; core::rect source(core::position2di(0, 0), icon->getSize()); - int marker_half_size = (kart->getController()->isPlayerController() + int marker_half_size = (kart->getController()->isLocalPlayerController() ? m_minimap_player_size : m_minimap_ai_size )>>1; core::rect position(m_map_left+(int)(draw_at.getX()-marker_half_size), diff --git a/src/states_screens/race_gui_base.cpp b/src/states_screens/race_gui_base.cpp index ee38fba41..bfe0aa165 100644 --- a/src/states_screens/race_gui_base.cpp +++ b/src/states_screens/race_gui_base.cpp @@ -849,13 +849,13 @@ void RaceGUIBase::drawGlobalPlayerIcons(int bottom_margin) // draw icon video::ITexture *icon = kart->getKartProperties()->getIconMaterial()->getTexture(); - int w = - kart->getController()->isPlayerController() ? ICON_PLAYER_WIDTH - : ICON_WIDTH; + int w = kart->getController() + ->isLocalPlayerController() ? ICON_PLAYER_WIDTH + : ICON_WIDTH; const core::rect pos(x, y, x+w, y+w); //to bring to light the player's icon: add a background - if (kart->getController()->isPlayerController()) + if (kart->getController()->isLocalPlayerController()) { video::SColor colors[4]; for (unsigned int i=0;i<4;i++) diff --git a/src/states_screens/race_gui_overworld.cpp b/src/states_screens/race_gui_overworld.cpp index fb90fc867..a4c892bad 100644 --- a/src/states_screens/race_gui_overworld.cpp +++ b/src/states_screens/race_gui_overworld.cpp @@ -356,7 +356,7 @@ void RaceGUIOverworld::drawGlobalMiniMap() if(kart->isEliminated()) continue; // don't draw eliminated kart // Make sure to only draw AI kart icons first, then // only player karts. - if(kart->getController()->isPlayerController() + if(kart->getController()->isLocalPlayerController() !=(only_draw_player_kart==1)) continue; kart_xyz= kart->getXYZ(); Vec3 draw_at; @@ -364,7 +364,7 @@ void RaceGUIOverworld::drawGlobalMiniMap() video::ITexture* icon = kart->getKartProperties()->getMinimapIcon(); core::rect source(core::position2di(0, 0), icon->getSize()); - int marker_half_size = (kart->getController()->isPlayerController() + int marker_half_size = (kart->getController()->isLocalPlayerController() ? m_minimap_player_size : m_minimap_challenge_size )>>1; core::rect position(m_map_left+(int)(draw_at.getX()-marker_half_size), @@ -373,7 +373,7 @@ void RaceGUIOverworld::drawGlobalMiniMap() lower_y -(int)(draw_at.getY()-marker_half_size)); // Highlight the player icons with some backgorund image. - if (kart->getController()->isPlayerController()) + if (kart->getController()->isLocalPlayerController()) { video::SColor colors[4]; for (unsigned int i=0;i<4;i++) diff --git a/src/states_screens/race_result_gui.cpp b/src/states_screens/race_result_gui.cpp index e68bf2098..01fd70cef 100644 --- a/src/states_screens/race_result_gui.cpp +++ b/src/states_screens/race_result_gui.cpp @@ -458,15 +458,15 @@ void RaceResultGUI::determineTableLayout() const AbstractKart *kart = rank_world->getKartAtPosition(position); // Save a pointer to the current row_info entry - RowInfo *ri = &(m_all_row_infos[position-first_position]); - ri->m_is_player_kart = kart->getController()->isPlayerController(); - ri->m_kart_name = translations->fribidize(kart->getName()); - ri->m_player = ri->m_is_player_kart - ? kart->getController()->getPlayer() : NULL; + RowInfo *ri = &(m_all_row_infos[position-first_position]); + ri->m_is_player_kart = kart->getController()->isLocalPlayerController(); + ri->m_kart_name = translations->fribidize(kart->getName()); + ri->m_player = ri->m_is_player_kart + ? kart->getController()->getPlayer() : NULL; - video::ITexture *icon = + video::ITexture *icon = kart->getKartProperties()->getIconMaterial()->getTexture(); - ri->m_kart_icon = icon; + ri->m_kart_icon = icon; // FTL karts will get a time assigned, they are not shown as eliminated if (kart->isEliminated() && @@ -828,7 +828,7 @@ void RaceResultGUI::determineGPLayout() ri->m_kart_icon = kart->getKartProperties()->getIconMaterial()->getTexture(); ri->m_kart_name = translations->fribidize(kart->getName()); - ri->m_is_player_kart = kart->getController()->isPlayerController(); + ri->m_is_player_kart = kart->getController()->isLocalPlayerController(); ri->m_player = ri->m_is_player_kart ? kart->getController()->getPlayer() : NULL; diff --git a/src/utils/debug.cpp b/src/utils/debug.cpp index 17544f18d..5f753cef0 100644 --- a/src/utils/debug.cpp +++ b/src/utils/debug.cpp @@ -131,7 +131,7 @@ void addAttachment(Attachment::AttachmentType type) for (unsigned int i = 0; i < world->getNumKarts(); i++) { AbstractKart *kart = world->getKart(i); - if (!kart->getController()->isPlayerController()) + if (!kart->getController()->isLocalPlayerController()) continue; if (type == Attachment::ATTACH_ANVIL) {