Turn projectile manager into a singleton get for 2 processes

This commit is contained in:
Benau
2020-02-28 09:42:52 +08:00
parent 6a3e606c2d
commit ccdca532b5
16 changed files with 68 additions and 27 deletions

View File

@@ -958,7 +958,7 @@ void IrrDriver::applyResolutionSettings(bool recreate_device)
track_manager->removeAllCachedData();
delete attachment_manager;
attachment_manager = NULL;
projectile_manager->removeTextures();
ProjectileManager::get()->removeTextures();
ItemManager::removeTextures();
kart_properties_manager->unloadAllKarts();
delete powerup_manager;
@@ -1052,7 +1052,7 @@ void IrrDriver::applyResolutionSettings(bool recreate_device)
powerup_manager->loadPowerupsModels();
ItemManager::loadDefaultItemMeshes();
projectile_manager->loadData();
ProjectileManager::get()->loadData();
Referee::init();
GUIEngine::addLoadingIcon(
irr_driver->getTexture(file_manager->getAsset(FileManager::GUI_ICON,"gift.png")) );

View File

@@ -311,7 +311,7 @@ void Attachment::hitBanana(ItemState *item_state)
"explosion_bomb.xml");
if (m_kart->getController()->isLocalPlayerController())
he->setLocalPlayerKartHit();
projectile_manager->addHitEffect(he);
ProjectileManager::get()->addHitEffect(he);
}
if (m_kart->getKartAnimation() == NULL)
ExplosionAnimation::create(m_kart);
@@ -520,7 +520,7 @@ void Attachment::update(int ticks)
"explosion_bomb.xml");
if (m_kart->getController()->isLocalPlayerController())
he->setLocalPlayerKartHit();
projectile_manager->addHitEffect(he);
ProjectileManager::get()->addHitEffect(he);
}
if (m_kart->getKartAnimation() == NULL)
ExplosionAnimation::create(m_kart);

View File

@@ -761,7 +761,7 @@ void Flyable::computeError()
"doesn't exist on server, remove it.",
typeid(*this).name(), StringUtils::wideToUtf8(
m_owner->getController()->getName()).c_str(), m_created_ticks);
projectile_manager->removeByUID(uid);
ProjectileManager::get()->removeByUID(uid);
}
} // computeError

View File

@@ -298,7 +298,7 @@ void Powerup::use()
Powerup::adjustSound();
m_sound_use->play();
}
projectile_manager->newProjectile(m_kart, m_type);
ProjectileManager::get()->newProjectile(m_kart, m_type);
break ;
case PowerupManager::POWERUP_SWATTER:

View File

@@ -32,12 +32,42 @@
#include "network/network_config.hpp"
#include "network/network_string.hpp"
#include "network/rewind_manager.hpp"
#include "utils/stk_process.hpp"
#include "utils/string_utils.hpp"
#include <typeinfo>
ProjectileManager *projectile_manager=0;
//=============================================================================================
ProjectileManager* g_projectile_manager[PT_COUNT];
//---------------------------------------------------------------------------------------------
ProjectileManager* ProjectileManager::get()
{
ProcessType type = STKProcess::getType();
return g_projectile_manager[type];
} // get
//---------------------------------------------------------------------------------------------
void ProjectileManager::create()
{
ProcessType type = STKProcess::getType();
g_projectile_manager[type] = new ProjectileManager();
} // create
//---------------------------------------------------------------------------------------------
void ProjectileManager::destroy()
{
ProcessType type = STKProcess::getType();
delete g_projectile_manager[type];
g_projectile_manager[type] = NULL;
} // destroy
//---------------------------------------------------------------------------------------------
void ProjectileManager::clear()
{
memset(g_projectile_manager, 0, sizeof(g_projectile_manager));
} // clear
//---------------------------------------------------------------------------------------------
void ProjectileManager::loadData()
{
} // loadData

View File

@@ -59,6 +59,15 @@ private:
PowerupManager::PowerupType type);
void updateServer(int ticks);
public:
// ----------------------------------------------------------------------------------------
static ProjectileManager* get();
// ----------------------------------------------------------------------------------------
static void create();
// ----------------------------------------------------------------------------------------
static void destroy();
// ----------------------------------------------------------------------------------------
static void clear();
// ----------------------------------------------------------------------------------------
ProjectileManager() {}
~ProjectileManager() {}
void loadData ();
@@ -91,8 +100,6 @@ public:
{ m_active_projectiles.erase(uid); }
};
extern ProjectileManager *projectile_manager;
#endif
/* EOF */

View File

@@ -432,7 +432,7 @@ void Swatter::squashThingsAround()
HitEffect *he = new Explosion(m_kart->getXYZ(), "explosion", "explosion.xml");
if(m_kart->getController()->isLocalPlayerController())
he->setLocalPlayerKartHit();
projectile_manager->addHitEffect(he);
ProjectileManager::get()->addHitEffect(he);
} // if kart has bomb attached
// TODO: squash items

View File

@@ -460,7 +460,7 @@ void ArenaAI::useItems(const float dt)
// has a swatter attachment. If so, use bubblegum
// as shield
if ( (!m_kart->isShielded() &&
projectile_manager->projectileIsClose(m_kart,
ProjectileManager::get()->projectileIsClose(m_kart,
m_ai_properties->m_shield_incoming_radius) ) ||
(dist_to_kart < 15.0f &&
(m_closest_kart->getAttachment()->

View File

@@ -1298,13 +1298,13 @@ void SkiddingAI::handleBubblegum(int item_skill,
float shield_radius = m_ai_properties->m_shield_incoming_radius;
int projectile_types[4]; //[3] basket, [2] cakes, [1] plunger, [0] bowling
projectile_types[0] = projectile_manager->getNearbyProjectileCount(m_kart, shield_radius, PowerupManager::POWERUP_BOWLING);
projectile_types[1] = projectile_manager->getNearbyProjectileCount(m_kart, shield_radius, PowerupManager::POWERUP_PLUNGER);
projectile_types[2] = projectile_manager->getNearbyProjectileCount(m_kart, shield_radius, PowerupManager::POWERUP_CAKE);
projectile_types[3] = projectile_manager->getNearbyProjectileCount(m_kart, shield_radius, PowerupManager::POWERUP_RUBBERBALL);
projectile_types[0] = ProjectileManager::get()->getNearbyProjectileCount(m_kart, shield_radius, PowerupManager::POWERUP_BOWLING);
projectile_types[1] = ProjectileManager::get()->getNearbyProjectileCount(m_kart, shield_radius, PowerupManager::POWERUP_PLUNGER);
projectile_types[2] = ProjectileManager::get()->getNearbyProjectileCount(m_kart, shield_radius, PowerupManager::POWERUP_CAKE);
projectile_types[3] = ProjectileManager::get()->getNearbyProjectileCount(m_kart, shield_radius, PowerupManager::POWERUP_RUBBERBALL);
bool projectile_is_close = false;
projectile_is_close = projectile_manager->projectileIsClose(m_kart, shield_radius);
projectile_is_close = ProjectileManager::get()->projectileIsClose(m_kart, shield_radius);
Attachment::AttachmentType type = m_kart->getAttachment()->getType();

View File

@@ -1204,7 +1204,7 @@ void SkiddingAI::handleItems(const float dt)
// Check if a flyable (cake, ...) is close. If so, use bubblegum
// as shield
if( !m_kart->isShielded() &&
projectile_manager->projectileIsClose(m_kart,
ProjectileManager::get()->projectileIsClose(m_kart,
m_ai_properties->m_shield_incoming_radius) )
{
m_controls->setFire(true);

View File

@@ -1776,7 +1776,7 @@ void Kart::update(int ticks)
{
HitEffect *effect = new Explosion(getXYZ(), "jump",
"jump_explosion.xml");
projectile_manager->addHitEffect(effect);
ProjectileManager::get()->addHitEffect(effect);
}
}

View File

@@ -1738,6 +1738,7 @@ void clearGlobalVariables()
NetworkConfig::clear();
STKHost::clear();
RaceManager::clear();
ProjectileManager::clear();
music_manager = NULL;
irr_driver = NULL;
#ifdef ENABLE_WIIUSE
@@ -1826,7 +1827,7 @@ void initRest()
material_manager = new MaterialManager ();
track_manager = new TrackManager ();
kart_properties_manager = new KartPropertiesManager();
projectile_manager = new ProjectileManager ();
ProjectileManager::create();
powerup_manager = new PowerupManager ();
attachment_manager = new AttachmentManager ();
highscore_manager = new HighscoreManager ();
@@ -2114,7 +2115,7 @@ int main(int argc, char *argv[])
GUIEngine::addLoadingIcon( irr_driver->getTexture(FileManager::GUI_ICON,
"gui_lock.png" ) );
projectile_manager->loadData();
ProjectileManager::get()->loadData();
// Both item_manager and powerup_manager load models and therefore
// textures from the model directory. To avoid reading the
@@ -2466,7 +2467,7 @@ static void cleanSuperTuxKart()
if(attachment_manager) delete attachment_manager;
ItemManager::removeTextures();
if(powerup_manager) delete powerup_manager;
if(projectile_manager) delete projectile_manager;
ProjectileManager::destroy();
if(kart_properties_manager) delete kart_properties_manager;
if(track_manager) delete track_manager;
if(material_manager) delete material_manager;

View File

@@ -380,7 +380,7 @@ void World::reset(bool restart)
// Remove all (if any) previous game flyables before reset karts, so no
// explosion animation will be created
projectile_manager->cleanup();
ProjectileManager::get()->cleanup();
resetAllKarts();
// Note: track reset must be called after all karts exist, since check
// objects need to allocate data structures depending on the number
@@ -586,7 +586,7 @@ World::~World()
irr_driver->onUnloadWorld();
projectile_manager->cleanup();
ProjectileManager::get()->cleanup();
// In case that a race is aborted (e.g. track not found) track is 0.
if(Track::getCurrentTrack())
@@ -1085,7 +1085,7 @@ void World::updateGraphics(float dt)
if (script_engine)
script_engine->update(dt);
projectile_manager->updateGraphics(dt);
ProjectileManager::get()->updateGraphics(dt);
Track::getCurrentTrack()->updateGraphics(dt);
} // updateGraphics
@@ -1142,7 +1142,7 @@ void World::update(int ticks)
if(RaceManager::get()->isRecordingRace()) ReplayRecorder::get()->update(ticks);
PROFILER_PUSH_CPU_MARKER("World::update (projectiles)", 0xa0, 0x7F, 0x00);
projectile_manager->update(ticks);
ProjectileManager::get()->update(ticks);
PROFILER_POP_CPU_MARKER();
PROFILER_PUSH_CPU_MARKER("World::update (physics)", 0xa0, 0x7F, 0x00);

View File

@@ -18,6 +18,7 @@
#include "network/child_loop.hpp"
#include "config/user_config.hpp"
#include "guiengine/engine.hpp"
#include "items/projectile_manager.hpp"
#include "network/network_config.hpp"
#include "network/protocol_manager.hpp"
#include "network/protocols/server_lobby.hpp"
@@ -78,6 +79,7 @@ void ChildLoop::run()
GUIEngine::disableGraphics();
RaceManager::create();
ProjectileManager::create();
NetworkConfig::get()->setIsServer(true);
if (m_cl_config->m_lan_server)
NetworkConfig::get()->setIsLAN();
@@ -138,6 +140,7 @@ void ChildLoop::run()
}
RaceManager::destroy();
ProjectileManager::destroy();
NetworkConfig::destroy();
StateManager::deallocate();
} // run

View File

@@ -89,7 +89,7 @@ void RewindInfoState::restore()
{
// For now we only need to get missing rewinder from
// projectile_manager
r = projectile_manager->addRewinderFromNetworkState(name);
r = ProjectileManager::get()->addRewinderFromNetworkState(name);
}
if (!r)
{

View File

@@ -38,7 +38,7 @@ namespace Scripting
return;
Vec3 *explosion_loc = (Vec3*)gen->GetArgAddress(0);
HitEffect *he = new Explosion(*explosion_loc, "explosion", "explosion_bomb.xml");
projectile_manager->addHitEffect(he);
ProjectileManager::get()->addHitEffect(he);
}
void registerScriptFunctions(asIScriptEngine *engine)
{