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

フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999

返信する

:
不正プログラムによるアクセスを防ぐため、reCaptcha 認証コードの入力を強制しています。表示されている 2 つのワードをテキストフィールドにご入力ください。

BBCode: OFF
スマイリー: OFF
トピックのレビュー
   

ファイルを添付します

展開ビュー トピックのレビュー: 【総合】トピック立てるまでもない質問【Mod制作】

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

投稿記事 by ユメミノウツツ » 2017年10月17日(火) 20:55

いつも頼ってばっかですがどうしてもわからないのでまたよろしくお願いします。
1.7.10,Forge1558にて、素材にエンチャントされたアイテムを使う方法がわかりません。(完成品にではないです。)素材にエンチャントしたアイテムを要求するMODがこれしか思い浮かばなかったため、抜刀剣MOD(https://github.com/flammpfeil/SlashBlade/blob/1.7/src/main/java/mods/flammpfeil/slashblade/named/Tukumo.java)を参考に書きましたがどうにもダメでした。なおFeItems.moltensteelが素材、ダメージ増加(レベルは問わない)が付いているものを精錬することによってFeItems.steel_ingot_exができるという仕様です。
以下ソース(関係ないアイテムも多いですが一応載せておきます)
コード: 全て選択
package femod.init;

import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;

/** レシピを登録するクラス */
public class FeRecipe {
   
   /** レシピの登録 */
   public static void setAllRecipes() {
      
/*      GameRegistry.addRecipe(new ItemStack(FeItems.xxx),
            new Object[]{"xxx",
                      "xxx",
            Character.valueOf('x'),Items.xxx,});      */
      
/*      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.yyy,1),
            new ItemStack(Items.yyy,1,0),
            new ItemStack(Items.yyy,1,0),
            new ItemStack(Items.yyy,1,0));      */   
      
/*      GameRegistry.addSmelting(FeBlocks.zzz,new ItemStack(Items.xyz),1.0f);      */   
      
      
      /* NBT */
      ItemStack StInEx = new ItemStack(FeItems.moltensteel,1,0);
      NBTTagCompound SIEE = new NBTTagCompound();
      StInEx.setTagCompound(SIEE);
      StInEx.addEnchantment(Enchantment.sharpness, 1);
      
      
      
      /* 素材 */
      //剣の柄
      GameRegistry.addRecipe(new ItemStack(FeItems.hilt),
            new Object[]{"SSS",
                      " S ",
            Character.valueOf('S'),Items.stick,});
      //長い柄
      GameRegistry.addRecipe(new ItemStack(FeItems.shaft),
            new Object[]{" S",
                      "S ",
            Character.valueOf('S'),Items.stick,});
      //鋼鉄インゴット
      GameRegistry.addSmelting(FeItems.pig_iron,new ItemStack(FeItems.steel_ingot),0.7f);
      //銑鉄
      GameRegistry.addRecipe(new ItemStack(FeItems.pig_iron,4),
            new Object[]{" I ",
                      "ICI",
                      " I ",
            Character.valueOf('I'),Items.iron_ingot,
            Character.valueOf('C'),Items.coal,});
      //銀インゴット
      GameRegistry.addSmelting(FeBlocks.silver_ore,new ItemStack(FeItems.silver_ingot),1.0f);
      //塗り薬
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cream,1),
            new ItemStack(FeItems.herb,1,0),
            new ItemStack(FeItems.herb,1,0),
            new ItemStack(FeItems.herb,1,0),
            new ItemStack(Items.dye,1,15),
            new ItemStack(Items.dye,1,15),
            new ItemStack(Items.dye,1,15),
            new ItemStack(Items.sugar,1,0),
            new ItemStack(Items.sugar,1,0),
            new ItemStack(Items.sugar,1,0));
      //布
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,0),
            new ItemStack(Blocks.wool,1,0),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,1),
            new ItemStack(Blocks.wool,1,1),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,2),
            new ItemStack(Blocks.wool,1,2),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,3),
            new ItemStack(Blocks.wool,1,3),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,4),
            new ItemStack(Blocks.wool,1,4),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,5),
            new ItemStack(Blocks.wool,1,5),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,6),
            new ItemStack(Blocks.wool,1,6),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,7),
            new ItemStack(Blocks.wool,1,7),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,8),
            new ItemStack(Blocks.wool,1,8),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,9),
            new ItemStack(Blocks.wool,1,9),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,10),
            new ItemStack(Blocks.wool,1,10),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,11),
            new ItemStack(Blocks.wool,1,11),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,12),
            new ItemStack(Blocks.wool,1,12),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,13),
            new ItemStack(Blocks.wool,1,13),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,14),
            new ItemStack(Blocks.wool,1,14),
            new ItemStack(Items.string,1,0));
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.cloth,4,15),
            new ItemStack(Blocks.wool,1,15),
            new ItemStack(Items.string,1,0));
      //なめし革
      GameRegistry.addRecipe(new ItemStack(FeItems.feleather),
            new Object[]{" s ",
                      "sls",
                      " s ",
            Character.valueOf('s'),Items.string,
            Character.valueOf('l'),Items.leather,});
      //紐
      GameRegistry.addRecipe(new ItemStack(FeItems.festring,2),
            new Object[]{"s",
                      "s",
            Character.valueOf('s'),Items.string,});
      //鉄の板
      GameRegistry.addRecipe(new ItemStack(FeItems.feironplate),
            new Object[]{"ii",
                      "ii",
            Character.valueOf('i'),Items.iron_ingot,});
      //ベルト
      GameRegistry.addRecipe(new ItemStack(FeItems.belt),
            new Object[]{" ss",
                      "ill",
                      " ss",
            Character.valueOf('s'),FeItems.festring,
            Character.valueOf('l'),FeItems.feleather,
            Character.valueOf('i'),Items.iron_ingot,});
      //靴底
      GameRegistry.addRecipe(new ItemStack(FeItems.sole,2),
            new Object[]{"l l",
                      "i i",
            Character.valueOf('l'),FeItems.feleather,
            Character.valueOf('i'),FeItems.feironplate,});
      //溶鋼
      GameRegistry.addSmelting(FeItems.steel_ingot,new ItemStack(FeItems.moltensteel),1.0f);
      //鋼鉄インゴット鍛
      GameRegistry.addSmelting(StInEx,new ItemStack(FeItems.steel_ingot_ex),10.0f);
      GameRegistry.addRecipe(new ItemStack(FeItems.steel_ingot_ex),
            new Object[]{"x",
            Character.valueOf('x'),StInEx,});
      
      
      /* クラス(アーマー) */
      //傭兵の眼帯
      GameRegistry.addRecipe(new ItemStack(FeItems.classmercenary_eyepatch),
            new Object[]{"  s",
                      " b ",
                      "s  ",
            Character.valueOf('s'),FeItems.festring,
            Character.valueOf('b'),new ItemStack(FeItems.cloth,1,15),});
      //傭兵の服
      GameRegistry.addRecipe(new ItemStack(FeItems.classmercenary_tops),
            new Object[]{"c c",
                      "lbl",
                      "iii",
            Character.valueOf('c'),new ItemStack(FeItems.cloth,1,2),
            Character.valueOf('l'),FeItems.feleather,
            Character.valueOf('b'),FeItems.belt,
            Character.valueOf('i'),FeItems.feironplate,});
      //傭兵のズボン
      GameRegistry.addRecipe(new ItemStack(FeItems.classmercenary_bottoms),
            new Object[]{"lbl",
                      "i i",
                      "c c",
            Character.valueOf('l'),FeItems.feleather,
            Character.valueOf('c'),new ItemStack(FeItems.cloth,1,2),
            Character.valueOf('b'),FeItems.belt,
            Character.valueOf('i'),FeItems.feironplate,});
      //傭兵の靴
      GameRegistry.addRecipe(new ItemStack(FeItems.classmercenary_shoes),
            new Object[]{"l l",
                      "s s",
            Character.valueOf('l'),FeItems.feleather,
            Character.valueOf('s'),FeItems.sole,});
      
      
      
      /* 剣 */
      //鉄の剣
      GameRegistry.addRecipe(new ItemStack(FeItems.feironsword),
            new Object[]{"  I",
                      " I ",
                      "H  ",
            Character.valueOf('I'),Items.iron_ingot,
            Character.valueOf('H'),FeItems.hilt});
      //鋼の剣
      GameRegistry.addRecipe(new ItemStack(FeItems.festeelsword),
            new Object[]{"  S",
                      " S ",
                      "H  ",
            Character.valueOf('S'),FeItems.steel_ingot,
            Character.valueOf('H'),FeItems.hilt,});
      //銀の剣
      GameRegistry.addRecipe(new ItemStack(FeItems.fesilversword),
            new Object[]{"  S",
                      " S ",
                      "H  ",
            Character.valueOf('S'),FeItems.silver_ingot,
            Character.valueOf('H'),FeItems.hilt,});
      
      
      
      /* 槍 */
      //鉄の槍
      GameRegistry.addRecipe(new ItemStack(FeItems.feironlance),
            new Object[]{" II",
                      " SI",
                      "S  ",
            Character.valueOf('I'),Items.iron_ingot,
            Character.valueOf('S'),FeItems.shaft,});
      //鋼の槍   
      GameRegistry.addRecipe(new ItemStack(FeItems.festeellance),
            new Object[]{" SS",
                      " HS",
                      "H  ",
            Character.valueOf('S'),FeItems.steel_ingot,
            Character.valueOf('H'),FeItems.shaft,});
      //銀の槍
      GameRegistry.addRecipe(new ItemStack(FeItems.fesilverlance),
            new Object[]{" SS",
                      " HS",
                      "H  ",
            Character.valueOf('S'),FeItems.silver_ingot,
            Character.valueOf('H'),FeItems.shaft,});
      
      
      
      /* 斧 */
      //鉄の斧
      GameRegistry.addRecipe(new ItemStack(FeItems.feironaxe),
            new Object[]{" I ",
                      "ISI",
                      "SI ",
            Character.valueOf('I'),Items.iron_ingot,
            Character.valueOf('S'),FeItems.shaft,});
      //鋼の斧
      GameRegistry.addRecipe(new ItemStack(FeItems.festeelaxe),
            new Object[]{" S ",
                      "SHS",
                      "HS ",
            Character.valueOf('S'),FeItems.steel_ingot,
            Character.valueOf('H'),FeItems.shaft,});
      //銀の斧
      GameRegistry.addRecipe(new ItemStack(FeItems.fesilveraxe),
            new Object[]{" S ",
                      "SHS",
                      "HS ",
            Character.valueOf('S'),FeItems.silver_ingot,
            Character.valueOf('H'),FeItems.shaft,});
      
      
      
      /* その他 */
      //傷薬
      GameRegistry.addShapelessRecipe(new ItemStack(FeItems.ointment),
            new ItemStack(FeItems.cream,1),
            Items.glass_bottle);
   }

}

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

投稿記事 by suteppi » 2017年10月05日(木) 18:56

1.12.2 Forge14.23.0.249でPickaxeにデフォルトでエンチャントを付ける方法を教えてください。

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

投稿記事 by 黒の剣士 コロン » 2017年10月01日(日) 18:56

technedeで作ったものを防具の見た目にしたいです。あとチェストプレートを付けたらクリエイティブ飛行ができるようにしたいです。バカ(私)でもわかるように説明をお願いします。1.7.10です。

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

投稿記事 by zacco320 » 2017年9月30日(土) 23:38

elise_blacklab さんが書きました:1.10.2では,ItemStackはまだNullableなので,getHeldItemOffHand()で取得したものがnullかもしれない.
他にもItemStackの扱いで,getItemを判定するにはほぼ必ずnullチェックが必要です.


返信ありがとうございます、無事作動しました!

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

投稿記事 by elise_blacklab » 2017年9月30日(土) 20:38

zacco320 さんが書きました:Modで追加したアイテムをメインハンドに持った時にポーション効果付与、さらに別のModアイテムをオフハンドに所持したときに
別のポーション効果が追加されるという使用にしたいのですが、どうにもアイテムをインベントリに入れようとすると停止してしまいます。
zacco320 さんが書きました:if(player.getHeldItemOffhand().getItem() == ModTools.nikkari || player.getHeldItemOffhand().getItem() == ModTools.okurikara) {
         player.addPotionEffect(new PotionEffect(MobEffects.STRENGTH, 0, 1));
         }

1.10.2では,ItemStackはまだNullableなので,getHeldItemOffHand()で取得したものがnullかもしれない.
他にもItemStackの扱いで,getItemを判定するにはほぼ必ずnullチェックが必要です.

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

投稿記事 by zacco320 » 2017年9月30日(土) 18:11

Forge1.10.2でアイテム追加modの作成中です。

Modで追加したアイテムをメインハンドに持った時にポーション効果付与、さらに別のModアイテムをオフハンドに所持したときに
別のポーション効果が追加されるという使用にしたいのですが、どうにもアイテムをインベントリに入れようとすると停止してしまいます。
アイテムをメインハンドに所持している場合に行われるものを参考に手を加えたのですが間違いを指摘していただけると幸いです。

コード: 全て選択
     @Override
   public void onUpdate(ItemStack itemStack, World world, Entity entity, int slot, boolean inHand) {
      super.onUpdate(itemStack, world, entity, slot, inHand);

      if(entity instanceof EntityPlayer && inHand) {
         EntityPlayer player = (EntityPlayer) entity;
         player.addPotionEffect(new PotionEffect(MobEffects.SPEED, 0, 0));
        if(player.getHeldItemOffhand().getItem() == ModTools.nikkari || player.getHeldItemOffhand().getItem() == ModTools.okurikara) {
         player.addPotionEffect(new PotionEffect(MobEffects.STRENGTH, 0, 1));
         }
      }
   }



クラッシュレポートです
[17:30:46] [Client thread/INFO]: Setting user: Player469
[17:30:49] [Client thread/WARN]: Skipping bad option: lastServer:
[17:30:49] [Client thread/INFO]: LWJGL Version: 2.9.4
[17:30:52] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:Touken Mod, FMLFileResourcePack:EBLib, FMLFileResourcePack:LittleMaidReengaged, FMLFileResourcePack:Waila, FMLFileResourcePack:Waila Harvestability
[17:30:56] [Sound Library Loader/INFO]: Starting up SoundSystem...
[17:30:56] [Thread-8/INFO]: Initializing LWJGL OpenAL
[17:30:56] [Thread-8/INFO]: (The LWJGL binding of OpenAL. For more information, see http://www.lwjgl.org)
[17:30:56] [Thread-8/INFO]: OpenAL initialized.
[17:30:56] [Sound Library Loader/INFO]: Sound engine started
[17:31:00] [Client thread/INFO]: Created: 16x16 textures-atlas
[17:31:02] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:Touken Mod, FMLFileResourcePack:EBLib, FMLFileResourcePack:LittleMaidReengaged, FMLFileResourcePack:Waila, FMLFileResourcePack:Waila Harvestability, SoundPackLMR, OldTexturesLoader
[17:31:05] [Client thread/INFO]: SoundSystem shutting down...
[17:31:05] [Client thread/WARN]: Author: Paul Lamb, http://www.paulscode.com
[17:31:05] [Sound Library Loader/INFO]: Starting up SoundSystem...
[17:31:05] [Thread-12/INFO]: Initializing LWJGL OpenAL
[17:31:05] [Thread-12/INFO]: (The LWJGL binding of OpenAL. For more information, see http://www.lwjgl.org)
[17:31:05] [Thread-12/INFO]: OpenAL initialized.
[17:31:06] [Sound Library Loader/INFO]: Sound engine started
[17:31:09] [Client thread/INFO]: Created: 512x512 textures-atlas
[17:31:10] [Client thread/WARN]: Skipping bad option: lastServer:
[17:31:13] [Realms Notification Availability checker #1/INFO]: Could not authorize you against Realms server: Invalid session id
[17:31:19] [Client thread/INFO]: Deleting level New World-
[17:31:19] [Client thread/INFO]: Attempt 1...
[17:31:22] [Client thread/INFO]: Deleting level New World2
[17:31:22] [Client thread/INFO]: Attempt 1...
[17:31:26] [Server thread/INFO]: Starting integrated minecraft server version 1.10.2
[17:31:26] [Server thread/INFO]: Generating keypair
[17:31:27] [Server thread/INFO]: Preparing start region for level 0
[17:31:28] [Server thread/INFO]: Preparing spawn area: 10%
[17:31:29] [Server thread/INFO]: Preparing spawn area: 24%
[17:31:30] [Server thread/INFO]: Preparing spawn area: 40%
[17:31:31] [Server thread/INFO]: Preparing spawn area: 56%
[17:31:32] [Server thread/INFO]: Preparing spawn area: 73%
[17:31:33] [Server thread/INFO]: Preparing spawn area: 89%
[17:31:34] [Server thread/INFO]: Changing view distance to 12, from 10
[17:31:35] [Server thread/INFO]: Player469[local:E:ab46a4f9] logged in with entity id 2181 at (212.5, 72.0, 230.5)
[17:31:35] [Server thread/INFO]: Player469 joined the game
[17:31:37] [pool-2-thread-1/WARN]: Couldn't look up profile properties for com.mojang.authlib.GameProfile@73556abd[id=11e12ca9-fda1-31b6-8f92-6e251e7a18f2,name=Player469,properties={},legacy=false]
com.mojang.authlib.exceptions.AuthenticationException: The client has sent too many requests within a certain amount of time
at com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService.makeRequest(YggdrasilAuthenticationService.java:65) ~[YggdrasilAuthenticationService.class:?]
at com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService.fillGameProfile(YggdrasilMinecraftSessionService.java:175) [YggdrasilMinecraftSessionService.class:?]
at com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService$1.load(YggdrasilMinecraftSessionService.java:59) [YggdrasilMinecraftSessionService$1.class:?]
at com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService$1.load(YggdrasilMinecraftSessionService.java:56) [YggdrasilMinecraftSessionService$1.class:?]
at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3524) [guava-17.0.jar:?]
at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2317) [guava-17.0.jar:?]
at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2280) [guava-17.0.jar:?]
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2195) [guava-17.0.jar:?]
at com.google.common.cache.LocalCache.get(LocalCache.java:3934) [guava-17.0.jar:?]
at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3938) [guava-17.0.jar:?]
at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4821) [guava-17.0.jar:?]
at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4827) [guava-17.0.jar:?]
at com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService.fillProfileProperties(YggdrasilMinecraftSessionService.java:165) [YggdrasilMinecraftSessionService.class:?]
at net.minecraft.client.Minecraft.getProfileProperties(Minecraft.java:3060) [Minecraft.class:?]
at net.minecraft.client.resources.SkinManager$3.run(SkinManager.java:131) [SkinManager$3.class:?]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_131]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_131]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_131]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_131]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]
[17:31:40] [Server thread/INFO]: Saving and pausing game...
[17:31:40] [Server thread/INFO]: Saving chunks for level 'New World2'/Overworld
[17:31:41] [Server thread/INFO]: Saving chunks for level 'New World2'/Nether
[17:31:41] [Server thread/INFO]: Saving chunks for level 'New World2'/The End
[17:32:00] [Server thread/INFO]: Player469 has just earned the achievement [Taking Inventory]
[17:32:00] [Client thread/INFO]: [CHAT] Player469 has just earned the achievement [Taking Inventory]
[17:32:08] [Server thread/ERROR]: Encountered an unexpected exception
net.minecraft.util.ReportedException: Ticking player
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:212) ~[NetworkSystem.class:?]
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:807) ~[MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:688) ~[MinecraftServer.class:?]
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:156) ~[IntegratedServer.class:?]
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:537) [MinecraftServer.class:?]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]
Caused by: java.lang.NullPointerException
at toukenmod.items.wakizashi.ItemHonebami.onUpdate(ItemHonebami.java:28) ~[ItemHonebami.class:?]
at net.minecraft.item.ItemStack.updateAnimation(ItemStack.java:524) ~[ItemStack.class:?]
at net.minecraft.entity.player.InventoryPlayer.decrementAnimations(InventoryPlayer.java:389) ~[InventoryPlayer.class:?]
at net.minecraft.entity.player.EntityPlayer.onLivingUpdate(EntityPlayer.java:560) ~[EntityPlayer.class:?]
at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:2225) ~[EntityLivingBase.class:?]
at net.minecraft.entity.player.EntityPlayer.onUpdate(EntityPlayer.java:260) ~[EntityPlayer.class:?]
at net.minecraft.entity.player.EntityPlayerMP.onUpdateEntity(EntityPlayerMP.java:345) ~[EntityPlayerMP.class:?]
at net.minecraft.network.NetHandlerPlayServer.update(NetHandlerPlayServer.java:174) ~[NetHandlerPlayServer.class:?]
at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher$1.update(NetworkDispatcher.java:216) ~[NetworkDispatcher$1.class:?]
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:309) ~[NetworkManager.class:?]
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:197) ~[NetworkSystem.class:?]
... 5 more

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

投稿記事 by ユメミノウツツ » 2017年9月29日(金) 21:56

defeatedcrow さんが書きました:ゲーム内の時間が、特にコンマ秒の単位でぴったりにすることは厳しいと思います
マウスやキー操作が絡むもの、描画が絡むものは特にズレます
どれくらいズレるかはPC環境にもMod導入環境にもよって変わりますし、その瞬間のCPU使用率とか色んな要素に影響されるのでなんとも

描画とプレイヤー操作の部分がクライアント依存、他がサーバー側処理なので、
・プレイヤーのキー操作→サーバへのパケット
・サーバーからの情報→クライアントへの反映
このような処理でどうあがいてもラグが出ます

加えてどれかのVerから(多分1.7から1.8辺り)、負荷がかかった瞬間にForge側で100~1000Tick単位で処理をスキップされ、更新処理が飛ばされてしまうようなので、あまり負荷のかかる常時監視処理を増やしているとスキップに巻き込まれているかもしれません

クライアント用にちょうど良く調整してマルチプレイでガッタガタになるということも多々あるので、
正直、そのような時間のブレを許容できない仕組みを作ること自体が厳しいと思います

どうしてもクールタイムに再現性をもたせたいのであれば、
Tickカウントではなく、Worldの持つTotalTimeなどを使って、クールタイム発動時点からどれくらい経過したかを確認するほうがやりやすいかもしれません

返信ありがとうございます。ググったところ多分(viewtopic.php?f=39&t=8370&start=1800)このページを参考にしているような気がするのですが(あまり覚えてません)、まあ色々処理を追加しているからそれが負荷をかけているのかもしれません。
コンマ単位の秒数調整ではなくて、数秒レベルでずれるので流石におかしいのではないかと思ったのですが、結局どこかがバグっているとかいうわけではなさそうなので、TotalTimeなどを調べてみようかと思います。ありがとうございました。

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

投稿記事 by defeatedcrow » 2017年9月29日(金) 18:15

ユメミノウツツ さんが書きました:
ユメミノウツツ さんが書きました:1.7.10で質問させていただきます。
武器の仕様として攻撃を確率でミスした際にクールタイムを1.5秒設けるというシステムを作ろうと思ったのですが、なぜかtickに対して秒数が合いません。これを実装した当初から合っていなかったのか先ほど弄ったときにずれたのかはわかりません・・・。1秒20tickだったはずなので30tickとしているのですが、どうでしょうか。ちなみに試しに200tickにしてみたところ、5.7秒ほどでクールタイム終了を示す経験値の音が鳴りました。

追記:ver情報を忘れていました。Forge1558です。

どうやらほぼぴったり半分になっているので1秒40Tickになっているのかもしれません。1秒20Tickと思っているのですが、これは正しい動作なのでしょうか?


ゲーム内の時間が、特にコンマ秒の単位でぴったりにすることは厳しいと思います
マウスやキー操作が絡むもの、描画が絡むものは特にズレます
どれくらいズレるかはPC環境にもMod導入環境にもよって変わりますし、その瞬間のCPU使用率とか色んな要素に影響されるのでなんとも

描画とプレイヤー操作の部分がクライアント依存、他がサーバー側処理なので、
・プレイヤーのキー操作→サーバへのパケット
・サーバーからの情報→クライアントへの反映
このような処理でどうあがいてもラグが出ます

加えてどれかのVerから(多分1.7から1.8辺り)、負荷がかかった瞬間にForge側で100~1000Tick単位で処理をスキップされ、更新処理が飛ばされてしまうようなので、あまり負荷のかかる常時監視処理を増やしているとスキップに巻き込まれているかもしれません

クライアント用にちょうど良く調整してマルチプレイでガッタガタになるということも多々あるので、
正直、そのような時間のブレを許容できない仕組みを作ること自体が厳しいと思います

どうしてもクールタイムに再現性をもたせたいのであれば、
Tickカウントではなく、Worldの持つTotalTimeなどを使って、クールタイム発動時点からどれくらい経過したかを確認するほうがやりやすいかもしれません

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

投稿記事 by ユメミノウツツ » 2017年9月28日(木) 21:10

ユメミノウツツ さんが書きました:1.7.10で質問させていただきます。
武器の仕様として攻撃を確率でミスした際にクールタイムを1.5秒設けるというシステムを作ろうと思ったのですが、なぜかtickに対して秒数が合いません。これを実装した当初から合っていなかったのか先ほど弄ったときにずれたのかはわかりません・・・。1秒20tickだったはずなので30tickとしているのですが、どうでしょうか。ちなみに試しに200tickにしてみたところ、5.7秒ほどでクールタイム終了を示す経験値の音が鳴りました。

追記:ver情報を忘れていました。Forge1558です。

どうやらほぼぴったり半分になっているので1秒40Tickになっているのかもしれません。1秒20Tickと思っているのですが、これは正しい動作なのでしょうか?

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

投稿記事 by ShuperDark » 2017年9月28日(木) 19:12

キター!!!!!
動きました!!!!
defeatedcrowさん、elise_blacklabさんありがとうございました!!

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

投稿記事 by ShuperDark » 2017年9月28日(木) 19:00

defeatedcrow さんが書きました:
ShuperDark さんが書きました:
elise_blacklab さんが書きました:
ShuperDark さんが書きました:あれ・・・これでブロックのxyzの30ブロック以内にいると敵Mobが死んでくれるはずなのですが・・・

Entityが死亡して消滅するまでの流れは体力が0にならないと起こらないようになっているので,onDeath()を呼ぶだけでは"死んで"くれません
体力分のダメージを与える処理を書けばいいのですが,Eventによるフックの影響を受けるため確実に消滅させるにはsetDead()を直接呼ぶことになります


setDead()に変えてみましたが、敵Mobはビクともしませんでした。
それにPCの重さもないですね・・・


そもそもの前提として、メソッドが呼ばれるかどうかの確認はきちんとしていますか?
UpdateTickは、ただ内容を書けば毎Tick呼ばれるようなメソッドではありません
(そのような仕様では負荷によってゲームが成り立ちませんので、このゲームはUpdate対象のBlockはいろいろな方法で制限されます)

ブロックの場合、コンストラクタでsetTickRandomlyをtrueにしてRandomTick更新の対象にすることと、一定周期で動かすならscheduleBlockUpdateで指定Tick後に更新を呼ぶとかそういう設定をします


Loggerを用意するとか、動いたときに確実にわかるようなギミックを挟む(チャットメッセージを吐かせるとか)で確認手段は作るべきと思いますよ
・メソッドが呼ばれるかどうかを確認する
・そのメソッドがどういう手順で呼び出されているのかを本体ソースから確認する
・目的のギミックを(部分的に)含むバニラのブロックを参考にする  など

基本setDead()で何も死なないということはないので、別の場所に凡ミスがあると思われる



コード: 全て選択
@Override
    public void updateTick(World world, int x, int y, int z, Random random) {
      if(!world.isRemote) {
       List<EntityLivingBase> list = world.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x-30, y-30, z-30, x+30, y+30, z+30));
      
       for(EntityLivingBase entity : list) {
          if(entity instanceof EntityPlayer) {
             if(random.nextInt(5) == 0) {
             ((EntityPlayer) entity).addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "I am working"));
          }
          }
       }
      }
   }


乱数で5回に一回の割合でプレイヤーが範囲内に入るとプレイヤーにメッセージが出力するようにしてみました。
どうもメソッドは呼ばれてなさそうですね・・・。

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

投稿記事 by defeatedcrow » 2017年9月28日(木) 17:46

ShuperDark さんが書きました:
elise_blacklab さんが書きました:
ShuperDark さんが書きました:あれ・・・これでブロックのxyzの30ブロック以内にいると敵Mobが死んでくれるはずなのですが・・・

Entityが死亡して消滅するまでの流れは体力が0にならないと起こらないようになっているので,onDeath()を呼ぶだけでは"死んで"くれません
体力分のダメージを与える処理を書けばいいのですが,Eventによるフックの影響を受けるため確実に消滅させるにはsetDead()を直接呼ぶことになります


setDead()に変えてみましたが、敵Mobはビクともしませんでした。
それにPCの重さもないですね・・・


そもそもの前提として、メソッドが呼ばれるかどうかの確認はきちんとしていますか?
UpdateTickは、ただ内容を書けば毎Tick呼ばれるようなメソッドではありません
(そのような仕様では負荷によってゲームが成り立ちませんので、このゲームはUpdate対象のBlockはいろいろな方法で制限されます)

ブロックの場合、コンストラクタでsetTickRandomlyをtrueにしてRandomTick更新の対象にすることと、一定周期で動かすならscheduleBlockUpdateで指定Tick後に更新を呼ぶとかそういう設定をします


Loggerを用意するとか、動いたときに確実にわかるようなギミックを挟む(チャットメッセージを吐かせるとか)で確認手段は作るべきと思いますよ
・メソッドが呼ばれるかどうかを確認する
・そのメソッドがどういう手順で呼び出されているのかを本体ソースから確認する
・目的のギミックを(部分的に)含むバニラのブロックを参考にする  など

基本setDead()で何も死なないということはないので、別の場所に凡ミスがあると思われる

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

投稿記事 by ShuperDark » 2017年9月28日(木) 16:04

elise_blacklab さんが書きました:
ShuperDark さんが書きました:あれ・・・これでブロックのxyzの30ブロック以内にいると敵Mobが死んでくれるはずなのですが・・・

Entityが死亡して消滅するまでの流れは体力が0にならないと起こらないようになっているので,onDeath()を呼ぶだけでは"死んで"くれません
体力分のダメージを与える処理を書けばいいのですが,Eventによるフックの影響を受けるため確実に消滅させるにはsetDead()を直接呼ぶことになります


setDead()に変えてみましたが、敵Mobはビクともしませんでした。
それにPCの重さもないですね・・・

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

投稿記事 by elise_blacklab » 2017年9月28日(木) 00:23

ShuperDark さんが書きました:あれ・・・これでブロックのxyzの30ブロック以内にいると敵Mobが死んでくれるはずなのですが・・・

Entityが死亡して消滅するまでの流れは体力が0にならないと起こらないようになっているので,onDeath()を呼ぶだけでは"死んで"くれません
体力分のダメージを与える処理を書けばいいのですが,Eventによるフックの影響を受けるため確実に消滅させるにはsetDead()を直接呼ぶことになります

Re: 【総合】トピック立てるまでもない質問【テクスチャ/MOD/その他ツール】

投稿記事 by elise_blacklab » 2017年9月28日(木) 00:12

モチモチクラフタ さんが書きました:Minecraftのニワトリのプログラムについて質問です。
現在ニワトリに関わるMODを製作中なのですが
卵を時間経過で生むコードが見つかりません。
どこにあるかどなたか知りませんか?

Forge MDKを構築済みの前提で書きますが,net.minecraft.entity.passive.EntityChicken#onLivingUpdate()内にあります(105行目あたり)
同様の実装をしたいなら該当部分のソースを見るか,フックするならEntityJoinWorldEventでどうぞ.

Re: 【総合】トピック立てるまでもない質問【テクスチャ/MOD/その他ツール】

投稿記事 by モチモチクラフタ » 2017年9月27日(水) 18:58

ちなみにバージョンは1.11.2です

Re: 【総合】トピック立てるまでもない質問【テクスチャ/MOD/その他ツール】

投稿記事 by モチモチクラフタ » 2017年9月27日(水) 18:31

Minecraftのニワトリのプログラムについて質問です。
現在ニワトリに関わるMODを製作中なのですが
卵を時間経過で生むコードが見つかりません。
どこにあるかどなたか知りませんか?

もしくはコピペさせていただければ幸いです。
よろしくお願いします。
miyabi@運営チーム[運営宛のメッセージ(PM)を作成] 投稿先違いのため、記事を移動しました。
【総合】トピック立てるまでもない質問【テクスチャ/MOD/その他ツール】
 ↓
【総合】トピック立てるまでもない質問【Mod制作】

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

投稿記事 by ShuperDark » 2017年9月20日(水) 20:45

elise_blacklab さんが書きました:
ShuperDark さんが書きました:そのブロックの半径30ブロック以内にいると、プレイヤー以外のエンティティにダメージを与えるみたいなもの作ってるんですけど、わざわざupdateTickにこだわる必要ってないのでしょうか(というか引数がWorld, int, int, int, RandomだからどうやってEntityまたはEntityLivingBaseを拾えばいいのか)
もし仮に「この関数使えばいいのでは」っていうものがあれば教えていただけると幸いですm(_ _)m

World.getEntitiesWithinAABB等々ありますのでうまく使えばよいかと
ただし,毎tickでEntityの走査をするとさすがに重いので,自重が必要です

あと面倒でも環境情報は毎回正確に書くようにしてくださいね.
質問によってはバージョンで挙動が変わるなんてザラにありますし


申し訳ございません・・・

環境は1.7.10です。

あれ・・・これでブロックのxyzの30ブロック以内にいると敵Mobが死んでくれるはずなのですが・・・(仕様を敵Mob、完全に殺すように変更させていただきました)

コード: 全て選択
@Override
    public void updateTick(World world, int x, int y, int z, Random random) {
      if(!world.isRemote) {
       List<EntityLivingBase> list = world.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x-30, y-30, z-30, x+30, y+30, z+30));
      
       for(EntityLivingBase entity : list) {
          if(entity instanceof EntityMob) {
             entity.onDeath(DamageSource.magic);
          }
       }
      }

//他のこのブロックに関するソースコードは、ただのブロックのテクスチャの設定などだけなので除外させていただきました。

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

投稿記事 by ユメミノウツツ » 2017年9月20日(水) 19:03

1.7.10で質問させていただきます。
武器の仕様として攻撃を確率でミスした際にクールタイムを1.5秒設けるというシステムを作ろうと思ったのですが、なぜかtickに対して秒数が合いません。これを実装した当初から合っていなかったのか先ほど弄ったときにずれたのかはわかりません・・・。1秒20tickだったはずなので30tickとしているのですが、どうでしょうか。ちなみに試しに200tickにしてみたところ、5.7秒ほどでクールタイム終了を示す経験値の音が鳴りました。

追記:ver情報を忘れていました。Forge1558です。
コード: 全て選択
package femod.item;

import java.util.Random;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import femod.classbase.FeClassBase;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemSword;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;

/** 武器の仕様を設定するクラス
 *  命中率、必殺率の乱数抽選と処理 */
public class FeWeapon extends ItemSword{
   
   /** 命中の実数 */
   int hitpar1 = 100;
   /** 必殺の実数 */
   int killpar1 = 1;
   /** 命中の乱数 */
   Random hitrand1 = new Random();
   Random hitrand2 = new Random();
   /** 必殺の乱数 */
   Random killrand = new Random();
   /** 単体の攻撃力 */
   float power1 = 1F;
   /** クールタイム */
   static int coolTime = 0;
   
   //クラスの性能
   public FeWeapon(ToolMaterial toolMaterial,int hitpar,int killpar) {
      super(toolMaterial);
      maxStackSize = 1;
      hitpar1 = hitpar;
      killpar1 = killpar;
      power1 = toolMaterial.getDamageVsEntity() + 4;
   }

   @Override
   //命中率
      //攻撃判定と同時に抽選、randhit <= hitならfalseで攻撃、>ならtrueでミス
      //GBA版FEの乱数は2回抽選した平均値を使う
   //必殺率
      //攻撃判定と同時に抽選、以後未定。
   public boolean onLeftClickEntity(ItemStack itemStack, EntityPlayer player, Entity entity){
      
      //1~100で乱数抽選、命中率乱数
      int hit1 = hitrand1.nextInt(100) + 1;
      int hit2 = hitrand2.nextInt(100) + 1;
      float hit3  = (hit1 + hit2) / 2;
      //1~100で乱数抽選、必殺乱数
      int kill = killrand.nextInt(100) + 1;
      
      //必殺率が0なら1にする
      if (!player.getEntityWorld().isRemote) {
         if(killpar1 == 0){
            ++killpar1;
         }
      }
      
      //命中処理
      //乱数が命中率以下なら成功
      if(!player.getEntityWorld().isRemote){
            // クールタイムが0なら効果が発動でき、クールタイムがセットされる
            if (coolTime <= 0) {
               if(hit3 <= hitpar1){
                    //攻撃成功、通常処理
                       //デバッグメッセージ(隠す)
                       /* player.addChatMessage(new ChatComponentText("False")); */
                  //乱数が必殺率以下なら必殺発動
                  if(kill <= killpar1 + FeClassBase.killplus){
                     player.addChatMessage(new ChatComponentText("必殺!"));
                     entity.attackEntityFrom(DamageSource.causePlayerDamage(player), (power1 + FeClassBase.powerplus) * 3);
                     coolTime = 0;
                  }else{
                     entity.attackEntityFrom(DamageSource.causePlayerDamage(player), power1 + FeClassBase.powerplus);
                     coolTime = 0;
                  }
                  //耐久を1消費
                  itemStack.damageItem(1, player);
                  return true;
                 }else{
                    //MISS!と表示させる
                    player.addChatMessage(new ChatComponentText("MISS! (クールタイム1.5秒付与)"));
                    //攻撃失敗、ダメージは入らない
                    //クールタイムを設ける(1.5秒)
                    coolTime = 30;
                    return true;
                   }
            }else{
               //クールタイム中
               return true;
            }
      }else{
            return true;
      }
      
   }
   
   @Override
   //クールタイムの設定 30tick
   public void onUpdate(ItemStack stack, World world, Entity entity, int invSlot, boolean isHeldItem){

      if(entity instanceof EntityPlayer){
           EntityPlayer entityPlayer = (EntityPlayer)entity;
           if (!world.isRemote) {
              if(coolTime == 1){
                 world.playSoundAtEntity(entityPlayer, "random.orb", 0.6F, 1.6F);
              }
           }
      }
      // クライアントとサーバーの両方でやる必要はないのでサーバーのみで行う
      if (!world.isRemote) {
         //クールタイムを減らす
         if(coolTime > 0){
            coolTime--;
         }
      }
   }
}

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

投稿記事 by elise_blacklab » 2017年9月20日(水) 18:42

ShuperDark さんが書きました:そのブロックの半径30ブロック以内にいると、プレイヤー以外のエンティティにダメージを与えるみたいなもの作ってるんですけど、わざわざupdateTickにこだわる必要ってないのでしょうか(というか引数がWorld, int, int, int, RandomだからどうやってEntityまたはEntityLivingBaseを拾えばいいのか)
もし仮に「この関数使えばいいのでは」っていうものがあれば教えていただけると幸いですm(_ _)m

World.getEntitiesWithinAABB等々ありますのでうまく使えばよいかと
ただし,毎tickでEntityの走査をするとさすがに重いので,自重が必要です

あと面倒でも環境情報は毎回正確に書くようにしてくださいね.
質問によってはバージョンで挙動が変わるなんてザラにありますし

ページトップ

x