# 紅石筆記 Redstone Note
:::danger
HackMD 的預覽主題必須設置成 **自訂CSS** 才能看見紅石線路圖
:::
因為 Youtube 的播放清單太亂總是找不到資料,所以將這些影片網址整理了一下,順便加上了一些文字說明以方便尋找。
這裡整理的紅石內容以最新 **Java 版本**(1.21)的 survival redstone 為主,較少計算機、活塞門等內容。
## 名詞釋義
- ==**Tick**==: 1 redstone tick 相當於 2 game tick (gt)。**筆記中提到的 tick 若無指定都是 game tick**。
- ==**Solid hitbox**==: 無法被穿越的 hitbox。大多數生物雖然有碰撞判定但仍然能被穿越,因此不是 solid hitbox。
- ==**方塊**==: 能放置就是方塊,不管是否有 hitbox,例如 `torch`、`water`、`grass`。
- ==**完整方塊**==: 六面都有完整一格 hitbox 的方塊。
- ==**相鄰方塊**==: 前後上下左右的方塊,**不包含斜對角**。
- ==**Update**==: Minecraft 中存在 block update、comparator update、block state update 等各種不同的 update。**筆記中提到的 update 若無指定都是 block update**。
- ==**BUD**==:
- *[名詞]* **B**lock **U**pdate **D**etector 的縮寫。
- *[動詞]* 使紅石元件處於不穩定的狀態(例如被充能卻沒有啟動),需要另外被 update 才會回復正常狀態。這個狀態也有人稱作 bud power。
# Mods / Resource Packs
Minecraft 有各種對於 理解紅石 / 設機機關 / 生存 有幫助的模組。
**※ 以下的模組皆需要 fabric**。
## 安裝方式
1. 下載 [fabric installer](https://fabricmc.net/use/) (.EXE)。
2. 執行 exe 檔,選擇 minecraft 版本並點擊安裝。
3. 下載 [Fabric API](https://modrinth.com/mod/fabric-api) (許多 mod 需要 Fabric API)。在檔案總管搜尋 `%appdata%`,找到
`.minecraft` 資料夾,將 Fabric API 放進底下的 `mods`。
4. 將要安裝的 mod 下載至 `.minecraft/mods` (與 Fabric API 同位置)。
::: info
若模組的快捷鍵按了沒有反應,可以嘗試按「Windows鍵」修復問題。
:::
## [Carpet](https://www.curseforge.com/minecraft/mc-mods/carpet) - 幫助 debug / 設計 紅石機關
使用方式: [Carpet Mod for Minecraft 1.14/1.15 - Complete Guide](https://www.youtube.com/watch?v=Lt-ooRGpLz4)
[Carpet Mod Wiki](https://github.com/gnembon/fabric-carpet/wiki) 可以找到所有指令的說明:
- [Commands](https://github.com/gnembon/fabric-carpet/wiki/Commands)
- [Current Available Settings](https://github.com/gnembon/fabric-carpet/wiki/Current-Available-Settings)
:::spoiler **常用指令**
- `/carpet` 顯示所有可用指令。
- `/carpet hopperCounters true` 以羊毛統計漏斗中的物品。
- `/counter` 顯示漏斗的物品統計。
- `/carpet fillUpdates false` 用指令填上方塊時不會 update 任何方塊(e.g. 鐵軌不會掉落)。
- `/carpet explosionNoBlockDamage true` 關閉 TNT 破壞。
- `/log <options>` 按下 tab 顯示 mobcaps/tps 等情報。
- `/profile <options>` 追蹤遊戲效能瓶頸的來源。
:::
## [Litematica](https://www.curseforge.com/minecraft/mc-mods/litematica) - 機關藍圖
預設 M + C 開啟 config menu。
:::warning
需要安裝 [MaLiLib](https://www.curseforge.com/minecraft/mc-mods/malilib) 以正常執行。
:::
[Tutorial: How to Use Litematica](https://www.youtube.com/watch?v=a4o0iGI-JOA)
## [Tweakeroo](https://www.curseforge.com/minecraft/mc-mods/tweakeroo)
預設 X + C 開啟 config menu。
:::warning
需要安裝 [MaLiLib](https://www.curseforge.com/minecraft/mc-mods/malilib) 以正常執行。
:::
[Tweakeroo Tutorials](https://www.youtube.com/playlist?list=PLc1JHlscjWncegLG9lnA_DJNLW36SFt4S)
:::spoiler 常用功能
- tweakFastBlockPlacement - 快速 / 精準 的方塊放置輔助。
- tweakFreeCamera
- tweakGammaOveride - 提高遊戲亮度。
- tweakFlexibleBlockPlacement - 旋轉方塊方向、斜對角放置方塊。
- tweakPeriodicAttack - afk 揮劍。
- disableNetherFog
:::
:::danger
部分方塊如 `observer`、`piston` 無法正常使用 tweakFlexibleBlockPlacement 旋轉方向的功能,需配合 carpet mod 的指令 `/carpet placementRotationFix true` 才可正常使用。
:::
## 改善遊戲效能
元素系列的 mods 能在不改變遊戲行為的前提下大幅改善遊戲效能。
[Lithium](https://modrinth.com/mod/lithium) / [Sodium](https://modrinth.com/mod/sodium)
## Resource Packs
介紹: [Redstone Tweaks 2.0 | Minecraft Redstone Resource Pack | 1.20.x](https://www.youtube.com/watch?v=jMhlv0AnTmg)
下載: [Redstone Tweaks](https://modrinth.com/resourcepack/redstone-tweaks)
# Redstone Components
[Dissecting Minecraft #1: Basic Redstone Components](https://www.youtube.com/watch?v=oHmTDLE6geE&list=PLcSOIxw2nIE2OpQxG1ckMLsQ22Mu4Aiuc)
[Dissecting Minecraft #2: More Basic Redstone Components](https://www.youtube.com/watch?v=RhlA_O64hSA&list=PLcSOIxw2nIE2OpQxG1ckMLsQ22Mu4Aiuc)
[Redstone Components (Redstone Basics sub-series)
](https://www.youtube.com/playlist?list=PLimXw7OHxXpwg7wzeNYklApn1F1FWLk80)[Practical Redstone - A Step-by-Step Redstone Tutorial Series](https://www.youtube.com/playlist?list=PLmEBf0WZp2qvXdAP3GTJAun78--f7R3tG)
[Practical Redstone Reloaded](https://www.youtube.com/playlist?list=PLmEBf0WZp2qs8aoteq1SaMg2pm-IILr88)
## Redstone Dust
`redstone dust` turn on 時會產生 25 個 update,turn off 時則會產生 (訊號強度 × 25) 個 update,也就是一條訊號強度 15 的 `redstone dust` 在 turn off 時會產生 375 個 update。
這部影片將 `redstone dust` turn on/turn off 的所有 update 視覺化: [Redstone Dust Update Order](https://www.youtube.com/watch?v=SUTzbi_xcUg)
因為 `redstone dust` 糟糕的效能,在設計紅石機關時會避免**大量**的 `redstone dust` 劇烈變化,改以鐵軌傳遞訊號,或是降低訊號強度。少量的 `redstone dust` 對效能幾乎沒有影響。
## Redstone Torch
`redstone torch` 只對 **超過 2 tick** 的訊號有反應。
`redstone torch` 在 60 gt 內熄滅 8 次時會燒毀 (burn out),燒毀的 60 gt 之後若有 [block update](##Block-Update) 才會再次亮起。
## Comparator
[Dissecting Minecraft #7: The Comparator](https://www.youtube.com/watch?v=Y1K6f7lSz2Y&list=PLcSOIxw2nIE2OpQxG1ckMLsQ22Mu4Aiuc)
`comparator` 只對 **超過 2 tick** 的訊號有反應,但是**在 comparison mode 的狀態下就算 pulse 很短也會送出 [block update](###Block-Update)**。
`comparator` 能讀取的方塊狀態及對應的訊號強度: [Measure Block State](https://minecraft.wiki/w/Redstone_Comparator#Measure_block_state)。
除非訊號強度 ≥ 15,否則 `comparator` 會優先讀取後面方塊的 block state。
<div class="schematic large-image">
<div class="sprite dr-ew"></div>
<div class="sprite dr-ew"></div>
<br>
<div class="sprite-container">
<span class="texture AB"></span>
<span class="texture rd-ew_A"></span>
</div>
<div class="sprite-container">
<span class="texture AB"></span>
<span class="texture rd-ew_A"></span>
</div>
<div class="sprite le-w_A"></div>
<br>
<div class="sprite rc-s"></div>
<div class="sprite rc-s_A"></div>
</div><br><br>
## Observer
[Minecraft's Observers are More Powerful Than You Think](https://www.youtube.com/watch?v=xh511sviyXc&list=PLmEBf0WZp2qs8aoteq1SaMg2pm-IILr88)
[20 Unusual Redstone Components](https://www.youtube.com/watch?v=0SlBt010FL4)
`observer` 可以偵測 block state 改變,能配合各種能夠改變 block state 的方塊,用法十分多樣。
:::warning
`observer` **偵測的是 block state 改變,不是 block update**。偵測 block update 是使用 [BUD](##BUD-Block-Update-Detector)。
:::
## Piston
`sticky piston` 接收的 pulse 小於 3 tick 時會吐出方塊。
`piston` 可以反應的最快的 clock 是 3 tick。
`piston` 在 (de)power 後**立刻**就會開始移動方塊,把方塊移動至目的地需要 2 tick,方塊在被移動的這 2 ticks 期間將成為 [block 36](https://technical-minecraft.fandom.com/wiki/Piston_Mechanics#Block_36_.2F_Piston_Tile_Entity),是**沒辦法被其他 piston 推動**的。
下圖半透明的方塊代表該方塊的 Block 36。三個箭頭分別代表 update、block event、2 ticks after。
<div class="schematic">
      
<div class="sprite-container">
<span class="texture St"></span>
<span class="texture lighter"></span>
</div>
<div class="sprite air"></div> 
<div class="sprite St"></div>
<br>
<div class="sprite St"></div>
<div class="sprite air"></div> 
<div class="sprite St"></div>
<div class="sprite air"></div> 
<div class="sprite-container">
<span class="texture se-n"></span>
<span class="texture glass"></span>
<span class="texture lighter"></span>
</div>
 <div class="sprite air"></div> 
<div class="sprite se-n"></div>
<br>
<div class="sprite sp-n"></div>
 <div class="sprite aw-e"></div> 
<div class="sprite sp-n"></div>
 <div class="sprite aw-e"></div> 
<div class="sprite sp-n_A"></div>
 <div class="sprite aw-e"></div> 
<div class="sprite sp-n_A"></div>
</div>
Piston Extension
<div class="schematic">
<div class="sprite St"></div>
<div class="sprite air"></div> 
<div class="sprite St"></div>
<br>
<div class="sprite se-n"></div>
<div class="sprite air"></div> 
<div class="sprite se-n"></div>
<div class="sprite air"></div> 
<div class="sprite-container">
<span class="texture St"></span>
<span class="texture lighter"></span>
</div>
 <div class="sprite air"></div> 
<div class="sprite St"></div>
<br>
<div class="sprite sp-n_A"></div>
 <div class="sprite aw-e"></div> 
<div class="sprite sp-n"></div>
 <div class="sprite aw-e"></div> 
<div class="sprite-container">
<span class="texture sp-n"></span>
<span class="texture lighter"></span>
</div>
 <div class="sprite aw-e"></div> 
<div class="sprite sp-n"></div>
</div>
Piston Retraction
<div class="schematic">
<div class="sprite-container">
<span class="texture St"></span>
<span class="texture lighter"></span>
</div>
<div class="sprite air"></div> 
<div class="sprite-container">
<span class="texture St"></span>
<span class="texture lighter"></span>
</div>
<div class="sprite air"></div> 
<div class="sprite St"></div>
<div class="sprite air"></div> 
<div class="sprite St"></div>
<br>
<div class="sprite se-n"></div>
<div class="sprite air"></div> 
<div class="sprite se-n"></div>
<br>
<div class="sprite sp-n_A"></div>
 <div class="sprite aw-e"></div> 
<div class="sprite sp-n"></div>
 <div class="sprite aw-e"></div> 
<div class="sprite-container">
<span class="texture sp-n"></span>
<span class="texture lighter"></span>
</div>
 <div class="sprite aw-e"></div> 
<div class="sprite sp-n"></div>
</div>
Piston Dropping a Block
:::info
Block 36 在遊戲中的名稱是 `moving piston`,可以透過指令 `/setblock ~ ~ ~ minecraft:moving_piston` 得到,**舊版** Minecraft 在生存模式可以透過 [特殊的方式](https://www.youtube.com/watch?v=japKmrdZEic) 取得。Block 36 可以用爆炸移除。
:::
`piston` **直接**(中間沒有其他 delay) 經由其他 `piston` 推動的方塊來 power 會延遲 1 tick。**吐出方塊的 `sticky piston` 不會使下一個 `piston` 延遲 1 tick**。
<div class="schematic">
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite rd-se"></div>
<div class="sprite rd-ew"></div>
<div class="sprite RL"></div>
<div class="sprite sp-e"></div>
<div class="sprite BR"></div>
<div class="sprite air"></div>
<div class="sprite rr-e1"></div>
<div class="sprite rd-ew"></div>
<div class="sprite rd-ew"></div>
<div class="sprite sp-e"></div>
<div class="sprite BR"></div>
<div class="sprite air"></div>
<div class="sprite rr-e1"></div>
<div class="sprite rd-ew"></div>
<div class="sprite rd-ew"></div>
<div class="sprite RL"></div>
8 ticks
<br>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite rd-ns"></div>
<br>
<div class="sprite le-Sn"></div>
<div class="sprite rr-e1"></div>
<div class="sprite rd-nse"></div>
<div class="sprite rd-ew"></div>
<div class="sprite RL"></div>
<div class="sprite rr-e1"></div>
<div class="sprite rd-ew"></div>
<div class="sprite rd-ew"></div>
<div class="sprite rr-e1"></div>
<div class="sprite rd-ew"></div>
<div class="sprite rd-ew"></div>
<div class="sprite rr-e1"></div>
<div class="sprite rd-ew"></div>
<div class="sprite rd-ew"></div>
<div class="sprite rr-e1"></div>
<div class="sprite rd-ew"></div>
<div class="sprite rd-ew"></div>
<div class="sprite RL"></div>
8 ticks
<br>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite rd-ns"></div>
<br>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite rd-ne"></div>
<div class="sprite rd-ew"></div>
<div class="sprite RL"></div>
<div class="sprite sp-e"></div>
<div class="sprite BR"></div>
<div class="sprite air"></div>
<div class="sprite sp-e"></div>
<div class="sprite BR"></div>
<div class="sprite air"></div>
<div class="sprite sp-e"></div>
<div class="sprite BR"></div>
<div class="sprite air"></div>
<div class="sprite sp-e"></div>
<div class="sprite BR"></div>
<div class="sprite air"></div>
<div class="sprite RL"></div>
11 ticks
<br><br></div>
上圖右側標記的是三條線路左右兩個 `redstone lamp` 亮起的時間差,上方兩個 `redstone lamp` 會同時亮起。最上方的線路因為 `piston` 是被 `repeater` power 的,所以沒有額外 1 tick 的延遲。
`piston` 更詳細的運作原理: [Precise Timing - Piston](#Piston49)
## Hopper
[Demystifying Minecraft's Most COMPLEX block](https://www.youtube.com/watch?v=yxcbqLLkBp8)
`hopper` 每次吸入物品後會有 8 tick 的冷卻,但是物品主動進入(不是被吸入) **空的** `hopper` 後,接收到這一個物品後的冷卻時間為 7 tick。以下圖為例,一物品從左容器到右容器在每個 `hopper` 中分別需花費 8, 7, 7 ticks,因為第一個 `hopper` 是自己吸入物品,不是由其他 `hopper` 將物品主動送入。
<div class="schematic">
<div class="sprite chest"></div>
<br>
<div class="sprite ho-Se"></div>
<div class="sprite ho-Se"></div>
<div class="sprite ho-Se"></div>
<div class="sprite chest"></div>
<br><br></div>
未鎖住的 `hopper` 每個 tick 都會搜尋上方是否有物品可以被吸入,大量未鎖住的 `hopper` 會占用 cpu 資源。如果 `hopper` 只用作物品的傳遞而不會吸入物品的話,可以在上面放上:
- `composter`。這會使 `hopper` 無法吸入物品,改為確定上方的 `composter` 是否有 `bonemeal`。
- 完整方塊。上頭有完整方塊的 `hopper` 無法吸入在上方的,但還是可以從上方的 entity (`hopper minecart`、`chest boat` 等) 吸入物品。
## Rails
基礎: [How To Use Minecarts And Rails](https://www.youtube.com/watch?v=JE0C8nN-ndc)
進階: [Cartstone Guide](https://www.youtube.com/playlist?list=PLl_3YnMJiSbD4vmBghFMEFgRlWi7k-Gea)
`minecart` 在直線鐵軌上最高移動速度為 8 m/s;在轉彎的鐵軌上是以對角線移動,因此最高移動速度可達 $\sqrt{8^2 + 8^2} \approx 11.314$ m/s。
 
`powered rail` 和 `activator rail` 在 (de)power 時會從離 power source **最遠**的鐵軌開始 update。
### Rail
T 字的鐵路在 depower 的狀態下 `rail` 會優先和座標軸**正向** 的鐵軌連結,power 時則相反。
<div class="schematic">
       
<font color=red>x↾</font>
<br>
<div class="sprite air"></div>
<div class="sprite ra-ns"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite ra-ns"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite ra-ns"></div>
<div class="sprite air"></div>
<br>
<div class="sprite ra-ew"></div>
<div class="sprite ra-ne"></div>
<div class="sprite ra-ew"></div>
<div class="sprite air"></div>
<div class="sprite ra-ne"></div>
<div class="sprite ra-ew"></div>
<div class="sprite air"></div>
<div class="sprite ra-ew"></div>
<div class="sprite ra-nw"></div>
<div class="sprite air"></div>
<div class="sprite ra-ew"></div>
<div class="sprite ra-se"></div>
<div class="sprite ra-ew"></div>
<font color="blue">⇀z</font>
<br>
    
<div class="sprite ra-ns"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite ra-ns"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite ra-ns"></div>
<br><br></div>
`minecart` 在**非彎道的軌道交錯**上會向座標軸**正向**繼續行駛。若交錯軌道是斜坡,則會往下坡方向行駛。
<div class="schematic">
<div class="sprite air"></div>
<div class="sprite aw-s"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<font color=red>x↾</font>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite aw-n"></div>
<br>
<div class="sprite air"></div>
<div class="sprite pr-ns_A"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite pr-ns_A"></div>
<br>
<div class="sprite pr-ew_A"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite aw-e"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite aw-e"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite pr-ns_A"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite aw-w"></div>
<font color=blue>⇀z</font>
<br>
<div class="sprite air"></div>
<div class="sprite pr-ns_A"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite pr-ns_A"></div>
<br>
<div class="sprite air"></div>
<div class="sprite aw-n"></div>
</div>
### Activator Rail
功能 (when powered):
- 引爆 `TNT minecart`
- 使生物離開 `minecart`
- 使 `hopper minecart` 停止吸取物品。`hopper minecart` 經過 powered `activator rail` 會停止吸取物品直到經過 unpowered `activator rail`。
## TNT
[Dissecting Minecraft #14: How TNT Works](https://www.youtube.com/watch?v=GUG8F7jhbfg&list=PLcSOIxw2nIE2OpQxG1ckMLsQ22Mu4Aiuc)
[EXPLOSIONS 101 - Minecraft](https://www.youtube.com/watch?v=RQF26Wj-gJA)
- 若 `TNT` 引爆時所在的方塊具有 [blast resistance](https://minecraft.wiki/w/Explosion#Blast_resistance) 的特性如 `water`, `anvil` 等,則不會炸掉周圍方塊,但仍會對 entity 造成傷害。
> 由於 `ender chest` 是 blast resistance 且不足一格高,落在上面的 `TNT` 會判定所在的方塊為 `ender chest`,因此落在 `ender chest` 上的 `TNT` 無法破壞周圍方塊。
::: danger
點燃後的 TNT entity 長寬高不足一格,只有 0.98,因此沒有辦法透過**任何方塊**的碰撞箱將點燃的 TNT 對齊在方塊正中央。
:::
## Daylight Detector
`daylight detector` 每 20 gt 才會更新一次訊號強度,所有 `daylight detector` 都是同時更新的。
# Redstone Circuits
[Redstone Circuits (Redstone Basics sub-series)](https://www.youtube.com/playlist?list=PLimXw7OHxXpzYDVNRd-mOMAw-XDN8-htq)
能瞬間反應的 circuit 可參照 [Instant Wire](###Other-Instant-Wires)。
## [Pulse](https://minecraft.wiki/w/Redstone_circuits/Pulse)
[Dissecting Minecraft #3: Pulse Generators](https://www.youtube.com/watch?v=jdextxdFHB8&list=PLcSOIxw2nIE2OpQxG1ckMLsQ22Mu4Aiuc)
#### 簡單分辨 0 tick、1 tick,和 2 tick 以上的方式
觀察將方塊用 sticky piston 推向位於方塊正中央的 entity 的結果,可以用來分別這三種 pulse。
<div class="schematic">
<div class="sprite air"></div>
<div class="sprite-container">
 
<span class="texture mc-Sew"></span>
<span class="texture glass"></span>
</div>
<div class="sprite air"></div>
<div class="sprite-container">
 
<span class="texture sp-Sw"></span>
</div>
 沒有移動 ⭢ 0 tick
<br><br>
<div class="sprite air"></div>
<div class="sprite-container">
<span class="texture mc-Sew"></span>
 
<span class="texture glass"></span>
</div>
<div class="sprite air"></div>
<div class="sprite-container">
 
<span class="texture sp-Sw"></span>
</div>
 移動半格 ⭢ 1 tick
<br><br>
<div class="sprite-container">
 
<span class="texture mc-Sew"></span>
</div>
<div class="sprite-container">
 
<span class="texture glass"></span>
</div>
<div class="sprite air"></div>
<div class="sprite-container">
 
<span class="texture sp-Sw"></span>
</div>
 移動一格 ⭢ 2 tick 以上
<br><br></div>
還有一種確認 0 tick 的方式就是用仙人掌。0 tick 以外的 `sticky piston` 的 `piston head` 會使仙人掌 pop off。
### [Zero Tick Signal](https://minecraft.wiki/w/Tutorials/Zero-ticking)
[Practical Use of 0-Ticks and Instant Repeaters](https://www.youtube.com/watch?v=kBM7I6D59gI)
[Redstone Basics: Using Observers To Create 0-tick Pulses](https://www.youtube.com/watch?v=lNhCGWLYj-o)
[Basics of 0 ticks | Dustless 0 ticks | Redstone Dust 0 ticks](https://www.youtube.com/watch?v=iAd5aGUKRUM)
Zero tick 基本的概念就是在同個 tick 之內 power 後 depower 一個紅石元件。應用上通常是 `sticky piston`,因為 zero tick 可以使 `sticky piston` 瞬間移動一格方塊。
:::warning
只有 `sticky piston` 可以利用 zero tick 瞬間移動方塊,普通 `piston` 不行,且只有 `sticky piston` 的前方一格方塊可以被瞬間推動,其他方塊仍然會花費 2 tick 來移動。
:::
在實作時可能會發現對於同一個 0 tick pulse,有些 `piston` 會動作,有些不會,這些 `piston` 不會動作是由於它們在 update 之前 power 就已經被移除,儘管看見 `redstone dust` 有亮起。
為了確保 power 在每個 `piston` update 後才被移除,會在移除 power 的地方加入 [block event delay](##Block-Event)。
### Extended 2 Tick Signal
[Redstone Basics: Extended 2 Game Tick Signals](https://www.youtube.com/watch?v=VjzuJqWAPFQ)
>影片中的 `observer` 已過時
Extended 2 tick signal 本質上還是 2 tick signal,但特別的是 `comparator` 和 `redstone torch` 會對這種 extended 2 tick signal 做出反應。利用這個特性我們可以用 redstone torch tower 傳送 2 tick pulse,使 `sticky piston` 吐出方塊。
Extended 2 tick signal 只能透過 `comparator`、`redstone torch` 和 `redstone dust` 傳遞,`repeater` 會將這個訊號變回普通的 2 tick。
#### 原理
平時 `comparator` 不會對 2 tick signal 反應是因為當收到訊號時,`comparator` 會創造一個 2 tick 延遲的 tile tick,2 tick 過後會重新計算新的訊號強度,一般的 2 tick signal 在 2 tick 後訊號就已經斷了,因此 `comparator` 判斷訊號強度仍然是 0。
Extended 2 tick signal 就是**確保 power source 在 `comparator` 重新計算訊號強度後才被移除**。`redstone torch` 也是一樣的原理,以下的實作方式 `redstone torch` 也同樣適用。
#### 實作方式
常用的方法有兩種,一種是在 power 後 2 tick 透過 block event 移除 power source,因為 block event 必定在 tile tick 之後才被處理,詳見 [Precise Timing](##A-Tick-in-Minecraft)。
另一種方法是 [Double Powering: A Powerful Technique](https://www.youtube.com/watch?v=d6TEN0VBZuk),用兩個 2 tick signal 同時 power 一個 `comparator`。一個訊號出現後會先 update `comparator`,然後 `comparator` 會創造 tile tick,接著第二個訊號才出現。2 tick 過後,第一個訊號消失,然後 `comparator` 重新計算訊號強度,此時第二個訊號還在,因此 `comparator` 會亮起。最後,第二個訊號消失,update `comparator`,`comparator` 創造 tile tick 在 2 tick 過後關閉。
### 3 Tick Signal
3 tick 是 `sticky piston` 不會吐出方塊的最短的 pulse,通常小於 3 tick 的訊號就稱作 short pulse。
[3 Tick Pulse Generators (5 Unique Designs)](https://www.youtube.com/watch?v=KrlJnuKCgso)
---
## [Clocks](https://minecraft.wiki/w/Redstone_circuits/Clock)
[Dissecting Minecraft #4: Redstone Clocks](https://www.youtube.com/watch?v=0_LbTV7Uk4c&list=PLcSOIxw2nIE2OpQxG1ckMLsQ22Mu4Aiuc)
[Overview of Minecraft Clock Circuits](https://www.youtube.com/watch?v=_GOG0UWTZ7I)
時間更長的 clock:
[Compact adjustable 1 HOUR Clock](https://www.youtube.com/watch?v=8uVFLxfDHxs)
[Clock with superpolynomial duration scaling](https://www.youtube.com/watch?v=ILmVzDqu4TA)
### Hopper Clock
這個網站能根據所需的 timer 時長估算 hopper timer 的設計:
[Hopper Timer Calculator](https://ravinmaddhatter.com/2023/08/14/hopper-clock-calculator/)
### Jukebox Clock
`music disc` 的播放時長從 1 分多鐘到將近 6 分鐘不等,可利用這些差異來製作不同時長的 clock。
[Jukebox Clock Database](https://docs.google.com/spreadsheets/d/1fwkY11zWWv3Lfe5TWJtrigvReck_cALqyJiqy4uAHKI)
### Minecart Clock
利用 `minecart` 不同速度及方塊不同 hitbox,排列組合出 700 種不同週期的 clock。這些 clock 週期大多落在 1-60 秒之間,最長則來到 10183 gt (約 9 分鐘),可以在 [Cart Clock Database](https://docs.google.com/spreadsheets/d/1synznvFsAJQ9zLubeZkN3vlhsgqPNkaEIBriSva_Axs) 查找需要週期對應的 clock。
[The Cart Clock Revolution](https://www.youtube.com/watch?v=_h6YhcDutTg)
---
## [Logic](https://minecraft.wiki/w/Redstone_circuits/Logic)
[Dissecting Minecraft #5: Logic Gates](https://www.youtube.com/watch?v=d5p9bTBuRYk&list=PLcSOIxw2nIE2OpQxG1ckMLsQ22Mu4Aiuc)
[Redstone Logics (Redstone Basics sub-series)](https://www.youtube.com/playlist?list=PLimXw7OHxXpzolMUvr64ptHBq3tS9P1Bl)
[Logical Redstone Tutorial 0: The Basics](https://www.youtube.com/watch?v=9qcH9q8P5Fg&list=PLKdeRz8UZy38CFM7tREMVL_TKJAOl6T9H)
### Dustless Logic Gates
[1-Wide Tileable Observer Logic Gates \|| Redstone Computing](https://www.youtube.com/watch?v=Kn7hnJnDG5Y)
---
## Piston Extenders
[Dissecting Minecraft #8: Piston Extenders](https://www.youtube.com/watch?v=txV7n4Q8kvI&list=PLcSOIxw2nIE2OpQxG1ckMLsQ22Mu4Aiuc)
[18 Types of Triple Piston Extenders [Flush/Vertical/Horizontal]](https://www.youtube.com/watch?v=7ibFUXnVQQk)
[How to Make the SMALLEST Double and Triple Piston Extenders!!! [Horizontal/Vertical/Expandable]](https://www.youtube.com/watch?v=-wBBT_Ednmg)
---
## [BUD](https://minecraft.wiki/w/Tutorials/Block_update_detector) (Block Update Detector)
[A Beginner Level Introduction to Quasi Connectivity/BUD Powering](https://www.youtube.com/watch?v=eyuYNDsxIHY)
### 常見的 BUD 設計
[Minecraft - 21 Block & Comparator Update Detectors - BUD & CUD](https://www.youtube.com/watch?v=AY6cKmTWPwY)
:::spoiler **[Quasi-connectivity](https://minecraft.wiki/w/Tutorials/Quasi-connectivity) (QC)**
- 擁有此特性的四個方塊: `dispensers`、`droppers`、`piston`、`sticky piston`。
- 以上方塊能夠被任何可以 power 其上方一格空間的東西 power,無論那一格是什麼方塊都可以,但是需要有 block upate 才會反應。
- 簡單來說,因為門是兩格高,可以將這些方塊當作門來判斷是否有被 power。
> 據說會有這個 ~~bug~~ feature 的原因就是因為當初直接把門的 code 拿來用..
:::
:::spoiler **`redstone dust` redirection**
[Minecraft: Redirect Piston BUD Tutorial](https://www.youtube.com/watch?v=kzPyrnLUHIs&list=PL7VmhWGNRxKj2MJ5IyHUSRTM7id5ONWwa)
當 `redstone dust` 指向方向改變不會造成 update,用這個方式可以 BUD 任何紅石元件。
:::
:::spoiler **`piston` 無法 extend**
[Compact Block Update Detectors](https://www.youtube.com/watch?v=Qp4_oQuReuE)
當`piston` 被 power 時無法 extend (前方有無法推動的方塊或達到 push limit),則 `piston` 之後就算可以推動也需要有 block update 才會反應。
:::
:::spoiler **推入/拉出 `detector rail`**
用 `piston` 將 `detector rail` 連同 `minecart` 一起推入,或是用 `sticky piston` 將 `detector rail` 從 `minecart` 底下拉出。`detector rail` 底下的方塊可以 BUD 任何紅石元件。
<div class="schematic">
<div class="sprite pi-e_A"></div>
<div class="sprite pe-e"></div>
<div class="sprite-container">
<span class="texture mc-Sew"></span>
<span class="texture dr-Sew"></span>
</div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite mc-Sew"></div>
<div class="sprite dr-Sew"></div>
<div class="sprite sp-w"></div>
<br>
<div class="sprite air"></div>
<div class="sprite AB"></div>
<div class="sprite RL-_A"></div>
<div class="sprite RL"></div>
<div class="sprite air"></div>
<div class="sprite RL-_A"></div>
<div class="sprite RL"></div>
<div class="sprite AB"></div>
<br>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite RL"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite RL-_A"></div>
</div>
:::
:::spoiler **Budded rails**
`powered rail` 和 `activator rail` 在 (de)power 時,如果被 (de)power 的鐵軌不會改變狀態 (還有其他 power source),就不會 update 相鄰的鐵軌。
先 power 鐵軌左邊,後 power 鐵軌右邊時,因為該鐵軌仍然被左邊的 `redstone block` power,所以不會改變狀態,也不會 update 相鄰的鐵軌。此時右邊的鐵軌若有 block update 才會被 power。
<div class="schematic">
<div class="sprite pr-ew_A"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite pr-ew_A"></div>
<div class="sprite pr-ew"></div>
<div class="sprite pr-ew"></div>
<div class="sprite pr-ew"></div>
<br>
<div class="sprite BR"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite BR"></div>
</div>
:::
### [Block Update](https://minecraft.wiki/w/Block_update)
#### 狀態改變時會發送 block upate 的方塊:
- `piston`、`note block`、`bell`、`copper bulb`、`scaffolding`、`leaves`
Update 相鄰方塊
- `redstone dust`、`redstone torch`
Update 相鄰方塊 和 相鄰方塊的相鄰方塊
- `rail`
- 水平: Update 相鄰方塊 和 下方一格空間的相鄰方塊
- 斜坡: Update 相鄰方塊 和 **上下方**一格空間的相鄰方塊
<div class="schematic">
<div class="sprie air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite SB-u"></div>
<br>
<div class="sprite air"></div>
<div class="sprite SB-u"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite SB-u"></div>
<div class="sprite SB-u"></div>
<div class="sprite SB-u"></div>
<br>
<div class="sprite SB-u"></div>
<div class="sprite pr-Sew_A"></div>
<div class="sprite SB-u"></div>
<div class="sprite air"></div>
<div class="sprite SB-u"></div>
<div class="sprite pr-Swu_A"></div>
<div class="sprite SB-u"></div>
<br>
<div class="sprite SB-u"></div>
<div class="sprite SB-u"></div>
<div class="sprite SB-u"></div>
<div class="sprite air"></div>
<div class="sprite SB-u"></div>
<div class="sprite SB-u"></div>
<div class="sprite SB-u"></div>
<br>
<div class="sprite air"></div>
<div class="sprite SB-u"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
<div class="sprite SB-u"></div>
</div>
<style>
.block-updates {
font-size: 32px;
line-height: 0.9em;
color: orange;
}
</style>
- `repeater`、`comparator`、`observer`
Update 充能位置 和 充能位置的相鄰方塊
<div class="schematic">
<div class="sprite air"></div>
<div class="sprite SB-u"></div>
<br>
<div class="sprite SB-u"></div>
<div class="sprite BR-u"></div>
<div class="sprite SB-u"></div>
<br>
<div class="sprite air"></div>
<div class="sprite rr-n1_A"></div>
</div>
### [CUD](https://minecraft.wiki/w/Tutorials/Comparator_update_detector) (Comparator Update Detector)
[Minecraft - Comparator Update Detector (CUD)](https://www.youtube.com/watch?v=JIR7Komip5E)
[CUDS EXPLAINED! Powerful But Forgotten Minecraft Java Redstone Component/Circuit](https://www.youtube.com/watch?v=wWTZB_LlFgY)
CUD 除了可以偵測 block update 外,還能偵測 comparator update,這是 BUD 所做不到的。以下是會發送 comparator update 的行為: [What CUD detects](https://minecraft.wiki/w/Tutorials/Comparator_update_detector#What_it_detects)。
就像 `comparator` 可以隔著一格方塊讀取容器,`comparator` 也可以隔著一格方塊接受 comparator update。
#### [Silent CUD](https://www.reddit.com/r/redstone/comments/1hzmz5y/silent_cud/)
原理: 放置在打開的 `trapdoor` 上的 `detector rail` 不會 update `comparator`。
設置方式:
1. 在 `trapdoor` 上放置 `detector rail`
2. 透過紅石 power `trapdoor` (**不可手動開啟**)
3. 手動關閉 `trapdoor`
4. 放置 `chest minecart`
5. 移除 power source
6. 手動打開 `trapdoor`
### Constant Block/Comparator Update
有兩種設置可以在每個 tick 持續發送 update。
1. 當任何 entity 的 hitbox 進入 `detector rail` 所在的方塊(不需要實際觸碰到),`detector rail` 就會持續在周圍發送 comparator update。
2. 當 `hopper` 上方的容器(`chest`、`barrel`、`dropper`等)滿足以下條件,會持續在容器周圍發送 comparator update。讀取容器訊號的 `comparator` 在 **comparison mode** 下會持續發送 block update。
- 容器中再少一樣物品,用 `comparator` 讀取的訊號強度就會減一。
- `hopper` 中的每一格都放了與容器中不同的物品,因此無法吸出容器中的物品。
- `hopper` 不能是鎖住的,也不能是滿的。
### Super Speed BUD
Super Speed BUD 指的是可以在 3gt 內 reset 的 BUD。
[3gt Dustupdateless Speedbud](https://www.youtube.com/watch?v=6AFK9UxF9v0)
[Super Speed BUD for 1.16](https://www.youtube.com/watch?v=uqbXqSJpECA)
[Super Speed BUDs](https://www.youtube.com/watch?v=MeYaVepBhUU)
### Block State Update Detector
[Hidden Observers in Minecraft | All the Function Without Ever Seeing It](https://www.youtube.com/watch?v=yYVhF4Q6rCM)
利用[浮空水](#Other-Bugs)偵測 block state 的改變,與 `observer` 的功能相同,但能更好的隱藏起來。
---
## Other Circuits
- [Dissecting Minecraft #6: Common Circuits](https://www.youtube.com/watch?v=OZBTB8NIggc&list=PLcSOIxw2nIE2OpQxG1ckMLsQ22Mu4Aiuc)
- [25 Minecraft Redstone Circuits YOU SHOULD KNOW!](https://www.youtube.com/watch?v=yhbvmbaIvcY)
- [The Ridiculous Device That Does Everything | Minecraft](https://www.youtube.com/watch?v=Cmmzh3ctX6c)
> latch, selector, T flip-flop, binary counter, progress bar, shift register
- [How to Make EVERY T-FLIP FLOP in Minecraft!](https://www.youtube.com/watch?v=MPFySvA_Ugs)
- [ABBA cicuit](https://minecraft.wiki/w/Redstone_circuits/Miscellaneous#ABBA_circuit)
- [Pulse multiplier & Applications: Signal strength input | Minecraft](https://www.youtube.com/watch?v=QdxZzBJAkzA)
- [Programable Pulse Multiplier Using CUD No Cooldown](https://www.youtube.com/watch?v=dCoDA_PLg6A)
- [Smallest Quick Reset Redstone Counter (Pulse Divider) for Minecraft Java](https://www.youtube.com/watch?v=xRIfRAA6qUM)
- [Minecraft: CBUD for 1.16.5](https://www.youtube.com/watch?v=lmdUnrbLl2g)
### Redcoder (Signal Strength Decoder)
[WORKS IN 1.16.3: REDCODER TUTORIAL](https://www.youtube.com/watch?v=YLLnruDBJD0)
[Minecraft: Smallest Stateless Redcoder](https://www.youtube.com/watch?v=7lHn2q0pCmo)
[1.16+ Vertical Redcoder | Signal Strength decoder](https://www.youtube.com/watch?v=baQeotVa_W8)
# Precise Timings
紅石機關中最重要的就是 timing。在 Minecraft 順暢執行時一秒有 20 game tick (gt),而 Minecraft 的一天有 24000 ticks,也就是 20 分鐘。
設計更精準的機關需要掌握 1 tick 內事件發生的順序 (e.g. 同時 power 兩個面對面的 piston,哪個 piston 會被推動)。
:::info
一般會使用 MSPT (milliseconds per tick) 來衡量遊戲執行的狀況,MSPT 指的是每個 tick 要花多少毫秒執行,如果超過 50 MSPT ,遊戲就無法以 20 TPS (ticks per second) 執行,就會開始 lag。
:::
## A Tick in Minecraft
1 tick 之間 Minecraft 發生的事件: [Tick | Technical Minecraft Wikia](https://technical-minecraft.wiki/w/Tick)
簡略過程:
1. 處理 player input
2. **遊戲的 world time 加 1**
3. 處理 tile tick
4. 處理 block event (pistons)
5. 處理 entity
6. 處理 tile entity (block 36)
關於每個階段實際上做了什麼事: [Ticks | Technical Minecraft Wiki](https://www.technicalmc.xyz/article/view/ticks#player-inputs-phase)
也有說法是 player input 是最後處理的,這取決於你如何切割 1 tick。如果將 1 tick 的開始視為「遊戲的 world time 加 1」,則 player input 就是最後處理的。
:::info
沒有延遲的元件如 `redstone dust`、`rail`、`fence gate`、`trapdoor` 等,在任何時間都會立即 update,它們不屬於任何階段。Tile tick 和 block event 的排程也是立即執行的。
:::
## [Tile Tick](https://technical-minecraft.wiki/w/Tile_Tick_Block)
[Dissecting Minecraft #15: Tile Ticks](https://www.youtube.com/watch?v=NELKoPZJl04&list=PLcSOIxw2nIE2OpQxG1ckMLsQ22Mu4Aiuc)
Tile tick block 指的是那些有延遲的方塊,例如 `repeater`、`observer`、`flowing water` (每 5 tick 流動一格)、`sand` (浮空 2 tick 後開始掉落) 等。當這些方塊在被 (de)power 時會創造一個 N tick delay 的 tile tick,每個 tick 都會在 *(3)處理 tile tick* 的階段將 delay 減 1,delay 歸零時就會方塊就會開始動作。
### Update Order
[Update order in Minecraft](https://www.youtube.com/watch?v=1V9M8OIjjlM)
Priority 越小越先被執行。這裡有列出不同 tile tick 的 priority 及例外: [List of all tile tick blocks | Technical Minecraft Wikia](https://technical-minecraft.fandom.com/wiki/Tile_Tick_Block#List_of_all_tile_tick_blocks)。若 priority 相同,則先被排程的先執行 (FIFO)。
::: spoiler **應用: [These Redstone Signals are Broken | Minecraft](https://www.youtube.com/watch?v=Ahagry4Yxus)**
利用 `comparator` 分辨不同 priority 的訊號。**當 `comparator` 指向 `repeater` 時 priority 是 -1**。
- 若訊號來自 `observer` (prority = 0)
1. `observer` 傳送訊號 → `comparator` 接收訊號。
2. 2 tick 後 `comparator` 判斷是否 power (是) → `observer` 中斷訊號。
- 若訊號來自 `repeater` (prority = -1)
1. `repeater` 傳送訊號 → `comparator` 接收訊號。
2. 2 tick 後 `repeater` 中斷訊號 →`comparator` 判斷是否 power (否)。
:::
### Player Input Bug ([MC-172213](https://bugs.mojang.com/browse/MC-172213))
說明: [Precise Redstone Timings](https://www.youtube.com/watch?v=cFoGmiySikA)
> I think sometimes the Mojang developers write codes seperately and then just throw it all together.
Tile tick block 在由 player (de)power 時會少 1 tick 的 delay,(e.g. `redstone torch` 直接用 `lever` 來 power 的話只會有 1 tick delay),這是因為 player input 是在 world time 加 1 前處理的。
在 *(1)處理 player input* 時,遊戲會安排一個 N tick delay 的 tile tick,然後 *(2)遊戲的 world time 加 1*,接著在 *(3)處理 tile tick* 的階段馬上就減少 1 tick 的 delay,因此相當於略過了 1 tick 的等待。
## [Block Event](https://www.technicalmc.xyz/article/view/ticks#block-event-phase)
> Piston block events can activate and schedule another block event that is added at **the end** of the LinkedHashSet. This allow chaining multiple blockevents in the same tick.
`piston` 是在 block event 階段處理的,而 `piston` 本身可以 update 相鄰的 `piston`,
`piston` 所造成的一連串 block event 可以用來確保 `piston` 執行的順序,稱作 block event delay。
:::info
有人把 block event delay 稱為 microtick,不過 block event delay 這個名稱比較被接受。
:::
[Block Event Delay Counter](https://www.youtube.com/watch?v=PGi-ud-_030)
:::spoiler 實例說明
下圖是一個常見的 zero tick 裝置,包含了 3 個 `piston`,由左至右編號分別為`A`, `B`, `C`。`observer` 發出訊號的同時被 `A piston` 推開,藉此 0 tick `C piston`。`B piston` 的作用是為了製造足夠的 block event delay,避免 `observer` 在 power `C piston` 前就被推走,因此不能替換為 `note block`。
<div class="schematic large-image">
<div class="sprite obs-Se"></div>
<div class="sprite AB"></div>
<div class="sprite sp-Se"></div>
<br>
<div class="sprite sp-Su"></div>
<div class="sprite pi-Sd"></div>
</div>
</div><br><br>
運作過程如下 (考慮 worst case):
1. `observer` power `B piston`,然後 power `C piston`。`A piston` 尚未被 update。
| B | C |   |   |   |
| - | - | - | - | - |
2. 到了 block event 階段,`B piston` update `A piston`,接著 `C piston` 啟動。
| ~~B~~ | ~~C~~ | A |   |   |
| - | - | - | - | - |
3. `A piston` 推開 `observer`,`C piston` 失去 power。
| ~~B~~ | ~~C~~ | ~~A~~ |   |   |
| - | - | - | - | - |
:::
[XYZ - Microtick (Block event) Technology & Infinite Bandwidth Instant-wire](https://www.youtube.com/watch?v=G2dPXVIg_us) (影片中將 block event delay 稱作 microtick)
## Piston
`piston` 雖然需要 2 tick 移動方塊,但它不是 tile tick block,而是在 block event 階段創造 tile entity (也就是 block 36),再由 tile entity 等待 2 tick。
[[Explanation] Precise Piston Mechanics](https://www.youtube.com/watch?v=k5Cv_3qRLoA)
>影片刊誤: [[Explanation] Piston Mechanics (Correction + Addition)](https://www.youtube.com/watch?v=XwIPYl3cu3U)
[活塞原理指南](https://www.bilibili.com/video/BV17w8izXEgV/)
[Minecraft Tick Phases | Explaining Minecraft #5](https://www.youtube.com/watch?v=o9BNNDqeMWE&list=PLFftmjZcJUwsXJWLzls_GMAcdYSkxKn1x)
::: spoiler **`sticky piston` 接收的訊號小於 3 tick 時會吐出方塊**
[Why Sticky Pistons Spit Out Their Blocks | Explaining Minecraft #13](https://www.youtube.com/watch?v=QCL5tJjA6ic&list=PLFftmjZcJUwsXJWLzls_GMAcdYSkxKn1x)
`sticky piston` depower 時若還沒完成 extension, 則會在 *(4)處理 block event* 的階段就將前方一格的 tile entity 變回原本的方塊,而不會等到 *(6)處理 tile entity* 的階段才將其還原。
這個特性使吐出方塊的 `sticky piston` 成為許多 `piston` 特性的例外。
:::
::: spoiler **`piston` 由 tile entity power 會延遲 1 tick**
移動的 power source 從 `block 36` 變回原本的方塊是發生在 *(6)處理 tile entities* 的階段,接著要等到下一個 tick 才能在 *(4)處理 block event* 階段創造 tile entity。
若經由 tile tick 來 power,就會在 *(3)處理 tile ticks* 的階段處理好,接者就是 *(4)處理 block event*,因此不會延遲 1 tick。
若 power source 是被 `sticky piston` 吐出的,則會在 *(4)處理 block event* 的階段就將 `block 36` 還原,然後就可以在同一個階段增加新的 block event,使下一個 piston 立即開始動作。
:::
::: spoiler **`piston` 移動的方塊需要 3 tick 後才能被再次被 `piston` 移動**
`piston` 移動方塊需要 2 tick,2 tick 過後在 *(6)處理 tile entities* 的階段將 `block 36` 變回原本的方塊後下個 `piston` 才能移動它,接著要等到下個 tick 才能在 *(4)處理 block event* 的階段移動那個方塊。
吐出方塊的 `sticky piston` 因為在 N tick (N < 3) 後 *(4)處理 block event* 時就將 `block 36` 還原,因此同個階段中,下個 `piston` 就已經能移動那個方塊了。
:::
### 方塊移動順序
`piston` 在移動方塊時,每個方塊的 update 順序是固定的。
1. 方塊會被分割成數條與 `piston` 運動方向平行的直線。
2. 以 `piston` 所在的直線為作為基準,曼哈頓距離最遠的直線會優先進行 update,並根據 +X, -X, +Z, -Z, +Y, -Y 的順序來解決距離相同的情況。
3. 在每條直線中,會從移動方向的最前端方塊開始 update,向後依序進行。
Extend 時 `piston` 本身會**最後** update,retract 時 `piston` 本身會**最先** update。
:::spoiler 實例說明
下圖 `sticky piston` 左右移動多個 `slime block`。`slime block` 可分為 A, B, C 三條平行於 `piston` 運動方向的直線。`slime block` 的編號依次為 1-6。
<div class="schematic">
<div class="sprite SL"></div>
<div class="sprite SL"></div>
<div class="sprite SL"></div>
--- 4️⃣5️⃣6️⃣ --- A [ 距離 2 ]
<br>
<div class="sprite SL"></div>
<div class="sprite air"></div>
<div class="sprite air"></div>
--- 3️⃣    --- B [ 距離 1 ]
<br>
<div class="sprite SL"></div>
<div class="sprite SL"></div>
<div class="sprite sp-w"></div>
--- 2️⃣1️⃣  --- C [ 距離 0 ]
<br><br></div>
直線更新的順序由遠至近為 A → B → C。
- Extend 時 update 順序: [4 → 5 → 6] → [3] → [2 → 1] → `piston`。
- Retract 時 update 順序: `piston` -> [6 → 5 → 4] → [3] → [1 → 2]。
:::
## Redstone Dust
`redstone dust` 的 update order 十分難以捉摸,因此機關比較少依賴 `redstone dust` 的 update order,但它還是有固定的規則。
[Redstone Dust Update Order](https://www.youtube.com/watch?v=2mjZuWJDB0k)
[Redstone Update Order](https://www.youtube.com/watch?v=XVvLWlckXLs)
[Why is redstone locational in Minecraft?](https://www.youtube.com/watch?v=7gF5mbjFies)
### Simple Order
當 `redstone dust` 是一直線時,update 順序是 -X, +X, -Y, +Y, -Z, +Z。
### Full Order
`redstone dust` 會產生 7 個 notifier(自己 + 相鄰方塊),每個 notifier 會 update 相鄰方塊。這 7 個 notifier 產生的順序要看 complete order,但每個 notifier update 相鄰方塊時則是依照 simple order。
### Complete Order
Notifier 有三組 update 順序:
1. 中間
2. +Y, -Z, -X
3. -Y, +Z, +X
這三組 update 的順序未知,但每組中的 update 順序是固定的。這個順序在 97% 的位置是正確的,在另外 3% 的位置上在 Z 方向走兩格必定是 97% 的位置。
## Instant Wire
[0 Tick Basics (Part 1) - Instant Repeaters, Basic 0 Tick Gens](https://www.youtube.com/watch?v=-za2nU1QbRE&list=PLpgnhv91jhlEqOBg_idyUJnNuCwQncBgk)
[How to | 0 Ticks!](https://www.youtube.com/watch?v=4oX_CHaQuPM&list=PLpgnhv91jhlEqOBg_idyUJnNuCwQncBgk)
### Instant Repeater
[Dissecting Minecraft #13: Instant Wire](https://www.youtube.com/watch?v=yYn3CFczLm8&list=PLcSOIxw2nIE2OpQxG1ckMLsQ22Mu4Aiuc)
[Lag friendly instant repeaters](https://www.youtube.com/watch?v=yfcVLNNmbNQ)
[1 wide spam-proof 0-tick instant repeater](https://www.youtube.com/watch?v=VfQZ3dAIlS8)
#### Vertical Instant Wire
[Minecraft: Vertical Instant Wires + Item Elevators](https://www.youtube.com/watch?v=R74RO8XhEUQ)
[1.5+ Dustless and 6gt reset instawire](https://www.youtube.com/watch?v=xBbqrLuYU0w)
### Instant Rail
[Robust Instant Wire | Minecraft](https://www.youtube.com/watch?v=nJx-o9fDVm4)
[Two Way Instant Wire & Instant Dropperline](https://www.youtube.com/watch?v=ktsJjiHVUDE)
[インスタントレール詳論 | Minecraft Java 1.18.2](https://www.youtube.com/watch?v=wWEioi2gVlg)
### Instant Comparator
[Instant Comparator Line](https://www.youtube.com/watch?v=Tz2MLYriznY)
[Lag-Friendly Instant Comparator Line](https://www.youtube.com/watch?v=pS90tcZYng0)
[Minecraft Instant Comparator](https://www.youtube.com/watch?v=1bzLUDAzGS8)
::: spoiler 原理說明
當 `comparator` 被 update 時,如果當前的訊號強度會改變,它就會安排一個 2 tick 延遲的 tile tick。2 tick 過後處理這個 tile tick 時,`comparator` 會再重新計算一次新的訊號強度。
Instant comparator 的運作方式是提前 update 所有的 `comparator`,使它們同時在 2 tick 過後重新計算 訊號強度,因此要確保前面的 `comparator` 比後面的先被 update,後面的 `comparator` 在計算新訊號強度時算出的才會是前面 `comparator` 的訊號強度。
:::
#### Falling Edge Instant Comparator
常見將 instant comparator 瞬間關閉的方法有兩種,一種是 update `comparator` 的 input 端,這種方法的好處是 rising edge 和 falling edge 用的都是相同的 update,設計上比較簡單,缺點是無法處理 [≥ 15 的訊號強度](##Overloaded-Signal-Strength),因為被 update 時訊號強度不會改變,因此就不會安排 tile tick。
另一種則是將 `comparator` 設為 **subtraction mode**,關閉時 **update `comparator` 的側端**,這樣確保就算訊號強度 ≥ 15 在 update 時也會改變大小,缺點是 rising edge 和 falling edge 的 update 是分開的。
#### Signal Strength to Pulse Length
[Long Distance Signal Strength Transmission made Simple](https://www.youtube.com/watch?v=IpF3Su9twvI)
快速在長距離傳遞不同訊號強度除了使用 instant comparator 外,也可以先將 訊號強度轉換成 pulse length,用 instant repeater 傳送後再將 pulse length 轉回訊號強度。
這個方法比 instant comparator 慢,但花費時間不會隨距離增加,而且簡單很多。缺點是要傳遞越大的訊號要花費越多時間。
### Other Instant Wires
- **Instant logic gates**: [Instant Logic Gates](https://www.youtube.com/watch?v=hqbqvjqkJiQ)
> 影片中除了 NOT gate 以外就沒有詳細教學,要製作其他 instant logic gate 只要將原本 logic gate 中的 `redstone torch` 替換成影片中的 instant NOT gate 即可。
- **Instant dropper line**: [Easy Instant Dropper Line: Fast & Precise | Minecraft 1.16+](https://www.youtube.com/watch?v=MAnZM269I-o)
- **Instant redcoder**: [Instant Expandable Redcoder](https://www.youtube.com/watch?v=WDYU5HKJzb4) (利用 [instant comparator](###Instant-Comparator) 達成)
- **Instant ABBA**: [How to | 0 tick ABBAs](https://www.youtube.com/watch?v=YyZ9xCMA15Y)
# ~~Bugs~~ Features
> Minecraft 沒有 bug,只有 feature。
## TNT Duping
TNT duping 複製的是**點燃的 TNT 實體**,不是複製 TNT 這個物品。
### 原理
[TNT Duping Explained | Explaining Minecraft #10](https://www.youtube.com/watch?v=8eFSfDWTZx4&list=PLFftmjZcJUwsXJWLzls_GMAcdYSkxKn1x)
Coral based TNT duping update order:
`coral` → `TNT` → power source (`detector rail` 底下的方塊)
### Coral Based TNT Duper
[Minecraft highly configurable tnt duper](https://www.youtube.com/watch?v=Dg-uSzuyRX8)
如何組裝 TNT duper:
[How to build SIMPLE TNT Dupers for minecraft 1.17.1](https://www.youtube.com/watch?v=JRp_miTC65Y)
### TNT Duper Variations
[Mini TNT Duper V2 With NO SLIME OR CORAL](https://www.youtube.com/watch?v=Y7r89E91QrI)
[Cartless TNT Dupers](https://www.youtube.com/watch?v=cLMhPTUKI38)
[Simple TNT Dupers with NO CORAL | TNT Duping Explanation](https://www.youtube.com/watch?v=KPH1UCvyrkE)
### One Wide Tilable
[Compact observer-based TNT duper](https://www.youtube.com/watch?v=jrAZX4r__gY)
---
## Silly String
[这玩意儿啾竟怎么刷的?刷线机原理探讨 - 含手动刷线机和【百万】无人刷线机](https://www.bilibili.com/read/cv18551694/)
應用:
[minecraft auto string duper / tripwire duper - 1728kph](https://www.youtube.com/watch?v=4Ur2OHiUsHc)
[weird 30gt clock](https://www.youtube.com/watch?v=bPE9Qmf9tKA)
[Unlimited Obsidian Platform Deletion (1.13-1.20.2+)[with Silly String]](https://www.youtube.com/watch?v=UK0ITdepa24)
[Update-supression-less sliced portal (works from 1.13-1.20.2+)](https://www.youtube.com/watch?v=iBbXuK79syA)
---
## Item Duping (Rail, Carpet, Gravity Blocks)
### Rail Duping
- 需要 `coral` 和 `slime`:
[FAST Rail Duper Tutorial](https://www.youtube.com/watch?v=cRUjN1XPR-o)
- 需要 `slime` 或 `honey`:
[NEW 1.16 Minecraft EASY INFINITE RAIL DUPLICATION GLITCH](https://www.youtube.com/watch?v=9u4hTWyF3Ks)
應用: [Super Charged Railway Builder](https://www.youtube.com/watch?v=_IAIyNNMTs4)
### Carpet Duping
可以用作簡易的燃料。
- 需要 `slime`:
[Carpet Duper (10k+ Per Hour)](https://www.youtube.com/watch?v=k2P5dN4Tmc0)
- 不需要任何 `slime` 或 `sticky piston`:
[Super Carpet Duper Tutorial - Minecraft 1.16 - Slimeless, Simple, Fast](https://www.youtube.com/watch?v=c-ocnvN9q8Y)
### Sand / Gravel / Concrete Powder Duping
[Simple Sand and Concrete Generator](https://www.youtube.com/watch?v=wfeGyXJOCBw)
### Dragon Egg / Anvil Duping
[Simple Dragon Egg Generator](https://www.youtube.com/watch?v=6pjILKM92gQ)
:::info
如何移除 `end portal frame`: [New Impossible Block Breaking for Survival](https://www.youtube.com/watch?v=EgvsoLxC3iI&t=156s)
:::
---
## [Bedrock Breaking](https://minecraft.wiki/w/Tutorials/Breaking_bedrock)
[Dissecting Minecraft #16: How to Break Bedrock](https://www.youtube.com/watch?v=c3uuLUSccQI&list=PLcSOIxw2nIE2OpQxG1ckMLsQ22Mu4Aiuc)
各種破壞 `bedrock` 的設置:
[[1.10~1.16+] More 100% Success Bedrock Breaking Methods](https://www.youtube.com/watch?v=UcxmUl65nYM)
[Automatic Breaking Bedrock Flying Machine](https://www.youtube.com/watch?v=SP_M-8QA5f0)
解釋: [Piston-based bedrock breaking setup explained](https://www.youtube.com/watch?v=ziu9_4PuYw4)
全自動的裝置: [1 overhead 3 way bedrock breaker](https://www.youtube.com/watch?v=nFqvlNi-hZo)
### Remove Bedrock by Hand
透過製造巨大的 lag spike,玩家也可以手動在 1 tick 內完成移除 `bedrock` 所需的所有步驟。這部影片利用 [`redstone dust` 糟糕透頂的優化](##Redstone-Dust)製造 lag spike:
[Cheap, Fast, Reliable Bedrock Breaker Using Redstone Lag (Improved Video)](https://www.youtube.com/watch?v=JUfFWr9WCAs)
另一個方法是利用特殊的 pulse,在特定 [tick phase](##A-Tick-in-Minecraft) 中 depower 再 power `piston`,使遊戲生成 `headless piston`。這部影片中使用了 20Hz 的 clock 在每一個 tick 都產生這種特殊的 pulse:
[Bedrock breaking alternative.(No explosive, no server freezing, no hacked client)(1.16~1.20)](https://www.youtube.com/watch?v=vPZ9ADAT2WU)
:::warning
上述兩種人工的方法前提是玩家能夠 instant mine `piston`,因此需要 *efficiency 5* 的 `diamond pickaxe` 搭配 *Haste 2* `beacon`。
:::
### Remove Bedrock with Mods
有些客戶端模組可以用來輔助移除 `bedrock`,不需要在 server 安裝任何模組。
[**Fabric Bedrock Miner**](https://www.curseforge.com/minecraft/mc-mods/fabric-bedrock-miner)
透過模組自動在 1 tick 內完成移除 `bedrock` 所需的所有步驟。
[【MC】Easily break 5 bedrocks in 1 second ! Client fabric mod: Bedrock Miner released (1.16+)(GPLv3)](https://www.youtube.com/watch?v=b8Y86yxjr_Y)
- 優點: 簡單快速。
- 缺點: 只能向下移除,且需要 *efficiency 5* 的 `diamond pickaxe` 搭配 *Haste 2* `beacon`。
[**Easy Bedrock Breaker**](https://modrinth.com/mod/easy-bedrock-breaker)
透過模組延遲客戶端封包,等 player 完成移除 `bedrock` 所需的所有步驟後再一次將封包全部送出。
[easy bedrock breaker mod](https://www.youtube.com/watch?v=SLL8uwEe5fc)
- 優點: 自由度較高,只需要 *efficiency 5* 的 `diamond pickaxe`,不用 *Haste 2* `beacon`。
- 缺點: 較慢,需要手動執行移除 `bedrock` 所需的所有步驟。
---
## Other Bugs
- Redstone components lose 1 tick of delay when (de-)activated by a player input ([MC-172213](https://bugs.mojang.com/browse/MC-172213))
- End of `repeater` / `comparator` chain not updating ([MC-54711](https://bugs.mojang.com/browse/MC-54711?fbclid=IwAR0rweg4JuEZW7occj718-IeY0k7sk3FhPujs8VR00sOucH2Eyk_6KNKGnI))

- [How To Make Floating Water & Sand with Explanation | Minecraft | Java Edition](https://www.youtube.com/watch?v=98CgpUMi1tY)
- [Minecraft 1.16+: Water without source and sponge without block updates](https://www.youtube.com/watch?v=QVOONJ1OY44)
- [Instant Liquid Flow - Minecraft 1.17+](https://www.youtube.com/watch?v=9QpinJYueWA)
### Overloaded Signal Strength
:::danger
最新版本已無法在生存模式中取得 stacked unstackable items,只能用指令: `/summon minecraft:item ~ ~ ~ {Item:{id:"minecraft:diamond_pickaxe",Count:64b}}`
:::
利用 stacked unstackable items 放在箱子中,使 comparator 讀出大於 15 的訊號強度。
通常運用在傳遞資訊。e.g. 將訊息 enocde 成 256 bits,用 [instant comparator line](#Instant-Comparator) 將最高強度 256 的訊號傳出,再 decode 訊號強度。
[Overloaded Signal Strength to Decimal | Minecraft](https://www.youtube.com/watch?v=R5VuagERLWA)
# Redstone Contraptions
[Redstone Builds Everyone Should Know](https://www.youtube.com/watch?v=B2esricKcE8)
## Chunk Loading
[Chunk Loading And Active Chunks](https://www.youtube.com/watch?v=dx5Wd28AKxQ)
[Chunkloading in Vanilla Minecraft](https://www.youtube.com/watch?v=KnZ5nlQbFvo)
當 entity 穿過任何 portal 或 end gateway,會加載對面 15 秒。範圍是 3×3 的 entity processing chunk,和外圍 5×5 的 lazy processing chunk,以傳送過去 entity 所在的區塊為中心。
- Entity Processing Chunk: 遊戲正常執行。
- Lazy Processing Chunk: 紅石正常運行,但不會處理 entity。這個範圍的 mob 不會 despawn 但會算進 mob cap。
### Spawn Chunk
尋找 spawn chunk 範圍可以使用 [SPAWN CHUNKS READER](https://www.chunkbase.com/apps/spawn-chunks-reader),這個工具需要用到世界的 level.dat 檔案,如果沒辦法獲得這個檔案,可以使用這個方法: [How To Find Your Spawn Chunks - Step By Step Tutorial](https://www.youtube.com/watch?v=_D4iTSMUX1o)
### Nether Portal Chunkloader
[24/7 Honey Farm And New Perma Loader](https://www.youtube.com/watch?v=aKSFk4_Q2IA)
standard design、lag friendly
[Simple Portal Chunk Loader](https://www.youtube.com/watch?v=B8z7q_pwjL4)
simple、pigman-proof、user-friendly
[Minecraft Chunk Loader - Simple And Reliable - Doesn't Break on Server Crash](https://www.youtube.com/watch?v=BUDEwjGUimo)
**reliable**、pigman-proof、lag friendly
[Easy Pigman-Proof Minecart Chunkloader](https://www.youtube.com/watch?v=zEMuvzcApac)
pigman-proof、lag friendly、user-friendly
[The Simplest Portal Chunkloader](https://www.youtube.com/watch?v=jY9L4Xrohm4)
**simple**、pigman-proof、user-friendly
### End Gateway Chunkloader
::: warning
穿越 end gateway 的 entity 會出現在 gateway 11×11 格內距離最遠且擁有完整 hitbox 的方塊上,所以**和傳送門不一定會在同一個區塊**。
:::
[1.21's New Ultimate End Chunkloader](https://www.youtube.com/watch?v=ITTC2Gx9N1E)
### Chunk Reload Detector
偵測裝置所在的 chunk 是否被 unload 過。
[Automatic Chunk Reloader](https://www.youtube.com/watch?v=s4rFRZ0rDoc)
### Lazy Chunk Detector
偵測裝置所在的 chunk 是否為 lazy chunk。
[[Movable] Lazy Processing Chunk detector (with auto-reset)](https://www.youtube.com/watch?v=eES2OMEk8tE)
---
## Flying Machine (Slimestone)
[Basics of Slimeblock Flying Machines Tutorial](https://www.youtube.com/watch?v=UoqGvhLiG9A)
[Dissecting Minecraft #9: Flying Machines](https://www.youtube.com/watch?v=4Pym6T7drrk&list=PLcSOIxw2nIE2OpQxG1ckMLsQ22Mu4Aiuc)
[Self Returning Flying Machines](https://www.youtube.com/watch?v=OnCXg5YkNCA)
[Flying Machine Basics ( Part I ) - Minecraft](https://www.youtube.com/watch?v=P8jlieUuR2s)
[FLYING MACHINE Basics Part II - Extensions - Minecraft](https://www.youtube.com/watch?v=U-J69bq_hmU)
[Minecraft Flying Machine Basics #1: Engines & Extensions](https://www.youtube.com/watch?v=BTZ0UsNihN4)
[Minecraft Flying Machine Basics #2: BUD wires, movable water, and other useful circuits](https://www.youtube.com/watch?v=4mmJGFKTYc0)
[Minecraft Flying Machine Basics #3: Useful logic circuits](https://www.youtube.com/watch?v=dh3tThLnKWE)
### Movable Return Stations
[Basic 3 Directional Block Pushing/Pulling Machine](https://www.youtube.com/watch?v=80sPr95_Kho)
[Flying Machine Returning Systems](https://www.youtube.com/watch?v=RBHtgIcnIT8)
### 各種速度的 Flying Machines
最常見的 observer based flying machine 速度是 2 m/s (10 tick engine) ,但除此之外還有很多不同速度的設計。
#### Slower Engines
[Slow Flying Machine Engine (one direction)](https://www.youtube.com/watch?v=C1ISMqmKb98)
#### Faster Engines
9 tick engine: [Flying machines with only two pistons](https://www.youtube.com/watch?v=zGwt1X2EvBA)
8 tick engine: [8 Tick Engine For Flying Machines](https://www.youtube.com/watch?v=KujvHdHhygI)
7 tick engine: [7 Tick Engine For Flying Machines](https://www.youtube.com/watch?v=ZAl4M9uWWTg)
6 tick engine: [Compact Fast Flying Machine 3.3 m/s](https://www.youtube.com/watch?v=vYAFN1Z9mIs)
4.4 m/s engine: [Compact 4.4 m/s engine with extensions](https://www.youtube.com/watch?v=H1L9AndqnIg)
:::info
[理論上速度最快的 flying machine](https://www.youtube.com/watch?v=FkitvfBbBxw) 可達 6.6 m/s,因為 `piston` 需要 3 gt 的反應時間。目前最快的 flying machine 為 [FASTEST Flying Machine in Minecraft! (5 blocks/second)](https://www.youtube.com/watch?v=oJ3ITyhOVRw)。
:::
### 4 Way Flying Machines
[Minecraft: MORE Efficient 4 Directional Flying Machine | One Take | 1.15.2+ Java Edition](https://www.youtube.com/watch?v=RaD97AWBXas)
[Compact 4 Way Flying Machine](https://www.youtube.com/watch?v=OFDG7pjoXTc)
[Vertical 4 Way Flying Machine](https://www.youtube.com/watch?v=j7dE3iUG9F0)
### 斜向前進的 Flying Machines
[Extensions For Diagonal Flying Machines](https://www.youtube.com/watch?v=CktaZ9UUIa0)
[26.5° And 18.4° Flying Machines](https://www.youtube.com/watch?v=aXAuvi8WujI)
### 實用的 Flying Machine 設計
[Player Controlled Direction Changing 2 Way Flying Machine](https://www.youtube.com/watch?v=hVOZb0XV1QY)
[Self Returning 2-Way Flying Piston Wall](https://www.youtube.com/watch?v=7wawuf4VXcw)
---
## Wireless Redstone
### Player Detector
利用 `pufferfish` 偵測範圍 5×5 格內的玩家: [Reliable Pufferfish detector Minecraft](https://www.youtube.com/watch?v=6tE5yvSUauI)
利用生物遊走偵測附近的玩家(偵測範圍較大): [Player detector [all java versions]](https://www.youtube.com/watch?v=zFICPpBpvRE)
利用 `allay` 偵測特定玩家在附近: [Smart Player Detectors in Minecraft - Different Outputs for Different Players](https://www.youtube.com/watch?v=VaEXpG0wI9g)
利用 `cat` 偵測特定玩家是否上線: [Simple Player Online Detector Minecraft 1.16](https://www.youtube.com/watch?v=BudRgJyLPlA)
- 應用: [Improved Wireless Teleportation Using CATS!( ( 1.19, 1.20+)](https://www.youtube.com/watch?v=iapoJXnnoQU)
### 傳遞紅石訊號
垂直向下: [Wireless Redstone [vertical]](https://www.youtube.com/watch?v=ae-yHkx0w8Y)
**限制**: `daylight detector` 必須能 access 天空
水平直線: [Wireless Redstone With Tripwire Hook](https://www.youtube.com/watch?v=t1Onu6tWzs4)
**限制**: 範圍只有直線 40 格
### 真·無線紅石
[Wireless Redstone in Minecraft 1.16+ Survival (Reliable + Unlimited Range)](https://www.youtube.com/watch?v=hr-twzxs6FM)
[The Wonderful World of Wireless Redstone](https://www.youtube.com/watch?v=sBNuqZKa_Lw)
**限制**:
- 在 multi player 上才能可靠運作 (single player 可能會接收到錯誤的訊號)
- 無法跨 dimension
原理: [Wireless Redstone 2: The Game Mechanics](https://www.youtube.com/watch?v=FLynwXDnETI)
增加頻寬的改良:
[New High Speed '5G' Wireless Redstone in Minecraft + Explanation](https://www.youtube.com/watch?v=U2HT3L6nkJA)
1-Wide Tileable:
[1-Wide Tileable Wireless Redstone Transmitter and Receiver](https://www.youtube.com/watch?v=XER9rVQA4OU)
在 single player 也能運作的改良:
[Wireless Redstone | Better Error Correction and Bug Fixes](https://www.youtube.com/watch?v=PjheW_68Adk)
---
## Item Sorting (Storage Tech)
基本的 item sorter 設計: [5 Useful Item Sorters For Minecraft Java & Bedrock!](https://www.youtube.com/watch?v=IDmxkObgA2s)
如何設計大型的 storage system: [Storage Tech](https://www.youtube.com/playlist?list=PLckoLTi5UhFNR_1Snhquo0fRRTziAdUVq)
### Double Speed Item Sorter
[Very Compact Double Speed Item Sorter](https://www.youtube.com/watch?v=rWbzfWFXHXw)
在這個設置中,上方的 `hopper` 會將物品送入下方的 `hopper`,同時下方的 `hopper` 會將上方 `hopper` 的物品吸入,因此可以達到兩倍速。由於上方 `hopper` 在傳遞物品時會進入冷卻時間,導致物品沒辦法被可靠的吸入,因此需要嚴格控制物品經過`hopper` 的時間,等到上一批物品分類完後,再讓下一批物品進入。
[Reliable True Double-Speed Item Batching](https://www.youtube.com/watch?v=cuSusZn3H4c)
也可以放慢物品速度,使物品停留在 `hopper` 上足夠的時間,使 `hopper` 能可靠的將物品吸入。
[Simple Playerless & Self Loading Bartering Farm](https://youtu.be/To7NID54vMs?t=181)
### Unstackable Item Sorting
利用 `dropper` 和 `dispenser` 的特性分類特定 unstackable。
[Simple Unstackable Item Sorters & Applications](https://www.youtube.com/watch?v=LHt38pgEHlo)\
[Minecraft Unstackable Sorting Explained in 100 Seconds](https://www.youtube.com/watch?v=6M4N8xBt_tE)
利用 `crafter` 分類特定物品。
[A New Method of Item Sorting Using Crafters in Minecraft 1.21](https://www.youtube.com/watch?v=fPJBEnZfr3w)
利用 `brewing stand` 分類 `potion`。
[Minecraft: CUD Based Potion Sorting](https://www.youtube.com/watch?v=0b2GOj19gPY)
利用 `allay`,可分類任何物品。
[Instant Activation Allay Item Sorter](https://www.youtube.com/watch?v=1FmfKEw7VbQ)
### Multi-Item Sorter
普通的 sorter 是一個容器裝一種物品,而 multi-item sorter 則是可以將數種不同的物品裝進同一個容器。適合用在物品種類多但每種物品數量少的情況,可以大量降低容器的使用。
[Minecraft Ultra-fast Multi-Item Sorter V2.0 Showcase (1.19, Java edition)](https://www.youtube.com/watch?v=tRj52w8dptc)
[16x Faster Cart-Based Multi-Item Sorter: CartMIS™](https://www.youtube.com/watch?v=1SYSN0jT0Ac)
### Stack Separation Sorting
以 stack 為單位分類物品,將相同的物品分離出來後再一次對整疊物品分類:
[Stack Separation Sorting](https://www.youtube.com/watch?v=twPZY484Iy4)
速度更快的設置 (1,152,000 items per hour):
[I Built the FASTEST Item Sorter in Minecraft!](https://www.youtube.com/watch?v=4MoLePpXenc)
### Hopper Minecart Sorter
[Why You Need A Chest To Make A Proper Hopper Minecart Item Filter](https://www.youtube.com/watch?v=hiR5bu1aWrU)
[2.8M Items/h Filtercart Sorter](https://www.youtube.com/watch?v=wkfUhNmprA0)
### Water Stream
水是用於移動物品常見的方法。水流有許多奇怪的特性:
[You don't know water streams](https://www.youtube.com/watch?v=YzmtijZjzaA)
---
## Other Contraptions
[New Block Swapper Design (Compact, Tileable, Multi-Directional)](https://www.youtube.com/watch?v=ZxDpje2op84)
[Dissecting Minecraft #12: 7 Segment Display & Shulker Box Loader/Unloader](https://www.youtube.com/watch?v=o9QHgpcv2-0&list=PLcSOIxw2nIE2OpQxG1ckMLsQ22Mu4Aiuc)
### Block Conveyor
[Block & Entity Conveyor: Fast, Versatile, Easy to build! | No Mods/Commands](https://www.youtube.com/watch?v=uIowfY-p-qg)
[6.6 Blocks Per Second Block Conveyor 1.15+](https://www.youtube.com/watch?v=6ZbHuz4nalU)
[Sharing is Caring 015: Block Chain Extender - Conveyor Extender](https://www.youtube.com/watch?v=4hDHe5jZ4rU&list=PL48AC5D02C0E775BE)
# Entities and Blocks
[Compact Redstone: 2-10 Entity usage and basic entity circuits](https://www.youtube.com/watch?v=ZC4SiB4Y8CQ&list=PLDxFLIDNIzqsC4rh1aqko97Qqd7sM_Bj6)
紅石機關可能會配合各種不同的 entity,例如對齊 `hopper minecart`、分類生物、對齊箭矢等,很多應用會需要用到特定大小的方塊。這張表格有各種 entity 及方塊的 hitbox 大小,在用來對齊 entity 時很有幫助: [EntitySizes and BlockSizes 1.21 by RaysWorks](
https://docs.google.com/spreadsheets/d/18_m_ylcYiE_gmxKCBgpu-qkj767kfn_T88hS4GdTqh0/edit#gid=2060389701)。
生物乘船時的高度: [Entity Ride Heights.xlsx](https://github.com/acaciachan/tree-hole/blob/main/%E5%AE%9E%E4%BD%93%20entity/Entity%20Ride%20Heights.xlsx)
設計紅石機關時經常需要擁有特定屬性的方塊,例如:「不會被 `slime block` 黏住」、「上方可以放置 `redstone dust`」、「無法被 power」,`hopper` 就符合這三項條件。利用這個網站可以篩選符合特定條件的方塊: [Minecraft Block Property Encyclopedia](https://joakimthorsen.github.io/MCPropertyEncyclopedia/index.html)。
## [Minecart](https://minecraft.wiki/w/Minecart)
根據 `minecart` 種類和內容物的不同,在鐵軌上的加速減速也不同,詳細的行為可以看 [Tutorials/Minecarts – Official Minecraft Wiki](https://minecraft.wiki/w/Tutorials/Minecarts)。
當生物因為 `minecart` 被破壞或被 `activator rail` 觸發,使生物離開,生物的落下位置的可以用以下規則來判斷:
- 生物離開會在以 `activator rail` 位置為中心 3 × 3 × 3 範圍內被放下。例如 `activator rail` 的位置在 Y = 60,則方塊的**最高高度**必須在 [59, 61),生物才能落在上面。
- 生物離開時會被放置在方塊正中間,高度在方塊的最高高度。放下後生物的 hitbox 不能與其他方塊 collide。
- 遊戲會按照 中 → 上 → 下 的順序在九宮格平面中搜尋合適的方塊放置生物。同一平面中,則會用以下順序搜尋合適的方塊 (假設 `minecart` 前進方向是↑):
| **6** | **8** | **5** |
| ----- | ----- | ----- |
| **2** | **↑** | **1** |
| **4** | **7** | **3** |
- 若以上範圍都無法放置生物,則生物會在 `activator rail` 的正中央稍微偏前的位置被放下,不管生物是否能站在上面。`activator rail` 的正上方與正下方無法放置生物。
### Minecart Yeeting (Instant Minecart Unloader)
透過破壞 `minecart` 瞬間取出裡面所有的物品,而不用透過 `dropper` 一個一個將物品丟出。
[The New 1.19 Cart Tech: Cart Yeeting](https://www.youtube.com/watch?v=8SVN5AumEYk)
原理: [How to separate minecarts from their contents - Minecraft 1.19](https://www.youtube.com/watch?v=MhY2mIdV7NM)
各種 unloader 設計:
(主世界) [New Instant Unloader and Debugging](https://www.youtube.com/watch?v=Kjez0JUoEQ0)
(地獄) [Updating a Nether based Hopper minecart unloader](https://www.youtube.com/watch?v=Kjez0JUoEQ0)
### 將 minecart 放在各種方塊內
[An Introduction to Placing Minecarts in Hoppers and Other Immovable Blocks](https://www.youtube.com/watch?v=5zIyVhVwtBQ)
### 精準微調 minecart 位置
[High Precision Entity Alignment](https://www.youtube.com/watch?v=sHXrqptOU2s)
[Pushing Minecrafts Precision to its Limits](https://www.youtube.com/watch?v=AdHGmFpaoCE)
## [Boat](https://minecraft.wiki/w/Boat)
- 船擁有 solid hitbox:船的 hitbox 如同實體方塊一樣無法被穿越,因此可以拿來對齊 entities。
- 當生物的 hitbox 靠近船的**側邊** 0.2 格內會被吸到船上。
- Drowning boat: 船的中央在水下時生物不會被吸到船上;船的 hitbox 有部分在水下時則能將生物吸到船上,但船上的生物會瞬間被趕出。
- 有生物乘載的船無法被生物推動,但可被方塊推動。
- 若 `dispenser` 在前方或下方有水源或水流時被 power 則可以在水上方一格放船。每次 power 放下船的位置與與方向都相同,用此方法可以讓多艘船的 hitbox 重疊。
- 船若落下至 level < 5 的水流上會穿透下方一格方塊。
### Boat in 0 Tick
[How to | B O A T](https://www.youtube.com/watch?v=tOj8zh56Nq8)
[S P E E D S M O L B O A T](https://www.youtube.com/watch?v=bUMPpCY6bss)
有些 0 tick 設置利用 `sand` 會自動下落的特性來重設裝置,受限於 `sand` 下落的速度,此類裝置最短的重設時間是 9 tick。透過在 `sand` 下方放置 `boat` 可以加速 `sand` 下落的速度,將重設時間縮短至 3 tick。
## Special Blocks
- `soul sand`、`mud`
高度不足一格的 [conductive blocks](https://minecraft.wiki/w/Conductivity) (能生怪、能被 power)。
- `fence`、`fence gate`、`wall`
1.5 格高的方塊。
- `scaffolding`
單向 hitbox,只有由上往下無法穿透。
<!-- https://mcasset.cloud/1.20.2/assets/minecraft/textures/block -->
<style>
.schematic {
line-height: 1em;
padding: 0px 0px 3px 10px;
transform-origin: top left;
max-width: 100%;
}
.sprite-container, .sprite {
display: inline-block;
margin-left: -0.21em;
width: 16px;
height: 16px;
}
.sprite, .texture {
background-image: url('https://minecraft.wiki/images/SchematicSprite.png');
}
.texture {
position: absolute;
width: 16px;
height: 16px;
}
.large-image {
transform: scale(2);
width: 50%;
}
a:has(span) {
color: #1155cc !important;
}
</style>
<!-- List of Sprites-->
<style>
/* https://minecraft.wiki/w/Template:Schematic/doc */
/* Masks */
.darker {background-position: 480px 0px;}
.lighter {background-position: 464px 0px;}
.SB-u {background-position: 432px -16px;} /* Gold */
.MB-u {background-position: 416px -16px;} /* Diamond */
.BR-u {background-position: 448px -16px;} /* Redstone */
.SL-u {background-position: 464px -112px;} /* SLime */
/* Blocks */
.air {background-position: 512px 512px;}
.AB {background-position: 512px -96px;} /* Any block */
.BR {background-position: 448px 0px;} /* Block of Redstone */
.St {background-position: 512px -80px;} /* Stone */
.Co {background-position: 512px -64px;} /* Cobblestone */
.SL {background-position: 480px -112px;} /* Slime Block */
.NB {background-position: 384px -288px;} /* Note Block */
.RL {background-position: 304px -144px;} /* Redstone Lamp */
.RL-_A {background-position: 304px -160px;} /* Redstone Lamp (Lit) */
.tg {background-position: 368px -272px;} /* Target Block */
.honey {background-position: 496px -288px;}
.slab {background-position: 496px -112px;}
.glass {background-position: 432px -64px;}
.sand {background-position: 448px -96px;}
.chest {background-position: 512px -144px;}
.SB {background-position: 432px 0px;} /* Gold Block */
.MB {background-position: 416px 0px;} /* DIamond Block */
/* Wool */
.WW {background-position: 512px -32px;}
.OW {background-position: 496px -32px;}
.MW {background-position: 480px -32px;}
.bW {background-position: 464px -32px;}
.YW {background-position: 448px -32px;}
.LW {background-position: 432px -32px;}
.rW {background-position: 416px -32px;}
.kW {background-position: 400px -32px;}
.wW {background-position: 512px -48px;}
.CW {background-position: 496px -48px;}
.PW {background-position: 480px -48px;}
.BW {background-position: 464px -48px;}
.NW {background-position: 448px -48px;}
.GW {background-position: 432px -48px;}
.RW {background-position: 416px -48px;}
.KW {background-position: 400px -48px;}
/* Lever */
.le-n, .le-Su {background-position: 352px -16px;}
.le-s, .le-Sd {background-position: 320px -16px;}
.le-e {background-position: 368px -16px;}
.le-w {background-position: 336px -16px;}
.le-Sn, .le-d {background-position: 288px -16px;}
.le-Se {background-position: 304px -16px;}
.le-Sw {background-position: 272px -16px;}
.le-n_A, .le-Su_A {background-position: 160px -16px;}
.le-s_A, .le-Sd_A {background-position: 128px -16px;}
.le-e_A {background-position: 176px -16px;}
.le-w_A {background-position: 144px -16px;}
.le-Sn_A, .le-d_A {background-position: 96px -16px;}
.le-Se_A {background-position: 112px -16px;}
.le-Sw_A {background-position: 80px -16px;}
/* Redstone Torch */
.rt {background-position: 384px 0px;}
.rt-n {background-position: 352px 0px;}
.rt-s {background-position: 320px 0px;}
.rt-e {background-position: 368px 0px;}
.rt-w {background-position: 336px 0px;}
.rt-_A {background-position: 192px 0px;}
.rt-n_A {background-position: 160px 0px;}
.rt-s_A {background-position: 128px 0px;}
.rt-e_A {background-position: 176px 0px;}
.rt-w_A {background-position: 144px 0px;}
.rt-S {background-position: 256px 0px;}
.rt-Sn {background-position: 288px 0px;}
.rt-Se {background-position: 304px 0px;}
.rt-Sw {background-position: 272px 0px;}
.rt-S_A {background-position: 64px 0px;}
.rt-Sn_A {background-position: 96px 0px;}
.rt-Se_A {background-position: 112px 0px;}
.rt-Sw_A {background-position: 80px 0px;}
/* Observer */
.obs-n {background-position: 496px -272px;}
.obs-s {background-position: 464px -272px;}
.obs-e {background-position: 512px -272px;}
.obs-w {background-position: 480px -272px;}
.obs-u {background-position: 448px -272px;}
.obs-d {background-position: 432px -272px;}
.obs-Sn {background-position: 432px -272px;}
.obs-Ss {background-position: 448px -272px;}
.obs-Se {background-position: 416px -272px;}
.obs-Sw {background-position: 400px -272px;}
.obs-Su {background-position: 496px -272px;}
.obs-Sd {background-position: 464px -272px;}
/* Redstone Comparator (rc for comparison mode, rs for subtraction mode.) */
.rc-n {background-position: 352px -112px;}
.rc-s {background-position: 288px -112px;}
.rc-e {background-position: 384px -112px;}
.rc-w {background-position: 320px -112px;}
.rc-n_A {background-position: 160px -112px;}
.rc-s_A {background-position: 96px -112px;}
.rc-e_A {background-position: 192px -112px;}
.rc-w_A {background-position: 128px -112px;}
.rs-n {background-position: 336px -112px;}
.rs-s {background-position: 272px -112px;}
.rs-e {background-position: 368px -112px;}
.rs-w {background-position: 304px -112px;}
.rs-n_A {background-position: 144px -112px;}
.rs-s_A {background-position: 80px -112px;}
.rs-e_A {background-position: 176px -112px;}
.rs-w_A {background-position: 112px -112px;}
.rc-Se {background-position: 256px -112px;}
.rc-Sw {background-position: 224px -112px;}
.rs-Se {background-position: 240px -112px;}
.rs-Sw {background-position: 208px -112px;}
.rc-Se_A {background-position: 64px -112px;}
.rc-Sw_A {background-position: 32px -112px;}
.rs-Se_A {background-position: 48px -112px;}
.rs-Sw_A {background-position: 16px -112px;}
/* Redstone Dust */
.rd {background-position: 384px -32px;}
.rd-nse {background-position: 240px -32px;}
.rd-new {background-position: 272px -32px;}
.rd-nsw {background-position: 224px -32px;}
.rd-sew {background-position: 256px -32px;}
.rd-nsew {background-position: 208px -32px;}
.rd-S {background-position: 336px -368px;}
.rd-Sew {background-position: 384px -16px;}
.rd-ns {background-position: 368px -32px;}
.rd-ne {background-position: 336px -32px;}
.rd-nw {background-position: 288px -32px;}
.rd-se {background-position: 320px -32px;}
.rd-sw {background-position: 304px -32px;}
.rd-ew {background-position: 352px -32px;}
.rd-_A {background-position: 192px -32px;}
.rd-nse_A {background-position: 48px -32px;}
.rd-new_A {background-position: 80px -32px;}
.rd-nsw_A {background-position: 32px -32px;}
.rd-sew_A {background-position: 64px -32px;}
.rd-nsew_A {background-position: 16px -32px;}
.rd-S_A {background-position: 288px -368px;}
.rd-Sew_A {background-position: 192px -16px;}
.rd-ns_A {background-position: 176px -32px;}
.rd-ne_A {background-position: 144px -32px;}
.rd-nw_A {background-position: 96px -32px;}
.rd-se_A {background-position: 128px -32px;}
.rd-sw_A {background-position: 112px -32px;}
.rd-ew_A {background-position: 160px -32px;}
/* Redstone Repeater (rr for unlocked repeaters, lr for locked repeaters.) */
.rr-e1 {background-position: 384px -48px;}
.rr-e2 {background-position: 368px -48px;}
.rr-e3 {background-position: 352px -48px;}
.rr-e4 {background-position: 336px -48px;}
.rr-e1_A {background-position: 192px -48px;}
.rr-e2_A {background-position: 176px -48px;}
.rr-e3_A {background-position: 160px -48px;}
.rr-e4_A {background-position: 144px -48px;}
.rr-n1 {background-position: 384px -64px;}
.rr-n2 {background-position: 368px -64px;}
.rr-n3 {background-position: 352px -64px;}
.rr-n4 {background-position: 336px -64px;}
.rr-n1_A {background-position: 192px -64px;}
.rr-n2_A {background-position: 176px -64px;}
.rr-n3_A {background-position: 160px -64px;}
.rr-n4_A {background-position: 144px -64px;}
.rr-w1 {background-position: 384px -80px;}
.rr-w2 {background-position: 368px -80px;}
.rr-w3 {background-position: 352px -80px;}
.rr-w4 {background-position: 336px -80px;}
.rr-w1_A {background-position: 192px -80px;}
.rr-w2_A {background-position: 176px -80px;}
.rr-w3_A {background-position: 160px -80px;}
.rr-w4_A {background-position: 144px -80px;}
.rr-s1 {background-position: 384px -96px;}
.rr-s2 {background-position: 368px -96px;}
.rr-s3 {background-position: 352px -96px;}
.rr-s4 {background-position: 336px -96px;}
.rr-s1_A {background-position: 192px -96px;}
.rr-s2_A {background-position: 176px -96px;}
.rr-s3_A {background-position: 160px -96px;}
.rr-s4_A {background-position: 144px -96px;}
.lr-e1 {background-position: 320px -48px;}
.lr-e2 {background-position: 304px -48px;}
.lr-e3 {background-position: 288px -48px;}
.lr-e4 {background-position: 272px -48px;}
.lr-e1_A {background-position: 128px -48px;}
.lr-e2_A {background-position: 112px -48px;}
.lr-e3_A {background-position: 96px -48px;}
.lr-e4_A {background-position: 80px -48px;}
.lr-n1 {background-position: 320px -64px;}
.lr-n2 {background-position: 304px -64px;}
.lr-n3 {background-position: 288px -64px;}
.lr-n4 {background-position: 272px -64px;}
.lr-n1_A {background-position: 128px -64px;}
.lr-n2_A {background-position: 112px -64px;}
.lr-n3_A {background-position: 96px -64px;}
.lr-n4_A {background-position: 80px -64px;}
.lr-w1 {background-position: 320px -80px;}
.lr-w2 {background-position: 304px -80px;}
.lr-w3 {background-position: 288px -80px;}
.lr-w4 {background-position: 272px -80px;}
.lr-w1_A {background-position: 128px -80px;}
.lr-w2_A {background-position: 112px -80px;}
.lr-w3_A {background-position: 96px -80px;}
.lr-w4_A {background-position: 80px -80px;}
.lr-s1 {background-position: 320px -96px;}
.lr-s2 {background-position: 304px -96px;}
.lr-s3 {background-position: 288px -96px;}
.lr-s4 {background-position: 272px -96px;}
.lr-s1_A {background-position: 128px -96px;}
.lr-s2_A {background-position: 112px -96px;}
.lr-s3_A {background-position: 96px -96px;}
.lr-s4_A {background-position: 80px -96px;}
.rr-Se1 {background-position: 256px -48px;}
.rr-Se2 {background-position: 240px -48px;}
.rr-Se3 {background-position: 224px -48px;}
.rr-Se4 {background-position: 208px -48px;}
.rr-Se1_A {background-position: 64px -48px;}
.rr-Se2_A {background-position: 48px -48px;}
.rr-Se3_A {background-position: 32px -48px;}
.rr-Se4_A {background-position: 16px -48px;}
.rr-Sw1 {background-position: 256px -80px;}
.rr-Sw2 {background-position: 240px -80px;}
.rr-Sw3 {background-position: 224px -80px;}
.rr-Sw4 {background-position: 208px -80px;}
.rr-Sw1_A {background-position: 64px -80px;}
.rr-Sw2_A {background-position: 48px -80px;}
.rr-Sw3_A {background-position: 32px -80px;}
.rr-Sw4_A {background-position: 16px -80px;}
.lr-Se1 {background-position: 256px -64px;}
.lr-Se2 {background-position: 240px -64px;}
.lr-Se3 {background-position: 224px -64px;}
.lr-Se4 {background-position: 208px -64px;}
.lr-Se1_A {background-position: 64px -64px;}
.lr-Se2_A {background-position: 48px -64px;}
.lr-Se3_A {background-position: 32px -64px;}
.lr-Se4_A {background-position: 16px -64px;}
.lr-Sw1 {background-position: 256px -96px;}
.lr-Sw2 {background-position: 240px -96px;}
.lr-Sw3 {background-position: 224px -96px;}
.lr-Sw4 {background-position: 208px -96px;}
.lr-Sw1_A {background-position: 64px -96px;}
.lr-Sw2_A {background-position: 48px -96px;}
.lr-Sw3_A {background-position: 32px -96px;}
.lr-Sw4_A {background-position: 16px -96px;}
/* Hopper */
.ho-n {background-position: 368px -144px;}
.ho-s {background-position: 336px -144px;}
.ho-e {background-position: 384px -144px;}
.ho-w {background-position: 352px -144px;}
.ho-d {background-position: 320px -144px;}
.ho-Sn {background-position: 368px -160px;}
.ho-Ss {background-position: 336px -160px;}
.ho-Se {background-position: 384px -160px;}
.ho-Sw {background-position: 352px -160px;}
.ho-Sd {background-position: 320px -160px;}
/* Piston */
.pi-n, .pi-Su {background-position: 368px -176px;}
.pi-s, .pi-Sd {background-position: 336px -176px;}
.pi-e, .pi-Se {background-position: 384px -176px;}
.pi-w, .pi-Sw {background-position: 352px -176px;}
.pi-u, .pi-Ss {background-position: 320px -176px;}
.pi-d, .pi-Sn {background-position: 304px -176px;}
.pi-n_A, .pi-Su_A {background-position: 352px -208px;}
.pi-s_A, .pi-Sd_A {background-position: 336px -192px;}
.pi-e_A, .pi-Se_A {background-position: 384px -192px;}
.pi-w_A, .pi-Sw_A {background-position: 368px -208px;}
.pi-u_A, .pi-Ss_A {background-position: 320px -208px;}
.pi-d_A, .pi-Sn_A {background-position: 304px -192px;}
.pe-n, .pe-Su {background-position: 352px -192px;}
.pe-s, .pe-Sd {background-position: 336px -208px;}
.pe-e, .pe-Se {background-position: 368px -192px;}
.pe-w, .pe-Sw {background-position: 384px -208px;}
.pe-u, .pe-Ss {background-position: 320px -192px;}
.pe-d, .pe-Sn {background-position: 304px -208px;}
/* Sticky Piston */
.sp-n, .sp-Su {background-position: 368px -224px;}
.sp-s, .sp-Sd {background-position: 336px -224px;}
.sp-e, .sp-Se {background-position: 384px -224px;}
.sp-w, .sp-Sw {background-position: 352px -224px;}
.sp-u, .sp-Ss {background-position: 320px -224px;}
.sp-d, .sp-Sn {background-position: 304px -224px;}
.sp-n_A, .sp-Su_A {background-position: 352px -256px;}
.sp-s_A, .sp-Sd_A {background-position: 336px -240px;}
.sp-e_A, .sp-Se_A {background-position: 384px -240px;}
.sp-w_A, .sp-Sw_A {background-position: 368px -256px;}
.sp-u_A, .sp-Ss_A {background-position: 320px -256px;}
.sp-d_A, .sp-Sn_A {background-position: 304px -240px;}
.se-n, .se-Su {background-position: 352px -240px;}
.se-s, .se-Sd {background-position: 336px -256px;}
.se-e, .se-Se {background-position: 368px -240px;}
.se-w, .se-Sw {background-position: 384px -256px;}
.se-u, .se-Ss {background-position: 320px -240px;}
.se-d, .se-Sn {background-position: 304px -256px;}
/* Rail */
.ra-ns {background-position: 176px -176px;}
.ra-ew {background-position: 192px -176px;}
.ra-nu {background-position: 144px -176px;}
.ra-su {background-position: 112px -176px;}
.ra-eu {background-position: 160px -176px;}
.ra-wu {background-position: 128px -176px;}
.ra-Sns {background-position: 96px -288px;}
.ra-Sew {background-position: 80px -176px;}
.ra-Seu {background-position: 64px -176px;}
.ra-Swu {background-position: 96px -176px;}
.ra-se {background-position: 224px -176px;}
.ra-sw {background-position: 208px -176px;}
.ra-ne {background-position: 224px -192px;}
.ra-nw {background-position: 208px -192px;}
.ra-Sse {background-position: 128px -288px;}
.ra-Ssw {background-position: 112px -288px;}
.ra-Sne {background-position: 128px -304px;}
.ra-Snw {background-position: 112px -304px;}
/* Activator Rail */
.ar-ns {background-position: 176px -240px;}
.ar-ew {background-position: 192px -240px;}
.ar-nu {background-position: 144px -240px;}
.ar-su {background-position: 112px -240px;}
.ar-eu {background-position: 160px -240px;}
.ar-wu {background-position: 128px -240px;}
.ar-Sns {background-position: 96px -352px;}
.ar-Sew {background-position: 80px -240px;}
.ar-Seu {background-position: 64px -240px;}
.ar-Swu {background-position: 96px -240px;}
.ar-ns_A {background-position: 176px -256px;}
.ar-ew_A {background-position: 192px -256px;}
.ar-nu_A {background-position: 144px -256px;}
.ar-su_A {background-position: 112px -256px;}
.ar-eu_A {background-position: 160px -256px;}
.ar-wu_A {background-position: 128px -256px;}
.ar-Sns_A {background-position: 96px -368px;}
.ar-Sew_A {background-position: 80px -256px;}
.ar-Seu_A {background-position: 64px -256px;}
.ar-Swu_A {background-position: 96px -256px;}
/* Detector Rail */
.dr-ns {background-position: 176px -192px;}
.dr-ew {background-position: 192px -192px;}
.dr-nu {background-position: 144px -192px;}
.dr-su {background-position: 112px -192px;}
.dr-eu {background-position: 160px -192px;}
.dr-wu {background-position: 128px -192px;}
.dr-Sns {background-position: 96px -304px;}
.dr-Sew {background-position: 80px -192px;}
.dr-Seu {background-position: 64px -192px;}
.dr-Swu {background-position: 96px -192px;}
/* Powered Rail */
.pr-ns {background-position: 176px -208px;}
.pr-ew {background-position: 192px -208px;}
.pr-nu {background-position: 144px -208px;}
.pr-su {background-position: 112px -208px;}
.pr-eu {background-position: 160px -208px;}
.pr-wu {background-position: 128px -208px;}
.pr-Sns {background-position: 96px -320px;}
.pr-Sew {background-position: 80px -208px;}
.pr-Seu {background-position: 64px -208px;}
.pr-Swu {background-position: 96px -208px;}
.pr-ns_A {background-position: 176px -224px;}
.pr-ew_A {background-position: 192px -224px;}
.pr-nu_A {background-position: 144px -224px;}
.pr-su_A {background-position: 112px -224px;}
.pr-eu_A {background-position: 160px -224px;}
.pr-wu_A {background-position: 128px -224px;}
.pr-Sns_A {background-position: 96px -336px;}
.pr-Sew_A {background-position: 80px -224px;}
.pr-Seu_A {background-position: 64px -224px;}
.pr-Swu_A {background-position: 96px -224px;}
/* Minecart */
.mc-ew {background-position: 48px -192px;}
.mc-ns {background-position: 32px -192px;}
.mc-Sew {background-position: 16px -192px;}
/* Boat */
.boat-ew {background-position: 48px -176px;}
.boat-ns {background-position: 32px -176px;}
.boat-Sew {background-position: 16px -176px;}
/* Arrows */
.aw-n {background-position: 224px -432px;}
.aw-nne {background-position: 208px -416px;}
.aw-ne {background-position: 192px -416px;}
.aw-ene {background-position: 192px -432px;}
.aw-e {background-position: 208px -432px;}
.aw-ese {background-position: 192px -448px;}
.aw-se {background-position: 192px -464px;}
.aw-sse {background-position: 208px -464px;}
.aw-s {background-position: 208px -448px;}
.aw-ssw {background-position: 224px -464px;}
.aw-sw {background-position: 240px -464px;}
.aw-wsw {background-position: 240px -448px;}
.aw-w {background-position: 224px -448px;}
.aw-wnw {background-position: 240px -432px;}
.aw-nw {background-position: 240px -416px;}
.aw-nnw {background-position: 224px -416px;}
</style>