Fix support for multiblock recipes

This commit is contained in:
Andrew Miner
2017-07-16 04:58:16 -04:00
parent ab96166601
commit 89ba3ac48e
4 changed files with 114 additions and 53 deletions
@@ -1,11 +1,11 @@
###
Crafting Guide - multiblock_controller.coffee
#
# Crafting Guide - multiblock_controller.coffee
#
# Copyright (c) 2014-2017 by Redwood Labs
# All rights reserved.
#
Copyright (c) 2014-2015 by Redwood Labs
All rights reserved.
###
BaseController = require '../../../base_controller'
BaseController = require "../../../base_controller"
ItemDisplay = require "../../../../models/site/item_display"
########################################################################################################################
@@ -26,9 +26,9 @@ module.exports = class MultiblockController extends BaseController
@::MAX_DROP_DELAY = 250 # ms
constructor: (options={})->
if not options.imageLoader? then throw new Error 'options.imageLoader is required'
if not options.modPack? then throw new Error 'options.modPack is required'
options.templateName = 'item_page/multiblock_viewer/multiblock'
if not options.imageLoader? then throw new Error "options.imageLoader is required"
if not options.modPack? then throw new Error "options.modPack is required"
options.templateName = "item_page/multiblock_viewer/multiblock"
super options
@_currentLayer = 0
@@ -64,11 +64,11 @@ module.exports = class MultiblockController extends BaseController
# BaseController Overrides #####################################################################
onDidRender: ->
@$outline = @$('.outline')
@$outline = @$(".outline")
super
refresh: ->
@$el.css 'height':@_computeMinHeight(), 'width':@_computeMinWidth()
@$el.css "height":@_computeMinHeight(), "width":@_computeMinWidth()
@_refreshBlockCache()
@_refreshAllBlocks()
@@ -77,7 +77,7 @@ module.exports = class MultiblockController extends BaseController
# Private Methods ##############################################################################
_computePosition: (x, y, z, options={})->
if not @model? then return left:0, top:-@IMAGE_SIZE, 'z-index':0, opacity:0.0
if not @model? then return left:0, top:-@IMAGE_SIZE, "z-index":0, opacity:0.0
options.hideUpperLayers ?= false
pxWidth = @$el.width()
@@ -94,7 +94,7 @@ module.exports = class MultiblockController extends BaseController
zindex = ((@model.width - x) + (@model.depth - z) + ((@model.width * @model.depth) * y)) * 2
return left:left, top:top, 'z-index':zindex, opacity:opacity
return left:left, top:top, "z-index":zindex, opacity:opacity
_computeMinHeight: ->
return 0 unless @model?
@@ -131,14 +131,14 @@ module.exports = class MultiblockController extends BaseController
for z in [0...@model.depth]
@_blockCache[x][y][z] ?= null
for el in @$('.block')
for el in @$(".block")
$el = $(el)
@_blockCache[$el.data('x')][$el.data('y')][$el.data('z')] = $el
@_blockCache[$el.data("x")][$el.data("y")][$el.data("z")] = $el
_refreshBlock: (x, y, z)->
return unless @model?
stack = @model.getStackAt x, y, z
stack = @model.getInputAt x, y, z
$block = @_blockCache[x][y][z]
position = @_computePosition x, y, z, hideUpperLayers:true
move = false
@@ -147,7 +147,7 @@ module.exports = class MultiblockController extends BaseController
itemDisplay = new ItemDisplay stack.item
if not $block?
$block = $("<img alt='#{itemDisplay.itemName}' class='block' />")
$block = $("<img alt=\"#{itemDisplay.itemName}\" class=\"block\" />")
$block.css position, top:-@IMAGE_SIZE, opacity:0.0
@_registerHoverHandlers $block, y, itemDisplay
@_imageLoader.load itemDisplay.iconUrl, $block
@@ -155,10 +155,10 @@ module.exports = class MultiblockController extends BaseController
@$el.append $block
move = true
else
$block.attr 'src', itemDisplay.iconUrl
$block.attr "src", itemDisplay.iconUrl
move = true
else if $block?
$block.attr 'src', ''
$block.attr "src", ""
move = true
if move then _.delay (-> $block.css position), @_randomDropDelay()
@@ -175,10 +175,10 @@ module.exports = class MultiblockController extends BaseController
_registerHoverHandlers: ($el, y, itemDisplay)->
startHovering = =>
return unless y is @_currentLayer
zIndex = parseInt($el.css('z-index')) + 1
zIndex = parseInt($el.css("z-index")) + 1
zIndex = if _.isNaN(zIndex) then 0 else zIndex
@$outline.css opacity:1.0, top:$el.css('top'), left:$el.css('left'), 'z-index':zIndex
@$outline.css opacity:1.0, top:$el.css("top"), left:$el.css("left"), "z-index":zIndex
@_onHovering itemDisplay
if @_hoverTimer? then clearTimeout @_hoverTimer
@@ -5,19 +5,20 @@
# All rights reserved.
#
BaseController = require '../../base_controller'
InventoryController = require '../../common/inventory/inventory_controller'
MultiblockController = require './multiblock/multiblock_controller'
BaseController = require "../../base_controller"
InventoryController = require "../../common/inventory/inventory_controller"
MultiblockController = require "./multiblock/multiblock_controller"
MultiblockDisplay = require "../../../models/site/multiblock_display"
########################################################################################################################
module.exports = class MultiblockViewerController extends BaseController
constructor: (options={})->
if not options.imageLoader? then throw new Error 'options.imageLoader is required'
if not options.modPack? then throw new Error 'options.modPack is required'
if not options.router? then throw new Error 'options.router is required'
options.templateName = 'item_page/multiblock_viewer'
if not options.imageLoader? then throw new Error "options.imageLoader is required"
if not options.modPack? then throw new Error "options.modPack is required"
if not options.router? then throw new Error "options.router is required"
options.templateName = "item_page/multiblock_viewer"
super options
@_imageLoader = options.imageLoader
@@ -28,66 +29,70 @@ module.exports = class MultiblockViewerController extends BaseController
# Event Methods ################################################################################
onBackClicked: ->
return if @$backButton.hasClass 'disabled'
tracker.trackEvent c.tracking.category.multiblock, 'back'
return if @$backButton.hasClass "disabled"
tracker.trackEvent c.tracking.category.multiblock, "back"
@multiblockController.goBackLayer()
@refresh()
onNextClicked: ->
return if @$nextButton.hasClass 'disabled'
tracker.trackEvent c.tracking.category.multiblock, 'next'
return if @$nextButton.hasClass "disabled"
tracker.trackEvent c.tracking.category.multiblock, "next"
@multiblockController.goNextLayer()
@refresh()
onBlockHovered: (itemDisplay)->
if itemDisplay?
@$captionText.html itemDisplay.itemName
@$captionText.html itemDisplay.name
@_imageLoader.load itemDisplay.iconUrl, @$captionIcon
else
@$captionText.html '&nbsp;'
@$captionIcon.attr 'src', '/images/empty.png'
@$captionText.html "&nbsp;"
@$captionIcon.attr "src", "/images/empty.png"
# BaseController Overrides #####################################################################
onDidRender: ->
@completeInventoryController = @addChild InventoryController, '.view__inventory.complete',
@completeInventoryController = @addChild InventoryController, ".view__inventory.complete",
editable: false
imageLoader: @_imageLoader
modPack: @_modPack
router: @_router
@layerInventoryController = @addChild InventoryController, '.view__inventory.layer',
@layerInventoryController = @addChild InventoryController, ".view__inventory.layer",
editable: false
imageLoader: @_imageLoader
modPack: @_modPack
router: @_router
@multiblockController = @addChild MultiblockController, '.view__multiblock',
@multiblockController = @addChild MultiblockController, ".view__multiblock",
imageLoader: @_imageLoader
modPack: @_modPack
onHovering: (itemDisplay)=> @onBlockHovered(itemDisplay)
@$backButton = @$('.button.back')
@$nextButton = @$('.button.next')
@$captionText = @$('.caption p')
@$captionIcon = @$('.caption img')
@$backButton = @$(".button.back")
@$nextButton = @$(".button.next")
@$captionText = @$(".caption p")
@$captionIcon = @$(".caption img")
super
onWillChangeModel: (oldModel, newModel)->
@_display = new MultiblockDisplay newModel
super oldModel, newModel
refresh: ->
if @model?
@completeInventoryController.model = @model.inventory
@layerInventoryController.model = @model.getLayerInventory @multiblockController.currentLayer
if @model? and @_display?
@completeInventoryController.model = @_display.getInventory()
@layerInventoryController.model = @_display.getInventory @multiblockController.currentLayer
@multiblockController.model = @model
if @multiblockController.hasBackLayer()
@$backButton.removeClass 'disabled'
@$backButton.removeClass "disabled"
else
@$backButton.addClass 'disabled'
@$backButton.addClass "disabled"
if @multiblockController.hasNextLayer()
@$nextButton.removeClass 'disabled'
@$nextButton.removeClass "disabled"
else
@$nextButton.addClass 'disabled'
@$nextButton.addClass "disabled"
super
@@ -95,5 +100,5 @@ module.exports = class MultiblockViewerController extends BaseController
events: ->
_.extend super,
'click .button.back': 'onBackClicked'
'click .button.next': 'onNextClicked'
"click .button.back": "onBackClicked"
"click .button.next": "onNextClicked"