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
+4 -1
View File
@@ -48,8 +48,11 @@ module.exports = class ItemPage extends Observable
return @_findItemsWithMatchingRecipes (recipe)=> return @_findItemsWithMatchingRecipes (recipe)=>
recipe.computeQuantityRequired @item recipe.computeQuantityRequired @item
findMultiblockRecipes: ->
return (recipe for recipeId, recipe of @item.recipes when recipes.depth > 1)
findRecipes: -> findRecipes: ->
return (recipe for recipeId, recipe of @item.recipes) return (recipe for recipeId, recipe of @item.recipes when recipe.depth is 1)
findSimilarItems: -> findSimilarItems: ->
group = @mod.itemGroups[@item.groupName] group = @mod.itemGroups[@item.groupName]
@@ -0,0 +1,53 @@
#
# Crafting Guide - multiblock_display.coffee
#
# Copyright © 2014-2017 by Redwood Labs
# All rights reserved.
#
{Inventory} = require("crafting-guide-common").models
{Observable} = require("crafting-guide-common").util
########################################################################################################################
module.exports = class MultiblockDisplay extends Observable
constructor: (recipe)->
@_layerInventories = []
@recipe = recipe
# Properties ###################################################################################
Object.defineProperties @prototype,
recipe:
get: -> return @_recipe
set: (recipe)->
if not recipe? then throw new Error "recipe is required"
if @_recipe? then throw new Error "recipe cannot be reassigned"
@_recipe = recipe
# Public Methods ###############################################################################
getInventory: (z)->
if not z?
return @_fullInventory ?= @_createFullInventory()
else
return @_layerInventories[z] ?= @_addLayerInventory z
# Private Methods ##############################################################################
_addLayerInventory: (z, inventory=null)->
inventory ?= new Inventory
for x in [0..@recipe.width]
for y in [0..@recipe.height]
stack = @recipe.getInputAt x, y, z
continue unless stack?
inventory.add stack.item, stack.quantity
return inventory
_createFullInventory: (inventory=null)->
inventory ?= new Inventory()
for z in [0..@recipe.depth]
@_addLayerInventory z, inventory
return inventory
@@ -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 BaseController = require "../../../base_controller"
All rights reserved.
###
BaseController = require '../../../base_controller'
ItemDisplay = require "../../../../models/site/item_display" ItemDisplay = require "../../../../models/site/item_display"
######################################################################################################################## ########################################################################################################################
@@ -26,9 +26,9 @@ module.exports = class MultiblockController extends BaseController
@::MAX_DROP_DELAY = 250 # ms @::MAX_DROP_DELAY = 250 # ms
constructor: (options={})-> constructor: (options={})->
if not options.imageLoader? then throw new Error 'options.imageLoader is required' 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.modPack? then throw new Error "options.modPack is required"
options.templateName = 'item_page/multiblock_viewer/multiblock' options.templateName = "item_page/multiblock_viewer/multiblock"
super options super options
@_currentLayer = 0 @_currentLayer = 0
@@ -64,11 +64,11 @@ module.exports = class MultiblockController extends BaseController
# BaseController Overrides ##################################################################### # BaseController Overrides #####################################################################
onDidRender: -> onDidRender: ->
@$outline = @$('.outline') @$outline = @$(".outline")
super super
refresh: -> refresh: ->
@$el.css 'height':@_computeMinHeight(), 'width':@_computeMinWidth() @$el.css "height":@_computeMinHeight(), "width":@_computeMinWidth()
@_refreshBlockCache() @_refreshBlockCache()
@_refreshAllBlocks() @_refreshAllBlocks()
@@ -77,7 +77,7 @@ module.exports = class MultiblockController extends BaseController
# Private Methods ############################################################################## # Private Methods ##############################################################################
_computePosition: (x, y, z, options={})-> _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 options.hideUpperLayers ?= false
pxWidth = @$el.width() 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 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: -> _computeMinHeight: ->
return 0 unless @model? return 0 unless @model?
@@ -131,14 +131,14 @@ module.exports = class MultiblockController extends BaseController
for z in [0...@model.depth] for z in [0...@model.depth]
@_blockCache[x][y][z] ?= null @_blockCache[x][y][z] ?= null
for el in @$('.block') for el in @$(".block")
$el = $(el) $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)-> _refreshBlock: (x, y, z)->
return unless @model? return unless @model?
stack = @model.getStackAt x, y, z stack = @model.getInputAt x, y, z
$block = @_blockCache[x][y][z] $block = @_blockCache[x][y][z]
position = @_computePosition x, y, z, hideUpperLayers:true position = @_computePosition x, y, z, hideUpperLayers:true
move = false move = false
@@ -147,7 +147,7 @@ module.exports = class MultiblockController extends BaseController
itemDisplay = new ItemDisplay stack.item itemDisplay = new ItemDisplay stack.item
if not $block? 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 $block.css position, top:-@IMAGE_SIZE, opacity:0.0
@_registerHoverHandlers $block, y, itemDisplay @_registerHoverHandlers $block, y, itemDisplay
@_imageLoader.load itemDisplay.iconUrl, $block @_imageLoader.load itemDisplay.iconUrl, $block
@@ -155,10 +155,10 @@ module.exports = class MultiblockController extends BaseController
@$el.append $block @$el.append $block
move = true move = true
else else
$block.attr 'src', itemDisplay.iconUrl $block.attr "src", itemDisplay.iconUrl
move = true move = true
else if $block? else if $block?
$block.attr 'src', '' $block.attr "src", ""
move = true move = true
if move then _.delay (-> $block.css position), @_randomDropDelay() if move then _.delay (-> $block.css position), @_randomDropDelay()
@@ -175,10 +175,10 @@ module.exports = class MultiblockController extends BaseController
_registerHoverHandlers: ($el, y, itemDisplay)-> _registerHoverHandlers: ($el, y, itemDisplay)->
startHovering = => startHovering = =>
return unless y is @_currentLayer 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 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 @_onHovering itemDisplay
if @_hoverTimer? then clearTimeout @_hoverTimer if @_hoverTimer? then clearTimeout @_hoverTimer
@@ -5,19 +5,20 @@
# All rights reserved. # All rights reserved.
# #
BaseController = require '../../base_controller' BaseController = require "../../base_controller"
InventoryController = require '../../common/inventory/inventory_controller' InventoryController = require "../../common/inventory/inventory_controller"
MultiblockController = require './multiblock/multiblock_controller' MultiblockController = require "./multiblock/multiblock_controller"
MultiblockDisplay = require "../../../models/site/multiblock_display"
######################################################################################################################## ########################################################################################################################
module.exports = class MultiblockViewerController extends BaseController module.exports = class MultiblockViewerController extends BaseController
constructor: (options={})-> constructor: (options={})->
if not options.imageLoader? then throw new Error 'options.imageLoader is required' 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.modPack? then throw new Error "options.modPack is required"
if not options.router? then throw new Error 'options.router is required' if not options.router? then throw new Error "options.router is required"
options.templateName = 'item_page/multiblock_viewer' options.templateName = "item_page/multiblock_viewer"
super options super options
@_imageLoader = options.imageLoader @_imageLoader = options.imageLoader
@@ -28,66 +29,70 @@ module.exports = class MultiblockViewerController extends BaseController
# Event Methods ################################################################################ # Event Methods ################################################################################
onBackClicked: -> onBackClicked: ->
return if @$backButton.hasClass 'disabled' return if @$backButton.hasClass "disabled"
tracker.trackEvent c.tracking.category.multiblock, 'back' tracker.trackEvent c.tracking.category.multiblock, "back"
@multiblockController.goBackLayer() @multiblockController.goBackLayer()
@refresh() @refresh()
onNextClicked: -> onNextClicked: ->
return if @$nextButton.hasClass 'disabled' return if @$nextButton.hasClass "disabled"
tracker.trackEvent c.tracking.category.multiblock, 'next' tracker.trackEvent c.tracking.category.multiblock, "next"
@multiblockController.goNextLayer() @multiblockController.goNextLayer()
@refresh() @refresh()
onBlockHovered: (itemDisplay)-> onBlockHovered: (itemDisplay)->
if itemDisplay? if itemDisplay?
@$captionText.html itemDisplay.itemName @$captionText.html itemDisplay.name
@_imageLoader.load itemDisplay.iconUrl, @$captionIcon @_imageLoader.load itemDisplay.iconUrl, @$captionIcon
else else
@$captionText.html '&nbsp;' @$captionText.html "&nbsp;"
@$captionIcon.attr 'src', '/images/empty.png' @$captionIcon.attr "src", "/images/empty.png"
# BaseController Overrides ##################################################################### # BaseController Overrides #####################################################################
onDidRender: -> onDidRender: ->
@completeInventoryController = @addChild InventoryController, '.view__inventory.complete', @completeInventoryController = @addChild InventoryController, ".view__inventory.complete",
editable: false editable: false
imageLoader: @_imageLoader imageLoader: @_imageLoader
modPack: @_modPack modPack: @_modPack
router: @_router router: @_router
@layerInventoryController = @addChild InventoryController, '.view__inventory.layer', @layerInventoryController = @addChild InventoryController, ".view__inventory.layer",
editable: false editable: false
imageLoader: @_imageLoader imageLoader: @_imageLoader
modPack: @_modPack modPack: @_modPack
router: @_router router: @_router
@multiblockController = @addChild MultiblockController, '.view__multiblock', @multiblockController = @addChild MultiblockController, ".view__multiblock",
imageLoader: @_imageLoader imageLoader: @_imageLoader
modPack: @_modPack modPack: @_modPack
onHovering: (itemDisplay)=> @onBlockHovered(itemDisplay) onHovering: (itemDisplay)=> @onBlockHovered(itemDisplay)
@$backButton = @$('.button.back') @$backButton = @$(".button.back")
@$nextButton = @$('.button.next') @$nextButton = @$(".button.next")
@$captionText = @$('.caption p') @$captionText = @$(".caption p")
@$captionIcon = @$('.caption img') @$captionIcon = @$(".caption img")
super super
onWillChangeModel: (oldModel, newModel)->
@_display = new MultiblockDisplay newModel
super oldModel, newModel
refresh: -> refresh: ->
if @model? if @model? and @_display?
@completeInventoryController.model = @model.inventory @completeInventoryController.model = @_display.getInventory()
@layerInventoryController.model = @model.getLayerInventory @multiblockController.currentLayer @layerInventoryController.model = @_display.getInventory @multiblockController.currentLayer
@multiblockController.model = @model @multiblockController.model = @model
if @multiblockController.hasBackLayer() if @multiblockController.hasBackLayer()
@$backButton.removeClass 'disabled' @$backButton.removeClass "disabled"
else else
@$backButton.addClass 'disabled' @$backButton.addClass "disabled"
if @multiblockController.hasNextLayer() if @multiblockController.hasNextLayer()
@$nextButton.removeClass 'disabled' @$nextButton.removeClass "disabled"
else else
@$nextButton.addClass 'disabled' @$nextButton.addClass "disabled"
super super
@@ -95,5 +100,5 @@ module.exports = class MultiblockViewerController extends BaseController
events: -> events: ->
_.extend super, _.extend super,
'click .button.back': 'onBackClicked' "click .button.back": "onBackClicked"
'click .button.next': 'onNextClicked' "click .button.next": "onNextClicked"