提供: Minecraft Modding Wiki
2014年9月7日 (日) 20:59時点におけるModderKina (トーク | 投稿記録)による版 (BehaviorSampleDispenseCore.java: 左に寄せた)
移動先: 案内検索

この記事は"Minecraft Forge Universal 10.12.0.xxx~"を前提MODとしています。

Wood pickaxe.png
初心者向けのチュートリアルです。
Dispenser front horizontal.png
Dispenserに関係のあるチュートリアルです。


ディスペンサー射出時の動作の指定

ディスペンサー射出時の動作の指定方法

ソースコード

  • BehaviorSampleDispenseCore.java
package mods.dispensesample;

import net.minecraft.block.BlockDispenser;
import net.minecraft.dispenser.IBehaviorDispenseItem;
import net.minecraft.dispenser.IBlockSource;
import net.minecraft.dispenser.IPosition;
import net.minecraft.init.Items;
//import net.minecraft.item.Item;
import net.minecraft.entity.effect.EntityLightningBolt;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;

@Mod(modid="DispenseSampleMod", name="DispenseSampleMod", version="1.0")
public class BehaviorSampleDispenseCore
{
	@EventHandler
	public void init(FMLInitializationEvent event)
	{
		BlockDispenser.dispenseBehaviorRegistry.putObject(Items.stick,new  IBehaviorDispenseItem(){
                       @Override
                       public ItemStack dispense(IBlockSource var1, ItemStack var2){
                              World world = var1.getWorld();//World
                              /*Item item = var2.getItem();*/ //Item
                              IPosition iposition = BlockDispenser.func_149939_a(var1);//IPosition
                              double x = iposition.getX();//
                              double y = iposition.getY();//ディスペンサー射出口のところにある座標を取得
                              double z = iposition.getZ();//
                              world.spawnEntityInWorld(new EntityLightningBolt(world,x,y,z));//雷を出す
                              return var2.splitStack(var2.stackSize-1);//アイテムをひとつ減らす
                      }
                });
	}
}

解説

BehaviorSampleDispenseCore.java

BlockDispenser.dispenseBehaviorRegistry.putObject(Items.stick,new  IBehaviorDispenseItem(){
       @Override
       public ItemStack dispense(IBlockSource var1, ItemStack var2){
              World world = var1.getWorld();//World
              /*Item item = var2.getItem();*/ //Item
              IPosition iposition = BlockDispenser.func_149939_a(var1);//IPosition
              double x = iposition.getX();//
              double y = iposition.getY();//ディスペンサー射出口前の座標を取得
              double z = iposition.getZ();//
              world.spawnEntityInWorld(new EntityLightningBolt(world,x,y,z));//雷を出す
              return var2.splitStack(var2.stackSize-1);//アイテムをひとつ減らす
       }
});

BlockDispenser.dispenseBehaviorRegistry.putObjectの引数は(Item,IBehaviorDispenseItem)となっている。(見た目にはどちらもObjectとされている)
そのためブロックに適用したい場合はItem.getItemFromBlock(Blocks.xxx)などとすると良い。
WorldはIBlockSourceより取得できる。
最後のreturn文については、

スタックを減らしたくない場合は単純に

return var2;

とすれば良い。

耐久値を減らす場合は

var2.setItemDamage(var2.getItemDamage() + 1);
return var2;

とするとできる。

参考になるバニラのソースとしては、net.minecraft.init.Bootstrap.javaがある。