提供: Minecraft Modding Wiki
この編集を取り消せます。
下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
− | + | {{Stb}} | |
{{前提MOD|reqmod="Minecraft Forge Universal 10.13.0.x~"及び"ComputerCraft 1.65~"}} | {{前提MOD|reqmod="Minecraft Forge Universal 10.13.0.x~"及び"ComputerCraft 1.65~"}} | ||
− | == | + | == 周辺機器からイベントを発生させる == |
− | + | 右クリックされたとき、接続されたComputerやTurtleに対してイベントを発生させる周辺機器ブロックを追加する。 | |
− | |||
− | |||
− | |||
=== ソースコード === | === ソースコード === | ||
− | 「[[ComputerCraft_API | + | 「[[ComputerCraft_API/周辺機器の追加|周辺機器の追加]]」のソースコードを元にして、変更部分のみを解説する。 |
*BlockSamplePeripheral.java | *BlockSamplePeripheral.java | ||
<source lang = "java"> | <source lang = "java"> | ||
package mods.sample.peripheral; | package mods.sample.peripheral; | ||
+ | |||
+ | import java.util.Random; | ||
import net.minecraft.block.BlockContainer; | import net.minecraft.block.BlockContainer; | ||
35行目: | 34行目: | ||
} | } | ||
return true; | return true; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public int quantityDropped(int meta, int fortune, Random random){ | ||
+ | return quantityDroppedWithBonus(fortune, random); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public int quantityDropped(Random random){ | ||
+ | return 1; | ||
} | } | ||
49行目: | 58行目: | ||
package mods.sample.peripheral; | package mods.sample.peripheral; | ||
− | |||
import java.util.HashSet; | import java.util.HashSet; | ||
− | |||
import java.util.Set; | import java.util.Set; | ||
87行目: | 94行目: | ||
@Override | @Override | ||
public void attach(IComputerAccess computer) { | public void attach(IComputerAccess computer) { | ||
− | synchronized (this) { | + | synchronized (this.m_computers) { |
− | m_computers.add(computer); | + | this.m_computers.add(computer); |
} | } | ||
} | } | ||
94行目: | 101行目: | ||
@Override | @Override | ||
public void detach(IComputerAccess computer) { | public void detach(IComputerAccess computer) { | ||
− | synchronized (this) { | + | synchronized (this.m_computers) { |
− | m_computers.remove(computer); | + | this.m_computers.remove(computer); |
} | } | ||
} | } | ||
108行目: | 115行目: | ||
public void click() { | public void click() { | ||
− | + | synchronized (this.m_computers) { | |
− | + | for (IComputerAccess computer : this.m_computers) { | |
− | + | computer.queueEvent("sample_click", new Object[] {computer.getAttachmentName()} ); | |
− | |||
− | |||
− | |||
− | for (IComputerAccess computer : m_computers) { | ||
− | computer.queueEvent("sample_click", | ||
− | |||
} | } | ||
} | } | ||
126行目: | 127行目: | ||
=== 解説 === | === 解説 === | ||
==== BlockSamplePeripheral.java ==== | ==== BlockSamplePeripheral.java ==== | ||
− | + | 周辺機器ブロックが右クリックされた時の処理を追加する。 | |
<source lang = "java"> | <source lang = "java"> | ||
@Override | @Override | ||
138行目: | 139行目: | ||
} | } | ||
</source> | </source> | ||
− | + | ブロックが右クリックされたらTileEntity(周辺機器)を取得してclick()を呼び出す。 | |
==== TileSamplePeripheral.java ==== | ==== TileSamplePeripheral.java ==== | ||
− | + | イベント発生の処理と、イベントを発生させるための接続されたComputerやTurtleのリストの管理を追加する。 | |
− | |||
− | |||
<source lang = "java"> | <source lang = "java"> | ||
private final Set<IComputerAccess> m_computers; | private final Set<IComputerAccess> m_computers; | ||
151行目: | 150行目: | ||
} | } | ||
</source> | </source> | ||
− | + | ↑コンストラクタで接続されたComputerやTurtleへイベントを発生させるのに必要なIComputerAccessインスタンスのリストを初期化する。 | |
− | |||
− | |||
− | |||
<source lang = "java"> | <source lang = "java"> | ||
@Override | @Override | ||
public void attach(IComputerAccess computer) { | public void attach(IComputerAccess computer) { | ||
− | synchronized(this) { | + | synchronized(this.m_computers) { |
− | m_computers.add(computer); | + | this.m_computers.add(computer); |
} | } | ||
} | } | ||
165行目: | 161行目: | ||
@Override | @Override | ||
public void detach(IComputerAccess computer) { | public void detach(IComputerAccess computer) { | ||
− | synchronized(this) { | + | synchronized(this.m_computers) { |
− | m_computers.remove(computer); | + | this.m_computers.remove(computer); |
} | } | ||
} | } | ||
</source> | </source> | ||
− | + | ↑attach()で接続されたComputerやTurtleのIComputerAccessインスタンスをリストへ追加、detach()で取り外されたComputerやTurtleのComputerAccessインスタンスをリストから削除。<br> | |
− | + | attach()とdetach()はComputerCraftのLuaスレッドから呼び出されている。このリストはMinecraftスレッドから呼び出されるclick()からもアクセスされるのでsynchronizedで排他制御している。 | |
− | |||
− | |||
− | |||
− | |||
<source lang = "java"> | <source lang = "java"> | ||
public void click() { | public void click() { | ||
− | + | synchronized (this.m_computers) { | |
− | + | for (IComputerAccess computer : this.m_computers) { | |
− | + | computer.queueEvent("sample_click", new Object[] {computer.getAttachmentName()} ); | |
− | |||
− | |||
− | |||
− | for (IComputerAccess computer : m_computers) { | ||
− | computer.queueEvent("sample_click", | ||
− | |||
} | } | ||
} | } | ||
} | } | ||
</source> | </source> | ||
− | + | ↑周辺機器ブロックが右クリックされた時に、BlockSamplePeripheralから呼び出される。IComputerAccessインスタンスのリストにある全てのComputerやTurtleへIComputerAccess.queueEvent()で"sample_click"イベントを発生させる。前述の通り、リストへのアクセスは排他的に行っている。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | *イベント | |
+ | イベント名は、発生したイベントの内容が分かりやすいように"'''周辺機器の種類_イベントの内容'''"のような形にする事が'''推奨'''されている。(APIのjavadoc参照)<br> | ||
+ | queueEvent()の引数はos.queueEvent関数と同様。ただし、イベントのパラメータはオブジェクト型配列として渡す。値の型はcallMethod()の戻り値と同様に適切なLuaの型へと変換される。イベントのパラメータの一番目には、ComputerやTurtleからどの周辺機器で発生したイベントなのかが分かるように、IComputerAccess.getAttachmentName()を渡すとよい。 |