Skip to content

Commit 070d498

Browse files
committed
Fix crashes when world is null after connect spam
1 parent d7d3742 commit 070d498

File tree

3 files changed

+23
-11
lines changed

3 files changed

+23
-11
lines changed

src/bzflag/BackgroundRenderer.cxx

+3-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "MainWindow.h"
3232
#include "SceneNode.h"
3333
#include "effectsRenderer.h"
34+
#include "World.h"
3435

3536
static const GLfloat squareShape[4][2] =
3637
{
@@ -664,7 +665,8 @@ void BackgroundRenderer::renderGroundEffects(SceneRenderer& renderer,
664665

665666
if (!blank)
666667
{
667-
if (doShadows && shadowsVisible && !drawingMirror)
668+
const World *_world = World::getWorld();
669+
if (doShadows && shadowsVisible && !drawingMirror && _world)
668670
drawGroundShadows(renderer);
669671

670672
// draw light receivers on ground (little meshes under light sources so

src/bzflag/SceneRenderer.cxx

+7-4
Original file line numberDiff line numberDiff line change
@@ -866,14 +866,18 @@ void SceneRenderer::renderScene(bool UNUSED(_lastFrame), bool UNUSED(_sameFrame)
866866
int i;
867867
const bool lightLists = BZDB.isTrue("lightLists");
868868

869+
const World* world = World::getWorld();
870+
871+
869872
// avoid OpenGL calls as long as possible -- there's a good
870873
// chance we're waiting on the vertical retrace.
871874

872875
// get a list of the dynamic lights
873876
getLights();
874877

875878
// get the obstacle sceneNodes and shadowNodes
876-
getRenderNodes();
879+
if (world)
880+
getRenderNodes();
877881

878882
// prepare transforms
879883
// note -- lights should not be positioned before view is set
@@ -1000,17 +1004,16 @@ void SceneRenderer::renderScene(bool UNUSED(_lastFrame), bool UNUSED(_sameFrame)
10001004
if (useHiddenLineOn)
10011005
glEnable(GL_POLYGON_OFFSET_FILL);
10021006

1003-
10041007
///////////////////////
10051008
// THE BIG RENDERING //
10061009
///////////////////////
1007-
doRender();
1010+
if (world)
1011+
doRender();
10081012

10091013

10101014
if (scene && BZDBCache::showCullingGrid)
10111015
scene->drawCuller();
10121016

1013-
const World* world = World::getWorld();
10141017
if (scene && BZDBCache::showCollisionGrid && (world != NULL))
10151018
world->drawCollisionGrid();
10161019

src/bzflag/playing.cxx

+13-6
Original file line numberDiff line numberDiff line change
@@ -2016,6 +2016,7 @@ static void handleServerMessage(bool human, uint16_t code,
20162016
{
20172017
bool checkScores = false;
20182018
static WordFilter *wordfilter = (WordFilter *)BZDB.getPointer("filter");
2019+
const World *_world = World::getWorld();
20192020

20202021
switch (code)
20212022
{
@@ -2340,7 +2341,10 @@ static void handleServerMessage(bool human, uint16_t code,
23402341
for (int i = 0; i < numTeams; i++)
23412342
{
23422343
msg = nboUnpackUShort(msg, team);
2343-
msg = teams[int(team)].unpack(msg);
2344+
Team uTeam;
2345+
msg = uTeam.unpack(msg);
2346+
if (_world)
2347+
teams[int(team)] = uTeam;
23442348
}
23452349
checkScores = true;
23462350
break;
@@ -5745,16 +5749,18 @@ static void drawUI()
57455749
hud->setFrameRadarTriangleCount(0);
57465750
}
57475751

5752+
const World *_world = World::getWorld();
5753+
57485754
// update the HUD (player list, alerts)
5749-
if (World::getWorld() && hud)
5755+
if (_world && hud)
57505756
hud->render(*sceneRenderer);
57515757

57525758
// draw the control panel
57535759
if (controlPanel)
57545760
controlPanel->render(*sceneRenderer);
57555761

57565762
// draw the radar
5757-
if (radar)
5763+
if (radar && _world)
57585764
{
57595765
const bool showBlankRadar = !myTank || (myTank && myTank->isPaused());
57605766
const bool observer = myTank && (myTank->getTeam() == ObserverTeam);
@@ -6124,7 +6130,8 @@ void drawFrame(const float dt)
61246130

61256131
// add dynamic nodes
61266132
SceneDatabase* scene = sceneRenderer->getSceneDatabase();
6127-
if (scene && myTank && world)
6133+
World *_world = World::getWorld();
6134+
if (scene && myTank && _world)
61286135
{
61296136

61306137
int i;
@@ -7324,7 +7331,7 @@ static void playingLoop()
73247331
}
73257332

73267333
// do motion
7327-
if (myTank && world)
7334+
if (myTank && _world)
73287335
{
73297336
if (myTank->isAlive() && !myTank->isPaused())
73307337
{
@@ -7374,7 +7381,7 @@ static void playingLoop()
73747381
#endif
73757382

73767383
// adjust properties based on flags (dimensions, cloaking, etc...)
7377-
if (myTank)
7384+
if (myTank && _world)
73787385
myTank->updateTank(dt, true);
73797386
for (i = 0; i < curMaxPlayers; i++)
73807387
{

0 commit comments

Comments
 (0)