提供: Minecraft Modding Wiki
移動先: 案内検索
(サンプルmodのソースを全面差し替え)
(ソースを変更。解説を追加)
3行目: 3行目:
  
 
== 周辺機器の追加 ==
 
== 周辺機器の追加 ==
ComputerやTurtleから呼出し可能なメソッドを提供する簡単な周辺機器ブロックを追加する。
+
何もしない周辺機器ブロックを追加する。
 +
 
 +
このサンプルではレシピを登録していないのでクリエイティブ・インベントリから取り出す。
  
 
=== ソースコード ===
 
=== ソースコード ===
 
*SamplePeripheralCore.java
 
*SamplePeripheralCore.java
 
<source lang = "java">
 
<source lang = "java">
package mods.blocksample;
+
package mods.sample.peripheral;
  
 
import net.minecraft.block.Block;
 
import net.minecraft.block.Block;
14行目: 16行目:
 
import cpw.mods.fml.common.Mod.EventHandler;
 
import cpw.mods.fml.common.Mod.EventHandler;
 
import cpw.mods.fml.common.event.FMLInitializationEvent;
 
import cpw.mods.fml.common.event.FMLInitializationEvent;
 +
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
 
import cpw.mods.fml.common.registry.GameRegistry;
 
import cpw.mods.fml.common.registry.GameRegistry;
 
import dan200.computercraft.api.ComputerCraftAPI;
 
import dan200.computercraft.api.ComputerCraftAPI;
  
  
@Mod(modid="SamplePeripheralMod", name="SamplePeripheralMod", version="1.0")
+
@Mod(modid="SamplePeripheralMod", name="SamplePeripheralMod", version="1.0",
public class SamplePeripheralCore
+
dependencies = "required-after:ComputerCraft")
{
+
public class SamplePeripheralCore {
  
 
public static Block blockSamplePeripheral;
 
public static Block blockSamplePeripheral;
  
 
@EventHandler
 
@EventHandler
public void init(FMLInitializationEvent event)
+
public void preInit(FMLPreInitializationEvent event) {
{
 
 
blockSamplePeripheral = new BlockSamplePeripheral();
 
blockSamplePeripheral = new BlockSamplePeripheral();
 
GameRegistry.registerBlock(blockSamplePeripheral, "blockSamplePeripheral");
 
GameRegistry.registerBlock(blockSamplePeripheral, "blockSamplePeripheral");
 +
}
 +
 +
@EventHandler
 +
public void init(FMLInitializationEvent event) {
 
GameRegistry.registerTileEntity(TileSamplePeripheral.class, "tileSamplePeripheral");
 
GameRegistry.registerTileEntity(TileSamplePeripheral.class, "tileSamplePeripheral");
 
ComputerCraftAPI.registerPeripheralProvider(new PeripheralProvider());
 
ComputerCraftAPI.registerPeripheralProvider(new PeripheralProvider());
38行目: 44行目:
 
*BlockSamplePeripheral.java
 
*BlockSamplePeripheral.java
 
<source lang = "java">
 
<source lang = "java">
package mods.blocksample;
+
package mods.sample.peripheral;
  
 
import net.minecraft.block.BlockContainer;
 
import net.minecraft.block.BlockContainer;
 
import net.minecraft.block.material.Material;
 
import net.minecraft.block.material.Material;
 
import net.minecraft.creativetab.CreativeTabs;
 
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
 
import net.minecraft.item.ItemStack;
 
 
import net.minecraft.tileentity.TileEntity;
 
import net.minecraft.tileentity.TileEntity;
 
import net.minecraft.world.World;
 
import net.minecraft.world.World;
50行目: 54行目:
 
public class BlockSamplePeripheral extends BlockContainer {
 
public class BlockSamplePeripheral extends BlockContainer {
  
protected BlockSamplePeripheral() {
+
public BlockSamplePeripheral() {
 
super(Material.rock);
 
super(Material.rock);
 
setBlockName("blockSamplePeripheral");
 
setBlockName("blockSamplePeripheral");
66行目: 70行目:
 
*TileSamplePeripheral.java
 
*TileSamplePeripheral.java
 
<source lang = "java">
 
<source lang = "java">
package mods.blocksample;
+
package mods.sample.peripheral;
 
 
import java.util.HashSet;
 
import java.util.Set;
 
  
 
import net.minecraft.tileentity.TileEntity;
 
import net.minecraft.tileentity.TileEntity;
import dan200.computercraft.api.peripheral.IComputerAccess;
 
 
public class TileSamplePeripheral extends TileEntity
 
{
 
 
 
 
}
 
</source>
 
 
*SamplePeripheral.java
 
<source lang = "java">
 
package mods.blocksample;
 
 
 
import dan200.computercraft.api.lua.ILuaContext;
 
import dan200.computercraft.api.lua.ILuaContext;
 
import dan200.computercraft.api.lua.LuaException;
 
import dan200.computercraft.api.lua.LuaException;
91行目: 78行目:
 
import dan200.computercraft.api.peripheral.IPeripheral;
 
import dan200.computercraft.api.peripheral.IPeripheral;
  
public class SamplePeripheral implements IPeripheral {
+
public class TileSamplePeripheral extends TileEntity implements IPeripheral {
 
 
private final TileSamplePeripheral m_tilePeripheral;
 
 
 
public SamplePeripheral(TileSamplePeripheral tile) {
 
this.m_tilePeripheral = tile;
 
}
 
  
 
@Override
 
@Override
public String getType()
+
public String getType() {
{
 
 
return "sample";
 
return "sample";
 
}
 
}
  
 
@Override
 
@Override
public String[] getMethodNames()
+
public String[] getMethodNames() {
{
+
return new String[] {};
return new String[] { "fn1", "fn2" };
 
 
}
 
}
  
114行目: 93行目:
 
public Object[] callMethod(IComputerAccess computer, ILuaContext context,
 
public Object[] callMethod(IComputerAccess computer, ILuaContext context,
 
int method, Object[] arguments) throws LuaException,
 
int method, Object[] arguments) throws LuaException,
InterruptedException
+
InterruptedException {
{
 
switch (method) {
 
case 0:
 
return new Object[] {"fn1"};
 
 
 
case 1:
 
if ( arguments.length < 1 ) {
 
throw new LuaException("Expected argument");
 
}
 
if ( arguments[0] == null ) {
 
throw new LuaException("Illegal argument");
 
}
 
return new Object[] {"fn2", arguments[0], arguments[0].getClass().getName()};
 
}
 
 
 
 
return null;
 
return null;
 
}
 
}
  
 
@Override
 
@Override
public void attach(IComputerAccess computer)
+
public void attach(IComputerAccess computer) {
{
 
  
 
}
 
}
  
 
@Override
 
@Override
public void detach(IComputerAccess computer)
+
public void detach(IComputerAccess computer) {
{
 
  
 
}
 
}
  
 
@Override
 
@Override
public boolean equals(IPeripheral other)
+
public boolean equals(IPeripheral other) {
{
+
if ((other != null) && (other instanceof TileSamplePeripheral)) {
if ((other != null) && ( other instanceof SamplePeripheral)) {
+
return other == this;
return ((SamplePeripheral)other).m_tilePeripheral == this.m_tilePeripheral;
 
 
}
 
}
 
return false;
 
return false;
159行目: 120行目:
 
*PeripheralProvider.java
 
*PeripheralProvider.java
 
<source lang = "java">
 
<source lang = "java">
package mods.blocksample;
+
package mods.sample.peripheral;
  
 
import net.minecraft.tileentity.TileEntity;
 
import net.minecraft.tileentity.TileEntity;
166行目: 127行目:
 
import dan200.computercraft.api.peripheral.IPeripheralProvider;
 
import dan200.computercraft.api.peripheral.IPeripheralProvider;
  
public class PeripheralProvider implements IPeripheralProvider
+
public class PeripheralProvider implements IPeripheralProvider {
{
 
  
 
@Override
 
@Override
public IPeripheral getPeripheral(World world, int x, int y, int z, int side)
+
public IPeripheral getPeripheral(World world, int x, int y, int z, int side) {
{
 
 
TileEntity tile = world.getTileEntity(x, y, z);
 
TileEntity tile = world.getTileEntity(x, y, z);
 
 
if (tile != null && tile instanceof TileSamplePeripheral) {
 
if (tile != null && tile instanceof TileSamplePeripheral) {
return new SamplePeripheral((TileSamplePeripheral)tile);
+
return (TileSamplePeripheral)tile;
 
}
 
}
 
 
return null;
 
return null;
 
}
 
}
185行目: 142行目:
  
 
=== 解説 ===
 
=== 解説 ===
書きかけ
 
 
==== SamplePeripheralCore.java ====
 
==== SamplePeripheralCore.java ====
 +
Modのコアとなるクラス。
 +
<source lang = "java">
 +
dependencies = "required-after:ComputerCraft"
 +
</source>
 +
↑このmodがComputerCraftの後に読み込まれるようにしている。
 +
<source lang = "java">
 +
ComputerCraftAPI.registerPeripheralProvider(new PeripheralProvider());
 +
</source>
 +
↑接続したComputerから周辺機器実装クラスを要求されたときに提供するIPeripheralProviderの実装クラスをComputerCraftに登録する。<br>
 +
自作周辺機器をComputerから使えるようにするために必須。
 +
 
==== BlockSamplePeripheral.java ====
 
==== BlockSamplePeripheral.java ====
 +
周辺機器のブロック。
 
==== TileSamplePeripheral.java ====
 
==== TileSamplePeripheral.java ====
==== SamplePeripheral.java ====
+
周辺機器のTileEntity。
 +
<source lang = "java">
 +
public class TileSamplePeripheral extends TileEntity implements IPeripheral {
 +
</source>
 +
↑今回は周辺機器のTileEntityクラスでIPeripheralも実装する。<br>
 +
周辺機器は後述のPeripheralProviderでComputerCraftに登録されるため、別のクラスでIPeripheralを実装する事も出来る。
 +
<source lang = "java">
 +
@Override
 +
public String getType() {
 +
return "sample";
 +
}
 +
</source>
 +
↑Computer側からのperipheral.getType()に対する文字列を返す。他の種類の周辺機器とは被らないようにする。
 +
<source lang = "java">
 +
@Override
 +
public String[] getMethodNames() {
 +
return new String[] {};
 +
}
 +
</source>
 +
↑Computer側からのperipheral.getMethods()に対するメソッド名(文字列)の配列を返す。今回は実装しないので空の配列。
 +
<source lang = "java">
 +
@Override
 +
public Object[] callMethod(IComputerAccess computer, ILuaContext context,
 +
int method, Object[] arguments) throws LuaException,
 +
InterruptedException {
 +
return null;
 +
}
 +
</source>
 +
↑Computer側からのperipheral.call()に対する処理とその結果を返す。今回は実装しないのでnull。
 +
<source lang = "java">
 +
@Override
 +
public void attach(IComputerAccess computer) {
 +
 
 +
}
 +
 
 +
@Override
 +
public void detach(IComputerAccess computer) {
 +
 
 +
}
 +
</source>
 +
↑周辺機器がComputerに取り付けられた時(attach)と取り外された時(detach)に、Computerから呼び出される。今回は何もしない。
 +
<source lang = "java">
 +
@Override
 +
public boolean equals(IPeripheral other) {
 +
if ((other != null) && (other instanceof TileSamplePeripheral)) {
 +
return other == this;
 +
}
 +
return false;
 +
}
 +
</source>
 +
↑Computerに周辺機器が着脱された時に現在取り付けられている周辺機器(this)が、それまで取り付けられていた周辺機器(other)と同一かどうかを調べるために呼び出される。今回は周辺機器のTileEntityが同一かどうかを比較して返している。
 +
 
 
==== PeripheralProvider.java ====
 
==== PeripheralProvider.java ====
 +
Computerへ周辺機器(IPeripheral実装クラス)を提供するためのクラス。<br>
 +
前述の通り、ComputerCraftAPI.registerPeripheralProvider()でComputerCraftへ登録する。
 +
<source lang = "java">
 +
@Override
 +
public IPeripheral getPeripheral(World world, int x, int y, int z, int side) {
 +
TileEntity tile = world.getTileEntity(x, y, z);
 +
if (tile != null && tile instanceof TileSamplePeripheral) {
 +
return (TileSamplePeripheral)tile;
 +
}
 +
return null;
 +
}
 +
</source>
 +
↑周辺機器がComputerへ接続された時に呼び出される。x, y, zは周辺機器の座標。sideは周辺機器から見たComputerの方向。<br>
 +
今回はTileEntityでIPeripheralを実装したため、座標のTileEntityを取得して自分自身の周辺機器と同一だったらそれを周辺機器のインスタンスとして返している。

2014年10月22日 (水) 01:32時点における版

この記事は執筆中です。加筆してくださる人を募集しています。

この記事は"Minecraft Forge Universal 10.13.0.x~"及び"ComputerCraft 1.65~"を前提MODとしています。

周辺機器の追加

何もしない周辺機器ブロックを追加する。

このサンプルではレシピを登録していないのでクリエイティブ・インベントリから取り出す。

ソースコード

  • SamplePeripheralCore.java
package mods.sample.peripheral;

import net.minecraft.block.Block;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import dan200.computercraft.api.ComputerCraftAPI;


@Mod(modid="SamplePeripheralMod", name="SamplePeripheralMod", version="1.0",
	dependencies = "required-after:ComputerCraft")
public class SamplePeripheralCore {

	public static Block blockSamplePeripheral;

	@EventHandler
	public void preInit(FMLPreInitializationEvent event) {
		blockSamplePeripheral = new BlockSamplePeripheral();
		GameRegistry.registerBlock(blockSamplePeripheral, "blockSamplePeripheral");
	}

	@EventHandler
	public void init(FMLInitializationEvent event) {
		GameRegistry.registerTileEntity(TileSamplePeripheral.class, "tileSamplePeripheral");
		ComputerCraftAPI.registerPeripheralProvider(new PeripheralProvider());
	}

}
  • BlockSamplePeripheral.java
package mods.sample.peripheral;

import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;

public class BlockSamplePeripheral extends BlockContainer {

	public BlockSamplePeripheral() {
		super(Material.rock);
		setBlockName("blockSamplePeripheral");
		setCreativeTab(CreativeTabs.tabBlock);
	}

	@Override
	public TileEntity createNewTileEntity(World world, int a) {
		return new TileSamplePeripheral();
	}

}
  • TileSamplePeripheral.java
package mods.sample.peripheral;

import net.minecraft.tileentity.TileEntity;
import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;

public class TileSamplePeripheral extends TileEntity implements IPeripheral {

	@Override
	public String getType() {
		return "sample";
	}

	@Override
	public String[] getMethodNames() {
		return new String[] {};
	}

	@Override
	public Object[] callMethod(IComputerAccess computer, ILuaContext context,
			int method, Object[] arguments) throws LuaException,
			InterruptedException {
		return null;
	}

	@Override
	public void attach(IComputerAccess computer) {

	}

	@Override
	public void detach(IComputerAccess computer) {

	}

	@Override
	public boolean equals(IPeripheral other) {
		if ((other != null) && (other instanceof TileSamplePeripheral)) {
			return other == this;
		}
		return false;
	}

}
  • PeripheralProvider.java
package mods.sample.peripheral;

import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;

public class PeripheralProvider implements IPeripheralProvider {

	@Override
	public IPeripheral getPeripheral(World world, int x, int y, int z, int side) {
		TileEntity tile = world.getTileEntity(x, y, z);
		if (tile != null && tile instanceof TileSamplePeripheral) {
			return (TileSamplePeripheral)tile;
		}
		return null;
	}

}

解説

SamplePeripheralCore.java

Modのコアとなるクラス。

dependencies = "required-after:ComputerCraft"

↑このmodがComputerCraftの後に読み込まれるようにしている。

ComputerCraftAPI.registerPeripheralProvider(new PeripheralProvider());

↑接続したComputerから周辺機器実装クラスを要求されたときに提供するIPeripheralProviderの実装クラスをComputerCraftに登録する。
自作周辺機器をComputerから使えるようにするために必須。

BlockSamplePeripheral.java

周辺機器のブロック。

TileSamplePeripheral.java

周辺機器のTileEntity。

public class TileSamplePeripheral extends TileEntity implements IPeripheral {

↑今回は周辺機器のTileEntityクラスでIPeripheralも実装する。
周辺機器は後述のPeripheralProviderでComputerCraftに登録されるため、別のクラスでIPeripheralを実装する事も出来る。

@Override
public String getType() {
	return "sample";
}

↑Computer側からのperipheral.getType()に対する文字列を返す。他の種類の周辺機器とは被らないようにする。

@Override
public String[] getMethodNames() {
	return new String[] {};
}

↑Computer側からのperipheral.getMethods()に対するメソッド名(文字列)の配列を返す。今回は実装しないので空の配列。

@Override
public Object[] callMethod(IComputerAccess computer, ILuaContext context,
		int method, Object[] arguments) throws LuaException,
		InterruptedException {
	return null;
}

↑Computer側からのperipheral.call()に対する処理とその結果を返す。今回は実装しないのでnull。

@Override
public void attach(IComputerAccess computer) {

}

@Override
public void detach(IComputerAccess computer) {

}

↑周辺機器がComputerに取り付けられた時(attach)と取り外された時(detach)に、Computerから呼び出される。今回は何もしない。

@Override
public boolean equals(IPeripheral other) {
	if ((other != null) && (other instanceof TileSamplePeripheral)) {
		return other == this;
	}
	return false;
}

↑Computerに周辺機器が着脱された時に現在取り付けられている周辺機器(this)が、それまで取り付けられていた周辺機器(other)と同一かどうかを調べるために呼び出される。今回は周辺機器のTileEntityが同一かどうかを比較して返している。

PeripheralProvider.java

Computerへ周辺機器(IPeripheral実装クラス)を提供するためのクラス。
前述の通り、ComputerCraftAPI.registerPeripheralProvider()でComputerCraftへ登録する。

@Override
public IPeripheral getPeripheral(World world, int x, int y, int z, int side) {
	TileEntity tile = world.getTileEntity(x, y, z);
	if (tile != null && tile instanceof TileSamplePeripheral) {
		return (TileSamplePeripheral)tile;
	}
	return null;
}

↑周辺機器がComputerへ接続された時に呼び出される。x, y, zは周辺機器の座標。sideは周辺機器から見たComputerの方向。
今回はTileEntityでIPeripheralを実装したため、座標のTileEntityを取得して自分自身の周辺機器と同一だったらそれを周辺機器のインスタンスとして返している。