Skip to content

Commit

Permalink
🐛Fix level session inventory check race condition
Browse files Browse the repository at this point in the history
Moving session loaded event to after session.set heroConfig in level
loader.
  • Loading branch information
differentmatt committed Oct 2, 2017
1 parent 7b2d850 commit 968b559
Showing 1 changed file with 27 additions and 26 deletions.
53 changes: 27 additions & 26 deletions app/lib/LevelLoader.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,6 @@ module.exports = class LevelLoader extends CocoClass
team = @team ? @session.get('team')
Backbone.Mediator.publish 'level:loaded', level: @level, team: team
@publishedLevelLoaded = true
Backbone.Mediator.publish 'level:session-loaded', level: @level, session: @session
@consolidateFlagHistory() if @opponentSession?.loaded
else if session is @opponentSession
@consolidateFlagHistory() if @session.loaded
Expand All @@ -221,36 +220,38 @@ module.exports = class LevelLoader extends CocoClass
@worldNecessities.push heroResource
@sessionDependenciesRegistered[session.id] = true
unless @level.isType('hero', 'hero-ladder', 'hero-coop')
Backbone.Mediator.publish 'level:session-loaded', level: @level, session: @session
# Return before loading heroConfig ThangTypes. Finish if all world necessities were completed by the time the session loaded.
if @checkAllWorldNecessitiesRegisteredAndLoaded()
@onWorldNecessitiesLoaded()
return
# Load the ThangTypes needed for the session's heroConfig for these types of levels
heroConfig = session.get('heroConfig')
heroConfig ?= me.get('heroConfig') if session is @session and not @headless
heroConfig ?= {}
heroConfig.inventory ?= feet: '53e237bf53457600003e3f05' # If all else fails, assign simple boots.
heroConfig.thangType ?= '529ffbf1cf1818f2be000001' # If all else fails, assign Tharin as the hero.
session.set 'heroConfig', heroConfig unless _.isEqual heroConfig, session.get('heroConfig')
url = "/db/thang.type/#{heroConfig.thangType}/version"
if heroResource = @maybeLoadURL(url, ThangType, 'thang')
@worldNecessities.push heroResource
else
heroThangType = @supermodel.getModel url
@loadDefaultComponentsForThangType heroThangType
@loadThangsRequiredByThangType heroThangType

for itemThangType in _.values(heroConfig.inventory)
url = "/db/thang.type/#{itemThangType}/version?project=name,components,original,rasterIcon,kind"
if itemResource = @maybeLoadURL(url, ThangType, 'thang')
@worldNecessities.push itemResource
# Load the ThangTypes needed for the session's heroConfig for these types of levels
heroConfig = session.get('heroConfig')
heroConfig ?= me.get('heroConfig') if session is @session and not @headless
heroConfig ?= {}
heroConfig.inventory ?= feet: '53e237bf53457600003e3f05' # If all else fails, assign simple boots.
heroConfig.thangType ?= '529ffbf1cf1818f2be000001' # If all else fails, assign Tharin as the hero.
session.set 'heroConfig', heroConfig unless _.isEqual heroConfig, session.get('heroConfig')
Backbone.Mediator.publish 'level:session-loaded', level: @level, session: @session
url = "/db/thang.type/#{heroConfig.thangType}/version"
if heroResource = @maybeLoadURL(url, ThangType, 'thang')
@worldNecessities.push heroResource
else
itemThangType = @supermodel.getModel url
@loadDefaultComponentsForThangType itemThangType
@loadThangsRequiredByThangType itemThangType
@sessionDependenciesRegistered[session.id] = true
if _.size(@sessionDependenciesRegistered) is 2 and @checkAllWorldNecessitiesRegisteredAndLoaded()
@onWorldNecessitiesLoaded()
heroThangType = @supermodel.getModel url
@loadDefaultComponentsForThangType heroThangType
@loadThangsRequiredByThangType heroThangType

for itemThangType in _.values(heroConfig.inventory)
url = "/db/thang.type/#{itemThangType}/version?project=name,components,original,rasterIcon,kind"
if itemResource = @maybeLoadURL(url, ThangType, 'thang')
@worldNecessities.push itemResource
else
itemThangType = @supermodel.getModel url
@loadDefaultComponentsForThangType itemThangType
@loadThangsRequiredByThangType itemThangType
@sessionDependenciesRegistered[session.id] = true
if _.size(@sessionDependenciesRegistered) is 2 and @checkAllWorldNecessitiesRegisteredAndLoaded()
@onWorldNecessitiesLoaded()

loadCodeLanguagesForSession: (session) ->
codeLanguages = _.uniq _.filter [session.get('codeLanguage') or 'python', session.get('submittedCodeLanguage')]
Expand Down

0 comments on commit 968b559

Please sign in to comment.