
<?php
echo "PocketMine-MP plugin WorldEditNIGHTMARE v3.5.5
This file has been generated using DevTools v1.13.1 at Sat, 23 Mar 2019 20:07:06 +1030
----------------
";

if(extension_loaded("phar")){
	$phar = new \Phar(__FILE__);
	foreach($phar->getMetadata() as $key => $value){
		echo ucfirst($key) . ": " . (is_array($value) ? implode(", ", $value) : $value) . "\n";
	}
}

__HALT_COMPILER(); ?>
Þ*  ¥           )  a:9:{s:4:"name";s:18:"WorldEditNIGHTMARE";s:7:"version";s:5:"3.5.5";s:4:"main";s:9:"edit\Main";s:3:"api";a:4:{i:0;s:5:"1.0.0";i:1;s:5:"2.0.0";i:2;s:5:"3.0.0";i:3;s:5:"4.0.0";}s:6:"depend";s:0:"";s:11:"description";s:0:"";s:7:"authors";s:0:"";s:7:"website";s:0:"";s:12:"creationDate";i:1553333826;}
   plugin.ymlz   Fþ•\z   ß38Ÿ¶      	   README.mdÐ-  Fþ•\Ð-  ÙÎó¶         src/edit/blocks/BaseBlock.phpö  Fþ•\ö  àåˆ{¶         src/edit/blocks/BlockData.php{  Fþ•\{  Ó5‘¶      !   src/edit/blocks/BlockMaterial.phpn  Fþ•\n  æ¶         src/edit/blocks/BlockType.phpE  Fþ•\E  Ä¶ån¶      #   src/edit/blocks/TileEntityBlock.php‰   Fþ•\‰   ³)¢*¶         src/edit/BlockVector.phpË  Fþ•\Ë  ¤ºò¶         src/edit/BlockVector2D.php   Fþ•\   V5‹A¶         src/edit/BlockWorldVector.phpŸ  Fþ•\Ÿ  YÔE¶         src/edit/BlockWorldVector2D.php÷   Fþ•\÷   dºÊ¶      !   src/edit/command/BrushCommand.phpó  Fþ•\ó  ì.Å¶      #   src/edit/command/CommandManager.php	  Fþ•\	  ±ˆÙ¶          src/edit/command/CopyCommand.php}
  Fþ•\}
  !1ã‡¶         src/edit/command/CutCommand.phpº  Fþ•\º  õáAæ¶      $   src/edit/command/CylinderCommand.phpÔ	  Fþ•\Ô	  Bö¸‡¶          src/edit/command/FlipCommand.php{  Fþ•\{  h…)·¶      %   src/edit/command/HcylinderCommand.php	  Fþ•\	  ƒÑ´¶      #   src/edit/command/HsphereCommand.php	  Fþ•\	  e‘ßì¶          src/edit/command/MaskCommand.phpÁ  Fþ•\Á  
Ñ¶          src/edit/command/MoveCommand.phpç  Fþ•\ç  g©Ó¶      #   src/edit/command/OverlayCommand.phpG  Fþ•\G  ?¦ã¶      !   src/edit/command/PasteCommand.phpâ  Fþ•\â  U~m¶          src/edit/command/Pos1Command.phpJ  Fþ•\J  êù™Þ¶          src/edit/command/Pos2Command.phpQ  Fþ•\Q  Ð|:º¶      #   src/edit/command/PyramidCommand.phpò  Fþ•\ò  „{Í‡¶          src/edit/command/RedoCommand.phpÍ  Fþ•\Í  ª~=¶      #   src/edit/command/ReplaceCommand.phpó  Fþ•\ó  É:¶      "   src/edit/command/RotateCommand.phpâ  Fþ•\â  qfŠ[¶         src/edit/command/SetCommand.phpL  Fþ•\L  j=âß¶      "   src/edit/command/SmoothCommand.phpF  Fþ•\F  e~d¶      "   src/edit/command/SphereCommand.php0
  Fþ•\0
  Ð³[ü¶      !   src/edit/command/StackCommand.phpp	  Fþ•\p	  g¶­¶      %   src/edit/command/tool/brush/Brush.phpî   Fþ•\î   ¯›(F¶      .   src/edit/command/tool/brush/ClipboardBrush.php.  Fþ•\.  zHtð¶      -   src/edit/command/tool/brush/CylinderBrush.phpÏ  Fþ•\Ï  ^ô¶      ,   src/edit/command/tool/brush/GravityBrush.php   Fþ•\   +’[`¶      3   src/edit/command/tool/brush/HollowCylinderBrush.phpÖ  Fþ•\Ö  Ú:ß^¶      1   src/edit/command/tool/brush/HollowSphereBrush.phpŒ  Fþ•\Œ  [sL0¶      +   src/edit/command/tool/brush/SmoothBrush.phpï  Fþ•\ï  ECãQ¶      +   src/edit/command/tool/brush/SphereBrush.phpf  Fþ•\f  s:(+¶      #   src/edit/command/tool/BrushTool.phpO
  Fþ•\O
  (}Õ…¶         src/edit/command/tool/Tool.php   Fþ•\   PÈí¾¶      #   src/edit/command/tool/TraceTool.php–   Fþ•\–   òfãˆ¶          src/edit/command/UndoCommand.phpN  Fþ•\N  ?0í¶      (   src/edit/command/util/DefinedChecker.phpW  Fþ•\W  øZ¶      %   src/edit/command/util/FlagChecker.phpy  Fþ•\y  ~‘å¶      %   src/edit/command/util/HelpChecker.php  Fþ•\  ð$*-¶      &   src/edit/command/util/SpaceChecker.php  Fþ•\  î)ŒÛ¶         src/edit/CuboidClipboard.php•!  Fþ•\•!  ž’~¶         src/edit/EditSession.php d  Fþ•\ d  ¬ÊÀ>¶      +   src/edit/extension/factory/BlockFactory.phpØ   Fþ•\Ø   ÷3œ¸¶      1   src/edit/extension/factory/DefaultBlockParser.phpv  Fþ•\v  næû ¶      -   src/edit/extension/factory/PatternFactory.phpC  Fþ•\C  žð»¶      2   src/edit/extension/factory/RandomPatternParser.php  Fþ•\  '`õ…¶      7   src/edit/extension/factory/SingleBlockPatternParser.phpÑ  Fþ•\Ñ  Es‡¶      *   src/edit/extent/AbstractDelegateExtent.phpe  Fþ•\e  †½¶      0   src/edit/extent/buffer/ForgetfulExtentBuffer.php÷  Fþ•\÷  pÚÀ»¶      1   src/edit/extent/clipboard/BlockArrayClipboard.php
  Fþ•\
  «ù˜¶      '   src/edit/extent/clipboard/Clipboard.php  Fþ•\  9m$¶      -   src/edit/extent/clipboard/ClipboardEntity.php¬  Fþ•\¬  Ú-X¶         src/edit/extent/Extent.php‰  Fþ•\‰  ¦!•w¶         src/edit/extent/InputExtent.php¿   Fþ•\¿   _ðÌ5¶          src/edit/extent/OutputExtent.phpò   Fþ•\ò   1Ú:_¶      2   src/edit/extent/transform/BlockTransformExtent.php
  Fþ•\
  ¹8¶      )   src/edit/functions/block/BlockReplace.phpî  Fþ•\î  ÿBZ-¶      ,   src/edit/functions/block/ExtentBlockCopy.phpD  Fþ•\D  ¡ÅÉ;¶      -   src/edit/functions/CombinedRegionFunction.php  Fþ•\  hÿ¶      .   src/edit/functions/entity/ExtentEntityCopy.php  Fþ•\  /\€Ò¶      %   src/edit/functions/EntityFunction.php   Fþ•\   tyþ¶      %   src/edit/functions/GroundFunction.php	  Fþ•\	  _"Qý¶      $   src/edit/functions/LayerFunction.phpÂ   Fþ•\Â   A$2¶      .   src/edit/functions/mask/AbstractExtentMask.phpd  Fþ•\d  …T0:¶      (   src/edit/functions/mask/AbstractMask.phpU   Fþ•\U   ÛÜ›½¶      *   src/edit/functions/mask/AbstractMask2D.phpY   Fþ•\Y   i¿­Ó¶      %   src/edit/functions/mask/BlockMask.php6  Fþ•\6  -ƒK ¶      -   src/edit/functions/mask/BoundedHeightMask.php“  Fþ•\“  '2¶      -   src/edit/functions/mask/ExistingBlockMask.php“  Fþ•\“  þZÓP¶          src/edit/functions/mask/Mask.phpŒ   Fþ•\Œ   ëè¶œ¶      "   src/edit/functions/mask/Mask2D.phps   Fþ•\s   è²›¶      ,   src/edit/functions/mask/MaskIntersection.php+  Fþ•\+  ëYì¨¶      !   src/edit/functions/mask/Masks.php±  Fþ•\±  Öž•á¶      &   src/edit/functions/mask/RegionMask.phpé  Fþ•\é  U Âÿ¶      2   src/edit/functions/operation/DelegateOperation.php®  Fþ•\®   iì¶      2   src/edit/functions/operation/ForwardExtentCopy.php  Fþ•\  Lq¶      *   src/edit/functions/operation/Operation.phpÂ   Fþ•\Â   ª1yå¶      /   src/edit/functions/operation/OperationQueue.phpô  Fþ•\ô  ö•X¶      +   src/edit/functions/operation/Operations.phpW  Fþ•\W  Îyg:¶      +   src/edit/functions/operation/RunContext.php|   Fþ•\|   ûf¸–¶      .   src/edit/functions/pattern/AbstractPattern.php_   Fþ•\_   ·…T–¶      +   src/edit/functions/pattern/BlockPattern.phpá  Fþ•\á  GX3¬¶      &   src/edit/functions/pattern/Pattern.php¹   Fþ•\¹   äçÃä¶      '   src/edit/functions/pattern/Patterns.php;   Fþ•\;   Jwëö¶      ,   src/edit/functions/pattern/RandomPattern.php   Fþ•\   ·*)¶      %   src/edit/functions/RegionFunction.php‚   Fþ•\‚   Ø›û¶      *   src/edit/functions/RegionMaskingFilter.php±  Fþ•\±  ‡é{¶      (   src/edit/functions/util/RegionOffset.phpB  Fþ•\B  ú‘¨¶      ,   src/edit/functions/visitor/EntityVisitor.phpG  Fþ•\G  *Ùæá¶      +   src/edit/functions/visitor/LayerVisitor.phpâ  Fþ•\â  vü€¶      ,   src/edit/functions/visitor/RegionVisitor.php@  Fþ•\@  â€ÿ¶      '   src/edit/history/change/BlockChange.php  Fþ•\  õyšl¶      "   src/edit/history/change/Change.phpq   Fþ•\q   _^"¶      (   src/edit/history/change/EntityCreate.phpÿ  Fþ•\ÿ  y|#g¶      (   src/edit/history/change/EntityRemove.phpÿ  Fþ•\ÿ  ¤¶Ïº¶      !   src/edit/history/ChangeMemory.phpç  Fþ•\ç  éSÝh¶      )   src/edit/internal/helper/MCDirections.phpÐ  Fþ•\Ð  YRG¶      .   src/edit/internal/registry/AbstractFactory.phpW  Fþ•\W  _Œ´9¶      *   src/edit/internal/registry/InputParser.php¦   Fþ•\¦   ÉÁ»¶         src/edit/jnbt/ByteArrayTag.phpë   Fþ•\ë   rKƒ¶         src/edit/jnbt/ByteTag.phpã   Fþ•\ã   ti`¶         src/edit/jnbt/CompoundTag.phpÃ  Fþ•\Ã  Á¡›æ¶      $   src/edit/jnbt/CompoundTagBuilder.phpn  Fþ•\n  wfYƒ¶         src/edit/jnbt/DoubleTag.phpç   Fþ•\ç   §±8Ø¶         src/edit/jnbt/EndTag.phph   Fþ•\h   à®¯£¶         src/edit/jnbt/FloatTag.phpæ   Fþ•\æ   ©Šà¶         src/edit/jnbt/IntArrayTag.phpê   Fþ•\ê   &³F¶         src/edit/jnbt/IntTag.phpâ   Fþ•\â   ÏÞÛ¶         src/edit/jnbt/LongTag.phpå   Fþ•\å   ÀWö‡¶         src/edit/jnbt/ShortTag.phpæ   Fþ•\æ   V9w¶         src/edit/jnbt/StringTag.phpè   Fþ•\è   m	q¶         src/edit/jnbt/Tag.phpZ   Fþ•\Z   ®ÿ{¶         src/edit/Main.phpj.  Fþ•\j.  jÄ²¶      ,   src/edit/math/convolution/GaussianKernel.php‡  Fþ•\‡  ÃåÉÄ¶      '   src/edit/math/convolution/HeightMap.phpÅ  Fþ•\Å  ‹O;¶      -   src/edit/math/convolution/HeightMapFilter.phpÇ  Fþ•\Ç  QeÌ¶      $   src/edit/math/convolution/Kernel.php  Fþ•\  Wšgd¶      -   src/edit/math/interpolation/Interpolation.phpW  Fþ•\W  ¤d¶      <   src/edit/math/interpolation/KochanekBartelsInterpolation.phpu  Fþ•\u  %·tw¶      $   src/edit/math/interpolation/Node.phpu  Fþ•\u  u2›¶         src/edit/math/MathUtils.php$  Fþ•\$  	?K¶      +   src/edit/math/transform/AffineTransform.php˜   Fþ•\˜   pÛ¶      -   src/edit/math/transform/CombinedTransform.php  Fþ•\  úî¶      $   src/edit/math/transform/Identity.php©  Fþ•\©  &1¶      %   src/edit/math/transform/Transform.phpî   Fþ•\î   Õ6Ý„¶      )   src/edit/regions/AbstractBufferRegion.phpç  Fþ•\ç  ËU0¶      #   src/edit/regions/AbstractRegion.phpn  Fþ•\n  =ÊÅ3¶      !   src/edit/regions/CuboidRegion.phpž  Fþ•\ž  £&x¶      #   src/edit/regions/CylinderRegion.phpù  Fþ•\ù  ÔÖ¶         src/edit/regions/FlatRegion.phpÜ   Fþ•\Ü   1—£Õ¶         src/edit/regions/Region.phpI  Fþ•\I  ÕÅÁ¶      '   src/edit/regions/RegionIntersection.php¢  Fþ•\¢  U4w¶      #   src/edit/regions/RegionSelector.php~  Fþ•\~  Ô¨~¶      2   src/edit/regions/selector/CuboidRegionSelector.phpq  Fþ•\q  1¥ÔD¶      7   src/edit/regions/selector/Polygonal2DRegionSelector.php  Fþ•\  Em¨¶      $   src/edit/session/ClipboardHolder.phpÅ  Fþ•\Å  'îñ¶      !   src/edit/session/PasteBuilder.phpü  Fþ•\ü  yÁ¤Š¶         src/edit/util/Direction.phpM  Fþ•\M  Å²î¥¶         src/edit/util/DirectionFlag.phpï   Fþ•\ï   Äª¿¶         src/edit/util/Location.phpÑ  Fþ•\Ñ  à7.²¶         src/edit/util/TargetBlock.php   Fþ•\   Íoç¶         src/edit/util/UtilIterable.php5   Fþ•\5   l‹Ç&¶         src/edit/Vector.phpU  Fþ•\U  ;Ù4¶         src/edit/Vector2D.phpa  Fþ•\a  úÀ²¶         src/edit/world/NbtValued.phpÎ   Fþ•\Î   ‹žU¶      &   src/edit/world/registry/BlockEntry.php  Fþ•\  fDjÐ¶      )   src/edit/world/registry/BlockRegistry.php  Fþ•\  }o]¶      #   src/edit/world/registry/blocks.jsoncÛ Fþ•\cÛ š±¶      ,   src/edit/world/registry/BundledBlockData.phpá  Fþ•\á  [\„–¶      /   src/edit/world/registry/LegacyBlockRegistry.php¶  Fþ•\¶  W·R ¶      /   src/edit/world/registry/SimpleBlockMaterial.phpØ  Fþ•\Ø   vI	¶      '   src/edit/world/registry/SimpleState.phpâ  Fþ•\â  ¨hX;¶      ,   src/edit/world/registry/SimpleStateValue.phpÂ  Fþ•\Â  ú¤*¶      !   src/edit/world/registry/State.phpÌ   Fþ•\Ì   Æ¾Þ-¶      &   src/edit/world/registry/StateValue.phpå   Fþ•\å   ^S¶         src/edit/WorldVector.phpÀ  Fþ•\À  (ìÑÕ¶      name: WorldEditNIGHTMARE
main: edit\Main
version: 3.5.5
author: nightmare3832
api:
  - 1.0.0
  - 2.0.0
  - 3.0.0
  - 4.0.0# WorldEditNIGHTMMARE

## è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã®ä»•æ§˜

### â é¸æŠžãƒ„ãƒ¼ãƒ« âž

IDã‚’è¨˜å…¥ã—ã¦ãã ã•ã„ã€‚IDä»¥å¤–ã¯çµ¶å¯¾ã«å…¥ã‚Œãªã„ã§ãã ã•ã„  

### â OPä»¥å¤–ã‚‚ä½¿ãˆã‚‹ã‚ˆã†ã«ã™ã‚‹ âž

OPä»¥å¤–ã®ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒã“ã®ãƒ—ãƒ©ã‚°ã‚¤ãƒ³ã‚’ä½¿ãˆã‚‹ã‹ã©ã†ã‹ã‚’æ±ºã‚ã¾ã™ã€‚  
**false**ã«ã™ã‚‹ã¨OPä»¥å¤–ã¯ä½¿ãˆãªããªã‚Šã¾ã™  
**true**ã«ã™ã‚‹ã¨OPä»¥å¤–ã‚‚ä½¿ãˆã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™  
++â€»ãŸã ã—ä½¿ãˆã‚‹ã®ã¯ã‚¯ãƒªã‚¨ã‚¤ãƒ†ã‚£ãƒ–ãƒ¢ãƒ¼ãƒ‰ã®ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ã®ã¿++

## ã‚³ãƒžãƒ³ãƒ‰ã®ä»•æ§˜ 

### ãƒ–ãƒ­ãƒƒã‚¯IDã®å…¥åŠ›

IDã¯å˜ä½“ã§å…¥åŠ›ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™

ä¾‹: //set 1  
    //set stone  

è¤‡æ•°ã®IDã‚’ãƒ©ãƒ³ãƒ€ãƒ ã§å…¥ã‚ŒãŸã„å ´åˆã¯IDã¨IDã®é–“ã«","ã‚’å…¥ã‚Œã¾ã™

ä¾‹: //set 1,2  
    //set stone,dirt  

è¤‡æ•°ã®IDã‚’å…¥ã‚Œã‚‹ã¨ãã«ç¢ºçŽ‡ã‚’ã¤ã‘ãŸã„å ´åˆã¯IDã®å‰ã«%è¡¨ç¤ºã§ç¢ºçŽ‡ã‚’å…¥ã‚Œã¾ã™  

ä¾‹: //set 20%1,80%2  
    //set 20%stone,80%dirt  

### æ–¹è§’ã€æ–¹å‘ã®å…¥åŠ›

æ–¹è§’ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«å…¥åŠ›ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™  

0:W(è¥¿) 1:N(åŒ—) 2:E(æ±) 3:S(å—)
4:D(ä¸‹) 5:U(ä¸Š)

ä¾‹: //move 5 W (è¥¿ã«5ç§»å‹•)  
    //move 3 1 (åŒ—ã«3ç§»å‹•)  
    //move 4 D (ä¸‹ã«4ç§»å‹•)  

ã¾ãŸã€æ–¹å‘ã‚’å…¥åŠ›ã—ãªã„å ´åˆã¯ãƒ—ãƒ¬ãƒ¼ãƒ¤ãƒ¼ãŒå‘ã„ã¦ã„ã‚‹æ–¹å‘ã«ãªã‚Šã¾ã™

### ãƒ•ãƒ©ã‚°ã®å…¥åŠ›

ã‚³ãƒžãƒ³ãƒ‰ã«æœ€å¾Œã«ãƒ•ãƒ©ã‚°ã‚’ä»˜ã‘ã‚‹ã“ã¨ã§ãƒ•ãƒ©ã‚°ã®åŠ¹æžœã‚’å—ã‘ã¾ã™  
ã¾ãŸã€äºŒã¤ä»¥ä¸Šã‚’åŒæ™‚ã«ä½¿ç”¨ã™ã‚‹å ´åˆã¯-ã®å¾Œã«ç¶šã‘ã¦å…¥åŠ›ã—ã¾ã™  

ä¾‹: //paste -a  
    //paste -ao  


## ã‚³ãƒžãƒ³ãƒ‰

### //pos1
ç¯„å›²æŒ‡å®šã‚’ã™ã‚‹ã¨ãã«ä½¿ç”¨ã—ã¾ã™  
ç¯„å›²ã®å§‹ç‚¹ã‚’é¸æŠžã§ãã¾ã™  

### //pos2
ç¯„å›²æŒ‡å®šã‚’ã™ã‚‹ã¨ãã«ä½¿ç”¨ã—ã¾ã™  
ç¯„å›²ã®çµ‚ç‚¹ã‚’é¸æŠžã§ãã¾ã™  

### //set [ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³]
é¸æŠžç¯„å›²å†…ã‚’æŒ‡å®šã—ãŸãƒ–ãƒ­ãƒƒã‚¯ã§åŸ‹ã‚ã¾ã™  

ä¾‹: //set 1  

### //replace [ãƒ–ãƒ­ãƒƒã‚¯1] <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³2>
é¸æŠžç¯„å›²å†…ã®ãƒ–ãƒ­ãƒƒã‚¯1ã‚’ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³2ã«ç½®ãæ›ãˆã¾ã™  

ä¾‹: //replace 1 2  
    //replace 1 2,3  

### //copy [-e]
é¸æŠžç¯„å›²å†…ã‚’ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã«ã‚³ãƒ”ãƒ¼ã—ã¾ã™  
ãƒ•ãƒ©ã‚°: -e ã‚’ã¤ã‘ã‚‹ã¨ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ãƒ¼ã‚‚ã‚³ãƒ”ãƒ¼ã—ã¾ã™ãƒ‰ã«ã‚³ãƒ”ãƒ¼ã—ã¾ã™  

### //cut [-e]
é¸æŠžç¯„å›²å†…ã‚’ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã«ã‚«ãƒƒãƒˆã—ã¾ã™  
ãƒ•ãƒ©ã‚°: -e ã‚’ã¤ã‘ã‚‹ã¨ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ãƒ¼ã‚‚ã‚³ãƒ”ãƒ¼ã—ã¾ã™ãƒ‰ã«ã‚³ãƒ”ãƒ¼ã—ã¾ã™  

### //paste [-aos]
ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’è²¼ã‚Šä»˜ã‘ã—ã¾ã™  
ãƒ•ãƒ©ã‚°: -a ã‚’ã¤ã‘ã‚‹ã¨ç©ºæ°—ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç„¡è¦–ã—ã¾ã™  
        -o ã‚’ã¤ã‘ã‚‹ã¨ã‚³ãƒ”ãƒ¼ã—ä½ç½®ã‚’åŽŸç‚¹ã¨ã—ã¾ã™  
        -s ã‚’ã¤ã‘ã‚‹ã¨è²¼ã‚Šä»˜ã‘ã—ãŸã‚‚ã®ã‚’ç¯„å›²ã¨ã—ã¦é¸æŠžã—ã¾ã™  

### //rotate <Yè»¸> [<Xè»¸>] [<Zè»¸>]
ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’å›žè»¢ã•ã›ã¾ã™  

### //flip [<æ–¹å‘>]
ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’æŒ‡å®šæ–¹å‘ã«ã²ã£ãã‚Šè¿”ã—ã¾ã™  

### //sphere <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>,<åŠå¾„>] [é ­ä¸Š?]
è‡ªåˆ†ã®ä½ç½®ã«çƒä½“ã‚’ç”Ÿæˆã—ã¾ã™  
åŠå¾„ã‚’ä¸‰ã¤æŒ‡å®šã™ã‚‹ã¨æ¥•å††ä½“ã‚’ç”Ÿæˆã§ãã¾ã™  
[é ­ä¸Š?]ã®ã¨ã“ã‚ã«trueã‚’å…¥åŠ›ã™ã‚‹ã¨ç”Ÿæˆä½ç½®ã‚’é ­ä¸Šã«è¨­å®šã§ãã¾ã™  
ãƒ•ãƒ©ã‚°: -h ã‚’ã¤ã‘ã‚‹ã¨ç©ºæ´žã«ã§ãã¾ã™  

### //cylinder <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>], <é«˜ã•>
è‡ªåˆ†ã®ä½ç½®ã«å††æŸ±ã‚’ç”Ÿæˆã§ãã¾ã™  
åŠå¾„ã‚’äºŒã¤æŒ‡å®šã™ã‚‹ã¨æ¥•å††æŸ±ã‚’ç”Ÿæˆã§ãã¾ã™  
ãƒ•ãƒ©ã‚°: -h ã‚’ã¤ã‘ã‚‹ã¨ç©ºæ´žã«ã§ãã¾ã™  

### //pyramid <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <ã‚µã‚¤ã‚º>
è‡ªåˆ†ã®ä½ç½®ã«ãƒ”ãƒ©ãƒŸãƒƒãƒ‰ã‚’ç”Ÿæˆã§ãã¾ã™  
ãƒ•ãƒ©ã‚°: -h ã‚’ã¤ã‘ã‚‹ã¨ç©ºæ´žã«ã§ãã¾ã™  

### //hsphere <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>,<åŠå¾„>] [é ­ä¸Š?]
è‡ªåˆ†ã®ä½ç½®ã«ç©ºæ´žã®çƒä½“ã‚’ç”Ÿæˆã—ã¾ã™  
åŠå¾„ã‚’ä¸‰ã¤æŒ‡å®šã™ã‚‹ã¨æ¥•å††ä½“ã‚’ç”Ÿæˆã§ãã¾ã™  
[é ­ä¸Š?]ã®ã¨ã“ã‚ã«trueã‚’å…¥åŠ›ã™ã‚‹ã¨ç”Ÿæˆä½ç½®ã‚’é ­ä¸Šã«è¨­å®šã§ãã¾ã™  

### //hcylinder <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>], <é«˜ã•>
è‡ªåˆ†ã®ä½ç½®ã«ç©ºæ´žã®å††æŸ±ã‚’ç”Ÿæˆã§ãã¾ã™  
åŠå¾„ã‚’äºŒã¤æŒ‡å®šã™ã‚‹ã¨æ¥•å††æŸ±ã‚’ç”Ÿæˆã§ãã¾ã™  

### //hpyramid <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <ã‚µã‚¤ã‚º>
è‡ªåˆ†ã®ä½ç½®ã«ç©ºæ´žã®ãƒ”ãƒ©ãƒŸãƒƒãƒ‰ã‚’ç”Ÿæˆã§ãã¾ã™  

### //stack [å›žæ•°] [æ–¹å‘]
é¸æŠžç¯„å›²ã‚’æŒ‡å®šã—ãŸæ–¹å‘ã«ç©ã¿é‡ã­ã¾ã™  
ãƒ•ãƒ©ã‚°: -a ã‚’ã¤ã‘ã‚‹ã¨ç©ºæ°—ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç„¡è¦–ã—ã¾ã™  
        -s ã‚’ã¤ã‘ã‚‹ã¨ç©ã¿é‡ã­ãŸæœ€å¾Œã®ã‚‚ã®ã‚’ç¯„å›²ã¨ã—ã¦é¸æŠžã—ã¾ã™  

### //move [è·é›¢] [æ–¹å‘] [é™¤å¤–]
é¸æŠžç¯„å›²ã‚’æŒ‡å®šã—ãŸè·é›¢ã ã‘æŒ‡å®šã—ãŸæ–¹å‘ã«ç§»å‹•ã•ã›ã¾ã™  
é™¤å¤–ã‚’æŒ‡å®šã™ã‚‹ã¨ãã®ãƒ–ãƒ­ãƒƒã‚¯ã¯ç§»å‹•ã—ã¾ã›ã‚“  
ãƒ•ãƒ©ã‚°: -s ã‚’ã¤ã‘ã‚‹ã¨ç§»å‹•ã—ãŸå…ˆã‚’ç¯„å›²ã¨ã—ã¦é¸æŠžã—ã¾ã™  

### //overlay <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³>
é¸æŠžç¯„å›²å†…ã®ãƒ–ãƒ­ãƒƒã‚¯ã®ä¸Šã«ãƒ–ãƒ­ãƒƒã‚¯ã‚’è¨­ç½®ã—ã¾ã™  

### //undo [å›žæ•°]
å›žæ•°åˆ†ã ã‘æ“ä½œã‚’å…ƒã«æˆ»ã—ã¾ã™  

### //redo [å›žæ•°]
å›žæ•°åˆ†ã ã‘æ“ä½œã‚’ã‚„ã‚Šç›´ã—ã¾ã™  

### //brush <sphere|cylinder|clipboard|smooth|gravity>

//brush sphere  
      //brush sphere <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> [åŠå¾„]  
      çƒä½“ã‚’ç”Ÿæˆã—ã¾ã™  
      ãƒ•ãƒ©ã‚°: -h ã‚’ã¤ã‘ã‚‹ã¨ç©ºæ´žã«ã—ã¾ã™  

//brush cylinder  
      //brush cylinder <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> [åŠå¾„] [é«˜ã•]  
      å††æŸ±ã‚’ç”Ÿæˆã—ã¾ã™  
      ãƒ•ãƒ©ã‚°: -h ã‚’ã¤ã‘ã‚‹ã¨ç©ºæ´žã«ã—ã¾ã™  

//brush clipboard  
      //brush clipboard  
      ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’è²¼ã‚Šä»˜ã‘ã¾ã™  

//brush smooth  
      //brush smooth [ã‚µã‚¤ã‚º] [å›žæ•°]  
      åœ°å½¢ã‚’å›žæ•°åˆ†æ»‘ã‚‰ã‹ã«ã—ã¾ã™  

//brush gravity  
      //brush gravity [åŠå¾„]  
      é‡åŠ›ã‚’ç™ºç”Ÿã•ã›ã¾ã™  
      ãƒ•ãƒ©ã‚°: -h ã‚’ã¤ã‘ã‚‹ã¨é«˜ã•ã‚’ç„¡åˆ¶é™ã«ã—ã¾ã™  

### //mask [ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼]
ãƒ–ãƒ©ã‚·ã«å½±éŸ¿ã•ã‚Œã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã‚’åˆ¶é™ã—ã¾ã™

ä¾‹: //mask 1  
    //mask stone  
# WorldEditNIGHTMMARE

## è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã®ä»•æ§˜

### â é¸æŠžãƒ„ãƒ¼ãƒ« âž

IDã‚’è¨˜å…¥ã—ã¦ãã ã•ã„ã€‚IDä»¥å¤–ã¯çµ¶å¯¾ã«å…¥ã‚Œãªã„ã§ãã ã•ã„

### â OPä»¥å¤–ã‚‚ä½¿ãˆã‚‹ã‚ˆã†ã«ã™ã‚‹ âž

OPä»¥å¤–ã®ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒã“ã®ãƒ—ãƒ©ã‚°ã‚¤ãƒ³ã‚’ä½¿ãˆã‚‹ã‹ã©ã†ã‹ã‚’æ±ºã‚ã¾ã™ã€‚  
**false**ã«ã™ã‚‹ã¨OPä»¥å¤–ã¯ä½¿ãˆãªããªã‚Šã¾ã™  
**true**ã«ã™ã‚‹ã¨OPä»¥å¤–ã‚‚ä½¿ãˆã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™  
++â€»ãŸã ã—ä½¿ãˆã‚‹ã®ã¯ã‚¯ãƒªã‚¨ã‚¤ãƒ†ã‚£ãƒ–ãƒ¢ãƒ¼ãƒ‰ã®ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ã®ã¿++

## â‰«â‰«ã‚³ãƒžãƒ³ãƒ‰ã®ä»•æ§˜  â‰ªâ‰ª 

### ãƒ–ãƒ­ãƒƒã‚¯IDã®å…¥åŠ›

IDã¯å˜ä½“ã§å…¥åŠ›ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™

ä¾‹: //set 1  
    //set stone  

è¤‡æ•°ã®IDã‚’ãƒ©ãƒ³ãƒ€ãƒ ã§å…¥ã‚ŒãŸã„å ´åˆã¯IDã¨IDã®é–“ã«","ã‚’å…¥ã‚Œã¾ã™

ä¾‹: //set 1,2  
    //set stone,dirt  

è¤‡æ•°ã®IDã‚’å…¥ã‚Œã‚‹ã¨ãã«ç¢ºçŽ‡ã‚’ã¤ã‘ãŸã„å ´åˆã¯IDã®å‰ã«%è¡¨ç¤ºã§ç¢ºçŽ‡ã‚’å…¥ã‚Œã¾ã™  

ä¾‹: //set 20%1,80%2  
    //set 20%stone,80%dirt  

### æ–¹è§’ã€æ–¹å‘ã®å…¥åŠ›

æ–¹è§’ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«å…¥åŠ›ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™  

0:W(è¥¿) 1:N(åŒ—) 2:E(æ±) 3:S(å—)
4:D(ä¸‹) 5:U(ä¸Š)

ä¾‹: //move 5 W (è¥¿ã«5ç§»å‹•)  
    //move 3 1 (åŒ—ã«3ç§»å‹•)  
    //move 4 D (ä¸‹ã«4ç§»å‹•)  

ã¾ãŸã€æ–¹å‘ã‚’å…¥åŠ›ã—ãªã„å ´åˆã¯ãƒ—ãƒ¬ãƒ¼ãƒ¤ãƒ¼ãŒå‘ã„ã¦ã„ã‚‹æ–¹å‘ã«ãªã‚Šã¾ã™

### ãƒ•ãƒ©ã‚°ã®å…¥åŠ›

ã‚³ãƒžãƒ³ãƒ‰ã«æœ€å¾Œã«ãƒ•ãƒ©ã‚°ã‚’ä»˜ã‘ã‚‹ã“ã¨ã§ãƒ•ãƒ©ã‚°ã®åŠ¹æžœã‚’å—ã‘ã¾ã™  
ã¾ãŸã€äºŒã¤ä»¥ä¸Šã‚’åŒæ™‚ã«ä½¿ç”¨ã™ã‚‹å ´åˆã¯-ã®å¾Œã«ç¶šã‘ã¦å…¥åŠ›ã—ã¾ã™  

ä¾‹: //paste -a  
    //paste -ao  


## ã‚³ãƒžãƒ³ãƒ‰

### //pos1
ç¯„å›²æŒ‡å®šã‚’ã™ã‚‹ã¨ãã«ä½¿ç”¨ã—ã¾ã™  
ç¯„å›²ã®å§‹ç‚¹ã‚’é¸æŠžã§ãã¾ã™  

### //pos2
ç¯„å›²æŒ‡å®šã‚’ã™ã‚‹ã¨ãã«ä½¿ç”¨ã—ã¾ã™  
ç¯„å›²ã®çµ‚ç‚¹ã‚’é¸æŠžã§ãã¾ã™  

### //set [ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³]
é¸æŠžç¯„å›²å†…ã‚’æŒ‡å®šã—ãŸãƒ–ãƒ­ãƒƒã‚¯ã§åŸ‹ã‚ã¾ã™  

ä¾‹: //set 1  

### //replace [ãƒ–ãƒ­ãƒƒã‚¯1] <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³2>
é¸æŠžç¯„å›²å†…ã®ãƒ–ãƒ­ãƒƒã‚¯1ã‚’ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³2ã«ç½®ãæ›ãˆã¾ã™  

ä¾‹: //replace 1 2  
    //replace 1 2,3  

### //copy [-e]
é¸æŠžç¯„å›²å†…ã‚’ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã«ã‚³ãƒ”ãƒ¼ã—ã¾ã™  
ãƒ•ãƒ©ã‚°: -e ã‚’ã¤ã‘ã‚‹ã¨ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ãƒ¼ã‚‚ã‚³ãƒ”ãƒ¼ã—ã¾ã™ãƒ‰ã«ã‚³ãƒ”ãƒ¼ã—ã¾ã™  

### //cut [-e]
é¸æŠžç¯„å›²å†…ã‚’ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã«ã‚«ãƒƒãƒˆã—ã¾ã™  
ãƒ•ãƒ©ã‚°: -e ã‚’ã¤ã‘ã‚‹ã¨ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ãƒ¼ã‚‚ã‚³ãƒ”ãƒ¼ã—ã¾ã™ãƒ‰ã«ã‚³ãƒ”ãƒ¼ã—ã¾ã™  

### //paste [-aos]
ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’è²¼ã‚Šä»˜ã‘ã—ã¾ã™  
ãƒ•ãƒ©ã‚°: -a ã‚’ã¤ã‘ã‚‹ã¨ç©ºæ°—ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç„¡è¦–ã—ã¾ã™  
        -o ã‚’ã¤ã‘ã‚‹ã¨ã‚³ãƒ”ãƒ¼ã—ä½ç½®ã‚’åŽŸç‚¹ã¨ã—ã¾ã™  
        -s ã‚’ã¤ã‘ã‚‹ã¨è²¼ã‚Šä»˜ã‘ã—ãŸã‚‚ã®ã‚’ç¯„å›²ã¨ã—ã¦é¸æŠžã—ã¾ã™  

### //rotate <Yè»¸> [<Xè»¸>] [<Zè»¸>]
ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’å›žè»¢ã•ã›ã¾ã™  

### //flip [<æ–¹å‘>]
ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’æŒ‡å®šæ–¹å‘ã«ã²ã£ãã‚Šè¿”ã—ã¾ã™  

### //sphere <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>,<åŠå¾„>] [é ­ä¸Š?]
è‡ªåˆ†ã®ä½ç½®ã«çƒä½“ã‚’ç”Ÿæˆã—ã¾ã™  
åŠå¾„ã‚’ä¸‰ã¤æŒ‡å®šã™ã‚‹ã¨æ¥•å††ä½“ã‚’ç”Ÿæˆã§ãã¾ã™  
[é ­ä¸Š?]ã®ã¨ã“ã‚ã«trueã‚’å…¥åŠ›ã™ã‚‹ã¨ç”Ÿæˆä½ç½®ã‚’é ­ä¸Šã«è¨­å®šã§ãã¾ã™  
ãƒ•ãƒ©ã‚°: -h ã‚’ã¤ã‘ã‚‹ã¨ç©ºæ´žã«ã§ãã¾ã™  

### //cylinder <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>], <é«˜ã•>
è‡ªåˆ†ã®ä½ç½®ã«å††æŸ±ã‚’ç”Ÿæˆã§ãã¾ã™  
åŠå¾„ã‚’äºŒã¤æŒ‡å®šã™ã‚‹ã¨æ¥•å††æŸ±ã‚’ç”Ÿæˆã§ãã¾ã™  
ãƒ•ãƒ©ã‚°: -h ã‚’ã¤ã‘ã‚‹ã¨ç©ºæ´žã«ã§ãã¾ã™  

### //pyramid <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <ã‚µã‚¤ã‚º>
è‡ªåˆ†ã®ä½ç½®ã«ãƒ”ãƒ©ãƒŸãƒƒãƒ‰ã‚’ç”Ÿæˆã§ãã¾ã™  
ãƒ•ãƒ©ã‚°: -h ã‚’ã¤ã‘ã‚‹ã¨ç©ºæ´žã«ã§ãã¾ã™  

### //hsphere <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>,<åŠå¾„>] [é ­ä¸Š?]
è‡ªåˆ†ã®ä½ç½®ã«ç©ºæ´žã®çƒä½“ã‚’ç”Ÿæˆã—ã¾ã™  
åŠå¾„ã‚’ä¸‰ã¤æŒ‡å®šã™ã‚‹ã¨æ¥•å††ä½“ã‚’ç”Ÿæˆã§ãã¾ã™  
[é ­ä¸Š?]ã®ã¨ã“ã‚ã«trueã‚’å…¥åŠ›ã™ã‚‹ã¨ç”Ÿæˆä½ç½®ã‚’é ­ä¸Šã«è¨­å®šã§ãã¾ã™  

### //hcylinder <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>], <é«˜ã•>
è‡ªåˆ†ã®ä½ç½®ã«ç©ºæ´žã®å††æŸ±ã‚’ç”Ÿæˆã§ãã¾ã™  
åŠå¾„ã‚’äºŒã¤æŒ‡å®šã™ã‚‹ã¨æ¥•å††æŸ±ã‚’ç”Ÿæˆã§ãã¾ã™  

### //hpyramid <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <ã‚µã‚¤ã‚º>
è‡ªåˆ†ã®ä½ç½®ã«ç©ºæ´žã®ãƒ”ãƒ©ãƒŸãƒƒãƒ‰ã‚’ç”Ÿæˆã§ãã¾ã™  

### //stack [å›žæ•°] [æ–¹å‘]
é¸æŠžç¯„å›²ã‚’æŒ‡å®šã—ãŸæ–¹å‘ã«ç©ã¿é‡ã­ã¾ã™  
ãƒ•ãƒ©ã‚°: -a ã‚’ã¤ã‘ã‚‹ã¨ç©ºæ°—ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç„¡è¦–ã—ã¾ã™  
        -s ã‚’ã¤ã‘ã‚‹ã¨ç©ã¿é‡ã­ãŸæœ€å¾Œã®ã‚‚ã®ã‚’ç¯„å›²ã¨ã—ã¦é¸æŠžã—ã¾ã™  

### //move [è·é›¢] [æ–¹å‘] [é™¤å¤–]
é¸æŠžç¯„å›²ã‚’æŒ‡å®šã—ãŸè·é›¢ã ã‘æŒ‡å®šã—ãŸæ–¹å‘ã«ç§»å‹•ã•ã›ã¾ã™  
é™¤å¤–ã‚’æŒ‡å®šã™ã‚‹ã¨ãã®ãƒ–ãƒ­ãƒƒã‚¯ã¯ç§»å‹•ã—ã¾ã›ã‚“  
ãƒ•ãƒ©ã‚°: -s ã‚’ã¤ã‘ã‚‹ã¨ç§»å‹•ã—ãŸå…ˆã‚’ç¯„å›²ã¨ã—ã¦é¸æŠžã—ã¾ã™  

### //overlay <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³>
é¸æŠžç¯„å›²å†…ã®ãƒ–ãƒ­ãƒƒã‚¯ã®ä¸Šã«ãƒ–ãƒ­ãƒƒã‚¯ã‚’è¨­ç½®ã—ã¾ã™  

### //undo [å›žæ•°]
å›žæ•°åˆ†ã ã‘æ“ä½œã‚’å…ƒã«æˆ»ã—ã¾ã™  

### //redo [å›žæ•°]
å›žæ•°åˆ†ã ã‘æ“ä½œã‚’ã‚„ã‚Šç›´ã—ã¾ã™  

### //brush <sphere|cylinder|clipboard|smooth|gravity>

//brush sphere  
      //brush sphere <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> [åŠå¾„]  
      çƒä½“ã‚’ç”Ÿæˆã—ã¾ã™  
      ãƒ•ãƒ©ã‚°: -h ã‚’ã¤ã‘ã‚‹ã¨ç©ºæ´žã«ã—ã¾ã™  

//brush cylinder  
      //brush cylinder <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> [åŠå¾„] [é«˜ã•]  
      å††æŸ±ã‚’ç”Ÿæˆã—ã¾ã™  
      ãƒ•ãƒ©ã‚°: -h ã‚’ã¤ã‘ã‚‹ã¨ç©ºæ´žã«ã—ã¾ã™  

//brush clipboard  
      //brush clipboard  
      ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’è²¼ã‚Šä»˜ã‘ã¾ã™  

//brush smooth  
      //brush smooth [ã‚µã‚¤ã‚º] [å›žæ•°]  
      åœ°å½¢ã‚’å›žæ•°åˆ†æ»‘ã‚‰ã‹ã«ã—ã¾ã™  

//brush gravity  
      //brush gravity [åŠå¾„]  
      é‡åŠ›ã‚’ç™ºç”Ÿã•ã›ã¾ã™  
      ãƒ•ãƒ©ã‚°: -h ã‚’ã¤ã‘ã‚‹ã¨é«˜ã•ã‚’ç„¡åˆ¶é™ã«ã—ã¾ã™  

### //mask [ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼]
ãƒ–ãƒ©ã‚·ã«å½±éŸ¿ã•ã‚Œã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã‚’åˆ¶é™ã—ã¾ã™

ä¾‹: //mask 1  
    //mask stone  
<?php

namespace edit\blocks;

use pocketmine\block\Block;

use edit\jnbt\CompoundTag;
use edit\jnbt\StringTag;
use edit\CuboidClipboard;

class BaseBlock implements TileEntityBlock{

	const MAX_ID = 4095;

	const MAX_DATA = 15;

	private $id;
	private $data;

	private $nbtData = null;

	public function __construct(int $id, ?int $data = 0, ?CompoundTag $nbtData = null){
		$this->setId($id);
		$this->setData($data);
		$this->setNbtData($nbtData);
	}

	public function getId() : int{
		return $this->id;
	}

	public function internalSetId(int $id){
		if($id > self::MAX_ID){
			return;
		}

		if($id < 0){
			return;
		}

		$this->id = $id;
	}

	public function setId(int $id){
		$this->internalSetId($id);
	}

	public function getData() : int{
		return $this->data;
	}

	public function internalSetData(int $data){
		if($data > self::MAX_DATA){
			return;
		}

		if($data < -1){
			return;
		}

		$this->data = $data;
	}

	public function setData(int $data){
		$this->internalSetData($data);
	}

	public function setIdAndData(int $id, int $data){
		$this->setId($id);
		$this->setData($data);
	}

	public function hasWildcardData() : bool{
		return $this->getData() == -1;
	}

	public function hasNbtData() : bool{
		return $this->getNbtData() != null;
	}

	public function getNbtId() : string{
		$nbtData = $this->getNbtData();
		if($nbtData == null){
			return "";
		}
		$idTag = $nbtData->getValue()->get("id");
		if($idTag != null && $idTag instanceof StringTag){
			return $idTag->getValue();
		}else{
			return "";
		}
	}

	public function getNbtData() : ?CompoundTag{
		return $this->nbtData;
	}

	public function setNbtData(?CompoundTag $nbtData){
		$this->nbtData = $nbtData;
	}

	public function getType() : int{
		return $this->getId();
	}

	public function setType(int $type){
		$this->setId($type);
	}

	public function isAir() : bool{
		return $this->getType() == Block::AIR;
	}

	public function rotate90() : int{
		$newData = BlockData::rotate90($this->getType(), $this->getData());
		$this->setData($newData);
		return $newData;
	}

	public function rotate90Reverse() : int{
		$newData = BlockData::rotate90Reverse($this->getType(), $this->getData());
		$this->setData($newData);
		return $newData;
	}

	public function cycleData(int $increment) : int{
		$newData = BlockData::cycle($this->getType(), $this->getData(), $increment);
		$this->setData($newData);
		return $newData;
	}

	public function flip(int $direction = null) : BaseBlock{
		if($direction == null) $this->setData(BlockData::flip($this->getType(), $this->getData(), null));
		else $this->setData(BlockData::flip($this->getType(), $this->getData(), $direction));
		return $this;
	}

	public function equals($o) : bool{
		if(!($o instanceof BaseBlock)){
			return false;
		}

		return $this->getType() == $o->getType() && $this->getData() == $o->getData();
	}

	public function equalsFuzzy(BaseBlock $o){
		return ($this->getType() == $o->getType()) && ($this->getData() == $o->getData() || $this->getData() == -1 || $o->getData() == -1);
	}

	public function inIterable(array $iter) : bool{
		foreach($iter as $block){
			if($block->equalsFuzzy($this)){
				return true;
			}
		}
		return false;
	}

	public static function containsFuzzy(array $collection, BaseBlock $o) : bool{
		return Blocks::containsFuzzy($collection, $o);
	}
}<?php

namespace edit\blocks;

use pocketmine\block\Block;

class BlockData{

	public function __construct(){
	}

    public static function rotate90(int $type, int $data) : int{
        switch($type){
        case Block::TORCH:
        case Block::UNLIT_REDSTONE_TORCH:
        case Block::LIT_REDSTONE_TORCH:
            switch($data){
            case 1: return 3;
            case 2: return 4;
            case 3: return 2;
            case 4: return 1;
            }
            break;

        case Block::RAIL:
            switch($data){
            case 6: return 7;
            case 7: return 8;
            case 8: return 9;
            case 9: return 6;
            }
            /* FALL-THROUGH */

        case Block::POWERED_RAIL:
        case Block::DETECTOR_RAIL:
        case Block::ACTIVATOR_RAIL:
            switch($data & 0x7){
            case 0: return 1 | ($data & ~0x7);
            case 1: return 0 | ($data & ~0x7);
            case 2: return 5 | ($data & ~0x7);
            case 3: return 4 | ($data & ~0x7);
            case 4: return 2 | ($data & ~0x7);
            case 5: return 3 | ($data & ~0x7);
            }
            break;

        case Block::OAK_STAIRS:
        case Block::COBBLESTONE_STAIRS:
        case Block::BRICK_STAIRS:
        case Block::STONE_BRICK_STAIRS:
        case Block::NETHER_BRICK_STAIRS:
        case Block::SANDSTONE_STAIRS:
        case Block::SPRUCE_STAIRS:
        case Block::BIRCH_STAIRS:
        case Block::JUNGLE_STAIRS:
        case Block::QUARTZ_STAIRS:
        case Block::ACACIA_STAIRS:
        case Block::DARK_OAK_STAIRS:
            switch($data){
            case 0: return 2;
            case 1: return 3;
            case 2: return 1;
            case 3: return 0;
            case 4: return 6;
            case 5: return 7;
            case 6: return 5;
            case 7: return 4;
            }
            break;

        case Block::STONE_BUTTON:
        case Block::WOODEN_BUTTON:
            $thrown = $data & 0x8;
            switch($data & ~0x8){
            case 1: return 3 | $thrown;
            case 2: return 4 | $thrown;
            case 3: return 2 | $thrown;
            case 4: return 1 | $thrown;
            // 0 and 5 are vertical
            }
            break;

        case Block::LEVER:
            $thrown = $data & 0x8;
            switch($data & ~0x8){
            case 1: return 3 | $thrown;
            case 2: return 4 | $thrown;
            case 3: return 2 | $thrown;
            case 4: return 1 | $thrown;
            case 5: return 6 | $thrown;
            case 6: return 5 | $thrown;
            case 7: return 0 | $thrown;
            case 0: return 7 | $thrown;
            }
            break;

        case Block::WOODEN_DOOR_BLOCK:
        case Block::IRON_DOOR_BLOCK:
            if(($data & 0x8) != 0){
                // door top halves contain no orientation information
                break;
            }

            /* FALL-THROUGH */

        case Block::COCOA:
        case Block::TRIPWIRE_HOOK:
            $extra = $data & ~0x3;
            $withoutFlags = $data & 0x3;
            switch($withoutFlags){
            case 0: return 1 | $extra;
            case 1: return 2 | $extra;
            case 2: return 3 | $extra;
            case 3: return 0 | $extra;
            }
            break;
        case Block::SIGN_POST:
            return ($data + 4) % 16;

        case Block::LADDER:
        case Block::WALL_SIGN:
        case Block::CHEST:
        case Block::FURNACE:
        case Block::BURNING_FURNACE:
        case Block::ENDER_CHEST:
        case Block::TRAPPED_CHEST:
        case Block::HOPPER_BLOCK:
            $extra = $data & 0x8;
            $withoutFlags = $data & ~0x8;
            switch($withoutFlags){
            case 2: return 5 | $extra;
            case 3: return 4 | $extra;
            case 4: return 2 | $extra;
            case 5: return 3 | $extra;
            }
            break;
        case Block::DISPENSER:
        case Block::DROPPER:
            $dispPower = $data & 0x8;
            switch($data & ~0x8){
            case 2: return 5 | $dispPower;
            case 3: return 4 | $dispPower;
            case 4: return 2 | $dispPower;
            case 5: return 3 | $dispPower;
            }
            break;

        case Block::PUMPKIN:
        case Block::JACK_O_LANTERN:
            switch($data){
            case 0: return 1;
            case 1: return 2;
            case 2: return 3;
            case 3: return 0;
            }
            break;

        case Block::HAY_BLOCK:
        case Block::LOG:
        case Block::LOG2:
            if($data >= 4 && $data <= 11) $data ^= 0xc;
            break;

        case Block::UNPOWERED_COMPARATOR:
        case Block::POWERED_COMPARATOR:
        case Block::UNPOWERED_REPEATER:
        case Block::POWERED_REPEATER:
            $dir = $data & 0x03;
            $delay = $data - $dir;
            switch($dir){
            case 0: return 1 | $delay;
            case 1: return 2 | $delay;
            case 2: return 3 | $delay;
            case 3: return 0 | $delay;
            }
            break;

        case Block::TRAPDOOR:
        case Block::IRON_TRAPDOOR:
            $withoutOrientation = $data & ~0x3;
            $orientation = $data & 0x3;
            switch($orientation){
            case 0: return 3 | $withoutOrientation;
            case 1: return 2 | $withoutOrientation;
            case 2: return 0 | $withoutOrientation;
            case 3: return 1 | $withoutOrientation;
            }
            break;

        case Block::PISTON:
        case Block::STICKY_PISTON:
        case Block::PISTONARMCOLLISION:
            $rest = $data & ~0x7;
            switch($data & 0x7){
            case 2: return 5 | $rest;
            case 3: return 4 | $rest;
            case 4: return 2 | $rest;
            case 5: return 3 | $rest;
            }
            break;

        case Block::BROWN_MUSHROOM_BLOCK:
        case Block::RED_MUSHROOM_BLOCK:
            if($data >= 10) return $data;
            return ($data * 3) % 10;

        case Block::VINE:
            return (($data << 1) | ($data >> 3)) & 0xf;

        case Block::FENCE_GATE:
            return (($data + 1) & 0x3) | ($data & ~0x3);

        case Block::ANVIL:
            $damage = $data & ~0x3;
            switch($data & 0x3){
            case 0: return 3 | $damage;
            case 2: return 1 | $damage;
            case 1: return 0 | $damage;
            case 3: return 2 | $damage;
            }
            break;

        case Block::BED_BLOCK:
            return $data & ~0x3 | ($data + 1) & 0x3;

        case Block::SKULL_BLOCK:
            switch($data){
                case 2: return 5;
                case 3: return 4;
                case 4: return 2;
                case 5: return 3;
            }
        }

        return $data;
    }

    public static function rotate90Reverse(int $type, int $data) : int{
        // case ([0-9]+): return ([0-9]+) -> case \2: return \1

        switch($type){
        case Block::TORCH:
        case Block::UNLIT_REDSTONE_TORCH:
        case Block::LIT_REDSTONE_TORCH:
            switch($data){
            case 3: return 1;
            case 4: return 2;
            case 2: return 3;
            case 1: return 4;
            }
            break;

        case Block::RAIL:
            switch($data){
            case 7: return 6;
            case 8: return 7;
            case 9: return 8;
            case 6: return 9;
            }
            /* FALL-THROUGH */

        case Block::POWERED_RAIL:
        case Block::DETECTOR_RAIL:
        case Block::ACTIVATOR_RAIL:
            $power = $data & ~0x7;
            switch($data & 0x7){
            case 1: return 0 | $power;
            case 0: return 1 | $power;
            case 5: return 2 | $power;
            case 4: return 3 | $power;
            case 2: return 4 | $power;
            case 3: return 5 | $power;
            }
            break;

        case Block::OAK_STAIRS:
        case Block::COBBLESTONE_STAIRS:
        case Block::BRICK_STAIRS:
        case Block::STONE_BRICK_STAIRS:
        case Block::NETHER_BRICK_STAIRS:
        case Block::SANDSTONE_STAIRS:
        case Block::SPRUCE_STAIRS:
        case Block::BIRCH_STAIRS:
        case Block::JUNGLE_STAIRS:
        case Block::QUARTZ_STAIRS:
        case Block::ACACIA_STAIRS:
        case Block::DARK_OAK_STAIRS:
            switch($data){
            case 2: return 0;
            case 3: return 1;
            case 1: return 2;
            case 0: return 3;
            case 6: return 4;
            case 7: return 5;
            case 5: return 6;
            case 4: return 7;
            }
            break;

        case Block::STONE_BUTTON:
        case Block::WOODEN_BUTTON:
            $thrown = $data & 0x8;
            switch($data & ~0x8){
            case 3: return 1 | $thrown;
            case 4: return 2 | $thrown;
            case 2: return 3 | $thrown;
            case 1: return 4 | $thrown;
            // 0 and 5 are vertical
            }
            break;

        case Block::LEVER:
            $thrown = $data & 0x8;
            switch($data & ~0x8){
            case 3: return 1 | $thrown;
            case 4: return 2 | $thrown;
            case 2: return 3 | $thrown;
            case 1: return 4 | $thrown;
            case 6: return 5 | $thrown;
            case 5: return 6 | $thrown;
            case 0: return 7 | $thrown;
            case 7: return 0 | $thrown;
            }
            break;

        case Block::WOODEN_DOOR_BLOCK:
        case Block::IRON_DOOR_BLOCK:
            if(($data & 0x8) != 0){
                // door top halves contain no orientation information
                break;
            }

            /* FALL-THROUGH */

        case Block::COCOA:
        case Block::TRIPWIRE_HOOK:
            int extra = data & ~0x3;
            int withoutFlags = data & 0x3;
            switch (withoutFlags) {
            case 1: return 0 | extra;
            case 2: return 1 | extra;
            case 3: return 2 | extra;
            case 0: return 3 | extra;
            }
            break;
        case Block::SIGN_POST:
            return ($data + 12) % 16;

        case Block::LADDER:
        case Block::WALL_SIGN:
        case Block::CHEST:
        case Block::FURNACE:
        case Block::BURNING_FURNACE:
        case Block::ENDER_CHEST:
        case Block::TRAPPED_CHEST:
        case Block::HOPPER_BLOCK:
            $extra = $data & 0x8;
            $withoutFlags = $data & ~0x8;
            switch($withoutFlags){
                case 5: return 2 | $extra;
                case 4: return 3 | $extra;
                case 2: return 4 | $extra;
                case 3: return 5 | $extra;
            }
            break;
        case Block::DISPENSER:
        case Block::DROPPER:
            $dispPower = $data & 0x8;
            switch($data & ~0x8){
            case 5: return 2 | $dispPower;
            case 4: return 3 | $dispPower;
            case 2: return 4 | $dispPower;
            case 3: return 5 | $dispPower;
            }
            break;
        case Block::PUMPKIN:
        case Block::JACK_O_LANTERN:
            switch($data){
            case 1: return 0;
            case 2: return 1;
            case 3: return 2;
            case 0: return 3;
            }
            break;

        case Block::HAY_BLOCK:
        case Block::LOG:
        case Block::LOG2:
            if($data >= 4 && $data <= 11) $data ^= 0xc;
            break;

        case Block::UNPOWERED_COMPARATOR:
        case Block::POWERED_COMPARATOR:
        case Block::UNPOWERED_REPEATER:
        case Block::POWERED_REPEATER:
            $dir = $data & 0x03;
            $delay = $data - $dir;
            switch($dir){
            case 1: return 0 | $delay;
            case 2: return 1 | $delay;
            case 3: return 2 | $delay;
            case 0: return 3 | $delay;
            }
            break;

        case Block::TRAPDOOR:
        case Block::IRON_TRAPDOOR:
            $withoutOrientation = $data & ~0x3;
            $orientation = $data & 0x3;
            switch($orientation){
            case 3: return 0 | $withoutOrientation;
            case 2: return 1 | $withoutOrientation;
            case 0: return 2 | $withoutOrientation;
            case 1: return 3 | $withoutOrientation;
            }

        case Block::PISTON:
        case Block::STICKY_PISTON:
        case Block::PISTONARMCOLLISION:
            $rest = $data & ~0x7;
            switch($data & 0x7){
            case 5: return 2 | $rest;
            case 4: return 3 | $rest;
            case 2: return 4 | $rest;
            case 3: return 5 | $rest;
            }
            break;

        case Block::BROWN_MUSHROOM_BLOCK:
        case Block::RED_MUSHROOM_BLOCK:
            if($data >= 10) return $data;
            return ($data * 7) % 10;

        case Block::VINE:
            return (($data >> 1) | ($data << 3)) & 0xf;

        case Block::FENCE_GATE:
            return (($data + 3) & 0x3) | ($data & ~0x3);

        case Block::ANVIL:
            $damage = $data & ~0x3;
            switch($data & 0x3){
            case 0: return 1 | $damage;
            case 2: return 3 | $damage;
            case 1: return 2 | $damage;
            case 3: return 0 | $damage;
            }
            break;

        case Block::BED_BLOCK:
            return $data & ~0x3 | ($data - 1) & 0x3;

        case Block::SKULL_BLOCK:
            switch($data){
                case 2: return 4;
                case 3: return 5;
                case 4: return 3;
                case 5: return 2;
            }
        }

        return $data;
    }

    public static int flip(int type, int data) {
        return rotate90(type, rotate90(type, data));
    }

    public static function flip(int $type, int $data, ?int direction = null) : int{
        if($direction == null) return $this->rotate90($type, $this->rotate90($type, $data));
        $flipX = 0;
        $flipY = 0;
        $flipZ = 0;

        switch($direction){
        case CuboidClipboard::NORTH_SOUTH:
            $flipZ = 1;
            break;

        case CuboidClipboard::WEST_EAST:
            $flipX = 1;
            break;

        case CuboidClipboard::UP_DOWN:
            $flipY = 1;
            break;
        }

        switch($type){
        case Block::TORCH:
        case Block::UNLIT_REDSTONE_TORCH:
        case Block::LIT_REDSTONE_TORCH:
            if($data < 1 || $data > 4) break;
            switch($data){
            case 1: return $data + $flipX;
            case 2: return $data - $flipX;
            case 3: return $data + $flipZ;
            case 4: return $data - $flipZ;
            }
            break;

        case Block::STONE_BUTTON:
        case Block::WOODEN_BUTTON:
            switch($data & ~0x8){
            case 1: return $data + $flipX;
            case 2: return $data - $flipX;
            case 3: return $data + $flipZ;
            case 4: return $data - $flipZ;
            case 0:
            case 5:
                return $data ^ ($flipY * 5);
            }
            break;

        case Block::LEVER:
            switch(data & ~0x8){
            case 1: return $data + $flipX;
            case 2: return $data - $flipX;
            case 3: return $data + $flipZ;
            case 4: return $data - $flipZ;
            case 5:
            case 7:
                return $data ^ $flipY << 1;
            case 6:
            case 0:
                return $data ^ $flipY * 6;
            }
            break;

        case Block::RAIL:
            switch($data){
            case 6: return $data + $flipX + $flipZ * 3;
            case 7: return $data - $flipX + $flipZ;
            case 8: return $data + $flipX - $flipZ;
            case 9: return $data - $flipX - $flipZ * 3;
            }
            /* FALL-THROUGH */

        case Block::POWERED_RAIL:
        case Block::DETECTOR_RAIL:
        case Block::ACTIVATOR_RAIL:
            switch($data & 0x7){
            case 0:
            case 1:
                return $data;
            case 2:
            case 3:
                return $data ^ $flipX;
            case 4:
            case 5:
                return $data ^ $flipZ;
            }
            break;

        case Block::STONE_SLAB:
        case Block::WOODEN_STEP:
        case Block::STONE_SLAB2:
            return $data ^ ($flipY << 3);

        case Block::OAK_STAIRS:
        case Block::COBBLESTONE_STAIRS:
        case Block::BRICK_STAIRS:
        case Block::STONE_BRICK_STAIRS:
        case Block::NETHER_BRICK_STAIRS:
        case Block::SANDSTONE_STAIRS:
        case Block::SPRUCE_STAIRS:
        case Block::BIRCH_STAIRS:
        case Block::JUNGLE_STAIRS:
        case Block::QUARTZ_STAIRS:
        case Block::ACACIA_STAIRS:
        case Block::DARK_OAK_STAIRS:
            $data ^= $flipY << 2;
            switch($data){
            case 0:
            case 1:
            case 4:
            case 5:
                return $data ^ $flipX;
            case 2:
            case 3:
            case 6:
            case 7:
                return $data ^ $flipZ;
            }
            break;

        case Block::WOODEN_DOOR_BLOCK:
        case Block::IRON_DOOR_BLOCK:
            if(($data & 0x8) != 0){
                // door top halves contain no orientation information
                break;
            }

            switch($data & 0x3){
            case 0: return $data + $flipX + $flipZ * 3;
            case 1: return $data - $flipX + $flipZ;
            case 2: return $data + $flipX - $flipZ;
            case 3: return $data - $flipX - $flipZ * 3;
            }
            break;

        case Block::SIGN_POST:
            switch($direction){
            case CuboidClipboard::NORTH_SOUTH:
                return (16 - $data) & 0xf;
            case CuboidClipboard::WEST_EAST:
                return (8 - $data) & 0xf;
            default:
            }
            break;

        case Block::LADDER:
        case Block::WALL_SIGN:
        case Block::CHEST:
        case Block::FURNACE:
        case Block::BURNING_FURNACE:
        case Block::ENDER_CHEST:
        case Block::TRAPPED_CHEST:
        case Block::HOPPER_BLOCK:
            $extra = $data & 0x8;
            $withoutFlags = $data & ~0x8;
            switch($withoutFlags){
            case 2:
            case 3:
                return ($data ^ $flipZ) | $extra;
            case 4:
            case 5:
                return ($data ^ $flipX) | $extra;
            }
            break;

        case Block::DISPENSER:
        case Block::DROPPER:
            $dispPower = $data & 0x8;
            switch($data & ~0x8){
            case 2:
            case 3:
                return ($data ^ $flipZ) | $dispPower;
            case 4:
            case 5:
                return ($data ^ $flipX) | $dispPower;
            case 0:
            case 1:
                return ($data ^ $flipY) | $dispPower;
            }
            break;

        case Block::PUMPKIN:
        case Block::JACK_O_LANTERN:
            if($data > 3) break;
            /* FALL-THROUGH */

        case Block::UNPOWERED_COMPARATOR:
        case Block::POWERED_COMPARATOR:
        case Block::UNPOWERED_REPEATER:
        case Block::POWERED_REPEATER:
        case Block::COCOA:
        case Block::TRIPWIRE_HOOK:
            switch($data & 0x3){
            case 0:
            case 2:
                return $data ^ ($flipZ << 1);
            case 1:
            case 3:
                return $data ^ ($flipX << 1);
            }
            break;

        case Block::TRAPDOOR:
        case Block::IRON_TRAPDOOR:
            switch($data & 0x3){
            case 0:
            case 1:
                return $data ^ $flipZ;
            case 2:
            case 3:
                return $data ^ $flipX;
            }
            break;

        case Block::PISTON:
        case Block::STICKY_PISTON:
        case Block::PISTONARMCOLLISION:
            switch($data & ~0x8){
            case 0:
            case 1:
                return $data ^ $flipY;
            case 2:
            case 3:
                return $data ^ $flipZ;
            case 4:
            case 5:
                return $data ^ $flipX;
            }
            break;

        case Block::BROWN_MUSHROOM_BLOCK:
        case Block::RED_MUSHROOM_BLOCK:
            switch($data){
            case 1:
            case 4:
            case 7:
                $data += $flipX * 2;
                break;
            case 3:
            case 6:
            case 9:
                $data -= $flipX * 2;
                break;
            }
            switch($data){
            case 1:
            case 2:
            case 3:
                return $data + $flipZ * 6;
            case 7:
            case 8:
            case 9:
                return $data - $flipZ * 6;
            }
            break;

        case Block::VINE:
            switch($direction){
            case CuboidClipboard::NORTH_SOUTH:
                $bit1 = 0x2;
                $bit2 = 0x8;
                break;
            case CuboidClipboard::WEST_EAST:
                $bit1 = 0x1;
                $bit2 = 0x4;
                break;
            default:
                return $data;
            }
            $newData = $data & ~($bit1 | $bit2);
            if(($data & $bit1) != 0) $newData |= $bit2;
            if(($data & $bit2) != 0) $newData |= $bit1;
            return newData;

        case Block::FENCE_GATE:
            switch($data & 0x3){
            case 0:
            case 2:
                return $data ^ $flipZ << 1;
            case 1:
            case 3:
                return $data ^ $flipX << 1;
            }
            break;

        case Block::BED_BLOCK:
            switch($data & 0x3){
            case 0:
            case 2:
                return $data ^ $flipZ << 1;
            case 1:
            case 3:
                return $data ^ $flipX << 1;
            }
            break;

        case Block::SKULL_BLOCK:
            switch($data){
                case 2:
                case 3:
                    return $data ^ $flipZ;
                case 4:
                case 5:
                    return $data ^ $flipX;
            }
            break;

        case Block::ANVIL:
            switch($data & 0x3){
                case 0:
                case 2:
                    return $data ^ $flipZ << 1;
                case 1:
                case 3:
                    return $data ^ $flipX << 1;
            }
            break;

        }

        return $data;
    }

    public static function cycle(int $type, int $data, int $increment) : int{
        if($increment != -1 && $increment != 1){
            //throw new IllegalArgumentException("Increment must be 1 or -1.");
        }

        switch($type){

        // special case here, going to use "forward" for type and "backward" for orientation
        case Block::LOG:
        case Block::LOG2:
            if($increment == -1){
                $store = $data & 0x3; // copy bottom (type) bits
                return $this->mod((data & ~0x3) + 4, 16) | $store; // switch orientation with top bits and reapply bottom bits;
            }else{
                $store = $data & ~0x3; // copy top (orientation) bits
                return $this->mod(($data & 0x3) + 1, 4) | $store;  // switch type with bottom bits and reapply top bits
            }

        // <del>same here</del> - screw you unit tests
        /*case BlockID.QUARTZ_BLOCK:
            if (increment == -1 && data > 2) {
                switch (data) {
                case 2: return 3;
                case 3: return 4;
                case 4: return 2;
                }
            } else if (increment == 1) {
                switch (data) {
                case 0:
                    return 1;
                case 1:
                    return 2;
                case 2:
                case 3:
                case 4:
                    return 0;
                }
            } else {
                return -1;
            }*/

        case Block::GLASS_PANE:
        case Block::SANDSTONE:
        case Block::DIRT:
            if($data > 2) return -1;
            return $this->mod(($data + $increment), 3);

        case Block::TORCH:
        case Block::UNLIT_REDSTONE_TORCH:
        case Block::LIT_REDSTONE_TORCH:
            if($data < 1 || $data > 4) return -1;
            return $this->mod(($data - 1 + $increment), 4) + 1;

        case Block::OAK_STAIRS:
        case Block::COBBLESTONE_STAIRS:
        case Block::BRICK_STAIRS:
        case Block::STONE_BRICK_STAIRS:
        case Block::NETHER_BRICK_STAIRS:
        case Block::SANDSTONE_STAIRS:
        case Block::SPRUCE_STAIRS:
        case Block::BIRCH_STAIRS:
        case Block::JUNGLE_STAIRS:
        case Block::QUARTZ_STAIRS:
        case Block::ACACIA_STAIRS:
        case Block::DARK_OAK_STAIRS:
            if($data > 7) return -1;
            return $this->mod(($data + $increment), 8);

        case Block::STONE_BRICK:
        case Block::QUARTZ_BLOCK:
        case Block::PUMPKIN:
        case Block::JACK_O_LANTERN:
        case Block::NETHER_WART_BLOCK:
        case Block::CAULDRON_BLOCK:
        case Block::WOODEN_SLAB:
        case Block::DOUBLE_WOODEN_SLAB:
        case Block::HAY_BLOCK:
            if($data > 3) return -1;
            return $this->mod(($data + $increment), 4);

        case Block::STONE_SLAB2:
        case Block::DOUBLE_STONE_SLAB2:
        case Block::STONE_SLAB:
        case Block::DOUBLE_STONE_SLAB:
        case Block::CAKE_BLOCK:
        case Block::PISTON:
        case Block::STICKY_PISTON:
        case Block::PISTONARMCOLLISION:
            if($data > 5) return -1;
            return $this->mod(($data + $increment), 6);

        case Block::DOUBLE_PLANT:
            $store = $data & 0x8; // top half flag
            $data &= ~0x8;
            if($data > 5) return -1;
            return $this->mod(($data + $increment), 6) | $store;

        case Block::WHEAT_BLOCK:
        case Block::PUMPKIN_STEM:
        case Block::MELON_STEM:
            if($data > 6) return -1;
            return $this->mod(($data + $increment), 7);

        case Block::FARMLAND:
        case Block::RED_FLOWER:
            if($data > 8) return -1;
            return $this->mod(($data + $increment), 9);

        case Block::RED_MUSHROOM_BLOCK:
        case Block::BROWN_MUSHROOM_BLOCK:
            if($data > 10) return -1;
            return $this->mod(($data + $increment), 11);

        case Block::CACTUS:
        case Block::REEDS_BLOCK:
        case Block::SIGN_POST:
        case Block::VINE:
        case Block::SNOW:
        case Block::COCOA:
            if($data > 15) return -1;
            return $this->mod(($data + $increment), 16);

        case Block::FURNACE:
        case Block::BURNING_FURNACE:
        case Block::WALL_SIGN:
        case Block::LADDER:
        case Block::CHEST:
        case Block::ENDER_CHEST:
        case Block::TRAPPED_CHEST:
        case Block::HOPPER_BLOCK:
            $extra = $data & 0x8;
            $withoutFlags = $data & ~0x8;
            if($withoutFlags < 2 || $withoutFlags > 5) return -1;
            return ($this->mod(($withoutFlags - 2 + $increment), 4) + 2) | $extra;

        case BlockID.DISPENSER:
        case BlockID.DROPPER:
            $store = $data & 0x8;
            $data &= ~0x8;
            if($data > 5) return -1;
            return $this->mod(($data + $increment), 6) | $store;

        case Block::UNPOWERED_COMPARATOR:
        case Block::POWERED_COMPARATOR:
        case Block::UNPOWERED_REPEATER:
        case Block::POWERED_REPEATER:
        case Block::TRAPDOOR:
        case Block::FENCE_GATE:
        case Block::LEAVES:
        case Block::LEAVES2:
            if($data > 7) return -1;
            $store = $data & ~0x3;
            return $this->mod((($data & 0x3) + $increment), 4) | $store;

        case Block::RAIL:
            if($data < 6 || $data > 9) return -1;
            return $this->mod(($data - 6 + $increment), 4) + 6;

        case Block::SAPLING:
            if(($data & 0x3) == 3 || $data > 15) return -1;
            $store = $data & ~0x3;
            return $this->mod((($data & 0x3) + $increment), 3) | $store;

        case Block::FLOWER_POT_BLOCK:
            if($data > 13) return -1;
            return $this->mod(($data + $increment), 14);

        case Block::CARPET:
        case Block::STAINED_CLAY:
        case Block::CARPET:
        case Block::STAINED_GLASS:
        case Block::STAINED_GLASS_PANE:
            if($increment == 1){
                $data = $this->nextClothColor($data);
            }else if(increment == -1){
                $this->data = $this->prevClothColor($data);
            }
            return $data;

        default:
            return -1;
        }
    }

    public static function nextClothColor(int $data) : int{
        switch($data){
            case self::WHITE: return self::LIGHT_GRAY;
            case self::LIGHT_GRAY: return self::GRAY;
            case self::GRAY: return self::BLACK;
            case self::BLACK: return self::BROWN;
            case self::BROWN: return self::RED;
            case self::RED: return self::ORANGE;
            case self::ORANGE: return self::YELLOW;
            case self::YELLOW: return self::LIGHT_GREEN;
            case self::LIGHT_GREEN: return self::DARK_GREEN;
            case self::DARK_GREEN: return self::CYAN;
            case self::CYAN: return self::LIGHT_BLUE;
            case self::LIGHT_BLUE: return self::BLUE;
            case self::BLUE: return self::PURPLE;
            case self::PURPLE: return self::MAGENTA;
            case self::MAGENTA: return self::PINK;
            case self::PINK: return self::WHITE;
        }

        return self::WHITE;
    }

    public static function prevClothColor(int $data) : int{
        switch(data){
            case self::LIGHT_GRAY: return self::WHITE;
            case self::GRAY: return self::LIGHT_GRAY;
            case self::BLACK: return self::GRAY;
            case self::BROWN: return self::BLACK;
            case self::RED: return self::BROWN;
            case self::ORANGE: return self::RED;
            case self::YELLOW: return self::ORANGE;
            case self::LIGHT_GREEN: return self::YELLOW;
            case self::DARK_GREEN: return self::LIGHT_GREEN;
            case self::CYAN: return self::DARK_GREEN;
            case self::LIGHT_BLUE: return self::CYAN;
            case self::BLUE: return self::LIGHT_BLUE;
            case self::PURPLE: return self::BLUE;
            case self::MAGENTA: return self::PURPLE;
            case self::PINK: return self::MAGENTA;
            case self::WHITE: return self::PINK;
        }

        return self::WHITE;
    }

    /**
     * Better modulo, not just remainder.
     */
    private static function mod(int $x, int $y) : int{
        $res = $x % $y;
        return $res < 0 ? $res + $y : $res;
    }

        const WHITE = 0;
        const ORANGE = 1;
        const MAGENTA = 2;
        const LIGHT_BLUE = 3;
        const YELLOW = 4;
        const LIGHT_GREEN = 5;
        const PINK = 6;
        const GRAY = 7;
        const LIGHT_GRAY = 8;
        const CYAN = 9;
        const PURPLE = 10;
        const BLUE = 11;
        const BROWN = 12;
        const DARK_GREEN = 13;
        const RED = 14;
        const BLACK = 15;
}<?php

namespace edit\blocks;

interface BlockMaterial{

	function isRenderedAsNormalBlock() : bool;

	function isFullCube() : bool;

	function isOpaque() : bool;

	function isPowerSource() : bool;

	function isLiquid() : bool;

	function isSolid() : bool;

	function getHardness() : float;

	function getResistance() : float;

	function getSlipperiness() : float;

	function isGrassBlocking() : bool;

	function getAmbientOcclusionLightValue() : float;

	function getLightOpacity() : int;

	function getLightValue() : int;

	function isFragileWhenPushed() : bool;

	function isUnpushable() : bool;

	function isAdventureModeExempt() : bool;

	function isTicksRandomly() : bool;

	function isUsingNeighborLight() : bool;

	function isMovementBlocker() : bool;

	function isBurnable() : bool;

	function isToolRequired() : bool;

	function isReplacedDuringPlacement() : bool;

}
<?php

namespace edit\blocks;

use pocketmine\block\Block;

class BlockType{

	public static function register(){
		//self::$AIR = new BlockType(Block::AIR, ["Air", "air"]
	}

	public static $shouldPlaceLast = [
		Block::SAPLING,
		Block::BED_BLOCK,
		Block::POWERED_RAIL,
		Block::DETECTOR_RAIL,
		Block::GLASS_PANE,
		Block::DEAD_BUSH,
		Block::PISTONARMCOLLISION,
		Block::YELLOW_FLOWER,
		Block::RED_FLOWER,
		Block::BROWN_MUSHROOM_BLOCK,
		Block::RED_MUSHROOM_BLOCK,
		Block::TORCH,
		Block::FIRE,
		Block::REDSTONE_WIRE,
		Block::WHEAT_BLOCK,
		Block::LADDER,
		Block::RAIL,
		Block::LEVER,
		Block::STONE_PRESSURE_PLATE,
		Block::WOODEN_PRESSURE_PLATE,
		Block::UNLIT_REDSTONE_TORCH,
		Block::LIT_REDSTONE_TORCH,
		Block::STONE_BUTTON,
		Block::SNOW,
		Block::PORTAL,
		Block::UNPOWERED_REPEATER,
		Block::POWERED_REPEATER,
		Block::TRAPDOOR,
		Block::VINE,
		Block::LILY_PAD,
		Block::NETHER_WART_PLANT,
		Block::PISTON,
		Block::STICKY_PISTON,
		Block::COCOA,
		Block::TRIPWIRE_HOOK,
		Block::FLOWER_POT_BLOCK,
		Block::CARROTS,
		Block::POTATOES,
		Block::WOODEN_BUTTON,
		Block::ANVIL,
		Block::LIGHT_WEIGHTED_PRESSURE_PLATE,
		Block::HEAVY_WEIGHTED_PRESSURE_PLATE,
		Block::UNPOWERED_COMPARATOR,
		Block::POWERED_COMPARATOR,
		Block::ACTIVATOR_RAIL,
		Block::IRON_TRAPDOOR,
		Block::CARPET,
		Block::DOUBLE_PLANT,
		Block::DAYLIGHT_DETECTOR_INVERTED
	];

	public static function shouldPlaceLast(int $id) : bool{
		return in_array($id, self::$shouldPlaceLast);
	}

	public static $shouldPlaceFinal = [
		Block::SIGN_POST,
		Block::OAK_DOOR_BLOCK,
		Block::SPRUCE_DOOR_BLOCK,
		Block::BIRCH_DOOR_BLOCK,
		Block::JUNGLE_DOOR_BLOCK,
		Block::ACACIA_DOOR_BLOCK,
		Block::DARK_OAK_DOOR_BLOCK,
		Block::WALL_SIGN,
		Block::IRON_DOOR_BLOCK,
		Block::CACTUS,
		Block::REEDS_BLOCK,
		Block::CAKE_BLOCK,
		Block::PISTONARMCOLLISION,
		Block::STANDING_BANNER,
		Block::WALL_BANNER
	];

	public static function shouldPlaceFinal(int $id) : bool{
		return in_array($id, self::$shouldPlaceFinal);
	}

	public static $canPassThrough = [
		Block::AIR,
		Block::WATER,
		Block::STILL_WATER,
		Block::POWERED_RAIL,
		Block::DETECTOR_RAIL,
		Block::COBWEB,
		Block::GLASS_PANE,
		Block::DEAD_BUSH,
		Block::YELLOW_FLOWER,
		Block::RED_FLOWER,
		Block::BROWN_MUSHROOM_BLOCK,
		Block::RED_MUSHROOM_BLOCK,
		Block::TORCH,
		Block::FIRE,
		Block::REDSTONE_WIRE,
		Block::WHEAT_BLOCK,
		Block::SIGN_POST,
		Block::LADDER,
		Block::RAIL,
		Block::WALL_SIGN,
		Block::LEVER,
		Block::STONE_PRESSURE_PLATE,
		Block::WOODEN_PRESSURE_PLATE,
		Block::UNLIT_REDSTONE_TORCH,
		Block::LIT_REDSTONE_TORCH,
		Block::STONE_BUTTON,
		-16*Block::SNOW-0,
		-16*Block::SNOW-8,
		Block::REEDS_BLOCK,
		Block::PORTAL,
		Block::UNPOWERED_REPEATER,
		Block::POWERED_REPEATER,
		Block::PUMPKIN_STEM,
		Block::MELON_STEM,
		Block::VINE,
		Block::NETHER_WART_PLANT,
		Block::END_PORTAL,
		Block::TRIPWIRE_HOOK,
		Block::TRIPWIRE,
		Block::CARROTS,
		Block::POTATOES,
		Block::WOODEN_BUTTON,
		Block::LIGHT_WEIGHTED_PRESSURE_PLATE,
		Block::HEAVY_WEIGHTED_PRESSURE_PLATE,
		Block::UNPOWERED_COMPARATOR,
		Block::POWERED_COMPARATOR,
		Block::ACTIVATOR_RAIL,
		Block::IRON_TRAPDOOR,
		Block::CARPET,
		Block::DOUBLE_PLANT,
		Block::STANDING_BANNER,
		Block::WALL_BANNER
	];

	public static function canPassThrough(int $id, ?int $data = null) : bool{
		if($data == null) return in_array($id, self::$canPassThrough);
		return in_array(-16*$id-$data, self::$canPassThrough) || in_array($id, self::$canPassThrough);
	}

	public static $isNaturalTerrainBlock = [
		Block::STONE,
		Block::GRASS,
		Block::DIRT,
		Block::BEDROCK,
		Block::SAND,
		Block::GRAVEL,
		Block::CLAY_BLOCK,
		Block::MYCELIUM,
		Block::PACKED_ICE,
		Block::STAINED_CLAY,

        // hell
		Block::NETHERRACK,
		Block::SOUL_SAND,
		Block::GLOWSTONE,
		Block::QUARTZ_ORE,

        // ores
		Block::COAL_ORE,
		Block::IRON_ORE,
		Block::GOLD_ORE,
		Block::LAPIS_ORE,
		Block::DIAMOND_ORE,
		Block::REDSTONE_ORE,
		Block::GLOWING_REDSTONE_ORE,
		Block::EMERALD_ORE
	];

	public static function isNaturalTerrainBlock(int $id, ?int $data = null) : bool{
		if($data == null) return in_array($id, self::$isNaturalTerrainBlock);
		return in_array(-16*$id-$data, self::$isNaturalTerrainBlock) || in_array($id, self::$isNaturalTerrainBlock);
	}

	public static $isTranslucent = [
		Block::AIR,
		Block::SAPLING,
		Block::WATER,
		Block::STILL_WATER,
		Block::LEAVES,
		Block::GLASS,
		Block::BED_BLOCK,
		Block::POWERED_RAIL,
		Block::DETECTOR_RAIL,
		Block::COBWEB,
		Block::GLASS_PANE,
		Block::DEAD_BUSH,
		Block::PISTONARMCOLLISION,
		Block::YELLOW_FLOWER,
		Block::RED_FLOWER,
		Block::BROWN_MUSHROOM_BLOCK,
		Block::RED_MUSHROOM_BLOCK,
		Block::TORCH,
		Block::FIRE,
		Block::MOB_SPAWNER,
		Block::OAK_STAIRS,
		Block::CHEST,
		Block::REDSTONE_WIRE,
		Block::WHEAT_BLOCK,
		Block::SIGN_POST,
		Block::OAK_DOOR_BLOCK,
		Block::LADDER,
		Block::RAIL,
		Block::COBBLESTONE_STAIRS,
		Block::WALL_SIGN,
		Block::LEVER,
		Block::STONE_PRESSURE_PLATE,
		Block::IRON_DOOR_BLOCK,
		Block::WOODEN_PRESSURE_PLATE,
		Block::UNLIT_REDSTONE_TORCH,
		Block::LIT_REDSTONE_TORCH,
		Block::STONE_BUTTON,
		Block::SNOW,
		Block::ICE,
		Block::CACTUS,
		Block::REEDS_BLOCK,
		Block::FENCE,
		Block::PORTAL,
		Block::CAKE_BLOCK,
		Block::UNPOWERED_REPEATER,
		Block::POWERED_REPEATER,
		Block::TRAPDOOR,
		Block::IRON_BARS,
		Block::PUMPKIN_STEM,
		Block::MELON_STEM,
		Block::VINE,
		Block::FENCE_GATE,
		Block::BRICK_STAIRS,
		Block::STONE_BRICK_STAIRS,
		Block::LILY_PAD,
		Block::NETHER_BRICK_FENCE,
		Block::NETHER_BRICK_STAIRS,
		Block::NETHER_WART_PLANT,
		Block::ENCHANTING_TABLE,
		Block::BREWING_STAND_BLOCK,
		Block::CAULDRON_BLOCK,
		Block::WOODEN_SLAB,
		Block::COCOA,
		Block::SANDSTONE_STAIRS,
		Block::ENDER_CHEST,
		Block::TRIPWIRE_HOOK,
		Block::TRIPWIRE,
		Block::SPRUCE_STAIRS,
		Block::BIRCH_STAIRS,
		Block::JUNGLE_STAIRS,
		Block::COBBLESTONE_WALL,
		Block::FLOWER_POT_BLOCK,
		Block::CARROTS,
		Block::POTATOES,
		Block::WOODEN_BUTTON,
		Block::SKULL_BLOCK,
		Block::ANVIL,
		Block::TRAPPED_CHEST,
		Block::LIGHT_WEIGHTED_PRESSURE_PLATE,
		Block::HEAVY_WEIGHTED_PRESSURE_PLATE,
		Block::UNPOWERED_COMPARATOR,
		Block::POWERED_COMPARATOR,
		Block::DAYLIGHT_SENSOR,
		Block::HOPPER_BLOCK,
		Block::QUARTZ_STAIRS,
		Block::ACTIVATOR_RAIL,
		Block::IRON_TRAPDOOR,
		Block::CARPET,
		Block::DOUBLE_PLANT,
		Block::STANDING_BANNER,
		Block::WALL_BANNER,
		Block::DAYLIGHT_DETECTOR_INVERTED,
		Block::RED_SANDSTONE_STAIRS,
		Block::STONE_SLAB2,
		Block::SPRUCE_FENCE_GATE,
		Block::BIRCH_FENCE_GATE,
		Block::JUNGLE_FENCE_GATE,
		Block::DARK_OAK_FENCE_GATE,
		Block::ACACIA_FENCE_GATE,
		//Block::SPRUCE_FENCE,
		//Block::BIRCH_FENCE,
		//Block::JUNGLE_FENCE,
		//Block::DARK_OAK_FENCE,
		//Block::ACACIA_FENCE,
		Block::SPRUCE_DOOR_BLOCK,
		Block::BIRCH_DOOR_BLOCK,
		Block::JUNGLE_DOOR_BLOCK,
		Block::ACACIA_DOOR_BLOCK,
		Block::DARK_OAK_DOOR_BLOCK
	];

	public static function isTranslucent(int $id) : bool{
		return in_array($id, self::$isTranslucent);
	}
}<?php

namespace edit\blocks;

use edit\world\NbtValued;

interface TileEntityBlock extends NbtValued{

	function getNbtId() : string;

}<?php

namespace edit;

class BlockVector extends Vector{

	public function toBlockVector(){
		return $this;
	}

	public function equals($obj){
		if(!($obj instanceof Vector)){
			return false;
		}

		return (int) $obj->getX() == (int) $this->getX() && (int) $obj->getY() == (int) $this->getY() && (int) $obj->getZ() == (int) $this->getZ();
	}

	public function hashCode(){
		return ((int) $this->x << 19) ^
			((int) $this->y << 12) ^
			(int) $this->z;
	}
}<?php

namespace edit;

class BlockVector2D extends Vector2D{

	public function equals($obj){
		if(!($obj instanceof Vector2D)){
			return false;
		}

		return (int) $obj->x == (int) $this->x && (int) $obj->y == (int) $this->y;
	}

	public function toBlockVector2D(){
		return $this;
	}
}<?php

namespace edit;

class BlockWorldVector extends WorldVector{

	public function equals($obj){
		if(!($obj instanceof Vector)){
			return false;
		}

		return (int) $obj->getX() == (int) $this->getX() && (int) $obj->getY() == (int) $this->getY() && (int) $obj->getZ() == (int) $this->getZ();
	}

	public function hashCode(){
		return ((int) $this->x << 19) ^
			((int) $this->y << 12) ^
			(int) $this->z;
	}
}<?php

namespace edit;

class BlockWorldVector2D extends WorldVector2D{

	public function equals($obj){
		if(!($obj instanceof WorldVector2D)){
			return false;
		}

		return (int) $obj->x == (int) $this->x && (int) $obj->y == (int) $this->y;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\session\ClipboardHolder;
use edit\functions\pattern\Pattern;
use edit\command\tool\brush\SphereBrush;
use edit\command\tool\brush\SmoothBrush;
use edit\command\tool\brush\HollowSphereBrush;
use edit\command\tool\brush\ClipboardBrush;
use edit\command\tool\brush\CylinderBrush;
use edit\command\tool\brush\HollowCylinderBrush;
use edit\command\tool\brush\GravityBrush;
use edit\command\util\FlagChecker;

class BrushCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"ãƒ–ãƒ©ã‚·ã‚’é¸æŠžã—ã¾ã™",
			"//brush <sphere|cylinder|clipboard|smooth|gravity>"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		$copyEntities = false;

		if(count($args) >= 1){
			$check = FlagChecker::check($args);

			$args = $check[0];
			$flags = $check[1];

			switch($args[0]){
				case "sphere":
				case "s":
					if(count($args) < 2){
						$sender->sendMessage("Â§cä½¿ã„æ–¹: Â§a//brush sphere <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> [åŠå¾„]\n".
								     "Â§cãƒ•ãƒ©ã‚°: Â§a-h: ç©ºæ´žã«ã—ã¾ã™");
						return true;
					}

					$hollow = false;

					foreach($flags as $flag){
						switch($flag){
							case "h":
								$hollow = true;
								break;
						}
					}

					if(empty($args[2])) $args[2] = 2;

					$fill = Main::getInstance()->getPatternFactory()->parseFromInput($args[1]);

					$this->sphereBrush($sender, $fill, (float) $args[2], $hollow);
					break;
				case "cylinder":
				case "cyl":
				case "c":
					if(count($args) < 2){
						$sender->sendMessage("Â§cä½¿ã„æ–¹: Â§a//brush cylinder <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> [åŠå¾„] [é«˜ã•]\n".
								     "Â§cãƒ•ãƒ©ã‚°: Â§a-h: ç©ºæ´žã«ã—ã¾ã™");
						return true;
					}

					$hollow = false;

					foreach($flags as $flag){
						switch($flag){
							case "h":
								$hollow = true;
								break;
						}
					}

					if(empty($args[2])) $args[2] = 2;
					if(empty($args[3])) $args[3] = 1;

					$fill = Main::getInstance()->getPatternFactory()->parseFromInput($args[1]);

					$this->cylinderBrush($sender, $fill, (float) $args[2], (int) $args[3], $hollow);
					break;
				case "clipboard":
				case "copy":

					$this->clipboardBrush($sender, false, false);
					break;
				case "smooth":
					if(count($args) < 3){
						$sender->sendMessage("Â§cä½¿ã„æ–¹: Â§a//brush smooth [ã‚µã‚¤ã‚º] [å›žæ•°]\n".
								     "Â§cãƒ•ãƒ©ã‚°: Â§a-n: è‡ªç„¶ã®ãƒ–ãƒ­ãƒƒã‚¯ã®ã¿ã«é©å¿œã—ã¾ã™");
						return true;
					}

					$naturalBlocksOnly = false;

					foreach($flags as $flag){
						switch($flag){
							case "n":
								$naturalBlocksOnly = true;
								break;
						}
					}

					$this->smoothBrush($sender, (float) $args[1], (int) $args[2], $naturalBlocksOnly);
					break;
				case "gravity":
				case "grav":
					if(count($args) < 2){
						$sender->sendMessage("Â§cä½¿ã„æ–¹: Â§a//brush gravity [åŠå¾„]\n".
								     "Â§cãƒ•ãƒ©ã‚°: Â§a-h: é«˜ã•ç„¡åˆ¶é™");
						return true;
					}

					$fromMaxY = false;

					foreach($flags as $flag){
						switch($flag){
							case "h":
								$fromMaxY = true;
								break;
						}
					}

					$this->gravityBrush($sender, (float) $args[1], $fromMaxY);
					break;
				default:
					break;
			}
		}else{
			$sender->sendMessage("Â§a//brush sphere: Â§7çƒä½“ã‚’ç”Ÿæˆã—ã¾ã™\n".
					     "Â§a//brush cylinder: Â§7å††æŸ±ã‚’ç”Ÿæˆã—ã¾ã™\n".
					     "Â§a//brush clipboard: Â§7ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’è²¼ã‚Šä»˜ã‘ã¾ã™\n".
					     "Â§a//brush smooth: Â§7åœ°å½¢ã‚’æ»‘ã‚‰ã‹ã«ã—ã¾ã™\n".
					     "Â§a//brush gravity: Â§7é‡åŠ›ã‚’ç™ºç”Ÿã—ã¾ã™");
		}
		return true;
	}

	public function sphereBrush(Player $player, Pattern $fill, float $radius, bool $hollow){
		//checkMaxBrushRadius

		$tool = Main::getInstance()->getBrushTool($player->getInventory()->getItemInHand(), $player);
		$tool->setFill($fill);
		$tool->setSize($radius);
		if($hollow){
			$tool->setBrush(new HollowSphereBrush());
		}else{
			$tool->setBrush(new SphereBrush());
		}

		$player->sendMessage(Main::LOGO."çƒä½“ã®ãƒ–ãƒ©ã‚·ã‚’é¸æŠžã—ã¾ã—ãŸ (".$radius.")");
	}

	public function cylinderBrush(Player $player, Pattern $fill, float $radius, int $height, bool $hollow){
		//checkMaxBrushRadius

		$tool = Main::getInstance()->getBrushTool($player->getInventory()->getItemInHand(), $player);
		$tool->setFill($fill);
		$tool->setSize($radius);
		if($hollow){
			$tool->setBrush(new HollowCylinderBrush($height));
		}else{
			$tool->setBrush(new CylinderBrush($height));
		}

		$player->sendMessage(Main::LOGO."å††æŸ±ã®ãƒ–ãƒ©ã‚·ã‚’é¸æŠžã—ã¾ã—ãŸ (".$radius." by ".$height.")");
	}

	public function clipboardBrush(Player $player, bool $ignoreAir, bool $usingOrigin){
		//checkMaxBrushRadius

		$holder = Main::getInstance()->getEditSession($player)->getClipboard();
		if(!($holder instanceof ClipboardHolder)){
			$player->sendMessage(Main::LOGO."ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã«ä½•ã‚‚ã‚ã‚Šã¾ã›ã‚“");
			return;
		}
		$clipboard = $holder->getClipboard();
		$size = $clipboard->getDimensions();

		$tool = Main::getInstance()->getBrushTool($player->getInventory()->getItemInHand(), $player);
		$tool->setSize($size->getBlockX());
		$tool->setBrush(new ClipboardBrush($holder, $ignoreAir, $usingOrigin));

		$player->sendMessage(Main::LOGO."ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ãƒ–ãƒ©ã‚·ã‚’é¸æŠžã—ã¾ã—ãŸ");
	}

	public function smoothBrush(Player $player, float $radius, int $iterations, bool $naturalBlocksOnly){
		//checkMaxBrushRadius

		$tool = Main::getInstance()->getBrushTool($player->getInventory()->getItemInHand(), $player);
		$tool->setSize($radius);
		$tool->setBrush(new SmoothBrush($iterations, $naturalBlocksOnly));

		$player->sendMessage(Main::LOGO."ã‚¹ãƒ ãƒ¼ã‚ºãƒ–ãƒ©ã‚·ã‚’é¸æŠžã—ã¾ã—ãŸ (".$radius." x ".$iterations.", using ".($naturalBlocksOnly ? "è‡ªç„¶ã®ãƒ–ãƒ­ãƒƒã‚¯ã®ã¿" : "ã™ã¹ã¦ã®ãƒ–ãƒ­ãƒƒã‚¯").")");
	}

	public function gravityBrush(Player $player, float $radius, bool $fromMaxY){
		//checkMaxBrushRadius

		$tool = Main::getInstance()->getBrushTool($player->getInventory()->getItemInHand(), $player);
		$tool->setSize($radius);
		$tool->setBrush(new GravityBrush($fromMaxY));

		$player->sendMessage(Main::LOGO."é‡åŠ›ãƒ–ãƒ©ã‚·ã‚’é¸æŠžã—ã¾ã—ãŸ (".$radius.")");
	}
}<?php

namespace edit\command;

use pocketmine\Player;
use pocketmine\network\mcpe\protocol\AvailableCommandsPacket;
use pocketmine\command\Command;
use pocketmine\network\mcpe\protocol\types\CommandData;
use pocketmine\network\mcpe\protocol\types\CommandEnum;
use pocketmine\network\mcpe\protocol\types\CommandOriginData;
use pocketmine\network\mcpe\protocol\types\CommandOutputMessage;
use pocketmine\network\mcpe\protocol\types\CommandParameter;

class CommandManager {

	public static $SOTECommandData = [];

	public $command;
	public $data;

	public function __construct(Command $commands) {
		$this->command = $commands;
	}
    
	public function createCommandData($flags = 0, $permission = 0){
		$commandData = new CommandData();
		$commandData->commandName = $this->command->getName();
		$commandData->commandDescription = $this->command->getDescription();
		$commandData->flags = $flags;
		$commandData->permission = $permission;

		$this->data = $commandData;
	}

	public function setCommandParameter($args,$paramName,$paramType,$isOptional = true){
		$parameter = new CommandParameter();
		$parameter->paramName = $paramName;
		$parameter->paramType = $paramType;
		$parameter->isOptional = $isOptional;
		$this->data->overloads[$args][] = $parameter;
	}

	public function setSubCommand($args,$isOptional = true,array $subcommands = []){
		$paramName = "type";
		$paramType = 0x100000 | 0x11;
		$parameter = new CommandParameter();
		$parameter->paramName = $paramName;
		$parameter->paramType = $paramType;
		$parameter->isOptional = $isOptional;
		$enum = new CommandEnum();
		$enum->enumName = "{$args}";
		$enum->enumValues = $subcommands;
		$parameter->enum = $enum;
		$this->data->overloads[$args][] = $parameter;
	}

	public function setAliases(){
		$aliases = $this->command->getAliases();
		if(!empty($aliases)){
			$this->data->aliases = new CommandEnum();
			$this->data->aliases->enumName = ucfirst($this->command->getName()) . "Aliases";
			$this->data->aliases->enumValues = $aliases;
		}
	}

	public function register(){
		self::$SOTECommandData[$this->command->getName()] = $this->data;
	}

	public static function join(Player $player) {
		$pk = new AvailableCommandsPacket();
		foreach (self::$SOTECommandData as $name => $data) {
			$pk->commandData[$name] = $data;
		}
		$player->dataPacket($pk);
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\session\ClipboardHolder;
use edit\extent\clipboard\BlockArrayClipboard;
use edit\functions\operation\ForwardExtentCopy;
use edit\functions\operation\Operations;
use edit\command\util\FlagChecker;
use edit\command\util\HelpChecker;
use edit\command\util\DefinedChecker;
use edit\command\util\SpaceChecker;

class CopyCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"é¸æŠžã—ã¦ã„ã‚‹ç¯„å›²ã‚’ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã«ã‚³ãƒ”ãƒ¼ã—ã¾ã™",
			"//copy"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aé¸æŠžã—ã¦ã„ã‚‹ç¯„å›²ã‚’ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã«ã‚³ãƒ”ãƒ¼ã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//copy\n".
					     "Â§cãƒ•ãƒ©ã‚°: Â§a-e: ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ãƒ¼ã‚‚ã‚³ãƒ”ãƒ¼ã—ã¾ã™\n".
					     "Â§c      : Â§a-m: -----------");
			return false;
		}

		if(DefinedChecker::checkPosition($sender)) {
			return false;
		}

        $check = FlagChecker::check($args);

        $args = $check[0];
        $flags = $check[1];

		$copyEntities = false;

		foreach($flags as $flag){
			switch($flag){
				case "e":
					$copyEntities = true;
					break;
				case "m":
					break;
			}
		}

		$region = Main::getInstance()->getEditSession($sender)->getRegionSelector($sender->getLevel())->getRegion();

		$clipboard = new BlockArrayClipboard($region);
		$clipboard->setOrigin(Main::getInstance()->getEditSession($sender)->getPlacementPosition($sender));
		$copy = new ForwardExtentCopy(Main::getInstance()->getEditSession($sender), $region, $region->getMinimumPoint(), $clipboard, $region->getMinimumPoint());
		$copy->setCopyingEntities($copyEntities);
		//if($mask != null){
		//	$copy->setSourceMask($mask);
		//}
		Operations::completeLegacy($copy);
		Main::getInstance()->getEditSession($sender)->setClipboard(new ClipboardHolder($clipboard, Main::getInstance()->getEditSession($sender)->getWorld()));

		$sender->sendMessage(Main::LOGO.$region->getArea()."ãƒ–ãƒ­ãƒƒã‚¯ã‚’ã‚³ãƒ”ãƒ¼ã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\session\ClipboardHolder;
use edit\extent\clipboard\BlockArrayClipboard;
use edit\functions\block\BlockReplace;
use edit\functions\operation\ForwardExtentCopy;
use edit\functions\operation\Operations;
use edit\command\util\FlagChecker;
use edit\command\util\HelpChecker;
use edit\command\util\DefinedChecker;
use edit\command\util\SpaceChecker;

class CutCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"é¸æŠžã—ã¦ã„ã‚‹ç¯„å›²ã‚’ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã«ã‚«ãƒƒãƒˆã—ã¾ã™",
			"//copy"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aé¸æŠžã—ã¦ã„ã‚‹ç¯„å›²ã‚’ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã«ã‚«ãƒƒãƒˆã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//cut\n".
					     "Â§cãƒ•ãƒ©ã‚°: Â§a-e: ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ãƒ¼ã‚‚ã‚³ãƒ”ãƒ¼ã—ã¾ã™\n".
					     "Â§c      : Â§a-m: -----------");
			return false;
		}

		if(DefinedChecker::checkPosition($sender)) {
			return false;
		}

		$check = FlagChecker::check($args);

        $args = $check[0];
        $flags = $check[1];

		$copyEntities = false;

		foreach($flags as $flag){
			switch($flag){
				case "e":
					$copyEntities = true;
					break;
				case "m":
					break;
			}
		}

		$region = Main::getInstance()->getEditSession($sender)->getRegionSelector($sender->getLevel())->getRegion();

		$clipboard = new BlockArrayClipboard($region);
		$clipboard->setOrigin(Main::getInstance()->getEditSession($sender)->getPlacementPosition($sender));
		$copy = new ForwardExtentCopy(Main::getInstance()->getEditSession($sender), $region, $region->getMinimumPoint(), $clipboard, $region->getMinimumPoint());
		$leavePattern = Main::getInstance()->getPatternFactory()->parseFromInput("0");
		$copy->setSourceFunction(new BlockReplace(Main::getInstance()->getEditSession($sender), $leavePattern));
		$copy->setCopyingEntities($copyEntities);
		$copy->setRemovingEntities(true);
		//if ($mask != null) {
		//	$copy->setSourceMask($mask);
		//}
		Operations::completeLegacy($copy);
		Main::getInstance()->getEditSession($sender)->setClipboard(new ClipboardHolder($clipboard, Main::getInstance()->getEditSession($sender)->getWorld()));
		Main::getInstance()->getEditSession($sender)->remember();

		$sender->sendMessage(Main::LOGO.$region->getArea()."ãƒ–ãƒ­ãƒƒã‚¯ã‚’ã‚³ãƒ”ãƒ¼ã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\functions\pattern\Pattern;
use edit\command\util\FlagChecker;
use edit\command\util\HelpChecker;
use edit\command\util\SpaceChecker;

class CylinderCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"å††æŸ±ã‚’ç”Ÿæˆã—ã¾ã™",
			"//cylinder <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>], <é«˜ã•>"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aå††æŸ±ã‚’ç”Ÿæˆã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//cylinder <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>], <é«˜ã•>\n".
					     "Â§cãƒ•ãƒ©ã‚°: Â§a-h: ç©ºæ´žã«ã—ã¾ã™");
			return false;
		}

		$check = FlagChecker::check($args);

        $args = $check[0];
        $flags = $check[1];

		$copyEntities = false;

		if(count($args) < 3){
			$sender->sendMessage("Â§cä½¿ã„æ–¹: //cylinder <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>], <é«˜ã•>");
			return true;
		}

		$hollow = false;

		foreach($flags as $flag){
			switch($flag){
				case "h":
					$hollow = true;
					break;
			}
		}

		$radii = explode(",", $args[1]);

		switch(count($radii)){
			case 1:
				$radiusX = $radiusY = $radiusZ = (float) $radii[0];
				break;
			case 2:
				$radiusX = (float) $radii[0];
				$radiusZ = (float) $radii[1];
				break;
			default:
				$sender->sendMessage("åŠå¾„ã®å€¤ãŒéŽä¸è¶³ã—ã¦ã„ã¾ã™");
				return true;
		}

		$session = Main::getInstance()->getEditSession($sender);

		$pos = $session->getPlacementPosition($sender);

		$fill = Main::getInstance()->getPatternFactory()->parseFromInput($args[0]);
		$height = (int) $args[2];
		$affected = $session->makeCylinder($pos, $fill, $radiusX,$radiusZ, $height, !$hollow);
		$session->remember();
		Main::findFreePosition($sender);
		$sender->sendMessage(Main::LOGO.$affected."ãƒ–ãƒ­ãƒƒã‚¯ã‚’è¨­ç½®ã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\functions\operation\Operations;
use edit\command\util\FlagChecker;
use edit\command\util\HelpChecker;
use edit\command\util\DefinedChecker;
use edit\math\transform\AffineTransform;
use edit\command\util\SpaceChecker;

class FlipCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’ã²ã£ãã‚Šè¿”ã—ã¾ã™",
			"//flip [<æ–¹å‘>]"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’ã²ã£ãã‚Šè¿”ã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//flip [<æ–¹å‘>]");
			return false;
		}

		if(DefinedChecker::checkClipboard($sender)) {
			return false;
		}

		if(count($args) < 1){
			$direction = Main::getCardinalDirection($sender);
		}else{
			$direction = Main::getFlipDirection($sender, $args[0]);
		}

		$session = Main::getInstance()->getEditSession($sender);

		$holder = $session->getClipboard();
		$transform = new AffineTransform();
		$transform = $transform->scale($direction->positive()->multiply(-2)->add(1, 1, 1));
		$holder->setTransform($holder->getTransform()->combine($transform));

		$sender->sendMessage(Main::LOGO."ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’ã²ã£ãã‚Šè¿”ã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\functions\pattern\Pattern;
use edit\command\util\FlagChecker;
use edit\command\util\HelpChecker;
use edit\command\util\SpaceChecker;

class HcylinderCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"ç©ºæ´žã®æŸ±ä½“ã‚’ç”Ÿæˆã—ã¾ã™",
			"//hcylinder <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>], <é«˜ã•>"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aå††æŸ±ã‚’ç”Ÿæˆã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//hcylinder <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>], <é«˜ã•>\n");
			return false;
		}

		$copyEntities = false;

		$check = FlagChecker::check($args);

		$args = $check[0];
		$flags = $check[1];

		if(count($args) < 3){
			$sender->sendMessage("Â§cä½¿ã„æ–¹: //hcylinder <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>], <é«˜ã•>");
			return true;
		}

		$radii = explode(",", $args[1]);

		switch(count($radii)){
			case 1:
				$radiusX = $radiusY = $radiusZ = (float) $radii[0];
				break;
			case 2:
				$radiusX = (float) $radii[0];
				$radiusZ = (float) $radii[1];
				break;
			default:
				$sender->sendMessage("åŠå¾„ã®å€¤ãŒè¶³ã‚Šã¾ã›ã‚“");
				return true;
		}

		$session = Main::getInstance()->getEditSession($sender);

		$pos = $session->getPlacementPosition($sender);

		$fill = Main::getInstance()->getPatternFactory()->parseFromInput($args[0]);
		$height = (int) $args[2];
		$affected = $session->makeCylinder($pos, $fill, $radiusX, $radiusZ, $height, false);
		$session->remember();
		Main::findFreePosition($sender);
		$sender->sendMessage(Main::LOGO.$affected."ãƒ–ãƒ­ãƒƒã‚¯ã‚’è¨­ç½®ã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\functions\pattern\Pattern;
use edit\command\util\FlagChecker;
use edit\command\util\HelpChecker;
use edit\command\util\SpaceChecker;

class HsphereCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"ç©ºæ´žã®çƒä½“ã‚’ç”Ÿæˆã—ã¾ã™",
			"//hsphere <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>,<åŠå¾„>] [é ­ä¸Š?]"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§açƒä½“ã‚’ç”Ÿæˆã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//hsphere <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>,<åŠå¾„>] [é ­ä¸Š?]\n");
			return false;
		}

		$copyEntities = false;

		$check = FlagChecker::check($args);

		$args = $check[0];
		$flags = $check[1];

		if(count($args) < 2){
			$sender->sendMessage("Â§cä½¿ã„æ–¹: //hsphere <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>,<åŠå¾„>] [é ­ä¸Š?]");
			return true;
		}

		$radii = explode(",", $args[1]);

		switch(count($radii)){
			case 1:
				$radiusX = $radiusY = $radiusZ = (float) $radii[0];
				break;
			case 3:
				$radiusX = (float) $radii[0];
				$radiusY = (float) $radii[1];
				$radiusZ = (float) $radii[2];
				break;
			default:
				$sender->sendMessage("åŠå¾„ã®å€¤ãŒè¶³ã‚Šã¾ã›ã‚“");
				return true;
		}

		$session = Main::getInstance()->getEditSession($sender);

		//$raised = 

		$pos = $session->getPlacementPosition($sender);
		//if($raised){
		//	$pos = $pos->add(0, $radiusY, 0);
		//}

		$fill = Main::getInstance()->getPatternFactory()->parseFromInput($args[0]);

		$affected = $session->makeSphere($pos, $fill, $radiusX, $radiusY, $radiusZ, false);
		$session->remember();
		Main::findFreePosition($sender);
		$sender->sendMessage(Main::LOGO.$affected."ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç”Ÿæˆã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\functions\mask\BlockMask;
use edit\command\util\HelpChecker;
use edit\command\util\DefinedChecker;
use edit\command\util\SpaceChecker;

class MaskCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"ãƒ–ãƒ©ã‚·ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’è¨­å®šã—ã¾ã™",
			"//mask [ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼]"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aãƒ–ãƒ©ã‚·ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’è¨­å®šã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//mask [ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼]");
			return false;
		}

        if(DefinedChecker::checkBrush($sender)) {
            $sender->sendMessage(Main::LOGO."ãƒ–ãƒ©ã‚·ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“");
            return false;
        }

		if(count($args) < 1){
			Main::getInstance()->getBrushTool($sender->getInventory()->getItemInHand(), $sender)->setMask(null);
			$sender->sendMessage(Main::LOGO."ãƒ–ãƒ©ã‚·ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ãŒç„¡åŠ¹ã«ãªã‚Šã¾ã—ãŸ");
		}else{
			$items = explode(",", $args[0]);
			$blocks = [];

			foreach($items as $item){
				$blocks[] = Main::getInstance()->getBlockFactory()->parseFromInput($item);
			}

			$session = Main::getInstance()->getEditSession($sender);
			$mask = new BlockMask($session, $blocks);

			Main::getInstance()->getBrushTool($sender->getInventory()->getItemInHand(), $sender)->setMask($mask);

			$sender->sendMessage(Main::LOGO."ãƒ–ãƒ©ã‚·ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’è¨­å®šã—ã¾ã—ãŸ");
		}
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\block\Block;
use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\blocks\BaseBlock;
use edit\functions\operation\Operations;
use edit\command\util\FlagChecker;
use edit\command\util\HelpChecker;
use edit\command\util\DefinedChecker;
use edit\math\transform\AffineTransform;
use edit\command\util\SpaceChecker;

class MoveCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"é¸æŠžã—ã¦ã„ã‚‹ç¯„å›²ã‚’ç§»å‹•ã—ã¾ã™",
			"//move [è·é›¢] [æ–¹å‘] [é™¤å¤–]"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aé¸æŠžã—ã¦ã„ã‚‹ç¯„å›²ã‚’ç§»å‹•ã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//move [è·é›¢] [æ–¹å‘] [é™¤å¤–]\n".
					     "Â§cãƒ•ãƒ©ã‚°: Â§a-s: ç§»å‹•å¾Œã®ç¯„å›²ã‚’é¸æŠžã—ã¾ã™");
			return false;
		}

		if(DefinedChecker::checkPosition($sender)) {
			return false;
		}

		$check = FlagChecker::check($args);

		$args = $check[0];
		$flags = $check[1];

		$moveSelection = false;

		foreach($flags as $flag){
			switch($flag){
				case "s":
					$moveSelection = true;
					break;
			}
		}

		$count = 1;
		if(isset($args[0])) $count = (int) $args[0];

		if(count($args) < 2){
			$direction = Main::getCardinalDirection($sender);
		}else{
			$direction = Main::getFlipDirection($sender, $args[1]);
		}

		$session = Main::getInstance()->getEditSession($sender);

		$replace = new BaseBlock(Block::AIR);
		$session->moveRegion($session->getRegionSelector($sender->getLevel())->getRegion(), $direction, $count, true, $replace);
		$session->remember();
		$sender->sendMessage(Main::LOGO."ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç§»å‹•ã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\functions\pattern\Pattern;
use edit\command\util\HelpChecker;
use edit\command\util\DefinedChecker;
use edit\command\util\SpaceChecker;

class OverlayCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"ç¯„å›²å†…ã®ãƒ–ãƒ­ãƒƒã‚¯ã®ä¸Šã«ãƒ–ãƒ­ãƒƒã‚¯ã‚’è¨­ç½®ã—ã¾ã™",
			"//overlay <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³>"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aç¯„å›²å†…ã®ãƒ–ãƒ­ãƒƒã‚¯ã®ä¸Šã«ãƒ–ãƒ­ãƒƒã‚¯ã‚’è¨­ç½®ã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//overlay <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³>");
			return false;
		}

		if(DefinedChecker::checkPosition($sender)) {
			return false;
		}

		if(count($args) < 1){
			$sender->sendMessage("Â§cä½¿ã„æ–¹: Â§a//overlay <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³>");
			return true;
		}

		$pattern = Main::getInstance()->getPatternFactory()->parseFromInput($args[0]);

		$session = Main::getInstance()->getEditSession($sender);

		$affected = $session->overlayCuboidBlocks($session->getRegionSelector($sender->getLevel())->getRegion(), $pattern);
		$session->remember();
		$sender->sendMessage(Main::LOGO.$affected."ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç”Ÿæˆã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\functions\operation\Operations;
use edit\command\util\FlagChecker;
use edit\command\util\HelpChecker;
use edit\command\util\DefinedChecker;
use edit\regions\selector\CuboidRegionSelector;
use edit\command\util\SpaceChecker;

class PasteCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’è²¼ã‚Šä»˜ã‘ã¾ã™",
			"//paste"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’è²¼ã‚Šä»˜ã‘ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//paste\n".
					     "Â§cãƒ•ãƒ©ã‚°: Â§a-a: ç©ºæ°—ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç„¡è¦–ã—ã¾ã™\n".
					     "Â§c      : Â§a-o: ã‚³ãƒ”ãƒ¼å…ƒã‚’åŽŸç‚¹ã¨ã—ã¾ã™\n".
					     "Â§c      : Â§a-s: ã‚³ãƒ”ãƒ¼å¾Œã®ç¯„å›²ã‚’é¸æŠžã—ã¾ã™");
			return false;
		}

		if(DefinedChecker::checkClipboard($sender)) {
			return false;
		}

		$check = FlagChecker::check($args);

		$args = $check[0];
		$flags = $check[1];

		$ignoreAirBlocks = false;
		$atOrigin = false;
		$selectPasted = false;

		foreach($flags as $flag){
			switch($flag){
				case "a":
					$ignoreAirBlocks = true;
					break;
				case "o":
					$atOrigin = true;
					break;
				case "s":
					$selectPasted = true;
					break;
			}
		}

		$session = Main::getInstance()->getEditSession($sender);

		$holder = $session->getClipboard();
		$clipboard = $holder->getClipboard();
		$region = $clipboard->getRegion();

		$to = $atOrigin ? $clipboard->getOrigin() : new Vector($sender->x, $sender->y, $sender->z);
		$operation = $holder
			->createPaste($session, $session->getWorld())
			->to($to)
			->ignoreAirBlocks($ignoreAirBlocks)
			->build();
		Operations::completeLegacy($operation);

		if($selectPasted){
			$clipboardOffset = $clipboard->getRegion()->getMinimumPoint()->subtract($clipboard->getOrigin());
			$realTo = $to->add($holder->getTransform()->apply($clipboardOffset));
			$max = $realTo->add($holder->getTransform()->apply($region->getMaximumPoint()->subtract($region->getMinimumPoint())));
			$selector = new CuboidRegionSelector($sender->getLevel(), $realTo, $max);
			$session->setRegionSelector($sender->getLevel(), $selector);
			$selector->learnChanges();
			$selector->explainRegionAdjust($sender);
		}
		$session->remember();

		$sender->sendMessage(Main::LOGO.$to->floor()->toString()."ã«è²¼ã‚Šä»˜ã‘ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\command\util\SpaceChecker;

class Pos1Command extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"ã²ã¨ã¤ã‚ã®ãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’è¨­å®šã—ã¾ã™",
			"//pos1"
		);
		//$data = new CommandManager($this);
		//$data->createCommandData();
		//$data->setSubCommand(0, false, ["all"]);
		//$data->setSubCommand(1, false, ["party"]);
		//$data->setSubCommand(2, false, ["clan"]);
		//$data->register();
		//$this->setPermission("");
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(isset($args[0])  && (!SpaceChecker::check($args))){
			$p = explode(",", $args[0]);
			$pos = new Vector($p[0], $p[1], $p[2]);
		}else{
			$pos = Main::getInstance()->getEditSession($sender)->getPlacementPosition($sender);
		}

		Main::getInstance()->getEditSession($sender)->getRegionSelector($sender->getLevel())->selectPrimary($pos);
		Main::getInstance()->getEditSession($sender)->getRegionSelector($sender->getLevel())->explainPrimarySelection($sender);
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\command\util\SpaceChecker;

class Pos2Command extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"ãµãŸã¤ã‚ã®ãƒã‚¸ã‚·ãƒ§ãƒ³ã®è¨­å®šã‚’ã—ã¾ã™",
			"//pos2"
		);
		//$data = new CommandManager($this);
		//$data->createCommandData();
		//$data->setSubCommand(0, false, ["all"]);
		//$data->setSubCommand(1, false, ["party"]);
		//$data->setSubCommand(2, false, ["clan"]);
		//$data->register();
		//$this->setPermission("");
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(isset($args[0])  && (!SpaceChecker::check($args))){
			$p = explode(",", $args[0]);
			$pos = new Vector($p[0], $p[1], $p[2]);
		}else{
			$pos = Main::getInstance()->getEditSession($sender)->getPlacementPosition($sender);
		}

		Main::getInstance()->getEditSession($sender)->getRegionSelector($sender->getLevel())->selectSecondary($pos);
		Main::getInstance()->getEditSession($sender)->getRegionSelector($sender->getLevel())->explainSecondarySelection($sender);
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\command\util\FlagChecker;
use edit\command\util\HelpChecker;
use edit\command\util\SpaceChecker;

class PyramidCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"ãƒ”ãƒ©ãƒŸãƒƒãƒ‰ã‚’ç”Ÿæˆã—ã¾ã™",
			"//pyramid <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <ã‚µã‚¤ã‚º>"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aãƒ”ãƒ©ãƒŸãƒƒãƒ‰ã‚’ç”Ÿæˆã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//pyramid <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <ã‚µã‚¤ã‚º>\n".
					     "Â§cãƒ•ãƒ©ã‚°: Â§a-h: ç©ºæ´žã«ã—ã¾ã™");
			return false;
		}

		$check = FlagChecker::check($args);

		$args = $check[0];
		$flags = $check[1];

		if(count($args) < 2){
			$sender->sendMessage("Â§cä½¿ã„æ–¹: Â§a//pyramid <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <ã‚µã‚¤ã‚º>");
			return true;
		}

		$hollow = false;

		foreach($flags as $flag){
			switch($flag){
				case "h":
					$hollow = true;
					break;
			}
		}

		$session = Main::getInstance()->getEditSession($sender);


		$pos = $session->getPlacementPosition($sender);

		$fill = Main::getInstance()->getPatternFactory()->parseFromInput($args[0]);

		$affected = $session->makePyramid($pos, $fill, (int) $args[1], !$hollow);
		$session->remember();
		Main::findFreePosition($sender);
		$sender->sendMessage(Main::LOGO.$affected."ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç”Ÿæˆã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\command\util\HelpChecker;
use edit\command\util\SpaceChecker;

class RedoCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"ã‚„ã‚Šç›´ã™",
			"//redo [å›žæ•°]"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aã‚„ã‚Šç›´ã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//redo [å›žæ•°]");
			return false;
		}

		$session = Main::getInstance()->getEditSession($sender);

		$session->redo();
		$sender->sendMessage(Main::LOGO."ã‚„ã‚Šç›´ã—ã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\functions\pattern\Pattern;
use edit\functions\mask\BlockMask;
use edit\command\util\HelpChecker;
use edit\command\util\DefinedChecker;
use edit\command\util\SpaceChecker;

class ReplaceCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"ç¯„å›²å†…ã®ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç½®ãæ›ãˆã¾ã™",
			"//replace [ç½®ãæ›ãˆã‚‹ãƒ–ãƒ­ãƒƒã‚¯] <ç½®ããƒ–ãƒ­ãƒƒã‚¯>"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aç¯„å›²å†…ã®ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç½®ãæ›ãˆã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//replace [ç½®ãæ›ãˆã‚‹ãƒ–ãƒ­ãƒƒã‚¯] <ç½®ããƒ–ãƒ­ãƒƒã‚¯>");
			return false;
		}

		if(DefinedChecker::checkPosition($sender)) {
			return fasle;
		}

		if(count($args) < 2){
			return true;
		}

		$items = explode(",", $args[0]);
		$blocks = [];

		foreach($items as $item){
			$blocks[] = Main::getInstance()->getBlockFactory()->parseFromInput($item);
		}

		$session = Main::getInstance()->getEditSession($sender);
		$mask = new BlockMask($session, $blocks);
		$pattern = Main::getInstance()->getPatternFactory()->parseFromInput($args[1]);

		$affected = $session->replaceBlocks($session->getRegionSelector($sender->getLevel())->getRegion(), $mask, $pattern);
		$session->remember();
		$sender->sendMessage(Main::LOGO.$affected."ãƒ–ãƒ­ãƒƒã‚¯ã‚’è¨­ç½®ã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\functions\operation\Operations;
use edit\command\util\FlagChecker;
use edit\command\util\HelpChecker;
use edit\command\util\DefinedChecker;
use edit\math\transform\AffineTransform;
use edit\command\util\SpaceChecker;

class RotateCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’å›žè»¢ã—ã¾ã™",
			"//rotate <Yè»¸> [<Xè»¸>] [<Zè»¸>]"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’å›žè»¢ã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//rotate <Yè»¸> [<Xè»¸>] [<Zè»¸>]");
			return false;
		}

		if(DefinedChecker::checkClipboard($sender)) {
			return false;
		}

		if(count($args) < 1){
			$sender->sendMessage("Â§cä½¿ã„æ–¹: Â§a//rotate <Yè»¸> [<Xè»¸>] [<Zè»¸>]");
			return;
		}

		$session = Main::getInstance()->getEditSession($sender);

		$holder = $session->getClipboard();
		$transform = new AffineTransform();
		$transform = $transform->rotateY(-(isset($args[0]) ? $args[0] : 0));
		$transform = $transform->rotateX(-(isset($args[1]) ? $args[1] : 0));
		$transform = $transform->rotateZ(-(isset($args[2]) ? $args[2] : 0));
		$holder->setTransform($holder->getTransform()->combine($transform));

		$sender->sendMessage(Main::LOGO."ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ã‚’å›žè»¢ã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\functions\pattern\Pattern;
use edit\command\util\HelpChecker;
use edit\command\util\DefinedChecker;
use edit\command\util\SpaceChecker;

class SetCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"é¸æŠžã—ãŸç¯„å›²ã‚’æŒ‡å®šã—ãŸãƒ–ãƒ­ãƒƒã‚¯ã«ç½®æ›ã—ã¾ã™",
			"//set <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³>"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aé¸æŠžã—ãŸç¯„å›²ã‚’æŒ‡å®šã—ãŸãƒ–ãƒ­ãƒƒã‚¯ã«ç½®æ›ã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//set <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³>");
			return false;
		}

		if(DefinedChecker::checkPosition($sender)) {
			return false;
		}

		if(count($args) < 1){
			$sender->sendMessage("Â§cä½¿ã„æ–¹: Â§a//set <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³>");
			return true;
		}

		$pattern = Main::getInstance()->getPatternFactory()->parseFromInput($args[0]);

		$session = Main::getInstance()->getEditSession($sender);

		$affected = $session->setBlocks($session->getRegionSelector($sender->getLevel())->getRegion()->iterator(), $pattern);
		echo($affected);
		$session->remember();
		$sender->sendMessage(Main::LOGO.$affected."ãƒ–ãƒ­ãƒƒã‚¯ã‚’è¨­ç½®ã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\functions\pattern\Pattern;
use edit\math\convolution\HeightMap;
use edit\math\convolution\HeightMapFilter;
use edit\math\convolution\GaussianKernel;
use edit\command\util\HelpChecker;
use edit\command\util\DefinedChecker;
use edit\command\util\SpaceChecker;

class SmoothCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"é¸æŠžã—ãŸç¯„å›²ã®ãƒ–ãƒ­ãƒƒã‚¯ã‚’æ»‘ã‚‰ã‹ã«ã—ã¾ã™",
			"//smooth <å›žæ•°>"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aé¸æŠžã—ãŸç¯„å›²ã®ãƒ–ãƒ­ãƒƒã‚¯ã‚’æ»‘ã‚‰ã‹ã«ã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//smooth <å›žæ•°>");
			return false;
		}

		if(DefinedChecker::checkPosition($sender)) {
			return false;
		}

		if(empty($args[0])) $args[0] = 1;

		$session = Main::getInstance()->getEditSession($sender);
		$region = $session->getRegionSelector($sender->getLevel())->getRegion();
		$heightMap = new HeightMap($session, $region);
		$filter = new HeightMapFilter(new GaussianKernel(5, 1.0));
		$affected = $heightMap->applyFilter($filter, $args[0]);
		$sender->sendMessage(Main::LOGO.$affected."ãƒ–ãƒ­ãƒƒã‚¯ã‚’è¨­ç½®ã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\functions\pattern\Pattern;
use edit\command\util\FlagChecker;
use edit\command\util\HelpChecker;
use edit\command\util\SpaceChecker;

class SphereCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"çƒä½“ã‚’ç”Ÿæˆã—ã¾ã™",
			"//sphere <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>,<åŠå¾„>] [é ­ä¸Š?]"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§açƒä½“ã‚’ç”Ÿæˆã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//sphere <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>,<åŠå¾„>] [é ­ä¸Š?]\n".
					     "Â§cãƒ•ãƒ©ã‚°: Â§a-h: ç©ºæ´žã«ã—ã¾ã™");
			return false;
		}

		$copyEntities = false;

		$check = FlagChecker::check($args);

		$args = $check[0];
		$flags = $check[1];

		if(count($args) < 2){
			$sender->sendMessage("Â§cä½¿ã„æ–¹: //sphere <ãƒ–ãƒ­ãƒƒã‚¯ãƒ‘ã‚¿ãƒ¼ãƒ³> <åŠå¾„>[,<åŠå¾„>,<åŠå¾„>] [é ­ä¸Š?]");
			return true;
		}

		$hollow = false;

		foreach($flags as $flag){
			switch($flag){
				case "h":
					$hollow = true;
					break;
			}
		}

		$radii = explode(",", $args[1]);

		switch(count($radii)){
			case 1:
				$radiusX = $radiusY = $radiusZ = (float) $radii[0];
				break;
			case 3:
				$radiusX = (float) $radii[0];
				$radiusY = (float) $radii[1];
				$radiusZ = (float) $radii[2];
				break;
			default:
				$sender->sendMessage("åŠå¾„ã®å€¤ãŒéŽä¸è¶³ã—ã¦ã„ã¾ã™");
				return true;
		}

		$session = Main::getInstance()->getEditSession($sender);

		//$raised = 

		$pos = $session->getPlacementPosition($sender);
		//if($raised){
		//	$pos = $pos->add(0, $radiusY, 0);
		//}

		$fill = Main::getInstance()->getPatternFactory()->parseFromInput($args[0]);

		$affected = $session->makeSphere($pos, $fill, $radiusX, $radiusY, $radiusZ, !$hollow);
		$session->remember();
		Main::findFreePosition($sender);
		$sender->sendMessage(Main::LOGO.$affected."ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç”Ÿæˆã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\block\Block;
use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\blocks\BaseBlock;
use edit\functions\operation\Operations;
use edit\command\util\FlagChecker;
use edit\command\util\HelpChecker;
use edit\command\util\DefinedChecker;
use edit\math\transform\AffineTransform;
use edit\command\util\SpaceChecker;

class StackCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"é¸æŠžã—ãŸç¯„å›²ã‚’ç¹°ã‚Šè¿”ã—ã¾ã™",
			"//stack [å›žæ•°] [æ–¹å‘]"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aé¸æŠžã—ãŸç¯„å›²ã‚’ç¹°ã‚Šè¿”ã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//stack [å›žæ•°] [æ–¹å‘]\n".
					     "Â§cãƒ•ãƒ©ã‚°: Â§a-s: ç§»å‹•å¾Œã®ç¯„å›²ã‚’é¸æŠžã—ã¾ã™\n".
					     "Â§c      : Â§a-a: ç©ºæ°—ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç„¡è¦–ã—ã¾ã™");
			return false;
		}

		if(DefinedChecker::checkPosition($sender)) {
			return false;
		}

		$check = FlagChecker::check($args);

        $args = $check[0];
        $flags = $check[1];

		$moveSelection = false;
		$ignoreAirBlocks = false;

		foreach($flags as $flag){
			switch($flag){
				case "s":
					$moveSelection = true;
					break;
				case "a":
					$ignoreAirBlocks = true;
					break;
			}
		}

		$count = 1;
		if(isset($args[0])) $count = (int) $args[0];

		if(count($args) < 2){
			$direction = Main::getCardinalDirection($sender);
		}else{
			$direction = Main::getFlipDirection($sender, $args[1]);
		}

		$session = Main::getInstance()->getEditSession($sender);

		$affected = $session->stackCuboidRegion($session->getRegionSelector($sender->getLevel())->getRegion(), $direction, $count, !$ignoreAirBlocks);
		$session->remember();
		$sender->sendMessage(Main::LOGO.$affected."ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç”Ÿæˆã—ã¾ã—ãŸ");
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

namespace edit\command\tool\brush;

use edit\Vector;
use edit\EditSession;
use edit\functions\pattern\Pattern;

interface Brush{

	public function build(EditSession $editSession, Vector $position, ?Pattern $pattern, float $size);
}<?php

namespace edit\command\tool\brush;

use edit\Vector;
use edit\EditSession;
use edit\WorldVector;
use edit\functions\pattern\Pattern;
use edit\functions\operation\Operations;
use edit\session\ClipboardHolder;

class ClipboardBrush implements Brush{

	private $holder;
	private $ignoreAirBlocks;
	private $usingOrigin;

	public function __construct(ClipboardHolder $holder, bool $ignoreAirBlocks, bool $usingOrigin){
		$this->holder = $holder;
		$this->ignoreAirBlocks = $ignoreAirBlocks;
		$this->usingOrigin = $usingOrigin;
	}

	public function build(EditSession $editSession, Vector $position, ?Pattern $pattern, float $size){
		$clipboard = $this->holder->getClipboard();
		$region = $clipboard->getRegion();
		$centerOffset = $region->getCenter()->subtract($clipboard->getOrigin());

		$operation = $holder->createPaste($editSession, $editSession->getPlayer()->getLevel())
				->to($this->usingOrigin ? $position : $position->subtract($centerOffset))
				->ignoreAirBlocks($this->ignoreAirBlocks)
				->build();

		Operations::completeLegacy($operation);
	}
}
<?php

namespace edit\command\tool\brush;

use edit\Vector;
use edit\EditSession;
use edit\WorldVector;
use edit\functions\pattern\Pattern;

class CylinderBrush implements Brush{

	private $height;

	public function __construct(int $height){
		$this->height = $height;
	}

	public function build(EditSession $editSession, Vector $position, ?Pattern $pattern, float $size){
		$editSession->makeCylinder($position, $pattern, $size, $size, $this->height, true);
	}
}<?php

namespace edit\command\tool\brush;

use pocketmine\block\Block;

use edit\Vector;
use edit\EditSession;
use edit\WorldVector;
use edit\blocks\BaseBlock;
use edit\functions\pattern\Pattern;

class GravityBrush implements Brush{

	private $fullHeight;

	public function __construct(bool $fullHeight){
		$this->fullHeight = $fullHeight;
	}

	public function build(EditSession $editSession, Vector $position, ?Pattern $pattern, float $size){
		$air = new BaseBlock(Block::AIR, 0);
		$startY = $this->fullHeight ? 255 : $position->getBlockY() + $size;
		for($x = $position->getBlockX() + $size;$x > $position->getBlockX() - $size;--$x){
			for($z = $position->getBlockZ() + $size;$z > $position->getBlockZ() - $size;--$z){
				$y = $startY;
				$blockTypes = [];
				for(;$y > $position->getBlockY() - $size;--$y){
					$pt = new Vector($x, $y, $z);
					$block = $editSession->getBlock($pt);
					if($block->getId() != Block::AIR){
						$blockTypes[] = $block;
						$editSession->setBlock($pt, $air);
					}
				}
				$pt = new Vector($x, $y, $z);
				$blockTypes = array_reverse($blockTypes);
				for($i = 0;$i < count($blockTypes);){
					if($editSession->getBlock($pt)->getId() == Block::AIR){
						$editSession->setBlock($pt, $blockTypes[$i++]);
					}
					$pt = $pt->add(0, 1, 0);
				}
			}
		}
	}
}<?php

namespace edit\command\tool\brush;

use edit\Vector;
use edit\EditSession;
use edit\WorldVector;
use edit\functions\pattern\Pattern;

class HollowCylinderBrush implements Brush{

	private $height;

	public function __construct(int $height){
		$this->height = $height;
	}

	public function build(EditSession $editSession, Vector $position, ?Pattern $pattern, float $size){
		$editSession->makeCylinder($position, $pattern, $size, $size, $this->height, false);
	}
}<?php

namespace edit\command\tool\brush;

use edit\Vector;
use edit\EditSession;
use edit\WorldVector;
use edit\regions\CuboidRegion;
use edit\functions\pattern\Pattern;

class HollowSphereBrush implements Brush{

	public function build(EditSession $editSession, Vector $position, ?Pattern $pattern, float $size){
		$editSession->makeSphere($position, $pattern, $size, $size, $size, false);
	}
}<?php

namespace edit\command\tool\brush;

use edit\Vector;
use edit\EditSession;
use edit\WorldVector;
use edit\regions\CuboidRegion;
use edit\math\convolution\HeightMap;
use edit\math\convolution\HeightMapFilter;
use edit\math\convolution\GaussianKernel;
use edit\functions\pattern\Pattern;

class SmoothBrush implements Brush{

	private $iterations;
	private $naturalOnly;

	public function __construct(int $iterations, bool $naturalOnly = false){
		$this->iterations = $iterations;
		$this->naturalOnly = $naturalOnly;
	}

	public function build(EditSession $editSession, Vector $position, ?Pattern $pattern, float $size){
		$min = new WorldVector($editSession->getWorld(), $position->subtract($size, $size, $size));
		$max = $position->add($size, $size + 10, $size);
		$region = new CuboidRegion($min, $max);
		$heightMap = new HeightMap($editSession, $region, $this->naturalOnly);
		$filter = new HeightMapFilter(new GaussianKernel(5, 1.0));
		$heightMap->applyFilter($filter, $this->iterations);
	}
}<?php

namespace edit\command\tool\brush;

use edit\Vector;
use edit\EditSession;
use edit\WorldVector;
use edit\functions\pattern\Pattern;

class SphereBrush implements Brush{

	public function build(EditSession $editSession, Vector $position, ?Pattern $pattern, float $size){
		$editSession->makeSphere($position, $pattern, $size, $size, $size, true);
	}
}<?php

namespace edit\command\tool;

use pocketmine\Player;

use edit\Vector;
use edit\command\tool\brush\Brush;
use edit\command\tool\brush\SphereBrush;
use edit\command\tool\brush\SmoothBrush;
use edit\command\tool\brush\GravityBrush;
use edit\functions\mask\Mask;
use edit\functions\mask\MaskIntersection;
use edit\functions\pattern\Pattern;
use edit\Main;

class BrushTool implements TraceTool{

	const MAX_RANGE = 500;

	protected $range = -1;
	private $mask = null;
	private $brush;
	private $material;
	private $size = 1;

	public function __construct(){
		$this->brush = new SphereBrush();
	}

	public function canUse(Player $player) : bool{
		return true;
	}

	public function getMask() : ?Mask{
		return $this->mask;
	}

	public function setMask(?Mask $filter){
		$this->mask = $filter;
	}

	public function setBrush(Brush $brush){
		$this->brush = $brush;
	}

	public function getBrush() : Brush{
		return $this->brush;
	}

	public function setFill(Pattern $pattern){
		$this->material = $pattern;
	}

	public function getMaterial() : ?Pattern{
		return $this->material;
	}

	public function getSize() : float{
		return $this->size;
	}

	public function setSize(float $size){
		$this->size = $size;
	}

	public function getRange() : int{
		return ($this->range < 0) ? self::MAX_RANGE : min($this->range, self::MAX_RANGE);
	}

	public function setRange(int $range){
		$this->range = $range;
	}

	public function actPrimary(Player $player) : bool{
		$target = null;
		$target = Main::getBlockTrace($player, $this->getRange(), true);

		if($target == null){
			$player->sendMessage("No block in sight!");
			return true;
		}
		if(!($this->getBrush() instanceof SmoothBrush) && !($this->getBrush() instanceof GravityBrush)){
			$dir = $player->getDirectionVector();
			$target = new Vector($player->x + (($dir->x * 2) * $this->getSize()), $player->y + (($dir->y * 2) * $this->getSize()) + $player->getEyeHeight(), $player->z + (($dir->z * 2) * $this->getSize()));
		}

		$editSession = Main::getInstance()->getEditSession($player);

		$existingMask = null;
		if($this->mask != null){
			$existingMask = $editSession->getMask();

			if($existingMask == null) {
				$editSession->setMask([$this->mask]);
			}else if($existingMask instanceof MaskIntersection){
				$existingMask->add([$this->mask]);
			}else{
				$newMask = new MaskIntersection([$existingMask]);
				$newMask->add([$this->mask]);
				$editSession->setMask($newMask);
			}
		}
		$this->brush->build($editSession, $target, $this->material, $this->size);

		if($existingMask != null) $editSession->setMask($existingMask);

		$editSession->remember();
		return true;
	}
}<?php

namespace edit\command\tool;

use pocketmine\Player;

interface Tool {

	public function canUse(Player $player) : bool;

}<?php

namespace edit\command\tool;

use pocketmine\Player;

interface TraceTool extends Tool {

	public function actPrimary(Player $player) : bool;
}<?php

declare(strict_types=1);

namespace edit\command;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\defaults\VanillaCommand;
use pocketmine\Player;

use edit\Vector;
use edit\Main;
use edit\command\util\HelpChecker;
use edit\command\util\SpaceChecker;

class UndoCommand extends VanillaCommand{

	public function __construct(string $name){
		parent::__construct(
			$name,
			"å…ƒã«æˆ»ã™",
			"//undo [å›žæ•°]"
		);
	}

	public function execute(CommandSender $sender, string $commandLabel, array $args){
		if(!$this->testPermission($sender)){
			return true;
		}

		if(!($sender instanceof Player)){
			return true;
		}

		if(!Main::$canUseNotOp && !$sender->isOp()){
			return false;
		}

		if(HelpChecker::check($args) || SpaceChecker::check($args)){
			$sender->sendMessage("Â§cåŠ¹æžœ: Â§aå…ƒã«æˆ»ã—ã¾ã™\n".
					     "Â§cä½¿ã„æ–¹: Â§a//undo [å›žæ•°]");
			return false;
		}

		$session = Main::getInstance()->getEditSession($sender);

		$times = isset($args[0]) ? max(1, $args[0]) : 1;

		for($i = 0;$i < $times;$i++){
			$undone = false;
			$undone = $session->undo();
			if($undone) $sender->sendMessage(Main::LOGO."å…ƒã«æˆ»ã—ã¾ã—ãŸ");
		}
		Main::getInstance()->getServer()->broadcastMessage("Â§7".Main::LOGO.$sender->getName()." ãŒ /".$this->getName()." ã‚’åˆ©ç”¨");
		return true;
	}
}<?php

namespace edit\command\util;

use pocketmine\Player;

use edit\Main;
use edit\command\tool\brush\HollowCylinderBrush;
use edit\command\tool\brush\CylinderBrush;
use edit\command\tool\brush\SphereBrush;
use edit\functions\pattern\Pattern;

class DefinedChecker{

    public static function checkPosition(Player $player) : bool{
        if(!Main::getInstance()->getEditSession($player)->getRegionSelector($player->getLevel())->isDefined()) {
            $player->sendMessage(Main::LOGO."åº§æ¨™ãŒã‚»ãƒƒãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“");
            return true;
        }
        return false;
    }

    public static function checkClipboard(Player $player) : bool{
        if(Main::getInstance()->getEditSession($player)->getClipboard() == null) {
            $player->sendMessage(Main::LOGO."ã‚¯ãƒªãƒƒãƒ—ãƒœãƒ¼ãƒ‰ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“");
            return true;
        }
        return false;
    }

    public static function checkBrush(Player $player) {
        $tool = Main::getInstance()->getBrushTool($player->getInventory()->getItemInHand(), $player);
        $brush = $tool->getBrush();
        if($brush instanceof SphereBrush or $brush instanceof CylinderBrush or $brush instanceof HollowCylinderBrush) {
            if(!$tool->getMaterial() instanceof Pattern) {
                return true;
            }
        }
        return false;
    }
}<?php

namespace edit\command\util;

class FlagChecker{

	public static function check(array $args) : array{
		$flags = [];
		$k = null;

		foreach($args as $key => $arg){
			if(substr($arg, 0, 1) == "-"){
				$str = substr($arg, 1);
				$flags = str_split($str);
				$k = $key;
			}
		}
		if($k != null) unset($args[$k]);
		array_values($args);

		return [$args, $flags];
	}
}<?php

namespace edit\command\util;

class HelpChecker{

    public static function check(array $args) : bool{
        if(isset($args[0])) {
            if($args[0] == "help") {
                return true;
            }
        }
        return false;
    }
}<?php

namespace edit\command\util;

class SpaceChecker{

    public static function check(array $args) : bool{
        foreach ($args as $value) {
            if ($value === "") {
                return true;
            } 
        }
        return false;
    }
}<?php

namespace edit;

class CuboidClipboard{

	const NORTH_SOUTH = 0;
	const WEAST_EAST = 1;
	const UP_DOWN = 2;

	private $data;
	private $offset;
	private $origin;
	private $size;
	private $entities = [];

	public function __construct($size, $origin, $offset){
		$this->size = $size;
		$this->data = [];
		$this->origin = $origin instanceof Vector ? $origin : new Vector();
		$this->offset = $offset instanceof Vector ? $offset : new Vector();
	}

	public function getWidth(){
		return $this->size->getBlockX();
	}

	public function getLength(){
		return $this->size->getBlockZ();
	}

	public function getHeight(){
		return $this->size->getBlockY();
	}

	public function rotate2D($angle){
		$angle = $angle % 360;
		if($angle % 90 != 0){
			return;
		}
		$reverse = $angle < 0;
		$numRotations = abs((int) floor($angle / 90.0));

		$width = $this->getWidth();
		$length = $this->getLength();
		$helght = $this->getHeight();
		$sizeRotated = $size->transform2D($angle, 0, 0, 0, 0);
		$shiftX = $sizeRotated->getX() < 0 ? -$sizeRotated->getBlockX() - 1 : 0;
		$shiftZ = $sizeRotated->getZ() < 0 ? -$sizeRotated->getBlockZ() - 1 : 0;

		$newData = [];

		for($x = 0;$x < $width;$x++){
			for($z = 0;$z < $length;$z++){
				$v = new Vector2D($x, $z)->transform2D($angle, 0, 0, $shiftX, $shiftZ);
				$newX = $v->getBlockX();
				$newZ = $v->getBlockZ();
				for($y = 0;$y < $helght;$y++){
					$block = $this->data[$x][$y][$z];
					$newData[$newX][$y][$newZ] = $block;

					if($block == null){
						continue;
					}

					if($reverse){
						for($i = 0;$i < $numRotations;$i++){
							$block->rotate90Reverse();
						}
					}else{
						for($i = 0;$i < $numRotations;$i++){
							$block->rotate90();
						}
					}
				}
			}
		}

		$this->data = $newData;
		$this->size = new Vector(abs($sizeRotated->getBlockX()),
					abs($sizeRotated->getBlockY()),
					abs($sizeRotated->getBlockZ()));
		$this->offset = $this->offset->transform2D($angle, 0, 0, 0, 0)
				->subtract($shiftX, 0, $shiftZ);
	}

	public function flip($dir, $aroundPlayer = false){
		$width = $this->getWidth();
		$length = $this->getLength();
		$helght = $this->getHeight();

		switch($dir){
			case self::WEST_EAST:
				$wid = (int) ceil($width / 2.0);
				for($xs = 0;$xs < $wid;$xs++){
					for($z = 0;$z < $length;$z++){
						for($y = 0;$y < $height;$y++){
							$block1 = $this->data[$xs][$y][$z];
							if($block1 != null){
								$block1->flip($dir);
							}

							if($xs == $width - $xs - 1){
								continue;
							}

							$block2 = $this->data[$width - $xs - 1][$y][$z];
							if($block2 != null){
								$block2->flip($dir);
							}

							$this->data[$xs][$y][$z] = $block2;
							$this->data[$width - $xs - 1][$y][$z] = $block1;
						}
					}
				}

				if($aroundPlayer){
					$this->offset = $this->offset->setX(1 - $this->offset->getX() - $width);
				}

				break;
			case self::WEST_EAST:
				$len = (int) ceil($length / 2.0);
				for($zs = 0;$zs < $len;$zs++){
					for($x = 0;$x < $width;$x++){
						for($y = 0;$y < $height;$y++){
							$block1 = $this->data[$x][$y][$zs];
							if($block1 != null){
								$block1->flip($dir);
							}

							if($zs == $length - $zs - 1){
								continue;
							}

							$block2 = $this->data[$x][$y][$length - $zs - 1];
							if($block2 != null){
								$block2->flip($dir);
							}

							$this->data[$x][$y][$zs] = $block2;
							$this->data[$x][$y][$length - $zs - 1] = $block1;
						}
					}
				}

				if($aroundPlayer){
					$this->offset = $this->offset->setZ(1 - $this->offset->getZ() - $length);
				}

				break;
			case self::WEST_EAST:
				$hei = (int) ceil($height / 2.0);
				for($ys = 0;$ys < $hei;$ys++){
					for($x = 0;$x < $width;$x++){
						for($z = 0;$z < $length;$z++){
							$block1 = $this->data[$x][$ys][$z];
							if($block1 != null){
								$block1->flip($dir);
							}

							if($ys == $height - $ys - 1){
								continue;
							}

							$block2 = $this->data[$x][$height - $ys - 1][$z];
							if($block2 != null){
								$block2->flip($dir);
							}

							$this->data[$x][$ys][$z] = $block2;
							$this->data[$x][$height - $ys - 1][$z] = $block1;
						}
					}
				}

				if($aroundPlayer){
					$this->offset = $this->offset->setY(1 - $this->offset->getY() - $height);
				}

				break;
		}
	}

	public function copy($editSession, $region = null){
		if($region instanceof Region){
			for($x = 0;$x < $this->size->getBlockX();$x++){
				for($y = 0;$y < $this->size->getBlockY();$y++){
					for($z = 0;$z < $this->size->getBlockZ();$z++){
						$pt = new Vector($x, $y, $z)->add($this->getOrigin());
						if($region->contains($pt)){
							$data[$x][$y][$z] = $editSession->getBlock($pt);
						}else{
							$data[$x][$y][$z] = null;
						}
					}
				}
			}
		}else{
			for($x = 0;$x < $this->size->getBlockX();$x++){
				for($y = 0;$y < $this->size->getBlockY();$y++){
					for($z = 0;$z < $this->size->getBlockZ();$z++){
						$this->data[$x][$y][$z] = $editSession->getBlock(new Vector($x, $y, $z)->add($this->getOrigin()));
					}
				}
			}
		}
	}

	public function paste($editSession, $newOrigin, $noAir, $entities = false){
		$this->place($editSession, $newOrigin->add($this->offset), $noAir);
		if($entities){
			$this->pasteEntities($newOrigin->add($this->offset));
		}
	}

	public function paste($editSession, $newOrigin, $noAir){
		for($x = 0;$x < $this->size->getBlockX();$x++){
			for($y = 0;$y < $this->size->getBlockY();$y++){
				for($z = 0;$z < $this->size->getBlockZ();$z++){
					$block = $this->data[$x][$y][$z];
					if($block == null){
						continue;
					}

					if($noAir && $block->isAir()){
						continue;
					}

					$editSession->setBlock(new Vector($x, $y, $z)->add($newOrigin), $block);
				}
			}
		}
	}

	public function pasteEntities($newOrigin){
		$entities = [];
		for($i = 0;$i < count($this->entities);$i++){
			$copied = $this->entities[$i];
			if($copied->entity->spawn($copied->entity->getPosition()->setPosition($copied->relativePosition->add($newOrigin)))){
				$entities[$i] = $copied->entity;
			}
		}
		return $entities;
	}

	public function storeEntity($entity){
		$this->entities->add(new CopiedEntity($entity));
	}

	public function getPoint($position){
		$block = $this->getBlock($position);
		if($block == null){
			return new BaseBlock(BlockID::AIR);
		}

		return $block;
	}

	public function getBlock($position){
		return $this->data[$position->getBlockX()][$position->getBlockY()][$position->getBlockZ()];
	}

	public function setBlock($position, $block){
		$this->data[$position->getBlockX()][$position->getBlockY()][$position->getBlockZ()] = $block;
	}

	public function getSize(){
		return $this->size;
	}

	public function saveSchematic($path){
		SchematicFormat::MCEDIT->save($this, $path);
	}

	public function loadSchematic($path){
		return SchematicFormat::MCEDIT->load($path);
	}

	public function getOrigin(){
		return $this->origin;
	}

	public function setOrigin($origin){
		$this->origin = $origin;
	}

	public function getOffset(){
		return $this->offset;
	}

	public function setOffset($offset){
		$this->offset = $offset;
	}

	public function getBlockDistribution(){
		$distribution = [];
		$map = [];

		$maxX = $this->getWidth();
		$maxY = $this->getHeight();
		$maxZ = $this->getLength();

		for($x = 0;$x < $maxX;$x++){
			for($y = 0;$y < $maxY;$y++){
				for($z = 0;$z < $maxZ;$z++){
					$block = $this->data[$x][$y][$z];
					if($block == null){
						continue;
					}

					$id = $block->getId();

					if(isset($map[$id])){
						$map[$id]->increment();
					}else{
						$c = new Countable($id, 1);
						$map[$id] = $c;
						$distribution[] = $c;
					}
				}
			}
		}

		//sort;

		return $distribution;
	}

	public function getBlockDistributionWithData(){
		$distribution = [];
		$map = [];

		$maxX = $this->getWidth();
		$maxY = $this->getHeight();
		$maxZ = $this->getLength();

		for($x = 0;$x < $maxX;$x++){
			for($y = 0;$y < $maxY;$y++){
				for($z = 0;$z < $maxZ;$z++){
					$block = $this->data[$x][$y][$z];
					if($block == null){
						continue;
					}

					$bareBlock = new BaseBlock($block->getId(), $block->getDamage());

					if(isset($map[$bareBlock])){
						$map[$bareBlock]->increment();
					}else{
						$c = new Countable($bareBlock, 1);
						$map[$bareBlock] = $c;
						$distribution[] = $c;
					}
				}
			}
		}

		//sort;

		return $distribution;
	}

}
class CopiedEntity{
	public $entity;
	public $relativePosition;

	public function __construct($entity){
		$this->entity = $entity;
		$this->relativePosition = $entity0>getPosition()->subtract($this->getOrigin());
	}
}<?php

namespace edit;

use pocketmine\block\Block;
use pocketmine\level\Level;
use pocketmine\math\Vector3;
use pocketmine\Player;
use pocketmine\entity\Entity;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\nbt\tag\DoubleTag;
use pocketmine\nbt\tag\FloatTag;
use pocketmine\nbt\tag\ListTag;
use pocketmine\nbt\tag\StringTag;

use edit\blocks\BaseBlock;
use edit\blocks\BlockType;
use edit\command\tool\BrushTool;
use edit\command\tool\brush\SmoothBrush;
use edit\extent\Extent;
use edit\extent\buffer\ForgetfulExtentBuffer;
use edit\functions\block\BlockReplace;
use edit\functions\mask\Mask;
use edit\functions\mask\Masks;
use edit\functions\mask\ExistingBlockMask;
use edit\functions\mask\RegionMask;
use edit\functions\operation\Operation;
use edit\functions\operation\OperationQueue;
use edit\functions\operation\Operations;
use edit\functions\operation\ForwardExtentCopy;
use edit\functions\pattern\BlockPattern;
use edit\functions\pattern\Pattern;
use edit\functions\util\RegionOffset;
use edit\functions\visitor\LayerVisitor;
use edit\functions\visitor\RegionVisitor;
use edit\functions\RegionMaskingFilter;
use edit\functions\GroundFunction;
use edit\history\ChangeMemory;
use edit\history\change\BlockChange;
use edit\history\change\EntityCreate;
use edit\math\transform\AffineTransform;
use edit\regions\selector\CuboidRegionSelector;
use edit\regions\RegionSelector;
use edit\regions\Region;
use edit\session\ClipboardHolder;
use edit\util\Location;

class EditSession implements Extent{

	public $player;

	public $mask;
	public $clipboard;

	public $reorder = [];
	public $reorderUndo = [];

	public $changeMemory;

	public $history = [];
	public $historyPointer = -1;
	public $historyMax = -1;

	public $done = [];

	public function __construct($player){
		$this->player = $player;
		$this->regionSelector = new CuboidRegionSelector($player->getLevel());
		$this->mask = Masks::alwaysTrue();
		$this->changeMemory = new ChangeMemory();
	}

	public function getPlayer() : Player{
		return $this->player;
	}

	public function setPlayer(Player $player){
		$this->player = $player;
	}

	public function getWorld() : Level{
		return $this->player->getLevel();
	}

	public function getRegionSelector(Level $world) : RegionSelector{
		return $this->regionSelector;
	}

	public function setRegionSelector(Level $world, RegionSelector $selector){
		$this->regionSelector = $selector;
	}

	public function getBlock(Vector $pt) : BaseBlock{
		$block = $this->player->getLevel()->getBlock(new Vector3($pt->getX(), $pt->getY(), $pt->getZ()));
		return new BaseBlock($block->getId(), $block->getDamage());
	}

	public function getClipboard() : ?ClipboardHolder{
		if($this->clipboard == null) return null;
		return $this->clipboard;
	}

	public function setClipboard(ClipboardHolder $clipboard){
		$this->clipboard = $clipboard;
	}

	public function getPlacementPosition(Player $player) : Vector{
		$v =  new Vector($player->x, $player->y, $player->z);
		return $v->floor();
	}

	public function remember(){
		$this->reorder();
		$this->historyPointer++;
		$this->historyMax++;
		$this->history[$this->historyPointer] = $this->changeMemory;
		foreach($this->history as $k => $h){
			if($k > $this->historyPointer) unset($this->history[$k]);
		}
		$this->changeMemory = new ChangeMemory();
		$this->done = [];
	}

	public function undo(){
		if($this->historyPointer <= -1) return;
		$this->history[$this->historyPointer]->undo($this);
		$this->reorderUndo();
		$this->historyPointer--;
	}

	public function redo(){
		if(count($this->history) <= $this->historyPointer + 1) return;
		$this->history[$this->historyPointer + 1]->redo($this);
		$this->reorderUndo();
		$this->historyPointer++;
	}

	public function getMinimumPoint() : Vector{
		return new Vector(0, 0, 0);
	}

	public function getMaximumPoint() : Vector{
		return new Vector(0, 0, 0);
	}

	public function createEntity(Location $location, Entity $entity) : ?Entity{
		$skin = $entity->getSkin();
		$nbt = new CompoundTag("", [
			new ListTag("Pos", [
				new DoubleTag("", $location->getX()),
				new DoubleTag("", $location->getY()),
				new DoubleTag("", $location->getZ())
			]),
			new ListTag("Motion", [
				new DoubleTag("", 0),
				new DoubleTag("", 0),
				new DoubleTag("", 0)
			]),
			new ListTag("Rotation", [
				new FloatTag("", $location->getYaw()),
				new FloatTag("", $location->getPitch())
			]),
			"Skin" => new CompoundTag("Skin", [
				new StringTag("geometryData", $skin->getGeometryData()),
				new StringTag("geometryName", $skin->getGeometryName()),
				new StringTag("capeData", $skin->getCapeData()),
				new StringTag("Data", $skin->getSkinData()),
				new StringTag("Name", $skin->getSkinId())
			]),
		]);

		$newEntity = Entity::createEntity($entity->getSaveId(), $this->player->getLevel(), $nbt);
		for($i = 0;$i < 100;$i++){
			$data = $entity->getDataProperty($i);
			$type = $entity->getDataPropertyType($i);
			if($data !== null && $type !== null) $newEntity->setDataProperty($i, $type, $data);
		}
		for($i = 0;$i < 50;$i++){
			$data = $entity->getGenericFlag($i);
			if($data !== null) $newEntity->setGenericFlag($i, $data);
		}
		//$newEntity->setSkin($entity->getSkin());
		$newEntity->spawnToAll();
		$this->changeMemory->add(new EntityCreate($location, $newEntity));
		return $newEntity;
	}

	public function getEntities(?Region $region = null) : array{
		$entities = $this->player->getLevel()->getEntities();
		if($region === null) return $entities;
		$result = [];
		foreach($entities as $entity){
			$pt = new Vector($entity->x, $entity->y, $entity->z);
			if($region->contains($pt)) $result[] = $entity;
		}
		return $result;
	}

	public function commit() : ?Operation{
		return null;
	}

	public function reorderUndo(){
		foreach($this->reorderUndo as $o){
			$this->player->getLevel()->setBlock($o[0]->toVector3(), Block::get($o[1]->getType(), $o[1]->getData()));
		}
		$this->reorderUndo = [];
	}

	public function setBlockUndo(Vector $pt, BaseBlock $block) : bool{
		if(BlockType::shouldPlaceLast($block->getType()) || BlockType::shouldPlaceFinal($block->getType())){
			$this->reorderUndo[] = [$pt, $block];
			return true;
		}
		$this->player->getLevel()->setBlock($pt->toVector3(), Block::get($block->getType(), $block->getData()));
		return true;
	}

	public function reorder(){
		foreach($this->reorder as $o){
			$this->player->getLevel()->setBlock($o[0]->toVector3(), Block::get($o[1]->getType(), $o[1]->getData()));
		}
		$this->reorder = [];
	}

	public function setBlock(Vector $pt, $pattern) : bool{
		if(!$this->mask->test($pt)) return false;
		if(isset($this->done[(($pt->x & 0xFFFFFFF) << 36) | (($pt->y & 0xFF) << 28) | ($pt->z & 0xFFFFFFF)])) return false;
		else $this->done[(($pt->x & 0xFFFFFFF) << 36) | (($pt->y & 0xFF) << 28) | ($pt->z & 0xFFFFFFF)] = true;
		if($pattern instanceof Pattern) $pattern = $pattern->apply($pt);
		$this->changeMemory->add(new BlockChange($pt->toBlockVector(), $this->getBlock($pt), $pattern));
		if(BlockType::shouldPlaceLast($pattern->getType()) || BlockType::shouldPlaceFinal($pattern->getType())){
			$this->reorder[] = [$pt, $pattern];
			return true;
		}
		$this->player->getLevel()->setBlock($pt->toVector3(), Block::get($pattern->getType(), $pattern->getData()));
		return true;
	}

	public function setBlocks(array $vset, Pattern $pattern) : int{
		$affected = 0;
		foreach($vset as $v){
			$affected += $this->setBlock($v, $pattern) ? 1 : 0;
		}
		return $affected;
	}

	public function getMask() : Mask{
		return $this->mask;
	}

	public function setMask(Mask $mask){
		$this->mask = $mask;
	}

	public function getHighestTerrainBlock($x, $z, $minY, $maxY, $naturalOnly = false) : int{
		for($y = $maxY;$y >= $minY;$y--){
			$pt = new Vector($x, $y, $z);
			$block = $this->getBlock($pt);
			if($naturalOnly ? BlockType::isNaturalTerrainBlock($block->getId(), $block->getData()) : !BlockType::canPassThrough($block->getId(), $block->getData())){
				return $y;
			}
		}

		return $minY;
	}

	public function countBlock($region, $searchIDs){
		$passOn = [];
		foreach($searchIDs as $i){
			$passOn[] = new BaseBlock($i, -1);
		}
		return $this->countBlocks($region, $passOn);
	}

	public function countBlocks($region, $searchBlocks){
		$mask = new FuzzyBlockMask($this, $searchBlocks);
		$count = new Counter();
		$filter = new RegionMaskingFilter($mask, $count);
		$visitor = new RegionVisitor($region, $filter);
		Operations::completeBlindly($visitor);
		return $count->getCount();
	}

	public function fillXZ($origin, $pattern, $radius, $depth, $recursive){
		if($pattern instanceof BaseBlock){
			$pattern = new SingleBlockPattern($pattern);
		}
		$mask = new MaskIntersection(
			new RegionMask(new EllipsoidRegionnull, $origin, new Vector($radius, $radius, $radius)),
			new BoundedHeightMask(
				max($origin->getBlockY() - $depth + 1, 0),
				min(255, $origin->getBlockY())),
			Masks::negate(new ExistingBlockMask($this)));

		$replace = new BlockReplace($this, Patterns::warp($pattern));

		if($recursive){
			$visitor = new RecursiveVisitor($mask, $replace);
		}else{
			$visitor = new DownwardVisitor($mask, $replace, $origin->getBlockY());
		}

		$visitor->visit($origin);

		Operations::completeLegacy($visitor);

		return $visitor->getAffected();
	}

	public function removeAbove($position, $apothem, $height){
		$region = new CuboidRegion(
			$this->getWorld(),
			$position->add(-$apothem + 1, 0, -$apothem + 1),
			$position->add($apothem - 1, $height - 1, $apothem - 1));
		$pattern = new SingleBlockPattern(new BaseBlock(Block::AIR));
		return $this->setBlock($region, $pattern);
	}

	public function removeBelow($position, $apothem, $height){
		$region = new CuboidRegion(
			$this->getWorld(),
			$position->add(-$apothem + 1, 0, -$apothem + 1),
			$position->add($apothem - 1, -$height + 1, $apothem - 1));
		$pattern = new SingleBlockPattern(new BaseBlock(Block::AIR));
		return $this->setBlock($region, $pattern);
	}

	public function removeNear($position, $blockType, $apothem){
		$mask = new FuzzyBlockMask($this, new BaseBlock($blockType, -1));
		$a = new Vector(1, 1, 1);
		$adjustment = $a->multiply($apothem - 1);
		$region = new CuboidRegion(
			$this->getWorld(),
			$position->add($adjustment->multiply(-1)),
			$position->add($adjustment));
		$pattern = new SingleBlockPattern(new BaseBlock(Block::AIR));
		return $this->replaceBlock($region, $mask, $pattern);
	}

	public function replaceBlocks($region, $mask, $pattern){
		$replace = new BlockReplace($this, $pattern);
		$filter = new RegionMaskingFilter($mask, $replace);
		$visitor = new RegionVisitor($region, $filter);
		Operations::completeLegacy($visitor);
		return $visitor->getAffected();
	}

	public function center($region, $pattern){
		$center = $region->getCenter();
		$centerRegion = new CuboidRegion(
			$this->getWorld(),
			new Vector(((int) $center->getX()), ((int) $center->getY()), ((int) $center->getZ())),
			new Vector(MathUtils::roundHalfUp($center->getX()),
					$center->getY(), MathUtils::roundHalfUp($center->getZ())));
		return $this->setBlocks($centerRegion, $pattern);
	}

	public function makeCuboidFaces($region, $pattern){
		if($pattern instanceof BaseBlock){
			$pattern = new SingleBlockPattern($pattern);
		}

		$cuboid = CuboidRegion::makeCuboid($region);
		$faces = $cuboid->getFaces();
		return $this->setBlocks($faces, $pattern);
	}

	public function makeFaces($region, $pattern){
		if($region instanceof CuboidRegion){
			return $this->makeCuboidFaces($region, $pattern);
		}else{
			$shape = new RegionShape($region);
			return $shape->generate($this, $pattern, true);
		}
	}

	public function makeCuboidWalls($region, $pattern){
		if($pattern instanceof BaseBlock){
			$pattern = new SingleBlockPattern($pattern);
		}

		$cuboid = CuboidRegion::makeCuboid($region);
		$faces = $cuboid->getWalls();
		return $this->setBlocks($faces, $pattern);
	}

	public function makeWalls($region, $pattern){
		if($region instanceof CuboidRegion){
			return $this->makeCuboidWalls($region, $pattern);
		}else{
			$minY = $region->getMinimumPoint()->getBlockY();
			$maxY = $region->getMaximumPoint()->getBlockY();
			return $shape->generate($this, $pattern, true);
		}
	}

	public function overlayCuboidBlocks($region, $pattern){
		$replace = new BlockReplace($this, $pattern);
		$offset = new RegionOffset(new Vector(0, 1, 0), $replace);
		$ground = new GroundFunction(new ExistingBlockMask($this), $offset);
		$visitor = new LayerVisitor($region, $region->getMinimumY(), $region->getMaximumY(), $ground);
		Operations::completeLegacy($visitor);
		return $ground->getAffected();
	}

	public function naturalizeCuboidBlocks($region){
		$naturalizer = new Naturalizer($this);
		$flatRegion = Regions::asFlatRegion($region);
		$visitor = new LayerVisitor($flatRegion, $this->minimumBlockY($region), $this->maximumBlockY($region), $naturalizer);
		Operations::completeLegacy($visitor);
		return $naturalizer->getAffected();
	}

	public function stackCuboidRegion($region, $dir, $count, $copyAir){
		$size = $region->getMaximumPoint()->subtract($region->getMinimumPoint())->add(1, 1, 1);
		$to = $region->getMinimumPoint();
		$copy = new ForwardExtentCopy($this, $region, $region->getMinimumPoint(), $this, $to);
		$copy->setRepetitions($count);
		$aff = new AffineTransform();
		$copy->setTransform($aff->translate($dir->multiply($size)));
		if(!$copyAir){
			$copy->setSourceMask(new ExistingBlockMask($this));
		}
		Operations::completeLegacy($copy);
		return $copy->getAffected();
	}

	public function moveRegion($region, $dir, $distance, $copyAir, $replacement){
		$to = $region->getMinimumPoint();

		$pattern = $replacement != null ?
				new BlockPattern($replacement) :
				new BlockPattern(new BaseBlock(Block::AIR));
		$remove = new BlockReplace($this, $pattern);

		$buffer = new ForgetfulExtentBuffer($this, new RegionMask($region));
		$copy = new ForwardExtentCopy($this, $region, $region->getMinimumPoint(), $buffer, $to);
		$aff = new AffineTransform();
		$copy->setTransform($aff->translate($dir->multiply((float)$distance)));
		$copy->setSourceFunction($remove);
		$copy->setRemovingEntities(true);
		if(!$copyAir){
			$copy->setSourceMask(new ExistingBlockMask($this));
		}

		$replace = new BlockReplace($this, $buffer);
		$visitor = new RegionVisitor($buffer->asRegion(), $replace);

		$operation = new OperationQueue([$copy, $visitor]);
		Operations::completeLegacy($operation);

		return $copy->getAffected();
	}

	public function moveCuboidRegion($region, $dir, $distance, $copyAir, $replacement){
		return $this->moveRegion($region, $dir, $distance, $copyAir, $replacement);
	}

	public function makeCylinder(Vector $pos, Pattern $block, float $radiusX, float $radiusZ, int $height, bool $filled) : int{
		$affected = 0;

		$radiusX += 0.5;
		$radiusZ += 0.5;

		if($height == 0){
			return 0;
		}else if($height < 0){
			$height = -$height;
			$pos = $pos->subtract(0, $height, 0);
		}

		if($pos->getBlockY() < 0){
			$pos = $pos->setY(0);
		}else if($pos->getBlockY() + $height - 1 > 255){
			$height = 255 - $pos->getBlockY() + 1;
		}

		$invRadiusX = 1 / $radiusX;
		$invRadiusZ = 1 / $radiusZ;

		$ceilRadiusX = (int) ceil($radiusX);
		$ceilRadiusZ = (int) ceil($radiusZ);

		$nextXn = 0;
		$forX = false;
		for($x = 0;$x <= $ceilRadiusX && !$forX;$x++){
			$xn = $nextXn;
			$nextXn = ($x + 1) * $invRadiusX;
			$nextZn = 0;
			$forZ = false;
			for($z = 0;$z <= $ceilRadiusZ && !$forZ;$z++){
				$zn = $nextZn;
				$nextZn = ($z + 1) * $invRadiusZ;

				$distanceSq = self::lengthSq($xn, $zn);
				if($distanceSq > 1){
					if($z == 0){
					$forX = true;
						break;
					}
					break;
				}

				if(!$filled){
					if(self::lengthSq($nextXn, $zn) <= 1 && self::lengthSq($xn, $nextZn) <= 1){
						continue;
					}
				}

				for($y = 0;$y < $height;$y++){
					if($this->setBlock($pos->add($x, $y, $z), $block)){
						++$affected;
					}
					if($this->setBlock($pos->add(-$x, $y, $z), $block)){
						++$affected;
					}
					if($this->setBlock($pos->add($x, $y, -$z), $block)){
						++$affected;
					}
					if($this->setBlock($pos->add(-$x, $y, -$z), $block)){
						++$affected;
					}
				}
			}
		}

		return $affected;
	}

	public function makeSphere(Vector $pos, Pattern $block, float $radiusX, float $radiusY, float $radiusZ, bool $filled) : int{
		$affected = 0;

		$radiusX += 0.5;
		$radiusY += 0.5;
		$radiusZ += 0.5;

		$invRadiusX = 1 / $radiusX;
		$invRadiusY = 1 / $radiusY;
		$invRadiusZ = 1 / $radiusZ;

		$ceilRadiusX = (int) ceil($radiusX);
		$ceilRadiusY = (int) ceil($radiusY);
		$ceilRadiusZ = (int) ceil($radiusZ);

		$nextXn = 0;
		$forX = false;
		for($x = 0;$x <= $ceilRadiusX && !$forX;$x++){
			$xn = $nextXn;
			$nextXn = ($x + 1) * $invRadiusX;
			$nextYn = 0;
			$forY = false;
			for ($y = 0;$y <= $ceilRadiusY && !$forY;$y++){
				$yn = $nextYn;
				$nextYn = ($y + 1) * $invRadiusY;
				$nextZn = 0;
				for($z = 0;$z <= $ceilRadiusZ;$z++){
					$zn = $nextZn;
					$nextZn = ($z + 1) * $invRadiusZ;

					$distanceSq = self::lengthSq($xn, $yn, $zn);
					if($distanceSq > 1){
						if($z == 0){
							if($y == 0){
								$forX = true;
								$forY = true;
								break;
							}
							$forY = true;
							break;
						}
						break;
					}

					if(!$filled){
						if(self::lengthSq($nextXn, $yn, $zn) <= 1 && self::lengthSq($xn, $nextYn, $zn) <= 1 && self::lengthSq($xn, $yn, $nextZn) <= 1){
							continue;
						}
					}

					if($this->setBlock($pos->add($x, $y, $z), $block)){
						++$affected;
					}
					if($this->setBlock($pos->add(-$x, $y, $z), $block)){
						++$affected;
					}
					if($this->setBlock($pos->add($x, -$y, $z), $block)){
						++$affected;
					}
					if($this->setBlock($pos->add($x, $y, -$z), $block)){
						++$affected;
					}
					if($this->setBlock($pos->add(-$x, -$y, $z), $block)){
						++$affected;
					}
					if($this->setBlock($pos->add($x, -$y, -$z), $block)){
						++$affected;
					}
					if($this->setBlock($pos->add(-$x, $y, -$z), $block)){
						++$affected;
					}
					if($this->setBlock($pos->add(-$x, -$y, -$z), $block)){
						++$affected;
					}
				}
			}
		}

		return $affected;
	}

	public function makePyramid(Vector $position, Pattern $block, int $size, bool $filled) : int{
		$affected = 0;

		$height = $size;

		for($y = 0;$y <= $height;$y++){
			$size--;
			for($x = 0;$x <= $size;$x++){
				for($z = 0;$z <= $size;$z++){

					if(($filled && $z <= $size && $x <= $size) || $z == $size || $x == $size){

						if($this->setBlock($position->add($x, $y, $z), $block)){
							++$affected;
						}
						if($this->setBlock($position->add(-$x, $y, $z), $block)){
							++$affected;
						}
						if($this->setBlock($position->add($x, $y, -$z), $block)){
							++$affected;
						}
						if($this->setBlock($position->add(-$x, $y, -$z), $block)){
							++$affected;
						}
					}
				}
			}
		}

		return $affected;
	}

	public function hollowOutRegion($region, $thickness, $pattern){
		$affected = 0;

		$outside = [];

		$min = $region->getMinimumPoint();
		$max = $region->getMaximumPoint();

		$minX = $min->getBlockX();
		$minY = $min->getBlockY();
		$minZ = $min->getBlockZ();
		$maxX = $max->getBlockX();
		$maxY = $max->getBlockY();
		$maxZ = $max->getBlockZ();

		for($x = $minX;$x <= $maxX;$x++){
			for($y = $minY;$y <= $maxY;$y++){
				$this->recurseHollow($region, new BlockVector($x, $y, $minZ), $outside);
				$this->recurseHollow($region, new BlockVector($x, $y, $maxZ), $outside);
			}
		}

		for($y = $minY;$y <= $maxY;$y++){
			for($z = $minZ;$z <= $maxZ;$z++){
				$this->recurseHollow($region, new BlockVector($minX, $y, $z), $outside);
				$this->recurseHollow($region, new BlockVector($maxX, $y, $z), $outside);
			}
		}

		for($z = $minZ;$z <= $maxZ;$z++){
			for($x = $minX;$x <= $maxX;$x++){
				$this->recurseHollow($region, new BlockVector($x, $minY, $z), $outside);
				$this->recurseHollow($region, new BlockVector($x, $maxY, $z), $outside);
			}
		}

		for($i = 1;$i < $thickness;$i++){
			$newOutside = [];
			foreach($region as $position){
				foreach(self::$recurseDirections as $recurseDirection){
					$neighbor = $position->add($recurseDirection)->toBlockVector();

					if(self::in_array($neighbor, $outside)){
						$newOutside[] = $position;
						break;
					}
				}
			}

			foreach($newOutside as $new){
				$outside[] = $new;
			}
		}

		foreach($region as $position){
			foreach(self::$recurseDirections as $recurseDirection){
				$neighbor = $position->add($recurseDirection)->toBlockVector();

				if(self::in_array($neighbor, $outside)) {
					break;
				}
			}

			if($this->setBlock($position, $pattern->next($position))){
				++$affected;
			}
		}

		return $affected;
	}

	public function drawLine($pattern, $pos1, $pos2, $radius, $filled){
		$vset = [];
		$notdrawn = true;

		$x1 = $pos1->getBlockX();
		$y1 = $pos1->getBlockY();
		$z1 = $pos1->getBlockZ();
		$x2 = $pos2->getBlockX();
		$y2 = $pos2->getBlockY();
		$z2 = $pos2->getBlockZ();
		$tipx = $x1;
		$tipy = $y1;
		$tipz = $z1;
		$dx = abs($x2 - $x1);
		$dy = abs($y2 - $y1);
		$dz = abs($z2 - $z1);

		if($dx + $dy + $dz == 0){
			$vset[] = new Vector($tipx, $tipy, $tipz);
			$notdrawn = false;
		}

		if(max(max($dx, $dy), $dz) == $dx && $notdrawn){
			for($domstep = 0;$domstep <= $dx;$domstep++){
				$tipx = $x1 + $domstep * ($x2 - $x1 > 0 ? 1 : -1);
				$tipy = (int) round($y1 + $domstep * ($dy) / ($dx) * ($y2 - $y1 > 0 ? 1 : -1));
				$tipz = (int) round($z1 + $domstep * ($dz) / ($dx) * ($z2 - $z1 > 0 ? 1 : -1));

				$vset[] = new Vector($tipx, $tipy, $tipz);
			}
			$notdrawn = false;
		}

		if(max(max($dx, $dy), $dz) == $dy && $notdrawn){
			for($domstep = 0;$domstep <= $dy;$domstep++){
				$tipy = $y1 + $domstep * ($y2 - $y1 > 0 ? 1 : -1);
				$tipx = (int) round($x1 + $domstep * ($dx) / ($dy) * ($x2 - $x1 > 0 ? 1 : -1));
				$tipz = (int) round($z1 + $domstep * ($dz) / ($dy) * ($z2 - $z1 > 0 ? 1 : -1));

				$vset[] = new Vector($tipx, $tipy, $tipz);
			}
			$notdrawn = false;
		}

		if(max(max($dx, $dy), $dz) == $dz && $notdrawn){
			for($domstep = 0;$domstep <= $dz;$domstep++){
				$tipz = z1 + domstep * (z2 - z1 > 0 ? 1 : -1);
				$tipy = (int) round($y1 + $domstep * ($dy) / ($dz) * ($y2 - $y1 > 0 ? 1 : -1));
				$tipx = (int) round($x1 + $domstep * ($dx) / ($dz) * ($x2 - $x1 > 0 ? 1 : -1));

				$vset[] = new Vector($tipx, $tipy, $tipz);
			}
			$notdrawn = false;
		}

		$vset = self::getBallooned($vset, $radius);
		if(!$filled){
			$vset = self::getHollowed($vset);
		}
		return $this->setBlocks($vset, $pattern);
	}

	public function drawSpline($pattern, $nodevectors, $tension, $bias, $continuity, $quality, $radius, $filled){
		$vset = [];
		$nodes = [];

		$interpol = new KochanekBartelsInterpolation();

		foreach($nodevectors as $nodevector){
			$n = new Node($nodevector);
			$n->setTension($tension);
			$n->setBias($bias);
			$n->setContinuity($continuity);
			$nodes[] = $n;
		}

		$interpol->setNodes($nodes);
		$splinelength = $interpol->arcLength(0, 1);
		for($loop = 0;$loop <= 1;$loop += 1 / $splinelength / $quality){
			$tipv = $interpol->getPosition($loop);
			$tipx = (int) round($tipv->getX());
			$tipy = (int) round($tipv->getY());
			$tipz = (int) round($tipv->getZ());

			$vset[] = new Vector($tipx, $tipy, $tipz);
		}

		$vset = self::getBallooned($vset, $radius);
		if(!$filled){
			$vset = self::getHollowed($vset);
		}
		return $this->setBlocks($vset, $pattern);
	}

	private static function hypot($pars){
		$sum = 0;
		foreach($pars as $d){
			$sum += pow($d, 2);
		}
		return sqrt($sum);
	}

	private static function getBallooned($vset, $radius) {
		$returnset = [];
		$ceilrad = (int) ceil($radius);

		foreach($vset as $v){
			$tipx = $v->getBlockX();
			$tipy = $v->getBlockY();
			$tipz = $v->getBlockZ();

			for($loopx = $tipx - $ceilrad;$loopx <= $tipx + $ceilrad;$loopx++){
				for($loopy = $tipy - $ceilrad;$loopy <= $tipy + $ceilrad;$loopy++){
					for($loopz = $tipz - $ceilrad;$loopz <= $tipz + $ceilrad;$loopz++){
						if(self::hypot([$loopx - $tipx, $loopy - $tipy, $loopz - $tipz]) <= $radius){
							$returnset[] = new Vector($loopx, $loopy, $loopz);
						}
					}
				}
			}
		}
		return $returnset;
	}

	private static function getHollowed($vset) {
		$returnset = [];
		foreach($vset as $v){
			$x = $v->getX();
			$y = $v->getY();
			$z = $v->getZ();
			if(self::in_array(new Vector(x + 1, y, z), $vset) &&
			self::in_array(new Vector(x - 1, y, z), $vset) &&
			self::in_array(new Vector(x, y + 1, z), $vset) &&
			self::in_array(new Vector(x, y - 1, z), $vset) &&
			self::in_array(new Vector(x, y, z + 1), $vset) &&
			self::in_array(new Vector(x, y, z - 1), $vset)){
				$returnset[] = $v;
			}
		}
		return $returnset;
	}

	private function recurseHollow($region, $origin, $outside){
		$queue = [];
		$queue[] = $origin;

		while(count($queue) > 0){
			foreach($queue as $k => $q){
				$current = $q;
				unset($queue[$k]);
				array_values($queue);
				break;
			}
			$block = $this->getBlock($current);
			if(!BlockType::canPassThrough($block->getId(), $block->getData())){
				continue;
			}

			if(self::in_array($current, $outline)){
				continue;
			}else{
				$outside[] = $current;
			}

			if(!self::in_array($current, $region)){
				continue;
			}

			foreach(self::$recurseDirections as $recurseDirection) {
				$queue[] = $current->add($recurseDirection)->toBlockVector();
			}
		}
	}

	private static function lengthSq($x, $y, $z = null) {
		if($z == null) return ($x * $x) + ($y * $y);
		return ($x * $x) + ($y * $y) + ($z * $z);
	}

	public static function in_array($vec, $vecs){
		foreach($vecs as $v){
			if($v->equals($vec)) return true;
		}

		return false;
	}
}
<?php

namespace edit\extension\factory;

use edit\internal\registry\AbstractFactory;

class BlockFactory extends AbstractFactory{

	public function __construct(){
		$this->parsers[] = new DefaultBlockParser();
	}

}<?php

namespace edit\extension\factory;

use pocketmine\item\Item;
use pocketmine\block\Block;

use edit\blocks\BaseBlock;
use edit\internal\registry\InputParser;
use edit\functions\pattern\BlockPattern;
use edit\Main;

class DefaultBlockParser extends InputParser{

	public function __construct(){
	}

	public function parseFromInput(string $input){
		$b = explode(":", str_replace([" ", "minecraft:"], ["_", ""], trim($input)));
		if(!isset($b[1])){
			$meta = 0;
		}else{
			$meta = $b[1] & 0xFFFF;
		}

		if(defined(Item::class . "::" . strtoupper($b[0]))){
			$item = Item::get(constant(Item::class . "::" . strtoupper($b[0])), $meta);
			if($item->getId() === Item::AIR and strtoupper($b[0]) !== "AIR"){
				$item = Item::get($b[0] & 0xFFFF, $meta);
			}
		}else{
			$item = Item::get($b[0] & 0xFFFF, $meta);
		}

		return new BaseBlock($item->getId(), $item->getDamage());
	}

}<?php

namespace edit\extension\factory;

use edit\internal\registry\AbstractFactory;

class PatternFactory extends AbstractFactory{

	public function __construct(){
		//$this->parsers[] = new HashTagPatternParser();
		$this->parsers[] = new SingleBlockPatternParser();
		$this->parsers[] = new RandomPatternParser();
	}

}<?php

namespace edit\extension\factory;

use edit\internal\registry\InputParser;
use edit\functions\pattern\BlockPattern;
use edit\functions\pattern\RandomPattern;
use edit\Main;

class RandomPatternParser extends InputParser{

	public function __construct(){
	}

	public function parseFromInput(string $input){
		$blockRegistry = Main::getInstance()->getBlockFactory();
		$randomPattern = new RandomPattern();

		foreach(explode(",", $input) as $token){
			if(count(explode("%", $token)) == 2){
				$p = explode("%", $token);

				if(count($p) < 2){
					//"Missing the type after the % symbol for '" + input + "'");
					echo("error");
				}else{
					$chance = $p[0];
					$block = $blockRegistry->parseFromInput($p[1]);
				}
			}else{
				$chance = 1;
				$block = $blockRegistry->parseFromInput($token);
			}

			$randomPattern->add(new BlockPattern($block), $chance);
		}

		return $randomPattern;
	}

}<?php

namespace edit\extension\factory;

use edit\internal\registry\InputParser;
use edit\functions\pattern\BlockPattern;
use edit\Main;

class SingleBlockPatternParser extends InputParser{

	public function __construct(){
	}

	public function parseFromInput(string $input){
		$items = explode(",", $input);

		if(count($items) == 1){
			return new BlockPattern(Main::getInstance()->getBlockFactory()->parseFromInput($items[0]));
		}else{
			return null;
		}
	}

}<?php

namespace edit\extent;

use pocketmine\entity\Entity;

use edit\Vector;
use edit\Vector2D;
use edit\blocks\BaseBlock;
use edit\functions\operation\Operation;
use edit\functions\operation\OperationQueue;
use edit\util\Location;
use edit\regions\Region;

abstract class AbstractDelegateExtent implements Extent{

	private $extent;

	public function __construct(Extent $extent){
		$this->extent = $extent;
	}

	public function getExtent() : Extent{
		return $this->extent;
	}

	public function getBlock(Vector $position) : BaseBlock{
		return $this->extent->getBlock($position);
	}

	public function getLazyBlock(Vector $position) : BaseBlock{
		return $this->extent->getLazyBlock($position);
	}

	public function setBlock(Vector $location, $block) : bool{
		return $this->extent->setBlock($location, $block);
	}

	public function createEntity(Location $location, Entity $entity) : ?Entity{
		return $this->extent->createEntity($location, $entity);
	}

	public function getEntities(?Region $region = null) : array{
		return $this->extent->getEntities($region);
	}

	public function getMinimumPoint() : Vector{
		return $this->extent->getMinimumPoint();
	}

	public function getMaximumPoint() : Vector{
		return $this->extent->getMaximumPoint();
	}

	protected function commitBefore() : ?Operation{
		return null;
	}

	public function commit() : ?Operation{
		$ours = $this->commitBefore();
		$other = $this->extent->commit();
		if($ours != null && $other != null){
			return new OperationQueue($ours, $other);
		}else if($ours != null){
			return $ours;
		}else if($other != null){
			return $other;
		}else{
			return null;
		}
	}
}<?php

namespace edit\extent\buffer;

use edit\BlockVector;
use edit\Vector;
use edit\blocks\BaseBlock;
use edit\extent\AbstractDelegateExtent;
use edit\extent\Extent;
use edit\functions\mask\Mask;
use edit\functions\mask\Masks;
use edit\functions\pattern\Pattern;
use edit\regions\AbstractBufferRegion;
use edit\regions\Region;

class ForgetfulExtentBuffer extends AbstractDelegateExtent implements Pattern{

	public $buffer = [];
	public $mask;
	public $min = null;
	public $max = null;

	public function __construct(Extent $delegate, Mask $mask = null){
		parent::__construct($delegate);
		if($mask == null){
			$mask = Masks::alwaysTrue();
		}

		$this->mask = $mask;
	}

	public function setBlock(Vector $location, $block) : bool{
		if($this->min == null){
			$this->min = $location;
		}else{
			$this->min = Vector::getMinimum($this->min, $location);
		}

		if($this->max == null){
			$this->max = $location;
		}else{
			$this->max = Vector::getMaximum($this->max, $location);
		}

		$blockVector = $location->toBlockVector();
		if($this->mask->test($blockVector)){
			$this->buffer[$blockVector->toString()] = $block;
			return true;
		}else{
			return $this->getExtent()->setBlock($location, $block);
		}
	}

	public function apply(Vector $pos) : BaseBlock{
		if(isset($this->buffer[$pos->toBlockVector()->toString()])){
			return $this->buffer[$pos->toBlockVector()->toString()];
		}else{
			return new BaseBlock(Block::AIR);
		}
	}

	public function asRegion() : Region{
		return new AbstractBufferRegion($this);
	}
}<?php

namespace edit\extent\clipboard;

use pocketmine\block\Block;
use pocketmine\entity\Entity;

use edit\blocks\BaseBlock;
use edit\util\Location;
use edit\regions\Region;
use edit\functions\operation\Operation;
use edit\Vector;

class BlockArrayClipboard implements Clipboard{

	private $region;
	private $origin;
	private $blocks;
	private $entities = [];

	public function __construct(Region $region){
		$this->region = clone $region;
		$this->origin = $region->getMinimumPoint();

		$blocks = [];
	}

	public function getRegion() : Region{
		return clone $this->region;
	}

	public function getOrigin() : Vector{
		return $this->origin;
	}

	public function setOrigin(Vector $origin){
		$this->origin = $origin;
	}

	public function getDimensions() : Vector{
		return $this->region->getMaximumPoint()->subtract($this->region->getMinimumPoint())->add(1, 1, 1);
	}

	public function getMinimumPoint() : Vector{
		return $this->region->getMinimumPoint();
	}

	public function getMaximumPoint() : Vector{
		return $this->region->getMaximumPoint();
	}

	public function getEntities(?Region $region = null) : array{
		if($region == null) return $this->entities;
		$filtered = [];
		foreach($this->entities as $clipboardEntity){
			$entity = $clipboardEntity->getEntity();
			$pt = new Vector($entity->x, $entity->y, $entity->z);
			if($region->contains($pt)) $filtered[] = $entity;
		}
		return $filtered;
	}

	public function createEntity(Location $location, Entity $entity) : ?Entity{
		$ret = new ClipboardEntity($location, $entity);
		$this->entities[] = $ret;
		return $entity;
	}

	public function getBlock(Vector $position) : BaseBlock{
		if($this->region->contains($position)){
			$v = $position->subtract($this->region->getMinimumPoint());
			$block = $this->blocks[$v->getBlockX()][$v->getBlockY()][$v->getBlockZ()];
			if($block != null){
				return clone $block;
			}
		}

		return Block::get(Block::AIR);
	}

	public function getLazyBlock(Vector $position) : Block{
		return $this->getBlock($position);
	}

	public function setBlock(Vector $position, $block) : bool{
		if($this->region->contains($position)){
			$v = $position->subtract($this->region->getMinimumPoint());
			$this->blocks[$v->getBlockX()][$v->getBlockY()][$v->getBlockZ()] = clone $block;
			return true;
		}else{
			return false;
		}
	}

	//public function getBiome(Vector2D $position) : BaseBiome{
	//	  return new BaseBiome(0);
	//}

	//public function setBiome(Vector2D $position, BaseBiome $biome) : bool{
	//	  return false;
	//}

	public function commit() : ?Operation{
		return null;
	}

}<?php

namespace edit\extent\clipboard;

use edit\Vector;
use edit\regions\Region;
use edit\extent\Extent;

interface Clipboard extends Extent{

	function getRegion() : Region;

	function getDimensions() : Vector;

	function getOrigin() : Vector;

	function setOrigin(Vector $origin);

}<?php

namespace edit\extent\clipboard;

use pocketmine\entity\Entity;

use edit\util\Location;

class ClipboardEntity{

	private $location;
	private $entity;

	public function __construct(Location $location, Entity $entity){
		$this->location = $location;
		$this->entity = $entity;
	}

	public function getEntity() : Entity{
		return $this->entity;
	}

	public function getLocation() : Location{
		return $this->location;
	}
}<?php

namespace edit\extent;

use pocketmine\entity\Entity;

use edit\Vector;
use edit\regions\Region;
use edit\util\Location;

interface Extent extends InputExtent, OutputExtent{

    function getMinimumPoint() : Vector;

    function getMaximumPoint() : Vector;

    function getEntities(?Region $region) : array;

    function createEntity(Location $location, Entity $entity) : ?Entity;

}<?php

namespace edit\extent;

use pocketmine\block\Block;

use edit\blocks\BaseBlock;
use edit\Vector;

interface InputExtent{

	function getBlock(Vector $position) : BaseBlock;

	//biome

}<?php

namespace edit\extent;

use pocketmine\block\Block;

use edit\Vector;
use edit\functions\operation\Operation;

interface OutputExtent{

	function setBlock(Vector $position, $block) : bool;

	//biome

	function commit() : ?Operation;

}<?php

namespace edit\extent\transform;

use edit\Vector;
use edit\blocks\BaseBlock;
use edit\extent\AbstractDelegateExtent;
use edit\extent\Extent;
use edit\math\transform\Transform;
use edit\world\registry\BlockRegistry;
use edit\world\registry\State;
use edit\world\registry\StateValue;

class BlockTransformExtent extends AbstractDelegateExtent{

	//const RIGHT_ANGLE = deg2rad(90);

	private $transform;
	private $blockRegistry;

	public function __construct(Extent $extent, Transform $transform, BlockRegistry $blockRegistry){
		parent::__construct($extent);
		$this->transform = $transform;
		$this->blockRegistry = $blockRegistry;
	}

	public function getTransform() : Transform{
		return $this->transform;
	}

	private function transformBlock(BaseBlock $block, bool $reverse) : BaseBlock{
		self::transform($block, $reverse ? $this->transform->inverse() : $this->transform, $this->blockRegistry);
		return $block;
	}

	public function getBlock(Vector $position) : BaseBlock{
		return $this->transformBlock(parent::getBlock($position), false);
	}

	public function getLazyBlock(Vector $position) : BaseBlock{
		return $this->transformBlock(parent::getLazyBlock($position), false);
	}

	public function setBlock(Vector $location, $block) : bool{
		return parent::setBlock($location, $this->transformBlock(clone $block, true));
	}

	private static function transform(BaseBlock $block, Transform $transform, BlockRegistry $registry, ?BaseBlock $changedBlock = null) : BaseBlock{
		if($changedBlock == null) $changedBlock = $block;

		$states = $registry->getStates($block);

		if($states == null){
			return $changedBlock;
		}

		foreach($states as $state){
			if($state->hasDirection()){
				$value = $state->getValue($block);
				if($value != null && $value->getDirection() != null){
					$newValue = self::getNewStateValue($state, $transform, $value->getDirection());
					if($newValue != null){
						$newValue->set($changedBlock);
					}
				}
			}
		}

		return $changedBlock;
	}

	private static function getNewStateValue(State $state, Transform $transform, Vector $oldDirection) : StateValue{
		$newDirection = $transform->apply($oldDirection)->subtract($transform->apply(new Vector(0, 0, 0)))->normalize();
		$newValue = null;
		$closest = -2;
		$found = false;

		foreach($state->valueMap() as $v){
			if($v->getDirection() != null){
				$dot = $v->getDirection()->normalize()->dot($newDirection);
				if($dot >= $closest){
					$closest = $dot;
					$newValue = $v;
					$found = true;
				}
			}
		}

		if($found){
			return $newValue;
		}else{
			return null;
		}
	}
}<?php

namespace edit\functions\block;

use edit\functions\RegionFunction;
use edit\functions\pattern\Pattern;
use edit\extent\Extent;
use edit\Vector;

class BlockReplace implements RegionFunction{

	private $extent;
	private $pattern;

	public function __construct(Extent $extent, Pattern $pattern){
		$this->extent = $extent;
		$this->pattern = $pattern;
	}

	public function apply(Vector $position) : bool{
		return $this->extent->setBlock($position, $this->pattern->apply($position));
	}
}<?php

namespace edit\functions\block;

use edit\jnbt\CompoundTag;
use edit\jnbt\CompoundTagBuilder;
use edit\blocks\BaseBlock;
use edit\extent\Extent;
use edit\functions\RegionFunction;
use edit\math\transform\Transform;
use edit\internal\helper\MCDirections;
use edit\util\Direction;
use edit\util\DirectionFlag;
use edit\Vector;

class ExtentBlockCopy implements RegionFunction{

	private $source;
	private $destination;
	private $from;
	private $to;
	private $transform;

	public function __construct(Extent $source, Vector $from, Extent $destination, Vector $to, Transform $transform){
		$this->source = $source;
		$this->from = $from;
		$this->destination = $destination;
		$this->to = $to;
		$this->transform = $transform;
	}

	public function apply(Vector $position) : bool{
		$block = $this->source->getBlock($position);
		$orig = $position->subtract($this->from);
		$transformed = $this->transform->apply($orig);

		$block = $this->transformNbtData($block);

		return $this->destination->setBlock($transformed->add($this->to), $block);
	}

	private function transformNbtData(BaseBlock $state) : BaseBlock{
		$tag = $state->getNbtData();

		if($tag != null){
			if($tag->containsKey("Rot")){
				$rot = $tag->asInt("Rot");

				$direction = MCDirections::fromRotation($rot);

				if($direction != null){
					$vector = $this->transform->apply($direction->toVector())->subtract($this->transform->apply(new Vector(0, 0, 0)))->normalize();
					$newDirection = Direction::findClosest($vector, DirectionFlag::CARDINAL | DirectionFlag::ORDINAL | DirectionFlag::SECONDARY_ORDINAL);

					if($newDirection != null){
						$builder = $tag->createBuilder();

						$builder->putByte("Rot", MCDirections::toRotation($newDirection));

						return new BaseBlock($state->getId(), $state->getData(), $builder->build());
					}
				}
			}
		}

		return $state;
	}
}<?php

namespace edit\functions;

use edit\Vector;

class CombinedRegionFunction implements RegionFunction{

	public $functions = [];

	public function __construct(array $functions){
		$this->functions = $functions;
	}

	public function add(RegionFunction $functions){
		foreach($functions as $function1){
			$this->functions[] = $function1;
		}
	}

	public function apply(Vector $position) : bool{
		$ret = false;
		foreach($this->functions as $function1){
			if($function1->apply($position)){
				$ret = true;
			}
		}
		return $ret;
	}
}<?php

namespace edit\functions\entity;

use pocketmine\entity\Entity;

use edit\jnbt\CompoundTag;
use edit\jnbt\CompoundTagBuilder;
use edit\blocks\BaseBlock;
use edit\extent\Extent;
use edit\functions\EntityFunction;
use edit\math\transform\Transform;
use edit\internal\helper\MCDirections;
use edit\history\change\EntityRemove;
use edit\util\Direction;
use edit\util\DirectionFlag;
use edit\util\Location;
use edit\Vector;
use edit\EditSession;

class ExtentEntityCopy implements EntityFunction{

	private $destination;
	private $from;
	private $to;
	private $transform;
	private $removing;

	public function __construct(Vector $from, Extent $destination, Vector $to, Transform $transform){
		$this->from = $from;
		$this->destination = $destination;
		$this->to = $to;
		$this->transform = $transform;
	}

	public function isRemoving() : bool{
		return $this->removing;
	}

	public function setRemoving(bool $removing){
		$this->removing = $removing;
	}

	public function apply(Entity $entity) : bool{
		$location = new Location($this->destination, new Vector($entity->x, $entity->y, $entity->z), $entity->getYaw(), $entity->getPitch());
		$pivot = $this->from->round()->add(0.5, 0.5, 0.5);

		$newPosition = $this->transform->apply($location->toVector()->subtract($pivot));
		$newDirection = $this->transform->isIdentity() ?
			$location->getDirection()
			: $this->transform->apply($location->getDirection())->subtract($this->transform->apply(new Vector(0, 0, 0)))->normalize();
		$newLocation = new Location($this->destination, $newPosition->add($this->to->round()->add(0.5, 0.5, 0.5)), $newDirection->toYaw(), $newDirection->toPitch());

		$entity = $this->transformNbtData($entity);

		$success = $this->destination->createEntity($newLocation, $entity) != null;

		if($this->isRemoving() && $success){
			if($this->destination instanceof EditSession) $this->destination->changeMemory->add(new EntityRemove($newLocation, $entity));
			$entity->close();
		}

		return $success;
	}

	private function transformNbtData(Entity $state) : Entity{
		return $state;
	}
}<?php

namespace edit\functions;

use pocketmine\entity\Entity;

interface EntityFunction{

	public function apply(Entity $entity) : bool;

}<?php

namespace edit\functions;

use edit\Vector;
use edit\functions\mask\Mask;

class GroundFunction implements LayerFunction{

	private $mask;
	private $function1;
	private $affected;

	public function __construct(Mask $mask, RegionFunction $function1){
		$this->mask = $mask;
		$this->function1 = $function1;
	}

	public function getMask() : Mask{
		return $this->mask;
	}

	public function setMask(Mask $mask){
		$this->mask = $mask;
	}

	public function getAffected(){
		return $this->affected;
	}

	public function isGround(Vector $position) : bool{
		return $this->mask->test($position);
	}

	public function apply(Vector $position, int $depth) : bool{
		if($depth == 0){
			if($this->function1->apply($position)){
				$this->affected++;
			}
		}

		return false;
	}

}<?php

namespace edit\functions;

use edit\Vector;

interface LayerFunction{

	public function isGround(Vector $position) : bool;

	public function apply(Vector $position, int $depth) : bool;

}<?php

namespace edit\functions\mask;

use edit\extent\Extent;

abstract class AbstractExtentMask implements Mask{

	private $extent;

	public function __construct(Extent $extent){
		$this->setExtent($extent);
	}

	public function getExtent() : Extent{
		return $this->extent;
	}

	public function setExtent(Extent $extent){
		$this->extent = $extent;
	}
}<?php

namespace edit\functions\mask;

abstract class AbstractMask implements Mask{
}<?php

namespace edit\functions\mask;

abstract class AbstractMask2D implements Mask2D{
}<?php

namespace edit\functions\mask;

use edit\extent\Extent;

class BlockMask extends AbstractExtentMask{

	private $blocks;

	public function __construct(Extent $extent, array $blocks){
		parent::__construct($extent);
		$this->blocks = $blocks;
	}

	public function add(array $blocks){
		foreach($blocks as $block){
			$this->blocks[] = $block;
		}
	}

	public function getBlocks() : array{
		return $this->blocks;
	}

	public function test($vector) : bool{
		$block = $this->getExtent()->getBlock($vector);
		foreach($this->blocks as $b){
			if($block->getData() == -1){
				if($block->getType() == $b->getType()) return true;
			}else{
				if($block->getType() == $b->getType() && $block->getData() == $b->getData()) return true;
			}
		}
		return false;
	}

	public function toMask2D() : ?Mask2D{
		return null;
	}
}<?php

namespace edit\functions\mask;

class BoundedHeightMask extends AbstractMask{

	private final $minY;
	private final $maxY;

	public function __construct($minY, $maxY) {
		$this->minY = $minY;
		$this->maxY = $maxY;
	}

	public function test($vector) : bool{
		return $vector->getY() >= $this->minY && $vector->getY() <= $this->maxY;
	}

	public function toMask2D() : ?Mask2D{
		return null;
	}

}<?php

namespace edit\functions\mask;

use pocketmine\block\Block;

use edit\extent\Extent;

class ExistingBlockMask extends AbstractExtentMask{

	public function __construct(Extent $extent){
		parent::__construct($extent);
	}

	public function test($vector) : bool{
		return $this->getExtent()->getBlock($vector)->getType() != Block::AIR;
	}

	public function toMask2D() : ?Mask2D{
		return null;
	}

}<?php

namespace edit\functions\mask;

use edit\Vector;

interface Mask{

	function test($vector) : bool;

	function toMask2D() : ?Mask2D;
}<?php

namespace edit\functions\mask;

use edit\Vector2D;

interface Mask2D{

    function test($vector) : bool;

}<?php

namespace edit\functions\mask;

class MaskIntersection extends AbstractMask{

	private $mask = [];

	public function __construct(array $masks){
		$this->masks = $masks;
	}

	public function add(array $masks){
		foreach($masks as $mask){
			$this->masks[] = $mask;
		}
	}

	public function getMasks() : array{
		return $this->masks;
	}

	public function test($vector) : bool{
		if(count($this->masks) == 0){
			return false;
		}

		foreach($this->masks as $mask){
			if(!$mask->test($vector)){
				return false;
			}
		}

		return true;
	}

	public function toMask2D() : ?Mask2D{
		$mask2dList = [];
		foreach($this->masks as $mask){
			$mask2d = $mask->toMask2D();
			if($mask2d != null){
				$mask2dList[] = $mask2d;
			}else{
				return null;
			}
		}
		return new MaskIntersection2D($mask2dList);
	}
}<?php

namespace edit\functions\mask;

class Masks{

    private function __construct(){
    }

    public static function alwaysTrue() : Mask{
        return new AlwaysTrue();
    }

    public static function alwaysTrue2D() : Mask2D{
        return new AlwaysTrue();
    }

    public static function negate(Mask $mask) : Mask{
        if($mask instanceof AlwaysTrue){
            return new AlwaysFalse();
        }else if($mask instanceof AlwaysFalse){
            return new AlwaysTrue();
        }
    }
}

    class AlwaysTrue implements Mask, Mask2D{
        public function test($vector) : bool{
            return true;
        }

        public function toMask2D() : Mask2D{
            return $this;
        }
    }

    class AlwaysFalse implements Mask, Mask2D{
        public function test($vector) : bool{
            return false;
        }

        public function toMask2D() : Mask2D{
            return $this;
        }
    }<?php

namespace edit\functions\mask;

use edit\regions\Region;

class RegionMask extends AbstractMask{

	private $region;

	public function __construct(Region $region) {
		$this->region = $region;
	}

	public function getRegion() : Region{
		return $this->region;
	}

	public function setRegion(Region $region){
		$this->region = $region;
	}

	public function test($vector) : bool{
		return $this->region->contains($vector);
	}

	public function toMask2D() : ?Mask2D{
		return null;
	}

}<?php

namespace edit\functions\operation;

class DelegateOperation implements Operation{

	private $original;
	private $delegate;

	public function __construct(Operation $original, Operation $delegate){
		$this->original = $original;
		$this->delegate = $delegate;
	}

	public function resume(RunContext $run) : ?Operation{
		$this->delegate = $this->delegate->resume($run);
		return $this->delegate != null ? $this : $this->original;
	}

	public function cancel(){
		$this->delegate->cancel();
		$this->original->cancel();
	}

	public function addStatusMessages(array $messages){
		$this->original->addStatusMessages($messages);
		$this->delegate->addStatusMessages($messages);
	}

}
<?php

namespace edit\functions\operation;

use edit\regions\Region;
use edit\extent\Extent;
use edit\Vector;
use edit\math\transform\Identity;
use edit\math\transform\Transform;
use edit\functions\RegionFunctions;
use edit\functions\mask\Mask;
use edit\functions\mask\Masks;
use edit\functions\RegionFunction;
use edit\functions\CombinedRegionFunction;
use edit\functions\RegionMaskingFilter;
use edit\functions\block\ExtentBlockCopy;
use edit\functions\entity\ExtentEntityCopy;
use edit\functions\visitor\EntityVisitor;
use edit\functions\visitor\RegionVisitor;

class ForwardExtentCopy implements Operation{

	private $source;
	private $destination;
	private $region;
	private $from;
	private $to;
	private $repetitions = 1;
	private $sourceMask;
	private $removingEntities = false;
	private $copyingEntities = true;
	private $sourceFunction = null;
	private $transform;
	private $currentTransform = null;
	private $lastVisitor;
	private $affected = 0;

	public function __construct(Extent $source, Region $region, Vector $from, Extent $destination, Vector $to){
		$this->source = $source;
		$this->destination = $destination;
		$this->region = $region;
		$this->from = $from;
		$this->to = $to;
		$this->sourceMask = Masks::alwaysTrue();
		$this->transform = new Identity();
	}

	public function getTransform() : Transform{
		return $this->transform;
	}

	public function setTransform(Transform $transform){
		$this->transform = $transform;
	}

	public function getSourceMask() : Mask{
		return $this->sourceMask;
	}

	public function setSourceMask(Mask $sourceMask){
		$this->sourceMask = $sourceMask;
	}

	public function getSourceFunction() : RegionFunction{
		return $this->sourceFunction;
	}

	public function setSourceFunction(RegionFunction $function1){
		$this->sourceFunction = $function1;
	}

	public function getRepetitions() : int{
		return $this->repetitions;
	}

	public function setRepetitions(int $repetitions){
		$this->repetitions = $repetitions;
	}

	public function isCopyingEntities() : bool{
		return $this->copyingEntities;
	}

	public function setCopyingEntities(bool $copyingEntities){
		$this->copyingEntities = $copyingEntities;
	}

	public function isRemovingEntities() : bool{
		return $this->removingEntities;
	}

	public function setRemovingEntities(bool $removingEntities){
		$this->removingEntities = $removingEntities;
	}

	public function getAffected() : int{
		return $this->affected;
	}

	public function resume(RunContext $run) : ?Operation{
		if($this->lastVisitor != null){
			$this->affected += $this->lastVisitor->getAffected();
			$this->lastVisitor = null;
		}

		if($this->repetitions > 0){
			$this->repetitions--;

			if($this->currentTransform == null){
				$this->currentTransform = $this->transform;
			}

			$blockCopy = new ExtentBlockCopy($this->source, $this->from, $this->destination, $this->to, $this->currentTransform);
			$filter = new RegionMaskingFilter($this->sourceMask, $blockCopy);
			$function1 = $this->sourceFunction != null ? new CombinedRegionFunction([$filter, $this->sourceFunction]) : $filter;
			$blockVisitor = new RegionVisitor($this->region, $function1);

			$this->lastVisitor = $blockVisitor;
			$this->currentTransform = $this->currentTransform->combine($this->transform);

			if($this->copyingEntities){
				$entityCopy = new ExtentEntityCopy($this->from, $this->destination, $this->to, $this->currentTransform);
				$entityCopy->setRemoving($this->removingEntities);
				$entities = $this->source->getEntities($this->region);
				$entityVisitor = new EntityVisitor($entities, $entityCopy);
				return new DelegateOperation($this, new OperationQueue([$blockVisitor, $entityVisitor]));
			}else{
				return new DelegateOperation($this, $blockVisitor);
			}
		}else{
			return null;
		}
	}

	public function cancel(){
	}

	public function addStatusMessages(array $messages){
	}
}<?php

namespace edit\functions\operation;

interface Operation{

    function resume(RunContext $run) : ?Operation;

    function cancel();

    function addStatusMessages(array $messages);

}
<?php

namespace edit\functions\operation;

class OperationQueue implements Operation{

	private $operations = [];
	private $queue = [];
	private $current = null;

	public function __construct(array $operations){
		foreach($operations as $operation){
			$this->offer($operation);
		}
		$this->operations = $operations;
	}

	public function offer(Operation $operation){
		$this->queue[] = $operation;
	}

	public function resume(RunContext $run) : ?Operation{
		if($this->current == null && count($this->queue) > 0){
			$this->current = $this->queue[0];
			unset($this->queue[0]);
			$this->queue = array_values($this->queue);
		}

		if($this->current != null){
			$this->current = $this->current->resume($run);

			if($this->current == null){
				if(empty($this->queue[0])){
					$this->current = null;
				}else{
					$this->current = $this->queue[0];
					unset($this->queue[0]);
					$this->queue = array_values($this->queue);
				}
			}
		}

		return $this->current != null ? $this : null;
	}

	public function cancel(){
		foreach($this->queue as $operation){
			$operation->cancel();
		}
		$this->queue = [];
	}

	public function addStatusMessages(array $messages){
		foreach($this->operations as $operation){
			$operation->addStatusMessages($messages);
		}
	}
}<?php

namespace edit\functions\operation;

class Operations{

	public function __construct(){
	}

	public static function complete(Operation $op){
		while($op != null){
			$op = $op->resume(new RunContext());
		}
	}

	public static function completeLegacy(Operation $op){
		while($op != null){
			$op = $op->resume(new RunContext());
		}
	}
}<?php

namespace edit\functions\operation;

class RunContext{

	public function shouldContinue() : bool{
		return true;
	}
}<?php

namespace edit\functions\pattern;

abstract class AbstractPattern implements Pattern {
}<?php

namespace edit\functions\pattern;

use pocketmine\block\Block;

use edit\blocks\BaseBlock;
use edit\Vector;

class BlockPattern extends AbstractPattern{

	private $block;

	public function __construct(BaseBlock $block){
		$this->setBlock($block);
	}

	public function getBlock() : BaseBlock{
		return $this->block;
	}

	public function setBlock(BaseBlock $block){
		$this->block = $block;
	}

	public function apply(Vector $position) : BaseBlock{
		return $this->block;
	}
}<?php

namespace edit\functions\pattern;

use pocketmine\block\Block;

use edit\blocks\BaseBlock;
use edit\Vector;

interface Pattern{

	function apply(Vector $position) : BaseBlock;

}<?php

namespace edit\functions\pattern;

class Patterns{
}<?php

namespace edit\functions\pattern;

use pocketmine\block\Block;

use edit\blocks\BaseBlock;
use edit\Vector;

class RandomPattern extends AbstractPattern{

	private $patterns = [];
	private $max = 0;

	public function __construct(){
	}

	public function add(Pattern $pattern, float $chance){
		$this->patterns[] = new Chance($pattern, $chance);
		$this->max += $chance;
	}

	public function apply(Vector $position) : BaseBlock{
		$r = rand(0, 1000) / 1000;
		$offset = 0;

		foreach($this->patterns as $chance){
			if($r <= ($offset + $chance->getChance()) / $this->max){
				return $chance->getPattern()->apply($position);
			}
			$offset += $chance->getChance();
		}

		echo("error");
	}
}
class Chance {
	private $pattern;
	private $chance;

	public function __construct(Pattern $pattern, float $chance){
		$this->pattern = $pattern;
		$this->chance = $chance;
        }

	public function getPattern() : Pattern{
		return $this->pattern;
	}

	public function getChance() : float{
		return $this->chance;
        }
}<?php

namespace edit\functions;

use edit\Vector;

interface RegionFunction{

	public function apply(Vector $position) : bool;

}<?php

namespace edit\functions;

use edit\Vector;
use edit\functions\mask\Mask;

class RegionMaskingFilter implements RegionFunction{

	private $function1;
	private $mask;

	public function __construct(Mask $mask, RegionFunction $function1){
		$this->mask = $mask;
		$this->function1 = $function1;
	}

	public function apply(Vector $position) : bool{
		return $this->mask->test($position) && $this->function1->apply($position);
	}
}<?php

namespace edit\functions\util;

use edit\Vector;
use edit\functions\RegionFunction;

class RegionOffset implements RegionFunction{

	private $offset;
	private $function1;

	public function __construct(Vector $offset, RegionFunction $function1){
		$this->setOffset($offset);
		$this->function1 = $function1;
	}

	public function getOffset() : Vector{
		return $this->offset;
	}

	public function setOffset(Vector $offset){
		$this->offset = $offset;
	}

	public function apply(Vector $position) : bool{
		return $this->function1->apply($position->add($this->offset));
	}
}<?php

namespace edit\functions\visitor;

use edit\regions\Region;
use edit\functions\operation\RunContext;
use edit\functions\operation\Operation;
use edit\functions\EntityFunction;

class EntityVisitor implements Operation{

	private $entities;
	private $function1;
	private $affected = 0;

	public function __construct(array $entities, EntityFunction $function1){
		$this->entities = $entities;
		$this->function1 = $function1;
	}

	public function getAffected() : int{
		return $this->affected;
	}

	public function resume(RunContext $run) : ?Operation{
		foreach($this->entities as $entity){
			if($this->function1->apply($entity)){
				$this->affected++;
			}
		}

		return null;
	}

	public function cancel(){
	}

	public function addStatusMessages(array $messages){
		$messages[] = $this->getAffected() . " entities affected";
	}
}<?php

namespace edit\functions\visitor;

use edit\Vector;
use edit\regions\FlatRegion;
use edit\functions\operation\RunContext;
use edit\functions\operation\Operation;
use edit\functions\LayerFunction;
use edit\functions\mask\Mask2D;
use edit\functions\mask\Masks;

class LayerVisitor implements Operation{

	private $flatRegion;
	private $function1;
	private $mask;
	private $minY;
	private $maxY;

	public function __construct(FlatRegion $flatRegion, int $minY, int $maxY, LayerFunction $function1){
		$this->flatRegion = $flatRegion;
		$this->minY = $minY;
		$this->maxY = $maxY;
		$this->function1 = $function1;

		$this->mask = Masks::alwaysTrue2D();
	}

	public function getMask() : Mask2D{
		return $this->mask;
	}

	public function setMask(Mask2D $mask){
		$this->mask = $mask;
	}

	public function resume(RunContext $run) : ?Operation{
		foreach($this->flatRegion->asFlatRegion() as $column){
			if(!$this->mask->test($column)){
				continue;
			}

			if($this->function1->isGround($column->toVector($this->maxY + 1))){
				return null;
			}

			$found = false;
			$groundY = 0;
			for($y = $this->maxY;$y >= $this->minY;$y--){
				$test = $column->toVector($y);
				if(!$found){
					if($this->function1->isGround($test)){
						$found = true;
						$groundY = $y;
					}
				}

				if($found){
					if(!$this->function1->apply($test, $groundY - $y)){
						break;
					}
				}
			}
		}

		return null;
	}

	public function cancel(){
	}

	public function addStatusMessages(array $messages){
	}
}<?php

namespace edit\functions\visitor;

use edit\regions\Region;
use edit\functions\operation\RunContext;
use edit\functions\operation\Operation;
use edit\functions\RegionFunction;

class RegionVisitor implements Operation{

	private $region;
	private $function1;
	private $affected = 0;

	public function __construct(Region $region, RegionFunction $function1){
		$this->region = $region;
		$this->function1 = $function1;
	}

	public function getAffected() : int{
		return $this->affected;
	}

	public function resume(RunContext $run) : ?Operation{
		foreach($this->region->iterator() as $pt){
			if($this->function1->apply($pt)){
				$this->affected++;
			}
		}

		return null;
	}

	public function cancel(){
	}

	public function addStatusMessages(array $messages){
		$messages[] = $this->getAffected() . " blocks affected";
	}
}<?php

namespace edit\history\change;

use edit\BlockVector;
use edit\blocks\BaseBlock;

class BlockChange implements Change{

	private $position;
	private $previous;
	private $current;

	public function __construct(BlockVector $position, BaseBlock $previous, BaseBlock $current){
		$this->position = $position;
		$this->previous = $previous;
		$this->current = $current;
	}

	public function getPosition() : BlockVector{
		return $this->position;
	}

	public function getPrevious() : BaseBlock{
		return $this->previous;
	}

	public function getCurrent() : BaseBlock{
		return $this->current;
	}

	public function undo($session){
		$session->setBlockUndo($this->position, $this->previous);
	}

	public function redo($session){
		$session->setBlockUndo($this->position, $this->current);
	}

}<?php

namespace edit\history\change;

interface Change{

	function undo($session);

	function redo($session);

}<?php

namespace edit\history\change;

use pocketmine\entity\Entity;

use edit\util\Location;

class EntityCreate implements Change{

	private $location;
	private $entity;

	public function __construct(Location $location, Entity $entity){
		$this->location = $location;
		$this->entity = $entity;
	}

	public function undo($session){
		if($this->entity !== null){
			$this->entity->close();
		}
	}

	public function redo($session){
		$this->entity = $session->createEntity($this->location, $this->entity);
	}

}<?php

namespace edit\history\change;

use pocketmine\entity\Entity;

use edit\util\Location;

class EntityRemove implements Change{

	private $location;
	private $entity;

	public function __construct(Location $location, Entity $entity){
		$this->location = $location;
		$this->entity = $entity;
	}

	public function undo($session){
		$this->entity = $session->createEntity($this->location, $this->entity);
	}

	public function redo($session){
		if($this->entity !== null){
			$this->entity->close();
		}
	}

}<?php

namespace edit\history;

use edit\history\change\Change;

class ChangeMemory{

	private $changes = [];

	public function __construct(){
	}

	public function add(Change $change){
		$this->changes[] = $change;
	}

	public function undo($session){
		foreach($this->changes as $change){
			$change->undo($session);
		}
		$session->reorderUndo();
	}

	public function redo($session){
		foreach($this->changes as $change){
			$change->redo($session);
		}
		$session->reorderUndo();
	}
}<?php

namespace edit\internal\helper;

use edit\util\Direction;

class MCDirections {

	private function __construct(){
	}

	public static function fromHanging(int $i) : Direction{
		switch($i){
			case 0:
				return Direction::$SOUTH;
			case 1:
				return Direction::$WEST;
			case 2:
				return Direction::$NORTH;
			case 3:
				return Direction::$EAST;
			default:
				return Direction::$NORTH;
		}
	}

	public static function toHanging(Direction $direction) : int{
		switch($direction->toVector()->x){
			case 0:
				switch($direction->toVector()->z){
					case -1:
						return 2;//NORTH
					case 1:
						return 0;//SOUTH
				}
			case 1:
				switch($direction->toVector()->z){
					case 0:
						return 3;//EAST
				}
			case -1:
				switch($direction->toVector()->z){
					case 0:
						return 1;//WEST
				}
			default:
				return 0;
		}
	}

	public static function fromLegacyHanging(int $i) : int{
		switch($i){
			case 0: return 2;
			case 1: return 1;
			case 2: return 0;
			default: return 3;
		}
	}

	public static function toLegacyHanging(int $i) : int{
		switch($i){
			case 0: return 2;
			case 1: return 1;
			case 2: return 0;
			default: return 3;
		}
	}

	public static function fromRotation(int $i) : Direction{
		switch($i){
			case 0:
				return Direction::$SOUTH;
			case 1:
				return Direction::$SOUTH_SOUTHWEST;
			case 2:
				return Direction::$SOUTHWEST;
			case 3:
				return Direction::$WEST_SOUTHWEST;
			case 4:
				return Direction::$WEST;
			case 5:
				return Direction::$WEST_NORTHWEST;
			case 6:
				return Direction::$NORTHWEST;
			case 7:
				return Direction::$NORTH_NORTHWEST;
			case 8:
				return Direction::$NORTH;
			case 9:
				return Direction::$NORTH_NORTHEAST;
			case 10:
				return Direction::$NORTHEAST;
			case 11:
				return Direction::$EAST_NORTHEAST;
			case 12:
				return Direction::$EAST;
			case 13:
				return Direction::$EAST_SOUTHEAST;
			case 14:
				return Direction::$SOUTHEAST;
			case 15:
				return Direction::$SOUTH_SOUTHEAST;
			default:
				return Direction::$NORTH;
		}
	}

	public static int toRotation(Direction direction) {
		switch($direction->toVector()->x){
			case 0:
				switch($direction->toVector()->z){
					case -1:
						return 8;//NORTH
					case 1:
						return 0;//SOUTH
					case 0:
						switch($direction->toVector()->y){
							case 1:
								return 0;//UP
							case -1;
								return 0;//DOWN
						}
				}
			case 1:
				switch($direction->toVector()->z){
					case -1:
						return 10;//NORTHEAST
					case 1:
						return 14;//SOUTHEAST
					case 0:
						return 12;//EAST
				}
			case -1:
				switch($direction->toVector()->z){
					case -1:
						return 6;//NORTHWEST
					case 1:
						return 2;//SOUTHWEST
					case 0:
						return 4;//WEST
				}
			case -cos(M_PI / 8):
				switch($direction->toVector()->z){
					case -sin(M_PI / 8):
						return 5;//WEST_NORTHWEST
					case sin(M_PI / 8):
						return 3;//WEST_SOUTHWEST
				}
			case cos(M_PI / 8):
				switch($direction->toVector()->z){
					case -sin(M_PI / 8):
						return 11;//EAST_NORTHEAST
					case sin(M_PI / 8):
						return 13;//EAST_SOUTHEAST
				}
			case -sin(M_PI / 8):
				switch($direction->toVector()->z){
					case -cos(M_PI / 8):
						return 7;//NORTH_NORTHWEST
					case cos(M_PI / 8):
						return 1;//SOUTH_SOUTHWEST
				}
			case sin(M_PI / 8):
				switch($direction->toVector()->z){
					case -cos(M_PI / 8):
						return 9;//NORTH_NORTHEAST
					case cos(M_PI / 8):
						return 15;//SOUTH_SOUTHEAST
				}
			default:
				return 0;
		}
	}

}<?php

namespace edit\internal\registry;

abstract class AbstractFactory{

	protected $parsers = [];

	public function __constract(){
	}

	public function parseFromInput(string $input){
		foreach($this->parsers as $parser){
			$match = $parser->parseFromInput($input);

			if($match != null){
				return $match;
			}
		}

		echo("error");
	}
}<?php

namespace edit\internal\registry;

abstract class InputParser{

	public function __construct(){
	}

	public abstract function parseFromInput(string $input);

}<?php

namespace edit\jnbt;

class ByteArrayTag extends Tag{

	private $value;

	public function __construct(array $value){
		parent::__construct();
		$this->value = $value;
	}

	public function getValue(){
		return $this->value;
	}

}<?php

namespace edit\jnbt;

class ByteTag extends Tag{

	private $value;

	public function __construct(int $value){
		parent::__construct();
		$this->value = $value;
	}

	public function getValue(){
		return $this->value;
	}
}<?php

namespace edit\jnbt;

class CompoundTag extends Tag{

	private $value;

	public function __construct(array $value){
		parent::__construct();
		$this->value = $value;
	}

	public function containsKey(string $key) : bool{
		return isset($this->value[$key]);
	}

	public function getValue(){
		return $this->value;
	}

	public function setValue(array $value) : CompoundTag{
		return new CompoundTag($value);
	}

	public function createBuilder() : CompoundTagBuilder{
		return new CompoundTagBuilder($ths->value);
	}

	public function getByteArray(string $key) : array{
		$tag = $this->value[$key];
		if($tag instanceof ByteArrayTag){
			return $tag->getValue();
		}else{
			return [];
		}
	}

	public function getByte(string $key) : int{
		$tag = $this->value[$key];
		if($tag instanceof ByteTag){
			return $tag->getValue();
		}else{
			return 0;
		}
	}

	public function getDouble(string $key) : float{
		$tag = $this->value[$key];
		if($tag instanceof DoubleTag){
			return $tag->getValue();
		}else{
			return 0;
		}
	}

	public function asDouble(stirng $key) : float{
		$tag = $this->value[$key];
		if($tag instanceof ByteTag){
			return $tag->getValue();
		}else if($tag instanceof ShortTag){
			return $tag->getValue();
		}else if($tag instanceof IntTag){
			return $tag->getValue();
		}else if($tag instanceof LongTag){
			return $tag->getValue();
		}else if($tag instanceof FloatTag){
			return $tag->getValue();
		}else if($tag instanceof DoubleTag){
			return $tag->getValue();
		}else{
			return 0;
		}
	}

	public function getFloat(string $key) : float{
		$tag = $this->value[$key];
		if($tag instanceof FloatTag){
			return $tag->getValue();
		}else{
			return 0;
		}
	}

	public function getIntArray(string $key) : array{
		$tag = $this->value[$key];
		if($tag instanceof IntArrayTag){
			return $tag->getValue();
		}else{
			return [];
		}
	}

	public function getInt(string $key) : int{
		$tag = $this->value[$key];
		if($tag instanceof IntTag){
			return $tag->getValue();
		}else{
			return 0;
		}
	}

	public function asInt(stirng $key) : int{
		$tag = $this->value[$key];
		if($tag instanceof ByteTag){
			return (int) $tag->getValue();
		}else if($tag instanceof ShortTag){
			return (int) $tag->getValue();
		}else if($tag instanceof IntTag){
			return (int) $tag->getValue();
		}else if($tag instanceof LongTag){
			return (int) $tag->getValue();
		}else if($tag instanceof FloatTag){
			return (int) $tag->getValue();
		}else if($tag instanceof DoubleTag){
			return (int) $tag->getValue();
		}else{
			return 0;
		}
	}

	public function getList(string $key, string $listType = "") : array{
		$tag = $this->value[$key];
		if($tag instanceof ListTag){
			if($listType == ""){
				return $tag->getValue();
			}else{
				if($tag->getType() == $listType){
					return $tag->getValue();
				}
			}
		}else{
			return [];
		}
	}

	public function getListTag(string $key) : ListTag{
		$tag = $this->value[$key];
		if($tag instanceof ListTagTag){
			return $tag;
		}else{
			return new ListTag("StirngTag", []);
		}
	}

	public function getLong(string $key) : float{
		$tag = $this->value[$key];
		if($tag instanceof LongTag){
			return $tag->getValue();
		}else{
			return 0;
		}
	}

	public function asLong(stirng $key) : float{
		$tag = $this->value[$key];
		if($tag instanceof ByteTag){
			return $tag->getValue();
		}else if($tag instanceof ShortTag){
			return $tag->getValue();
		}else if($tag instanceof IntTag){
			return $tag->getValue();
		}else if($tag instanceof LongTag){
			return $tag->getValue();
		}else if($tag instanceof FloatTag){
			return $tag->getValue();
		}else if($tag instanceof DoubleTag){
			return $tag->getValue();
		}else{
			return 0;
		}
	}

	public function getShort(string $key) : float{
		$tag = $this->value[$key];
		if($tag instanceof ShortTag){
			return $tag->getValue();
		}else{
			return 0;
		}
	}

	public function getString(string $key) : string{
		$tag = $this->value[$key];
		if($tag instanceof StringTag){
			return $tag->getValue();
		}else{
			return 0;
		}
	}
}<?php

namespace edit\jnbt;

class CompoundTagBuilder{

	private $entries;

	public function __construct(array $value = []){
		$this->entries = $value;
	}

	public function put(string $key, Tag $value) : CompoundTagBuilder{
		$this->entries[$key] = $value;
		return $this;
	}

	public function putByteArray(string $key, array $value) : CompoundTagBuilder{
		$this->entries[$key] = new ByteArrayTag($value);
		return $this;
	}

	public function putByte(string $key, int $value) : CompoundTagBuilder{
		$this->entries[$key] = new ByteTag($value);
		return $this;
	}

	public function putDouble(string $key, float $value) : CompoundTagBuilder{
		$this->entries[$key] = new DoubleTag($value);
		return $this;
	}

	public function putFloat(string $key, float $value) : CompoundTagBuilder{
		$this->entries[$key] = new FloatTag($value);
		return $this;
	}

	public function putIntArray(string $key, array $value) : CompoundTagBuilder{
		$this->entries[$key] = new IntArrayTag($value);
		return $this;
	}

	public function putInt(string $key, int $value) : CompoundTagBuilder{
		$this->entries[$key] = new IntTag($value);
		return $this;
	}

	public function putLong(string $key, float $value) : CompoundTagBuilder{
		$this->entries[$key] = new LongTag($value);
		return $this;
	}

	public function putShort(string $key, float $value) : CompoundTagBuilder{
		$this->entries[$key] = new ShortTag($value);
		return $this;
	}

	public function putString(string $key, string $value) : CompoundTagBuilder{
		$this->entries[$key] = new StringTag($value);
		return $this;
	}

	public function putAll(string $key, array $values) : CompoundTagBuilder{
		foreach($values as $value){
			$this->entries[$key] =$value;
		}
		return $this;
	}

	public function build() : CompoundTag{
		return new CompoundTag($this->entries);
	}

	public static function create() : CompoundTagBuilder{
		return new CompoundTagBuilder();
	}
<?php

namespace edit\jnbt;

class DoubleTag extends Tag{

	private $value;

	public function __construct(float $value){
		parent::__construct();
		$this->value = $value;
	}

	public function getValue(){
		return $this->value;
	}
}<?php

namespace edit\jnbt;

class EndTag extends Tag{

	public function getValue(){
		return null;
	}
}<?php

namespace edit\jnbt;

class FloatTag extends Tag{

	private $value;

	public function __construct(float $value){
		parent::__construct();
		$this->value = $value;
	}

	public function getValue(){
		return $this->value;
	}
}<?php

namespace edit\jnbt;

class IntArrayTag extends Tag{

	private $value;

	public function __construct(array $value){
		parent::__construct();
		$this->value = $value;
	}

	public function getValue(){
		return $this->value;
	}

}<?php

namespace edit\jnbt;

class IntTag extends Tag{

	private $value;

	public function __construct(int $value){
		parent::__construct();
		$this->value = $value;
	}

	public function getValue(){
		return $this->value;
	}
}<?php

namespace edit\jnbt;

class LongTag extends Tag{

	private $value;

	public function __construct(float $value){
		parent::__construct();
		$this->value = $value;
	}

	public function getValue(){
		return $this->value;
	}
}<?php

namespace edit\jnbt;

class ShortTag extends Tag{

	private $value;

	public function __construct(float $value){
		parent::__construct();
		$this->value = $value;
	}

	public function getValue(){
		return $this->value;
	}
}<?php

namespace edit\jnbt;

class StringTag extends Tag{

	private $value;

	public function __construct(string $value){
		parent::__construct();
		$this->value = $value;
	}

	public function getValue(){
		return $this->value;
	}
}<?php

namespace edit\jnbt;

abstract class Tag{

	public abstract function getValue();

}<?php
namespace edit;

use pocketmine\plugin\PluginBase;
use pocketmine\Server;
use pocketmine\Player;
use pocketmine\utils\Config;
use pocketmine\utils\TextFormat;
use pocketmine\utils\MainLogger;
use pocketmine\item\Item;
use pocketmine\block\Block;
use pocketmine\block\Fallable;
use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\event\Listener;
use pocketmine\event\player\PlayerInteractEvent;
use pocketmine\event\player\PlayerLoginEvent;
use pocketmine\event\player\PlayerCommandPreprocessEvent;
use pocketmine\event\block\BlockPlaceEvent;
use pocketmine\event\block\BlockBreakEvent;
use pocketmine\math\Vector3;
use pocketmine\level\Position;
use pocketmine\level\Level;
use pocketmine\scheduler\Task;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\nbt\tag\StringTag;

use edit\blocks\BlockType;
use edit\util\TargetBlock;
use edit\command\tool\BrushTool;
use edit\command\tool\Tool;
use edit\command\tool\TraceTool;
use edit\extension\factory\BlockFactory;
use edit\extension\factory\PatternFactory;
use edit\world\registry\LegacyBlockRegistry;
use edit\world\registry\BundledBlockData;

use edit\command\Pos1Command;
use edit\command\Pos2Command;
use edit\command\CopyCommand;
use edit\command\CutCommand;
use edit\command\PasteCommand;
use edit\command\RotateCommand;
use edit\command\FlipCommand;
use edit\command\BrushCommand;
use edit\command\MaskCommand;
use edit\command\MoveCommand;
use edit\command\StackCommand;
use edit\command\CylinderCommand;
use edit\command\HcylinderCommand;
use edit\command\SphereCommand;
use edit\command\HsphereCommand;
use edit\command\PyramidCommand;
use edit\command\SetCommand;
use edit\command\ReplaceCommand;
use edit\command\OverlayCommand;
use edit\command\UndoCommand;
use edit\command\RedoCommand;
use edit\command\SmoothCommand;

class Main extends PluginBase implements Listener{

	public static $wandID = 271;
	public static $canUseNotOp = false;

	const LOGO = "[Edit] ";

	public $sessions = [];

	public $tools = [];

	public $patternFactory;
	public $blockFactory;

	public $blockRegistry;

	public function onEnable(){
		self::$instance = $this;
		Server::getInstance()->getLogger()->info("[Edit]Â§a WorldEditNIGHTMARE_v3.5.5ã‚’èª­ã¿è¾¼ã¿ã¾ã—ãŸ");
		Server::getInstance()->getPluginManager()->registerEvents($this,  $this);
		if(!file_exists($this->getDataFolder())) mkdir($this->getDataFolder(), 0744, true);
		if(!file_exists($this->getDataFolder()."clipboard")) mkdir($this->getDataFolder()."clipboard", 0744, true);
		$this->config = new Config($this->getDataFolder()."config.yml", Config::YAML, [
			"é¸æŠžãƒ„ãƒ¼ãƒ«" => 271,
			"OPä»¥å¤–ã‚‚ä½¿ãˆã‚‹ã‚ˆã†ã«ã™ã‚‹" => false
		]);
		self::$wandID = $this->config->get("é¸æŠžãƒ„ãƒ¼ãƒ«");
		self::$canUseNotOp = $this->config->get("OPä»¥å¤–ã‚‚ä½¿ãˆã‚‹ã‚ˆã†ã«ã™ã‚‹");
		$this->patternFactory = new PatternFactory();
		$this->blockFactory = new BlockFactory();
		$this->blockRegistry = new LegacyBlockRegistry();
		new BundledBlockData();
		Server::getInstance()->getCommandMap()->register("pocketmine", new Pos1Command("/pos1"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new Pos2Command("/pos2"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new CopyCommand("/copy"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new PasteCommand("/paste"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new CutCommand("/cut"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new RotateCommand("/rotate"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new FlipCommand("/flip"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new BrushCommand("/brush"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new MaskCommand("/mask"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new MoveCommand("/move"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new StackCommand("/stack"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new CylinderCommand("/cylinder"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new CylinderCommand("/cyl"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new HcylinderCommand("/hcylinder"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new HcylinderCommand("/hcyl"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new SphereCommand("/sphere"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new HsphereCommand("/hsphere"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new PyramidCommand("/pyramid"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new SetCommand("/set"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new ReplaceCommand("/replace"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new OverlayCommand("/overlay"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new UndoCommand("/undo"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new RedoCommand("/redo"));
		Server::getInstance()->getCommandMap()->register("pocketmine", new SmoothCommand("/smooth"));
	}

	public function onDisable(){
	}

	public function onLogin(PlayerLoginEvent $event){
		$player = $event->getPlayer();
		$this->sessions[$player->getName()] = new EditSession($player);
	}

	public function onInteract(PlayerInteractEvent $event){
		$block = $event->getBlock();
		$player = $event->getPlayer();
		$item = $event->getItem();
		if (!$player->isCreative()) return;
		if(!self::$canUseNotOp && !$player->isOp()) return;
		if($item->getID() == self::$wandID && $block->getId() != 0){
			$pos = new Vector($block->getX(), $block->getY(), $block->getZ());
			Main::getInstance()->getEditSession($player)->getRegionSelector($player->getLevel())->selectPrimary($pos);
			Main::getInstance()->getEditSession($player)->getRegionSelector($player->getLevel())->explainPrimarySelection($player);
		}else if($this->getTool($item, $player) != null){
			$this->getTool($item, $player)->actPrimary($player);
		}
	}

	public function onBreak(BlockBreakEvent $event){
		$player = $event->getPlayer();
		$item = $event->getItem();
		if (!$player->isCreative()) return;
		if(!self::$canUseNotOp && !$player->isOp()) return;
		if($item->getID() == self::$wandID){
			$block = $event->getBlock();
			$pos = new Vector($block->getX(), $block->getY(), $block->getZ());
			Main::getInstance()->getEditSession($player)->getRegionSelector($player->getLevel())->selectSecondary($pos);
			Main::getInstance()->getEditSession($player)->getRegionSelector($player->getLevel())->explainSecondarySelection($player);
			$event->setCancelled();
		}else if($this->getTool($item, $player) != null){
			$event->setCancelled();
		}
	}

	public function getEditSession(Player $player){
		return $this->sessions[$player->getName()];
	}

	public static function getBlockTrace(Player $player, int $range, bool $useLastBlock = false) : ?WorldVector{
		$tb = new TargetBlock($player, $range, 0.2);
		$result = ($useLastBlock ? $tb->getAnyTargetBlock() : $tb->getTargetBlock());
		return $result->y == 255 ? null : $result;
	}

	public static function getDirection(float $rot) : Vector{
		if(0 <= $rot && $rot < 22.5){
			return new Vector(0, 0, 1);//SOUTH
		}else if(22.5 <= $rot && $rot < 67.5){
			return new Vector(-1, 0, 1);//SOUTH_WEST
		}else if(67.5 <= $rot && $rot < 112.5){
			return new Vector(-1, 0, 0);//WEST
		}else if(112.5 <= $rot && $rot < 157.5){
			return new Vector(-1, 0, -1);//NORTH_WEST
		}else if(157.5 <= $rot && $rot < 202.5){
			return new Vector(0, 0, -1);//NORTH
		}else if(202.5 <= $rot && $rot < 247.5){
			return new Vector(1, 0, -1);//NORTH_EAST
		}else if(247.5 <= $rot && $rot < 292.5){
			return new Vector(1, 0, 0);//EAST
		}else if(292.5 <= $rot && $rot < 337.5){
			return new Vector(1, 0, 1);//SOUTH_EAST
		}else if(337.5 <= $rot && $rot < 360.0){
			return new Vector(0, 0, 1);//SOUTH
		}else{
			return new Vector(0, 0, 0);
		}
	}

	public static function getCardinalDirection(Player $player, int $yawOffset = 0) : Vector{
		if($player->getPitch() > 67.5){
			return new Vector(0, -1, 0);
		}else if($player->getPitch() < -67.5){
			return new Vector(0, 1, 0);
		}

		$rot = ($player->getYaw() + $yawOffset) % 360;
		if($rot < 0){
			$rot += 360;
		}
		return self::getDirection($rot);
	}

	public static function getFlipDirection(Player $player, string $dir) : Vector{
		if($dir == "me"){
			return self::getCardinalDirection($player);
		}

		$d = substr($dir, 0, 1);

		switch($d){
			case "w"://west
				return new Vector(-1, 0, 0);
			case "e"://east
				return new Vector(1, 0, 0);
			case "s"://south
				return new Vector(0, 0, 1);
			case "n"://north
				return new Vector(0, 0, -1);
			case "u"://up
				return new Vector(0, 1, 0);
			case "d"://down
				return new Vector(0, -1, 0);
			case "m"://me
			case "f"://forward
				return self::getCardinalDirection($player, 0);
			case "b"://backward
				return self::getCardinalDirection($player, 180);
			case "l"://left
				return self::getCardinalDirection($player, -90);
			case "r"://right
				return self::getCardinalDirection($player, 90);
			default:
				return new Vector(0, 0, 0);
		}
	}

	public static function findFreePosition(Player $player){
		$searchPos = new WorldVector($player->getLevel(), $player->x, $player->y, $player->z);
		$searchPos = $searchPos->floor();
		$world = $player->getLevel();
		$x = $searchPos->getBlockX();
		$y = max(0, $searchPos->getBlockY());
		$origY = $y;
		$z = $searchPos->getBlockZ();

		$free = 0;

		while($y <= 255 + 2){
			if(BlockType::canPassThrough(Main::getInstance()->getEditSession($player)->getBlock(new Vector($x, $y, $z))->getType())){
				++$free;
			}else{
				$free = 0;
			}

			if($free == 2) {
				if($y - 1 != $origY){
					$pos = new Vector($x, $y - 2, $z);
					$block = Main::getInstance()->getEditSession($player)->getBlock($pos);
					$player->teleport(new Vector3($x + 0.5, $y - 2 + 1, $z + 0.5));
				}

				return;
			}

			++$y;
		}
	}

	public function getTool(Item $item, Player $player) : ?Tool{
		$name = "";

		if(!$item->hasCompoundTag()){
			$name = "";
		}

		$tag = $item->getNamedTag();
		if($tag->hasTag("toolData")){
			$tag = $tag->getTag("toolData");
			if($tag instanceof CompoundTag and $tag->hasTag("Data") and $tag->getTag("Data") instanceof StringTag){
				$name = $tag->getTag("Data")->getValue();
			}
		}
		if(empty($this->tools[$name])) return null;
		return $this->tools[$name];
	}

	public function getBrushTool(Item $item, Player $player) : BrushTool{
		$tool = $this->getTool($item, $player);

		if($tool == null || !($tool instanceof BrushTool)){
			$tool = new BrushTool();
			$this->setTool($item, $tool, $player);
		}

		return $tool;
	}

	public function setTool(Item $item, Tool $tool, Player $player){
		if($item->getId() == self::$wandID){
			return;
		}

		$name = (string) microtime();
		echo($name);

		if(!$item->hasCompoundTag()){
			$tag = new CompoundTag("", []);
		}else{
			$tag = $item->getNamedTag();
		}

		if($tag->hasTag("toolData") and $tag->getTag("toolData") instanceof CompoundTag){
			$tag->getTag("toolData")->setTag(new StringTag("Data", $name));
		}else{
			$tag->setTag(new CompoundTag("toolData", [
				new StringTag("Data", $name)
			]));
		}

		$item->setCompoundTag($tag);

		$this->tools[$name] = $tool;
		$player->getInventory()->setItemInHand($item);
	}

	public function getPatternFactory() : PatternFactory{
		return $this->patternFactory;
	}

	public function getBlockFactory() : BlockFactory{
		return $this->blockFactory;
	}

	public function getBlockRegistry(){
		return $this->blockRegistry;
	}

	public static function getInstance(){
		return self::$instance;
	}

	public static $instance;
}<?php

namespace edit\math\convolution;

class GaussianKernel extends Kernel{

	public function __construct(int $radius, float $sigma){
		parent::__construct($radius * 2 + 1, $radius * 2 + 1, self::createKernel($radius, $sigma));
	}

	private static function createKernel(int $radius, float $sigma) : array{
		$diameter = $radius * 2 + 1;
		$data = [];

		$sigma22 = 2 * $sigma * $sigma;
		$constant = M_PI * $sigma22;
		for($y = -$radius;$y <= $radius;++$y){
			for($x = -$radius;$x <= $radius;++$x){
				$data[($y + $radius) * $diameter + $x + $radius] = (float) (exp(-($x * $x + $y * $y) / $sigma22) / $constant);
			}
		}

		return $data;
	}
}<?php

namespace edit\math\convolution;

use pocketmine\block\Block;

use edit\blocks\BaseBlock;
use edit\EditSession;
use edit\regions\Region;
use edit\Vector;

class HeightMap{

	private $data;
	private $width;
	private $height;

	private $region;
	private $session;

	public function __construct(EditSession $session, Region $region, bool $naturalOnly = false){
		$this->session = $session;
		$this->region = $region;

		$this->width = $region->getWidth();
		$this->height = $region->getHeight();

		$minX = $region->getMinimumPoint()->getBlockX();
		$minY = $region->getMinimumPoint()->getBlockY();
		$minZ = $region->getMinimumPoint()->getBlockZ();
		$maxY = $region->getMaximumPoint()->getBlockY();

		$this->data = [];
		for($z = 0;$z < $this->height;++$z){
			for($x = 0;$x < $this->width;++$x){
				$this->data[$z * $this->width + $x] = $session->getHighestTerrainBlock($x + $minX, $z + $minZ, $minY, $maxY, $naturalOnly);
			}
		}
	}

	public function applyFilter(HeightMapFilter $filter, int $iterations) : int{
		$newData = [];
		for($i = 0;$i < count($this->data);$i++){
			$newData[$i] = $this->data[$i];
		}

		for($i = 0;$i < $iterations;++$i){
			$newData = $filter->filter($newData, $this->width, $this->height);
		}

		return $this->apply($newData);
	}

	public function apply(array $data2) : int{
		$minY = $this->region->getMinimumPoint();
		$originX = $minY->getBlockX();
		$originY = $minY->getBlockY();
		$originZ = $minY->getBlockZ();

		$maxY = $this->region->getMaximumPoint()->getBlockY();
		$fillerAir = new BaseBlock(Block::AIR);

		$blockChanged = 0;

		for($z = 0;$z < $this->height;++$z){
			for($x = 0;$x < $this->width;++$x){
				$index = $z * $this->width + $x;
				$curHeight = $this->data[$index];

				$newHeight = min($maxY, $data2[$index]);

				$xr = $x + $originX;
				$zr = $z + $originZ;

				if(($newHeight - $originY) != 0) $scale = (float) ($curHeight - $originY) / (float) ($newHeight - $originY);
				$scale = 1;

				if($newHeight > $curHeight){
					$existing = $this->session->getBlock(new Vector($xr, $curHeight, $zr));

					if($existing->getId() != Block::WATER && $existing->getId() != Block::STILL_WATER
						&& $existing->getId() != Block::LAVA && $existing->getId() != Block::STILL_LAVA){
						$this->session->setBlock(new Vector($xr, $newHeight, $zr), $existing);
						++$blockChanged;

						for($y = $newHeight - 1 - $originY;$y >= 0;--$y){
							$copyFrom = (int) ($y * $scale);
							$this->session->setBlock(new Vector($xr, $originY + $y, $zr), $this->session->getBlock(new Vector($xr, $originY + $copyFrom, $zr)));
							++$blockChanged;
						}
					}
				}else if($curHeight > $newHeight){
					for($y = 0;$y < $newHeight - $originY;++$y){
						$copyFrom = (int) ($y * $scale);
						$this->session->setBlock(new Vector($xr, $originY + $y, $zr), $this->session->getBlock(new Vector($xr, $originY + $copyFrom, $zr)));
						++$blockChanged;
					}

					$this->session->setBlock(new Vector($xr, $newHeight, $zr), $this->session->getBlock(new Vector($xr, $curHeight, $zr)));
					++$blockChanged;

					for($y = $newHeight + 1;$y <= $curHeight;++$y){
						$this->session->setBlock(new Vector($xr, $y, $zr), $fillerAir);
						++$blockChanged;
					}
				}
			}
		}

		return $blockChanged;
	}
}<?php

namespace edit\math\convolution;

class HeightMapFilter{

	private $kernel;

	public function __construct(Kernel $kernel){
		$this->kernel = $kernel;
	}

	public function getKernel() : Kernel{
		return $this->kernel;
	}

	public function setKernel(Kernel $kernel){
		$this->kernel = $kernel;
	}

	public function filter(array $inData, int $width, int $height){
		$index = 0;
		$matrix = $this->kernel->getKernelData();
		$outData = [];

		$kh = $this->kernel->getHeight();
		$kw = $this->kernel->getWidth();
		$kox = $this->kernel->getXOrigin();
		$koy = $this->kernel->getYOrigin();

		for($y = 0;$y < $height;++$y){
			for($x = 0;$x < $width;++$x){
				$z = 0;
				for($ky = 0;$ky < $kh;++$ky){
					$offsetY = $y + $ky - $koy;

					if($offsetY < 0 || $offsetY >= $height){
						$offsetY = $y;
					}

					$offsetY *= $width;

					$matrixOffset = $ky * $kw;
					for($kx = 0;$kx < $kw;++$kx){
						$f = $matrix[$matrixOffset + $kx];
						if($f == 0) continue;

						$offsetX = $x + $kx - $kox;

						if($offsetX < 0 || $offsetX >= $width){
							$offsetX = $x;
						}

						$z += $f * $inData[$offsetY + $offsetX];
					}
				}
				$outData[$index++] = (int) ($z + 0.5);
			}
		}
		return $outData;
	}
}<?php

namespace edit\math\convolution;

class Kernel{

	private $width;
	private $height;
	private $xOrigin;
	private $yOrigin;
	private $data;

	public function __construct(int $width, int $height, array $data){
		$this->width = $width;
		$this->height = $height;
		$this->xOrigin = ($width - 1) >> 1;
		$this->yOrigin = ($height - 1) >> 1;
		$len = $width * $height;
		if(count($data) < $len){
			echo "error";
		}
		for($i = 0;$i < count($data);$i++){
			$this->data[$i] = $data[$i];
		}
	}

	public function getXOrigin() : int{
		return $this->xOrigin;
	}

	public function getYOrigin() : int{
		return $this->yOrigin;
	}

	public function getWidth() : int{
		return $this->width;
	}

	public function getHeight() : int{
		return $this->height;
	}

	public function getKernelData(array $data = []) : array{
		for($i = 0;$i < count($data);$i++){
			$this->data[$i] = $data[$i];
		}
		return $this->data;
	}
}<?php

namespce edit\math\interpolation;

interface Interpolation{

	public function setNodes(array $nodes);

	public function getPosition(float $position) : Vector;

	public function get1stDerivative(float $position) : Vector;

	function arcLength(float $positionA, float $positionB) : float;

	function getSegment(float $position) : int;

}
<?php

namespace edit\math\interpolation;

use edit\Vector;

class KochanekBartelsInterpolation implements Interpolation{

	private $nodes;
	private $coeffA;
	private $coeffB;
	private $coeffC;
	private $coeffD;
	private $scaling;

	public function __construct(){
		$this->setNodes([]);
	}

	public function setNodes(array $nodes){
		$this->nodes = $nodes;
		$this->recalc();
	}

	private function recalc(){
		$nNodes = count($this->nodes);
		$this->coeffA = [];
		$this->coeffB = [];
		$this->coeffC = [];
		$this->coeffD = [];

		if($nNodes == 0) return;

		$nodeB = $this->nodes[0];
		$tensionB = $nodeB->getTension();
		$biasB = $nodeB->getBias();
		$continuityB = $nodeB->getContinuity();
		for($i = 0;$i < $nNodes;++$i){
			$tensionA = $tensionB;
			$biasA = $biasB;
			$continuityA = $continuityB;

			if($i + 1 < $nNodes){
				$nodeB = $this->nodes[$i + 1];
				$tensionB = $nodeB->getTension();
				$biasB = $nodeB->getBias();
				$continuityB = $nodeB->getContinuity();
			}

			$ta = (1-$tensionA)*(1+$biasA)*(1+$continuityA)/2;
			$tb = (1-$tensionA)*(1-$biasA)*(1-$continuityA)/2;
			$tc = (1-$tensionB)*(1+$biasB)*(1-$continuityB)/2;
			$td = (1-$tensionB)*(1-$biasB)*(1+$continuityB)/2;

			$this->coeffA[$i] = $this->linearCombination($i,  -$ta,	   $ta-	 $tb-$tc+2,	   $tb+$tc-$td-2,  $td);
			$this->coeffB[$i] = $this->linearCombination($i, 2*$ta, -2*$ta+2*$tb+$tc-3, -2*$tb-$tc+$td+3, -$td);
			$this->coeffC[$i] = $this->linearCombination($i,  -$ta,	   $ta-	 $tb	 ,	  $tb		 ,	 0);
			$this->coeffD[$i] = $this->retrieve($i);
		}

		$this->scaling = count($this->nodes) - 1;
	}

	private function linearCombination(int $baseIndex, float $f1, float $f2, float $f3, float $f4) : Vector{
		$r1 = $this->retrieve($baseIndex - 1)->multiply($f1);
		$r2 = $this->retrieve($baseIndex	)->multiply($f2);
		$r3 = $this->retrieve($baseIndex + 1)->multiply($f3);
		$r4 = $this->retrieve($baseIndex + 2)->multiply($f4);

		return $r1->add($r2)->add($r3)->add($r4);
	}

	private function retrieve(int $index) : Vector{
		if($index < 0)
			return $this->fastRetrieve(0);

		if($index >= count($this->nodes))
			return $this->fastRetrieve(count($this->nodes)-1);

		return $this->fastRetrieve($index);
	}

	private function fastRetrieve(int $index) : Vector{
		return $this->nodes[$index]->getPosition();
	}

	public function getPosition(float position) : ?Vector{
		if($this->coeffA == null) throw new Exception('Must call setNodes first.', 0);

		if($position > 1) return null;

		$position *= $this->scaling;

		$index = (int) floor($position);
		$remainder = $position - $index;

		$a = $this->coeffA[$index];
		$b = $this->coeffB[$index];
		$c = $this->coeffC[$index];
		$d = $this->coeffD[$index];

		return $a->multiply($remainder)->add(b)->multiply($remainder)->add($c)->multiply($remainder)->add($d);
	}

	public function get1stDerivative(float $position) : ?Vector{
		if($this->coeffA == null) throw new Exception('Must call setNodes first.', 0);

		if($position > 1) return null;

		$position *= $this->scaling;

		$index = (int) floor($position);

		$a = $this->coeffA[$index];
		$b = $this->coeffB[$index];
		$c = $this->coeffC[$index];

		return $a->multiply(1.5*$position - 3.0*$index)->add($b)->multiply(2.0*$position)->add($a->multiply(1.5*$index)->subtract($b)->multiply(2.0*$index))->add($c)->multiply($scaling);
	}

	public function arcLength(double positionA, double positionB) : ?float{
		if($this->coeffA == null) throw new Exception('Must call setNodes first.', 0);

		if($positionA > $positionB)
			return $this->arcLength($positionB, $positionA);

		$positionA *= $this->scaling;
		$positionB *= $this->scaling;

		$indexA = (int) floor($positionA);
		$remainderA = $positionA - $indexA;

		$indexB = (int) floor($positionB);
		$remainderB = $positionB - $indexB;

		return $this->arcLengthRecursive($indexA, $remainderA, $indexB, $remainderB);
	}

	private function arcLengthRecursive(int $indexLeft, float $remainderLeft, int $indexRight, float $remainderRight) : float{
		switch ($indexRight - $indexLeft){
		case 0:
			return $this->arcLengthRecursive($indexLeft, $remainderLeft, $remainderRight);

		case 1:
			// This case is merely a speed-up for a very common case
			return
					$this->arcLengthRecursive($indexLeft, $remainderLeft, 1.0) +
					$this->arcLengthRecursive($indexRight, 0.0, $remainderRight);

		default:
			return
					$this->arcLengthRecursive($indexLeft, $remainderLeft, $indexRight - 1, 1.0) +
					$this->arcLengthRecursive($indexRight, 0.0, $remainderRight);
		}
	}

	private function arcLengthRecursive(int $index, float r$emainderLeft, float $remainderRight) : float{
		$a = $this->coeffA[$index]->multiply(3.0);
		$b = $this->coeffB[$index]->multiply(2.0);
		$c = $this->coeffC[$index];

		$nPoints = 8;

		$accum = $a->multiply($remainderLeft)->add($b)->multiply($remainderLeft)->add($c)->length() / 2.0;
		for($i = 1;$i < $nPoints-1;++$i) {
			$t = ((float) $i) / $nPoints;
			$t = ($remainderRight-$remainderLeft)*$t + $remainderLeft;
			$accum += $a.multiply($t)->add($b)->multiply($t)->add($c)->length();
		}

		$accum += $a->multiply($remainderRight)->add($b)->multiply($remainderRight)->add($c)->length() / 2.0;
		return $accum * ($remainderRight - $remainderLeft) / $nPoints;
	}

	public function getSegment(float $position) : ?int{
		if($this->coeffA == null) throw new Exception('Must call setNodes first.', 0);

		if($position > 1) return PHP_INT_MAX;

		$position *= $this->scaling;

		return (int) floor($position);
	}
}<?php

namespace edit\math\interpolation;

use edit\Vector;

class Node{

	private $position;

	private $tension;
	private $bias;
	private $continuity;

	public function __construct() {
		this(new Vector(0, 0, 0));
	}

	public function __construct(Node $other = null){
		if($other == null) $other = new Vector(0, 0, 0);
		if($other instanceof Node){
			$this->position = $other->position;

			$this->tension = $other->tension;
			$this->bias = $other->bias;
			$this->continuity = $other->continuity;
		}else{
			$this->position = $other;
		}
	}


	public function getPosition() : Vector{
		return $this->position;
	}

	public function setPosition(Vector $position){
		$this->position = $position;
	}

	public function getTension() : float{
		return $this->tension;
	}

	public function setTension(float $tension){
		$this->tension = $tension;
	}

	public function getBias() : float{
		return $this->bias;
	}

	public function setBias(float $bias){
		$this->bias = $bias;
	}

	public function getContinuity() : float{
		return $this->continuity;
	}

	public function setContinuity(float $continuity){
		$this->continuity = $continuity;
	}

}<?php

namespace edit\math;

class MathUtils {

	//const SAFE_MIN = 0x1.0p-1022;

	private function __construct(){
	}

	public static function divisorMod(int $a, int $n) : int{
		return (int) ($a - $n * floor(floor($a) / $n));
	}

	public static function dCos(float $degrees) : float{
		$dInt = (int) $degrees;
		if($degrees == $dInt && $dInt % 90 == 0){
			$dInt %= 360;
			if($dInt < 0){
				$dInt += 360;
			}
			switch($dInt){
			case 0:
				return 1.0;
			case 90:
				return 0.0;
			case 180:
				return -1.0;
			case 270:
				return 0.0;
			}
		}
		return cos(deg2rad($degrees));
	}

	public static function dSin(float $degrees) : float{
		$dInt = (int) $degrees;
		if($degrees == $dInt && $dInt % 90 == 0){
			$dInt %= 360;
			if($dInt < 0){
				$dInt += 360;
			}
			switch($dInt){
			case 0:
				return 0.0;
			case 90:
				return 1.0;
			case 180:
				return 0.0;
			case 270:
				return -1.0;
			}
		}
		return sin(deg2rad($degrees));
	}

	public static function roundHalfUp(float $value) : float{
		return signum($value) * round(abs($value));
	}
}<?php

namespace edit\math\transform;

use edit\Vector;
use edit\math\MathUtils;

class AffineTransform implements Transform{

	private $m00;
	private $m01;
	private $m02;
	private $m03;

	private $m10;
	private $m11;
	private $m12;
	private $m13;

	private $m20;
	private $m21;
	private $m22;
	private $m23;

	public function __construct($xx = null, $yx = null, $zx = null, $tx = null, $xy = null, $yy = null, $zy = null, $ty = null, $xz = null, $yz = null, $zz = null, $tz = null){
		if(is_numeric($xx)){
			$this->m00 = $xx;
			$this->m01 = $yx;
			$this->m02 = $zx;
			$this->m03 = $tx;
			$this->m10 = $xy;
			$this->m11 = $yy;
			$this->m12 = $zy;
			$this->m13 = $ty;
			$this->m20 = $xz;
			$this->m21 = $yz;
			$this->m22 = $zz;
			$this->m23 = $tz;
		}else if($xx != null){
			if(count($xx) == 9){
				$this->m00 = $xx[0];
				$this->m01 = $xx[1];
				$this->m02 = $xx[2];
				$this->m10 = $xx[3];
				$this->m11 = $xx[4];
				$this->m12 = $xx[5];
				$this->m20 = $xx[6];
				$this->m21 = $xx[7];
				$this->m22 = $xx[8];
			}else if(count($xx) == 12){
				$this->m00 = $xx[0];
				$this->m01 = $xx[1];
				$this->m02 = $xx[2];
				$this->m03 = $xx[3];
				$this->m10 = $xx[4];
				$this->m11 = $xx[5];
				$this->m12 = $xx[6];
				$this->m13 = $xx[7];
				$this->m20 = $xx[8];
				$this->m21 = $xx[9];
				$this->m22 = $xx[10];
				$this->m23 = $xx[11];
			}
		}else{
			$this->m00 = $this->m11 = $this->m22 = 1;
			$this->m01 = $this->m02 = $this->m03 = 0;
			$this->m10 = $this->m12 = $this->m13 = 0;
			$this->m20 = $this->m21 = $this->m23 = 0;
		}
	}

	public function isIdentity() : bool{
		if($this->m00 != 1)
			return false;
		if($this->m11 != 1)
			return false;
		if($this->m22 != 1)
			return false;
		if($this->m01 != 0)
			return false;
		if($this->m02 != 0)
			return false;
		if($this->m03 != 0)
			return false;
		if($this->m10 != 0)
			return false;
		if($this->m12 != 0)
			return false;
		if($this->m13 != 0)
			return false;
		if($this->m20 != 0)
			return false;
		if($this->m21 != 0)
			return false;
		if($this->m23 != 0)
			return false;
		return true;
	}

	public function coefficients() : array{
		return [$this->m00, $this->m01, $this->m02, $this->m03, $this->m10, $this->m11, $this->m12, $this->m13, $this->m20, $this->m21, $this->m22, $this->m23];
	}

	private function determinant() : float{
		return $this->m00 * ($this->m11 * $this->m22 - $this->m12 * $this->m21) - $this->m01 * ($this->m10 * $this->m22 - $this->m20 * $this->m12)
				+ $this->m02 * ($this->m10 * $this->m21 - $this->m20 * $this->m11);
	}

	public function inverse() : Transform{
		$det = $this->determinant();
		return new AffineTransform(
				($this->m11 * $this->m22 - $this->m21 * $this->m12) / $det,
				($this->m21 * $this->m02 - $this->m01 * $this->m22) / $det,
				($this->m01 * $this->m12 - $this->m11 * $this->m02) / $det,
				($this->m01 * ($this->m22 * $this->m13 - $this->m12 * $this->m23) + $this->m02 * ($this->m11 * $this->m23 - $this->m21 * $this->m13)
						- $this->m03 * ($this->m11 * $this->m22 - $this->m21 * $this->m12)) / $det,
				($this->m20 * $this->m12 - $this->m10 * $this->m22) / $det,
				($this->m00 * $this->m22 - $this->m20 * $this->m02) / $det,
				($this->m10 * $this->m02 - $this->m00 * $this->m12) / $det,
				($this->m00 * ($this->m12 * $this->m23 - $this->m22 * $this->m13) - $this->m02 * ($this->m10 * $this->m23 - $this->m20 * $this->m13)
						+ $this->m03 * ($this->m10 * $this->m22 - $this->m20 * $this->m12)) / $det,
				($this->m10 * $this->m21 - $this->m20 * $this->m11) / $det,
				($this->m20 * $this->m01 - $this->m00 * $this->m21) / $det,
				($this->m00 * $this->m11 - $this->m10 * $this->m01) / $det,
				($this->m00 * ($this->m21 * $this->m13 - $this->m11 * $this->m23) + $this->m01 * ($this->m10 * $this->m23 - $this->m20 * $this->m13)
						- $this->m03 * ($this->m10 * $this->m21 - $this->m20 * $this->m11)) / $det);
	}

	public function concatenate(AffineTransform $that) : AffineTransform{
		$n00 = $this->m00 * $that->m00 + $this->m01 * $that->m10 + $this->m02 * $that->m20;
		$n01 = $this->m00 * $that->m01 + $this->m01 * $that->m11 + $this->m02 * $that->m21;
		$n02 = $this->m00 * $that->m02 + $this->m01 * $that->m12 + $this->m02 * $that->m22;
		$n03 = $this->m00 * $that->m03 + $this->m01 * $that->m13 + $this->m02 * $that->m23 + $this->m03;
		$n10 = $this->m10 * $that->m00 + $this->m11 * $that->m10 + $this->m12 * $that->m20;
		$n11 = $this->m10 * $that->m01 + $this->m11 * $that->m11 + $this->m12 * $that->m21;
		$n12 = $this->m10 * $that->m02 + $this->m11 * $that->m12 + $this->m12 * $that->m22;
		$n13 = $this->m10 * $that->m03 + $this->m11 * $that->m13 + $this->m12 * $that->m23 + $this->m13;
		$n20 = $this->m20 * $that->m00 + $this->m21 * $that->m10 + $this->m22 * $that->m20;
		$n21 = $this->m20 * $that->m01 + $this->m21 * $that->m11 + $this->m22 * $that->m21;
		$n22 = $this->m20 * $that->m02 + $this->m21 * $that->m12 + $this->m22 * $that->m22;
		$n23 = $this->m20 * $that->m03 + $this->m21 * $that->m13 + $this->m22 * $that->m23 + $this->m23;
		return new AffineTransform(
				$n00, $n01, $n02, $n03,
				$n10, $n11, $n12, $n13,
				$n20, $n21, $n22, $n23);
	}

	public function preConcatenate(AffineTransform $that) : AffineTransform{
		$n00 = $that->m00 * $this->m00 + $that->m01 * $this->m10 + $that->m02 * $this->m20;
		$n01 = $that->m00 * $this->m01 + $that->m01 * $this->m11 + $that->m02 * $this->m21;
		$n02 = $that->m00 * $this->m02 + $that->m01 * $this->m12 + $that->m02 * $this->m22;
		$n03 = $that->m00 * $this->m03 + $that->m01 * $this->m13 + $that->m02 * $this->m23 + $that->m03;
		$n10 = $that->m10 * $this->m00 + $that->m11 * $this->m10 + $that->m12 * $this->m20;
		$n11 = $that->m10 * $this->m01 + $that->m11 * $this->m11 + $that->m12 * $this->m21;
		$n12 = $that->m10 * $this->m02 + $that->m11 * $this->m12 + $that->m12 * $this->m22;
		$n13 = $that->m10 * $this->m03 + $that->m11 * $this->m13 + $that->m12 * $this->m23 + $that->m13;
		$n20 = $that->m20 * $this->m00 + $that->m21 * $this->m10 + $that->m22 * $this->m20;
		$n21 = $that->m20 * $this->m01 + $that->m21 * $this->m11 + $that->m22 * $this->m21;
		$n22 = $that->m20 * $this->m02 + $that->m21 * $this->m12 + $that->m22 * $this->m22;
		$n23 = $that->m20 * $this->m03 + $that->m21 * $this->m13 + $that->m22 * $this->m23 + $that->m23;
		return new AffineTransform(
				$n00, $n01, $n02, $n03,
				$n10, $n11, $n12, $n13,
				$n20, $n21, $n22, $n23);
	}

	public function translate($x, $y = null, $z = null) : AffineTransform{
		if($y == null){
			$y = $x->getY();
			$z = $x->getZ();
			$x = $x->getX();
		}
		return $this->concatenate(new AffineTransform(1, 0, 0, $x, 0, 1, 0, $y, 0, 0, 1, $z));
	}

	public function rotateX(float $theta) : AffineTransform{
		$cot = MathUtils::dCos($theta);
		$sit = MathUtils::dSin($theta);
		return $this->concatenate(
				new AffineTransform(
						1, 0, 0, 0,
						0, $cot, -$sit, 0,
						0, $sit, $cot, 0));
	}

	public function rotateY(float $theta) : AffineTransform{
		$cot = MathUtils::dCos($theta);
		$sit = MathUtils::dSin($theta);
		return $this->concatenate(
				new AffineTransform(
						$cot, 0, $sit, 0,
						0, 1, 0, 0,
						-$sit, 0, $cot, 0));
	}

	public function rotateZ(float $theta) : AffineTransform{
		$cot = MathUtils::dCos($theta);
		$sit = MathUtils::dSin($theta);
		return $this->concatenate(
				new AffineTransform(
						$cot, -$sit, 0, 0,
						$sit, $cot, 0, 0,
						0, 0, 1, 0));
	}

	public function scale($sx, $sy = null, $sz = null) : AffineTransform{
		if($sx instanceof Vector){
			$sy = $sx->getY();
			$sz = $sx->getZ();
			$sx = $sx->getX();
		}
		if($sy == null){
			$sy = $sx;
			$sz = $sx;
		}
		return $this->concatenate(new AffineTransform($sx, 0, 0, 0, 0, $sy, 0, 0, 0, 0, $sz, 0));
	}

	public function apply(Vector $vector) : Vector{
		return new Vector(
				$vector->getX() * $this->m00 + $vector->getY() * $this->m01 + $vector->getZ() * $this->m02 + $this->m03,
				$vector->getX() * $this->m10 + $vector->getY() * $this->m11 + $vector->getZ() * $this->m12 + $this->m13,
				$vector->getX() * $this->m20 + $vector->getY() * $this->m21 + $vector->getZ() * $this->m22 + $this->m23);
	}

	public function combine(Transform $other) : Transform{
		if($other instanceof AffineTransform){
			return $this->concatenate($other);
		}else{
			return new CombinedTransform([$this, $other]);
		}
	}


}<?php

namespace edit\math\transform;

use edit\Vector;

class CombinedTransform implements Transform{

	private $transforms;

	public function __construct(array $transforms){
		$this->transforms = $transforms;
	}

	public function isIdentity() : bool{
		foreach($this->transforms as $transform){
			if(!$transform->isIdentity()){
				return false;
			}
		}

		return true;
	}

	public function apply(Vector vector) : Vector{
		foreach($this->transforms as $transform){
			$vector = $transform->apply($vector);
		}
		return $vector;
	}

	public function inverse() : Transform{
		$list = [];
		for($i = count($transforms - 1);$i >= 0;$i--){
			$list[] = $this->transforms[$i]->inverse();
		}
		return new CombinedTransform($list);
	}

	public function combine(Transform other) : Transform{
		if($other instanceof CombinedTransform){
			$newTransforms = [];
			foreach($this->transforms as $transform){
				$newTransforms[] = $transform;
			}
			foreach($other->transforms as $transform){
				$newTransforms[] = $transform;
			}
			return new CombinedTransform($newTransforms);
		}else{
			$newTransforms = [];
			foreach($this->transforms as $transform){
				$newTransforms[] = $transform;
			}
			$newTransforms[] = $other;
			return new CombinedTransform($newTransforms);
		}
	}

}<?php

namespace edit\math\transform;

use edit\Vector;

class Identity implements Transform{

	public function isIdentity() : bool{
		return true;
	}

	public function apply(Vector $vector) : Vector{
		return $vector;
	}

	public function inverse() : Transform{
		return $this;
	}

	public function combine(Transform $other) : Transform{
		if($other instanceof Identity){
			return $this;
		}else{
			return $other;
		}
	}
}<?php

namespace edit\math\transform;

use edit\Vector;

interface Transform{

	function isIdentity() : bool;

	function apply(Vector $input) : Vector;

	function inverse() : Transform;

	function combine(Transform $other) : Transform;

}<?php

namespace edit\regions;

use edit\Vector;
use edit\extent\buffer\ForgetfulExtentBuffer;

class AbstractBufferRegion extends AbstractRegion{

	private $buffer;

	public function __construct(ForgetfulExtentBuffer $buffer){
		$this->buffer = $buffer;
	}

	public function getMinimumPoint() : Vector{
		return $this->buffer->min != null ? $this->buffer->min : new Vector(0, 0, 0);
	}

	public function getMaximumPoint() : Vector{
		return $this->buffer->max != null ? $this->buffer->max : new Vector(0, 0, 0);
	}

	public function expand(array $changes){
	}

	public function contract(array $changes){
	}

	public function contains(Vector $position) : bool{
		return isset($this->buffer->buffer[$position->toBlockVector()->toString()]);
	}

	public function iterator() : array{
		$result = [];

		foreach($this->buffer->buffer as $v => $b){
			$v = ltrim($v, '(');
			$v = rtrim($v, ')');
			$vs = explode(", ", $v);
			$result[] = new Vector($vs[0], $vs[1], $vs[2]);
		}

		return $result;
	}

}<?php

namespace edit\regions;

use pocketmine\level\Level;

use edit\Vector;

abstract class AbstractRegion implements Region{

	protected $world;

	public function __construct(Level $world){
		$this->world = $world;
	}

	public function getCenter() : Vector{
		return $this->getMinimumPoint()->add($this->getMaximumPoint())->divide(2);
	}

	public function iterator(){
	}

	public function getWorld() : Level{
		return $this->world;
	}

	public function setWorld(Level $world){
		$this->world = $world;
	}

	public function shift(Vector $change){
		$this->expand($change);
		$this->constract($change);
	}

	public function polygonize(int $maxPoints) : array{
		
	}

	public function getArea() : int{
		$min = $this->getMinimumPoint();
		$max = $this->getMaximumPoint();

		return (int)(($max->getX() - $min->getX() + 1) *
				($max->getY() - $min->getY() + 1) *
				($max->getZ() - $min->getZ() + 1));
	}

	public function getWidth() : int{
		$min = $this->getMinimumPoint();
		$max = $this->getMaximumPoint();

		return (int) ($max->getX() - $min->getX() + 1);
	}

	public function getHeight() : int{
		$min = $this->getMinimumPoint();
		$max = $this->getMaximumPoint();

		return (int) ($max->getY() - $min->getY() + 1);
	}

	public function getLength() : int{
		$min = $this->getMinimumPoint();
		$max = $this->getMaximumPoint();

		return (int) ($max->getZ() - $min->getZ() + 1);
	}
}<?php

namespace edit\regions;

use edit\Vector;
use edit\Vector2D;
use edit\util\UtilIterable;

class CuboidRegion extends AbstractRegion implements FlatRegion{

	private $pos1;
	private $pos2;

	public function __construct($pos1, $pos2){
		$this->pos1 = $pos1;
		$this->pos2 = $pos2;
	}

	public function getPos1() : Vector{
		return $this->pos1;
	}

	public function setPos1(?Vector $pos1){
		$this->pos1 = $pos1;
	}

	public function getPos2() : Vector{
		return $this->pos2;
	}

	public function setPos2(?Vector $pos2){
		$this->pos2 = $pos2;
	}

	private function recalculate(){
		$this->pos1 = $this->pos1->clampY(0, 255);
		$this->pos2 = $this->pos2->clampY(0, 255);
	}

	public function getFaces() : Region{
		$min = $this->getMinimumPoint();
		$max = $this->getMaximumPoint();

		return new RegionIntersection([
				new CuboidRegion($this->pos1->setX($min->getX()), $this->pos2->setX($min->getX())),
				new CuboidRegion($this->pos1->setX($max->getX()), $this->pos2->setX($max->getX())),

				new CuboidRegion($this->pos1->setZ($min->getZ()), $this->pos2->setZ($min->getZ())),
				new CuboidRegion($this->pos1->setZ($max->getZ()), $this->pos2->setZ($max->getZ())),

				new CuboidRegion($this->pos1->setY($min->getY()), $this->pos2->setY($min->getY())),
				new CuboidRegion($this->pos1->setY($max->getY()), $this->pos2->setY($max->getY()))
		]);
	}

	public function getWalls() : Region{
		$min = $this->getMinimumPoint();
		$max = $this->getMaximumPoint();

		return new RegionIntersection([
				new CuboidRegion($this->pos1->setX($min->getX()), $this->pos2->setX($min->getX())),
				new CuboidRegion($this->pos1->setX($max->getX()), $this->pos2->setX($max->getX())),

				new CuboidRegion($this->pos1->setZ($min->getZ()), $this->pos2->setZ($min->getZ())),
				new CuboidRegion($this->pos1->setZ($max->getZ()), $this->pos2->setZ($max->getZ()))
		]);
	}

	public function getMinimumPoint() : Vector{
		return new Vector(min($this->pos1->getX(), $this->pos2->getX()),
				min($this->pos1->getY(), $this->pos2->getY()),
				min($this->pos1->getZ(), $this->pos2->getZ()));
	}

	public function getMaximumPoint() : Vector{
		return new Vector(max($this->pos1->getX(), $this->pos2->getX()),
				max($this->pos1->getY(), $this->pos2->getY()),
				max($this->pos1->getZ(), $this->pos2->getZ()));
	}

	public function getMinimumY() : int{
		return min($this->pos1->getBlockY(), $this->pos2->getBlockY());
	}

	public function getMaximumY() : int{
		return max($this->pos1->getBlockY(), $this->pos2->getBlockY());
	}

	public function expand(array $changes){
		foreach($changes as $change) {
			if($change->getX() > 0){
				if(max($this->pos1->getX(), $this->pos2->getX()) == $this->pos1->getX()){
					$this->pos1 = $this->pos1->add(new Vector($change->getX(), 0, 0));
				}else{
					$this->pos2 = $this->pos2->add(new Vector($change->getX(), 0, 0));
				}
			}else{
				if(min($this->pos1->getX(), $this->pos2->getX()) == $this->pos1->getX()){
					$this->pos1 = $this->pos1->add(new Vector($change->getX(), 0, 0));
				}else{
					$this->pos2 = $this->pos2->add(new Vector($change->getX(), 0, 0));
				}
			}

			if($change->getY() > 0){
				if(max($this->pos1->getY(), $this->pos2->getY()) == $this->pos1->getY()){
					$this->pos1 = $this->pos1->add(new Vector(0, $change->getY(), 0));
				}else{
					$this->pos2 = $this->pos2->add(new Vector(0, $change->getY(), 0));
				}
			}else{
				if(min($this->pos1->getY(), $this->pos2->getY()) == $this->pos1->getY()){
					$this->pos1 = $this->pos1->add(new Vector(0, $change->getY(), 0));
				}else{
					$this->pos2 = $this->pos2->add(new Vector(0, $change->getY(), 0));
				}
			}

			if($change->getZ() > 0){
				if(max($this->pos1->getZ(), $this->pos2->getZ()) == $this->pos1->getZ()){
					$this->pos1 = $this->pos1->add(new Vector(0, 0, $change->getZ()));
				}else{
					$this->pos2 = $this->pos2->add(new Vector(0, 0, $change->getZ()));
				}
			}else{
				if(min($this->pos1->getZ(), $this->pos2->getZ()) == $this->pos1->getZ()){
					$this->pos1 = $this->pos1->add(new Vector(0, 0, $change->getZ()));
				} else {
					$this->pos2 = $this->pos2->add(new Vector(0, 0, $change->getZ()));
				}
			}
		}

		$this->recalculate();
	}

	public function contract(array $changes){
		foreach($changes as $change){
			if ($change->getX() < 0) {
				if (max($this->pos1->getX(), $this->pos2->getX()) == $this->pos1->getX()) {
					$this->pos1 = $this->pos1->add(new Vector($change->getX(), 0, 0));
				} else {
					$this->pos2 = $this->pos2->add(new Vector($change->getX(), 0, 0));
				}
			}else{
				if(min($this->pos1->getX(), $this->pos2->getX()) == $this->pos1->getX()) {
					$this->pos1 = $this->pos1->add(new Vector($change->getX(), 0, 0));
				}else{
					$this->pos2 = $this->pos2->add(new Vector($change->getX(), 0, 0));
				}
			}

			if($change->getY() < 0){
				if(max($this->pos1->getY(), $this->pos2->getY()) == $this->pos1->getY()){
					$this->pos1 = $this->pos1->add(new Vector(0, $change->getY(), 0));
				}else{
					$this->pos2 = $this->pos2->add(new Vector(0, $change->getY(), 0));
				}
			}else{
				if(min($this->pos1->getY(), $this->pos2->getY()) == $this->pos1->getY()){
					$this->pos1 = $this->pos1->add(new Vector(0, $change->getY(), 0));
				}else{
					$this->pos2 = $this->pos2->add(new Vector(0, $change->getY(), 0));
				}
			}

			if($change->getZ() < 0){
				if(max($this->pos1->getZ(), $this->pos2->getZ()) == $this->pos1->getZ()){
					$this->pos1 = $this->pos1->add(new Vector(0, 0, $change->getZ()));
				}else{
					$this->pos2 = $this->pos2->add(new Vector(0, 0, $change->getZ()));
				}
			}else{
				if(min($this->pos1->getZ(), $this->pos2->getZ()) == $this->pos1->getZ()){
					$this->pos1 = $this->pos1->add(new Vector(0, 0, $change->getZ()));
				}else{
					$this->pos2 = $this->pos2->add(new Vector(0, 0, $change->getZ()));
				}
			}
		}

		$this->recalculate();
	}

	public function shift(Vector $change){
		$this->pos1 = $this->pos1->add($change);
		$this->pos2 = $this->pos2->add($change);

		$this->recalculate();
	}

	public function contains(Vector $position) : bool{
		$x = $position->getX();
		$y = $position->getY();
		$z = $position->getZ();

		$min = $this->getMinimumPoint();
		$max = $this->getMaximumPoint();

		return $x >= $min->getBlockX() && $x <= $max->getBlockX()
				&& $y >= $min->getBlockY() && $y <= $max->getBlockY()
				&& $z >= $min->getBlockZ() && $z <= $max->getBlockZ();
	}

	public function iterator() : array{
		$min = $this->getMinimumPoint();
		$max = $this->getMaximumPoint();

		$result = [];

		for($x = $min->getX();$x <= $max->getX();$x++){
			for($y = $min->getY();$y <= $max->getY();$y++){
				for($z = $min->getZ();$z <= $max->getZ();$z++){
					$result[] = new Vector($x, $y, $z);
				}
			}
		}

		return $result;
	}

	public function asFlatRegion() : array{
		$min = $this->getMinimumPoint();
		$max = $this->getMaximumPoint();

		$result = [];

		for($x = $min->getX();$x <= $max->getX();$x++){
			for($z = $min->getZ();$z <= $max->getZ();$z++){
				$result[] = new Vector2D($x, $z);
			}
		}

		return $result;
	}

}<?php

namespace edit\regions;

class CylinderRegion extends Region{

	private $center;
	private $radius;
	private $minY;
	private $maxY;
	private $hasY = false;

	public function __construct(Vector $center, Vector2D $radius, int $minY, int $maxY){
		$this->setCenter($center->toVector2D());
		$this->setRadius($radius);
		$this->minY = $minY;
		$this->maxY = $maxY;
		$this->hasY = true;
	}

	public function getCenter() : Vector{
		return $this->center->toVector(($this->maxY + $this->minY) / 2);
	}

	public function setCenter(Vector2D $center){
		if($center instanceof Vector) $center = $center->toVector2D();
		$this->center = $center;
	}

	public function getRadius() : Vector2D{
		return $this->radius->subtract(0.5, 0.5);
	}

	public function setRadius(Vector2D $radius){
		$this->radius = $radius->add(0.5, 0.5);
	}

	public function extendRadius(Vector2D $minRadius){
		$this->setRadius(Vector2D::getMaximum($minRadius, $this->getRadius()));
	}

	public function setMinimumY(int $y){
		$this->hasY = true;
		$this->minY = $y;
	}

	public function setMaximumY(int $y) {
		$this->hasY = true;
		$this->maxY = y;
	}

	public function getMinimumPoint() : Vector{
		return $this->center->subtract($this->getRadius())->toVector($this->minY);
	}

	public function getMaximumPoint() : Vector{
		return $this->center->add($this->getRadius())->toVector($this->maxY);
	}

	public function getMaximumY() : int{
		return $this->maxY;
	}

	public function getMinimumY() : int{
		return $this->minY;
	}

	public function getArea() : int{
		return (int) floor($this->radius->getX() * $this->radius->getZ() * M_PI * $this->getHeight());
	}

	public function getWidth() : int{
		return (int) (2 * $this->radius->getX());
	}

	public function getHeight() : int{
		return $this->maxY - $this->minY + 1;
	}

	public function getLength() : int{
		return (int) (2 * $this->radius->getZ());
	}

	private function calculateDiff2D(array $changes) : Vector2D{
		$diff = new Vector2D();
		foreach($changes as $change){
			$diff = $diff->add($change->toVector2D());
		}

		if(($diff->getBlockX() & 1) + ($diff->getBlockZ() & 1) != 0){
		}

		return $diff->divide(2)->floor();
	}

	private function calculateChanges2D(array $changes) : Vector2D{
		$total = new Vector2D();
		for($changes as $change){
			$total = $total->add($change->toVector2D()->positive());
		}

		return $total->divide(2)->floor();
	}

	public function expand(array $changes){
		$this->center = $this->center->add($this->calculateDiff2D($changes));
		$this->radius = $this->radius->add($this->calculateChanges2D($changes));
		foreach($changes as $change){
			$changeY = $change->getBlockY();
			if($changeY > 0){
				$this->maxY += $changeY;
			}else{
				$this->minY += $changeY;
			}
		}
	}

	public function contract(array $changes){
		$this->center = $this->center->subtract($this->calculateDiff2D($changes));
		$newRadius = $this->radius->subtract($this->calculateChanges2D($changes));
		$this->radius = Vector2D::getMaximum(new Vector2D(1.5, 1.5), $newRadius);
		foreach($changes as $change){
			$height = $this->maxY - $this->minY;
			$changeY = $change->getBlockY();
			if($changeY > 0){
				$this->minY += min($height, $changeY);
			}else{
				$this->maxY += max(-$height, $changeY);
			}
		}
	}

	public function shift(Vector $change){
		$this->center = $this->center->add($change->toVector2D());

		$changeY = $change->getBlockY();
		$this->maxY += $changeY;
		$this->minY += $changeY;
	}

	public function contains(Vector $position) {
		$blockY = $position->getBlockY();
		if($blockY < $this->minY || $blockY > $this->maxY){
					return false;
		}

		return $position->toVector2D()->subtract($this->center)->divide($this->radius)->lengthSq() <= 1;
	}

	public function setY(int $y) : bool{
		if(!$this->hasY){
			$this->minY = $y;
			$this->maxY = $y;
			$this->hasY = true;
			return true;
		}else if($y < $this->minY){
			$this->minY = $y;
			return true;
		}else if($y > $this->maxY){
			$this->maxY = $y;
			return true;
		}

		return false;
	}

	public function iterator(){
		return new FlatRegion3DIterator(z4this);
	}
}<?php

namespace edit\regions;

use edit\util\UtilIterable;

interface FlatRegion extends Region{

	public function getMinimumY() : int;

	public function getMaximumY() : int;

	public function asFlatRegion() : array;
}
<?php

namespace edit\regions;

use edit\Vector;

interface Region{

    public function getMinimumPoint() : Vector;

    public function getMaximumPoint() : Vector;

    public function getCenter() : Vector;

    public function getWidth() : int;

    public function getHeight() : int;

    public function getLength() : int;
}<?php

namespace edit\regions;

class RegionIntersection{

	public $regions = [];

	public function __construct(array $regions){
		$this->regions = $regions;
	}

	public function getMinimumPoint() : Vector{
		$minimum = $this->regions[0]->getMinimumPoint();
		for($i = 1;$i < count($this->regions);$i++){
			$minimum = Vector::getMinimum($this->regions[$i]->getMinimumPoint(), $minimum);
		}
		return $minimum;
	}

	public function getMaximumPoint() : Vector{
		$maximum = $this->regions[0]->getMaximumPoint();
		for($i = 1;$i < count($this->regions);$i++){
			$maximum = Vector::getMaximum($this->regions[$i]->getMaximumPoint(), $maximum);
		}
		return $maximum;
	}

	public function expand(array $changes){
	}

	public function contract(array $changes){
	}

	public function contains(Vector $position) : bool{
		for($this->regions as $region){
			if($region->contains($position)){
				return true;
			}
		}

		return false;
	}
}<?php

namespace edit\regions;

use pocketmine\level\Level;
use pocketmine\Player;

use edit\Vector;
use edit\BlockVector;

interface RegionSelector{

	public function getWorld() : Level;

	public function setWorld(Level $world);

	public function selectPrimary(Vector $position) : bool;

	public function selectSecondary(Vector $position) : bool;

	public function explainPrimarySelection(Player $player);

	public function explainSecondarySelection(Player $player);

	public function explainRegionAdjust(Player $player);

	public function getPrimaryPosition() : BlockVector;

	public function getRegion() : Region;

	public function getIncompleteRegion() : Region;

	public function isDefined() : bool;

	public function getArea() : int;

	public function learnChanges();

	public function clear();

	public function getTypeName() : string;

	public function getInformationLines() : array;

}<?php

namespace edit\regions\selector;

use pocketmine\level\Level;
use pocketmine\Player;

use edit\regions\RegionSelector;
use edit\regions\CuboidRegion;
use edit\regions\Region;
use edit\BlockVector;
use edit\Vector;
use edit\Main;

class CuboidRegionSelector implements RegionSelector{

	public $region;

	public $position1 = null;
	public $position2 = null;

	public function __construct($world, ?Vector $position1 = null, ?Vector $position2 = null){
		if($world instanceof Level){
			$this->region = new CuboidRegion($world, $position1, $position2);
			$this->position1 = $position1;
			$this->position2 = $position2;
		}else{
			$this->region = new CuboidRegion($world->getIncompleteRegion()->getWorld(), null, null);

			if($world instanceof CuboidRegionSelector){
				$this->position1 = $world->position1;
				$this->position2 = $world->position2;
			}else{
				$oldRegion = $world->getRegion();

				$this->position1 = $oldRegion->getMinimumPoint()->toBlockVector();
				$this->position1 = $oldRegion->getMaximumPoint()->toBlockVector();
			}
		}

		$this->region->setPos1($this->position1);
		$this->region->setPos2($this->position2);
	}

	public function getWorld() : Level{
		return $this->region->getWorld();
	}

	public function setWorld(Level $world){
		$this->region->setWorld($world);
	}

	public function selectPrimary(Vector $position) : bool{
		//if($this->position1 != null && ($position->compareTo($this->position1) == 0)){
		//	return false;
		//}

		$this->position1 = $position->toBlockVector();
		$this->region->setPos1($this->position1);
		return true;
	}

	public function selectSecondary(Vector $position) : bool{
		//if($this->position2 != null && ($position->compareTo($this->position2) == 0)){
		//	return false;
		//}

		$this->position2 = $position->toBlockVector();
		$this->region->setPos2($this->position2);
		return true;
	}

	public function explainPrimarySelection(Player $player){
		if($this->position1 != null && $this->position2 != null){
			$player->sendMessage(Main::LOGO."Pos1ã‚’è¨­å®šã—ã¾ã—ãŸ " . $this->position1->toString() . " (" . $this->region->getArea() . ").");
		}else{
			$player->sendMessage(Main::LOGO."Pos1ã‚’è¨­å®šã—ã¾ã—ãŸ " . $this->position1->toString() . ".");
		}
	}

	public function explainSecondarySelection(Player $player){
		if($this->position1 != null && $this->position2 != null){
			$player->sendMessage(Main::LOGO."Pos2ã‚’è¨­å®šã—ã¾ã—ãŸ " . $this->position2->toString() . " (" . $this->region->getArea() . ").");
		}else{
			$player->sendMessage(Main::LOGO."Pos2ã‚’è¨­å®šã—ã¾ã—ãŸ " . $this->position2->toString() . ".");
		}
	}

	public function explainRegionAdjust(Player $player){
		$this->explainPrimarySelection($player);
		$this->explainSecondarySelection($player);
	}

	public function getPrimaryPosition() : BlockVector{
		return $this->position1;
	}

	public function getSecondaryPosition() : BlockVector{
		return $this->position2;
	}

	public function isDefined() : bool{
		return $this->position1 != null && $this->position2 != null;
	}

	public function getRegion() : Region{
		return $this->region;
	}

	public function getIncompleteRegion() : Region{
		return $this->region;
	}

	public function learnChanges(){
		$this->position1 = $this->region->getPos1()->toBlockVector();
		$this->position2 = $this->region->getPos2()->toBlockVector();
	}

	public function clear(){
		$this->position1 = null;
		$this->position2 = null;
	}

	public function getTypeName() : string{
		return "cuboid";
	}

	public function getInformationLines() : array{
		$lines = [];

		if($this->position1 != null){
			$lines[] = "Position 1: " + $this->position1->toString();
		}

		if($this->position2 != null){
			$lines[] = "Position 2: " + $this->position2->toString();
		}

		return $lines;
	}

	public function getArea() : int{
		if($this->position1 == null){
			return -1;
		}

		if($this->position2 == null){
			return -1;
		}

		return $this->region->getArea();
	}
}<?php

namespace edit\regions\selector;

use pocketmine\level\Level;
use pocketmine\Player;

use edit\regions\RegionSelector;
use edit\regions\CuboidRegion;
use edit\regions\Region;
use edit\BlockVector;
use edit\Vector;

class Polygonal2DRegionSelector implements RegionSelector{
}<?php

namespace edit\session;

use pocketmine\level\Level;

use edit\extent\Extent;
use edit\extent\clipboard\Cipboard;
use edit\math\transform\Transform;
use edit\math\transform\Identity;
use edit\extent\clipboard\Clipboard;

class ClipboardHolder{

	private $world;
	private $clipboard;
	private $transform;

	public function __construct(Clipboard $clipboard, Level $worldData){
		$this->clipboard = $clipboard;
		$this->worldData = $worldData;
		$this->transform = new Identity();
	}

	public function getWorldData() : Level{
		return $this->worldData;
	}

	public function getClipboard() : Clipboard{
		return $this->clipboard;
	}

	public function setTransform(Transform $transform){
		$this->transform = $transform;
	}

	public function getTransform() : Transform{
		return $this->transform;
	}

	public function createPaste(Extent $targetExtent, Level $targetWorldData) : PasteBuilder{
		return new PasteBuilder($this, $targetExtent, $targetWorldData);
	}
}<?php

namespace edit\session;

use pocketmine\level\Level;

use edit\extent\Extent;
use edit\Vector;
use edit\extent\transform\BlockTransformExtent;
use edit\functions\mask\ExistingBlockMask;
use edit\functions\operation\ForwardExtentCopy;
use edit\functions\operation\Operation;
use edit\Main;

class PasteBuilder{

	private $clipboard;
	private $worldData;
	private $transform;
	private $targetExtebt;
	private $targetWorldData;

	private $to;
	private $ignoreAirBlocks;

	public function __construct(ClipboardHolder $holder, Extent $targetExtent, Level $targetWorldData){
		$this->clipboard = $holder->getClipboard();
		$this->worldData = $holder->getWorldData();
		$this->transform = $holder->getTransform();
		$this->targetExtent = $targetExtent;
		$this->targetWorldData = $targetWorldData;
		$this->to = new Vector(0, 0, 0);
	}

	public function to(Vector $to) : PasteBuilder{
		$this->to = $to;
		return $this;
	}

	public function ignoreAirBlocks(bool $ignoreAirBlocks) : PasteBuilder{
		$this->ignoreAirBlocks = $ignoreAirBlocks;
		return $this;
	}

	public function build() : Operation{
		$extent = new BlockTransformExtent($this->clipboard, $this->transform, Main::getInstance()->getBlockRegistry());//.getBlockRegistry()
		$copy = new ForwardExtentCopy($extent, $this->clipboard->getRegion(), $this->clipboard->getOrigin(), $this->targetExtent, $this->to);
		$copy->setTransform($this->transform);
		if($this->ignoreAirBlocks){
			$copy->setSourceMask(new ExistingBlockMask($this->clipboard));
		}
		return $copy;
	}
}<?php

namespace edit\util;

use edit\Vector;

class Direction{

	public static function registry(){
		self::$NORTH = new Direction(new Vector(0, 0, -1), DirectionFlag::CARDINAL);
		self::$EAST = new Direction(new Vector(1, 0, 0), DirectionFlag::CARDINAL);
		self::$SOUTH = new Direction(new Vector(0, 0, 1), DirectionFlag::CARDINAL);
		self::$WEST = new Direction(new Vector(-1, 0, 0), DirectionFlag::CARDINAL);

		self::$UP = new Direction(new Vector(0, 1, 0), DirectionFlag::UPRIGHT);
		self::$DOWN = new Direction(new Vector(0, -1, 0), DirectionFlag::UPRIGHT);

		self::$NORTHEAST = new Direction(new Vector(1, 0, -1), DirectionFlag::ORDINAL);
		self::$NORTHWEST = new Direction(new Vector(-1, 0, -1), DirectionFlag::ORDINAL);
		self::$SOUTHEAST = new Direction(new Vector(1, 0, 1), DirectionFlag::ORDINAL);
		self::$SOUTHWEST = new Direction(new Vector(-1, 0, 1), DirectionFlag::ORDINAL);

		self::$WEST_NORTHWEST = new Direction(new Vector(-cos(M_PI / 8), 0, -sin(M_PI / 8)), Direction::Flag::SECONDARY_ORDINAL);
		self::$WEST_SOUTHWEST = new Direction(new Vector(-cos(M_PI / 8), 0, sin(M_PI / 8)), Direction::Flag::SECONDARY_ORDINAL);
		self::$NORTH_NORTHWEST = new Direction(new Vector(-sin(M_PI / 8), 0, -cos(M_PI / 8)), Direction::Flag::SECONDARY_ORDINAL);
		self::$NORTH_NORTHEAST = new Direction(new Vector(sin(M_PI / 8), 0, -cos(M_PI / 8)), Direction::Flag::SECONDARY_ORDINAL);
		self::$EAST_NORTHEAST = new Direction(new Vector(cos(M_PI / 8), 0, -sin(M_PI / 8)), Direction::Flag::SECONDARY_ORDINAL);
		self::$EAST_SOUTHEAST = new Direction(new Vector(cos(M_PI / 8), 0, sin(M_PI / 8)), Direction::Flag::SECONDARY_ORDINAL);
		self::$SOUTH_SOUTHEAST = new Direction(new Vector(sin(M_PI / 8), 0, cos(M_PI / 8)), Direction::Flag::SECONDARY_ORDINAL);
		self::$SOUTH_SOUTHWEST = new Direction(new Vector(-sin(M_PI / 8), 0, cos(M_PI / 8)), Direction::Flag::SECONDARY_ORDINAL);
	}

	private $direction;
	public $flags;

	public function __construct(Vector $vector, int $flags){
		$this->direction = $vector->normalize();
		$this->flags = $flags;
	}

	public function isCardinal() ; bool{
		return ($this->flags & DirectionFlag::CARDINAL) > 0;
	}

	public function isOrdinal() ; bool{
		return ($this->flags & DirectionFlag::ORDINAL) > 0;
	}

	public function isSecondaryOrdinal() ; bool{
		return ($this->flags & DirectionFlag::SECONDARY_ORDINAL) > 0;
	}

	public function isUpright() ; bool{
		return ($this->flags & DirectionFlag::UPRIGHT) > 0;
	}

	public function toVector() : Vector{
		return $this->direction;
	}

	public static function findClosest(Vector $vector, int $flags) : Direction{
		if(($this->flags & DirectionFlag::UPRIGHT) == 0){
			$vector->setY(0);
		}
		$vector->normalize();

		$closest = null;
		$closestDot = -2;
		foreach($this->values() as $direction){
			if((^$this->flags & $direction->flags) > 0){
				continue;
			}

			$dot = $direction->toVector()->dot($vector);
			if($dot >= $closestDot){
				$closest = $direction;
				$closestDot = $dot;
			}
		}

		return $closest;
	}

	public function values(){
		return [self::$NORTH, self::$EAST, self::$SOUTH, self::$WEST, self::$UP, self::$DOWN,
			self::$NORTHEAST, self::$NORTHWEST, self::$SOUTHEAST, self::$SOUTHWEST,
			self::$WEST_NORTHWEST, self::$WEST_SOUTHWEST, self::$NORTH_NORTHWEST, self::$NORTH_NORTHEAST,
			self::$EAST_NORTHEAST, self::$EAST_SOUTHEAST, self::$SOUTH_SOUTHEAST, self::$SOUTH_SOUTHWEST
		];
	}
}<?php

namespace edit\util;

class DirectionFlag{

	const CARDINAL = 0x1;
	const ORDINAL = 0x2;
	const SECONDARY_ORDINAL = 0x4;
	const UPRIGHT = 0x8;

	const ALL = self::CARDINAL | self::ORDINAL | self::SECONDARY_ORDINAL | self::UPRIGHT;
}<?php

namespace edit\util;

use edit\Vector;
use edit\extent\Extent;

class Location{

	private $extent;
	private $position;
	private $pitch;
	private $yaw;

	public function __construct(Extent $extent, Vector $position, float $yaw, float $pitch){
		$this->extent = $extent;
		$this->position = $position;
		$this->yaw = $yaw;
		$this->pitch = $pitch;
	}

	public function getExtent() : Extent{
		return $this->extent;
	}

	public function setExtent(Extent $extent) : Location{
		return new Location($extent, $this->position, $this->yaw, $this->pitch);
	}

	public function getYaw() : float{
		return $this->yaw;
	}

	public function setYaw(float $yaw) : Location{
		return new Location($this->extent, $this->position, $yaw, $this->pitch);
	}

	public function getPitch() : float{
		return $this->pitch;
	}

	public function setPitch(float $pitch) : Location{
		return new Location($this->extent, $this->position, $this->yaw, $pitch);
	}

	public function setDirection(float $yaw, float $pitch) : Location{
		return new Location($this->extent, $this->position, $yaw, $pitch);
	}

	public function getDirection() : Vector{
		$yaw = deg2rad($this->getYaw());
		$pitch = deg2rad($this->getPitch());
		$xz = cos($pitch);
		return new Vector(
			-$xz * sin($yaw),
			-sin($pitch),
			$xz * cos($yaw));
	}

	public function toVector() : Vector{
		return $this->position;
	}

	public function getX() : float{
		return $this->position->getX();
	}

	public function getBlockX() : float{
		return $this->position->getBlockX();
	}

	public function setX(float $x) : float{
		return new Location($this->extent, $this->position->setX($x), $this->yaw, $this->pitch);
	}

	public function getY() : float{
		return $this->position->getY();
	}

	public function getBlockY() : float{
		return $this->position->getBlockY();
	}

	public function setY(float $y) : float{
		return new Location($this->extent, $this->position->setY($y), $this->yaw, $this->pitch);
	}

	public function getZ() : float{
		return $this->position->getZ();
	}

	public function getBlockZ() : float{
		return $this->position->getBlockZ();
	}

	public function setZ(float $z) : float{
		return new Location($this->extent, $this->position->setZ($z), $this->yaw, $this->pitch);
	}

//TODO more functions
}<?php

namespace edit\util;

use pocketmine\Player;
use pocketmine\block\Block;

use edit\Vector;
use edit\BlockWorldVector;

class TargetBlock{

	private $world;
	private $maxDistance;
	private $checkDistance;
	private $curDistance;
	private $targetPos;
	private $targetPosDouble;
	private $prevPos;
	private $offset;

	public function __construct(Player $player, int $maxDistance, float $checkDistance){
		$this->world = $player->getLevel();
		$this->setValues(new Vector($player->x, $player->y, $player->z), $player->yaw, $player->pitch, $maxDistance, 1.65, $checkDistance);
	}

	private function setValues(Vector $loc, float $xRotation, float $yRotation, int $maxDistance, float $viewHeight, float $checkDistance){
		$this->maxDistance = $maxDistance;
		$this->checkDistance = $checkDistance;
		$this->curDistance = 0;
		$xRotation = ($xRotation + 90) % 360;
		$yRotation = $yRotation * -1;

		$h = ($checkDistance * cos(deg2rad($yRotation)));

		$this->offset = new Vector(($h * cos(deg2rad($xRotation))),
					($checkDistance * sin(deg2rad($yRotation))),
					($h * sin(deg2rad($xRotation))));

		$this->targetPosDouble = $loc->add(0, $viewHeight, 0);
		$this->targetPos = $this->targetPosDouble->toBlockPoint();
		$this->prevPos = $this->targetPos;
	}

	public function getAnyTargetBlock() : ?BlockWorldVector{
		$searchForLastBlock = true;
		$lastBlock = null;
		while($this->getNextBlock() != null){
			if($this->world->getBlock($this->getCurrentBlock()->toVector3())->getId() == Block::AIR){
				if($searchForLastBlock){
					$lastBlock = $this->getCurrentBlock();
					if($lastBlock->getBlockY() <= 0 || $lastBlock->getBlockY() >= 255){
						$searchForLastBlock = false;
					}
				}
			}else{
				break;
			}
		}
		$currentBlock = $this->getCurrentBlock();
		return ($currentBlock != null ? $currentBlock : $lastBlock);
	}

	public function getTargetBlock() : ?BlockWorldVector{
		while($this->getNextBlock() != null && $this->world->getBlock($this->getCurrentBlock()->toVector3())->getId() == Block::AIR);
		return $this->getCurrentBlock;
	}

	public function getSolidTargetBlock() : ?BlockWorldVector{
		while($this->getNextBlock() != null && $this->world->getBlock($this->getCurrentBlock()->toVector3())->canPassThrough());
		return $this->getCurrentBlock;
	}

	public function getNextBlock() : ?BlockWorldVector{
		$this->prevPos = $this->targetPos;
		do{
			$this->curDistance += $this->checkDistance;

			$this->targetPosDouble = $this->offset->add($this->targetPosDouble->getX(),
								$this->targetPosDouble->getY(),
								$this->targetPosDouble->getZ());
			$this->targetPos = $this->targetPosDouble->toBlockPoint();
		}while($this->curDistance <= $this->maxDistance
			&& $this->targetPos->getBlockX() == $this->prevPos->getBlockX()
			&& $this->targetPos->getBlockY() == $this->prevPos->getBlockY()
			&& $this->targetPos->getBlockZ() == $this->prevPos->getBlockZ());

		if($this->curDistance > $this->maxDistance){
			return null;
		}

		return new BlockWorldVector($this->world, $this->targetPos);
	}

	public function getCurrentBlock() : ?BlockWorldVector{
		if($this->curDistance > $this->maxDistance){
			return null;
		}else{
			return new BlockWorldVector($this->world, $this->targetPos);
		}
	}
}<?php

namespace edit\util;

abstract UtilIterable{
}<?php

namespace edit;

use pocketmine\math\Vector3;

class Vector{

	public $x;
	public $y;
	public $z;

	public function __construct($x, $y = 0, $z = 0){
		if($x instanceof Vector){
			$this->x = $x->x;
			$this->y = $x->y;
			$this->z = $x->z;
		}else{
			$this->x = $x;
			$this->y = $y;
			$this->z = $z;
		}
	}

	public function Vector(){
		$this->x = 0;
		$this->y = 0;
		$this->z = 0;
	}

	public function getX(){
		return $this->x;
	}

	public function getBlockX(){
		return (int) round($this->x);
	}

	public function setX($x){
		return new Vector($x, $this->y, $this->z);
	}

	public function getY(){
		return $this->y;
	}

	public function getBlockY(){
		return (int) round($this->y);
	}

	public function setY($y){
		return new Vector($this->x, $y, $this->z);
	}

	public function getZ(){
		return $this->z;
	}

	public function getBlockZ(){
		return (int) round($this->z);
	}

	public function setZ($z){
		return new Vector($this->x, $this->y, $z);
	}

	public function add($x, $y = 0, $z = 0){
		if($x instanceof Vector){
			return new Vector($this->x + $x->x, $this->y + $x->y, $this->z + $x->z);
		}else if(is_numeric($x)){
			return new Vector($this->x + $x, $this->y + $y, $this->z + $z);
		}else{
			$newX = $this->x;
			$newY = $this->y;
			$newZ = $this->z;

			foreach($x as $v){
				$newX += $v->x;
				$newY += $v->y;
				$newZ += $v->z;
			}

			return new Vector($newX, $newY, $newZ);
		}
	}

	public function subtract($x, $y = 0, $z = 0){
		if($x instanceof Vector){
			return new Vector($this->x - $x->x, $this->y - $x->y, $this->z - $x->z);
		}else if(is_numeric($x)){
			return new Vector($this->x - $x, $this->y - $y, $this->z - $z);
		}else{
			$newX = $this->x;
			$newY = $this->y;
			$newZ = $this->z;

			foreach($x as $v){
				$newX -= $v->x;
				$newY -= $v->y;
				$newZ -= $v->z;
			}

			return new Vector($newX, $newY, $newZ);
		}
	}

	public function multiply($x, $y = null, $z = null){
		if($x instanceof Vector){
			return new Vector($this->x * $x->x, $this->y * $x->y, $this->z * $x->z);
		}else if(is_numeric($x)){
			if($y === null && $z === null) return new Vector($this->x * $x, $this->y * $x, $this->z * $x);
			return new Vector($this->x * $x, $this->y * $y, $this->z * $z);
		}else{
			$newX = $this->x;
			$newY = $this->y;
			$newZ = $this->z;

			foreach($x as $v){
				$newX *= $v->x;
				$newY *= $v->y;
				$newZ *= $v->z;
			}

			return new Vector($newX, $newY, $newZ);
		}
	}

	public function divide($x, $y = null, $z = null){
		if($x instanceof Vector){
			return new Vector($this->x / $x->x, $this->y / $x->y, $this->z / $x->z);
		}else if(is_numeric($x)){
			if($y === null && $z === null) return new Vector($this->x / $x, $this->y / $x, $this->z / $x);
			return new Vector($this->x / $x, $this->y / $y, $this->z / $z);
		}
	}

	public function length(){
		return sqrt($this->x * $this->x + $this->y * $this->y + $this->z * $this->z);
	}

	public function lengthSq(){
		return $this->x * $this->x + $this->y * $this->y + $this->z * $this->z;
	}

	public function distance($other){
		return sqrt(pow($other->x - $this->x, 2) +
			pow($other->y - $this->y, 2) +
			pow($other->z - $this->z, 2));
	}

	public function distanceSq($other){
		return pow($other->x - $this->x, 2) +
			pow($other->y - $this->y, 2) +
			pow($other->z - $this->z, 2);
	}

	public function normalize(){
		return $this->divide($this->length());
	}

	public function dot($other){
		return $this->x * $other->x + $this->y * $other->y + $this->z * $other->z;
	}

	public function cross($other){
		return new Vector(
			$this->y * $other->z - $this->z * $other->y,
			$this->z * $other->x - $this->x * $other->z,
			$this->x * $other->y - $this->y * $other->x
		);
	}

	public function containedWithin($min, $max){
		return $this->x >= $min->x && $this->x <= $max->x && $this->y >= $min->y && $this->y <= $max->y && $this->z >= $min->z && $this->z <= $max->z;
	}

	public function containedWithinBlock($min, $max){
		return $this->getBlockX() >= $min->getBlockX() && $this->getBlockX() <= $max->getBlockX()
			&& $this->getBlockY() >= $min->getBlockY() && $this->getBlockY() <= $max->getBlockY()
			&& $this->getBlockZ() >= $min->getBlockZ() && $this->getBlockZ() <= $max->getBlockZ();
	}

	public function clampY($min, $max){
		return new Vector($this->x, max($min, min($max, $this->y)), $this->z);
	}

	public function floor(){
		return new Vector(floor($this->x), floor($this->y), floor($this->z));
	}

	public function ceil(){
		return new Vector(ceil($this->x), ceil($this->y), ceil($this->z));
	}

	public function round(){
		return new Vector(round($this->x + 0.5), round($this->y + 0.5), round($this->z + 0.5));
	}

	public function positive(){
		return new Vector(abs($this->x), abs($this->y), abs($this->z));
	}

	public function transform2D($angle, $aboutX, $aboutZ, $translateX, $translateZ){
		$angle = deg2rad($angle);
		$x = $this->x - $aboutX;
		$z = $this->z - $aboutZ;
		$x2 = $x * cos($angle) - $z * sin($angle);
		$z2 = $x * sin($angle) + $z * cos($angle);

		return new Vector(
			$x2 + $aboutX + $translateX,
			$this->y,
			$z2 + $aboutZ + $translateZ
		);
	}

	public function isCollinearWith($other){
		if($this->x == 0 && $this->y == 0 && $this->z == 0){
			return true;
		}

		$otherX = $other->x;
		$otherY = $other->y;
		$otherZ = $other->z;

		if($otherX == 0 && $otherY == 0 && $otherZ == 0){
			return true;
		}

		if(($x == 0) != ($otherX == 0)) return false;
		if(($y == 0) != ($otherY == 0)) return false;
		if(($z == 0) != ($otherZ == 0)) return false;

		$quotientX = $otherX / $x;
		if(!is_nan($quotientX)){
			return $other->equals(multiply($quotientX));
		}

		$quotientY = $otherY / $y;
		if(!is_nan($quotientY)){
			return $other->equals(multiply($quotientY));
		}

		$quotientZ = $otherZ / $z;
		if(!is_nan($quotientZ)){
			return $other->equals(multiply($quotientZ));
		}
	}

	public function toPitch(){
		$x = $this->getX();
		$z = $this->getZ();

		if($x == 0 && $z == 0){
			return $this->getY() > 0 ? -90 : 90;
		}else{
			$x2 = $x * $x;
			$z2 = $z * $z;
			$xz = sqrt($x2 + $z2);
			return rad2deg(atan(-$this->getY() / $xz));
		}
	}

	public function toYaw(){
		$x = $this->getX();
		$z = $this->getZ();

		$t = atan2(-$x, $z);
		$_2pi = 2 * M_PI;

		return rad2deg((($t + $_2pi) % $_2pi));
	}

	public static function toBlockPoint2($x, $y, $z){
		return new BlockVector(
			floor($x),
			floor($y),
			floor($z)
		);
	}

	public function toBlockPoint(){
		return new BlockVector(
			floor($this->x),
			floor($this->y),
			floor($this->z)
		);
	}

	public function toBlockVector(){
		return new BlockVector($this);
	}

	public function toVector2D(){
		return new Vector2D($this->x, $this->z);
	}

	public function toVector3(){
		return new Vector3($this->x, $this->y, $this->z);
	}

	public function equals($obj){
		if(!($obj instanceof Vector)){
			return false;
		}

		return $obj->x == $this->x && $obj->y == $this->y && $obj->z == $this->z;
	}

	public static function getMinimum($v1, $v2){
		return new Vector(
			min($v1->x, $v2->x),
			min($v1->y, $v2->y),
			min($v1->z, $v2->z)
		);
	}

	public static function getMaximum($v1, $v2){
		return new Vector(
			max($v1->x, $v2->x),
			max($v1->y, $v2->y),
			max($v1->z, $v2->z)
		);
	}

	public static function getMidpoint($v1, $v2){
		return new Vector(
			($v1->x + $v2->x) / 2,
			($v1->y + $v2->y) / 2,
			($v1->z + $v2->z) / 2
		);
	}

	public function toString() : string{
		return "(" . $this->getX() . ", " . $this->getY() . ", " . $this->getZ() . ")";
	}
}<?php

namespace edit;

class Vector2D{

	public $x;
	public $z;

	public function __construct($x, $z = 0){
		if($x instanceof Vector2D){
			$this->x = $x->x;
			$this->z = $x->z;
		}else{
			$this->x = $x;
			$this->z = $z;
		}
	}

	public function Vector2D(){
		$this->x = 0;
		$this->z = 0;
	}

	public function getX(){
		return $this->x;
	}

	public function getBlockX(){
		return (int) round($this->x);
	}

	public function setX($x){
		return new Vector2D($x, $this->z);
	}

	public function getZ(){
		return $this->z;
	}

	public function getBlockZ(){
		return (int) round($this->z);
	}

	public function setZ($z){
		return new Vector2D($this->x, $z);
	}

	public function add($x, $z = 0){
		if($x instanceof Vector2D){
			return new Vector2D($this->x + $x->x, $this->z + $x->z);
		}else if(is_numeric($x)){
			return new Vector2D($this->x + $x, $this->z + $z);
		}else{
			$newX = $this->x;
			$newZ = $this->z;

			foreach($x as $v){
				$newX += $v->x;
				$newZ += $v->z;
			}

			return new Vector2D($newX, $newZ);
		}
	}

	public function subtract($x, $z = 0){
		if($x instanceof Vector2D){
			return new Vector2D($this->x - $x->x, $this->z - $x->z);
		}else if(is_numeric($x)){
			return new Vector2D($this->x - $x, $this->z - $z);
		}else{
			$newX = $this->x;
			$newZ = $this->z;

			foreach($x as $v){
				$newX -= $v->x;
				$newZ -= $v->z;
			}

			return new Vector2D($newX, $newZ);
		}
	}

	public function multiply($x, $z = -999){
		if($x instanceof Vector2D){
			return new Vector2D($this->x * $x->x, $this->z * $x->z);
		}else if(is_numeric($x)){
			if($z == 999) return new Vector2D($this->x * $x, $this->z * $x);
			return new Vector2D($this->x * $x, $this->z * $z);
		}else{
			$newX = $this->x;
			$newZ = $this->z;

			foreach($x as $v){
				$newX *= $v->x;
				$newZ *= $v->z;
			}

			return new Vector2D($newX, $newZ);
		}
	}

	public function divide($x, $z = -999){
		if($x instanceof Vector2D){
			return new Vector2D($this->x / $x->x, $this->y / $x->y, $this->z / $x->z);
		}else if(is_numeric($x)){
			if($z == 999) return new Vector2D($this->x / $x, $this->z / $x);
			return new Vector2D($this->x / $x, $this->z / $z);
		}
	}

	public function length(){
		return sqrt($this->x * $this->x + $this->z * $this->z);
	}

	public function lengthSq(){
		return $this->x * $this->x + $this->z * $this->z;
	}

	public function distance($other){
		return sqrt(pow($other->x - $this->x, 2) +
			pow($other->z - $this->z, 2));
	}

	public function distanceSq($other){
		return pow($other->x - $this->x, 2) +
			pow($other->z - $this->z, 2);
	}

	public function normalize(){
		return $this->divide($this->length());
	}

	public function dot($other){
		return $this->x * $other->x + $this->z * $other->z;
	}

	public function containedWithin($min, $max){
		return $this->x >= $min->x && $this->x <= $max->x && $this->z >= $min->z && $this->z <= $max->z;
	}

	public function containedWithinBlock($min, $max){
		return $this->getBlockX() >= $min->getBlockX() && $this->getBlockX() <= $max->getBlockX()
			&& $this->getBlockZ() >= $min->getBlockZ() && $this->getBlockZ() <= $max->getBlockZ();
	}

	public function floor(){
		return new Vector(floor($this->x), floor($this->z));
	}

	public function ceil(){
		return new Vector(ceil($this->x), ceil($this->z));
	}

	public function round(){
		return new Vector(round($this->x + 0.5), round($this->z + 0.5));
	}

	public function positive(){
		return new Vector(abs($this->x), abs($this->z));
	}

	public function transform2D($angle, $aboutX, $aboutZ, $translateX, $translateZ){
		$angle = deg2rad($angle);
		$x = $this->x - $aboutX;
		$z = $this->z - $aboutZ;
		$x2 = $x * cos($angle) - $z * sin($angle);
		$z2 = $x * sin($angle) + $z * cos($angle);

		return new Vector2D(
			$x2 + $aboutX + $translateX,
			$z2 + $aboutZ + $translateZ
		);
	}

	public function isCollinearWith($other){
		if($this->x == 0 && $this->z == 0){
			return true;
		}

		$otherX = $other->x;
		$otherZ = $other->z;

		if($otherX == 0 && $otherZ == 0){
			return true;
		}

		if(($x == 0) != ($otherX == 0)) return false;
		if(($z == 0) != ($otherZ == 0)) return false;

		$quotientX = $otherX / $x;
		if(!is_nan($quotientX)){
			return $other->equals(multiply($quotientX));
		}

		$quotientZ = $otherZ / $z;
		if(!is_nan($quotientZ)){
			return $other->equals(multiply($quotientZ));
		}

		//error
	}

	public function toBlockVector2D(){
		return new BlockVector2D($this);
	}

	public function toVector($y = 0){
		return new Vector($this->x, $y, $this->z);
	}

	public function equals($obj){
		if(!($obj instanceof Vector2D)){
			return false;
		}

		return $obj->x == $this->x && $obj->z == $this->z;
	}

	public function hashCode(){
		$hash = 7;

		//$hash = 79 * $hash (int) ($this->x ^ $this->x >>> 32);
		//$hash = 79 * $hash (int) ($this->z ^ $this->z >>> 32);
		return $hash;
	}

	public static function getMinimum($v1, $v2){
		return new Vector2D(
			min($v1->x, $v2->x),
			min($v1->z, $v2->z)
		);
	}

	public static function getMaximum($v1, $v2){
		return new Vector2D(
			max($v1->x, $v2->x),
			max($v1->z, $v2->z)
		);
	}

	public static function getMidpoint($v1, $v2){
		return new Vector2D(
			($v1->x + $v2->x) / 2,
			($v1->z + $v2->z) / 2
		);
	}
}<?php

namespace edit\world;

use edit\jnbt\CompoundTag;

interface NbtValued{

	public function hasNbtData() : bool;

	function getNbtData() : ?CompoundTag;

	function setNbtData(?CompoundTag $nbtData);

}<?php

namespace edit\world\registry;

class BlockEntry{

	public $legacyId;
	public $id;
	public $unlocalizedName;
	public $aliases;
	public $states;
	public $material;

	function postDeserialization(){
		foreach($this->states as $state){
			$state->postDeserialization();
		}
	}
}<?php

namespace edit\world\registry;

use edit\blocks\BaseBlock;
use edit\blocks\BlockMaterial;

interface BlockRegistry {

	function createFromId($id) : BaseBlock;//string

	function getMaterial(BaseBlock $block) : ?BlockMaterial;

	function getStates(BaseBlock $block) : ?array;

}[
  {
    "legacyId": 0,
    "id": "minecraft:air",
    "unlocalizedName": "tile.air",
    "localizedName": "Air",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": true,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 1,
    "id": "minecraft:stone",
    "unlocalizedName": "tile.stone",
    "localizedName": "Stone",
    "states": {
      "variant": {
        "dataMask": 7,
        "values": {
          "stone": {
            "data": 0
          },
          "granite": {
            "data": 1
          },
          "smooth_granite": {
            "data": 2
          },
          "diorite": {
            "data": 3
          },
          "smooth_diorite": {
            "data": 4
          },
          "andesite": {
            "data": 5
          },
          "smooth_andesite": {
            "data": 6
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.5,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 2,
    "id": "minecraft:grass",
    "unlocalizedName": "tile.grass",
    "localizedName": "Grass Block",
    "states": {
      "snowy": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.6,
      "resistance": 3.0,
      "ticksRandomly": true,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 3,
    "id": "minecraft:dirt",
    "unlocalizedName": "tile.dirt",
    "localizedName": "Dirt",
    "states": {
      "snowy": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "variant": {
        "dataMask": 3,
        "values": {
          "dirt": {
            "data": 0
          },
          "coarse_dirt": {
            "data": 1
          },
          "podzol": {
            "data": 2
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 4,
    "id": "minecraft:cobblestone",
    "unlocalizedName": "tile.stonebrick",
    "localizedName": "Cobblestone",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 5,
    "id": "minecraft:planks",
    "unlocalizedName": "tile.wood",
    "localizedName": "Wooden Planks",
    "states": {
      "variant": {
        "dataMask": 7,
        "values": {
          "oak": {
            "data": 0
          },
          "spruce": {
            "data": 1
          },
          "birch": {
            "data": 2
          },
          "jungle": {
            "data": 3
          },
          "acacia": {
            "data": 4
          },
          "dark_oak": {
            "data": 5
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 6,
    "id": "minecraft:sapling",
    "unlocalizedName": "tile.sapling",
    "localizedName": "Oak Sapling",
    "states": {
      "stage": {
        "dataMask": 8,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 8
          }
        }
      },
      "type": {
        "dataMask": 7,
        "values": {
          "oak": {
            "data": 0
          },
          "spruce": {
            "data": 1
          },
          "birch": {
            "data": 2
          },
          "jungle": {
            "data": 3
          },
          "acacia": {
            "data": 4
          },
          "dark_oak": {
            "data": 5
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 7,
    "id": "minecraft:bedrock",
    "unlocalizedName": "tile.bedrock",
    "localizedName": "Bedrock",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": -1.0,
      "resistance": 1.8E7,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 8,
    "id": "minecraft:flowing_water",
    "unlocalizedName": "tile.water",
    "localizedName": "Water",
    "states": {
      "level": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          },
          "8": {
            "data": 8
          },
          "9": {
            "data": 9
          },
          "10": {
            "data": 10
          },
          "11": {
            "data": 11
          },
          "12": {
            "data": 12
          },
          "13": {
            "data": 13
          },
          "14": {
            "data": 14
          },
          "15": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 3,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 100.0,
      "resistance": 500.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": true,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": true,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 9,
    "id": "minecraft:water",
    "unlocalizedName": "tile.water",
    "localizedName": "Water",
    "states": {
      "level": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          },
          "8": {
            "data": 8
          },
          "9": {
            "data": 9
          },
          "10": {
            "data": 10
          },
          "11": {
            "data": 11
          },
          "12": {
            "data": 12
          },
          "13": {
            "data": 13
          },
          "14": {
            "data": 14
          },
          "15": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 3,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 100.0,
      "resistance": 500.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": true,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": true,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 10,
    "id": "minecraft:flowing_lava",
    "unlocalizedName": "tile.lava",
    "localizedName": "Lava",
    "states": {
      "level": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          },
          "8": {
            "data": 8
          },
          "9": {
            "data": 9
          },
          "10": {
            "data": 10
          },
          "11": {
            "data": 11
          },
          "12": {
            "data": 12
          },
          "13": {
            "data": 13
          },
          "14": {
            "data": 14
          },
          "15": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 15,
      "usingNeighborLight": true,
      "hardness": 100.0,
      "resistance": 500.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": true,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": true,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 11,
    "id": "minecraft:lava",
    "unlocalizedName": "tile.lava",
    "localizedName": "Lava",
    "states": {
      "level": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          },
          "8": {
            "data": 8
          },
          "9": {
            "data": 9
          },
          "10": {
            "data": 10
          },
          "11": {
            "data": 11
          },
          "12": {
            "data": 12
          },
          "13": {
            "data": 13
          },
          "14": {
            "data": 14
          },
          "15": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 15,
      "usingNeighborLight": true,
      "hardness": 100.0,
      "resistance": 500.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": true,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": true,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 12,
    "id": "minecraft:sand",
    "unlocalizedName": "tile.sand",
    "localizedName": "Sand",
    "states": {
      "variant": {
        "dataMask": 1,
        "values": {
          "sand": {
            "data": 0
          },
          "red_sand": {
            "data": 1
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 13,
    "id": "minecraft:gravel",
    "unlocalizedName": "tile.gravel",
    "localizedName": "Gravel",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.6,
      "resistance": 3.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 14,
    "id": "minecraft:gold_ore",
    "unlocalizedName": "tile.oreGold",
    "localizedName": "Gold Ore",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 15,
    "id": "minecraft:iron_ore",
    "unlocalizedName": "tile.oreIron",
    "localizedName": "Iron Ore",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 16,
    "id": "minecraft:coal_ore",
    "unlocalizedName": "tile.oreCoal",
    "localizedName": "Coal Ore",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 17,
    "id": "minecraft:log",
    "unlocalizedName": "tile.log",
    "localizedName": "Wood",
    "states": {
      "axis": {
        "dataMask": 12,
        "values": {
          "x": {
            "data": 4,
            "direction": [
              1,
              0,
              0
            ]
          },
          "-x": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "y": {
            "data": 0,
            "direction": [
              0,
              1,
              0
            ]
          },
          "-y": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "z": {
            "data": 8,
            "direction": [
              0,
              0,
              1
            ]
          },
          "-z": {
            "data": 8,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "none": {
            "data": 12
          }
        }
      },
      "variant": {
        "dataMask": 3,
        "values": {
          "oak": {
            "data": 0
          },
          "spruce": {
            "data": 1
          },
          "birch": {
            "data": 2
          },
          "jungle": {
            "data": 3
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 18,
    "id": "minecraft:leaves",
    "unlocalizedName": "tile.leaves",
    "localizedName": "Leaves",
    "states": {
      "check_decay": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      },
      "decayable": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 4
          }
        }
      },
      "variant": {
        "dataMask": 3,
        "values": {
          "oak": {
            "data": 0
          },
          "spruce": {
            "data": 1
          },
          "birch": {
            "data": 2
          },
          "jungle": {
            "data": 3
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 1,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.2,
      "resistance": 1.0,
      "ticksRandomly": true,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 19,
    "id": "minecraft:sponge",
    "unlocalizedName": "tile.sponge",
    "localizedName": "Sponge",
    "states": {
      "wet": {
        "dataMask": 1,
        "values": {
          "true": {
            "data": 1
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.6,
      "resistance": 3.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 20,
    "id": "minecraft:glass",
    "unlocalizedName": "tile.glass",
    "localizedName": "Glass",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.3,
      "resistance": 1.5,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 21,
    "id": "minecraft:lapis_ore",
    "unlocalizedName": "tile.oreLapis",
    "localizedName": "Lapis Lazuli Ore",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 22,
    "id": "minecraft:lapis_block",
    "unlocalizedName": "tile.blockLapis",
    "localizedName": "Lapis Lazuli Block",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 23,
    "id": "minecraft:dispenser",
    "unlocalizedName": "tile.dispenser",
    "localizedName": "Dispenser",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "triggered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.5,
      "resistance": 17.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 24,
    "id": "minecraft:sandstone",
    "unlocalizedName": "tile.sandStone",
    "localizedName": "Sandstone",
    "states": {
      "type": {
        "dataMask": 3,
        "values": {
          "sandstone": {
            "data": 0
          },
          "chiseled_sandstone": {
            "data": 1
          },
          "smooth_sandstone": {
            "data": 2
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.8,
      "resistance": 4.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 25,
    "id": "minecraft:noteblock",
    "unlocalizedName": "tile.musicBlock",
    "localizedName": "Note Block",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.8,
      "resistance": 4.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 26,
    "id": "minecraft:bed",
    "unlocalizedName": "tile.bed",
    "localizedName": "Bed",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "occupied": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "part": {
        "dataMask": 8,
        "values": {
          "head": {
            "data": 8
          },
          "foot": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.2,
      "resistance": 1.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 27,
    "id": "minecraft:golden_rail",
    "unlocalizedName": "tile.goldenRail",
    "localizedName": "Powered Rail",
    "states": {
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      },
      "shape": {
        "dataMask": 7,
        "values": {
          "north_south": {
            "data": 0
          },
          "east_west": {
            "data": 1
          },
          "ascending_east": {
            "data": 2
          },
          "ascending_west": {
            "data": 3
          },
          "ascending_north": {
            "data": 4
          },
          "ascending_south": {
            "data": 5
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.7,
      "resistance": 3.5,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 28,
    "id": "minecraft:detector_rail",
    "unlocalizedName": "tile.detectorRail",
    "localizedName": "Detector Rail",
    "states": {
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      },
      "shape": {
        "dataMask": 7,
        "values": {
          "north_south": {
            "data": 0
          },
          "east_west": {
            "data": 1
          },
          "ascending_east": {
            "data": 2
          },
          "ascending_west": {
            "data": 3
          },
          "ascending_north": {
            "data": 4
          },
          "ascending_south": {
            "data": 5
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.7,
      "resistance": 3.5,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 29,
    "id": "minecraft:sticky_piston",
    "unlocalizedName": "tile.pistonStickyBase",
    "localizedName": "Sticky Piston",
    "states": {
      "extended": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      },
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": true,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 30,
    "id": "minecraft:web",
    "unlocalizedName": "tile.web",
    "localizedName": "Cobweb",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 1,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 4.0,
      "resistance": 20.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 31,
    "id": "minecraft:tallgrass",
    "unlocalizedName": "tile.tallgrass",
    "localizedName": "Grass",
    "states": {
      "type": {
        "dataMask": 3,
        "values": {
          "dead_bush": {
            "data": 0
          },
          "tall_grass": {
            "data": 1
          },
          "fern": {
            "data": 2
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": true,
      "opaque": false,
      "replacedDuringPlacement": true,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 32,
    "id": "minecraft:deadbush",
    "unlocalizedName": "tile.deadbush",
    "localizedName": "Dead Bush",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": true,
      "opaque": false,
      "replacedDuringPlacement": true,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 33,
    "id": "minecraft:piston",
    "unlocalizedName": "tile.pistonBase",
    "localizedName": "Piston",
    "states": {
      "extended": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      },
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": true,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 34,
    "id": "minecraft:piston_head",
    "unlocalizedName": "tile.pistonBase",
    "localizedName": "Piston",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "short": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "type": {
        "dataMask": 8,
        "values": {
          "normal": {
            "data": 0
          },
          "sticky": {
            "data": 8
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": true,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 35,
    "id": "minecraft:wool",
    "unlocalizedName": "tile.cloth",
    "localizedName": "Wool",
    "states": {
      "color": {
        "dataMask": 15,
        "values": {
          "white": {
            "data": 0
          },
          "orange": {
            "data": 1
          },
          "magenta": {
            "data": 2
          },
          "light_blue": {
            "data": 3
          },
          "yellow": {
            "data": 4
          },
          "lime": {
            "data": 5
          },
          "pink": {
            "data": 6
          },
          "gray": {
            "data": 7
          },
          "silver": {
            "data": 8
          },
          "cyan": {
            "data": 9
          },
          "purple": {
            "data": 10
          },
          "blue": {
            "data": 11
          },
          "brown": {
            "data": 12
          },
          "green": {
            "data": 13
          },
          "red": {
            "data": 14
          },
          "black": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.8,
      "resistance": 4.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 36,
    "id": "minecraft:piston_extension",
    "unlocalizedName": "tile.null",
    "localizedName": "tile.null.name",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "type": {
        "dataMask": 8,
        "values": {
          "normal": {
            "data": 0
          },
          "sticky": {
            "data": 8
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": -1.0,
      "resistance": 0.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": true,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 37,
    "id": "minecraft:yellow_flower",
    "unlocalizedName": "tile.flower1",
    "localizedName": "Flower",
    "states": {
      "type": {
        "dataMask": 0,
        "values": {
          "dandelion": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 38,
    "id": "minecraft:red_flower",
    "unlocalizedName": "tile.flower2",
    "localizedName": "Flower",
    "states": {
      "type": {
        "dataMask": 15,
        "values": {
          "poppy": {
            "data": 0
          },
          "blue_orchid": {
            "data": 1
          },
          "allium": {
            "data": 2
          },
          "houstonia": {
            "data": 3
          },
          "red_tulip": {
            "data": 4
          },
          "orange_tulip": {
            "data": 5
          },
          "white_tulip": {
            "data": 6
          },
          "pink_tulip": {
            "data": 7
          },
          "oxeye_daisy": {
            "data": 8
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 39,
    "id": "minecraft:brown_mushroom",
    "unlocalizedName": "tile.mushroom",
    "localizedName": "Mushroom",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 1,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 40,
    "id": "minecraft:red_mushroom",
    "unlocalizedName": "tile.mushroom",
    "localizedName": "Mushroom",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 41,
    "id": "minecraft:gold_block",
    "unlocalizedName": "tile.blockGold",
    "localizedName": "Block of Gold",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 42,
    "id": "minecraft:iron_block",
    "unlocalizedName": "tile.blockIron",
    "localizedName": "Block of Iron",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 5.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 43,
    "id": "minecraft:double_stone_slab",
    "unlocalizedName": "tile.stoneSlab",
    "localizedName": "Stone Slab",
    "states": {
      "seamless": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      },
      "variant": {
        "dataMask": 7,
        "values": {
          "stone": {
            "data": 0
          },
          "sandstone": {
            "data": 1
          },
          "wood_old": {
            "data": 2
          },
          "cobblestone": {
            "data": 3
          },
          "brick": {
            "data": 4
          },
          "stone_brick": {
            "data": 5
          },
          "nether_brick": {
            "data": 6
          },
          "quartz": {
            "data": 7
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 44,
    "id": "minecraft:stone_slab",
    "unlocalizedName": "tile.stoneSlab",
    "localizedName": "Stone Slab",
    "states": {
      "half": {
        "dataMask": 8,
        "values": {
          "top": {
            "data": 8,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "variant": {
        "dataMask": 7,
        "values": {
          "stone": {
            "data": 0
          },
          "sandstone": {
            "data": 1
          },
          "wood_old": {
            "data": 2
          },
          "cobblestone": {
            "data": 3
          },
          "brick": {
            "data": 4
          },
          "stone_brick": {
            "data": 5
          },
          "nether_brick": {
            "data": 6
          },
          "quartz": {
            "data": 7
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 45,
    "id": "minecraft:brick_block",
    "unlocalizedName": "tile.brick",
    "localizedName": "Bricks",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 46,
    "id": "minecraft:tnt",
    "unlocalizedName": "tile.tnt",
    "localizedName": "TNT",
    "states": {
      "explode": {
        "dataMask": 1,
        "values": {
          "true": {
            "data": 1
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 47,
    "id": "minecraft:bookshelf",
    "unlocalizedName": "tile.bookshelf",
    "localizedName": "Bookshelf",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.5,
      "resistance": 7.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 48,
    "id": "minecraft:mossy_cobblestone",
    "unlocalizedName": "tile.stoneMoss",
    "localizedName": "Moss Stone",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 49,
    "id": "minecraft:obsidian",
    "unlocalizedName": "tile.obsidian",
    "localizedName": "Obsidian",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 50.0,
      "resistance": 6000.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 50,
    "id": "minecraft:torch",
    "unlocalizedName": "tile.torch",
    "localizedName": "Torch",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "up": {
            "data": 5,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 4,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 1,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 14,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 51,
    "id": "minecraft:fire",
    "unlocalizedName": "tile.fire",
    "localizedName": "Fire",
    "states": {
      "age": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          },
          "8": {
            "data": 8
          },
          "9": {
            "data": 9
          },
          "10": {
            "data": 10
          },
          "11": {
            "data": 11
          },
          "12": {
            "data": 12
          },
          "13": {
            "data": 13
          },
          "14": {
            "data": 14
          },
          "15": {
            "data": 15
          }
        }
      },
      "east": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "up": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 15,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": true,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 52,
    "id": "minecraft:mob_spawner",
    "unlocalizedName": "tile.mobSpawner",
    "localizedName": "Monster Spawner",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 5.0,
      "resistance": 25.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 53,
    "id": "minecraft:oak_stairs",
    "unlocalizedName": "tile.stairsWood",
    "localizedName": "Oak Wood Stairs",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 4,
        "values": {
          "top": {
            "data": 4,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "shape": {
        "dataMask": 0,
        "values": {
          "straight": {
            "data": 0
          },
          "inner_left": {
            "data": 0
          },
          "inner_right": {
            "data": 0
          },
          "outer_left": {
            "data": 0
          },
          "outer_right": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 54,
    "id": "minecraft:chest",
    "unlocalizedName": "tile.chest",
    "localizedName": "Chest",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.5,
      "resistance": 12.5,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 55,
    "id": "minecraft:redstone_wire",
    "unlocalizedName": "tile.redstoneDust",
    "localizedName": "Redstone Dust",
    "states": {
      "east": {
        "dataMask": 0,
        "values": {
          "up": {
            "data": 0
          },
          "side": {
            "data": 0
          },
          "none": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "up": {
            "data": 0
          },
          "side": {
            "data": 0
          },
          "none": {
            "data": 0
          }
        }
      },
      "power": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          },
          "8": {
            "data": 8
          },
          "9": {
            "data": 9
          },
          "10": {
            "data": 10
          },
          "11": {
            "data": 11
          },
          "12": {
            "data": 12
          },
          "13": {
            "data": 13
          },
          "14": {
            "data": 14
          },
          "15": {
            "data": 15
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "up": {
            "data": 0
          },
          "side": {
            "data": 0
          },
          "none": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "up": {
            "data": 0
          },
          "side": {
            "data": 0
          },
          "none": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 56,
    "id": "minecraft:diamond_ore",
    "unlocalizedName": "tile.oreDiamond",
    "localizedName": "Diamond Ore",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 57,
    "id": "minecraft:diamond_block",
    "unlocalizedName": "tile.blockDiamond",
    "localizedName": "Block of Diamond",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 5.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 58,
    "id": "minecraft:crafting_table",
    "unlocalizedName": "tile.workbench",
    "localizedName": "Crafting Table",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 2.5,
      "resistance": 12.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 59,
    "id": "minecraft:wheat",
    "unlocalizedName": "tile.crops",
    "localizedName": "Crops",
    "states": {
      "age": {
        "dataMask": 7,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 60,
    "id": "minecraft:farmland",
    "unlocalizedName": "tile.farmland",
    "localizedName": "Farmland",
    "states": {
      "moisture": {
        "dataMask": 7,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.6,
      "resistance": 3.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 61,
    "id": "minecraft:furnace",
    "unlocalizedName": "tile.furnace",
    "localizedName": "Furnace",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.5,
      "resistance": 17.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 62,
    "id": "minecraft:lit_furnace",
    "unlocalizedName": "tile.furnace",
    "localizedName": "Furnace",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 13,
      "usingNeighborLight": false,
      "hardness": 3.5,
      "resistance": 17.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 63,
    "id": "minecraft:standing_sign",
    "unlocalizedName": "tile.sign",
    "localizedName": "Sign",
    "states": {
      "rotation": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0,
            "direction": [
              0.0,
              0.0,
              -1.0
            ]
          },
          "1": {
            "data": 1,
            "direction": [
              0.5,
              0.0,
              -1.0
            ]
          },
          "2": {
            "data": 2,
            "direction": [
              1.0,
              0.0,
              -1.0
            ]
          },
          "3": {
            "data": 3,
            "direction": [
              1.0,
              0.0,
              -0.5
            ]
          },
          "4": {
            "data": 4,
            "direction": [
              1.0,
              0.0,
              0.0
            ]
          },
          "5": {
            "data": 5,
            "direction": [
              1.0,
              0.0,
              0.5
            ]
          },
          "6": {
            "data": 6,
            "direction": [
              1.0,
              0.0,
              1.0
            ]
          },
          "7": {
            "data": 7,
            "direction": [
              0.5,
              0.0,
              1.0
            ]
          },
          "8": {
            "data": 8,
            "direction": [
              0.0,
              0.0,
              1.0
            ]
          },
          "9": {
            "data": 9,
            "direction": [
              -0.5,
              0.0,
              1.0
            ]
          },
          "10": {
            "data": 10,
            "direction": [
              -1.0,
              0.0,
              1.0
            ]
          },
          "11": {
            "data": 11,
            "direction": [
              -1.0,
              0.0,
              0.5
            ]
          },
          "12": {
            "data": 12,
            "direction": [
              -1.0,
              0.0,
              0.0
            ]
          },
          "13": {
            "data": 13,
            "direction": [
              -1.0,
              0.0,
              -0.5
            ]
          },
          "14": {
            "data": 14,
            "direction": [
              -1.0,
              0.0,
              -1.0
            ]
          },
          "15": {
            "data": 15,
            "direction": [
              -0.5,
              0.0,
              -1.0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 1.0,
      "resistance": 5.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 64,
    "id": "minecraft:wooden_door",
    "unlocalizedName": "tile.doorOak",
    "localizedName": "Oak Door",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 1,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 8,
        "values": {
          "upper": {
            "data": 8
          },
          "lower": {
            "data": 0
          }
        }
      },
      "hinge": {
        "dataMask": 0,
        "values": {
          "left": {
            "data": 0
          },
          "right": {
            "data": 0
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "powered": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 65,
    "id": "minecraft:ladder",
    "unlocalizedName": "tile.ladder",
    "localizedName": "Ladder",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.4,
      "resistance": 2.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 66,
    "id": "minecraft:rail",
    "unlocalizedName": "tile.rail",
    "localizedName": "Rail",
    "states": {
      "shape": {
        "dataMask": 15,
        "values": {
          "north_south": {
            "data": 0
          },
          "east_west": {
            "data": 1
          },
          "ascending_east": {
            "data": 2
          },
          "ascending_west": {
            "data": 3
          },
          "ascending_north": {
            "data": 4
          },
          "ascending_south": {
            "data": 5
          },
          "south_east": {
            "data": 6
          },
          "south_west": {
            "data": 7
          },
          "north_west": {
            "data": 8
          },
          "north_east": {
            "data": 9
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.7,
      "resistance": 3.5,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 67,
    "id": "minecraft:stone_stairs",
    "unlocalizedName": "tile.stairsStone",
    "localizedName": "Cobblestone Stairs",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 4,
        "values": {
          "top": {
            "data": 4,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "shape": {
        "dataMask": 0,
        "values": {
          "straight": {
            "data": 0
          },
          "inner_left": {
            "data": 0
          },
          "inner_right": {
            "data": 0
          },
          "outer_left": {
            "data": 0
          },
          "outer_right": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 68,
    "id": "minecraft:wall_sign",
    "unlocalizedName": "tile.sign",
    "localizedName": "Sign",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 1.0,
      "resistance": 5.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 69,
    "id": "minecraft:lever",
    "unlocalizedName": "tile.lever",
    "localizedName": "Lever",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down_x": {
            "data": 0
          },
          "east": {
            "data": 1,
            "direction": [
              1,
              0,
              0
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "north": {
            "data": 4,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "up_z": {
            "data": 5
          },
          "up_x": {
            "data": 6
          },
          "down_z": {
            "data": 7
          }
        }
      },
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 70,
    "id": "minecraft:stone_pressure_plate",
    "unlocalizedName": "tile.pressurePlateStone",
    "localizedName": "Stone Pressure Plate",
    "states": {
      "powered": {
        "dataMask": 1,
        "values": {
          "true": {
            "data": 1
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 71,
    "id": "minecraft:iron_door",
    "unlocalizedName": "tile.doorIron",
    "localizedName": "Iron Door",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 1,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 8,
        "values": {
          "upper": {
            "data": 8
          },
          "lower": {
            "data": 0
          }
        }
      },
      "hinge": {
        "dataMask": 0,
        "values": {
          "left": {
            "data": 0
          },
          "right": {
            "data": 0
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "powered": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 5.0,
      "resistance": 25.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 72,
    "id": "minecraft:wooden_pressure_plate",
    "unlocalizedName": "tile.pressurePlateWood",
    "localizedName": "Wooden Pressure Plate",
    "states": {
      "powered": {
        "dataMask": 1,
        "values": {
          "true": {
            "data": 1
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 73,
    "id": "minecraft:redstone_ore",
    "unlocalizedName": "tile.oreRedstone",
    "localizedName": "Redstone Ore",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 74,
    "id": "minecraft:lit_redstone_ore",
    "unlocalizedName": "tile.oreRedstone",
    "localizedName": "Redstone Ore",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 9,
      "usingNeighborLight": false,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": true,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 75,
    "id": "minecraft:unlit_redstone_torch",
    "unlocalizedName": "tile.notGate",
    "localizedName": "Redstone Torch",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "up": {
            "data": 5,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 4,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 1,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 76,
    "id": "minecraft:redstone_torch",
    "unlocalizedName": "tile.notGate",
    "localizedName": "Redstone Torch",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "up": {
            "data": 5,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 4,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 1,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 7,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 77,
    "id": "minecraft:stone_button",
    "unlocalizedName": "tile.button",
    "localizedName": "Button",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 5,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 4,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 1,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 78,
    "id": "minecraft:snow_layer",
    "unlocalizedName": "tile.snow",
    "localizedName": "Snow",
    "states": {
      "layers": {
        "dataMask": 7,
        "values": {
          "1": {
            "data": 0
          },
          "2": {
            "data": 1
          },
          "3": {
            "data": 2
          },
          "4": {
            "data": 3
          },
          "5": {
            "data": 4
          },
          "6": {
            "data": 5
          },
          "7": {
            "data": 6
          },
          "8": {
            "data": 7
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.1,
      "resistance": 0.5,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": true,
      "toolRequired": true,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 79,
    "id": "minecraft:ice",
    "unlocalizedName": "tile.ice",
    "localizedName": "Ice",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 3,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": true,
      "fullCube": true,
      "slipperiness": 0.98,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 80,
    "id": "minecraft:snow",
    "unlocalizedName": "tile.snow",
    "localizedName": "Snow",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.2,
      "resistance": 1.0,
      "ticksRandomly": true,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 81,
    "id": "minecraft:cactus",
    "unlocalizedName": "tile.cactus",
    "localizedName": "Cactus",
    "states": {
      "age": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          },
          "8": {
            "data": 8
          },
          "9": {
            "data": 9
          },
          "10": {
            "data": 10
          },
          "11": {
            "data": 11
          },
          "12": {
            "data": 12
          },
          "13": {
            "data": 13
          },
          "14": {
            "data": 14
          },
          "15": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.4,
      "resistance": 2.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 82,
    "id": "minecraft:clay",
    "unlocalizedName": "tile.clay",
    "localizedName": "Clay",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.6,
      "resistance": 3.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 83,
    "id": "minecraft:reeds",
    "unlocalizedName": "tile.reeds",
    "localizedName": "Sugar cane",
    "states": {
      "age": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          },
          "8": {
            "data": 8
          },
          "9": {
            "data": 9
          },
          "10": {
            "data": 10
          },
          "11": {
            "data": 11
          },
          "12": {
            "data": 12
          },
          "13": {
            "data": 13
          },
          "14": {
            "data": 14
          },
          "15": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 84,
    "id": "minecraft:jukebox",
    "unlocalizedName": "tile.jukebox",
    "localizedName": "Jukebox",
    "states": {
      "has_record": {
        "dataMask": 1,
        "values": {
          "true": {
            "data": 1
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 85,
    "id": "minecraft:fence",
    "unlocalizedName": "tile.fence",
    "localizedName": "Oak Fence",
    "states": {
      "east": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 86,
    "id": "minecraft:pumpkin",
    "unlocalizedName": "tile.pumpkin",
    "localizedName": "Pumpkin",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.0,
      "resistance": 5.0,
      "ticksRandomly": true,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 87,
    "id": "minecraft:netherrack",
    "unlocalizedName": "tile.hellrock",
    "localizedName": "Netherrack",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.4,
      "resistance": 2.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 88,
    "id": "minecraft:soul_sand",
    "unlocalizedName": "tile.hellsand",
    "localizedName": "Soul Sand",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 89,
    "id": "minecraft:glowstone",
    "unlocalizedName": "tile.lightgem",
    "localizedName": "Glowstone",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 15,
      "usingNeighborLight": false,
      "hardness": 0.3,
      "resistance": 1.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 90,
    "id": "minecraft:portal",
    "unlocalizedName": "tile.portal",
    "localizedName": "Portal",
    "states": {
      "axis": {
        "dataMask": 3,
        "values": {
          "x": {
            "data": 1,
            "direction": [
              1,
              0,
              0
            ]
          },
          "-x": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "z": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "-z": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 11,
      "usingNeighborLight": true,
      "hardness": -1.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": true,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 91,
    "id": "minecraft:lit_pumpkin",
    "unlocalizedName": "tile.litpumpkin",
    "localizedName": "Jack o\u0027Lantern",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 15,
      "usingNeighborLight": false,
      "hardness": 1.0,
      "resistance": 5.0,
      "ticksRandomly": true,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 92,
    "id": "minecraft:cake",
    "unlocalizedName": "tile.cake",
    "localizedName": "Cake",
    "states": {
      "bites": {
        "dataMask": 7,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 93,
    "id": "minecraft:unpowered_repeater",
    "unlocalizedName": "tile.diode",
    "localizedName": "Redstone Repeater",
    "states": {
      "delay": {
        "dataMask": 12,
        "values": {
          "1": {
            "data": 0
          },
          "2": {
            "data": 4
          },
          "3": {
            "data": 8
          },
          "4": {
            "data": 12
          }
        }
      },
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "locked": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 94,
    "id": "minecraft:powered_repeater",
    "unlocalizedName": "tile.diode",
    "localizedName": "Redstone Repeater",
    "states": {
      "delay": {
        "dataMask": 12,
        "values": {
          "1": {
            "data": 0
          },
          "2": {
            "data": 4
          },
          "3": {
            "data": 8
          },
          "4": {
            "data": 12
          }
        }
      },
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "locked": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 95,
    "id": "minecraft:stained_glass",
    "unlocalizedName": "tile.stainedGlass",
    "localizedName": "Stained Glass",
    "states": {
      "color": {
        "dataMask": 15,
        "values": {
          "white": {
            "data": 0
          },
          "orange": {
            "data": 1
          },
          "magenta": {
            "data": 2
          },
          "light_blue": {
            "data": 3
          },
          "yellow": {
            "data": 4
          },
          "lime": {
            "data": 5
          },
          "pink": {
            "data": 6
          },
          "gray": {
            "data": 7
          },
          "silver": {
            "data": 8
          },
          "cyan": {
            "data": 9
          },
          "purple": {
            "data": 10
          },
          "blue": {
            "data": 11
          },
          "brown": {
            "data": 12
          },
          "green": {
            "data": 13
          },
          "red": {
            "data": 14
          },
          "black": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.3,
      "resistance": 1.5,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 96,
    "id": "minecraft:trapdoor",
    "unlocalizedName": "tile.trapdoor",
    "localizedName": "Wooden Trapdoor",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 0,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 1,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 8,
        "values": {
          "top": {
            "data": 8,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 97,
    "id": "minecraft:monster_egg",
    "unlocalizedName": "tile.monsterStoneEgg",
    "localizedName": "Stone Monster Egg",
    "states": {
      "variant": {
        "dataMask": 7,
        "values": {
          "stone": {
            "data": 0
          },
          "cobblestone": {
            "data": 1
          },
          "stone_brick": {
            "data": 2
          },
          "mossy_brick": {
            "data": 3
          },
          "cracked_brick": {
            "data": 4
          },
          "chiseled_brick": {
            "data": 5
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.75,
      "resistance": 3.75,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 98,
    "id": "minecraft:stonebrick",
    "unlocalizedName": "tile.stonebricksmooth",
    "localizedName": "Stone Bricks",
    "states": {
      "variant": {
        "dataMask": 3,
        "values": {
          "stonebrick": {
            "data": 0
          },
          "mossy_stonebrick": {
            "data": 1
          },
          "cracked_stonebrick": {
            "data": 2
          },
          "chiseled_stonebrick": {
            "data": 3
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.5,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 99,
    "id": "minecraft:brown_mushroom_block",
    "unlocalizedName": "tile.mushroom",
    "localizedName": "Mushroom",
    "states": {
      "variant": {
        "dataMask": 15,
        "values": {
          "north_west": {
            "data": 1
          },
          "north": {
            "data": 2
          },
          "north_east": {
            "data": 3
          },
          "west": {
            "data": 4
          },
          "center": {
            "data": 5
          },
          "east": {
            "data": 6
          },
          "south_west": {
            "data": 7
          },
          "south": {
            "data": 8
          },
          "south_east": {
            "data": 9
          },
          "stem": {
            "data": 10
          },
          "all_inside": {
            "data": 0
          },
          "all_outside": {
            "data": 14
          },
          "all_stem": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.2,
      "resistance": 1.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 100,
    "id": "minecraft:red_mushroom_block",
    "unlocalizedName": "tile.mushroom",
    "localizedName": "Mushroom",
    "states": {
      "variant": {
        "dataMask": 15,
        "values": {
          "north_west": {
            "data": 1
          },
          "north": {
            "data": 2
          },
          "north_east": {
            "data": 3
          },
          "west": {
            "data": 4
          },
          "center": {
            "data": 5
          },
          "east": {
            "data": 6
          },
          "south_west": {
            "data": 7
          },
          "south": {
            "data": 8
          },
          "south_east": {
            "data": 9
          },
          "stem": {
            "data": 10
          },
          "all_inside": {
            "data": 0
          },
          "all_outside": {
            "data": 14
          },
          "all_stem": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.2,
      "resistance": 1.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 101,
    "id": "minecraft:iron_bars",
    "unlocalizedName": "tile.fenceIron",
    "localizedName": "Iron Bars",
    "states": {
      "east": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 5.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 102,
    "id": "minecraft:glass_pane",
    "unlocalizedName": "tile.thinGlass",
    "localizedName": "Glass Pane",
    "states": {
      "east": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.3,
      "resistance": 1.5,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 103,
    "id": "minecraft:melon_block",
    "unlocalizedName": "tile.melon",
    "localizedName": "Melon",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.0,
      "resistance": 5.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 104,
    "id": "minecraft:pumpkin_stem",
    "unlocalizedName": "tile.pumpkinStem",
    "localizedName": "Pumpkin Stem",
    "states": {
      "age": {
        "dataMask": 7,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          }
        }
      },
      "facing": {
        "dataMask": 0,
        "values": {
          "up": {
            "data": 0,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 0,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 0,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 105,
    "id": "minecraft:melon_stem",
    "unlocalizedName": "tile.pumpkinStem",
    "localizedName": "Pumpkin Stem",
    "states": {
      "age": {
        "dataMask": 7,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          }
        }
      },
      "facing": {
        "dataMask": 0,
        "values": {
          "up": {
            "data": 0,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 0,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 0,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 106,
    "id": "minecraft:vine",
    "unlocalizedName": "tile.vine",
    "localizedName": "Vines",
    "states": {
      "east": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 1,
        "values": {
          "true": {
            "data": 1
          },
          "false": {
            "data": 0
          }
        }
      },
      "up": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 2,
        "values": {
          "true": {
            "data": 2
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.2,
      "resistance": 1.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": true,
      "opaque": false,
      "replacedDuringPlacement": true,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 107,
    "id": "minecraft:fence_gate",
    "unlocalizedName": "tile.fenceGate",
    "localizedName": "Oak Fence Gate",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "in_wall": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 108,
    "id": "minecraft:brick_stairs",
    "unlocalizedName": "tile.stairsBrick",
    "localizedName": "Brick Stairs",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 4,
        "values": {
          "top": {
            "data": 4,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "shape": {
        "dataMask": 0,
        "values": {
          "straight": {
            "data": 0
          },
          "inner_left": {
            "data": 0
          },
          "inner_right": {
            "data": 0
          },
          "outer_left": {
            "data": 0
          },
          "outer_right": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 109,
    "id": "minecraft:stone_brick_stairs",
    "unlocalizedName": "tile.stairsStoneBrickSmooth",
    "localizedName": "Stone Brick Stairs",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 4,
        "values": {
          "top": {
            "data": 4,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "shape": {
        "dataMask": 0,
        "values": {
          "straight": {
            "data": 0
          },
          "inner_left": {
            "data": 0
          },
          "inner_right": {
            "data": 0
          },
          "outer_left": {
            "data": 0
          },
          "outer_right": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 1.5,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 110,
    "id": "minecraft:mycelium",
    "unlocalizedName": "tile.mycel",
    "localizedName": "Mycelium",
    "states": {
      "snowy": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.6,
      "resistance": 3.0,
      "ticksRandomly": true,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 111,
    "id": "minecraft:waterlily",
    "unlocalizedName": "tile.waterlily",
    "localizedName": "Lily Pad",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 112,
    "id": "minecraft:nether_brick",
    "unlocalizedName": "tile.netherBrick",
    "localizedName": "Nether Brick",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 113,
    "id": "minecraft:nether_brick_fence",
    "unlocalizedName": "tile.netherFence",
    "localizedName": "Nether Brick Fence",
    "states": {
      "east": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 114,
    "id": "minecraft:nether_brick_stairs",
    "unlocalizedName": "tile.stairsNetherBrick",
    "localizedName": "Nether Brick Stairs",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 4,
        "values": {
          "top": {
            "data": 4,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "shape": {
        "dataMask": 0,
        "values": {
          "straight": {
            "data": 0
          },
          "inner_left": {
            "data": 0
          },
          "inner_right": {
            "data": 0
          },
          "outer_left": {
            "data": 0
          },
          "outer_right": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 115,
    "id": "minecraft:nether_wart",
    "unlocalizedName": "tile.netherStalk",
    "localizedName": "Nether Wart",
    "states": {
      "age": {
        "dataMask": 3,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 116,
    "id": "minecraft:enchanting_table",
    "unlocalizedName": "tile.enchantmentTable",
    "localizedName": "Enchantment Table",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 5.0,
      "resistance": 6000.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 117,
    "id": "minecraft:brewing_stand",
    "unlocalizedName": "tile.brewingStand",
    "localizedName": "Brewing Stand",
    "states": {
      "has_bottle_0": {
        "dataMask": 1,
        "values": {
          "true": {
            "data": 1
          },
          "false": {
            "data": 0
          }
        }
      },
      "has_bottle_1": {
        "dataMask": 2,
        "values": {
          "true": {
            "data": 2
          },
          "false": {
            "data": 0
          }
        }
      },
      "has_bottle_2": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 1,
      "usingNeighborLight": true,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 118,
    "id": "minecraft:cauldron",
    "unlocalizedName": "tile.cauldron",
    "localizedName": "Cauldron",
    "states": {
      "level": {
        "dataMask": 3,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 119,
    "id": "minecraft:end_portal",
    "unlocalizedName": "tile.null",
    "localizedName": "tile.null.name",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 15,
      "usingNeighborLight": true,
      "hardness": -1.0,
      "resistance": 1.8E7,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": true,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 120,
    "id": "minecraft:end_portal_frame",
    "unlocalizedName": "tile.endPortalFrame",
    "localizedName": "End Portal",
    "states": {
      "eye": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 1,
      "usingNeighborLight": true,
      "hardness": -1.0,
      "resistance": 1.8E7,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 121,
    "id": "minecraft:end_stone",
    "unlocalizedName": "tile.whiteStone",
    "localizedName": "End Stone",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.0,
      "resistance": 45.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 122,
    "id": "minecraft:dragon_egg",
    "unlocalizedName": "tile.dragonEgg",
    "localizedName": "Dragon Egg",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 1,
      "usingNeighborLight": true,
      "hardness": 3.0,
      "resistance": 45.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 123,
    "id": "minecraft:redstone_lamp",
    "unlocalizedName": "tile.redstoneLight",
    "localizedName": "Redstone Lamp",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.3,
      "resistance": 1.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 124,
    "id": "minecraft:lit_redstone_lamp",
    "unlocalizedName": "tile.redstoneLight",
    "localizedName": "Redstone Lamp",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 15,
      "usingNeighborLight": false,
      "hardness": 0.3,
      "resistance": 1.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 125,
    "id": "minecraft:double_wooden_slab",
    "unlocalizedName": "tile.woodSlab",
    "localizedName": "Wood Slab",
    "states": {
      "variant": {
        "dataMask": 7,
        "values": {
          "oak": {
            "data": 0
          },
          "spruce": {
            "data": 1
          },
          "birch": {
            "data": 2
          },
          "jungle": {
            "data": 3
          },
          "acacia": {
            "data": 4
          },
          "dark_oak": {
            "data": 5
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 126,
    "id": "minecraft:wooden_slab",
    "unlocalizedName": "tile.woodSlab",
    "localizedName": "Wood Slab",
    "states": {
      "half": {
        "dataMask": 8,
        "values": {
          "top": {
            "data": 8,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "variant": {
        "dataMask": 7,
        "values": {
          "oak": {
            "data": 0
          },
          "spruce": {
            "data": 1
          },
          "birch": {
            "data": 2
          },
          "jungle": {
            "data": 3
          },
          "acacia": {
            "data": 4
          },
          "dark_oak": {
            "data": 5
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 127,
    "id": "minecraft:cocoa",
    "unlocalizedName": "tile.cocoa",
    "localizedName": "Cocoa",
    "states": {
      "age": {
        "dataMask": 12,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 4
          },
          "2": {
            "data": 8
          }
        }
      },
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.2,
      "resistance": 15.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 128,
    "id": "minecraft:sandstone_stairs",
    "unlocalizedName": "tile.stairsSandStone",
    "localizedName": "Sandstone Stairs",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 4,
        "values": {
          "top": {
            "data": 4,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "shape": {
        "dataMask": 0,
        "values": {
          "straight": {
            "data": 0
          },
          "inner_left": {
            "data": 0
          },
          "inner_right": {
            "data": 0
          },
          "outer_left": {
            "data": 0
          },
          "outer_right": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.8,
      "resistance": 4.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 129,
    "id": "minecraft:emerald_ore",
    "unlocalizedName": "tile.oreEmerald",
    "localizedName": "Emerald Ore",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 130,
    "id": "minecraft:ender_chest",
    "unlocalizedName": "tile.enderChest",
    "localizedName": "Ender Chest",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 7,
      "usingNeighborLight": true,
      "hardness": 22.5,
      "resistance": 3000.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 131,
    "id": "minecraft:tripwire_hook",
    "unlocalizedName": "tile.tripWireSource",
    "localizedName": "Tripwire Hook",
    "states": {
      "attached": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 132,
    "id": "minecraft:tripwire",
    "unlocalizedName": "tile.tripWire",
    "localizedName": "Tripwire",
    "states": {
      "attached": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "disarmed": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      },
      "east": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "powered": {
        "dataMask": 1,
        "values": {
          "true": {
            "data": 1
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 133,
    "id": "minecraft:emerald_block",
    "unlocalizedName": "tile.blockEmerald",
    "localizedName": "Block of Emerald",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 5.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 134,
    "id": "minecraft:spruce_stairs",
    "unlocalizedName": "tile.stairsWoodSpruce",
    "localizedName": "Spruce Wood Stairs",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 4,
        "values": {
          "top": {
            "data": 4,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "shape": {
        "dataMask": 0,
        "values": {
          "straight": {
            "data": 0
          },
          "inner_left": {
            "data": 0
          },
          "inner_right": {
            "data": 0
          },
          "outer_left": {
            "data": 0
          },
          "outer_right": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 135,
    "id": "minecraft:birch_stairs",
    "unlocalizedName": "tile.stairsWoodBirch",
    "localizedName": "Birch Wood Stairs",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 4,
        "values": {
          "top": {
            "data": 4,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "shape": {
        "dataMask": 0,
        "values": {
          "straight": {
            "data": 0
          },
          "inner_left": {
            "data": 0
          },
          "inner_right": {
            "data": 0
          },
          "outer_left": {
            "data": 0
          },
          "outer_right": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 136,
    "id": "minecraft:jungle_stairs",
    "unlocalizedName": "tile.stairsWoodJungle",
    "localizedName": "Jungle Wood Stairs",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 4,
        "values": {
          "top": {
            "data": 4,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "shape": {
        "dataMask": 0,
        "values": {
          "straight": {
            "data": 0
          },
          "inner_left": {
            "data": 0
          },
          "inner_right": {
            "data": 0
          },
          "outer_left": {
            "data": 0
          },
          "outer_right": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 137,
    "id": "minecraft:command_block",
    "unlocalizedName": "tile.commandBlock",
    "localizedName": "Command Block",
    "states": {
      "conditional": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      },
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": -1.0,
      "resistance": 1.8E7,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 138,
    "id": "minecraft:beacon",
    "unlocalizedName": "tile.beacon",
    "localizedName": "Beacon",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 15,
      "usingNeighborLight": true,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 139,
    "id": "minecraft:cobblestone_wall",
    "unlocalizedName": "tile.cobbleWall",
    "localizedName": "Cobblestone Wall",
    "states": {
      "east": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "up": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "variant": {
        "dataMask": 1,
        "values": {
          "cobblestone": {
            "data": 0
          },
          "mossy_cobblestone": {
            "data": 1
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 140,
    "id": "minecraft:flower_pot",
    "unlocalizedName": "tile.flowerPot",
    "localizedName": "Flower Pot",
    "states": {
      "contents": {
        "dataMask": 0,
        "values": {
          "empty": {
            "data": 0
          },
          "rose": {
            "data": 0
          },
          "blue_orchid": {
            "data": 0
          },
          "allium": {
            "data": 0
          },
          "houstonia": {
            "data": 0
          },
          "red_tulip": {
            "data": 0
          },
          "orange_tulip": {
            "data": 0
          },
          "white_tulip": {
            "data": 0
          },
          "pink_tulip": {
            "data": 0
          },
          "oxeye_daisy": {
            "data": 0
          },
          "dandelion": {
            "data": 0
          },
          "oak_sapling": {
            "data": 0
          },
          "spruce_sapling": {
            "data": 0
          },
          "birch_sapling": {
            "data": 0
          },
          "jungle_sapling": {
            "data": 0
          },
          "acacia_sapling": {
            "data": 0
          },
          "dark_oak_sapling": {
            "data": 0
          },
          "mushroom_red": {
            "data": 0
          },
          "mushroom_brown": {
            "data": 0
          },
          "dead_bush": {
            "data": 0
          },
          "fern": {
            "data": 0
          },
          "cactus": {
            "data": 0
          }
        }
      },
      "legacy_data": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          },
          "8": {
            "data": 8
          },
          "9": {
            "data": 9
          },
          "10": {
            "data": 10
          },
          "11": {
            "data": 11
          },
          "12": {
            "data": 12
          },
          "13": {
            "data": 13
          },
          "14": {
            "data": 14
          },
          "15": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 141,
    "id": "minecraft:carrots",
    "unlocalizedName": "tile.carrots",
    "localizedName": "Carrots",
    "states": {
      "age": {
        "dataMask": 7,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 142,
    "id": "minecraft:potatoes",
    "unlocalizedName": "tile.potatoes",
    "localizedName": "Potatoes",
    "states": {
      "age": {
        "dataMask": 7,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 143,
    "id": "minecraft:wooden_button",
    "unlocalizedName": "tile.button",
    "localizedName": "Button",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 5,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 4,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 1,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 144,
    "id": "minecraft:skull",
    "unlocalizedName": "tile.skull",
    "localizedName": "tile.skull.skeleton.name",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "nodrop": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 1.0,
      "resistance": 5.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 145,
    "id": "minecraft:anvil",
    "unlocalizedName": "tile.anvil",
    "localizedName": "Anvil",
    "states": {
      "damage": {
        "dataMask": 12,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 4
          },
          "2": {
            "data": 8
          }
        }
      },
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 5.0,
      "resistance": 6000.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": true,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 146,
    "id": "minecraft:trapped_chest",
    "unlocalizedName": "tile.chestTrap",
    "localizedName": "Trapped Chest",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.5,
      "resistance": 12.5,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 147,
    "id": "minecraft:light_weighted_pressure_plate",
    "unlocalizedName": "tile.weightedPlate_light",
    "localizedName": "Weighted Pressure Plate (Light)",
    "states": {
      "power": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          },
          "8": {
            "data": 8
          },
          "9": {
            "data": 9
          },
          "10": {
            "data": 10
          },
          "11": {
            "data": 11
          },
          "12": {
            "data": 12
          },
          "13": {
            "data": 13
          },
          "14": {
            "data": 14
          },
          "15": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 148,
    "id": "minecraft:heavy_weighted_pressure_plate",
    "unlocalizedName": "tile.weightedPlate_heavy",
    "localizedName": "Weighted Pressure Plate (Heavy)",
    "states": {
      "power": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          },
          "8": {
            "data": 8
          },
          "9": {
            "data": 9
          },
          "10": {
            "data": 10
          },
          "11": {
            "data": 11
          },
          "12": {
            "data": 12
          },
          "13": {
            "data": 13
          },
          "14": {
            "data": 14
          },
          "15": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 149,
    "id": "minecraft:unpowered_comparator",
    "unlocalizedName": "tile.comparator",
    "localizedName": "Redstone Comparator",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "mode": {
        "dataMask": 4,
        "values": {
          "compare": {
            "data": 0
          },
          "subtract": {
            "data": 4
          }
        }
      },
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 150,
    "id": "minecraft:powered_comparator",
    "unlocalizedName": "tile.comparator",
    "localizedName": "Redstone Comparator",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "mode": {
        "dataMask": 4,
        "values": {
          "compare": {
            "data": 0
          },
          "subtract": {
            "data": 4
          }
        }
      },
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 9,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 151,
    "id": "minecraft:daylight_detector",
    "unlocalizedName": "tile.daylightDetector",
    "localizedName": "Daylight Sensor",
    "states": {
      "power": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          },
          "8": {
            "data": 8
          },
          "9": {
            "data": 9
          },
          "10": {
            "data": 10
          },
          "11": {
            "data": 11
          },
          "12": {
            "data": 12
          },
          "13": {
            "data": 13
          },
          "14": {
            "data": 14
          },
          "15": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.2,
      "resistance": 1.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 152,
    "id": "minecraft:redstone_block",
    "unlocalizedName": "tile.blockRedstone",
    "localizedName": "Block of Redstone",
    "states": {},
    "material": {
      "powerSource": true,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 5.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 153,
    "id": "minecraft:quartz_ore",
    "unlocalizedName": "tile.netherquartz",
    "localizedName": "Nether Quartz Ore",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 154,
    "id": "minecraft:hopper",
    "unlocalizedName": "tile.hopper",
    "localizedName": "Hopper",
    "states": {
      "enabled": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 8
          }
        }
      },
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 3.0,
      "resistance": 24.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 155,
    "id": "minecraft:quartz_block",
    "unlocalizedName": "tile.quartzBlock",
    "localizedName": "Block of Quartz",
    "states": {
      "variant": {
        "dataMask": 7,
        "values": {
          "default": {
            "data": 0
          },
          "chiseled": {
            "data": 1
          },
          "lines_y": {
            "data": 2
          },
          "lines_x": {
            "data": 3
          },
          "lines_z": {
            "data": 4
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.8,
      "resistance": 4.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 156,
    "id": "minecraft:quartz_stairs",
    "unlocalizedName": "tile.stairsQuartz",
    "localizedName": "Quartz Stairs",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 4,
        "values": {
          "top": {
            "data": 4,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "shape": {
        "dataMask": 0,
        "values": {
          "straight": {
            "data": 0
          },
          "inner_left": {
            "data": 0
          },
          "inner_right": {
            "data": 0
          },
          "outer_left": {
            "data": 0
          },
          "outer_right": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.8,
      "resistance": 4.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 157,
    "id": "minecraft:activator_rail",
    "unlocalizedName": "tile.activatorRail",
    "localizedName": "Activator Rail",
    "states": {
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      },
      "shape": {
        "dataMask": 7,
        "values": {
          "north_south": {
            "data": 0
          },
          "east_west": {
            "data": 1
          },
          "ascending_east": {
            "data": 2
          },
          "ascending_west": {
            "data": 3
          },
          "ascending_north": {
            "data": 4
          },
          "ascending_south": {
            "data": 5
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.7,
      "resistance": 3.5,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 158,
    "id": "minecraft:dropper",
    "unlocalizedName": "tile.dropper",
    "localizedName": "Dropper",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "triggered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.5,
      "resistance": 17.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 159,
    "id": "minecraft:stained_hardened_clay",
    "unlocalizedName": "tile.clayHardenedStained",
    "localizedName": "Stained Terracotta",
    "states": {
      "color": {
        "dataMask": 15,
        "values": {
          "white": {
            "data": 0
          },
          "orange": {
            "data": 1
          },
          "magenta": {
            "data": 2
          },
          "light_blue": {
            "data": 3
          },
          "yellow": {
            "data": 4
          },
          "lime": {
            "data": 5
          },
          "pink": {
            "data": 6
          },
          "gray": {
            "data": 7
          },
          "silver": {
            "data": 8
          },
          "cyan": {
            "data": 9
          },
          "purple": {
            "data": 10
          },
          "blue": {
            "data": 11
          },
          "brown": {
            "data": 12
          },
          "green": {
            "data": 13
          },
          "red": {
            "data": 14
          },
          "black": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.25,
      "resistance": 21.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 160,
    "id": "minecraft:stained_glass_pane",
    "unlocalizedName": "tile.thinStainedGlass",
    "localizedName": "Stained Glass Pane",
    "states": {
      "color": {
        "dataMask": 15,
        "values": {
          "white": {
            "data": 0
          },
          "orange": {
            "data": 1
          },
          "magenta": {
            "data": 2
          },
          "light_blue": {
            "data": 3
          },
          "yellow": {
            "data": 4
          },
          "lime": {
            "data": 5
          },
          "pink": {
            "data": 6
          },
          "gray": {
            "data": 7
          },
          "silver": {
            "data": 8
          },
          "cyan": {
            "data": 9
          },
          "purple": {
            "data": 10
          },
          "blue": {
            "data": 11
          },
          "brown": {
            "data": 12
          },
          "green": {
            "data": 13
          },
          "red": {
            "data": 14
          },
          "black": {
            "data": 15
          }
        }
      },
      "east": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.3,
      "resistance": 1.5,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 161,
    "id": "minecraft:leaves2",
    "unlocalizedName": "tile.leaves",
    "localizedName": "Leaves",
    "states": {
      "check_decay": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      },
      "decayable": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 4
          }
        }
      },
      "variant": {
        "dataMask": 1,
        "values": {
          "acacia": {
            "data": 0
          },
          "dark_oak": {
            "data": 1
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 1,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.2,
      "resistance": 1.0,
      "ticksRandomly": true,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 162,
    "id": "minecraft:log2",
    "unlocalizedName": "tile.log",
    "localizedName": "Wood",
    "states": {
      "axis": {
        "dataMask": 12,
        "values": {
          "x": {
            "data": 4,
            "direction": [
              1,
              0,
              0
            ]
          },
          "-x": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "y": {
            "data": 0,
            "direction": [
              0,
              1,
              0
            ]
          },
          "-y": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "z": {
            "data": 8,
            "direction": [
              0,
              0,
              1
            ]
          },
          "-z": {
            "data": 8,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "none": {
            "data": 12
          }
        }
      },
      "variant": {
        "dataMask": 1,
        "values": {
          "acacia": {
            "data": 0
          },
          "dark_oak": {
            "data": 1
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 163,
    "id": "minecraft:acacia_stairs",
    "unlocalizedName": "tile.stairsWoodAcacia",
    "localizedName": "Acacia Wood Stairs",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 4,
        "values": {
          "top": {
            "data": 4,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "shape": {
        "dataMask": 0,
        "values": {
          "straight": {
            "data": 0
          },
          "inner_left": {
            "data": 0
          },
          "inner_right": {
            "data": 0
          },
          "outer_left": {
            "data": 0
          },
          "outer_right": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 164,
    "id": "minecraft:dark_oak_stairs",
    "unlocalizedName": "tile.stairsWoodDarkOak",
    "localizedName": "Dark Oak Wood Stairs",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 4,
        "values": {
          "top": {
            "data": 4,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "shape": {
        "dataMask": 0,
        "values": {
          "straight": {
            "data": 0
          },
          "inner_left": {
            "data": 0
          },
          "inner_right": {
            "data": 0
          },
          "outer_left": {
            "data": 0
          },
          "outer_right": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 165,
    "id": "minecraft:slime",
    "unlocalizedName": "tile.slime",
    "localizedName": "Slime Block",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.8,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 166,
    "id": "minecraft:barrier",
    "unlocalizedName": "tile.barrier",
    "localizedName": "Barrier",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": -1.0,
      "resistance": 1.8000004E7,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": true,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 167,
    "id": "minecraft:iron_trapdoor",
    "unlocalizedName": "tile.ironTrapdoor",
    "localizedName": "Iron Trapdoor",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 0,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 1,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 8,
        "values": {
          "top": {
            "data": 8,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 5.0,
      "resistance": 25.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 168,
    "id": "minecraft:prismarine",
    "unlocalizedName": "tile.prismarine",
    "localizedName": "Prismarine",
    "states": {
      "variant": {
        "dataMask": 3,
        "values": {
          "prismarine": {
            "data": 0
          },
          "prismarine_bricks": {
            "data": 1
          },
          "dark_prismarine": {
            "data": 2
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.5,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 169,
    "id": "minecraft:sea_lantern",
    "unlocalizedName": "tile.seaLantern",
    "localizedName": "Sea Lantern",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 15,
      "usingNeighborLight": false,
      "hardness": 0.3,
      "resistance": 1.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 170,
    "id": "minecraft:hay_block",
    "unlocalizedName": "tile.hayBlock",
    "localizedName": "Hay Bale",
    "states": {
      "axis": {
        "dataMask": 12,
        "values": {
          "x": {
            "data": 4,
            "direction": [
              1,
              0,
              0
            ]
          },
          "-x": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "y": {
            "data": 0,
            "direction": [
              0,
              1,
              0
            ]
          },
          "-y": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "z": {
            "data": 8,
            "direction": [
              0,
              0,
              1
            ]
          },
          "-z": {
            "data": 8,
            "direction": [
              0,
              0,
              -1
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 171,
    "id": "minecraft:carpet",
    "unlocalizedName": "tile.woolCarpet",
    "localizedName": "Carpet",
    "states": {
      "color": {
        "dataMask": 15,
        "values": {
          "white": {
            "data": 0
          },
          "orange": {
            "data": 1
          },
          "magenta": {
            "data": 2
          },
          "light_blue": {
            "data": 3
          },
          "yellow": {
            "data": 4
          },
          "lime": {
            "data": 5
          },
          "pink": {
            "data": 6
          },
          "gray": {
            "data": 7
          },
          "silver": {
            "data": 8
          },
          "cyan": {
            "data": 9
          },
          "purple": {
            "data": 10
          },
          "blue": {
            "data": 11
          },
          "brown": {
            "data": 12
          },
          "green": {
            "data": 13
          },
          "red": {
            "data": 14
          },
          "black": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.1,
      "resistance": 0.5,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": true,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 172,
    "id": "minecraft:hardened_clay",
    "unlocalizedName": "tile.clayHardened",
    "localizedName": "Terracotta",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.25,
      "resistance": 21.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 173,
    "id": "minecraft:coal_block",
    "unlocalizedName": "tile.blockCoal",
    "localizedName": "Block of Coal",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 5.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 174,
    "id": "minecraft:packed_ice",
    "unlocalizedName": "tile.icePacked",
    "localizedName": "Packed Ice",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.98,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 175,
    "id": "minecraft:double_plant",
    "unlocalizedName": "tile.doublePlant",
    "localizedName": "Plant",
    "states": {
      "facing": {
        "dataMask": 0,
        "values": {
          "north": {
            "data": 0,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 0,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 10,
        "values": {
          "upper": {
            "data": 10
          },
          "lower": {
            "data": 0
          }
        }
      },
      "variant": {
        "dataMask": 7,
        "values": {
          "sunflower": {
            "data": 0
          },
          "syringa": {
            "data": 1
          },
          "double_grass": {
            "data": 2
          },
          "double_fern": {
            "data": 3
          },
          "double_rose": {
            "data": 4
          },
          "paeonia": {
            "data": 5
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": true,
      "opaque": false,
      "replacedDuringPlacement": true,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 176,
    "id": "minecraft:standing_banner",
    "unlocalizedName": "tile.banner",
    "localizedName": "White Banner",
    "states": {
      "rotation": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0,
            "direction": [
              0.0,
              0.0,
              -1.0
            ]
          },
          "1": {
            "data": 1,
            "direction": [
              0.5,
              0.0,
              -1.0
            ]
          },
          "2": {
            "data": 2,
            "direction": [
              1.0,
              0.0,
              -1.0
            ]
          },
          "3": {
            "data": 3,
            "direction": [
              1.0,
              0.0,
              -0.5
            ]
          },
          "4": {
            "data": 4,
            "direction": [
              1.0,
              0.0,
              0.0
            ]
          },
          "5": {
            "data": 5,
            "direction": [
              1.0,
              0.0,
              0.5
            ]
          },
          "6": {
            "data": 6,
            "direction": [
              1.0,
              0.0,
              1.0
            ]
          },
          "7": {
            "data": 7,
            "direction": [
              0.5,
              0.0,
              1.0
            ]
          },
          "8": {
            "data": 8,
            "direction": [
              0.0,
              0.0,
              1.0
            ]
          },
          "9": {
            "data": 9,
            "direction": [
              -0.5,
              0.0,
              1.0
            ]
          },
          "10": {
            "data": 10,
            "direction": [
              -1.0,
              0.0,
              1.0
            ]
          },
          "11": {
            "data": 11,
            "direction": [
              -1.0,
              0.0,
              0.5
            ]
          },
          "12": {
            "data": 12,
            "direction": [
              -1.0,
              0.0,
              0.0
            ]
          },
          "13": {
            "data": 13,
            "direction": [
              -1.0,
              0.0,
              -0.5
            ]
          },
          "14": {
            "data": 14,
            "direction": [
              -1.0,
              0.0,
              -1.0
            ]
          },
          "15": {
            "data": 15,
            "direction": [
              -0.5,
              0.0,
              -1.0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 1.0,
      "resistance": 5.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 177,
    "id": "minecraft:wall_banner",
    "unlocalizedName": "tile.banner",
    "localizedName": "White Banner",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 1.0,
      "resistance": 5.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 178,
    "id": "minecraft:daylight_detector_inverted",
    "unlocalizedName": "tile.daylightDetector",
    "localizedName": "Daylight Sensor",
    "states": {
      "power": {
        "dataMask": 15,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          },
          "6": {
            "data": 6
          },
          "7": {
            "data": 7
          },
          "8": {
            "data": 8
          },
          "9": {
            "data": 9
          },
          "10": {
            "data": 10
          },
          "11": {
            "data": 11
          },
          "12": {
            "data": 12
          },
          "13": {
            "data": 13
          },
          "14": {
            "data": 14
          },
          "15": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.2,
      "resistance": 1.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 179,
    "id": "minecraft:red_sandstone",
    "unlocalizedName": "tile.redSandStone",
    "localizedName": "Red Sandstone",
    "states": {
      "type": {
        "dataMask": 3,
        "values": {
          "red_sandstone": {
            "data": 0
          },
          "chiseled_red_sandstone": {
            "data": 1
          },
          "smooth_red_sandstone": {
            "data": 2
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.8,
      "resistance": 4.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 180,
    "id": "minecraft:red_sandstone_stairs",
    "unlocalizedName": "tile.stairsRedSandStone",
    "localizedName": "Red Sandstone Stairs",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 4,
        "values": {
          "top": {
            "data": 4,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "shape": {
        "dataMask": 0,
        "values": {
          "straight": {
            "data": 0
          },
          "inner_left": {
            "data": 0
          },
          "inner_right": {
            "data": 0
          },
          "outer_left": {
            "data": 0
          },
          "outer_right": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.8,
      "resistance": 4.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 181,
    "id": "minecraft:double_stone_slab2",
    "unlocalizedName": "tile.stoneSlab2",
    "localizedName": "Red Sandstone Slab",
    "states": {
      "seamless": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      },
      "variant": {
        "dataMask": 0,
        "values": {
          "red_sandstone": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 182,
    "id": "minecraft:stone_slab2",
    "unlocalizedName": "tile.stoneSlab2",
    "localizedName": "Red Sandstone Slab",
    "states": {
      "half": {
        "dataMask": 8,
        "values": {
          "top": {
            "data": 8,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "variant": {
        "dataMask": 0,
        "values": {
          "red_sandstone": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 183,
    "id": "minecraft:spruce_fence_gate",
    "unlocalizedName": "tile.spruceFenceGate",
    "localizedName": "Spruce Fence Gate",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "in_wall": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 184,
    "id": "minecraft:birch_fence_gate",
    "unlocalizedName": "tile.birchFenceGate",
    "localizedName": "Birch Fence Gate",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "in_wall": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 185,
    "id": "minecraft:jungle_fence_gate",
    "unlocalizedName": "tile.jungleFenceGate",
    "localizedName": "Jungle Fence Gate",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "in_wall": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 186,
    "id": "minecraft:dark_oak_fence_gate",
    "unlocalizedName": "tile.darkOakFenceGate",
    "localizedName": "Dark Oak Fence Gate",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "in_wall": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 187,
    "id": "minecraft:acacia_fence_gate",
    "unlocalizedName": "tile.acaciaFenceGate",
    "localizedName": "Acacia Fence Gate",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "in_wall": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 188,
    "id": "minecraft:spruce_fence",
    "unlocalizedName": "tile.spruceFence",
    "localizedName": "Spruce Fence",
    "states": {
      "east": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 189,
    "id": "minecraft:birch_fence",
    "unlocalizedName": "tile.birchFence",
    "localizedName": "Birch Fence",
    "states": {
      "east": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 190,
    "id": "minecraft:jungle_fence",
    "unlocalizedName": "tile.jungleFence",
    "localizedName": "Jungle Fence",
    "states": {
      "east": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 191,
    "id": "minecraft:dark_oak_fence",
    "unlocalizedName": "tile.darkOakFence",
    "localizedName": "Dark Oak Fence",
    "states": {
      "east": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 192,
    "id": "minecraft:acacia_fence",
    "unlocalizedName": "tile.acaciaFence",
    "localizedName": "Acacia Fence",
    "states": {
      "east": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 193,
    "id": "minecraft:spruce_door",
    "unlocalizedName": "tile.doorSpruce",
    "localizedName": "Spruce Door",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 1,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 8,
        "values": {
          "upper": {
            "data": 8
          },
          "lower": {
            "data": 0
          }
        }
      },
      "hinge": {
        "dataMask": 0,
        "values": {
          "left": {
            "data": 0
          },
          "right": {
            "data": 0
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "powered": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 194,
    "id": "minecraft:birch_door",
    "unlocalizedName": "tile.doorBirch",
    "localizedName": "Birch Door",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 1,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 8,
        "values": {
          "upper": {
            "data": 8
          },
          "lower": {
            "data": 0
          }
        }
      },
      "hinge": {
        "dataMask": 0,
        "values": {
          "left": {
            "data": 0
          },
          "right": {
            "data": 0
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "powered": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 195,
    "id": "minecraft:jungle_door",
    "unlocalizedName": "tile.doorJungle",
    "localizedName": "Jungle Door",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 1,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 8,
        "values": {
          "upper": {
            "data": 8
          },
          "lower": {
            "data": 0
          }
        }
      },
      "hinge": {
        "dataMask": 0,
        "values": {
          "left": {
            "data": 0
          },
          "right": {
            "data": 0
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "powered": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 196,
    "id": "minecraft:acacia_door",
    "unlocalizedName": "tile.doorAcacia",
    "localizedName": "Acacia Door",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 1,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 8,
        "values": {
          "upper": {
            "data": 8
          },
          "lower": {
            "data": 0
          }
        }
      },
      "hinge": {
        "dataMask": 0,
        "values": {
          "left": {
            "data": 0
          },
          "right": {
            "data": 0
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "powered": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 197,
    "id": "minecraft:dark_oak_door",
    "unlocalizedName": "tile.doorDarkOak",
    "localizedName": "Dark Oak Door",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 1,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 2,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 8,
        "values": {
          "upper": {
            "data": 8
          },
          "lower": {
            "data": 0
          }
        }
      },
      "hinge": {
        "dataMask": 0,
        "values": {
          "left": {
            "data": 0
          },
          "right": {
            "data": 0
          }
        }
      },
      "open": {
        "dataMask": 4,
        "values": {
          "true": {
            "data": 4
          },
          "false": {
            "data": 0
          }
        }
      },
      "powered": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": true,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 198,
    "id": "minecraft:end_rod",
    "unlocalizedName": "tile.endRod",
    "localizedName": "End Rod",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 14,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 199,
    "id": "minecraft:chorus_plant",
    "unlocalizedName": "tile.chorusPlant",
    "localizedName": "Chorus Plant",
    "states": {
      "down": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "east": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "north": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "south": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "up": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      },
      "west": {
        "dataMask": 0,
        "values": {
          "true": {
            "data": 0
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.4,
      "resistance": 2.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 200,
    "id": "minecraft:chorus_flower",
    "unlocalizedName": "tile.chorusFlower",
    "localizedName": "Chorus Flower",
    "states": {
      "age": {
        "dataMask": 7,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          },
          "4": {
            "data": 4
          },
          "5": {
            "data": 5
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.4,
      "resistance": 2.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 201,
    "id": "minecraft:purpur_block",
    "unlocalizedName": "tile.purpurBlock",
    "localizedName": "Purpur Block",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.5,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 202,
    "id": "minecraft:purpur_pillar",
    "unlocalizedName": "tile.purpurPillar",
    "localizedName": "Purpur Pillar",
    "states": {
      "axis": {
        "dataMask": 12,
        "values": {
          "x": {
            "data": 4,
            "direction": [
              1,
              0,
              0
            ]
          },
          "-x": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "y": {
            "data": 0,
            "direction": [
              0,
              1,
              0
            ]
          },
          "-y": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "z": {
            "data": 8,
            "direction": [
              0,
              0,
              1
            ]
          },
          "-z": {
            "data": 8,
            "direction": [
              0,
              0,
              -1
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.5,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 203,
    "id": "minecraft:purpur_stairs",
    "unlocalizedName": "tile.stairsPurpur",
    "localizedName": "Purpur Stairs",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 3,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 2,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 0,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "half": {
        "dataMask": 4,
        "values": {
          "top": {
            "data": 4,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "shape": {
        "dataMask": 0,
        "values": {
          "straight": {
            "data": 0
          },
          "inner_left": {
            "data": 0
          },
          "inner_right": {
            "data": 0
          },
          "outer_left": {
            "data": 0
          },
          "outer_right": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 1.5,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 204,
    "id": "minecraft:purpur_double_slab",
    "unlocalizedName": "tile.purpurSlab",
    "localizedName": "Purpur Slab",
    "states": {
      "variant": {
        "dataMask": 0,
        "values": {
          "default": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 205,
    "id": "minecraft:purpur_slab",
    "unlocalizedName": "tile.purpurSlab",
    "localizedName": "Purpur Slab",
    "states": {
      "half": {
        "dataMask": 8,
        "values": {
          "top": {
            "data": 8,
            "direction": [
              0,
              1,
              0
            ]
          },
          "bottom": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          }
        }
      },
      "variant": {
        "dataMask": 0,
        "values": {
          "default": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 206,
    "id": "minecraft:end_bricks",
    "unlocalizedName": "tile.endBricks",
    "localizedName": "End Stone Bricks",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.8,
      "resistance": 4.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 207,
    "id": "minecraft:beetroots",
    "unlocalizedName": "tile.beetroots",
    "localizedName": "Beetroots",
    "states": {
      "age": {
        "dataMask": 3,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": true,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": true,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 208,
    "id": "minecraft:grass_path",
    "unlocalizedName": "tile.grassPath",
    "localizedName": "Grass Path",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.65,
      "resistance": 3.25,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 209,
    "id": "minecraft:end_gateway",
    "unlocalizedName": "tile.null",
    "localizedName": "tile.null.name",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 15,
      "usingNeighborLight": true,
      "hardness": -1.0,
      "resistance": 1.8E7,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": true,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 210,
    "id": "minecraft:repeating_command_block",
    "unlocalizedName": "tile.repeatingCommandBlock",
    "localizedName": "Repeating Command Block",
    "states": {
      "conditional": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      },
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": -1.0,
      "resistance": 1.8E7,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 211,
    "id": "minecraft:chain_command_block",
    "unlocalizedName": "tile.chainCommandBlock",
    "localizedName": "Chain Command Block",
    "states": {
      "conditional": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      },
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": -1.0,
      "resistance": 1.8E7,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 212,
    "id": "minecraft:frosted_ice",
    "unlocalizedName": "tile.frostedIce",
    "localizedName": "Frosted Ice",
    "states": {
      "age": {
        "dataMask": 3,
        "values": {
          "0": {
            "data": 0
          },
          "1": {
            "data": 1
          },
          "2": {
            "data": 2
          },
          "3": {
            "data": 3
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 3,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": true,
      "fullCube": true,
      "slipperiness": 0.98,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": true,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 213,
    "id": "minecraft:magma",
    "unlocalizedName": "tile.magma",
    "localizedName": "Magma Block",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 3,
      "usingNeighborLight": false,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": true,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 214,
    "id": "minecraft:nether_wart_block",
    "unlocalizedName": "tile.netherWartBlock",
    "localizedName": "Nether Wart Block",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.0,
      "resistance": 5.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 215,
    "id": "minecraft:red_nether_brick",
    "unlocalizedName": "tile.redNetherBrick",
    "localizedName": "Red Nether Brick",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 2.0,
      "resistance": 30.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 216,
    "id": "minecraft:bone_block",
    "unlocalizedName": "tile.boneBlock",
    "localizedName": "Bone Block",
    "states": {
      "axis": {
        "dataMask": 12,
        "values": {
          "x": {
            "data": 4,
            "direction": [
              1,
              0,
              0
            ]
          },
          "-x": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "y": {
            "data": 0,
            "direction": [
              0,
              1,
              0
            ]
          },
          "-y": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "z": {
            "data": 8,
            "direction": [
              0,
              0,
              1
            ]
          },
          "-z": {
            "data": 8,
            "direction": [
              0,
              0,
              -1
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 217,
    "id": "minecraft:structure_void",
    "unlocalizedName": "tile.structureVoid",
    "localizedName": "Structure Void",
    "states": {},
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 0.0,
      "resistance": 0.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": false,
      "movementBlocker": false,
      "burnable": false,
      "opaque": false,
      "replacedDuringPlacement": true,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 218,
    "id": "minecraft:observer",
    "unlocalizedName": "tile.observer",
    "localizedName": "Observer",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      },
      "powered": {
        "dataMask": 8,
        "values": {
          "true": {
            "data": 8
          },
          "false": {
            "data": 0
          }
        }
      }
    },
    "material": {
      "powerSource": true,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 3.0,
      "resistance": 15.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 219,
    "id": "minecraft:white_shulker_box",
    "unlocalizedName": "tile.shulkerBoxWhite",
    "localizedName": "White Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 220,
    "id": "minecraft:orange_shulker_box",
    "unlocalizedName": "tile.shulkerBoxOrange",
    "localizedName": "Orange Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 221,
    "id": "minecraft:magenta_shulker_box",
    "unlocalizedName": "tile.shulkerBoxMagenta",
    "localizedName": "Magenta Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 222,
    "id": "minecraft:light_blue_shulker_box",
    "unlocalizedName": "tile.shulkerBoxLightBlue",
    "localizedName": "Light Blue Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 223,
    "id": "minecraft:yellow_shulker_box",
    "unlocalizedName": "tile.shulkerBoxYellow",
    "localizedName": "Yellow Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 224,
    "id": "minecraft:lime_shulker_box",
    "unlocalizedName": "tile.shulkerBoxLime",
    "localizedName": "Lime Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 225,
    "id": "minecraft:pink_shulker_box",
    "unlocalizedName": "tile.shulkerBoxPink",
    "localizedName": "Pink Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 226,
    "id": "minecraft:gray_shulker_box",
    "unlocalizedName": "tile.shulkerBoxGray",
    "localizedName": "Gray Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 227,
    "id": "minecraft:silver_shulker_box",
    "unlocalizedName": "tile.shulkerBoxSilver",
    "localizedName": "Light Gray Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 228,
    "id": "minecraft:cyan_shulker_box",
    "unlocalizedName": "tile.shulkerBoxCyan",
    "localizedName": "Cyan Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 229,
    "id": "minecraft:purple_shulker_box",
    "unlocalizedName": "tile.shulkerBoxPurple",
    "localizedName": "Purple Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 230,
    "id": "minecraft:blue_shulker_box",
    "unlocalizedName": "tile.shulkerBoxBlue",
    "localizedName": "Blue Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 231,
    "id": "minecraft:brown_shulker_box",
    "unlocalizedName": "tile.shulkerBoxBrown",
    "localizedName": "Brown Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 232,
    "id": "minecraft:green_shulker_box",
    "unlocalizedName": "tile.shulkerBoxGreen",
    "localizedName": "Green Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 233,
    "id": "minecraft:red_shulker_box",
    "unlocalizedName": "tile.shulkerBoxRed",
    "localizedName": "Red Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 234,
    "id": "minecraft:black_shulker_box",
    "unlocalizedName": "tile.shulkerBoxBlack",
    "localizedName": "Black Shulker Box",
    "states": {
      "facing": {
        "dataMask": 7,
        "values": {
          "down": {
            "data": 0,
            "direction": [
              0,
              -1,
              0
            ]
          },
          "up": {
            "data": 1,
            "direction": [
              0,
              1,
              0
            ]
          },
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 3,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 4,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 5,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 0,
      "lightValue": 0,
      "usingNeighborLight": true,
      "hardness": 2.0,
      "resistance": 10.0,
      "ticksRandomly": false,
      "fullCube": false,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": false,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 1.0,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 235,
    "id": "minecraft:white_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaWhite",
    "localizedName": "White Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 236,
    "id": "minecraft:orange_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaOrange",
    "localizedName": "Orange Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 237,
    "id": "minecraft:magenta_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaMagenta",
    "localizedName": "Magenta Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 238,
    "id": "minecraft:light_blue_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaLightBlue",
    "localizedName": "Light Blue Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 239,
    "id": "minecraft:yellow_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaYellow",
    "localizedName": "Yellow Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 240,
    "id": "minecraft:lime_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaLime",
    "localizedName": "Lime Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 241,
    "id": "minecraft:pink_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaPink",
    "localizedName": "Pink Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 242,
    "id": "minecraft:gray_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaGray",
    "localizedName": "Gray Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 243,
    "id": "minecraft:silver_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaSilver",
    "localizedName": "Light Gray Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 244,
    "id": "minecraft:cyan_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaCyan",
    "localizedName": "Cyan Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 245,
    "id": "minecraft:purple_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaPurple",
    "localizedName": "Purple Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 246,
    "id": "minecraft:blue_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaBlue",
    "localizedName": "Blue Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 247,
    "id": "minecraft:brown_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaBrown",
    "localizedName": "Brown Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 248,
    "id": "minecraft:green_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaGreen",
    "localizedName": "Green Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 249,
    "id": "minecraft:red_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaRed",
    "localizedName": "Red Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 250,
    "id": "minecraft:black_glazed_terracotta",
    "unlocalizedName": "tile.glazedTerracottaBlack",
    "localizedName": "Black Glazed Terracotta",
    "states": {
      "facing": {
        "dataMask": 3,
        "values": {
          "north": {
            "data": 2,
            "direction": [
              0,
              0,
              -1
            ]
          },
          "south": {
            "data": 0,
            "direction": [
              0,
              0,
              1
            ]
          },
          "west": {
            "data": 1,
            "direction": [
              -1,
              0,
              0
            ]
          },
          "east": {
            "data": 3,
            "direction": [
              1,
              0,
              0
            ]
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.4,
      "resistance": 7.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 251,
    "id": "minecraft:concrete",
    "unlocalizedName": "tile.concrete",
    "localizedName": "tile.concrete.name",
    "states": {
      "color": {
        "dataMask": 15,
        "values": {
          "white": {
            "data": 0
          },
          "orange": {
            "data": 1
          },
          "magenta": {
            "data": 2
          },
          "light_blue": {
            "data": 3
          },
          "yellow": {
            "data": 4
          },
          "lime": {
            "data": 5
          },
          "pink": {
            "data": 6
          },
          "gray": {
            "data": 7
          },
          "silver": {
            "data": 8
          },
          "cyan": {
            "data": 9
          },
          "purple": {
            "data": 10
          },
          "blue": {
            "data": 11
          },
          "brown": {
            "data": 12
          },
          "green": {
            "data": 13
          },
          "red": {
            "data": 14
          },
          "black": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 1.8,
      "resistance": 9.0,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 252,
    "id": "minecraft:concrete_powder",
    "unlocalizedName": "tile.concretePowder",
    "localizedName": "tile.concretePowder.name",
    "states": {
      "color": {
        "dataMask": 15,
        "values": {
          "white": {
            "data": 0
          },
          "orange": {
            "data": 1
          },
          "magenta": {
            "data": 2
          },
          "light_blue": {
            "data": 3
          },
          "yellow": {
            "data": 4
          },
          "lime": {
            "data": 5
          },
          "pink": {
            "data": 6
          },
          "gray": {
            "data": 7
          },
          "silver": {
            "data": 8
          },
          "cyan": {
            "data": 9
          },
          "purple": {
            "data": 10
          },
          "blue": {
            "data": 11
          },
          "brown": {
            "data": 12
          },
          "green": {
            "data": 13
          },
          "red": {
            "data": 14
          },
          "black": {
            "data": 15
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": 0.5,
      "resistance": 2.5,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": false,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  },
  {
    "legacyId": 255,
    "id": "minecraft:structure_block",
    "unlocalizedName": "tile.structureBlock",
    "localizedName": "Structure Block",
    "states": {
      "mode": {
        "dataMask": 3,
        "values": {
          "save": {
            "data": 0
          },
          "load": {
            "data": 1
          },
          "corner": {
            "data": 2
          },
          "data": {
            "data": 3
          }
        }
      }
    },
    "material": {
      "powerSource": false,
      "lightOpacity": 255,
      "lightValue": 0,
      "usingNeighborLight": false,
      "hardness": -1.0,
      "resistance": 1.8E7,
      "ticksRandomly": false,
      "fullCube": true,
      "slipperiness": 0.6,
      "renderedAsNormalBlock": true,
      "liquid": false,
      "solid": true,
      "movementBlocker": true,
      "burnable": false,
      "opaque": true,
      "replacedDuringPlacement": false,
      "toolRequired": true,
      "fragileWhenPushed": false,
      "unpushable": false,
      "adventureModeExempt": false,
      "ambientOcclusionLightValue": 0.2,
      "grassBlocking": false
    }
  }
]<?php

namespace edit\world\registry;

use edit\Vector;

class BundledBlockData{

	private $idMap = [];
	private $legacyMap = [];

	private static $instance;

	public function __construct(){
		self::$instance = $this;
		$this->loadFromResource();
	}

	private function loadFromResource(){
		$path = __FILE__ ;
		$dir = dirname($path);
		$entries = json_decode(file_get_contents($dir."/blocks.json"));
		foreach($entries as $entry){
			$e = new BlockEntry();
			$e->legacyId = $entry->legacyId;
			$e->id = $entry->id;
			$e->unlocalizedName = $entry->unlocalizedName;
			$e->states = [];
			if(isset($entry->states)){
				foreach($entry->states as $n => $s){
					$simpleState = new SimpleState();
					$simpleState->dataMask = $s->dataMask;
					$simpleState->values = [];
					foreach($s->values as $k => $v){
						$simpleStateValue = new SimpleStateValue();
						$simpleStateValue->data = $v->data;
						if(isset($v->direction)){
							$simpleStateValue->direction = new Vector($v->direction[0], $v->direction[1], $v->direction[2]);
						}else{
							$simpleStateValue->direction = null;
						}
						$simpleState->values[$k] = $simpleStateValue;
					}
					$e->states[] = $simpleState;
				}
			}
			$blockMaterial = new SimpleBlockMaterial();
			if(isset($entry->material)){
				$blockMaterial->renderedAsNormalBlock = $entry->material->renderedAsNormalBlock;
				$blockMaterial->fullCube = $entry->material->fullCube;
				$blockMaterial->opaque = $entry->material->opaque;
				$blockMaterial->powerSource = $entry->material->powerSource;
				$blockMaterial->liquid = $entry->material->liquid;
				$blockMaterial->solid = $entry->material->solid;
				$blockMaterial->hardness = $entry->material->hardness;
				$blockMaterial->resistance = $entry->material->resistance;
				$blockMaterial->slipperiness = $entry->material->slipperiness;
				$blockMaterial->grassBlocking = $entry->material->grassBlocking;
				$blockMaterial->ambientOcclusionLightValue = $entry->material->ambientOcclusionLightValue;
				$blockMaterial->lightOpacity = $entry->material->lightOpacity;
				$blockMaterial->lightValue = $entry->material->lightValue;
				$blockMaterial->fragileWhenPushed = $entry->material->fragileWhenPushed;
				$blockMaterial->unpushable = $entry->material->unpushable;
				$blockMaterial->adventureModeExempt = $entry->material->adventureModeExempt;
				$blockMaterial->ticksRandomly = $entry->material->ticksRandomly;
				$blockMaterial->usingNeighborLight = $entry->material->usingNeighborLight;
				$blockMaterial->movementBlocker = $entry->material->movementBlocker;
				$blockMaterial->burnable = $entry->material->burnable;
				$blockMaterial->toolRequired = $entry->material->toolRequired;
				$blockMaterial->replacedDuringPlacement = $entry->material->replacedDuringPlacement;
			}
			$e->material = $blockMaterial;
			$e->postDeserialization();
			$this->idMap[$e->id] = $e;
			$this->legacyMap[$e->legacyId] = $e;
		}
	}

	private function findById($id) : ?BlockEntry{
		if(is_numeric($id)){
			if(isset($this->legacyMap[$id])){
				return $this->legacyMap[$id];
			}else{
				return null;
			}
		}else{
			if(isset($this->idMap[$id])){
				return $this->idMap[$id];
			}else{
				return null;
			}
		}
	}

	public function toLegacyId($id) : ?int{
		$entry = $this->findById($id);
		if($entry != null){
			return $entry->legacyId;
		}else{
			return null;
		}
	}

	public function getMaterialById($id) : ?BlockMaterial{
		$entry = $this->findById($id);
		if($entry != null){
			return $entry->material;
		}else{
			return null;
		}
	}

	public function getStatesById($id) : ?array{
		$entry = $this->findById($id);
		if($entry != null){
			return $entry->states;
		}else{
			return null;
		}
	}

	public static function getInstance() : BundledBlockData{
		return self::$instance;
	}
}<?php

namespace edit\world\registry;

use edit\blocks\BaseBlock;
use edit\blocks\BlockMaterial;

class LegacyBlockRegistry implements BlockRegistry {

	public function createFromId($id) : BaseBlock{
		if(is_numeric($id)) return new BaseBlock($id);
		$legacyId = BundledBlockData::getInstance()::toLegacyId($id);
		if($legacyId != null){
			return $this->createFromId($legacyId);
		} else {
			return null;
		}
	}

	public function getMaterial(BaseBlock $block) : ?BlockMaterial{
		return BundledBlockData::getInstance()::getMaterialById($block->getId());
	}

	public function getStates(BaseBlock $block) : ?array{
		return BundledBlockData::getInstance()->getStatesById($block->getId());
	}

}<?php

namespace edit\world\registry;

use edit\blocks\BlockMaterial;

class SimpleBlockMaterial implements BlockMaterial {

	public $renderedAsNormalBlock;
	public $fullCube;
	public $opaque;
	public $powerSource;
	public $liquid;
	public $solid;
	public $hardness;
	public $resistance;
	public $slipperiness;
	public $grassBlocking;
	public $ambientOcclusionLightValue;
	public $lightOpacity;
	public $lightValue;
	public $fragileWhenPushed;
	public $unpushable;
	public $adventureModeExempt;
	public $ticksRandomly;
	public $usingNeighborLight;
	public $movementBlocker;
	public $burnable;
	public $toolRequired;
	public $replacedDuringPlacement;

	public function isRenderedAsNormalBlock() : bool{
		return $this->renderedAsNormalBlock;
	}

	public function setRenderedAsNormalBlock(bool $renderedAsNormalBlock){
		$this->renderedAsNormalBlock = $renderedAsNormalBlock;
	}

	public function isFullCube() : bool{
		return fullCube;
	}

	public function setFullCube(bool $fullCube){
		$this->fullCube = $fullCube;
	}

	public function isOpaque() : bool{
		return $this->opaque;
	}

	public function setOpaque(bool $opaque){
		$this->opaque = $opaque;
	}

	public function isPowerSource() : bool{
		return $this->powerSource;
	}

	public function setPowerSource(bool $powerSource){
		$this->powerSource = $powerSource;
	}

	public function isLiquid() : bool{
		return $this->liquid;
	}

	public function setLiquid(bool $liquid){
		$this->liquid = $liquid;
	}

	public function isSolid() : bool{
		return $this->solid;
	}

	public function setSolid(bool $solid){
		$this->solid = $solid;
	}

	public function getHardness() : float{
		return $this->hardness;
	}

	public function setHardness(float $hardness){
		$this->hardness = $hardness;
	}

	public function getResistance() : float{
		return $this->resistance;
	}

	public function setResistance(float $resistance){
		$this->resistance = $resistance;
	}

	public function getSlipperiness() : float{
		return $this->slipperiness;
	}

	public function setSlipperiness(float $slipperiness){
		$this->slipperiness = $slipperiness;
	}

	public function isGrassBlocking() : bool{
		return $this->grassBlocking;
	}

	public function setGrassBlocking(bool $grassBlocking){
		$this->grassBlocking = $grassBlocking;
	}

	public function getAmbientOcclusionLightValue() : float{
		return $this->ambientOcclusionLightValue;
	}

	public function setAmbientOcclusionLightValue(float $ambientOcclusionLightValue){
		$this->ambientOcclusionLightValue = $ambientOcclusionLightValue;
	}

	public function getLightOpacity() : int{
		return $this->lightOpacity;
	}

	public function setLightOpacity(int $lightOpacity){
		$this->lightOpacity = $lightOpacity;
	}

	public function getLightValue() : int{
		return $this->lightValue;
	}

	public function setLightValue(int $lightValue){
		$this->lightValue = $lightValue;
	}

	public function isFragileWhenPushed() : bool{
		return $this->fragileWhenPushed;
	}

	public function setFragileWhenPushed(bool $fragileWhenPushed){
		$this->fragileWhenPushed = $fragileWhenPushed;
	}

	public function isUnpushable() : bool{
		return $this->unpushable;
	}

	public function setUnpushable(bool $unpushable){
		$this->unpushable = $unpushable;
	}

	public function isAdventureModeExempt() : bool{
		return $this->adventureModeExempt;
	}

	public function setAdventureModeExempt(bool $adventureModeExempt){
		$this->adventureModeExempt = $adventureModeExempt;
	}

	public function isTicksRandomly() : bool{
		return $this->ticksRandomly;
	}

	public function setTicksRandomly(bool $ticksRandomly){
		$this->ticksRandomly = $ticksRandomly;
	}

	public function isUsingNeighborLight() : bool{
		return $this->usingNeighborLight;
	}

	public function setUsingNeighborLight(bool $usingNeighborLight){
		$this->usingNeighborLight = $usingNeighborLight;
	}

	public function isMovementBlocker() : bool{
		return $this->movementBlocker;
	}

	public function setMovementBlocker(bool $movementBlocker){
		$this->movementBlocker = $movementBlocker;
	}

	public function isBurnable() : bool{
		return $this->burnable;
	}

	public function setBurnable(bool $burnable){
		$this->burnable = $burnable;
	}

	public function isToolRequired() : bool{
		return $toolRequired;
	}

	public function setToolRequired(bool $toolRequired){
		$this->toolRequired = $toolRequired;
	}

	public function isReplacedDuringPlacement() : bool{
		return $this->replacedDuringPlacement;
	}

	public function setReplacedDuringPlacement(bool $replacedDuringPlacement){
		$this->replacedDuringPlacement = $replacedDuringPlacement;
	}
}<?php

namespace edit\world\registry;

use edit\blocks\BaseBlock;

class SimpleState implements State{

	public $dataMask;
	public $values;

	public function valueMap() : array{
		return $this->values;
	}

	public function getValue(BaseBlock $block) : ?StateValue{
		foreach($this->values as $value){
			if($value->isSet($block)){
				return $value;
			}
		}

		return null;
	}

	public function getDataMask() : int{
		return $this->dataMask != null ? $this->dataMask : 0xF;
	}

	public function hasDirection() : bool{
		foreach($this->values as $value){
			if($value->getDirection() != null){
				return true;
			}
		}

		return false;
	}

	function postDeserialization(){
		foreach($this->values as $v){
			$v->setState($this);
		}
	}
}<?php

namespace edit\world\registry;

use edit\blocks\BaseBlock;
use edit\Vector;

class SimpleStateValue implements StateValue{

	public $state;
	public $data;
	public $direction;

	public function setState(SimpleState $state){
		$this->state = $state;
	}

	public function isSet(BaseBlock $block) : bool{
		return /*$this->data != null && */($block->getData() & $this->state->getDataMask()) == $this->data;
	}

	public function set(BaseBlock $block) : bool{
		//if($this->data != null){
			$block->setData(($block->getData() & ~$this->state->getDataMask()) | $this->data);
			return true;
		//}else{
		//	return false;
		//}
	}

	public function getDirection() : ?Vector{
		return $this->direction;
	}
}<?php

namespace edit\world\registry;

use edit\blocks\BaseBlock;

interface State{

	function valueMap(): array;

	function getValue(BaseBlock $block) : ?StateValue;

	function hasDirection() : bool;

}
<?php

namespace edit\world\registry;

use edit\Vector;
use edit\blocks\BaseBlock;

interface StateValue{

	function isSet(BaseBlock $block) : bool;

	function set(BaseBlock $block) : bool;

	function getDirection() : ?Vector;

}<?php

namespace edit;

use pocketmine\level\Level;

class WorldVector extends Vector{

	private $world;

	public function __construct(Level $world, $x, $y = 0, $z = 0){
		parent::__construct($x, $y, $z);
		$this->world = $world;
	}

	public function getWorld() : Level{
		return $this->world;
	}

	public function toWorldBlockVector() : BlockWorldVector{
		return new BlockWorldVector($this);
	}

	//public function toLocation() : Location{
	//}
}!õP‡4†Å¼+|^$æªL¢AÅ   GBMB