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

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

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

投稿記事by ユメミノウツツ » 2017年1月14日(土) 19:30

1.7.10,1558でまたまた質問です(聞いてばっかですいません)
新規に鉱石を作製し、自然生成するようにしたのですが、ダイヤモンドの半分の生成率にしたいと思っています。が、ダイヤモンドの生成率が分からずできずにいます。多分for(int i = 0; i < 1; i++)のi < 1の値を変えればいいのでしょうが・・・。よければご教授よろしくお願いします。なお、この方法で生成できているのは確認しました。ソースはTNTModdersさんを参考にしています。
SilverOreGenerator.class
コード: 全て選択
package femod.world;

import java.util.Random;

import cpw.mods.fml.common.IWorldGenerator;
import femod.FEMODCore;
import femod.init.FeBlocks;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraft.world.WorldProviderSurface;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.feature.WorldGenMinable;

public class SilverOreGenerator implements IWorldGenerator {

   @Override
   public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {
      if (world.provider instanceof WorldProviderSurface) {
         generateOre(world, random, chunkX << 4, chunkZ << 4);
      }
   }

   private void generateOre(World world, Random random, int x, int z) {
      for(int i = 0; i < 1; i++) {
         int genX = x + random.nextInt(16);
         int genY = 1 + random.nextInt(69);
         int genZ = z + random.nextInt(16);
         new WorldGenMinable(FeBlocks.silver_ore, 0, 8, Blocks.stone).generate(world, random, genX, genY, genZ);
      }
   }
}
Javaすら学んでなければ教えてくれる人もいない中Modding始めてみた。ファイアーエムブレムを再現するMODを作りたいけどもリリースできる気がしませんなこれは・・・。
アバター
ユメミノウツツ
ID:207d775a
石掘り
 
記事: 107
登録日時: 2014年3月29日(土) 20:13

  • (PostNo.293308)

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

投稿記事by ヤドカリ » 2017年1月14日(土) 22:02

forge 1.7.10の1448で開発をしているのですが、プレイヤーの経験値で攻撃力が変わる剣を作りたいと思っています。
しかし、経験値を取得するのにplayer.getExperienceで出来るのはわかったのですが、playerでエラーが出てしまいます。
public voidとかで何かをしなければいけないと思うのですが、その何かがわかりません。
これを教えていただきたいと思います。よろしくお願いします。
ヤドカリ
ID:53b9de8c
木を殴ってる
 
記事: 13
登録日時: 2016年2月11日(木) 13:54

  • (PostNo.293320)

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

投稿記事by noriokun4649 » 2017年1月14日(土) 23:13

ヤドカリ さんが書きました:forge 1.7.10の1448で開発をしているのですが、プレイヤーの経験値で攻撃力が変わる剣を作りたいと思っています。
しかし、経験値を取得するのにplayer.getExperienceで出来るのはわかったのですが、playerでエラーが出てしまいます。
public voidとかで何かをしなければいけないと思うのですが、その何かがわかりません。
これを教えていただきたいと思います。よろしくお願いします。

どのメソッドで呼び出そうとしているのかわかりませんが、メソッドの仮引数のplayerを使えば良いのでは無いでしょうか?
質問した問題を解決に導いてくれた人には感謝の気持ちを忘れずに・・・・・・
プラスチックMOD・サイコパスMOD・AlmightyMOD・TorchBowMod・PowerManegerModなどを作成&配布しています→こちら
お問い合わせはこちら→https://noriokun4649.ddo.jp
プラスチックMODは絶賛IC2と連携作業中! こんな風に連携してほしい!など要望があればPMなどでお願いします。
アバター
noriokun4649
ID:221a1fb9
鉄鉱掘り
 
記事: 298
登録日時: 2014年12月26日(金) 12:37

  • (PostNo.293349)

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

投稿記事by ユメミノウツツ » 2017年1月15日(日) 08:56

ヤドカリ さんが書きました:forge 1.7.10の1448で開発をしているのですが、プレイヤーの経験値で攻撃力が変わる剣を作りたいと思っています。
しかし、経験値を取得するのにplayer.getExperienceで出来るのはわかったのですが、playerでエラーが出てしまいます。
public voidとかで何かをしなければいけないと思うのですが、その何かがわかりません。
これを教えていただきたいと思います。よろしくお願いします。

そうですね、そのクラスをみせていただかなければなんとも・・・。いやまあ初心者の自分では答えられないかもしれませんが。
例えば前のページから延々自分が言ってますが、『public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity)』のメソッドならEntityPlayer playerとあるのでplayerにエラーは出ないはずです。まあ自分はそれしか使ったことがないのでそれ以外は何もいえないのですが・・・。

追記
因みにForgeを1448で開発しているんですね。現在の最新安定板は1558のはずですが。まあいいや。
http://detail.chiebukuro.yahoo.co.jp/qa ... 3161197133 なんてものはほぼ同じ質問をしているのでよければ参考にしてはいかがでしょうか。
Javaすら学んでなければ教えてくれる人もいない中Modding始めてみた。ファイアーエムブレムを再現するMODを作りたいけどもリリースできる気がしませんなこれは・・・。
アバター
ユメミノウツツ
ID:207d775a
石掘り
 
記事: 107
登録日時: 2014年3月29日(土) 20:13

  • (PostNo.293399)

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

投稿記事by defeatedcrow » 2017年1月15日(日) 17:53

ヤドカリ さんが書きました:forge 1.7.10の1448で開発をしているのですが、プレイヤーの経験値で攻撃力が変わる剣を作りたいと思っています。
しかし、経験値を取得するのにplayer.getExperienceで出来るのはわかったのですが、playerでエラーが出てしまいます。
public voidとかで何かをしなければいけないと思うのですが、その何かがわかりません。
これを教えていただきたいと思います。よろしくお願いします。


Experienceは「経験値バーが何%溜まっているか」を表す表示なので、いじるべきではありません。

経験値を操作したいなら経験値レベル(ExperienceLevel)か、総量(ExperienceTotal)のintを操作します。
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0070553b
ダイヤモンド掘り
 
記事: 878
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.293400)

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

投稿記事by defeatedcrow » 2017年1月15日(日) 18:05

ユメミノウツツ さんが書きました:1.7.10,1558でまたまた質問です(聞いてばっかですいません)
新規に鉱石を作製し、自然生成するようにしたのですが、ダイヤモンドの半分の生成率にしたいと思っています。が、ダイヤモンドの生成率が分からずできずにいます。多分for(int i = 0; i < 1; i++)のi < 1の値を変えればいいのでしょうが・・・。よければご教授よろしくお願いします。なお、この方法で生成できているのは確認しました。ソースはTNTModdersさんを参考にしています。
SilverOreGenerator.class
コード: 全て選択
package femod.world;

import java.util.Random;

import cpw.mods.fml.common.IWorldGenerator;
import femod.FEMODCore;
import femod.init.FeBlocks;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraft.world.WorldProviderSurface;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.feature.WorldGenMinable;

public class SilverOreGenerator implements IWorldGenerator {

   @Override
   public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {
      if (world.provider instanceof WorldProviderSurface) {
         generateOre(world, random, chunkX << 4, chunkZ << 4);
      }
   }

   private void generateOre(World world, Random random, int x, int z) {
      for(int i = 0; i < 1; i++) {
         int genX = x + random.nextInt(16);
         int genY = 1 + random.nextInt(69);
         int genZ = z + random.nextInt(16);
         new WorldGenMinable(FeBlocks.silver_ore, 0, 8, Blocks.stone).generate(world, random, genX, genY, genZ);
      }
   }
}



鉱石は確率で生成されているものではなく、チャンクごとの生成量で決まっています。
(塊サイズには運要素が絡みます)

各チャンクに一度ずつ、指定の繰り返し回数と塊サイズで生成を試みられます。
各鉱石の設定はBiomeDecoratorクラスのコンストラクタ及びgenerateOres()メソッドを参照のこと。

ワールドのすべてのブロックが焼石であれば確実に生成されますが、実際は洞窟生成、土塊・砂利塊よりあとに生成処理が呼ばれるため、生成量は確率的に落ちます。
ですので、生成するY高度の設定によっても見つけやすさが変わるので、単純に数値を半分にすれば確率が半分になってくれるというわけでもないです。
きっちり「半分の確率」を求めるのであれば、試行回数を多めにとって、実際の1チャンク内の生成個数を確認するほかないかと。
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0070553b
ダイヤモンド掘り
 
記事: 878
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.293406)

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

投稿記事by ユメミノウツツ » 2017年1月15日(日) 18:53

defeatedcrow さんが書きました:鉱石は確率で生成されているものではなく、チャンクごとの生成量で決まっています。
(塊サイズには運要素が絡みます)

各チャンクに一度ずつ、指定の繰り返し回数と塊サイズで生成を試みられます。
各鉱石の設定はBiomeDecoratorクラスのコンストラクタ及びgenerateOres()メソッドを参照のこと。

ワールドのすべてのブロックが焼石であれば確実に生成されますが、実際は洞窟生成、土塊・砂利塊よりあとに生成処理が呼ばれるため、生成量は確率的に落ちます。
ですので、生成するY高度の設定によっても見つけやすさが変わるので、単純に数値を半分にすれば確率が半分になってくれるというわけでもないです。
きっちり「半分の確率」を求めるのであれば、試行回数を多めにとって、実際の1チャンク内の生成個数を確認するほかないかと。

なるほど、BiomeDecoratorクラスに存在していたのですか。ありがとうございます、探してみます。
実際この銀鉱石自体がそこそこ恐ろしい威力の出る代物なので、まあ数値的な半分にしてそれ以下でもそれ以上でもいいやみたいな感じですので大丈夫です。
何度も何度もありがとうございました。
Javaすら学んでなければ教えてくれる人もいない中Modding始めてみた。ファイアーエムブレムを再現するMODを作りたいけどもリリースできる気がしませんなこれは・・・。
アバター
ユメミノウツツ
ID:207d775a
石掘り
 
記事: 107
登録日時: 2014年3月29日(土) 20:13

  • (PostNo.293430)

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

投稿記事by komugiko » 2017年1月15日(日) 22:59

defeatedcrow さんが書きました:
ヤドカリ さんが書きました:forge 1.7.10の1448で開発をしているのですが、プレイヤーの経験値で攻撃力が変わる剣を作りたいと思っています。
しかし、経験値を取得するのにplayer.getExperienceで出来るのはわかったのですが、playerでエラーが出てしまいます。
public voidとかで何かをしなければいけないと思うのですが、その何かがわかりません。
これを教えていただきたいと思います。よろしくお願いします。


Experienceは「経験値バーが何%溜まっているか」を表す表示なので、いじるべきではありません。

経験値を操作したいなら経験値レベル(ExperienceLevel)か、総量(ExperienceTotal)のintを操作します。


ExperienceTotalは確かスポーンしてから取得した経験値の総量で、操作しても経験値は変わらなかったと思います。
エンチャントなどでレベル消費したときにも減らなかったはずなので、経験値量の取得にも使えないと思われる。
ExperienceLevelとExperienceとxpBarCap()あたりから計算しないとだめだったかと。

Experience*xpBarCap() でバーの分の経験値を計算。
そこからレベルを1つづつさげつつxpBarCap()を加算して0レベルになるまで計算すれば経験値が取得できるはず。
最後にレベルを元に戻すためにあらかじめ保存しておいたレベルをExperienceLevelに入れなおす。

これで計算できたと思います。
komugiko
ID:a394c69a
石炭掘り
 
記事: 202
登録日時: 2013年3月07日(木) 21:26
お住まい: コンフィグファルの中

  • (PostNo.293432)

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

投稿記事by defeatedcrow » 2017年1月15日(日) 23:21

komugiko さんが書きました:
defeatedcrow さんが書きました:
ヤドカリ さんが書きました:forge 1.7.10の1448で開発をしているのですが、プレイヤーの経験値で攻撃力が変わる剣を作りたいと思っています。
しかし、経験値を取得するのにplayer.getExperienceで出来るのはわかったのですが、playerでエラーが出てしまいます。
public voidとかで何かをしなければいけないと思うのですが、その何かがわかりません。
これを教えていただきたいと思います。よろしくお願いします。


Experienceは「経験値バーが何%溜まっているか」を表す表示なので、いじるべきではありません。

経験値を操作したいなら経験値レベル(ExperienceLevel)か、総量(ExperienceTotal)のintを操作します。


ExperienceTotalは確かスポーンしてから取得した経験値の総量で、操作しても経験値は変わらなかったと思います。
エンチャントなどでレベル消費したときにも減らなかったはずなので、経験値量の取得にも使えないと思われる。
ExperienceLevelとExperienceとxpBarCap()あたりから計算しないとだめだったかと。

Experience*xpBarCap() でバーの分の経験値を計算。
そこからレベルを1つづつさげつつxpBarCap()を加算して0レベルになるまで計算すれば経験値が取得できるはず。
最後にレベルを元に戻すためにあらかじめ保存しておいたレベルをExperienceLevelに入れなおす。

これで計算できたと思います。


ExperienceTotalは変動しますし、スポーン後の総量を持っている変数ではありませんよ?
増減処理でこれも加減算されています。EntityPlayer#addExperienceなどのメソッド内容を確認のこと。
変わってないように見えたってのは、サバクラのラグか何かでズレたとかじゃないんですかね…

ほい、拙作MODの一例。これは右クリック時に経験値を一定量消費するやつね
https://github.com/defeatedcrow/JPAddon ... eaver.java

コード: 全て選択
private boolean reduceExp(EntityPlayer player, int i) {
      int exp = player.experienceTotal;
      if (exp < i) {
         return false;
      } else {
         player.addExperience(-i);
         if (player.experience < 0.0F) {
            player.experience = 1.0F;
            player.addExperienceLevel(-1);
         }
         return true;
      }
   }


経験値操作だけなら、
コード: 全て選択
player.addExperience(-i)

で、操作すりゃいい。

ただ、こうするとレベルが下がらずバー上の経験値を使い切ると終わってしまうので、バー内の経験値を使い切ったらレベル低下処理を挟む。
上記は大量消費はしない前提でのソースではあります。レベルに応じてBarの上限が変動するので…
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0070553b
ダイヤモンド掘り
 
記事: 878
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.293436)

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

投稿記事by komugiko » 2017年1月16日(月) 00:13

defeatedcrow さんが書きました:
ExperienceTotalは変動しますし、スポーン後の総量を持っている変数ではありませんよ?
増減処理でこれも加減算されています。EntityPlayer#addExperienceなどのメソッド内容を確認のこと。
変わってないように見えたってのは、サバクラのラグか何かでズレたとかじゃないんですかね…

ほい、拙作MODの一例。これは右クリック時に経験値を一定量消費するやつね
https://github.com/defeatedcrow/JPAddon ... eaver.java

コード: 全て選択
private boolean reduceExp(EntityPlayer player, int i) {
      int exp = player.experienceTotal;
      if (exp < i) {
         return false;
      } else {
         player.addExperience(-i);
         if (player.experience < 0.0F) {
            player.experience = 1.0F;
            player.addExperienceLevel(-1);
         }
         return true;
      }
   }


経験値操作だけなら、
コード: 全て選択
player.addExperience(-i)

で、操作すりゃいい。

ただ、こうするとレベルが下がらずバー上の経験値を使い切ると終わってしまうので、バー内の経験値を使い切ったらレベル低下処理を挟む。
上記は大量消費はしない前提でのソースではあります。レベルに応じてBarの上限が変動するので…


すいません、こちらの確認不足でした。
以前試したときにエンチャントなどレベル消費を行うとExperienceTotalとレベルとバーから計算した経験値がずれたり、ExperienceTotalのみを加減算してもバーに反映されなかった経験があったので、スポーン後の総量だと思い込んでいたようです。
今1.7.10forge1558の環境で確認したところ、ExperienceTotalがレベル消費などで減算されていることを確認できました。
お騒がせして申し訳ありません。

追記:
すいません、先ほどの確認も間違っていました。
コマンドでのレベルアップ、またはエンチャントでのレベル消費時にExperienceTotalが変動していないことを確認しました。
コマンドでの経験値単位での付与では変動していたので、レベル単位での増減時には変化しないものと思われますが、どうでしょう。
komugiko
ID:a394c69a
石炭掘り
 
記事: 202
登録日時: 2013年3月07日(木) 21:26
お住まい: コンフィグファルの中

  • (PostNo.293483)

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

投稿記事by defeatedcrow » 2017年1月16日(月) 21:08

komugiko さんが書きました:
defeatedcrow さんが書きました:
ExperienceTotalは変動しますし、スポーン後の総量を持っている変数ではありませんよ?
増減処理でこれも加減算されています。EntityPlayer#addExperienceなどのメソッド内容を確認のこと。
変わってないように見えたってのは、サバクラのラグか何かでズレたとかじゃないんですかね…

ほい、拙作MODの一例。これは右クリック時に経験値を一定量消費するやつね
https://github.com/defeatedcrow/JPAddon ... eaver.java

コード: 全て選択
private boolean reduceExp(EntityPlayer player, int i) {
      int exp = player.experienceTotal;
      if (exp < i) {
         return false;
      } else {
         player.addExperience(-i);
         if (player.experience < 0.0F) {
            player.experience = 1.0F;
            player.addExperienceLevel(-1);
         }
         return true;
      }
   }


経験値操作だけなら、
コード: 全て選択
player.addExperience(-i)

で、操作すりゃいい。

ただ、こうするとレベルが下がらずバー上の経験値を使い切ると終わってしまうので、バー内の経験値を使い切ったらレベル低下処理を挟む。
上記は大量消費はしない前提でのソースではあります。レベルに応じてBarの上限が変動するので…


すいません、こちらの確認不足でした。
以前試したときにエンチャントなどレベル消費を行うとExperienceTotalとレベルとバーから計算した経験値がずれたり、ExperienceTotalのみを加減算してもバーに反映されなかった経験があったので、スポーン後の総量だと思い込んでいたようです。
今1.7.10forge1558の環境で確認したところ、ExperienceTotalがレベル消費などで減算されていることを確認できました。
お騒がせして申し訳ありません。

追記:
すいません、先ほどの確認も間違っていました。
コマンドでのレベルアップ、またはエンチャントでのレベル消費時にExperienceTotalが変動していないことを確認しました。
コマンドでの経験値単位での付与では変動していたので、レベル単位での増減時には変化しないものと思われますが、どうでしょう。


addExperienceLevel(int i)は文字通りのレベルアップ用処理でして、基本的にレベルの加算しか考慮していないような記述になっているようですね。
ですので、そもそも減らす処理に向いていないというのはありますね…
ちなみに、このメソッドを使った場合でもレベルが0になった場合はTotalもリセットする仕様です。


ユーザーではなくModderさんでしたよね、バニラソースが閲覧できる環境があるわけだし、
ソースを読めばわかることだと思うのですが、ソースを見ずにめくらで検証をしているのは何か理由があるんでしょうか…?
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0070553b
ダイヤモンド掘り
 
記事: 878
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.293508)

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

投稿記事by komugiko » 2017年1月16日(月) 23:48

defeatedcrow さんが書きました:
addExperienceLevel(int i)は文字通りのレベルアップ用処理でして、基本的にレベルの加算しか考慮していないような記述になっているようですね。
ですので、そもそも減らす処理に向いていないというのはありますね…
ちなみに、このメソッドを使った場合でもレベルが0になった場合はTotalもリセットする仕様です。


ユーザーではなくModderさんでしたよね、バニラソースが閲覧できる環境があるわけだし、
ソースを読めばわかることだと思うのですが、ソースを見ずにめくらで検証をしているのは何か理由があるんでしょうか…?


どうも、長々つき合わせてしまい申し訳ありません。

とりあえず確認なのですが、defeatedcrow さんの「経験値を一定量消費するやつ」の中身や、その前の書き込み内容から私は
 『defeatedcrow さんがExperienceTotalから手持ちの経験値量を取得・操作できると考えている』
と認識しているのですが、間違ってなかったでしょうか。
もともとがこれに異を唱える形だったので、この認識が間違っていたとしたらすべてが私の勘違いで、私が平謝りしなければならない状態になります。

一応あっている前提で続きを書きます。

ソースについては見ていないわけではなく、自分の読める範囲で読んだ結果ExperienceTotalが手持ちの経験値量の取得・操作に使えるように見えなかったため、自分の理解の及ばない範囲で手持ちの経験値量とExperienceTotalを同期するような処理がある可能性を考えて実際に動かしながら調べてみた、と言う形になります。
「レベルが0になった場合はTotalもリセットする」などの部分も認識はしていますが、逆にいえば0にならない限りレベルとTotalの同期が取られないとも考えています。

ソースを読んだ限りでは、addExperienceメソッド内では確かにTotalとExperienceが連動しているのはわかりますし、自分で経験値の消費処理を考えたときにも散々読んだ部分ではあります。
しかし、ContainerEnchantment内で呼んでいるaddExperienceLevel内ではその連動を行う処理がないことから、エンチャントなどを行ってレベルを変化させるとどうしてもTotalと表示上の経験値にずれが出てしまうように思えます。
具体的には、エンチャントで消費した分だけTotalのほうが表示より多くなるのではないかと思っています。
このあたりが私がExperienceTotalを「スポーンしてから取得した経験値の総量」と認識した理由になります。

defeatedcrow さんの「経験値を一定量消費するやつ」を見たり、その前の書き込み内容からはExperienceTotalから手持ちの経験値量を取得できるとしているようですが、addExperienceLevelを呼ぶなどしてずれたTotalと表示上の経験値をどうすり合わせているのかバニラソースの経験値周りを見ただけでは見えてこず、実際に動かした結果でずれがあるのではないか?と意見させていただいた形になります。
実際ExperienceTotalの呼び出し先をeclipseの機能を使って一通り回ってみても、このずれを解消する部分がまったく見えない形でした。
あるいは、ExperienceTotalと表示上の経験値はずれていても良い、と言う認識なのでしょうか。

あと、addExperienceLevelはレベルアップ用処理とのことですが、ソース読んだ感じContainerEnchantment内で減算処理として呼ばれていることや、0になったときの処理が書かれているのを見るとアップ用とは言い切れない気がします。

どちらかと言えばレベルダウン処理の書かれていないaddExperienceのほうがアップ用処理と言う気がしますし、「経験値を一定量消費するやつ」の処理の中でも、この減算処理だと最後にplayer.experience = 1.0Fしているので消費の端数が経験値バーに反映されないのでは?と言う疑問がわきます。
このあたりは実際に導入してみて動きを見てみようと思っています。

まとめべたなので長くなってしまって申し訳ないです。

追記:
「経験値を一定量消費するやつ」のアイテム使ってみましたが、やはりコマンドでのレベルアップ分を経験値として認識していないのか、コマンドで追加したレベルに達すると使えなくなります。
ExperienceTotalと表示上の経験値はやはり別として認識している、と言う解釈でいいのでしょうか。
そうなると、表示上の経験値を消費するためには前述の計算で総量を割り出さないといけない気がします。
komugiko
ID:a394c69a
石炭掘り
 
記事: 202
登録日時: 2013年3月07日(木) 21:26
お住まい: コンフィグファルの中

  • (PostNo.293516)

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

投稿記事by defeatedcrow » 2017年1月17日(火) 01:34

komugiko さんが書きました:
defeatedcrow さんが書きました:
addExperienceLevel(int i)は文字通りのレベルアップ用処理でして、基本的にレベルの加算しか考慮していないような記述になっているようですね。
ですので、そもそも減らす処理に向いていないというのはありますね…
ちなみに、このメソッドを使った場合でもレベルが0になった場合はTotalもリセットする仕様です。


ユーザーではなくModderさんでしたよね、バニラソースが閲覧できる環境があるわけだし、
ソースを読めばわかることだと思うのですが、ソースを見ずにめくらで検証をしているのは何か理由があるんでしょうか…?


どうも、長々つき合わせてしまい申し訳ありません。

とりあえず確認なのですが、defeatedcrow さんの「経験値を一定量消費するやつ」の中身や、その前の書き込み内容から私は
 『defeatedcrow さんがExperienceTotalから手持ちの経験値量を取得・操作できると考えている』
と認識しているのですが、間違ってなかったでしょうか。
もともとがこれに異を唱える形だったので、この認識が間違っていたとしたらすべてが私の勘違いで、私が平謝りしなければならない状態になります。

一応あっている前提で続きを書きます。

ソースについては見ていないわけではなく、自分の読める範囲で読んだ結果ExperienceTotalが手持ちの経験値量の取得・操作に使えるように見えなかったため、自分の理解の及ばない範囲で手持ちの経験値量とExperienceTotalを同期するような処理がある可能性を考えて実際に動かしながら調べてみた、と言う形になります。
「レベルが0になった場合はTotalもリセットする」などの部分も認識はしていますが、逆にいえば0にならない限りレベルとTotalの同期が取られないとも考えています。

ソースを読んだ限りでは、addExperienceメソッド内では確かにTotalとExperienceが連動しているのはわかりますし、自分で経験値の消費処理を考えたときにも散々読んだ部分ではあります。
しかし、ContainerEnchantment内で呼んでいるaddExperienceLevel内ではその連動を行う処理がないことから、エンチャントなどを行ってレベルを変化させるとどうしてもTotalと表示上の経験値にずれが出てしまうように思えます。
具体的には、エンチャントで消費した分だけTotalのほうが表示より多くなるのではないかと思っています。
このあたりが私がExperienceTotalを「スポーンしてから取得した経験値の総量」と認識した理由になります。

defeatedcrow さんの「経験値を一定量消費するやつ」を見たり、その前の書き込み内容からはExperienceTotalから手持ちの経験値量を取得できるとしているようですが、addExperienceLevelを呼ぶなどしてずれたTotalと表示上の経験値をどうすり合わせているのかバニラソースの経験値周りを見ただけでは見えてこず、実際に動かした結果でずれがあるのではないか?と意見させていただいた形になります。
実際ExperienceTotalの呼び出し先をeclipseの機能を使って一通り回ってみても、このずれを解消する部分がまったく見えない形でした。
あるいは、ExperienceTotalと表示上の経験値はずれていても良い、と言う認識なのでしょうか。

あと、addExperienceLevelはレベルアップ用処理とのことですが、ソース読んだ感じContainerEnchantment内で減算処理として呼ばれていることや、0になったときの処理が書かれているのを見るとアップ用とは言い切れない気がします。

どちらかと言えばレベルダウン処理の書かれていないaddExperienceのほうがアップ用処理と言う気がしますし、「経験値を一定量消費するやつ」の処理の中でも、この減算処理だと最後にplayer.experience = 1.0Fしているので消費の端数が経験値バーに反映されないのでは?と言う疑問がわきます。
このあたりは実際に導入してみて動きを見てみようと思っています。

まとめべたなので長くなってしまって申し訳ないです。


そもそもの発端は
ヤドカリ さんが書きました:forge 1.7.10の1448で開発をしているのですが、プレイヤーの経験値で攻撃力が変わる剣を作りたいと思っています。
しかし、経験値を取得するのにplayer.getExperienceで出来るのはわかったのですが、playerでエラーが出てしまいます。
public voidとかで何かをしなければいけないと思うのですが、その何かがわかりません。
これを教えていただきたいと思います。よろしくお願いします。

質問に対する答えです。
目的はコレの解決であって、ぼくはこの質問を念頭に置いて書き込みをしています。

ぼくが最初に書いているのは、getExperienceではトータルの経験値確認ができないよっていう話と、”このひとはplayer.experienceを直接いじってるんじゃねぇかな?”という予想で、それだと上手くできないんじゃないかなという回答です。
算出にTotalかLevelを使わないと総量が分からず、バー上の経験値しかわからないよって趣旨の話と、PlayerMPではTotalをつかって経験値の変動をチェックしてパケットを飛ばしているので、experiencsだけ書き換えても同期されない可能性があるんじゃないかなぁと。
とりあえず書き込んで、例示(上で挙げたやつ)を貼り付けに来るまでにこうなってたという感じですね。
(この辺に関してはぼくにも非があると思っています。もうちょっと回答の体裁を整えてから書き込みに来るべきでしたね…)

ただ、そもそも質問者がどういうことがしたいか、現状これは相当なエスパー質問なので、詳細の回答はしようもないし、質問者の返信待ちというのが今の状況です。
質問者がどういう操作をしたのかわからないですし。おそらくはaddExperience()メソッドで少々減らせばいいんだとは思うのですが、説明することが多そうなので…

####

あと、TotalはEntityPlayerMP.onUpdateEntity()で変化をチェックしていて、変動があるとパケットを投げて同期される仕組みになっています。
ですから、もしplayer.experienceを直接いじっていると、addExperience()メソッドと違ってTotalが変化せず同期されない可能性があるので、回答でそれを直接いじるべきではないよって書いている。

Totalとのズレがどこで解消されるのかわからないと仰っていますが、再計算している場所もaddExperience()です。(プラスの変化があるとfor文部分の処理によってバーの計算をしているので。)つまりバニラ処理の中では、EXPオーブを拾った時に修正されます。

エンチャントに関しては、ぶっちゃけ変化量がマイナスの時にバー更新をパスするような構造の処理を使って減算しているバニラの処理に問題があるような気もするので、おかしいと思ったなら、バニラの方に不具合報告を投げるとか、forgeにissue持ち込むとか、そういう手もあります。
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0070553b
ダイヤモンド掘り
 
記事: 878
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.293522)

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

投稿記事by komugiko » 2017年1月17日(火) 07:24

defeatedcrow さんが書きました:
そもそもの発端は
ヤドカリ さんが書きました:forge 1.7.10の1448で開発をしているのですが、プレイヤーの経験値で攻撃力が変わる剣を作りたいと思っています。
しかし、経験値を取得するのにplayer.getExperienceで出来るのはわかったのですが、playerでエラーが出てしまいます。
public voidとかで何かをしなければいけないと思うのですが、その何かがわかりません。
これを教えていただきたいと思います。よろしくお願いします。

質問に対する答えです。
目的はコレの解決であって、ぼくはこの質問を念頭に置いて書き込みをしています。

ぼくが最初に書いているのは、getExperienceではトータルの経験値確認ができないよっていう話と、”このひとはplayer.experienceを直接いじってるんじゃねぇかな?”という予想で、それだと上手くできないんじゃないかなという回答です。
算出にTotalかLevelを使わないと総量が分からず、バー上の経験値しかわからないよって趣旨の話と、PlayerMPではTotalをつかって経験値の変動をチェックしてパケットを飛ばしているので、experiencsだけ書き換えても同期されない可能性があるんじゃないかなぁと。
とりあえず書き込んで、例示(上で挙げたやつ)を貼り付けに来るまでにこうなってたという感じですね。
(この辺に関してはぼくにも非があると思っています。もうちょっと回答の体裁を整えてから書き込みに来るべきでしたね…)

ただ、そもそも質問者がどういうことがしたいか、現状これは相当なエスパー質問なので、詳細の回答はしようもないし、質問者の返信待ちというのが今の状況です。
質問者がどういう操作をしたのかわからないですし。おそらくはaddExperience()メソッドで少々減らせばいいんだとは思うのですが、説明することが多そうなので…

####

あと、TotalはEntityPlayerMP.onUpdateEntity()で変化をチェックしていて、変動があるとパケットを投げて同期される仕組みになっています。
ですから、もしplayer.experienceを直接いじっていると、addExperience()メソッドと違ってTotalが変化せず同期されない可能性があるので、回答でそれを直接いじるべきではないよって書いている。

Totalとのズレがどこで解消されるのかわからないと仰っていますが、再計算している場所もaddExperience()です。(プラスの変化があるとfor文部分の処理によってバーの計算をしているので。)つまりバニラ処理の中では、EXPオーブを拾った時に修正されます。

エンチャントに関しては、ぶっちゃけ変化量がマイナスの時にバー更新をパスするような構造の処理を使って減算しているバニラの処理に問題があるような気もするので、おかしいと思ったなら、バニラの方に不具合報告を投げるとか、forgeにissue持ち込むとか、そういう手もあります。


どうも。
「質問に対する答え」が目的であるべきなのはその通りです。
「getExperienceではトータルの経験値確認ができない」もこれは同意します。
ただ、実際Totalからは経験値のレベルとバーを含めた「見かけ上の経験値」の総量は得られていないと思われるので、その方法は勧められないと意見しているわけです。
addExperience()内のforの処理は見たところexperience >= 1.0Fの時のレベルアップ処理と、端数を次のplayer.xpBarCap()に合わせる処理だけでTotalとの兼ね合いの修正はされていないと見えます。
addExperience()を通さずに得た、もしくは失った経験値はその後オーブを拾おうが何しようがTotalには反映されませんし、実際あなたが見せてくださったソースのMODでも反映されていません。
逆にTotalからバーへの反映もされていないと見えます。
同期に関してはTotalの変動なくても自前でS1FPacketSetExperienceを投げると言う手もありそうな気がします。
あとエンチャントの減算処理は別におかしくないと思います。

おかしいと思っているのはレベルとバーを含めた「見かけ上の経験値」と必ずしも一致するわけではないTotalを経験値の総量として使おうとしていることです。
komugiko
ID:a394c69a
石炭掘り
 
記事: 202
登録日時: 2013年3月07日(木) 21:26
お住まい: コンフィグファルの中

  • (PostNo.293540)

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

投稿記事by defeatedcrow » 2017年1月17日(火) 15:34

komugiko さんが書きました:
defeatedcrow さんが書きました:
そもそもの発端は
ヤドカリ さんが書きました:forge 1.7.10の1448で開発をしているのですが、プレイヤーの経験値で攻撃力が変わる剣を作りたいと思っています。
しかし、経験値を取得するのにplayer.getExperienceで出来るのはわかったのですが、playerでエラーが出てしまいます。
public voidとかで何かをしなければいけないと思うのですが、その何かがわかりません。
これを教えていただきたいと思います。よろしくお願いします。

質問に対する答えです。
目的はコレの解決であって、ぼくはこの質問を念頭に置いて書き込みをしています。

ぼくが最初に書いているのは、getExperienceではトータルの経験値確認ができないよっていう話と、”このひとはplayer.experienceを直接いじってるんじゃねぇかな?”という予想で、それだと上手くできないんじゃないかなという回答です。
算出にTotalかLevelを使わないと総量が分からず、バー上の経験値しかわからないよって趣旨の話と、PlayerMPではTotalをつかって経験値の変動をチェックしてパケットを飛ばしているので、experiencsだけ書き換えても同期されない可能性があるんじゃないかなぁと。
とりあえず書き込んで、例示(上で挙げたやつ)を貼り付けに来るまでにこうなってたという感じですね。
(この辺に関してはぼくにも非があると思っています。もうちょっと回答の体裁を整えてから書き込みに来るべきでしたね…)

ただ、そもそも質問者がどういうことがしたいか、現状これは相当なエスパー質問なので、詳細の回答はしようもないし、質問者の返信待ちというのが今の状況です。
質問者がどういう操作をしたのかわからないですし。おそらくはaddExperience()メソッドで少々減らせばいいんだとは思うのですが、説明することが多そうなので…

####

あと、TotalはEntityPlayerMP.onUpdateEntity()で変化をチェックしていて、変動があるとパケットを投げて同期される仕組みになっています。
ですから、もしplayer.experienceを直接いじっていると、addExperience()メソッドと違ってTotalが変化せず同期されない可能性があるので、回答でそれを直接いじるべきではないよって書いている。

Totalとのズレがどこで解消されるのかわからないと仰っていますが、再計算している場所もaddExperience()です。(プラスの変化があるとfor文部分の処理によってバーの計算をしているので。)つまりバニラ処理の中では、EXPオーブを拾った時に修正されます。

エンチャントに関しては、ぶっちゃけ変化量がマイナスの時にバー更新をパスするような構造の処理を使って減算しているバニラの処理に問題があるような気もするので、おかしいと思ったなら、バニラの方に不具合報告を投げるとか、forgeにissue持ち込むとか、そういう手もあります。


どうも。
「質問に対する答え」が目的であるべきなのはその通りです。
「getExperienceではトータルの経験値確認ができない」もこれは同意します。
ただ、実際Totalからは経験値のレベルとバーを含めた「見かけ上の経験値」の総量は得られていないと思われるので、その方法は勧められないと意見しているわけです。
addExperience()内のforの処理は見たところexperience >= 1.0Fの時のレベルアップ処理と、端数を次のplayer.xpBarCap()に合わせる処理だけでTotalとの兼ね合いの修正はされていないと見えます。
addExperience()を通さずに得た、もしくは失った経験値はその後オーブを拾おうが何しようがTotalには反映されませんし、実際あなたが見せてくださったソースのMODでも反映されていません。
逆にTotalからバーへの反映もされていないと見えます。
同期に関してはTotalの変動なくても自前でS1FPacketSetExperienceを投げると言う手もありそうな気がします。
あとエンチャントの減算処理は別におかしくないと思います。

おかしいと思っているのはレベルとバーを含めた「見かけ上の経験値」と必ずしも一致するわけではないTotalを経験値の総量として使おうとしていることです。


Totalは判定には使っていますが、ぼくのソース内でもaddExperience()を通した変更を想定していますが…

要するにあなたの主張は、ぼくが「メソッドを通さないでToralを直接変更している」としたうえで、その上で撤回を要求しているよ、と、そういうことですかね…??
ぼくの最初の回答のあの二行から、そう見えたのなら申し訳ないです。
諸々の説明が足りていませんでしたね。あと、Totalの利用でBarとレベルからの経験値算出が省力化できるともくろんでいたのは確かで、この部分はたしかにぼくが間違っていたようです。申し訳ございませんでした。

これ以上続くと、ぼくに対する個人的返信でトピックが埋まってしまいそうですし、それはフォーラムに対してもご迷惑になってしまいますので、すみませんが一連の回答は撤回させていただきます。
ご迷惑をおかけしてしまい、申し訳ございませんでした。

ぼく自身の検証が足りていないのも確かなので、記述に間違いがあったようですね。
質問者が混乱してしまうのも良くないですし、よりお詳しい方に質問者の方への回答はおまかせしようかと思います。
そういうことなので、できればぼくに対してよりも、質問者の方でもわかりやすいような形で返信してあげてください。よろしくお願いします。
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0070553b
ダイヤモンド掘り
 
記事: 878
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.293559)

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

投稿記事by komugiko » 2017年1月17日(火) 20:05

自分もそろそろ撤回して謝罪すべきと考えていましたが、先を越されたようです。
defeatedcrowさんならびにトピック利用者の方々にご迷惑をおかけしたことを謝罪させてください。
このたびはトピックを騒がせる結果になり、申し訳ありませんでした。

あと、失礼を重ねるようで申し訳ないですが、最後の返信をさせていただけるならば、最初の認識としては「最初の二行からメソッドを通さないでToralを直接変更している」と考えて反対したと言う認識はその通りです。
メソッドを通していると聞いて以降は、バニラのエンチャントのようにdefeatedcrowさん以外の手でメソッドを通さないで直接経験値を変更された場合の懸念について述べていたつもりです。

今回は謝罪が目的であるため、返信の部分は迷惑になるようなら削除していただけるとありがたいです。
連絡を受ければ自ら謝罪部分以外を訂正削除するつもりです。
また、必要であれば罰則・処分なども言い渡していただければと思っています。

お騒がせして申し訳ありませんでした。
komugiko
ID:a394c69a
石炭掘り
 
記事: 202
登録日時: 2013年3月07日(木) 21:26
お住まい: コンフィグファルの中

  • (PostNo.293880)

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

投稿記事by ポセイ丼(中盛) » 2017年1月22日(日) 00:16

ver1.10.2にてとあるアイテムの追加を計画しているのですが、以下の動作を追加する途中で行き詰まってしまいました。
よろしければどなたか知恵を貸していただけませんか。


開発環境
・Minecraft ver1.10.2
・Minecraft Forge 12.18.2.2099 以上

追加したい動作内容
・追加したアイテムを持っている時にプレイヤーが見ているブロックとその周りのブロックの表面にエフェクトを表示させる
・表示させるエフェクトはSpawnChecker(ale氏 作)のマーカーのようなもので、EconomicalMilkTea(defeatedcrow氏 作)の建設チケットのようにこちらでテクスチャ等を指定するもの

分からないところ
・RenderingRegistry.registerEntityRenderingHandler(Class<T> entityClass, IRenderFactory<? super T> renderFactory)の使用方法

補足
・RenderingRegistry.registerEntityRenderingHandler(Class<? extends Entity> entityClass, Render<? extends Entity> renderer)もあるのですが、そちらはDeprecatedとなっており1.11にて削除されるらしくなるべく使用を避けようかと思っています。
最後に編集したユーザー ポセイ丼(中盛) [ 2017年1月25日(水) 19:46 ], 累計 1 回
画像

1.10.2に移動中…
アバター
ポセイ丼(中盛)
ID:9dcbcfa6
大工さん
 
記事: 67
登録日時: 2015年5月06日(水) 07:47

  • (PostNo.293951)

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

投稿記事by じゃいさん » 2017年1月22日(日) 18:25

MCREATDRについての質問なのですが
このような不具合が出ます
どうすればいいですか?
警告: [options] ブートストラップ・クラスパスが-source 1.6と一緒に設定されていません
警告1個
:compileJava
:processResources UP-TO-DATE
:classes
:jar UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:reobf FAILED
FAILURE: Build failed with an exception.
BUILD FAILED
Total time: 37.108 secs
* What went wrong:
Execution failed for task ':reobf'.
> MALFORMED
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
C:\Pylo\MCreator172\forge>
Task completed with return code 0 in 37533 milliseconds
じゃいさん
ID:a9602549
水から上がったとこ
 
記事: 3
登録日時: 2017年1月22日(日) 18:15

  • (PostNo.293984)

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

投稿記事by ユメミノウツツ » 2017年1月22日(日) 22:09

じゃいさん さんが書きました:MCREATDRについての質問なのですが
このような不具合が出ます
どうすればいいですか?
警告: [options] ブートストラップ・クラスパスが-source 1.6と一緒に設定されていません
警告1個
:compileJava
:processResources UP-TO-DATE
:classes
:jar UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:reobf FAILED
FAILURE: Build failed with an exception.
BUILD FAILED
Total time: 37.108 secs
* What went wrong:
Execution failed for task ':reobf'.
> MALFORMED
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
C:\Pylo\MCreator172\forge>
Task completed with return code 0 in 37533 milliseconds

自分もちょうど昨日同じエラーに悩まされましたw
自分の場合srcフォルダ内に関係ないファイルが含まれていたので取り除いたら無事正常に動きましたが、混じっていたりしませんでしょうか?
Javaすら学んでなければ教えてくれる人もいない中Modding始めてみた。ファイアーエムブレムを再現するMODを作りたいけどもリリースできる気がしませんなこれは・・・。
アバター
ユメミノウツツ
ID:207d775a
石掘り
 
記事: 107
登録日時: 2014年3月29日(土) 20:13

  • (PostNo.294062)

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

投稿記事by ヤドカリ » 2017年1月23日(月) 21:10

ヤドカリ さんが書きました:forge 1.7.10の1448で開発をしているのですが、プレイヤーの経験値で攻撃力が変わる剣を作りたいと思っています。
しかし、経験値を取得するのにplayer.getExperienceで出来るのはわかったのですが、playerでエラーが出てしまいます。
public voidとかで何かをしなければいけないと思うのですが、その何かがわかりません。
これを教えていただきたいと思います。よろしくお願いします。


自分の説明不足により混乱を招いてしまい、申し訳ございません。
まだまだ力不足のため、この剣の開発はやらない、という方向にします。
ご迷惑をおかけした方、申し訳ございませんでした。
ヤドカリ
ID:53b9de8c
木を殴ってる
 
記事: 13
登録日時: 2016年2月11日(木) 13:54

1つ前へ次へ

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

x