mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-05-01 16:33:38 -04:00
Fixed three big memory leaks: LevelSetupManagers never being destroyed, wall grid closures retaining Lanks, and real-time-multiplayer:new-opponent-code retaining Spells.
This commit is contained in:
parent
fb040fd882
commit
ad06000ceb
7 changed files with 27 additions and 10 deletions
app
lib
views
|
@ -76,3 +76,8 @@ module.exports = class LevelSetupManager extends CocoClass
|
||||||
viewClass: viewClass
|
viewClass: viewClass
|
||||||
viewArgs: [{supermodel: @supermodel}, @options.levelID]
|
viewArgs: [{supermodel: @supermodel}, @options.levelID]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
destroy: ->
|
||||||
|
@heroesModalDestroy.call @heroesModal unless @heroesModal.destroyed
|
||||||
|
@inventoryModalDestroy.call @inventoryModal unless @inventoryModal.destroyed
|
||||||
|
super()
|
||||||
|
|
|
@ -230,11 +230,12 @@ module.exports = class LankBoss extends CocoClass
|
||||||
|
|
||||||
cacheObstacles: (updatedObstacles=null) ->
|
cacheObstacles: (updatedObstacles=null) ->
|
||||||
return if @cachedObstacles and not updatedObstacles
|
return if @cachedObstacles and not updatedObstacles
|
||||||
wallLanks = (lank for lank in @lankArray when lank.thangType?.get('name').search(/(dungeon|indoor).wall/i) isnt -1)
|
lankArray = @lankArray
|
||||||
|
wallLanks = (lank for lank in lankArray when lank.thangType?.get('name').search(/(dungeon|indoor).wall/i) isnt -1)
|
||||||
return if _.any (s.stillLoading for s in wallLanks)
|
return if _.any (s.stillLoading for s in wallLanks)
|
||||||
walls = (lank.thang for lank in wallLanks)
|
walls = (lank.thang for lank in wallLanks)
|
||||||
@world.calculateBounds()
|
@world.calculateBounds()
|
||||||
wallGrid = new Grid walls, @world.size()...
|
wallGrid = new Grid walls, @world.width, @world.height
|
||||||
if updatedObstacles
|
if updatedObstacles
|
||||||
possiblyUpdatedWallLanks = (lank for lank in wallLanks when _.find updatedObstacles, (w2) -> lank is w2 or (Math.abs(lank.thang.pos.x - w2.thang.pos.x) + Math.abs(lank.thang.pos.y - w2.thang.pos.y)) <= 16)
|
possiblyUpdatedWallLanks = (lank for lank in wallLanks when _.find updatedObstacles, (w2) -> lank is w2 or (Math.abs(lank.thang.pos.x - w2.thang.pos.x) + Math.abs(lank.thang.pos.y - w2.thang.pos.y)) <= 16)
|
||||||
else
|
else
|
||||||
|
|
|
@ -434,6 +434,7 @@ module.exports = class InventoryModal extends ModalView
|
||||||
onHidden: ->
|
onHidden: ->
|
||||||
# Called when the modal itself is dismissed
|
# Called when the modal itself is dismissed
|
||||||
@endHighlight()
|
@endHighlight()
|
||||||
|
super()
|
||||||
|
|
||||||
onClickChooseHero: ->
|
onClickChooseHero: ->
|
||||||
@hide()
|
@hide()
|
||||||
|
|
|
@ -49,6 +49,7 @@ module.exports = class WorldMapView extends RootView
|
||||||
window.tracker?.trackEvent 'World Map', Action: 'Loaded'
|
window.tracker?.trackEvent 'World Map', Action: 'Loaded'
|
||||||
|
|
||||||
destroy: ->
|
destroy: ->
|
||||||
|
@setupManager?.destroy()
|
||||||
$(window).off 'resize', @onWindowResize
|
$(window).off 'resize', @onWindowResize
|
||||||
if ambientSound = @ambientSound
|
if ambientSound = @ambientSound
|
||||||
# Doesn't seem to work; stops immediately.
|
# Doesn't seem to work; stops immediately.
|
||||||
|
@ -150,8 +151,9 @@ module.exports = class WorldMapView extends RootView
|
||||||
@startLevel $(e.target).parents('.level-info-container')
|
@startLevel $(e.target).parents('.level-info-container')
|
||||||
|
|
||||||
startLevel: (levelElement) ->
|
startLevel: (levelElement) ->
|
||||||
setupManager = new LevelSetupManager supermodel: @supermodel, levelID: levelElement.data('level-id'), levelPath: levelElement.data('level-path'), levelName: levelElement.data('level-name'), hadEverChosenHero: @hadEverChosenHero, parent: @
|
@setupManager?.destroy()
|
||||||
setupManager.open()
|
@setupManager = new LevelSetupManager supermodel: @supermodel, levelID: levelElement.data('level-id'), levelPath: levelElement.data('level-path'), levelName: levelElement.data('level-name'), hadEverChosenHero: @hadEverChosenHero, parent: @
|
||||||
|
@setupManager.open()
|
||||||
@$levelInfo?.hide()
|
@$levelInfo?.hide()
|
||||||
|
|
||||||
onMouseEnterLevel: (e) ->
|
onMouseEnterLevel: (e) ->
|
||||||
|
|
|
@ -69,8 +69,9 @@ module.exports = class ControlBarView extends CocoView
|
||||||
gameMenuModal = new GameMenuModal level: @level, session: @session, supermodel: @supermodel
|
gameMenuModal = new GameMenuModal level: @level, session: @session, supermodel: @supermodel
|
||||||
@openModalView gameMenuModal
|
@openModalView gameMenuModal
|
||||||
@listenToOnce gameMenuModal, 'change-hero', ->
|
@listenToOnce gameMenuModal, 'change-hero', ->
|
||||||
setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @level.get('slug'), parent: @})
|
@setupManager?.destroy()
|
||||||
setupManager.open()
|
@setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @level.get('slug'), parent: @})
|
||||||
|
@setupManager.open()
|
||||||
|
|
||||||
onClickHome: (e) ->
|
onClickHome: (e) ->
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
|
@ -84,3 +85,7 @@ module.exports = class ControlBarView extends CocoView
|
||||||
return if enabled is @controlsEnabled
|
return if enabled is @controlsEnabled
|
||||||
@controlsEnabled = enabled
|
@controlsEnabled = enabled
|
||||||
@$el.toggleClass 'controls-disabled', not enabled
|
@$el.toggleClass 'controls-disabled', not enabled
|
||||||
|
|
||||||
|
destroy: ->
|
||||||
|
@setupManager?.destroy()
|
||||||
|
super()
|
||||||
|
|
|
@ -280,8 +280,9 @@ module.exports = class PlayLevelView extends RootView
|
||||||
onSessionLoaded: (e) ->
|
onSessionLoaded: (e) ->
|
||||||
# Just the level and session have been loaded by the level loader
|
# Just the level and session have been loaded by the level loader
|
||||||
if e.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] and not _.size e.session.get('heroConfig')?.inventory ? {}
|
if e.level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop'] and not _.size e.session.get('heroConfig')?.inventory ? {}
|
||||||
setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @levelID, parent: @})
|
@setupManager?.destroy()
|
||||||
setupManager.open()
|
@setupManager = new LevelSetupManager({supermodel: @supermodel, levelID: @levelID, parent: @})
|
||||||
|
@setupManager.open()
|
||||||
|
|
||||||
@onRealTimeMultiplayerLevelLoaded e.session if e.level.get('type') in ['ladder', 'hero-ladder']
|
@onRealTimeMultiplayerLevelLoaded e.session if e.level.get('type') in ['ladder', 'hero-ladder']
|
||||||
|
|
||||||
|
@ -556,6 +557,7 @@ module.exports = class PlayLevelView extends RootView
|
||||||
@god?.destroy()
|
@god?.destroy()
|
||||||
@goalManager?.destroy()
|
@goalManager?.destroy()
|
||||||
@scriptManager?.destroy()
|
@scriptManager?.destroy()
|
||||||
|
@setupManager?.destroy()
|
||||||
if ambientSound = @ambientSound
|
if ambientSound = @ambientSound
|
||||||
# Doesn't seem to work; stops immediately.
|
# Doesn't seem to work; stops immediately.
|
||||||
createjs.Tween.get(ambientSound).to({volume: 0.0}, 1500).call -> ambientSound.stop()
|
createjs.Tween.get(ambientSound).to({volume: 0.0}, 1500).call -> ambientSound.stop()
|
||||||
|
|
|
@ -52,13 +52,14 @@ module.exports = class Spell
|
||||||
@tabView.render()
|
@tabView.render()
|
||||||
@team = @permissions.readwrite[0] ? 'common'
|
@team = @permissions.readwrite[0] ? 'common'
|
||||||
Backbone.Mediator.publish 'tome:spell-created', spell: @
|
Backbone.Mediator.publish 'tome:spell-created', spell: @
|
||||||
Backbone.Mediator.subscribe 'real-time-multiplayer:new-opponent-code', @onNewOpponentCode
|
Backbone.Mediator.subscribe 'real-time-multiplayer:new-opponent-code', @onNewOpponentCode, @
|
||||||
|
|
||||||
destroy: ->
|
destroy: ->
|
||||||
@view?.destroy()
|
@view?.destroy()
|
||||||
@tabView?.destroy()
|
@tabView?.destroy()
|
||||||
@thangs = null
|
@thangs = null
|
||||||
@worker = null
|
@worker = null
|
||||||
|
Backbone.Mediator.unsubscribe 'real-time-multiplayer:new-opponent-code', @onNewOpponentCode, @
|
||||||
|
|
||||||
setLanguage: (@language) ->
|
setLanguage: (@language) ->
|
||||||
#console.log 'setting language to', @language, 'so using original source', @languages[language] ? @languages.javascript
|
#console.log 'setting language to', @language, 'so using original source', @languages[language] ? @languages.javascript
|
||||||
|
@ -192,7 +193,7 @@ module.exports = class Spell
|
||||||
return true if @session.get('creator') isnt me.id and not (me.isAdmin() or 'employer' in me.get('permissions', true))
|
return true if @session.get('creator') isnt me.id and not (me.isAdmin() or 'employer' in me.get('permissions', true))
|
||||||
false
|
false
|
||||||
|
|
||||||
onNewOpponentCode: (e) =>
|
onNewOpponentCode: (e) ->
|
||||||
return unless @spellKey and @canWrite e.team
|
return unless @spellKey and @canWrite e.team
|
||||||
if e.codeLanguage and e.code
|
if e.codeLanguage and e.code
|
||||||
[thangSlug, methodSlug] = @spellKey.split '/'
|
[thangSlug, methodSlug] = @spellKey.split '/'
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue