どなたかご教授を

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.286681)

どなたかご教授を

投稿記事by Meister » 2016年10月30日(日) 16:23

下記のようなmodを作成ししたいのですがどなたかご教授をお願いします。


1.ワールド内にある特殊なブロック(Testblock)を特定アイテムで右クリックすると特定のスポーンエッグが手に入る。
  例:骨で右クリックするとスケルトンのスポーンエッグが手に入る
2.右クリックされた特殊なブロック(Testblock)は特定のブロックに替わる。
  例:特殊なブロック(Testblock)から丸石やTNTなどに替わる


2の方は機能するのですが1の方が白いスポーンエッグが出てきてしまいます。
それをmobに右クリックしてなにも起こりもしません。

maincraft:1.10.2
forge-1.10.2-12.18.2.2099



import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;

import net.minecraft.world.World;
import net.minecraft.world.IBlockAccess;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.EnumHand;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Item;
import net.minecraft.init.Items;
import net.minecraft.init.Blocks;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.Minecraft;
import net.minecraft.block.state.IBlockState;
import net.minecraft.block.material.Material;
import net.minecraft.block.SoundType;
import net.minecraft.block.Block;

import java.util.Random;

public class mod_testblock {

public mod_testblock() {
}

public static BlockTestblock block;

public static Object instance;

public int addFuel(ItemStack fuel) {
return 0;
}

public void serverLoad(FMLServerStartingEvent event) {
}

public void preInit(FMLPreInitializationEvent event) {
}

public void registerRenderers() {
}

public void load(FMLInitializationEvent event) {
if (event.getSide() == Side.CLIENT) {
Minecraft.getMinecraft().getRenderItem().getItemModelMesher()
.register(Item.getItemFromBlock(block), 0, new ModelResourceLocation("TestEnvironmentMod:Testblock", "inventory"));
}

GameRegistry
.addRecipe(new ItemStack(block, 1),
new Object[]{"0X2", "X4X", "6X8", Character.valueOf('0'), Items.WOODEN_HOE, Character.valueOf('2'), Items.WOODEN_HOE,
Character.valueOf('4'), Items.WOODEN_HOE, Character.valueOf('6'), Items.WOODEN_HOE, Character.valueOf('8'),
Items.WOODEN_HOE,});
}

static {

block = (BlockTestblock) (new BlockTestblock().setHardness(2.0F).setResistance(10.0F).setLightLevel(0.0F).setUnlocalizedName("Testblock")
.setLightOpacity(0).setCreativeTab(CreativeTabs.BUILDING_BLOCKS));
block.setHarvestLevel("axe", 0);
}

public void generateSurface(World world, Random random, int chunkX, int chunkZ) {
}

public void generateNether(World world, Random random, int chunkX, int chunkZ) {
}

static class BlockTestblock extends Block {

int a1 = 0, a2 = 0, a3 = 0, a4 = 0, a5 = 0, a6 = 0;

boolean red = false;

protected BlockTestblock() {
super(Material.WOOD);

GameRegistry.registerBlock(this, "Testblock");
setSoundType(SoundType.WOOD);

}

@Override
public void onBlockAdded(World world, BlockPos pos, IBlockState state) {
int i = pos.getX();
int j = pos.getY();
int k = pos.getZ();
EntityPlayer entity = Minecraft.getMinecraft().thePlayer;
world.scheduleUpdate(new BlockPos(i, j, k), this, this.tickRate(world));

}

@Override
public int getWeakPower(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) {
return red ? 15 : 0;
}

@Override
public int getStrongPower(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) {
return red ? 15 : 0;
}

@Override
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer entity, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ){
int i = pos.getX();int j = pos.getY();int k = pos.getZ();
if(entity.inventory.getCurrentItem()!=null&&entity.inventory.getCurrentItem().getItem() == Items.BONE){
if(entity instanceof EntityPlayer)((EntityPlayer)entity).inventory.addItemStackToInventory(new ItemStack(Items.SPAWN_EGG, 1, 51);
}

if(entity.inventory.getCurrentItem()!=null&&entity.inventory.getCurrentItem().getItem() == Items.BONE){
if(entity instanceof EntityPlayer)((EntityPlayer)entity).inventory.clearMatchingItems(Items.BONE,-1,1,null);
}

if(entity.inventory.getCurrentItem()!=null&&entity.inventory.getCurrentItem().getItem() == Items.GUNPOWDER){
if(entity instanceof EntityPlayer)((EntityPlayer)entity).inventory.addItemStackToInventory(new ItemStack(Items.SPAWN_EGG, 1, 50));
}

if(entity.inventory.getCurrentItem()!=null&&entity.inventory.getCurrentItem().getItem() == Items.GUNPOWDER){
if(entity instanceof EntityPlayer)((EntityPlayer)entity).inventory.clearMatchingItems(Items.GUNPOWDER,-1,1,null);
}

if(entity.inventory.getCurrentItem()!=null&&entity.inventory.getCurrentItem().getItem() == Items.BONE){
world.setBlockState(new BlockPos(i, j, k), Blocks.TNT.getDefaultState(), 3);
}

if(entity.inventory.getCurrentItem()!=null&&entity.inventory.getCurrentItem().getItem() == Items.GUNPOWDER){
world.setBlockState(new BlockPos(i, j, k), Blocks.TNT.getDefaultState(), 3);
}

return true;}

@SideOnly(Side.CLIENT)
@Override
public BlockRenderLayer getBlockLayer() {
return BlockRenderLayer.SOLID;
}

@Override
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
return new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D);
}

@Override
public int tickRate(World world) {
return 10;
}

@Override
public int quantityDropped(Random par1Random) {
return 1;
}

}
}
Meister
ID:2345a1d2
 

  • (PostNo.286682)

Re: どなたかご教授を

投稿記事by elise_blacklab » 2016年10月30日(日) 17:09

コードを貼る際はユーザ登録をしてBBCodeをご利用いただくかGitHubを利用してください.

本題ですが,スポーンエッグ(ItemMonsterPlacer)にはMobの情報がメタ数値ではなくNBTデータによって管理されます.そのため,ItemStackにJEIなどで得られるメタ数値を入力しても,実際にはMobの情報が登録されていないためMobをスポーンさせられないという状態が起こります.
スポーン可能なItemMonsterPlacerを作成するには,ItemMonsterPlacer.applyEntityIdToItemStack(ItemStack, String)と同じ手法で,アイテムにNBTを適切に設定する必要があります.(と,回りくどい書き方をするのは,該当のメソッド自体はClientOnlyなためそのまま使用できないためです)
メイドつくってたりします.http://el-blacklab.net/
アバター
elise_blacklab
ID:516bebd7
掘り廃人
 
記事: 2325
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.286693)

どなたかご教授を

投稿記事by Meister » 2016年10月30日(日) 18:29

スピーディーな書き込みと指導ありがとうございます。

ユーザー登録をしようと思ったのですが、登録フォームの送信ボタンを押すとなぜかブラウザが落ちてしまい登録できないんで原因解り次第登録しようと思っています。

java並びにmod作成自体が初めてなので今後ともよろしくお願いします。
Meister
ID:2345a1d2
 


Return to 質問:開発・制作関連

x