[解決済][1.10.2]jsonの独自Property変数の追加及びTileEntityについて

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

[解決済][1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by リクト » 2017年11月30日(木) 17:22

Manaita Plusを1.10.2に対応させようとバニラの花瓶のソースを参考にしながら奮闘しているのですがフックの追加が上手くいきません
具体的にどこが上手くいかないのかといいますと、まずテクスチャが反映されません、先にProperty変数FACINGを実装してからProperty変数MANAITAを実装していて、MANAITAを実装する前はちゃんとテクスチャが反映されていたので「実装の仕方を間違えたのかな?」と思っています
次にTileEntityHookがまな板を持っているとstacksizeが1消費され壊すとかけたまな板と一緒にドロップするしシフト右クリックでかけたまな板を取り外すことができるのでまな板を保持させることには成功してるとは思うのですがまな板をかけた状態で右クリックしてもGUIが開かないどころかインベントリの描画がバグります、これに関してはcreateNewTileEntityメソッドを
コード: 全て選択
public TileEntity createNewTileEntity(World world, int meta) {
   Block block = null;
   int i = 0;
   switch (meta) {
   case 1:
      block = ManaitaPlusBlockCore.CraftingManaita;
   }
   return new TileEntityHook(new ItemStack(block, 1, i));
}

と改変することで(FACINGがあるので望んだ動作ではありませんが)GUIを開かせることには成功したので「もしかしてメタデータでかけているまな板を場合分けする必要があるのかな?」とも思っています(そうなるとまな板の種類に制限が出来るのでそうであってほしくないが)
これが解決したらリリースすることができるのでよろしくお願いします
BlockHookクラス
コード: 全て選択
package laru.manaita_plus.block;

import java.util.List;

import javax.annotation.Nullable;

import laru.manaita_plus.ManaitaPlus;
import laru.manaita_plus.core.ManaitaPlusBlockCore;
import laru.manaita_plus.tileentity.TileEntityHook;
import laru.manaita_plus.util.ManaitaPlusGuiID;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.BlockHorizontal;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumBlockRenderType;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.ChunkCache;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BlockHook extends BlockContainer {

   public static final PropertyDirection FACING = BlockHorizontal.FACING;
   public static final PropertyEnum<BlockHook.EnumManaitaType> MANAITA = PropertyEnum.<BlockHook.EnumManaitaType>create("manaita", BlockHook.EnumManaitaType.class);
   protected static final AxisAlignedBB NORTH_AABB = new AxisAlignedBB(0.0F, 0.0F, 0.875F, 1.0F, 1.0F, 1.0F);
   protected static final AxisAlignedBB SOUTH_AABB = new AxisAlignedBB(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.125F);
   protected static final AxisAlignedBB WEST_AABB = new AxisAlignedBB(0.875F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
   protected static final AxisAlignedBB EAST_AABB = new AxisAlignedBB(0.0F, 0.0F, 0.0F, 0.125F, 1.0F, 1.0F);

   public BlockHook() {
      super(Material.CIRCUITS);
      this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(MANAITA, BlockHook.EnumManaitaType.EMPTY));
      setCreativeTab(ManaitaPlus.tabManaitaPlus);
   }

   public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
      EnumFacing enumFacing = (EnumFacing)state.getValue(FACING);
      switch (enumFacing) {
      case NORTH:
         return NORTH_AABB;
      case SOUTH:
         return SOUTH_AABB;
      case WEST:
         return WEST_AABB;
      case EAST:
         return EAST_AABB;
      default:
         return null;
      }
   }

   public boolean isFullCube(IBlockState state) {
      return false;
   }

   public boolean isOpaqueCube(IBlockState state) {
      return false;
   }

   public EnumBlockRenderType getRenderType(IBlockState state) {
      return EnumBlockRenderType.MODEL;
   }

   public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) {
      if (world.isRemote) {
         return true;
      }
      TileEntityHook tileEntity = (TileEntityHook)world.getTileEntity(pos);
      if (tileEntity != null) {
         if (tileEntity.getStack() == null) {
            ItemStack itemStack = player.getHeldItemMainhand();
            if ((itemStack != null) && (itemStack.getItem() instanceof ItemBlockManaita)) {
               tileEntity.setStack(new ItemStack(itemStack.getItem(), 1, itemStack.getItemDamage()));
               tileEntity.markDirty();
               world.notifyBlockUpdate(pos, state, state, 3);
               if (!player.capabilities.isCreativeMode) {
                  itemStack.stackSize -= 1;
               }
            }
         }
         else if (tileEntity.getStack().getItem() == Item.getItemFromBlock(ManaitaPlusBlockCore.CraftingManaita)) {
            if (player.isSneaking()) {
               EntityItem entityItem = new EntityItem(world, player.posX, player.posY, player.posZ, tileEntity.getStack());
               if (!player.capabilities.isCreativeMode) {
                  world.spawnEntityInWorld(entityItem);
               }
               tileEntity.clearStack();
               tileEntity.markDirty();
               world.notifyBlockUpdate(pos, state, state, 3);
            }
            else {
               if (world.getBlockState(pos).getBlock() == ManaitaPlusBlockCore.Hook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.CraftingHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.WoodenFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.WoodenCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.StoneFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.StoneCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.IronFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.IronCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.GoldFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.GoldCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.DiamondFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.DiamondCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.EmeraldFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.EmeraldCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.RedstoneFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.RedstoneCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
            }
         }
         else if (tileEntity.getStack().getItem() == Item.getItemFromBlock(ManaitaPlusBlockCore.FurnaceManaita)) {
            if (player.isSneaking()) {
               EntityItem entityItem = new EntityItem(world, player.posX, player.posY, player.posZ, tileEntity.getStack());
               if (!player.capabilities.isCreativeMode) {
                  world.spawnEntityInWorld(entityItem);
               }
               tileEntity.clearStack();
               tileEntity.markDirty();
               world.notifyBlockUpdate(pos, state, state, 3);
            }
            else {
               if (world.getBlockState(pos) == ManaitaPlusBlockCore.Hook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.FurnaceHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.WoodenFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.WoodenFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.StoneFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.StoneFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.IronFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.IronFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.GoldFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.GoldFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.DiamondFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.DiamondFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.EmeraldFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.EmeraldFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.RedstoneFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.RedstoneFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
            }
         }
      }
      return true;
   }

   public IBlockState onBlockPlaced(World world, BlockPos pos, EnumFacing enumFacing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase entityLivingBase) {
      EnumFacing enumFacing1 = entityLivingBase.getHorizontalFacing().rotateY();
      return super.onBlockPlaced(world, pos, enumFacing1, hitX, hitY, hitZ, meta, entityLivingBase).withProperty(FACING, enumFacing);
   }

   public boolean canPlaceBlockOnSide(World world, BlockPos pos, EnumFacing enumFacing) {
      switch (enumFacing) {
      case NORTH:
      case SOUTH:
      case EAST:
      case WEST:
         return this.canBePlacedAt(world.getBlockState(pos.offset(enumFacing.getOpposite())));
      default:
         return false;
      }
   }

   private boolean canBePlacedAt(IBlockState state) {
      return state.isFullCube() && state.getMaterial().blocksMovement();
   }

   public void neighborChanged(IBlockState state, World world, BlockPos pos, Block block) {
      EnumFacing enumFacing = (EnumFacing)state.getValue(FACING);
      if (!world.getBlockState(pos.offset(enumFacing.getOpposite())).getMaterial().isSolid()) {
         this.dropBlockAsItem(world, pos, state, 0);
         world.setBlockToAir(pos);
      }
   }

   public IBlockState getStateFromMeta(int meta) {
      EnumFacing enumFacing = null;
      switch (meta) {
      case 1:
         enumFacing = EnumFacing.EAST;
         break;
      case 2:
         enumFacing = EnumFacing.WEST;
         break;
      case 3:
         enumFacing = EnumFacing.SOUTH;
         break;
      case 4:
      default:
         enumFacing = EnumFacing.NORTH;
      }
      return this.getDefaultState().withProperty(FACING, enumFacing);
   }

   public int getMetaFromState(IBlockState state) {
      int i = 0;
      switch ((EnumFacing)state.getValue(FACING)) {
      case EAST:
         i = 1;
         break;
      case WEST:
         i = 2;
         break;
      case SOUTH:
         i = 3;
         break;
      case NORTH:
      default:
         i = 4;
      }
      return i;
   }

   protected BlockStateContainer createBlockState() {
      return new BlockStateContainer(this, new IProperty[] { MANAITA, FACING });
   }

   public TileEntity createNewTileEntity(World world, int meta) {
      return new TileEntityHook();
   }

   public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
      List<ItemStack> ret = super.getDrops(world, pos, state, fortune);
      TileEntityHook tileEntity = (TileEntityHook)world.getTileEntity(pos);
      if ((tileEntity != null) && (tileEntity.getStack() != null)) {
         ret.add(tileEntity.getStack().copy());
      }
      return ret;
   }

   public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest) {
      if (willHarvest) {
         return true;
      }
      return super.removedByPlayer(state, world, pos, player, willHarvest);
   }

   public void harvestBlock(World world, EntityPlayer player, BlockPos pos, IBlockState state, @Nullable TileEntity tileEntity, @Nullable ItemStack itemStack) {
      super.harvestBlock(world, player, pos, state, tileEntity, itemStack);
      world.setBlockToAir(pos);
   }

   public IBlockState getActualState(IBlockState state, IBlockAccess access, BlockPos pos) {
      BlockHook.EnumManaitaType blockHook$enumManaitaType = BlockHook.EnumManaitaType.EMPTY;
      TileEntity tileEntity = access instanceof ChunkCache ? ((ChunkCache)access).getTileEntity(pos, Chunk.EnumCreateEntityType.CHECK) : access.getTileEntity(pos);
      if (tileEntity instanceof TileEntityHook) {
         TileEntityHook tileEntityHook = (TileEntityHook)tileEntity;
         if (tileEntityHook.getStack() != null) {
            Item item = tileEntityHook.getStack().getItem();
            if (item instanceof ItemBlock) {
               int i = tileEntityHook.getStack().getItemDamage();
               Block block = Block.getBlockFromItem(item);
               if (block == ManaitaPlusBlockCore.CraftingManaita) {
                  blockHook$enumManaitaType = blockHook$enumManaitaType.CRAFTING;
               }
               else if (block == ManaitaPlusBlockCore.FurnaceManaita) {
                  blockHook$enumManaitaType = blockHook$enumManaitaType.FURNACE;
               }
            }
         }
      }
      return state.withProperty(MANAITA, blockHook$enumManaitaType);
   }

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

   public static enum EnumManaitaType implements IStringSerializable {

      EMPTY("empty"),
      CRAFTING("crafting"),
      FURNACE("furnace");

      private final String name;

      private EnumManaitaType(String name) {
         this.name = name;
      }

      public String toString() {
         return this.name;
      }

      public String getName() {
         return this.name;
      }
   }
}

TileEntityHookクラス
コード: 全て選択
package laru.manaita_plus.tileentity;

import javax.annotation.Nullable;

import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;

public class TileEntityHook extends TileEntity {

   private ItemStack item;

   public TileEntityHook() {}

    public TileEntityHook(ItemStack itemStack)
    {
        this.item = itemStack;
    }

   public ItemStack getStack() {
      return this.item;
   }

   public ItemStack clearStack() {
      if (this.item != null) {
         ItemStack ItemStack = this.item;
         this.item = null;
         return ItemStack;
      }
      return null;
   }

   public void setStack(ItemStack itemStack) {
      this.item = itemStack;
      if (itemStack != null) {
         itemStack.stackSize = 1;
      }
   }

   public void readFromNBT(NBTTagCompound nbtTagCompound) {
      super.readFromNBT(nbtTagCompound);
      this.item = ItemStack.loadItemStackFromNBT((NBTTagCompound)nbtTagCompound.getTag("Item"));
   }

   public NBTTagCompound writeToNBT(NBTTagCompound nbtTagCompound) {
      super.writeToNBT(nbtTagCompound);
      NBTTagCompound nbtTagCompound1 = new NBTTagCompound();
      if (this.item != null) {
         this.item.writeToNBT(nbtTagCompound1);
      }
      return nbtTagCompound1;
   }

   @Nullable
   public SPacketUpdateTileEntity getUpdatePacket() {
      return new SPacketUpdateTileEntity(this.pos, this.getBlockMetadata(), this.getUpdateTag());
   }

   public NBTTagCompound getUpdateTag() {
      return this.writeToNBT(new NBTTagCompound());
   }
}

Hook.json(blockstates)
コード: 全て選択
{
   "variants": {
      "facing=east, manaita=empty": {
         "model": "manaitaplus:Hook"
      },
      "facing=south, manaita=empty": {
         "model": "manaitaplus:Hook",
         "y": 90
      },
      "facing=west, manaita=empty": {
         "model": "manaitaplus:Hook",
         "y": 180
      },
      "facing=north, manaita=empty": {
         "model": "manaitaplus:Hook",
         "y": 270
      },
      "facing=east, manaita=crafting": {
         "model": "manaitaplus:Hook_Crafting"
      },
      "facing=south, manaita=crafting": {
         "model": "manaitaplus:Hook_Crafting",
         "y": 90
      },
      "facing=west, manaita=crafting": {
         "model": "manaitaplus:Hook_Crafting",
         "y": 180
      },
      "facing=north, manaita=crafting": {
         "model": "manaitaplus:Hook_Crafting",
         "y": 270
      },
      "facing=east, manaita=furnace": {
         "model": "manaitaplus:Hook_Furnace"
      },
      "facing=south, manaita=furnace": {
         "model": "manaitaplus:Hook_Furnace",
         "y": 90
      },
      "facing=west, manaita=furnace": {
         "model": "manaitaplus:Hook_Furnace",
         "y": 180
      },
      "facing=north, manaita=furnace": {
         "model": "manaitaplus:Hook_Furnace",
         "y": 270
      }
   }
}
最後に編集したユーザー リクト [ 2017年12月12日(火) 20:21 ], 累計 1 回
Modを沢山導入してマイクラを遊んでます
Manaita PlusとかSacred Treasures of The GoddessとかいくつかModを公開してます
JavaとModding勉強中
凛&花丸推しラブライバー
凛ちゃんまじえんじぇー
アバター
リクト
ID:91225867
石掘り
 
記事: 129
登録日時: 2017年3月17日(金) 13:11

  • (PostNo.310870)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by defeatedcrow » 2017年11月30日(木) 19:18

リクト さんが書きました:Manaita Plusを1.10.2に対応させようとバニラの花瓶のソースを参考にしながら奮闘しているのですがフックの追加が上手くいきません
具体的にどこが上手くいかないのかといいますと、まずテクスチャが反映されません、先にProperty変数FACINGを実装してからProperty変数MANAITAを実装していて、MANAITAを実装する前はちゃんとテクスチャが反映されていたので「実装の仕方を間違えたのかな?」と思っています
次にTileEntityHookがまな板を持っているとstacksizeが1消費され壊すとかけたまな板と一緒にドロップするしシフト右クリックでかけたまな板を取り外すことができるのでまな板を保持させることには成功してるとは思うのですがまな板をかけた状態で右クリックしてもGUIが開かないどころかインベントリの描画がバグります、これに関してはcreateNewTileEntityメソッドを
コード: 全て選択
public TileEntity createNewTileEntity(World world, int meta) {
   Block block = null;
   int i = 0;
   switch (meta) {
   case 1:
      block = ManaitaPlusBlockCore.CraftingManaita;
   }
   return new TileEntityHook(new ItemStack(block, 1, i));
}

と改変することで(FACINGがあるので望んだ動作ではありませんが)GUIを開かせることには成功したので「もしかしてメタデータでかけているまな板を場合分けする必要があるのかな?」とも思っています(そうなるとまな板の種類に制限が出来るのでそうであってほしくないが)
これが解決したらリリースすることができるのでよろしくお願いします
BlockHookクラス
コード: 全て選択
package laru.manaita_plus.block;

import java.util.List;

import javax.annotation.Nullable;

import laru.manaita_plus.ManaitaPlus;
import laru.manaita_plus.core.ManaitaPlusBlockCore;
import laru.manaita_plus.tileentity.TileEntityHook;
import laru.manaita_plus.util.ManaitaPlusGuiID;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.BlockHorizontal;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumBlockRenderType;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.ChunkCache;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BlockHook extends BlockContainer {

   public static final PropertyDirection FACING = BlockHorizontal.FACING;
   public static final PropertyEnum<BlockHook.EnumManaitaType> MANAITA = PropertyEnum.<BlockHook.EnumManaitaType>create("manaita", BlockHook.EnumManaitaType.class);
   protected static final AxisAlignedBB NORTH_AABB = new AxisAlignedBB(0.0F, 0.0F, 0.875F, 1.0F, 1.0F, 1.0F);
   protected static final AxisAlignedBB SOUTH_AABB = new AxisAlignedBB(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.125F);
   protected static final AxisAlignedBB WEST_AABB = new AxisAlignedBB(0.875F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
   protected static final AxisAlignedBB EAST_AABB = new AxisAlignedBB(0.0F, 0.0F, 0.0F, 0.125F, 1.0F, 1.0F);

   public BlockHook() {
      super(Material.CIRCUITS);
      this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(MANAITA, BlockHook.EnumManaitaType.EMPTY));
      setCreativeTab(ManaitaPlus.tabManaitaPlus);
   }

   public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
      EnumFacing enumFacing = (EnumFacing)state.getValue(FACING);
      switch (enumFacing) {
      case NORTH:
         return NORTH_AABB;
      case SOUTH:
         return SOUTH_AABB;
      case WEST:
         return WEST_AABB;
      case EAST:
         return EAST_AABB;
      default:
         return null;
      }
   }

   public boolean isFullCube(IBlockState state) {
      return false;
   }

   public boolean isOpaqueCube(IBlockState state) {
      return false;
   }

   public EnumBlockRenderType getRenderType(IBlockState state) {
      return EnumBlockRenderType.MODEL;
   }

   public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) {
      if (world.isRemote) {
         return true;
      }
      TileEntityHook tileEntity = (TileEntityHook)world.getTileEntity(pos);
      if (tileEntity != null) {
         if (tileEntity.getStack() == null) {
            ItemStack itemStack = player.getHeldItemMainhand();
            if ((itemStack != null) && (itemStack.getItem() instanceof ItemBlockManaita)) {
               tileEntity.setStack(new ItemStack(itemStack.getItem(), 1, itemStack.getItemDamage()));
               tileEntity.markDirty();
               world.notifyBlockUpdate(pos, state, state, 3);
               if (!player.capabilities.isCreativeMode) {
                  itemStack.stackSize -= 1;
               }
            }
         }
         else if (tileEntity.getStack().getItem() == Item.getItemFromBlock(ManaitaPlusBlockCore.CraftingManaita)) {
            if (player.isSneaking()) {
               EntityItem entityItem = new EntityItem(world, player.posX, player.posY, player.posZ, tileEntity.getStack());
               if (!player.capabilities.isCreativeMode) {
                  world.spawnEntityInWorld(entityItem);
               }
               tileEntity.clearStack();
               tileEntity.markDirty();
               world.notifyBlockUpdate(pos, state, state, 3);
            }
            else {
               if (world.getBlockState(pos).getBlock() == ManaitaPlusBlockCore.Hook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.CraftingHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.WoodenFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.WoodenCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.StoneFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.StoneCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.IronFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.IronCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.GoldFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.GoldCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.DiamondFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.DiamondCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.EmeraldFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.EmeraldCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.RedstoneFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.RedstoneCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
            }
         }
         else if (tileEntity.getStack().getItem() == Item.getItemFromBlock(ManaitaPlusBlockCore.FurnaceManaita)) {
            if (player.isSneaking()) {
               EntityItem entityItem = new EntityItem(world, player.posX, player.posY, player.posZ, tileEntity.getStack());
               if (!player.capabilities.isCreativeMode) {
                  world.spawnEntityInWorld(entityItem);
               }
               tileEntity.clearStack();
               tileEntity.markDirty();
               world.notifyBlockUpdate(pos, state, state, 3);
            }
            else {
               if (world.getBlockState(pos) == ManaitaPlusBlockCore.Hook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.FurnaceHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.WoodenFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.WoodenFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.StoneFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.StoneFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.IronFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.IronFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.GoldFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.GoldFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.DiamondFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.DiamondFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.EmeraldFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.EmeraldFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.RedstoneFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.RedstoneFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
            }
         }
      }
      return true;
   }

   public IBlockState onBlockPlaced(World world, BlockPos pos, EnumFacing enumFacing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase entityLivingBase) {
      EnumFacing enumFacing1 = entityLivingBase.getHorizontalFacing().rotateY();
      return super.onBlockPlaced(world, pos, enumFacing1, hitX, hitY, hitZ, meta, entityLivingBase).withProperty(FACING, enumFacing);
   }

   public boolean canPlaceBlockOnSide(World world, BlockPos pos, EnumFacing enumFacing) {
      switch (enumFacing) {
      case NORTH:
      case SOUTH:
      case EAST:
      case WEST:
         return this.canBePlacedAt(world.getBlockState(pos.offset(enumFacing.getOpposite())));
      default:
         return false;
      }
   }

   private boolean canBePlacedAt(IBlockState state) {
      return state.isFullCube() && state.getMaterial().blocksMovement();
   }

   public void neighborChanged(IBlockState state, World world, BlockPos pos, Block block) {
      EnumFacing enumFacing = (EnumFacing)state.getValue(FACING);
      if (!world.getBlockState(pos.offset(enumFacing.getOpposite())).getMaterial().isSolid()) {
         this.dropBlockAsItem(world, pos, state, 0);
         world.setBlockToAir(pos);
      }
   }

   public IBlockState getStateFromMeta(int meta) {
      EnumFacing enumFacing = null;
      switch (meta) {
      case 1:
         enumFacing = EnumFacing.EAST;
         break;
      case 2:
         enumFacing = EnumFacing.WEST;
         break;
      case 3:
         enumFacing = EnumFacing.SOUTH;
         break;
      case 4:
      default:
         enumFacing = EnumFacing.NORTH;
      }
      return this.getDefaultState().withProperty(FACING, enumFacing);
   }

   public int getMetaFromState(IBlockState state) {
      int i = 0;
      switch ((EnumFacing)state.getValue(FACING)) {
      case EAST:
         i = 1;
         break;
      case WEST:
         i = 2;
         break;
      case SOUTH:
         i = 3;
         break;
      case NORTH:
      default:
         i = 4;
      }
      return i;
   }

   protected BlockStateContainer createBlockState() {
      return new BlockStateContainer(this, new IProperty[] { MANAITA, FACING });
   }

   public TileEntity createNewTileEntity(World world, int meta) {
      return new TileEntityHook();
   }

   public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
      List<ItemStack> ret = super.getDrops(world, pos, state, fortune);
      TileEntityHook tileEntity = (TileEntityHook)world.getTileEntity(pos);
      if ((tileEntity != null) && (tileEntity.getStack() != null)) {
         ret.add(tileEntity.getStack().copy());
      }
      return ret;
   }

   public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest) {
      if (willHarvest) {
         return true;
      }
      return super.removedByPlayer(state, world, pos, player, willHarvest);
   }

   public void harvestBlock(World world, EntityPlayer player, BlockPos pos, IBlockState state, @Nullable TileEntity tileEntity, @Nullable ItemStack itemStack) {
      super.harvestBlock(world, player, pos, state, tileEntity, itemStack);
      world.setBlockToAir(pos);
   }

   public IBlockState getActualState(IBlockState state, IBlockAccess access, BlockPos pos) {
      BlockHook.EnumManaitaType blockHook$enumManaitaType = BlockHook.EnumManaitaType.EMPTY;
      TileEntity tileEntity = access instanceof ChunkCache ? ((ChunkCache)access).getTileEntity(pos, Chunk.EnumCreateEntityType.CHECK) : access.getTileEntity(pos);
      if (tileEntity instanceof TileEntityHook) {
         TileEntityHook tileEntityHook = (TileEntityHook)tileEntity;
         if (tileEntityHook.getStack() != null) {
            Item item = tileEntityHook.getStack().getItem();
            if (item instanceof ItemBlock) {
               int i = tileEntityHook.getStack().getItemDamage();
               Block block = Block.getBlockFromItem(item);
               if (block == ManaitaPlusBlockCore.CraftingManaita) {
                  blockHook$enumManaitaType = blockHook$enumManaitaType.CRAFTING;
               }
               else if (block == ManaitaPlusBlockCore.FurnaceManaita) {
                  blockHook$enumManaitaType = blockHook$enumManaitaType.FURNACE;
               }
            }
         }
      }
      return state.withProperty(MANAITA, blockHook$enumManaitaType);
   }

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

   public static enum EnumManaitaType implements IStringSerializable {

      EMPTY("empty"),
      CRAFTING("crafting"),
      FURNACE("furnace");

      private final String name;

      private EnumManaitaType(String name) {
         this.name = name;
      }

      public String toString() {
         return this.name;
      }

      public String getName() {
         return this.name;
      }
   }
}

TileEntityHookクラス
コード: 全て選択
package laru.manaita_plus.tileentity;

import javax.annotation.Nullable;

import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;

public class TileEntityHook extends TileEntity {

   private ItemStack item;

   public TileEntityHook() {}

    public TileEntityHook(ItemStack itemStack)
    {
        this.item = itemStack;
    }

   public ItemStack getStack() {
      return this.item;
   }

   public ItemStack clearStack() {
      if (this.item != null) {
         ItemStack ItemStack = this.item;
         this.item = null;
         return ItemStack;
      }
      return null;
   }

   public void setStack(ItemStack itemStack) {
      this.item = itemStack;
      if (itemStack != null) {
         itemStack.stackSize = 1;
      }
   }

   public void readFromNBT(NBTTagCompound nbtTagCompound) {
      super.readFromNBT(nbtTagCompound);
      this.item = ItemStack.loadItemStackFromNBT((NBTTagCompound)nbtTagCompound.getTag("Item"));
   }

   public NBTTagCompound writeToNBT(NBTTagCompound nbtTagCompound) {
      super.writeToNBT(nbtTagCompound);
      NBTTagCompound nbtTagCompound1 = new NBTTagCompound();
      if (this.item != null) {
         this.item.writeToNBT(nbtTagCompound1);
      }
      return nbtTagCompound1;
   }

   @Nullable
   public SPacketUpdateTileEntity getUpdatePacket() {
      return new SPacketUpdateTileEntity(this.pos, this.getBlockMetadata(), this.getUpdateTag());
   }

   public NBTTagCompound getUpdateTag() {
      return this.writeToNBT(new NBTTagCompound());
   }
}

Hook.json(blockstates)
コード: 全て選択
{
   "variants": {
      "facing=east, manaita=empty": {
         "model": "manaitaplus:Hook"
      },
      "facing=south, manaita=empty": {
         "model": "manaitaplus:Hook",
         "y": 90
      },
      "facing=west, manaita=empty": {
         "model": "manaitaplus:Hook",
         "y": 180
      },
      "facing=north, manaita=empty": {
         "model": "manaitaplus:Hook",
         "y": 270
      },
      "facing=east, manaita=crafting": {
         "model": "manaitaplus:Hook_Crafting"
      },
      "facing=south, manaita=crafting": {
         "model": "manaitaplus:Hook_Crafting",
         "y": 90
      },
      "facing=west, manaita=crafting": {
         "model": "manaitaplus:Hook_Crafting",
         "y": 180
      },
      "facing=north, manaita=crafting": {
         "model": "manaitaplus:Hook_Crafting",
         "y": 270
      },
      "facing=east, manaita=furnace": {
         "model": "manaitaplus:Hook_Furnace"
      },
      "facing=south, manaita=furnace": {
         "model": "manaitaplus:Hook_Furnace",
         "y": 90
      },
      "facing=west, manaita=furnace": {
         "model": "manaitaplus:Hook_Furnace",
         "y": 180
      },
      "facing=north, manaita=furnace": {
         "model": "manaitaplus:Hook_Furnace",
         "y": 270
      }
   }
}



>ブロックのプロパティについて
getStateFromMeta、getMetaFromStateでメタ値にMANAITAが反映していないようなので、そのへんが原因ではないかなぁと思います
getActualStateでプロパティ操作をしているようですが、インベントリ変更はサーバ側で行うので、クライアント側にはその変更がそのままでは伝わってきませんので、変化が反映されないです
このあたりを何とかするには

・getStateFromMeta、getMetaFromStateに反映させた上で変更時にworld.setBlockStateを呼んでState変更
・インベントリ変更があったときに参加中の各EntityPlayerMPから独自パケットを投げまくりクライアントを更新する
あたりが必要になります
(※パケットは1.7のころであればgetUpdatePacket()やonDataPacketなどをオーバーライドしてあれば同期してくれたんですが、現在はMod追加分の同期処理が仕事してないです
 バニラの同様処理は動いているようなのでバニラは機能してるみたいですが、Mod追加分は自力で呼ぶ必要がある様子
 ((EntityPlayerMP) player).connection.sendPacket(this.getUpdatePacket())でTEのNBTをそのまま飛ばしてもいいし、必要な内容だけカスタムパケットで飛ばしてもいいと思います)

ちなみに、TileEntityはTick処理が消されてしまっています
なので、常時監視系の処理を動かす場合はITickableをTileEntityに実装します

おそらくですが、花瓶より、カマド(内容変更でカマドブロックが光る)のほうが例として近いんじゃないかと思います


>右クリック処理の不良
1.10はオフハンドがあるので、右クリックをするとメインハンド+オフハンドで二回処理が走ります
上記のソースを見た感じだと、メインでもオフでもメインハンドのアイテムを使って動かしてしまっているようにみえるので、渡ってくるhandがメインのときのみに限定してしまっても良いんじゃないかと思います
それが原因かはなんとも言えないですが(インベントリGUIがバグる、の詳細がよくわからないのと、Modの内容をよく知らないので)


あとはロガーを吐かせつつクラッシュレポートを吐かせつつ、ミスの確認とかですかねぇ
モデルJsonやテクスチャのミスは起動時ログに詳細が出てくるようになっているので、それを追えばファイル内容とソース上の設定の食い違いなどはわかると思います
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:271b97d4
ラピスラズリ収集家
 
記事: 1105
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.310882)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by リクト » 2017年12月01日(金) 17:10

defeatedcrow さんが書きました:>ブロックのプロパティについて
getStateFromMeta、getMetaFromStateでメタ値にMANAITAが反映していないようなので、そのへんが原因ではないかなぁと思います
getActualStateでプロパティ操作をしているようですが、インベントリ変更はサーバ側で行うので、クライアント側にはその変更がそのままでは伝わってきませんので、変化が反映されないです
このあたりを何とかするには

・getStateFromMeta、getMetaFromStateに反映させた上で変更時にworld.setBlockStateを呼んでState変更
・インベントリ変更があったときに参加中の各EntityPlayerMPから独自パケットを投げまくりクライアントを更新する
あたりが必要になります
(※パケットは1.7のころであればgetUpdatePacket()やonDataPacketなどをオーバーライドしてあれば同期してくれたんですが、現在はMod追加分の同期処理が仕事してないです
 バニラの同様処理は動いているようなのでバニラは機能してるみたいですが、Mod追加分は自力で呼ぶ必要がある様子
 ((EntityPlayerMP) player).connection.sendPacket(this.getUpdatePacket())でTEのNBTをそのまま飛ばしてもいいし、必要な内容だけカスタムパケットで飛ばしてもいいと思います)

ちなみに、TileEntityはTick処理が消されてしまっています
なので、常時監視系の処理を動かす場合はITickableをTileEntityに実装します

おそらくですが、花瓶より、カマド(内容変更でカマドブロックが光る)のほうが例として近いんじゃないかと思います


>右クリック処理の不良
1.10はオフハンドがあるので、右クリックをするとメインハンド+オフハンドで二回処理が走ります
上記のソースを見た感じだと、メインでもオフでもメインハンドのアイテムを使って動かしてしまっているようにみえるので、渡ってくるhandがメインのときのみに限定してしまっても良いんじゃないかと思います
それが原因かはなんとも言えないですが(インベントリGUIがバグる、の詳細がよくわからないのと、Modの内容をよく知らないので)


あとはロガーを吐かせつつクラッシュレポートを吐かせつつ、ミスの確認とかですかねぇ
モデルJsonやテクスチャのミスは起動時ログに詳細が出てくるようになっているので、それを追えばファイル内容とソース上の設定の食い違いなどはわかると思います

なるほど、同期しなきゃいけなかったんですね
あと、getStateFromMeta、getMetaFromStateでメタデータにMANAITAが反映していないのが原因とのことですが、やはりメタデータでまな板を場合分けする必要があるのでしょうか…?
メインハンドのみにするのはif (hand == EnumHand.MAIN_HAND)でいいんですかね?そうしてみたのですが動作は変わりませんでした
とりあえずPacketとメタデータによる場合分けを試してみてからまた返信しようと思っているのですがしばらく私情でModdingが出来ないのでおそらく遅れます、すみません
Modを沢山導入してマイクラを遊んでます
Manaita PlusとかSacred Treasures of The GoddessとかいくつかModを公開してます
JavaとModding勉強中
凛&花丸推しラブライバー
凛ちゃんまじえんじぇー
アバター
リクト
ID:91225867
石掘り
 
記事: 129
登録日時: 2017年3月17日(金) 13:11

  • (PostNo.310886)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by defeatedcrow » 2017年12月01日(金) 18:39

リクト さんが書きました:
defeatedcrow さんが書きました:>ブロックのプロパティについて
getStateFromMeta、getMetaFromStateでメタ値にMANAITAが反映していないようなので、そのへんが原因ではないかなぁと思います
getActualStateでプロパティ操作をしているようですが、インベントリ変更はサーバ側で行うので、クライアント側にはその変更がそのままでは伝わってきませんので、変化が反映されないです
このあたりを何とかするには

・getStateFromMeta、getMetaFromStateに反映させた上で変更時にworld.setBlockStateを呼んでState変更
・インベントリ変更があったときに参加中の各EntityPlayerMPから独自パケットを投げまくりクライアントを更新する
あたりが必要になります
(※パケットは1.7のころであればgetUpdatePacket()やonDataPacketなどをオーバーライドしてあれば同期してくれたんですが、現在はMod追加分の同期処理が仕事してないです
 バニラの同様処理は動いているようなのでバニラは機能してるみたいですが、Mod追加分は自力で呼ぶ必要がある様子
 ((EntityPlayerMP) player).connection.sendPacket(this.getUpdatePacket())でTEのNBTをそのまま飛ばしてもいいし、必要な内容だけカスタムパケットで飛ばしてもいいと思います)

ちなみに、TileEntityはTick処理が消されてしまっています
なので、常時監視系の処理を動かす場合はITickableをTileEntityに実装します

おそらくですが、花瓶より、カマド(内容変更でカマドブロックが光る)のほうが例として近いんじゃないかと思います


>右クリック処理の不良
1.10はオフハンドがあるので、右クリックをするとメインハンド+オフハンドで二回処理が走ります
上記のソースを見た感じだと、メインでもオフでもメインハンドのアイテムを使って動かしてしまっているようにみえるので、渡ってくるhandがメインのときのみに限定してしまっても良いんじゃないかと思います
それが原因かはなんとも言えないですが(インベントリGUIがバグる、の詳細がよくわからないのと、Modの内容をよく知らないので)


あとはロガーを吐かせつつクラッシュレポートを吐かせつつ、ミスの確認とかですかねぇ
モデルJsonやテクスチャのミスは起動時ログに詳細が出てくるようになっているので、それを追えばファイル内容とソース上の設定の食い違いなどはわかると思います

なるほど、同期しなきゃいけなかったんですね
あと、getStateFromMeta、getMetaFromStateでメタデータにMANAITAが反映していないのが原因とのことですが、やはりメタデータでまな板を場合分けする必要があるのでしょうか…?
メインハンドのみにするのはif (hand == EnumHand.MAIN_HAND)でいいんですかね?そうしてみたのですが動作は変わりませんでした
とりあえずPacketとメタデータによる場合分けを試してみてからまた返信しようと思っているのですがしばらく私情でModdingが出来ないのでおそらく遅れます、すみません



「メタデータでまな板を場合分けする」と、「TileEntityを同期させてクライアント側の状態を常に最新にする」は、どちらかで良いです

右クリック処理については正答に必要な情報がないです
「バグった」の文言から詳細の推測ができないのと、検証の詳細内容もないので
ですのでエスパー解答としてクリック判定の不良を疑いましたが、違っていたようなので別の原因がありそうですね

ちなみに、GUIを動かすのであれば、GUIの参照はクライアント側のTileEntityなので、これも同期処理が必須です
このModのHookは花瓶に似せて作ってありIInventoryの実装もないようなので、同期にはパケットが必要です
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:271b97d4
ラピスラズリ収集家
 
記事: 1105
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.311174)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by リクト » 2017年12月09日(土) 14:25

defeatedcrow さんが書きました:「メタデータでまな板を場合分けする」と、「TileEntityを同期させてクライアント側の状態を常に最新にする」は、どちらかで良いです

右クリック処理については正答に必要な情報がないです
「バグった」の文言から詳細の推測ができないのと、検証の詳細内容もないので
ですのでエスパー解答としてクリック判定の不良を疑いましたが、違っていたようなので別の原因がありそうですね

ちなみに、GUIを動かすのであれば、GUIの参照はクライアント側のTileEntityなので、これも同期処理が必須です
このModのHookは花瓶に似せて作ってありIInventoryの実装もないようなので、同期にはパケットが必要です

とりあえずTileEntityHookクラスをこんな感じに改変してみたんですがあまり変わった様子はなかったです、パケットの投げ方が間違っているんだと思いますが参考になりそうなソースが全然なくてちんぷんかんぷんです
というか変わらないどころかupdateメソッドのせいで常にEMPTYにされてまな板をかけると消えるようになりました
コード: 全て選択
package laru.manaita_plus.tileentity;

import javax.annotation.Nullable;

import laru.manaita_plus.block.BlockHook;
import laru.manaita_plus.core.ManaitaPlusBlockCore;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ITickable;

public class TileEntityHook extends TileEntity implements ITickable {

   private ItemStack item;

   public TileEntityHook() {}

   public TileEntityHook(ItemStack itemStack) {
      this.item = itemStack;
   }

   public ItemStack getStack() {
      return this.item;
   }

   public ItemStack clearStack() {
      if (this.item != null) {
         ItemStack ItemStack = this.item;
         this.item = null;
         markDirty();
         return ItemStack;
      }
      return null;
   }

   public void setStack(ItemStack itemStack) {
      this.item = itemStack;
      if (itemStack != null) {
         itemStack.stackSize = 1;
      }
      markDirty();
   }

   public void readFromNBT(NBTTagCompound nbtTagCompound) {
      super.readFromNBT(nbtTagCompound);
      this.item = ItemStack.loadItemStackFromNBT((NBTTagCompound)nbtTagCompound.getTag("Item"));
   }

   public NBTTagCompound writeToNBT(NBTTagCompound nbtTagCompound) {
      super.writeToNBT(nbtTagCompound);
      NBTTagCompound nbtTagCompound1 = new NBTTagCompound();
      if (this.item != null) {
         this.item.writeToNBT(nbtTagCompound1);
      }
      return nbtTagCompound1;
   }

   public void markDirty() {
      super.markDirty();
      for (EntityPlayer player : this.worldObj.playerEntities) {
         if (player instanceof EntityPlayerMP) {
            ((EntityPlayerMP)player).connection.sendPacket(this.getUpdatePacket());
         }
      }
   }

   @Nullable
   public SPacketUpdateTileEntity getUpdatePacket() {
      return new SPacketUpdateTileEntity(this.pos, this.getBlockMetadata(), this.getUpdateTag());
   }

   public NBTTagCompound getUpdateTag() {
      return this.writeToNBT(new NBTTagCompound());
   }

   public void update() {
      if (!this.worldObj.isRemote) {
         IBlockState iBlockState = this.worldObj.getBlockState(this.getPos());
         if (!(iBlockState.getBlock() instanceof BlockHook)) {
            return;
         }
         if ((item != null) && (item.getItem() instanceof ItemBlock)) {
            int i = item.getItemDamage();
            Block block = Block.getBlockFromItem(item.getItem());
            if (block == ManaitaPlusBlockCore.CraftingManaita) {
               iBlockState = iBlockState.withProperty(BlockHook.MANAITA, BlockHook.EnumManaitaType.CRAFTING);
            }
            else if (block == ManaitaPlusBlockCore.FurnaceManaita) {
               iBlockState = iBlockState.withProperty(BlockHook.MANAITA, BlockHook.EnumManaitaType.FURNACE);
            }
         }
         else {
            iBlockState = iBlockState.withProperty(BlockHook.MANAITA, BlockHook.EnumManaitaType.EMPTY);
         }
         this.worldObj.setBlockState(this.pos, iBlockState, 2);
      }
   }
}
Modを沢山導入してマイクラを遊んでます
Manaita PlusとかSacred Treasures of The GoddessとかいくつかModを公開してます
JavaとModding勉強中
凛&花丸推しラブライバー
凛ちゃんまじえんじぇー
アバター
リクト
ID:91225867
石掘り
 
記事: 129
登録日時: 2017年3月17日(金) 13:11

  • (PostNo.311199)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by defeatedcrow » 2017年12月09日(土) 21:31

リクト さんが書きました:
defeatedcrow さんが書きました:「メタデータでまな板を場合分けする」と、「TileEntityを同期させてクライアント側の状態を常に最新にする」は、どちらかで良いです

右クリック処理については正答に必要な情報がないです
「バグった」の文言から詳細の推測ができないのと、検証の詳細内容もないので
ですのでエスパー解答としてクリック判定の不良を疑いましたが、違っていたようなので別の原因がありそうですね

ちなみに、GUIを動かすのであれば、GUIの参照はクライアント側のTileEntityなので、これも同期処理が必須です
このModのHookは花瓶に似せて作ってありIInventoryの実装もないようなので、同期にはパケットが必要です

とりあえずTileEntityHookクラスをこんな感じに改変してみたんですがあまり変わった様子はなかったです、パケットの投げ方が間違っているんだと思いますが参考になりそうなソースが全然なくてちんぷんかんぷんです
というか変わらないどころかupdateメソッドのせいで常にEMPTYにされてまな板をかけると消えるようになりました
コード: 全て選択
package laru.manaita_plus.tileentity;

import javax.annotation.Nullable;

import laru.manaita_plus.block.BlockHook;
import laru.manaita_plus.core.ManaitaPlusBlockCore;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ITickable;

public class TileEntityHook extends TileEntity implements ITickable {

   private ItemStack item;

   public TileEntityHook() {}

   public TileEntityHook(ItemStack itemStack) {
      this.item = itemStack;
   }

   public ItemStack getStack() {
      return this.item;
   }

   public ItemStack clearStack() {
      if (this.item != null) {
         ItemStack ItemStack = this.item;
         this.item = null;
         markDirty();
         return ItemStack;
      }
      return null;
   }

   public void setStack(ItemStack itemStack) {
      this.item = itemStack;
      if (itemStack != null) {
         itemStack.stackSize = 1;
      }
      markDirty();
   }

   public void readFromNBT(NBTTagCompound nbtTagCompound) {
      super.readFromNBT(nbtTagCompound);
      this.item = ItemStack.loadItemStackFromNBT((NBTTagCompound)nbtTagCompound.getTag("Item"));
   }

   public NBTTagCompound writeToNBT(NBTTagCompound nbtTagCompound) {
      super.writeToNBT(nbtTagCompound);
      NBTTagCompound nbtTagCompound1 = new NBTTagCompound();
      if (this.item != null) {
         this.item.writeToNBT(nbtTagCompound1);
      }
      return nbtTagCompound1;
   }

   public void markDirty() {
      super.markDirty();
      for (EntityPlayer player : this.worldObj.playerEntities) {
         if (player instanceof EntityPlayerMP) {
            ((EntityPlayerMP)player).connection.sendPacket(this.getUpdatePacket());
         }
      }
   }

   @Nullable
   public SPacketUpdateTileEntity getUpdatePacket() {
      return new SPacketUpdateTileEntity(this.pos, this.getBlockMetadata(), this.getUpdateTag());
   }

   public NBTTagCompound getUpdateTag() {
      return this.writeToNBT(new NBTTagCompound());
   }

   public void update() {
      if (!this.worldObj.isRemote) {
         IBlockState iBlockState = this.worldObj.getBlockState(this.getPos());
         if (!(iBlockState.getBlock() instanceof BlockHook)) {
            return;
         }
         if ((item != null) && (item.getItem() instanceof ItemBlock)) {
            int i = item.getItemDamage();
            Block block = Block.getBlockFromItem(item.getItem());
            if (block == ManaitaPlusBlockCore.CraftingManaita) {
               iBlockState = iBlockState.withProperty(BlockHook.MANAITA, BlockHook.EnumManaitaType.CRAFTING);
            }
            else if (block == ManaitaPlusBlockCore.FurnaceManaita) {
               iBlockState = iBlockState.withProperty(BlockHook.MANAITA, BlockHook.EnumManaitaType.FURNACE);
            }
         }
         else {
            iBlockState = iBlockState.withProperty(BlockHook.MANAITA, BlockHook.EnumManaitaType.EMPTY);
         }
         this.worldObj.setBlockState(this.pos, iBlockState, 2);
      }
   }
}


私でも数日掛かるな~という内容を、わからないなりに手早く済ませようとして地雷を踏んでいる案件に見えるので、そこそこ長期戦になると思います
私の解答を読解できないレベルと見受けられますので、こちらは基礎を分かる前提であれこれと書いていましたが、どうも無駄みたいですね
質問文の情報欠落も激しく、筆談での質問自体ぶっちゃけかなり苦手な方と見えるので、ちょっと一旦整理します

お付き合いいただけるなら、ソースを全文公開してください。こちらで開発環境作って動作チェックしないと埒が明かないです。
面倒だなーと思えば断っていただいても結構です、私もそれ以上深入りしません。


あと一応聞きますがコレ、どこまであなたのソースですか?
ある程度は元Modのコピペなんですかね?
どこまでが元ソースなのかわからないのですが、どうも移植元のソースの記述の癖にも苦戦しているように見えるので…


ちなみに、例が入用ならHaCのIBC辺りが比較的近そうなのでどうぞ
IBCが持っているのは液体情報ですが、更新時にパケットを放る部分は流用できるはずなので
"IBCのTileEntity"
"上記TEの自作ベースクラス"

私のModは全てMMPLでソース全文を公開していて、他のModderが流用できるようにしてあるので、参考にしていただいてかまわないです
(ただし読解力は自前で用意してください)
海外の有名Modなどもオープンなライセンスでソースを公開しているModであれば参考にして真似たり出来ます
正直、バニラで行き詰まる場合はModのソースを漁ったほうがわかりやすいこともあります。似た機能のあるModに心当たりがあれば、どんな造りで作られているのか参考になるかもしれません
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:181c41c1
ラピスラズリ収集家
 
記事: 1105
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.311201)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by リクト » 2017年12月09日(土) 22:11

defeatedcrow さんが書きました:私でも数日掛かるな~という内容を、わからないなりに手早く済ませようとして地雷を踏んでいる案件に見えるので、そこそこ長期戦になると思います
私の解答を読解できないレベルと見受けられますので、こちらは基礎を分かる前提であれこれと書いていましたが、どうも無駄みたいですね
質問文の情報欠落も激しく、筆談での質問自体ぶっちゃけかなり苦手な方と見えるので、ちょっと一旦整理します

お付き合いいただけるなら、ソースを全文公開してください。こちらで開発環境作って動作チェックしないと埒が明かないです。
面倒だなーと思えば断っていただいても結構です、私もそれ以上深入りしません。


あと一応聞きますがコレ、どこまであなたのソースですか?
ある程度は元Modのコピペなんですかね?
どこまでが元ソースなのかわからないのですが、どうも移植元のソースの記述の癖にも苦戦しているように見えるので…


ちなみに、例が入用ならHaCのIBC辺りが比較的近そうなのでどうぞ
IBCが持っているのは液体情報ですが、更新時にパケットを放る部分は流用できるはずなので
"IBCのTileEntity"
"上記TEの自作ベースクラス"

私のModは全てMMPLでソース全文を公開していて、他のModderが流用できるようにしてあるので、参考にしていただいてかまわないです
(ただし読解力は自前で用意してください)
海外の有名Modなどもオープンなライセンスでソースを公開しているModであれば参考にして真似たり出来ます
正直、バニラで行き詰まる場合はModのソースを漁ったほうがわかりやすいこともあります。似た機能のあるModに心当たりがあれば、どんな造りで作られているのか参考になるかもしれません

すみません、1.7.10でもTileEntityにあまり触れてこなかったうえに1.10.2への移植くらい適当にやればできると思って一切の基礎知識なくやってきました
こちら、ソースになります、http://www.mediafire.com/file/i7f110hw7pcuoui/Manaita_Plus-2.0.0-sources.jar(ファイルをMediaFire上から削除しました)
似たようなModのソースを漁るのは1.7.10のころはやっていたのですが1.10.2のModdingどころかModの知識すらまともにないので参考にしたくてもできない状態でした、わざわざありがとうございます
回答してくださっている方の恩義をわざわざ断るなんてこと絶対にしません、よろしくお願いします
あと、ソースは
リクト さんが書きました:TileEntityHookクラス
コード: 全て選択
package laru.manaita_plus.tileentity;

import javax.annotation.Nullable;

import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;

public class TileEntityHook extends TileEntity {

   private ItemStack item;

   public TileEntityHook() {}

    public TileEntityHook(ItemStack itemStack)
    {
        this.item = itemStack;
    }

   public ItemStack getStack() {
      return this.item;
   }

   public ItemStack clearStack() {
      if (this.item != null) {
         ItemStack ItemStack = this.item;
         this.item = null;
         return ItemStack;
      }
      return null;
   }

   public void setStack(ItemStack itemStack) {
      this.item = itemStack;
      if (itemStack != null) {
         itemStack.stackSize = 1;
      }
   }

   public void readFromNBT(NBTTagCompound nbtTagCompound) {
      super.readFromNBT(nbtTagCompound);
      this.item = ItemStack.loadItemStackFromNBT((NBTTagCompound)nbtTagCompound.getTag("Item"));
   }

   public NBTTagCompound writeToNBT(NBTTagCompound nbtTagCompound) {
      super.writeToNBT(nbtTagCompound);
      NBTTagCompound nbtTagCompound1 = new NBTTagCompound();
      if (this.item != null) {
         this.item.writeToNBT(nbtTagCompound1);
      }
      return nbtTagCompound1;
   }

   @Nullable
   public SPacketUpdateTileEntity getUpdatePacket() {
      return new SPacketUpdateTileEntity(this.pos, this.getBlockMetadata(), this.getUpdateTag());
   }

   public NBTTagCompound getUpdateTag() {
      return this.writeToNBT(new NBTTagCompound());
   }
}

のうち
コード: 全て選択
@Nullable
public SPacketUpdateTileEntity getUpdatePacket() {
  return new SPacketUpdateTileEntity(this.pos, this.getBlockMetadata(), this.getUpdateTag());
}

public NBTTagCompound getUpdateTag() {
  return this.writeToNBT(new NBTTagCompound());
}

以外は1.7.10の使いまわしで、
リクト さんが書きました:BlockHookクラス
コード: 全て選択
package laru.manaita_plus.block;

import java.util.List;

import javax.annotation.Nullable;

import laru.manaita_plus.ManaitaPlus;
import laru.manaita_plus.core.ManaitaPlusBlockCore;
import laru.manaita_plus.tileentity.TileEntityHook;
import laru.manaita_plus.util.ManaitaPlusGuiID;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.BlockHorizontal;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumBlockRenderType;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.ChunkCache;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BlockHook extends BlockContainer {

   public static final PropertyDirection FACING = BlockHorizontal.FACING;
   public static final PropertyEnum<BlockHook.EnumManaitaType> MANAITA = PropertyEnum.<BlockHook.EnumManaitaType>create("manaita", BlockHook.EnumManaitaType.class);
   protected static final AxisAlignedBB NORTH_AABB = new AxisAlignedBB(0.0F, 0.0F, 0.875F, 1.0F, 1.0F, 1.0F);
   protected static final AxisAlignedBB SOUTH_AABB = new AxisAlignedBB(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.125F);
   protected static final AxisAlignedBB WEST_AABB = new AxisAlignedBB(0.875F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
   protected static final AxisAlignedBB EAST_AABB = new AxisAlignedBB(0.0F, 0.0F, 0.0F, 0.125F, 1.0F, 1.0F);

   public BlockHook() {
      super(Material.CIRCUITS);
      this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(MANAITA, BlockHook.EnumManaitaType.EMPTY));
      setCreativeTab(ManaitaPlus.tabManaitaPlus);
   }

   public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
      EnumFacing enumFacing = (EnumFacing)state.getValue(FACING);
      switch (enumFacing) {
      case NORTH:
         return NORTH_AABB;
      case SOUTH:
         return SOUTH_AABB;
      case WEST:
         return WEST_AABB;
      case EAST:
         return EAST_AABB;
      default:
         return null;
      }
   }

   public boolean isFullCube(IBlockState state) {
      return false;
   }

   public boolean isOpaqueCube(IBlockState state) {
      return false;
   }

   public EnumBlockRenderType getRenderType(IBlockState state) {
      return EnumBlockRenderType.MODEL;
   }

   public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) {
      if (world.isRemote) {
         return true;
      }
      TileEntityHook tileEntity = (TileEntityHook)world.getTileEntity(pos);
      if (tileEntity != null) {
         if (tileEntity.getStack() == null) {
            ItemStack itemStack = player.getHeldItemMainhand();
            if ((itemStack != null) && (itemStack.getItem() instanceof ItemBlockManaita)) {
               tileEntity.setStack(new ItemStack(itemStack.getItem(), 1, itemStack.getItemDamage()));
               tileEntity.markDirty();
               world.notifyBlockUpdate(pos, state, state, 3);
               if (!player.capabilities.isCreativeMode) {
                  itemStack.stackSize -= 1;
               }
            }
         }
         else if (tileEntity.getStack().getItem() == Item.getItemFromBlock(ManaitaPlusBlockCore.CraftingManaita)) {
            if (player.isSneaking()) {
               EntityItem entityItem = new EntityItem(world, player.posX, player.posY, player.posZ, tileEntity.getStack());
               if (!player.capabilities.isCreativeMode) {
                  world.spawnEntityInWorld(entityItem);
               }
               tileEntity.clearStack();
               tileEntity.markDirty();
               world.notifyBlockUpdate(pos, state, state, 3);
            }
            else {
               if (world.getBlockState(pos).getBlock() == ManaitaPlusBlockCore.Hook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.CraftingHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.WoodenFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.WoodenCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.StoneFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.StoneCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.IronFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.IronCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.GoldFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.GoldCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.DiamondFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.DiamondCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.EmeraldFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.EmeraldCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.RedstoneFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.RedstoneCraftingFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
            }
         }
         else if (tileEntity.getStack().getItem() == Item.getItemFromBlock(ManaitaPlusBlockCore.FurnaceManaita)) {
            if (player.isSneaking()) {
               EntityItem entityItem = new EntityItem(world, player.posX, player.posY, player.posZ, tileEntity.getStack());
               if (!player.capabilities.isCreativeMode) {
                  world.spawnEntityInWorld(entityItem);
               }
               tileEntity.clearStack();
               tileEntity.markDirty();
               world.notifyBlockUpdate(pos, state, state, 3);
            }
            else {
               if (world.getBlockState(pos) == ManaitaPlusBlockCore.Hook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.FurnaceHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.WoodenFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.WoodenFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.StoneFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.StoneFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.IronFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.IronFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.GoldFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.GoldFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.DiamondFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.DiamondFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.EmeraldFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.EmeraldFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
               else if (world.getBlockState(pos) == ManaitaPlusBlockCore.RedstoneFixedHook) {
                  player.openGui(ManaitaPlus.instance, ManaitaPlusGuiID.RedstoneFurnaceFixedHook, world, pos.getX(), pos.getY(), pos.getZ());
               }
            }
         }
      }
      return true;
   }

   public IBlockState onBlockPlaced(World world, BlockPos pos, EnumFacing enumFacing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase entityLivingBase) {
      EnumFacing enumFacing1 = entityLivingBase.getHorizontalFacing().rotateY();
      return super.onBlockPlaced(world, pos, enumFacing1, hitX, hitY, hitZ, meta, entityLivingBase).withProperty(FACING, enumFacing);
   }

   public boolean canPlaceBlockOnSide(World world, BlockPos pos, EnumFacing enumFacing) {
      switch (enumFacing) {
      case NORTH:
      case SOUTH:
      case EAST:
      case WEST:
         return this.canBePlacedAt(world.getBlockState(pos.offset(enumFacing.getOpposite())));
      default:
         return false;
      }
   }

   private boolean canBePlacedAt(IBlockState state) {
      return state.isFullCube() && state.getMaterial().blocksMovement();
   }

   public void neighborChanged(IBlockState state, World world, BlockPos pos, Block block) {
      EnumFacing enumFacing = (EnumFacing)state.getValue(FACING);
      if (!world.getBlockState(pos.offset(enumFacing.getOpposite())).getMaterial().isSolid()) {
         this.dropBlockAsItem(world, pos, state, 0);
         world.setBlockToAir(pos);
      }
   }

   public IBlockState getStateFromMeta(int meta) {
      EnumFacing enumFacing = null;
      switch (meta) {
      case 1:
         enumFacing = EnumFacing.EAST;
         break;
      case 2:
         enumFacing = EnumFacing.WEST;
         break;
      case 3:
         enumFacing = EnumFacing.SOUTH;
         break;
      case 4:
      default:
         enumFacing = EnumFacing.NORTH;
      }
      return this.getDefaultState().withProperty(FACING, enumFacing);
   }

   public int getMetaFromState(IBlockState state) {
      int i = 0;
      switch ((EnumFacing)state.getValue(FACING)) {
      case EAST:
         i = 1;
         break;
      case WEST:
         i = 2;
         break;
      case SOUTH:
         i = 3;
         break;
      case NORTH:
      default:
         i = 4;
      }
      return i;
   }

   protected BlockStateContainer createBlockState() {
      return new BlockStateContainer(this, new IProperty[] { MANAITA, FACING });
   }

   public TileEntity createNewTileEntity(World world, int meta) {
      return new TileEntityHook();
   }

   public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
      List<ItemStack> ret = super.getDrops(world, pos, state, fortune);
      TileEntityHook tileEntity = (TileEntityHook)world.getTileEntity(pos);
      if ((tileEntity != null) && (tileEntity.getStack() != null)) {
         ret.add(tileEntity.getStack().copy());
      }
      return ret;
   }

   public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest) {
      if (willHarvest) {
         return true;
      }
      return super.removedByPlayer(state, world, pos, player, willHarvest);
   }

   public void harvestBlock(World world, EntityPlayer player, BlockPos pos, IBlockState state, @Nullable TileEntity tileEntity, @Nullable ItemStack itemStack) {
      super.harvestBlock(world, player, pos, state, tileEntity, itemStack);
      world.setBlockToAir(pos);
   }

   public IBlockState getActualState(IBlockState state, IBlockAccess access, BlockPos pos) {
      BlockHook.EnumManaitaType blockHook$enumManaitaType = BlockHook.EnumManaitaType.EMPTY;
      TileEntity tileEntity = access instanceof ChunkCache ? ((ChunkCache)access).getTileEntity(pos, Chunk.EnumCreateEntityType.CHECK) : access.getTileEntity(pos);
      if (tileEntity instanceof TileEntityHook) {
         TileEntityHook tileEntityHook = (TileEntityHook)tileEntity;
         if (tileEntityHook.getStack() != null) {
            Item item = tileEntityHook.getStack().getItem();
            if (item instanceof ItemBlock) {
               int i = tileEntityHook.getStack().getItemDamage();
               Block block = Block.getBlockFromItem(item);
               if (block == ManaitaPlusBlockCore.CraftingManaita) {
                  blockHook$enumManaitaType = blockHook$enumManaitaType.CRAFTING;
               }
               else if (block == ManaitaPlusBlockCore.FurnaceManaita) {
                  blockHook$enumManaitaType = blockHook$enumManaitaType.FURNACE;
               }
            }
         }
      }
      return state.withProperty(MANAITA, blockHook$enumManaitaType);
   }

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

   public static enum EnumManaitaType implements IStringSerializable {

      EMPTY("empty"),
      CRAFTING("crafting"),
      FURNACE("furnace");

      private final String name;

      private EnumManaitaType(String name) {
         this.name = name;
      }

      public String toString() {
         return this.name;
      }

      public String getName() {
         return this.name;
      }
   }
}

はonBlockActivatedメソッド以外は自前で、onBlockActivatedメソッドも少し改変しています
最後に編集したユーザー リクト [ 2017年12月10日(日) 18:25 ], 累計 1 回
Modを沢山導入してマイクラを遊んでます
Manaita PlusとかSacred Treasures of The GoddessとかいくつかModを公開してます
JavaとModding勉強中
凛&花丸推しラブライバー
凛ちゃんまじえんじぇー
アバター
リクト
ID:91225867
石掘り
 
記事: 129
登録日時: 2017年3月17日(金) 13:11

  • (PostNo.311205)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by defeatedcrow » 2017年12月09日(土) 23:05

ありがとうございます、助かります
ちょっとこちらで開発環境組んできます、しばしお待ちを…

1.7→1.10.2ですが、全体的に結構でかい変更が多いです
1.7時点で作ったことがなければ、1.7向けチュートリアルを見ながら作るのもきついものがあるかもなぁ…と思います

TE関係で引っかかりそうなポイントは
・ITichableを実装しないとTick更新しなくなった
・同期パケットが飛ばなくなった
・Block側のStateを変える度にTEの持つNBTがリセットを食らう

かなぁ

私は1、2番目を疑って回答していたんですが、これ、3番目のNBTリセットを食らっている可能性もありそうですね…
(コレに関しては、バニラで追加されるTEかをチェックして、バニラのTEのみ回避するとかいうクソ仕様なので、バニラを真似て作っていると謎のNBTリセットに悩む羽目になります)
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:136eec93
ラピスラズリ収集家
 
記事: 1105
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.311216)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by defeatedcrow » 2017年12月10日(日) 02:21

TileEntityのアイテム保持部分を修正したのでベタ貼りですがお渡ししますね
モデルが表示されないのでコンソールログ上での確認ですが、サバクラで保持Itemが同期されるのは確認できました
ログアウトを跨いでも内容は保持されています

コード: 全て選択
package laru.manaita_plus.tileentity;

import java.util.List;

import javax.annotation.Nullable;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

public class TileEntityHook extends TileEntity implements ITickable {

   private ItemStack item;

   public TileEntityHook() {}

   public TileEntityHook(ItemStack itemStack) {
      this.item = itemStack;
   }

   public ItemStack getStack() {
      return this.item;
   }

   public ItemStack clearStack() {
      if (this.item != null) {
         ItemStack ItemStack = this.item;
         this.item = null;
         markDirty();
         return ItemStack;
      }
      return null;
   }

   public void setStack(ItemStack itemStack) {
      this.item = itemStack;
      if (itemStack != null) {
         itemStack.stackSize = 1;
      }
      markDirty();
   }

   /* read、writeでItemStackに付けたタグ名の不一致 */
   @Override
   public void readFromNBT(NBTTagCompound nbtTagCompound) {
      super.readFromNBT(nbtTagCompound);
      if (nbtTagCompound.hasKey("Item"))
         this.item = ItemStack.loadItemStackFromNBT((NBTTagCompound) nbtTagCompound.getTag("Item"));
   }

   @Override
   public NBTTagCompound writeToNBT(NBTTagCompound nbtTagCompound) {
      super.writeToNBT(nbtTagCompound);
      nbtTagCompound.setTag("Item", new NBTTagCompound());
      if (this.item != null) {
         this.item.writeToNBT(nbtTagCompound.getCompoundTag("Item"));
      }
      return nbtTagCompound;
   }

   @Override
   public void markDirty() {
      super.markDirty();
   }

   @Override
   @Nullable
   public SPacketUpdateTileEntity getUpdatePacket() {
      NBTTagCompound nbtTagCompound = new NBTTagCompound();
      this.writeToNBT(nbtTagCompound);
      return new SPacketUpdateTileEntity(pos, this.getBlockMetadata(), nbtTagCompound);
   }

   @Override
   public NBTTagCompound getUpdateTag() {
      return this.writeToNBT(new NBTTagCompound());
   }

   @Override
   public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
      this.readFromNBT(pkt.getNbtCompound());
   }

   /**
    * @author defeatedcrow
    * @date 2007.12.10
    */

   /* === Update処理部分 === */
   /* === packetを高頻度で送信するとラグが激しいため、最低限の送受信頻度にする === */

   /*
    * インベントリチェックは1回/秒程度でも違和感がないので20Tickごとにするが、
    * 遅延が気になる場合はこの数値を小さくしてもOK
    */
   public int coolTime = 20;

   protected int getMaxCool() {
      return 20;
   }

   /* 直前の保持Item情報を記憶しておくもの */
   private int lastItem = -1;

   @Override
   public void update() {
      if (coolTime > 0) {
         coolTime--;
      } else {
         /* coolTimeカウントが0のとき、鯖側でメソッドを呼ぶ */
         if (!worldObj.isRemote) {
            onServerUpdate();
         }
         coolTime = getMaxCool();

         /* 動作確認用ログ */
         // if (item != null)
         // LOGGER.info("Current manaita " + item.toString());
         // else
         // LOGGER.info("No manaita");
      }
   }

   /* update処理 */
   protected void onServerUpdate() {
      int currentItem = item == null ? -1 : item.getItem().hashCode() + item.getItemDamage();
      if (lastItem != currentItem) {
         lastItem = currentItem;

         /* 同期用パケットを投げる */
         if (!this.hasWorldObj())
            return;
         @SuppressWarnings("unchecked")
         List<EntityPlayer> list = this.getWorld().playerEntities;
         for (EntityPlayer player : list) {
            if (player instanceof EntityPlayerMP) {
               ((EntityPlayerMP) player).connection.sendPacket(this.getUpdatePacket());
            }
         }
      }
   }

   /* NBTリセット対策のおまじない */

   @Override
   public void invalidate() {
      super.invalidate();
      this.updateContainingBlockInfo();
   }

   @Override
   public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newSate) {
      return (oldState.getBlock() != newSate.getBlock());
   }

   /* 動作確認用に作ったLoggerインスタンス、消してOK */
   public static final Logger LOGGER = LogManager.getLogger("Manaita");

}


上記以外にミスがいくつかあるので、そっちは別途修正してください↓

起動時のコンソールログに詳細が出ていますが、BlockHookのblockstate.jsonに方向4パターン分しかモデルが記述されていません
ですが、あれはfacing ✕ manaita で計16パターンのモデルを設定しないと適用されないです

コード: 全て選択
[Client thread/ERROR] [FML]: Exception loading model for variant manaitaplus:DiamondFixedHook#facing=east,manaita=crafting for blockstate "manaitaplus:DiamondFixedHook[facing=east,manaita=crafting]"


Forgeがこういうログを出してくれているので、でなくなるようにblockstate用のjsonファイルを修正すると良いです

blockstate用jsonの例(Propertiesは方角4種✕タイプ4種の似た構成です)も一応置いときます
HaCの庇のblockstate用json
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:29b92d8c
ラピスラズリ収集家
 
記事: 1105
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.311224)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by リクト » 2017年12月10日(日) 13:03

defeatedcrow さんが書きました:TileEntityのアイテム保持部分を修正したのでベタ貼りですがお渡ししますね
モデルが表示されないのでコンソールログ上での確認ですが、サバクラで保持Itemが同期されるのは確認できました
ログアウトを跨いでも内容は保持されています

コード: 全て選択
package laru.manaita_plus.tileentity;

import java.util.List;

import javax.annotation.Nullable;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

public class TileEntityHook extends TileEntity implements ITickable {

   private ItemStack item;

   public TileEntityHook() {}

   public TileEntityHook(ItemStack itemStack) {
      this.item = itemStack;
   }

   public ItemStack getStack() {
      return this.item;
   }

   public ItemStack clearStack() {
      if (this.item != null) {
         ItemStack ItemStack = this.item;
         this.item = null;
         markDirty();
         return ItemStack;
      }
      return null;
   }

   public void setStack(ItemStack itemStack) {
      this.item = itemStack;
      if (itemStack != null) {
         itemStack.stackSize = 1;
      }
      markDirty();
   }

   /* read、writeでItemStackに付けたタグ名の不一致 */
   @Override
   public void readFromNBT(NBTTagCompound nbtTagCompound) {
      super.readFromNBT(nbtTagCompound);
      if (nbtTagCompound.hasKey("Item"))
         this.item = ItemStack.loadItemStackFromNBT((NBTTagCompound) nbtTagCompound.getTag("Item"));
   }

   @Override
   public NBTTagCompound writeToNBT(NBTTagCompound nbtTagCompound) {
      super.writeToNBT(nbtTagCompound);
      nbtTagCompound.setTag("Item", new NBTTagCompound());
      if (this.item != null) {
         this.item.writeToNBT(nbtTagCompound.getCompoundTag("Item"));
      }
      return nbtTagCompound;
   }

   @Override
   public void markDirty() {
      super.markDirty();
   }

   @Override
   @Nullable
   public SPacketUpdateTileEntity getUpdatePacket() {
      NBTTagCompound nbtTagCompound = new NBTTagCompound();
      this.writeToNBT(nbtTagCompound);
      return new SPacketUpdateTileEntity(pos, this.getBlockMetadata(), nbtTagCompound);
   }

   @Override
   public NBTTagCompound getUpdateTag() {
      return this.writeToNBT(new NBTTagCompound());
   }

   @Override
   public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
      this.readFromNBT(pkt.getNbtCompound());
   }

   /**
    * @author defeatedcrow
    * @date 2007.12.10
    */

   /* === Update処理部分 === */
   /* === packetを高頻度で送信するとラグが激しいため、最低限の送受信頻度にする === */

   /*
    * インベントリチェックは1回/秒程度でも違和感がないので20Tickごとにするが、
    * 遅延が気になる場合はこの数値を小さくしてもOK
    */
   public int coolTime = 20;

   protected int getMaxCool() {
      return 20;
   }

   /* 直前の保持Item情報を記憶しておくもの */
   private int lastItem = -1;

   @Override
   public void update() {
      if (coolTime > 0) {
         coolTime--;
      } else {
         /* coolTimeカウントが0のとき、鯖側でメソッドを呼ぶ */
         if (!worldObj.isRemote) {
            onServerUpdate();
         }
         coolTime = getMaxCool();

         /* 動作確認用ログ */
         // if (item != null)
         // LOGGER.info("Current manaita " + item.toString());
         // else
         // LOGGER.info("No manaita");
      }
   }

   /* update処理 */
   protected void onServerUpdate() {
      int currentItem = item == null ? -1 : item.getItem().hashCode() + item.getItemDamage();
      if (lastItem != currentItem) {
         lastItem = currentItem;

         /* 同期用パケットを投げる */
         if (!this.hasWorldObj())
            return;
         @SuppressWarnings("unchecked")
         List<EntityPlayer> list = this.getWorld().playerEntities;
         for (EntityPlayer player : list) {
            if (player instanceof EntityPlayerMP) {
               ((EntityPlayerMP) player).connection.sendPacket(this.getUpdatePacket());
            }
         }
      }
   }

   /* NBTリセット対策のおまじない */

   @Override
   public void invalidate() {
      super.invalidate();
      this.updateContainingBlockInfo();
   }

   @Override
   public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newSate) {
      return (oldState.getBlock() != newSate.getBlock());
   }

   /* 動作確認用に作ったLoggerインスタンス、消してOK */
   public static final Logger LOGGER = LogManager.getLogger("Manaita");

}


上記以外にミスがいくつかあるので、そっちは別途修正してください↓

起動時のコンソールログに詳細が出ていますが、BlockHookのblockstate.jsonに方向4パターン分しかモデルが記述されていません
ですが、あれはfacing ✕ manaita で計16パターンのモデルを設定しないと適用されないです

コード: 全て選択
[Client thread/ERROR] [FML]: Exception loading model for variant manaitaplus:DiamondFixedHook#facing=east,manaita=crafting for blockstate "manaitaplus:DiamondFixedHook[facing=east,manaita=crafting]"


Forgeがこういうログを出してくれているので、でなくなるようにblockstate用のjsonファイルを修正すると良いです

blockstate用jsonの例(Propertiesは方角4種✕タイプ4種の似た構成です)も一応置いときます
HaCの庇のblockstate用json

ありがとうございます!日付が2007年になってるのはミスですよね?そこだけ改変して使わせていただきます!InfoのauthorListにも追加させてもらいますが、嫌でしたら削除しますので言ってください
それからjsonはHook.json以外のフックはわざと方向だけにしてます、というのもjsonの記述方法が間違っている可能性もあると思っていたので間違っていたときに全て改変せずに済むようにHook.jsonのみにmanaitaのモデルを書いてました
Hook.jsonは最初の記事のこれから全く改変していません
リクト さんが書きました:Hook.json(blockstates)
コード: 全て選択
{
   "variants": {
      "facing=east, manaita=empty": {
         "model": "manaitaplus:Hook"
      },
      "facing=south, manaita=empty": {
         "model": "manaitaplus:Hook",
         "y": 90
      },
      "facing=west, manaita=empty": {
         "model": "manaitaplus:Hook",
         "y": 180
      },
      "facing=north, manaita=empty": {
         "model": "manaitaplus:Hook",
         "y": 270
      },
      "facing=east, manaita=crafting": {
         "model": "manaitaplus:Hook_Crafting"
      },
      "facing=south, manaita=crafting": {
         "model": "manaitaplus:Hook_Crafting",
         "y": 90
      },
      "facing=west, manaita=crafting": {
         "model": "manaitaplus:Hook_Crafting",
         "y": 180
      },
      "facing=north, manaita=crafting": {
         "model": "manaitaplus:Hook_Crafting",
         "y": 270
      },
      "facing=east, manaita=furnace": {
         "model": "manaitaplus:Hook_Furnace"
      },
      "facing=south, manaita=furnace": {
         "model": "manaitaplus:Hook_Furnace",
         "y": 90
      },
      "facing=west, manaita=furnace": {
         "model": "manaitaplus:Hook_Furnace",
         "y": 180
      },
      "facing=north, manaita=furnace": {
         "model": "manaitaplus:Hook_Furnace",
         "y": 270
      }
   }
}

modelsにHook_Crafting.jsonとHook_Furnace.jsonがないのは後で追加しようとしていたからです
しかしこれでもテクスチャは反映されませんでした(というより最初の記事の時の動作に戻った)
まだ足りないところがあるんですか…?
それと作業まな板をかけて右クリックするとインベントリがバグるのも直っていません、動画で送るつもりでしたがソースを送ったのでいらないですかね?
実際にやって試してほしいのですが、文で書くと
作業まな板をかけたフックを右クリックするとインベントリのアイテムが別スロットに移動するが、移動しているのは描画だけで実際は移動していないため作業まな板を置いても別ブロックが置かれるといった現象が起きる
フックにかけていない作業まな板等のGUIを開くことで正常な描画に戻る

という感じです
やはりPropertyを正常に追加できてないんでしょうか?
一応フック関係の登録をしているクラスは、core/ManaitaPlusBlockCore.class(BlockとTileEntityの登録)とproxy/ClientProxy.class(Modelの登録)です
Modを沢山導入してマイクラを遊んでます
Manaita PlusとかSacred Treasures of The GoddessとかいくつかModを公開してます
JavaとModding勉強中
凛&花丸推しラブライバー
凛ちゃんまじえんじぇー
アバター
リクト
ID:91225867
石掘り
 
記事: 129
登録日時: 2017年3月17日(金) 13:11

  • (PostNo.311237)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by defeatedcrow » 2017年12月10日(日) 17:11

とりあえずまとめます

●設置してもモデルが機能していない
blockstateのjsonの記述ミスです
コード: 全て選択
"facing=east, manaita=empty"

おそらく見やすくするために、","の後ろにスペースを空けたようですが、スペースも律儀に文字列としてカウントされてしまいます
コード: 全て選択
"facing=east,manaita=empty"

間をきちんと詰めましょう

●木フック以外のフックのblockstate用jsonエラー
blockstate用jsonファイルの記述内容は、任意で設定を書かない限りは、Blockが持つPropertyの総当りパターンを要求するようにMC本体側がblockstate用jsonの構成を指定してきて、わずかでも間違っているとモデルが機能しなくなります

>Hook.json以外のフックはわざと方向だけにしてます
>Hook.jsonのみにmanaitaのモデルを書いてました
これが原因で、ソース側の指定したblockstate用jsonの要求を満たしていないのでエラーを吐きまくっています
そのせいでHook.jsonのエラーログが流れてしまっていて解読できてないです

Hook.jsonは前述のスペースを削除すれば動きましたので、他も同じようにすればエラーは消えると思います


●開いたGUIの不具合
>作業まな板をかけたフックを右クリックするとインベントリのアイテムが別スロットに移動するが、移動しているのは描画だけで実際は移動していないため作業まな板を置いても別ブロックが置かれるといった現象が起きる
フックにかけていない作業まな板等のGUIを開くことで正常な描画に戻る

木Hookにまないたを引っ掛けてGUIを開くと64倍の効果が出ますが、言いたいのはそれのことですかね?
これについてはモデルやTEとは関係ない別件です
GUIの実装周りの問題

コード: 全て選択
else if (world.getBlockState(pos) == ManaitaPlusBlockCore.WoodenFixedHook)

これ、BlockStateとBlockの比較になっちゃってます、.getBlock()のつけ忘れ

とりあえずクラフトまないたの倍率は素材の設定値通りに出ていましたので問題ないと思います
クラフト処理もちゃんと出来ましたよ?

正直、if elseのだーっと並んだ記述は可読性があんまりよくないです、ミスが有っても見落としやすいかもしれません
気をつけてみてください

そうではなくて、GUIを開いている間だけスロットの位置がずれるとかそういう話であれば、Continerクラスでスロットの番号と位置の設定をしたときの記述ミスだと思います
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:181c41c1
ラピスラズリ収集家
 
記事: 1105
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.311241)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by defeatedcrow » 2017年12月10日(日) 17:23

私の書いたソースの扱いですが、今回は特にライセンス宣言はしませんのでご自由にどうぞ
(何かしら必要そうなら、修正BSDとします、制限が少ないので)
名前を何処かに載せるのであれば構いません、mcmod.infoのクレジット部分とか、適当な場所で良いと思います
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:181c41c1
ラピスラズリ収集家
 
記事: 1105
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.311251)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by リクト » 2017年12月10日(日) 18:22

ご指摘いただいた箇所を修正したところGUIも無事動作し、欠損テクスチャも表示されなくなりました!まさか空白を開けてはいけないなんて思いもしませんでした、本当に感謝です
と、言いたいところなんですが、jsonを一通り書いて動作確認してもまな板をかけてもテクスチャの更新が行われず、1秒ごとに同期するからラグがあるのかな?と思って待っていたんですが数十秒経っても更新されず、おかしいなと思い隣にフックを新しく設置すると更新されました
それで検証してみたところ、どうやらフックを設置したチャンク内でブロックが設置される、破壊される等の更新が行われない限りフックのテクスチャが更新されないようです
まだ同期処理に足りないものがあるんでしょうか…?
Modを沢山導入してマイクラを遊んでます
Manaita PlusとかSacred Treasures of The GoddessとかいくつかModを公開してます
JavaとModding勉強中
凛&花丸推しラブライバー
凛ちゃんまじえんじぇー
アバター
リクト
ID:91225867
石掘り
 
記事: 129
登録日時: 2017年3月17日(金) 13:11

  • (PostNo.311252)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by リクト » 2017年12月10日(日) 18:27

ついでと言っちゃなんですが、jsonを一通り書いたものになります、見納めください
http://www.mediafire.com/file/5ura3r3s5oc67w8/Manaita_Plus-2.0.0-sources.jar(ファイルをMediaFire上から削除しました)
最後に編集したユーザー リクト [ 2017年12月12日(火) 20:21 ], 累計 1 回
Modを沢山導入してマイクラを遊んでます
Manaita PlusとかSacred Treasures of The GoddessとかいくつかModを公開してます
JavaとModding勉強中
凛&花丸推しラブライバー
凛ちゃんまじえんじぇー
アバター
リクト
ID:91225867
石掘り
 
記事: 129
登録日時: 2017年3月17日(金) 13:11

  • (PostNo.311289)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by defeatedcrow » 2017年12月12日(火) 01:50

State変更後、WorldのNotifyメソッドで描画更新を呼ばないと見た目が更新されないままでしたね、失礼しました

ただ、クライアント側がパケットを受け取ってgetActualStateメソッドの内容が変わった直後、というタイミングがTEやBlockのクラスのメソッドからいまいち掴みづらいので、パケット送信時にState変更をあわせて呼んだほうが良さそうですね…
ということで、TEの更新メソッドを改造してきました

コード: 全て選択
/* update処理 */
   protected void onServerUpdate() {
      int currentItem = item == null ? -1 : item.getItem().hashCode() + item.getItemDamage();
      if (lastItem != currentItem) {
         lastItem = currentItem;
         /* 同期用パケットを投げる */
         if (!this.hasWorldObj())
            return;
         @SuppressWarnings("unchecked")
         List<EntityPlayer> list = this.getWorld().playerEntities;
         for (EntityPlayer player : list) {
            if (player instanceof EntityPlayerMP) {
               ((EntityPlayerMP) player).connection.sendPacket(this.getUpdatePacket());
            }
         }

         IBlockState state = worldObj.getBlockState(pos);
         if (state.getBlock() instanceof BlockHook) {
            if (item == null) {
               worldObj.setBlockState(pos, state.withProperty(BlockHook.MANAITA, BlockHook.EnumManaitaType.EMPTY),
                     3);
            } else if (item.getItem() == Item.getItemFromBlock(ManaitaPlusBlockCore.CraftingManaita)) {
               worldObj.setBlockState(pos,
                     state.withProperty(BlockHook.MANAITA, BlockHook.EnumManaitaType.CRAFTING), 3);
            } else if (item.getItem() == Item.getItemFromBlock(ManaitaPlusBlockCore.FurnaceManaita)) {
               worldObj.setBlockState(pos,
                     state.withProperty(BlockHook.MANAITA, BlockHook.EnumManaitaType.FURNACE), 3);
            }
         }
      }
   }


これで動くので試してみてください

まないたを掛けてから見た目に反映するまでの遅延が結構気になるので、更新間隔はもっと狭めても良いかもしれません
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:181c41c1
ラピスラズリ収集家
 
記事: 1105
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.311314)

Re: [1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by リクト » 2017年12月12日(火) 20:20

defeatedcrow さんが書きました:State変更後、WorldのNotifyメソッドで描画更新を呼ばないと見た目が更新されないままでしたね、失礼しました

ただ、クライアント側がパケットを受け取ってgetActualStateメソッドの内容が変わった直後、というタイミングがTEやBlockのクラスのメソッドからいまいち掴みづらいので、パケット送信時にState変更をあわせて呼んだほうが良さそうですね…
ということで、TEの更新メソッドを改造してきました

コード: 全て選択
/* update処理 */
   protected void onServerUpdate() {
      int currentItem = item == null ? -1 : item.getItem().hashCode() + item.getItemDamage();
      if (lastItem != currentItem) {
         lastItem = currentItem;
         /* 同期用パケットを投げる */
         if (!this.hasWorldObj())
            return;
         @SuppressWarnings("unchecked")
         List<EntityPlayer> list = this.getWorld().playerEntities;
         for (EntityPlayer player : list) {
            if (player instanceof EntityPlayerMP) {
               ((EntityPlayerMP) player).connection.sendPacket(this.getUpdatePacket());
            }
         }

         IBlockState state = worldObj.getBlockState(pos);
         if (state.getBlock() instanceof BlockHook) {
            if (item == null) {
               worldObj.setBlockState(pos, state.withProperty(BlockHook.MANAITA, BlockHook.EnumManaitaType.EMPTY),
                     3);
            } else if (item.getItem() == Item.getItemFromBlock(ManaitaPlusBlockCore.CraftingManaita)) {
               worldObj.setBlockState(pos,
                     state.withProperty(BlockHook.MANAITA, BlockHook.EnumManaitaType.CRAFTING), 3);
            } else if (item.getItem() == Item.getItemFromBlock(ManaitaPlusBlockCore.FurnaceManaita)) {
               worldObj.setBlockState(pos,
                     state.withProperty(BlockHook.MANAITA, BlockHook.EnumManaitaType.FURNACE), 3);
            }
         }
      }
   }


これで動くので試してみてください

まないたを掛けてから見た目に反映するまでの遅延が結構気になるので、更新間隔はもっと狭めても良いかもしれません

ありがとうございます!無事動作しました!これにて解決とさせていただきます、もう感謝してもしきれないです、本当にありがとうございました!
それから更新間隔は5tickにしてみました、手頃なModPackで動作テストしたところラグも感じなかったのでこれでいいかなと思ってます

ちなみに動作テストはCraft Of The TitansというModPackでやりました
フック.png
Modを沢山導入してマイクラを遊んでます
Manaita PlusとかSacred Treasures of The GoddessとかいくつかModを公開してます
JavaとModding勉強中
凛&花丸推しラブライバー
凛ちゃんまじえんじぇー
アバター
リクト
ID:91225867
石掘り
 
記事: 129
登録日時: 2017年3月17日(金) 13:11

  • (PostNo.313441)

Re: [解決済][1.10.2]jsonの独自Property変数の追加及びTileEntityについて

投稿記事by リクト » 2018年2月07日(水) 19:00

くだらない報告を
Renderでまな板を表示することにしたのでこのトピックで頂いたソースほとんど消しちゃいました
なんだか申し訳ないですけどこっちのほうが絶対よかったですね
もしもっといいRenderの方法知っていらっしゃったら教えていただければ嬉しいです
今のソースの状況
TileEntityHookクラス
コード: 全て選択
package laru.manaita_plus.tileentity;

import javax.annotation.Nullable;

import net.minecraft.block.state.IBlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

public class TileEntityHook extends TileEntity {

   private ItemStack item;

   public TileEntityHook() {}

   public TileEntityHook(ItemStack itemStack) {
      this.item = itemStack;
   }

   public ItemStack getStack() {
      return this.item;
   }

   public ItemStack clearStack() {
      if (this.item != null) {
         ItemStack ItemStack = this.item;
         this.item = null;
         markDirty();
         return ItemStack;
      }
      return null;
   }

   public void setStack(ItemStack itemStack) {
      this.item = itemStack;
      if (itemStack != null) {
         itemStack.stackSize = 1;
      }
      markDirty();
   }

   /* read、writeでItemStackに付けたタグ名の不一致 */
   public void readFromNBT(NBTTagCompound nbtTagCompound) {
      super.readFromNBT(nbtTagCompound);
      if (nbtTagCompound.hasKey("Item"))
         this.item = ItemStack.loadItemStackFromNBT((NBTTagCompound) nbtTagCompound.getTag("Item"));
   }

   public NBTTagCompound writeToNBT(NBTTagCompound nbtTagCompound) {
      super.writeToNBT(nbtTagCompound);
      nbtTagCompound.setTag("Item", new NBTTagCompound());
      if (this.item != null) {
         this.item.writeToNBT(nbtTagCompound.getCompoundTag("Item"));
      }
      return nbtTagCompound;
   }

   public void markDirty() {
      super.markDirty();
   }

   @Nullable
   public SPacketUpdateTileEntity getUpdatePacket() {
      NBTTagCompound nbtTagCompound = new NBTTagCompound();
      this.writeToNBT(nbtTagCompound);
      return new SPacketUpdateTileEntity(pos, this.getBlockMetadata(), nbtTagCompound);
   }

   public NBTTagCompound getUpdateTag() {
      return this.writeToNBT(new NBTTagCompound());
   }

   public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
      this.readFromNBT(pkt.getNbtCompound());
   }

   /**
    * @author defeatedcrow
    * @date 2017.12.10
    */

   /* NBTリセット対策のおまじない */
   public void invalidate() {
      super.invalidate();
      this.updateContainingBlockInfo();
   }

   public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newSate) {
      return (oldState.getBlock() != newSate.getBlock());
   }
}

RenderHookクラス
コード: 全て選択
package laru.manaita_plus.render;

import javax.annotation.Nonnull;

import laru.manaita_plus.block.BlockHook;
import laru.manaita_plus.tileentity.TileEntityHook;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.util.EnumFacing;

public class RenderHook extends TileEntitySpecialRenderer<TileEntityHook> {

   public void renderTileEntityAt(@Nonnull TileEntityHook tileEntity, double x, double y, double z, float partialTicks, int digProgress) {
      if (!tileEntity.isInvalid()) {
         GlStateManager.pushMatrix();
         GlStateManager.translate(x, y, z);

         if (tileEntity.getStack() != null) {
            Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
            tileEntity.getStack().getItem();
            GlStateManager.pushMatrix();
            switch ((EnumFacing)tileEntity.getWorld().getBlockState(tileEntity.getPos()).getValue(BlockHook.FACING)) {
            case NORTH:
               GlStateManager.translate(0.5F, 0.5F, 0.96875F);
               GlStateManager.rotate(90.0F, 0, 0, 1);
               break;
            case SOUTH:
               GlStateManager.translate(0.5F, 0.5F, 0.03125F);
               GlStateManager.rotate(90.0F, 0, 0, 1);
               break;
            case WEST:
               GlStateManager.translate(0.96875F, 0.5F, 0.5F);
               GlStateManager.rotate(90.0F, 0, 1, 0);
               GlStateManager.rotate(90.0F, 0, 0, 1);
               break;
            case EAST:
               GlStateManager.translate(0.03125F, 0.5F, 0.5F);
               GlStateManager.rotate(90.0F, 0, 1, 0);
               GlStateManager.rotate(90.0F, 0, 0, 1);
               break;
            default:
            }
            Minecraft.getMinecraft().getRenderItem().renderItem(tileEntity.getStack(), ItemCameraTransforms.TransformType.NONE);
            GlStateManager.popMatrix();
         }

         GlStateManager.popMatrix();
      }
   }
}
Modを沢山導入してマイクラを遊んでます
Manaita PlusとかSacred Treasures of The GoddessとかいくつかModを公開してます
JavaとModding勉強中
凛&花丸推しラブライバー
凛ちゃんまじえんじぇー
アバター
リクト
ID:91225867
石掘り
 
記事: 129
登録日時: 2017年3月17日(金) 13:11


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

x