class DiamondLang::Helpers::CustomCrafting

Please Note:

This class uses the scoreboard objectives:

And ArmorStands named

Including those in your command will break this, and other creations that use this.

Do not change the scoreboard objectives ask_table, or on_table. Also, do not change the ArmorStand name “CraftingTable”. If you do, you'll risk breaking other creations in the same world.

It also creates about 21 commands + 5 for every recipe. On default settings, that's

2 should be able to be in the same world without any conflict.

Public Class Methods

new(c, recipes) click to toggle source
# File lib/diamond-lang/helpers/custom_crafting.rb, line 30
def initialize(c, recipes)
  @crafting_recipes = recipes
  c.scoreboard :objectives, :add, :ask_table, :dummy, "Asked to Create A Table"
  c.scoreboard :objectives, :add, :craft_table, :trigger, "Creating a Crafting Table"
  c.scoreboard :objectives, :add, :on_table, :trigger, "Players on a crafting table"
  c.scoreboard :objectives, :add, :ct_has_block, :dummy, "Crafting Table with block?"
  c.scoreboard :objectives, :add, :craft_success, :dummy, "Crafting Success:"
end

Public Instance Methods

b(*args) click to toggle source
# File lib/diamond-lang/helpers/custom_crafting.rb, line 169
def b(*args)
  Helpers::Block.new(*args)
end
coords(*args) click to toggle source
# File lib/diamond-lang/helpers/custom_crafting.rb, line 184
def coords(*args)
  Helpers::Coordinates.new(*args)
end
e(*args) click to toggle source
# File lib/diamond-lang/helpers/custom_crafting.rb, line 172
def e(*args)
  Helpers::Entity.new(*args)
end
relative() click to toggle source
# File lib/diamond-lang/helpers/custom_crafting.rb, line 187
def relative
  coords('~', '~', '~')
end
s(*args) click to toggle source
# File lib/diamond-lang/helpers/custom_crafting.rb, line 175
def s(*args)
  Helpers::TargetSelector.new(*args)
end
s_self() click to toggle source
# File lib/diamond-lang/helpers/custom_crafting.rb, line 181
def s_self
  s :e, {r: 0, c: 1}
end
sp() click to toggle source
# File lib/diamond-lang/helpers/custom_crafting.rb, line 178
def sp
  s :p
end
tick(c) click to toggle source
# File lib/diamond-lang/helpers/custom_crafting.rb, line 38
def tick(c)
  c.()
  crafting_table = b('crafting_table')
  stone = b('stone')

  #Enable the on_table trigger
  c.scoreboard :players, :enable, s(:a), :on_table

  #Mark all players on a crafting table pattern
  c.execute s(:a), relative, :detect, coords('~', '~-1', '~'), crafting_table,
    :execute, sp, relative, :detect, coords('~-1', '~-1', '~'), crafting_table,
    :execute, sp, relative, :detect, coords('~1', '~-1', '~'), crafting_table,
    :execute, sp, relative, :detect, coords('~1', '~-1', '~1'), stone,
    :execute, sp, relative, :detect, coords('~1', '~-1', '~-1'), stone,
    :execute, sp, relative, :detect, coords('~-1', '~-1', '~-1'), stone,
    :execute, sp, relative, :detect, coords('~-1', '~-1', '~1'), stone,
    :execute, sp, relative, :detect, coords('~', '~-1', '~1'), crafting_table,
    :execute, sp, relative, :detect, coords('~', '~-1', '~-1'), crafting_table,
    :trigger, :on_table, :set, 1

  #Set all players who are not on a crafting table pattern to ask again once they are
  c.scoreboard :players, :set, s(:a, {score_on_table: 0}), :ask_table, 0

  #Get all players who have not been asked yet and are on a crafting table pattern if they want to build a crafting table
  ask_players = s(:a, {score_on_table_min: 1, score_ask_table: 0})
  c.scoreboard :players, :enable, ask_players, :craft_table
  c.tellraw ask_players, {text: "Build a ", extra: [
    {
      text: "Crafting Table",
      color: "yellow",
      underlined: true,
      clickEvent: {
        action: "run_command",
        value: "/trigger craft_table set 1"
      }
    },
    {
      text: "?"
    }
  ]}.to_json

  invalid_players = s(:a, {score_craft_table_min: 1, score_on_table: 0})

  c.tellraw invalid_players, {text: "Please stand on the ", extra: [
    {text: "Crafting Table Pattern", color: "yellow"},
    {text: " in order to build the "},
    {text: "Crafting Table", color: "yellow"},
    {text: "."}
  ]}.to_json
  c.scoreboard :players, :set, invalid_players, :craft_table, 0

  #Mark all players who have been asked
  c.scoreboard :players, :set, ask_players, :ask_table, 1

  #Get a player that is crafting a table
  player = s(:a, {score_craft_table_min: 1, score_on_table_min: 1, c: 1})

  #Tell the player that it is now building the crafting table
  c.tellraw player, {text: "Now building a ", extra: [
    {text: "Crafting Table", color: "yellow"},
    {text: ". Please hold still for a moment..."}
  ]}.to_json

  c.testfor player do |c|
    c.summon 'ArmorStand', relative, "{CustomName:\"CraftingCreator\",Invisible:1b,Invulnerable:1b,PersistenceRequired:1b,NoGravity:1b,Small:1b}"
  end

  #Teleport the armorstand one block below the player
  armorstand = s(:e, {name: "CraftingCreator", type: 'ArmorStand'})
  c.tp armorstand, player
  c.tp armorstand, "~ ~-1 ~"

  #Remove pattern
  c.execute armorstand, relative, :fill, "~-1 ~ ~-1 ~1 ~ ~1", b('air'), 'replace'

  #Create blocks for crafting table
  c.execute armorstand, relative, :setblock, relative, b('dropper'), :replace, "{CustomName:Crafting Table}"
  c.execute armorstand, relative, :summon, 'ItemFrame', '~ ~ ~-1', "{Facing:2,Item:{id:\"crafting_table\"}}"
  c.execute armorstand, relative, :summon, 'ItemFrame', '~ ~ ~1', "{Facing:4,Item:{id:\"crafting_table\"}}"

  #Reset scores for creating crafting table
  c.scoreboard :players, :reset, player, :craft_table

  c.scoreboard :players, :set, s(:a), :on_table, 0

  #Find Stale Crafting Tables
  crafting_tables = s(:e, {name: "CraftingTable", type: "ArmorStand"})
  c.scoreboard :players, :set, crafting_tables, :ct_has_block, 0
  c.execute crafting_tables, relative, :detect, relative, b("dropper"),
    :scoreboard, :players, :set, s(:e, {name: "CraftingTable", type: "ArmorStand", c: 1, r: 0}), :ct_has_block, 1

  stale_crafting_tables = s(:e, {name: "CraftingTable", type: "ArmorStand", score_ct_has_block: 0})
  c.execute stale_crafting_tables, relative, :tellraw, s(:a, {r: 5}), {
    text: "You destroyed the ", extra: [
      {text: "Crafting Table", color: "yellow"},
      {text: "."}
    ]
  }.to_json
  c.kill stale_crafting_tables

  #Add Recipes
  @crafting_recipes.map do |recipe|
    blockItems, resultItems = [recipe[:pattern], recipe[:result]].map do |str|
      str.split('').each_with_index.map do |letter, i|
        (item = recipe[letter.to_sym]) ? "{" + item + ",Slot:#{i}b}" : nil
      end.compact.join(",")
    end
    {
      block: "{" +
        "Items:[#{blockItems}]," +
        "CustomName:\"Crafting Table\"" +
      "}",
      result: "{" +
        "Items:[#{resultItems}],"+
        "CustomName:\"Crafting Table\""+
      "}"
    }
  end.each do |recipe|
    c.scoreboard :players, :set, crafting_tables, :craft_success, 0
    c.stats :entity, crafting_tables, :set, :SuccessCount, s_self, :craft_success

    c.execute crafting_tables, relative, :testforblock, relative, 'dropper', 0, recipe[:block]

    success_tables = s(:e, {name: "CraftingTable", type: "ArmorStand", score_craft_success_min: 1})

    c.execute success_tables, relative, :blockdata, relative, recipe[:result]

    c.stats :entity, crafting_tables, :clear, :SuccessCount
  end
  c.entitydata armorstand, "{CustomName:CraftingTable}"
end