【総合】トピック立てるまでもない質問【Mod制作】

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

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by Waripon » 2017年4月05日(水) 08:26

殴った敵の座標に当たり判定のない爆発を起こすことで自己解決したことをお伝えしておきます。
回答ありがとうございました。
ノリと勢いでModddingにまで手を出してしまった人。(´・ω・`)
トピックはこちら
アバター
Waripon
ID:966159e3
大工さん
 
記事: 62
登録日時: 2016年8月29日(月) 07:25
お住まい: 日本の寒いほう

  • (PostNo.300238)

[1.7.10]assetsフォルダの画像ファイルのサイズの取得方法

投稿記事by HeavyWeaponGuy » 2017年4月10日(月) 00:30

当方,図柄の変更が可能な旗を追加するModの開発を行っています。
この旗エンティティのテキスチャをassets/modid/texture/entity/内部のpngファイルとすることを考えています。
これらのpngファイルの画素サイズは様々ですので、旗のレンダーを呼び出す前のエンティティのコンストラクタで、テキスチャサイズを取得してエンティティのサイズを設定したいと考えました。
そこで、imageIO.read()を利用してpngファイルを読み込み,getWidth(),getHeight()を利用して画素サイズを取得しようと考えたのですが、ImageIO.read()がcan't read input fileの例外を返して来ました。
File()コンストラクタに渡すファイルパスの指定が間違えているのでしょうか?
何卒ご教授お願いします。

Forge 1.7.10 10.13.4.1614
eclipse 4.6.2
uk_nav.pngの修飾名:/Minecraft/src/main/resources/assets/vesselandwarship/textures/entity/uk_nav.png
EntitySimpleFlagの修飾名:/Minecraft/src/main/java/com/vineLadder/vesselandwarship/entity/EntitySimpleFlag.java

//////EntitySimpleFlag.java//////////////////

package com.vineLadder.vesselandwarship.entity;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import net.minecraft.entity.Entity;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;

public class EntitySimpleFlag extends Entity {

//単位はブロック単位
private float width;
private float height;
private int health;
private static int MAX_HEALTH=5;
private BufferedImage texture;

//旗のテキスチャファイル名
private String textureName;


public EntitySimpleFlag(World world) {

//スーパークラスのコンストラクタを忘れずに
super(world);

//テキスチャにしたいpngファイル名
this.textureName="uk_nav.png";
this.checkTextureSize();
this.setSize(width, height);
this.health=this.MAX_HEALTH;
}

private void checkTextureSize(){

String path = "..\\..\\..\\..\\..\\resources\\assets\\vesselandwarship\\textures\\entity\\uk_nav.png";
try {
texture = ImageIO.read(new File(path));
} catch (IOException e) {

System.out.println(path);
e.printStackTrace();

}

this.width=texture.getWidth();
this.height=texture.getHeight();
}


@Override
public void onUpdate() {

//必ずスーパークラスを呼ぶ
super.onUpdate();
}

@Override
public boolean canBeCollidedWith() {

//ollide with another entity
return true;
}

@Override
public boolean canBePushed() {

// dont be pushed by another entity
return false;
}



@Override
public boolean canAttackWithItem() {

return true;
}

@Override
public boolean isPushedByWater() {

// dont be pushed by water
return false;
}

@Override
protected boolean canTriggerWalking() {

//is movable in crops? maybe
return false;
}

@Override
public boolean attackEntityFrom(DamageSource source, float damage) {

if (this.isEntityInvulnerable())
{
return false;
}
else
{
if (!this.isDead && !this.worldObj.isRemote)
{
this.health -= damage;

if (this.health <= 0)
{
this.setDead();
}
}

return true;
}
}



@Override
protected void entityInit() {

//called in Entity();

}

@Override
protected void readEntityFromNBT(NBTTagCompound p_70037_1_) {
// TODO 自動生成されたメソッド・スタブ

}

@Override
protected void writeEntityToNBT(NBTTagCompound p_70014_1_) {
// TODO 自動生成されたメソッド・スタブ

}

}

///////////////////////////////////////////

///////例外時のスタックトレース//////////////
[00:27:48] [Server thread/INFO] [STDOUT]: [com.vineLadder.vesselandwarship.entity.EntitySimpleFlag:checkTextureSize:46]: ..\..\..\..\..\resources\assets\vesselandwarship\textures\entity\uk_nav.png
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: javax.imageio.IIOException: Can't read input file!
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at javax.imageio.ImageIO.read(Unknown Source)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at com.vineLadder.vesselandwarship.entity.EntitySimpleFlag.checkTextureSize(EntitySimpleFlag.java:43)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at com.vineLadder.vesselandwarship.entity.EntitySimpleFlag.<init>(EntitySimpleFlag.java:34)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at com.vineLadder.vesselandwarship.item.ItemSimpleFlagPlacer.spawnEntity(ItemSimpleFlagPlacer.java:74)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at com.vineLadder.vesselandwarship.item.ItemSimpleFlagPlacer.onItemUse(ItemSimpleFlagPlacer.java:56)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at net.minecraftforge.common.ForgeHooks.onPlaceItemIntoWorld(ForgeHooks.java:507)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at net.minecraft.item.ItemStack.tryPlaceItemIntoWorld(ItemStack.java:142)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:422)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:593)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)
[00:27:48] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)
////////////////////////////////////////////
HeavyWeaponGuy
ID:ead677b9
 

  • (PostNo.300240)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by elise_blacklab » 2017年4月10日(月) 00:43

HeavyWeaponGuy さんが書きました:こで、imageIO.read()を利用してpngファイルを読み込み,getWidth(),getHeight()を利用して画素サイズを取得しようと考えたのですが、ImageIO.read()がcan't read input fileの例外を返して来ました。
File()コンストラクタに渡すファイルパスの指定が間違えているのでしょうか?

Minecraft実行時のカレントディレクトリはおそらくGame Directoryかどこだかに設定されているはずですので,そこからの相対パスを指定する必要があります.
FMLInjectionData.data()内にGame Directoryを指すminecraftHomeなるFileオブジェクトが格納されているので,ここから辿ると環境に左右されず参照できます.
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:119de41c
掘り廃人
 
記事: 2448
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.300241)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by zyando123 » 2017年4月10日(月) 00:56

HeavyWeaponGuy さんが書きました:こで、imageIO.read()を利用してpngファイルを読み込み,getWidth(),getHeight()を利用して画素サイズを取得しようと考えたのですが、ImageIO.read()がcan't read input fileの例外を返して来ました。
File()コンストラクタに渡すファイルパスの指定が間違えているのでしょうか?


assets内ならばビルドするとjarファイル内に含まれることになるのでFileは使えませんね。
Minecraft.getMinecraft().getResouseManager().getResouse(new ResouseLocation(modid, "texture/entity....")).getInputStream()でInputStreamが取得できるのでそれをImageIO.readに渡すと正常に動作すると思います。
ろくな事を呟かないTwitterアカウント→@zyando79
アバター
zyando123
ID:c7117ea2
石掘り
 
記事: 92
登録日時: 2016年8月29日(月) 13:28

  • (PostNo.300280)

Re: [1.7.10]assetsフォルダの画像ファイルのサイズの取得方法

投稿記事by HeavyWeaponGuy » 2017年4月10日(月) 21:44

zyando123様の方法に従い、String path=((File)FMLInjectionData.data()[6]).getAbsolutePath();でパスを取得したところ,
C:\ShipVessels\eclipse\.が返ってきました。このパスはassetsフォルダ内部のファイルを取得するためのものではなく、
マインクラフトのホームディレクトリ直下の/resourceや/modsフォルダの内容を取得するためのものと理解しました。

また、elise_blacklab様のResourceMangaerを使う方法で画像ファイルのサイズを取得することができました。
ご参考までに、前掲したcheckTextureSize()を下に示します。

zyando123様、elise_blacklab様、ありがとう御座いました。

//////EntitySimpleFlag.java checkTextureSize()/////////

private void checkTextureSize(){

try {

InputStream path;
path = Minecraft.getMinecraft().getResourceManager().getResource(resourceLoc).getInputStream();
texture = ImageIO.read(path);
path.close();

} catch (IOException e) {

System.out.println("failed to load texture for SimpleFlag.");
e.printStackTrace();
texture=null;
}

this.width=texture.getWidth();
this.height=texture.getHeight();
System.out.println("checkTextureSize Fin");
}
HeavyWeaponGuy
ID:ead677b9
 

  • (PostNo.300777)

[1.7.10] 独自コンストラクタを持つエンティティをスポーンができない

投稿記事by vineLadder » 2017年4月19日(水) 14:07

前回ここで質問させていただいたHeavyWeaponGuy改めvineLadderです。

制作した旗エンティティEntitySimpleFlagをワールドにスポーンさせるアイテムItemSimpleFlagをの作成を考えました。
このとき右クリックしたブロックの方向によってエンティティの描画を切り替えたいと考えました。例えば、ブロックの横に対してItemSimpleFlagで右クリックしたとき、そのブロックの面の方向に旗の軸を合わせて描画するといったことです。

このために、EntitySimpleFlagに旗の方向directionと旗の描画のシフト量shiftの引数を追加したコンストラクタを追加しました。

コード: 全て選択
   public EntitySimpleFlag(World world,int direction,float shift) {

      //スーパークラスのコンストラクタを忘れずに
      super(world);

      System.out.println("called EntitySimpleFlag(world,dir,shift)");
      System.out.println("world.isRemote==" + world.isRemote);
      Error err = new Error();
      err.printStackTrace();

      //テキスチャにしたいpngファイル名
      this.textureName="uk_nav.png";
      this.resourceLoc= new ResourceLocation("vesselandwarship","textures/entity/" + this.textureName);
      this.checkTextureSize();
      this.textureScale=1.0f;
      this.setSize(0.5f, 1.0f);
      this.ignoreFrustumCheck=true;   //エンティティが画面内になくても描画する
      this.direction=direction;
      this.shiftAmout=shift;
      System.out.println("initializing : direction=" + this.direction + " shift=" + this.shiftAmout);
   }

ItemSimpleFlagでは、onItemUse()内部で、この独自コンストラクタを呼び出してスポーンする処理を行っています。以下がItemSimpleFlagの内容です。
コード: 全て選択
package com.vineLadder.vesselandwarship.item;

import com.vineLadder.vesselandwarship.entity.EntitySimpleFlag;

import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Facing;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.World;

public class ItemSimpleFlag extends Item {

   private String unlocalizedName="simpleFlag";
   private int range=10;

   public ItemSimpleFlag(){

      this.maxStackSize=16;
      this.setCreativeTab(CreativeTabs.tabMisc);
      this.setUnlocalizedName(this.unlocalizedName);
      this.setTextureName("vineladder.shipsandvessels:" + this.unlocalizedName);
   }

   @Override
   public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {

        if (world.isRemote)
        {
           return stack;

        }else{

           MovingObjectPosition mop = Minecraft.getMinecraft().renderViewEntity.rayTrace(range, 1.0F);
           if(mop != null)
           {
              //Bottom = 0, Top = 1, East = 2, West* = 3, North = 4, South = 5
               int side = mop.sideHit;      //ブロックの叩いたside
               int x=mop.blockX;
               int y=mop.blockY;
               int z=mop.blockZ;
               Block blockLookingAt = world.getBlock(x,y,z);   //見ているブロック

               float shift=0.0f;
               int direction=0;

             x += Facing.offsetsXForSide[side];   //指定のsideにあるブロックの座標を指定するためのオフセット量
             y += Facing.offsetsYForSide[side];   //
             z += Facing.offsetsZForSide[side];   //取得したオフセット量を座標に足すことで、sideに隣接したブロックの座標を取得

             switch(side){
             default:

                //上下方向から叩いても何もスポーンさせない
                return stack;

             case 2:   //北からクリック
                direction=0;   //南に軸を設定
                break;
             case 3:   //南からクリック
                direction=2;
                break;
             case 4: //西からクリック
                direction=3;
                break;
             case 5: //東からクリック
                direction=1;
                break;
             }

             if(blockLookingAt.getRenderType() == 11){

                //クリック対象のブロックがフェンスならば、フェンス用のシフト量を設定
                shift=EntitySimpleFlag.SHIFT_FOR_FENCE;
             }else{
                shift=0.0f;
             }

             EntitySimpleFlag entity = new EntitySimpleFlag(world, direction, shift);
             entity.setLocationAndAngles((double)x+0.5d,(double)y,(double)z+0.5d, 0.0f, 0.0f);
             world.spawnEntityInWorld(entity);

             System.out.println("direction=" + direction +"shift=" + shift);

             if(entity !=null){
                if(!player.capabilities.isCreativeMode){

                   --stack.stackSize;
                }
             }
           }
        }
        return stack;
    }
}


RenderではEntitySimpleFlag.directionやEntitySimpleFlag.shiftAmoutを元に描画を切り替えさせています。

これらのコードを実際に試してみたところ、ItemSimpleFlagを使用して実際にスポーンしたEntityは、ブロックをクリックした方向にかかわらず、常にデフォルトの方向を向いていることがわかりました。

その後、デバッグで分かったこととして、EntitySimPleFlagのコンストラクタは二回呼び出されていて、一回目はclient側で独自コンストラクタを呼び出していること、二回目はserver側で、Entityクラスで提供される引数がworldのみのコンストラクタが呼び出されていました。

ここで質問として、実際のworldにスポーンするエンティティに独自コンストラクタを呼び出させるにはどうすればいいでしょうか。

環境

Forge 1.7.10 10.13.4.1614
eclipse 4.6.2

ソースコード

EntitySimpleFlag
https://github.com/HerMajesticJapaneseB ... eFlag.java
ItemSimpleFlag
https://github.com/HerMajesticJapaneseB ... eFlag.java
RenderSimpleFlag
https://github.com/HerMajesticJapaneseB ... eFlag.java

参考として、ItemSimpleFlagを使用してEntitySimpleFlagをスポーンさせたときにのコンソールを下に示します。

コード: 全て選択
[com.vineLadder.vesselandwarship.entity.EntitySimpleFlag:<init>:41]: called EntitySimpleFlag(world,dir,shift)
[13:40:50] [Server thread/INFO] [STDOUT]: [com.vineLadder.vesselandwarship.entity.EntitySimpleFlag:<init>:42]: world.isRemote==false
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: java.lang.Error
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at com.vineLadder.vesselandwarship.entity.EntitySimpleFlag.<init>(EntitySimpleFlag.java:43)
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at com.vineLadder.vesselandwarship.item.ItemSimpleFlag.onItemRightClick(ItemSimpleFlag.java:82)
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.item.ItemStack.useItemRightClick(ItemStack.java:164)
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.server.management.ItemInWorldManager.tryUseItem(ItemInWorldManager.java:345)
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:576)
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)
[13:40:50] [Server thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)
[13:40:50] [Server thread/INFO] [STDOUT]: [com.vineLadder.vesselandwarship.entity.EntitySimpleFlag:<init>:55]: initializing : direction=1 shift=0.0
[13:40:50] [Server thread/INFO] [STDOUT]: [com.vineLadder.vesselandwarship.item.ItemSimpleFlag:onItemRightClick:86]: direction=1shift=0.0
[13:40:50] [Client thread/INFO] [STDOUT]: [com.vineLadder.vesselandwarship.entity.EntitySimpleFlag:<init>:41]: called EntitySimpleFlag(world,dir,shift)
[13:40:50] [Client thread/INFO] [STDOUT]: [com.vineLadder.vesselandwarship.entity.EntitySimpleFlag:<init>:42]: world.isRemote==true
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]: java.lang.Error
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at com.vineLadder.vesselandwarship.entity.EntitySimpleFlag.<init>(EntitySimpleFlag.java:43)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at com.vineLadder.vesselandwarship.entity.EntitySimpleFlag.<init>(EntitySimpleFlag.java:60)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at java.lang.reflect.Constructor.newInstance(Unknown Source)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at cpw.mods.fml.common.network.internal.EntitySpawnHandler.spawnEntity(EntitySpawnHandler.java:77)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at cpw.mods.fml.common.network.internal.EntitySpawnHandler.channelRead0(EntitySpawnHandler.java:34)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at cpw.mods.fml.common.network.internal.EntitySpawnHandler.channelRead0(EntitySpawnHandler.java:28)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:98)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.client.multiplayer.PlayerControllerMP.updateController(PlayerControllerMP.java:317)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.client.Minecraft.runTick(Minecraft.java:1693)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1039)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.client.Minecraft.run(Minecraft.java:962)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.client.main.Main.main(Main.java:164)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at java.lang.reflect.Method.invoke(Unknown Source)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source)
[13:40:50] [Client thread/INFO] [STDERR]: [java.lang.Throwable$WrappedPrintStream:println:-1]:    at GradleStart.main(Unknown Source)
[13:40:50] [Client thread/INFO] [STDOUT]: [com.vineLadder.vesselandwarship.entity.EntitySimpleFlag:<init>:55]: initializing : direction=0 shift=0.0
[13:40:50] [Client thread/INFO] [STDOUT]: [com.vineLadder.vesselandwarship.entity.EntitySimpleFlag:<init>:61]: called default EntitySimpleFlag


よろしくお願いします。
vineLadder
ID:ead677b9
水から上がったとこ
 
記事: 2
登録日時: 2017年4月18日(火) 10:38

  • (PostNo.300795)

Re: [1.7.10] 独自コンストラクタを持つエンティティをスポーンができない

投稿記事by defeatedcrow » 2017年4月19日(水) 18:38

vineLadder さんが書きました:前回ここで質問させていただいたHeavyWeaponGuy改めvineLadderです。

制作した旗エンティティEntitySimpleFlagをワールドにスポーンさせるアイテムItemSimpleFlagをの作成を考えました。
このとき右クリックしたブロックの方向によってエンティティの描画を切り替えたいと考えました。例えば、ブロックの横に対してItemSimpleFlagで右クリックしたとき、そのブロックの面の方向に旗の軸を合わせて描画するといったことです。


Entityはサーバーサイドでスポーンさせるものですから、持っているパラメータなどの操作も基本的にサーバー側のみで行います。
クライアント側(描画など)に影響させたい場合はパケット操作が必須ですが、
1.7.10のEntityの場合は独自パケットで自力で同期を取らなくても、DataWatcherというクライアントに情報を同期するためのシステムを持っています。
1.7.10のものは、データのID(int)と持たせたいパラメータをentityInit()メソッドで登録し、パラメータのSetterやGetterメソッドを適宜作って取得・更新などを行います。

例としてバニラの矢(飛行中の軌跡に表示されるパーティクル用のcritフラグ)や、オオカミの首輪のカラーなどに利用されているので参考になるんじゃないかと。
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:40fe7ea1
ラピスラズリ収集家
 
記事: 949
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.301243)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by sorasuke » 2017年4月27日(木) 21:23

Minecraft1.10.2,Forge12.18.3.2254にて開発してます
TileEntitySpecialRendererを利用したブロックを追加したのですが、そのブロックのItemBlockのテクスチャが透明になってしまっています
モデルかテクスチャが表示されるようにできないでしょうか
ブロック
https://github.com/sora-suke/MMAU/blob/ ... arker.java
モデル登録等
https://github.com/sora-suke/MMAU/blob/ ... .java#L454
BlockState
https://github.com/sora-suke/MMAU/blob/ ... arker.json
ItemModel
https://github.com/sora-suke/MMAU/blob/ ... arker.json
BlockModel
https://github.com/sora-suke/MMAU/blob/ ... arker.json
動画とかModdingとかやってます
自作MODMoreMaterialsAndUtilities
Youtubeチャンネルsora_sukeのチャンネル
ホームページソラスケのインデックス
Twitter@sora_suke_mc
アバター
sorasuke
ID:746d41ac
鉄鉱掘り
 
記事: 269
登録日時: 2013年7月20日(土) 15:35
お住まい: どこか

  • (PostNo.301511)

Re: [1.7.10] 独自コンストラクタを持つエンティティをスポーンができない

投稿記事by vineLadder » 2017年5月02日(火) 21:58

defeatedcrow さんが書きました:
vineLadder さんが書きました:前回ここで質問させていただいたHeavyWeaponGuy改めvineLadderです。

制作した旗エンティティEntitySimpleFlagをワールドにスポーンさせるアイテムItemSimpleFlagをの作成を考えました。
このとき右クリックしたブロックの方向によってエンティティの描画を切り替えたいと考えました。例えば、ブロックの横に対してItemSimpleFlagで右クリックしたとき、そのブロックの面の方向に旗の軸を合わせて描画するといったことです。


Entityはサーバーサイドでスポーンさせるものですから、持っているパラメータなどの操作も基本的にサーバー側のみで行います。
クライアント側(描画など)に影響させたい場合はパケット操作が必須ですが、
1.7.10のEntityの場合は独自パケットで自力で同期を取らなくても、DataWatcherというクライアントに情報を同期するためのシステムを持っています。
1.7.10のものは、データのID(int)と持たせたいパラメータをentityInit()メソッドで登録し、パラメータのSetterやGetterメソッドを適宜作って取得・更新などを行います。

例としてバニラの矢(飛行中の軌跡に表示されるパーティクル用のcritフラグ)や、オオカミの首輪のカラーなどに利用されているので参考になるんじゃないかと。


ご回答ありがとうございます。

ご教授の通り、EntitySimpleFlagにentityInit()をoverrideして、dataWatcherにクライアントに伝えたいdirection,shift変数を登録しました。
その後、サーバー側で呼ばれる独自コンストラクタEntitySimpleFlag(world,direction,shift)内部でdataWatcherのセッターを呼び出しdirection,shiftの値を登録し、クライアント側のコンストラクタEntitySimpleFlag(world)では、DataWatcherからゲッターを使い,direction,shiftを取得しようと考えました。

テストをしてみたところ、クライアント側コンストラクタEntitySimpleFlag()の内部で呼び出したゲッターが,独自コンストラクタ内部のセッターで設定した値ではなく、entityInit()でdataWathcerを登録した時の初期値を返すことがわかりました。

ここで、dataWatcherのセッターの値に関わらず、ゲッターが初期値のみを返すのは何故でしょうか?

重ね重ねですが宜しくお願いします。

EntitySimpleFlag.java
https://github.com/HerMajesticJapaneseB ... eFlag.java

ItemSimpleFlagPlacer.java (enitityのスポナー)
https://github.com/HerMajesticJapaneseB ... lacer.java
環境

Forge 1.7.10 10.13.4.1614
eclipse 4.6.2
vineLadder
ID:ead677b9
水から上がったとこ
 
記事: 2
登録日時: 2017年4月18日(火) 10:38

  • (PostNo.301516)

Re: [1.7.10] 独自コンストラクタを持つエンティティをスポーンができない

投稿記事by defeatedcrow » 2017年5月03日(水) 00:40

vineLadder さんが書きました:
defeatedcrow さんが書きました:
vineLadder さんが書きました:前回ここで質問させていただいたHeavyWeaponGuy改めvineLadderです。

制作した旗エンティティEntitySimpleFlagをワールドにスポーンさせるアイテムItemSimpleFlagをの作成を考えました。
このとき右クリックしたブロックの方向によってエンティティの描画を切り替えたいと考えました。例えば、ブロックの横に対してItemSimpleFlagで右クリックしたとき、そのブロックの面の方向に旗の軸を合わせて描画するといったことです。


Entityはサーバーサイドでスポーンさせるものですから、持っているパラメータなどの操作も基本的にサーバー側のみで行います。
クライアント側(描画など)に影響させたい場合はパケット操作が必須ですが、
1.7.10のEntityの場合は独自パケットで自力で同期を取らなくても、DataWatcherというクライアントに情報を同期するためのシステムを持っています。
1.7.10のものは、データのID(int)と持たせたいパラメータをentityInit()メソッドで登録し、パラメータのSetterやGetterメソッドを適宜作って取得・更新などを行います。

例としてバニラの矢(飛行中の軌跡に表示されるパーティクル用のcritフラグ)や、オオカミの首輪のカラーなどに利用されているので参考になるんじゃないかと。


ご回答ありがとうございます。

ご教授の通り、EntitySimpleFlagにentityInit()をoverrideして、dataWatcherにクライアントに伝えたいdirection,shift変数を登録しました。
その後、サーバー側で呼ばれる独自コンストラクタEntitySimpleFlag(world,direction,shift)内部でdataWatcherのセッターを呼び出しdirection,shiftの値を登録し、クライアント側のコンストラクタEntitySimpleFlag(world)では、DataWatcherからゲッターを使い,direction,shiftを取得しようと考えました。

テストをしてみたところ、クライアント側コンストラクタEntitySimpleFlag()の内部で呼び出したゲッターが,独自コンストラクタ内部のセッターで設定した値ではなく、entityInit()でdataWathcerを登録した時の初期値を返すことがわかりました。

ここで、dataWatcherのセッターの値に関わらず、ゲッターが初期値のみを返すのは何故でしょうか?

重ね重ねですが宜しくお願いします。

EntitySimpleFlag.java
https://github.com/HerMajesticJapaneseB ... eFlag.java

ItemSimpleFlagPlacer.java (enitityのスポナー)
https://github.com/HerMajesticJapaneseB ... lacer.java
環境

Forge 1.7.10 10.13.4.1614
eclipse 4.6.2


クライアント側のコンストラクタを呼んでいるのがそもそもの間違いなので、呼ばないようにして下さい。
重ねて書きますが、サーバー側のみで行います。

サーバ側でインスタンスを生成→ワールドでスポーン→クライアント側のコンストラクタはMC側が自動で作成して、同期されるデータのみが引き渡される。そういう流れですし、同期処理(サーバから渡されるパケット)以外にクライアント側に反映される情報は渡ってきません。

また、クライアント側にパケットが渡ってくるまで数tickのラグがありますので、スポーン直後にDataWatcherの内容を読もうとしても中身が入っていない可能性があります。ですので、クライアント側のコンストラクタで何か読み込もうとしてもDataWatcherに何も渡ってきていないと思いますよ。
読み取りたい場合は、スポーン直後に空になっていても問題ない設計にするか、LivingEvent等を使ってスポーンから少し経過したころに処理を開始するなどの対策が必要になります。


後もう一つ
「world.isRemote」をサーバー側だと思って処理分岐している様子が見られますが、逆です。
厳密にはサーバー側・クライアント側ともまた違う判定なのですが、サーバー側で処理した良いのであれば!world.isRemoteで、クライアント側で処理したい時にworld.isRemote。
もっと厳重にやりたければproxyを通すほうが安全ですが…

シングルプレイは同PC内に鯖も蔵も立てて行われるため、クライアントからサーバーにアクセスしたり、サーバー側でクライアント側専用処理を読み込んでも動いてしまいます。ですので、こういう間違いがあっても気づかない可能性があります。
余裕があればPC内に鯖を立ててテストプレイすることをおすすめします。(同PC内であれば、ローカルipアドレスでログインできますので、レンタル鯖など頼らなくても一人マルチプレイでテストできます。)


もう一つ
ログを出すのにSystem.out.printlnを使っているみたいですが、
今のForgeはコンソールログにlog4jを使っているので、こちらを使うことをおすすめします
(サーバー側のログかクライアント側のログか明記されるので、わかりやすいと思います)
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:40fe7ea1
ラピスラズリ収集家
 
記事: 949
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.301624)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by gatya1129 » 2017年5月04日(木) 17:36

コード: 全て選択
//import省略

public class InventoryEventHandler {

    private HashMap<String, Long> timeMap = new HashMap<String, Long>();

    @SubscribeEvent
    public void onPlayerHasSpecifiedItem(TickEvent.PlayerTickEvent event) {
        if (event.phase != TickEvent.Phase.START) {
            return;
        }
        if (!event.player.worldObj.isRemote) {
            return;
        }
        EntityPlayer player = event.player;
        long lastTime = timeMap.containsKey(player.getDisplayName()) ? timeMap.get(player.getDisplayName()) : Long.MAX_VALUE;
        long currentTime = System.currentTimeMillis();
        boolean found = false;
        for (ItemStack itemStack : player.inventory.mainInventory) {
            if (itemStack != null && itemStack.getItem() instanceof ItemHogeHoge) {
                found = true;
                break;
            }
        }
        if (!found) {
            if (lastTime == Long.MAX_VALUE) {
                // First time
                timeMap.put(player.getDisplayName(), currentTime);
            } else if (currentTime - lastTime > 2000L) {
                this.onPlayerGetItem(player);
                timeMap.put(player.getDisplayName(), Long.MAX_VALUE);
            }
        } else {
            timeMap.put(player.getDisplayName(), Long.MAX_VALUE);
        }
    }

    private void onPlayerGetItem(EntityPlayer player) {
        if (hasAchievementDiamond(player)){
            player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 40, 1));
        }
    }

    private boolean hasAchievementDiamond(EntityPlayer player) {
        if (player != null) {
            if (player instanceof EntityClientPlayerMP){
                boolean achievement = ((EntityClientPlayerMP)player).getStatFileWriter().hasAchievementUnlocked(AchievementList.diamonds);
                if (achievement) {
                    return true;
                }
            }
        }
        return false;
    }
}


「ItemHogeHogeのインスタンスをインベントリに持っていなく、ダイアモンド!の実績を解除していたら2秒ごとにプレイヤーに移動速度上昇のポーション効果をつける」という処理をしたく、上のコードを書きました。
しかし、ItemHogeHogeを持って、効果が付与されないようにしてもポーション効果が消えません。また、牛乳を飲んでもダメでした。
さらに、ポーション効果が付与されているはずなのに視界が変わったり(うまく説明できなくてすみません)、エフェクトが出たりしません。
どうすればいいでしょうか?ご教授ください。
modの公開をしています。
ProactiveMod他バージョン対応版、整地系ツール追加modなど)
また、簡単なmodの制作依頼も受け付けています。
よかったらどうぞ
Modding歴=Java歴<プログラム歴ッ!
gatya1129
ID:fa4b0917
石掘り
 
記事: 73
登録日時: 2015年2月21日(土) 21:01
お住まい: どこだと思う?ねえ、どこだと思う?

  • (PostNo.301628)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by elise_blacklab » 2017年5月04日(木) 18:33

gatya1129 さんが書きました:「ItemHogeHogeのインスタンスをインベントリに持っていなく、ダイアモンド!の実績を解除していたら2秒ごとにプレイヤーに移動速度上昇のポーション効果をつける」という処理をしたく、上のコードを書きました。
しかし、ItemHogeHogeを持って、効果が付与されないようにしてもポーション効果が消えません。また、牛乳を飲んでもダメでした。
さらに、ポーション効果が付与されているはずなのに視界が変わったり(うまく説明できなくてすみません)、エフェクトが出たりしません。
どうすればいいでしょうか?ご教授ください。

コード: 全て選択
        if (!event.player.worldObj.isRemote) {
            return;
        }

そもそもがServerでの処理を全部カットしてるのでこれ実質何もできてません.
上でも指摘されてますがisRemote==falseがServerで,isRemote==trueがClientです.
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:94062893
掘り廃人
 
記事: 2448
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.301637)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by gatya1129 » 2017年5月04日(木) 19:36

elise_blacklab さんが書きました:
コード: 全て選択
        if (!event.player.worldObj.isRemote) {
            return;
        }

そもそもがServerでの処理を全部カットしてるのでこれ実質何もできてません.
上でも指摘されてますがisRemote==falseがServerで,isRemote==trueがClientです.


コード: 全て選択
if (event.player.worldObj.isRemote) {
     return;
 }

コード: 全て選択
private boolean hasAchievementDiamond(EntityPlayer player) {
    if (player != null) {
        if (player instanceof EntityPlayerMP){
            boolean achievement = ((EntityPlayerMP)player).func_147099_x().hasAchievementUnlocked(AchievementList.diamonds);
            if (achievement) {
                return true;
            }
        }
    }
    return false;
}

このように2箇所のコードを変更したところうまくいきました!
ありがとうございました!
modの公開をしています。
ProactiveMod他バージョン対応版、整地系ツール追加modなど)
また、簡単なmodの制作依頼も受け付けています。
よかったらどうぞ
Modding歴=Java歴<プログラム歴ッ!
gatya1129
ID:fa4b0917
石掘り
 
記事: 73
登録日時: 2015年2月21日(土) 21:01
お住まい: どこだと思う?ねえ、どこだと思う?

  • (PostNo.301678)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by Modding初心者 » 2017年5月05日(金) 14:35

Chatに表示されている文字をClientChatReceivedEventを利用して取得しようと思ったのですが、
ClientChatReceivedEventに含まれているmessageはIChatComponentだったため、componentToJsonを利用して
String型に変換しました。
しかし、Jsonから表示されている文字列のみを抜き出す方法がわからず・・・
どなたか、ご教授お願い致します。
Modding初心者
ID:57e568ac
 

  • (PostNo.301708)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by gatya1129 » 2017年5月05日(金) 21:54

こんにちは、また質問させていただきます。

playerをkillする方法はありませんでしょうか?
開発環境は1.7.10-10.13.4.1614です。
どなたかご教授お願いします。
modの公開をしています。
ProactiveMod他バージョン対応版、整地系ツール追加modなど)
また、簡単なmodの制作依頼も受け付けています。
よかったらどうぞ
Modding歴=Java歴<プログラム歴ッ!
gatya1129
ID:fa4b0917
石掘り
 
記事: 73
登録日時: 2015年2月21日(土) 21:01
お住まい: どこだと思う?ねえ、どこだと思う?

  • (PostNo.301852)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by たいさん » 2017年5月08日(月) 19:01

こんにちは。久しぶりに質問させていただきます。
自分は現在、自分の作成するMODのリアリティを求めるために
いろいろとやっているのですが、石臼をブロック、GUI化するとき、
どうしても突っかかって解決することができません。
どなたか、下の画像を正しく機能させるためのコードを教えていただけませんでしょうか
GuiContainerとContainerクラスの部分がわかりません・・・(´・ω・`)
今のコードを張っておきます。今はラージチェストのコードになっています。
コード: 全て選択
package com.soba.sobamod.gui;

import org.lwjgl.opengl.GL11;

import com.soba.sobamod.tileentity.SobaIshiusuTile;

import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.StatCollector;

public class SobaGuiContainer extends GuiContainer{

   private SobaIshiusuTile tileEntity;
   private static final ResourceLocation GUITEXTURE = new ResourceLocation("noodlesmod:textures/gui/generic_54.png");

   public SobaGuiContainer(EntityPlayer player, SobaIshiusuTile tileEntity) {
      super(new SobaContainer(player, tileEntity));
      this.tileEntity = tileEntity;
      ySize = 222;
   }

   @Override
   protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
      fontRendererObj.drawString(StatCollector.translateToLocal(tileEntity.getInventoryName()), 8, 6, 4210752);
      fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 8, ySize - 96 + 2, 4210752);
   }

   @Override
   protected void drawGuiContainerBackgroundLayer(float tick, int mouseX, int mouseY) {
      GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
      mc.getTextureManager().bindTexture(GUITEXTURE);
      int k = (width - xSize) / 2;
      int l = (height - ySize) / 2;
      this.drawTexturedModalRect(k, l, 0, 0, xSize, ySize);
        }
}

コード: 全て選択
package com.soba.sobamod.gui;

import com.soba.sobamod.tileentity.SobaIshiusuTile;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;

public class SobaContainer extends Container{

   private SobaIshiusuTile tileEntity;
   private static final int index0 = 0;
   private static final int index1 = 54;
   private static final int index2 = 81;
   private static final int index3 = 90;

   public SobaContainer(EntityPlayer player, SobaIshiusuTile tileEntity) {
      this.tileEntity = tileEntity;
      for (int iy = 0; iy < 6; iy++) {
         for (int ix = 0; ix < 9; ix++) {
            this.addSlotToContainer(new Slot(tileEntity, ix + (iy * 9), 8 + (ix * 18), 18 + (iy * 18)));
         }
      }
      for (int iy = 0; iy < 3; iy++) {
         for (int ix = 0; ix < 9; ix++) {
            this.addSlotToContainer(new Slot(player.inventory, ix + (iy * 9) + 9, 8 + (ix * 18), 140 + (iy * 18)));
         }
      }
      for (int ix = 0; ix < 9; ix++) {
         this.addSlotToContainer(new Slot(player.inventory, ix, 8 + (ix * 18), 198));
      }
   }

   @Override
   public boolean canInteractWith(EntityPlayer player) {
      return tileEntity.isUseableByPlayer(player);
   }

   @Override
   public ItemStack transferStackInSlot(EntityPlayer player, int slotNumber) {
      ItemStack itemStack = null;
      Slot slot = (Slot) inventorySlots.get(slotNumber);
      if (slot != null && slot.getHasStack()) {
         ItemStack itemStack1 = slot.getStack();
         itemStack = itemStack1.copy();
         if (index0 <= slotNumber && slotNumber < index1) {
            if (!this.mergeItemStack(itemStack1, index1, index3, true)) {
               return null;
            }
         } else {
            if (!this.mergeItemStack(itemStack1, index0, index1, false)) {
               return null;
            }
         }

         if (itemStack1.stackSize == 0) {
            slot.putStack((ItemStack) null);
         } else {
            slot.onSlotChanged();
         }
         if (itemStack1.stackSize == itemStack.stackSize) {
            return null;
         }
         slot.onPickupFromSlot(player, itemStack1);
      }
      return itemStack;

   }
}

画像
ご教授、よろしくお願いいたします。
アバター
たいさん
ID:208a1a7d
石掘り
 
記事: 136
登録日時: 2014年8月30日(土) 16:48
お住まい: Eclipseの中

  • (PostNo.301910)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by gatya1129 » 2017年5月09日(火) 20:57

gatya1129 さんが書きました:こんにちは、また質問させていただきます。

playerをkillする方法はありませんでしょうか?
開発環境は1.7.10-10.13.4.1614です。
どなたかご教授お願いします。


コード: 全て選択
setHealth(0);

で解決しました。
modの公開をしています。
ProactiveMod他バージョン対応版、整地系ツール追加modなど)
また、簡単なmodの制作依頼も受け付けています。
よかったらどうぞ
Modding歴=Java歴<プログラム歴ッ!
gatya1129
ID:fa4b0917
石掘り
 
記事: 73
登録日時: 2015年2月21日(土) 21:01
お住まい: どこだと思う?ねえ、どこだと思う?

  • (PostNo.302195)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by k2210258 » 2017年5月15日(月) 18:04

かの有名なBalkon's WeaponMod(MC1.7.10バージョン)をマルチでプレイしているのですが、プレイヤー二人以上で顕在化するバグが見つかったので直そうと試みています。しかしデバッグに二人以上必要なので、MODをコンパイルして、友人にDLしてもらって……と、一々協力をお願いしている状況になっています。これでは非効率的なので、一人で、できればeclipseでデバッグしたいのですが、何か方法をご存知の方はいませんか?
k2210258
ID:65eeff4e
 

  • (PostNo.302491)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by anatawa12 » 2017年5月21日(日) 20:16

metadata が、勝手に0になります。
packetを使ってサーバー側でmetaを変えた後、update側から見たら、0担ってます。
説明下手でごめんなさい
ソースコードは下記のurlにあります。
gradle実行時には:RunClientを使ってください。
ログで出て来るs meta:0は、tileentityのupdateを使って、PAPIブロック自身のmetaをlogに流してます。

toBytes meta:4
meta:0
fromBytes meta:4
onMessage meta:4
これらはパケットの送受信時のDataです。
ソースコード(gitlab)
https://gitlab.com/anatawa12/RealCityMod/tree/PAPI
korisan112主催の実況鯖の鯖主になる予定
東方好き(にわかにはいる様な)
東方スキンで活動中
anatawa12
ID:2763f206
木を殴ってる
 
記事: 25
登録日時: 2016年8月06日(土) 12:40

  • (PostNo.302501)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by anatawa12 » 2017年5月21日(日) 22:05

k2210258 さんが書きました:かの有名なBalkon's WeaponMod(MC1.7.10バージョン)をマルチでプレイしているのですが、プレイヤー二人以上で顕在化するバグが見つかったので直そうと試みています。しかしデバッグに二人以上必要なので、MODをコンパイルして、友人にDLしてもらって……と、一々協力をお願いしている状況になっています。これでは非効率的なので、一人で、できればeclipseでデバッグしたいのですが、何か方法をご存知の方はいませんか?

一応方法としては、
コード: 全て選択
minecraft {
    version = "1.7.10-10.13.4.1614-1.7.10"
    runDir = "eclipse"
}

のeclipseの場所を変えて
1.サーバ:eclipse
2.クライアント1:eclipse1
3.クライアント2:eclipse2
の順に起動していけばできるはずです。
ただし、サーバーをオフラインモードにしなければなりません
korisan112主催の実況鯖の鯖主になる予定
東方好き(にわかにはいる様な)
東方スキンで活動中
anatawa12
ID:2763f206
木を殴ってる
 
記事: 25
登録日時: 2016年8月06日(土) 12:40

1つ前へ次へ

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

x