Fix support for multiblock recipes
This commit is contained in:
@@ -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
|
||||||
+22
-22
@@ -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 ' '
|
@$captionText.html " "
|
||||||
@$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"
|
||||||
|
|||||||
Reference in New Issue
Block a user