◆総合◆Modderのための雑談所

クライアント/サーバーMODの開発に関する話題、技術交換はこちらで。質問は質問フォーラムへお願いします。
  • (PostNo.85271)

Re: ◆総合◆Modderのための雑談所

投稿記事by dewfalse » 2013年3月11日(月) 02:17

eclipseのデバッグ実行しか使ってない・・・
mcpのテスト実行ってなんだろう?startclient.batとかなのかな?
dewfalse
ID:585e9659
金掘り
 
記事: 373
登録日時: 2012年2月28日(火) 21:09

  • (PostNo.85469)

Re: ◆総合◆Modderのための雑談所

投稿記事by takanasayo » 2013年3月12日(火) 12:32

Forge1.5来てたー!!!!!!!
http://files.minecraftforge.net/

3/14前になんとかMOD更新できそうだ。良かったー。

追記:
なんかインストールでエラーでまくったけど、何度もインストール繰り返したら成功した。
なんじゃろな・・・?

追追記:
World、Dispenser、Item、Block、その他もろもろの名前や引数が変更になっててエラー地獄が・・・。
1.2→1.3ほどじゃないけど、結構な数の書き換えを行う必要があってキツイ。
StackSizeChange程度のMODで80もエラーが出るとか勘弁してくれ・・・orz
WorldはsetBlock系がほとんどなくなってたり、setBlockAndMetadataWithNotifyに謎引数が追加されてたりで中々カオス。その辺のMOD作ってた人は地獄かも。
Dispenser関連はスーパークラスのコンストラクタから変わってるから全部書き直しだし、Block、Item追加系はテクスチャと名前の仕様変更でこれまた全部書き直し。
Block.setRequiresSelfNotify()は廃止。
この調子だと、Entity関連もヤバそう。
今回、久しぶりに「Modderにとって」の大型アップデートなので、またModder減るかもなぁ・・・

あれ?BonemealEventに渡されるEntityPlayerがダミーになってる?
これどうやってPlayer取得すんだよ・・・orz

あとgetVersion()のバージョン情報がForgeのModsリストに反映されないっぽい。
不具合なのか仕様変更なのか・・・

TMI入れるとForge動かないのか・・・不便だな・・・

dewfalse さんが書きました:mcpのテスト実行ってなんだろう?startclient.batとかなのかな?

ですね。
たまに起動しなかったりMOD導入できなかったり色々。
最後に編集したユーザー takanasayo [ 2013年3月12日(火) 18:51 ], 累計 2 回
アバター
takanasayo
ID:615323e4
ラピスラズリ収集家
 
記事: 954
登録日時: 2012年7月26日(木) 04:00

  • (PostNo.85484)

Re: ◆総合◆Modderのための雑談所

投稿記事by reginn666 » 2013年3月12日(火) 15:05

world#setBlock~あたりの新しい引数はchunkに対する更新フラグだそうです(Ferneさんが解析してくれました). 1bit目が周囲に対する更新のフラグ(従来のwithNotify), 2bit目がchunk変更通知フラグとのこと. 全てのパターンを列挙すると以下の通り.

コード: 全て選択
world.setBlockAndMetadataWithNotify(x, y, z, blockID, metadata, 0); // どこにも更新を通達しない
world.setBlockAndMetadataWithNotify(x, y, z, blockID, metadata, 1); // 周囲のブロックにのみ通達する
world.setBlockAndMetadataWithNotify(x, y, z, blockID, metadata, 2); // 自身が属するchunkに変更を通達する, 周囲のブロックには通達されない
world.setBlockAndMetadataWithNotify(x, y, z, blockID, metadata, 3); // 周囲のブロックとchunkに変更を通達する


フラグに2を指定すると水流を変化させない設置などが出来るとのこと. ここらへんのnotifyの変更は恐らく光源演算まわりの影響を受けて変更されたのかも?
ちなみにsetBlockAndMetadataWithNotify以外のsetBlock系の最後の引数も同じフラグです.

追記

新しいテクスチャの利用法についてModding Wikiにまとめておきました.
新しいテクスチャの利用 -Modding Wiki


追記2
world.setBlockAndMetadataWithNotify(x, y, z, blockID, metadata, 4)で4じゃなくて3でした.
最後に編集したユーザー reginn666 [ 2013年3月12日(火) 18:05 ], 累計 1 回
githubにソースおいてます。
https://github.com/reginn
reginn666
ID:ccb23cf1
木を殴ってる
 
記事: 23
登録日時: 2012年3月17日(土) 22:01

  • (PostNo.85512)

Re: ◆総合◆Modderのための雑談所

投稿記事by takanasayo » 2013年3月12日(火) 17:37

1.5Forgeのイベントで骨粉の処理を行う場合、注意が必要です。
ItemDyeで骨粉使用時にBonemealEventを呼びますが、その際になぜかダミーのEntityPlayerを渡すように変更されているため、event.playerを参照して骨粉のスタックを減らそうとするとヌルポで落ちます。
ブロック側で骨粉の判定を行う場合、どこからか(onBlockActivate辺りから)EntityPlayerへのインスタンスを取得してこないと、骨粉を消費できなくなってしまいます。

reginn666 さんが書きました: 

あれ?私が調べたデータと違う・・・
もう一度見直してみるか。
アバター
takanasayo
ID:615323e4
ラピスラズリ収集家
 
記事: 954
登録日時: 2012年7月26日(木) 04:00

  • (PostNo.85533)

Re: ◆総合◆Modderのための雑談所

投稿記事by reginn666 » 2013年3月12日(火) 18:04

takanasayo さんが書きました:1.5Forgeのイベントで骨粉の処理を行う場合、注意が必要です。
ItemDyeで骨粉使用時にBonemealEventを呼びますが、その際になぜかダミーのEntityPlayerを渡すように変更されているため、event.playerを参照して骨粉のスタックを減らそうとするとヌルポで落ちます。
ブロック側で骨粉の判定を行う場合、どこからか(onBlockActivate辺りから)EntityPlayerへのインスタンスを取得してこないと、骨粉を消費できなくなってしまいます。

reginn666 さんが書きました: 

あれ?私が調べたデータと違う・・・
もう一度見直してみるか。


自分もFerneさんに教えていただいてちょっと調べただけなので、自分の解釈が間違ってるかもしれないです. あとBonemealEventは処理成功時にsetResult(ALLOW)してやればスタック数はItemDye側で減らしてくれます. 自分のmodの該当部分で表すと,

コード: 全て選択
if (!world.isRemote)
{
   if ((double)world.rand.nextFloat() < 0.45D)
   {
      ((BlockEbonySapling)ElvenBlock.blockEbonySapling).func_96477_c(world, x, y, z, world.rand);
   }
   world.playAuxSFX(2005, x, y, z, 0);
   event.setResult(Event.Result.ALLOW);
}


処理失敗時にevent.setResult(Event.Result.DENY)する必要はないですね. DENYしてしまうとスタック数が減らなくなります.
githubにソースおいてます。
https://github.com/reginn
reginn666
ID:ccb23cf1
木を殴ってる
 
記事: 23
登録日時: 2012年3月17日(土) 22:01

  • (PostNo.85540)

Re: ◆総合◆Modderのための雑談所

投稿記事by takanasayo » 2013年3月12日(火) 18:19

reginn666 さんが書きました:あとBonemealEventは処理成功時にsetResult(ALLOW)してやればスタック数はItemDye側で減らしてくれます.

あーなるー。そういうことか。
しかもItemDyeをよく見れば解る事だったorz
情報どうもです。

追記:
1.5対応終了ー。
あとはOptiFineがいつ来るかだなー。
このままだと更新者無しになりそう。
アバター
takanasayo
ID:615323e4
ラピスラズリ収集家
 
記事: 954
登録日時: 2012年7月26日(木) 04:00

  • (PostNo.85996)

Re: ◆総合◆Modderのための雑談所

投稿記事by takanasayo » 2013年3月14日(木) 10:29

world.setBlockAndMetadataWithNotify(x, y, z, blockID, metadata, flag);について
私が調べた所、以下のような感じでした。

flag & 1 != 0
周囲6方向のブロックのblock.onNeighborBlockChange(World, x, y, z, 置き換え前のid)を呼び出し、
置き換え後blockの func_96468_q_() がtrue(インベントリを持つブロック?)の場合、
水平方向に隣接しているブロックのblock.onNeighborBlockChange(World, x, y, z, 置き換え後のid) を呼び出す。

flag & 2 != 0
ブロックが設置されたチャンクを更新する。

flag & 4 != 0
flag 2 のチャンク更新時に、Client側ではチャンクの更新を行わない。

端的に言うと、
case flag
 0,4: なにもしない
 1,5: 周囲に更新を通知する
 2: Client、Server両方でチャンクを更新する(描画の更新)
 3: 周囲に変更を通知し、Client、Server両方でチャンクを更新する
 6: Server側のみチャンクを更新する
 7: 周囲に変更を通知し、Server側のみチャンクを更新する

なお、設置したブロックがID、Metadataともに既存のブロックと同じ場合は処理が行われない。
周囲のブロックに変更の通知だけを送りたい場合は、world.notifyBlockChange(x, y, z, id); を使用する。

追記:
1.5.1でworld.setBlockAndMetadataWithNotify が world.setBlock に変わっています。
最後に編集したユーザー takanasayo [ 2013年3月31日(日) 11:15 ], 累計 3 回
アバター
takanasayo
ID:13deabca
ラピスラズリ収集家
 
記事: 954
登録日時: 2012年7月26日(木) 04:00

  • (PostNo.86082)

Re: ◆総合◆Modderのための雑談所

投稿記事by squarep » 2013年3月14日(木) 18:04

チュートリアルが使えなくなる日がとうとう来たか...
しかもただ重くなるだけっぽいアプデだし。
block.onNeighborBlockChangeをみてネギボーズに空目してしまったorz
squarep
ID:78321e12
ラピスラズリ収集家
 
記事: 1367
登録日時: 2012年8月25日(土) 16:29

  • (PostNo.86094)

Re: ◆総合◆Modderのための雑談所

投稿記事by tuyapin » 2013年3月14日(木) 19:01

squarep さんが書きました:チュートリアルが使えなくなる日がとうとう来たか...
しかもただ重くなるだけっぽいアプデだし。
block.onNeighborBlockChangeをみてネギボーズに空目してしまったorz

だが私は軽くなった(若干

Modding環境で浮遊島世界以外でFPS60なんか見たこと無い
アバター
tuyapin
ID:8a54b2b8
鉄鉱掘り
 
記事: 344
登録日時: 2011年12月19日(月) 23:21

  • (PostNo.86170)

Re: ◆総合◆Modderのための雑談所

投稿記事by ayamitsu » 2013年3月15日(金) 00:18

Forgeさんのdeobfuscationの影響で難読化気にせずできるかなーと思っていたところ、asmで変えたいなーと思いIClassTransformerを実装、transformというメソッドが
コード: 全て選択
public byte[] transform(String name, String transformedName, byte[] bytes)

という引数の増えたものに。
1.5では、EntityLivingの場合は、nameには"ng"(難読化後の名前)、transformedNameには"net.minecraft.entity.EntityLiving"(Forge環境での名前)に。
そして、
コード: 全て選択
ClassNode cNode = new ClassNode();
ClassReader cReader = new ClassReader(bytes);
cReader.accept(cNode, 0);

ClassWriter cWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
cNode.accept(cWriter);
return cWriter.toByteArray();

として、中身に変更を加えるようなことは手を加えずにClassWriterのtoByteArrayでbyte配列でだしてreturnするような処理をしてみたところ、例外を吐かれました。
ClassWriterをClassNodeのacceptにいれた時点でダメらしいです。

しにそうです

追記:
FMLDeobfuscatingRemapperというのをみつけまして、ClassWriterのgetCommonSuperClassをオーバーライドし、
コード: 全て選択
@Override
public String getCommonSuperClass(String type1, String type2)
{
   return FMLDeobfuscatingRemapper.INSTANCE.map(type1);
}

とすることによってとりあえずいける・・・のかな?という状態に。
DeobfuscationTransformerの方がもう少しよさそうな気もしつつ。
最後に編集したユーザー ayamitsu [ 2013年3月17日(日) 23:48 ], 累計 1 回
アバター
ayamitsu
ID:40fb00df
ラピスラズリ収集家
 
記事: 1068
登録日時: 2011年8月10日(水) 19:04

  • (PostNo.86871)

Re: ◆総合◆Modderのための雑談所

投稿記事by pc12 » 2013年3月17日(日) 23:29

MOD作成中に細かいVersionUPがあって互換性が失われるという!
かなり疲れるんだよねww
大型MOD EDOCraft作成中!
トピック↓
viewtopic.php?t=8888
プロジェクト参加者募集中!募集要項↓
viewtopic.php?f=21&t=5156&p=88915#p88915
アイデア募集中!トピック↓
viewtopic.php?f=9&t=11009
pc12
ID:164bbb5d
石掘り
 
記事: 115
登録日時: 2012年7月27日(金) 10:46

  • (PostNo.87352)

Re: ◆総合◆Modderのための雑談所

投稿記事by NurseAngel » 2013年3月20日(水) 00:40

Block.isProvidingStrongPower()なのに返り値がintってのはどういうことだってばよ。
NurseAngel
ID:36a0fd66
石炭掘り
 
記事: 205
登録日時: 2012年3月17日(土) 21:38

  • (PostNo.87380)

Re: ◆総合◆Modderのための雑談所

投稿記事by takanasayo » 2013年3月20日(水) 03:46

MC1.5.1pre http://www.mojang.com/2013/03/minecraft-1-5-1-pre-release/

調べたらファイル数変更 → MODの互換性なくなった

いきなりかよ・・・orz
アバター
takanasayo
ID:13deabca
ラピスラズリ収集家
 
記事: 954
登録日時: 2012年7月26日(木) 04:00

  • (PostNo.87415)

Re: ◆総合◆Modderのための雑談所

投稿記事by squarep » 2013年3月20日(水) 10:48

takanasayo さんが書きました:MC1.5.1pre http://www.mojang.com/2013/03/minecraft-1-5-1-pre-release/

調べたらファイル数変更 → MODの互換性なくなった

いきなりかよ・・・orz

様子見しといたほうが良いですかね....
どのverでも互換性を持つModとか作れたらいいのに..
squarep
ID:78321e12
ラピスラズリ収集家
 
記事: 1367
登録日時: 2012年8月25日(土) 16:29

  • (PostNo.87428)

Re: ◆総合◆Modderのための雑談所

投稿記事by mozipi » 2013年3月20日(水) 12:12

squarep さんが書きました:
takanasayo さんが書きました:MC1.5.1pre http://www.mojang.com/2013/03/minecraft-1-5-1-pre-release/

調べたらファイル数変更 → MODの互換性なくなった

いきなりかよ・・・orz

様子見しといたほうが良いですかね....
どのverでも互換性を持つModとか作れたらいいのに..

大体難読化のせい
画像
UsefulMilletなどの製作を行っています。
よろしければどうぞ。
ニコニコミュニティ:co2105535
サイト:http://mozipi.jpn.ph/

NAGServerの運営もしております。ぜひ投票・サーバーログインお願い致します
画像
アバター
mozipi
ID:7eec8866
レッドストーン掘り
 
記事: 569
登録日時: 2011年12月26日(月) 19:44

  • (PostNo.87542)

Re: ◆総合◆Modderのための雑談所

投稿記事by A.K. » 2013年3月20日(水) 20:11

今までのWorld.setBlockWithNotifyは引数から推測するにWorld.func_94575_cが対応していると思うのですが,違うかな?
ブロックの連鎖破壊ってやっぱりパケット使うしか無いのかなあ.そんなことは無かった.Forgeまじ便利.
最後に編集したユーザー A.K. [ 2013年3月20日(水) 21:18 ], 累計 1 回
もじんぐしたい。。。。
アバター
A.K.
ID:90ec5cce
ラピスラズリ収集家
 
記事: 1431
登録日時: 2012年9月03日(月) 19:34

  • (PostNo.87558)

Re: ◆総合◆Modderのための雑談所

投稿記事by dewfalse » 2013年3月20日(水) 20:56

takanasayo さんが書きました:MC1.5.1pre http://www.mojang.com/2013/03/minecraft-1-5-1-pre-release/

調べたらファイル数変更 → MODの互換性なくなった

いきなりかよ・・・orz


・・・(白目
dewfalse
ID:1fd27f1e
金掘り
 
記事: 373
登録日時: 2012年2月28日(火) 21:09

  • (PostNo.87984)

Re: ◆総合◆Modderのための雑談所

投稿記事by reginn666 » 2013年3月22日(金) 18:14

forgeないしfml前提だと、1.5環境でreobfucated_srgで出力したmodなら1.5.1forge/fmlでもリビルドせずに動くようですね。動的に難読化を解除するとのこと。
githubにソースおいてます。
https://github.com/reginn
reginn666
ID:ccb23cf1
木を殴ってる
 
記事: 23
登録日時: 2012年3月17日(土) 22:01

  • (PostNo.88261)

Re: ◆総合◆Modderのための雑談所

投稿記事by dewfalse » 2013年3月23日(土) 01:33

reginn666 さんが書きました:forgeないしfml前提だと、1.5環境でreobfucated_srgで出力したmodなら1.5.1forge/fmlでもリビルドせずに動くようですね。動的に難読化を解除するとのこと。


reobfucate=RMLも対応
reobfucate_srg=Forge/FML限定だが互換性あり
という認識でいいのかな・・・
これからはreobfucate_srgでいくしかない!
dewfalse
ID:1fd27f1e
金掘り
 
記事: 373
登録日時: 2012年2月28日(火) 21:09

  • (PostNo.88664)

Re: ◆総合◆Modderのための雑談所

投稿記事by ayamitsu » 2013年3月24日(日) 12:32

FMLの動的難読解除(deobfuscation)とsrgのネームテーブルについての話。

FMLには1.4.7のあるときにテスト的な感じでdeobfuscation(以下deobf)が実装され、1.5から正式に実装されました。
このdeobfはFML導入環境において、実行上で動的に難読化を解除するものです。
クラスを最初に読み込んでcoremodsのIClassTransformerを通したあとに難読化を解除されます。
このときに使用されるネームテーブルがsrgです。
たまにfunc_やfieldなどをみかけますよね?
このsrgはもともとMCPにて公式のクラスの難読化を解除したネームテーブルで、
今日私たちが開発中に使用しているネームテーブルは、それを更にリネームしてわかりやすくしたネームテーブルです。

つまりネームテーブルは、公式の難読化テーブル、MCPのsrgのネームテーブル、MCPの開発中に使うネームテーブルの3つになります。

そして、reobfuscated_srgを実行するとsrgのネームテーブルを使用してクラスファイルとして出力します。
普通のreobfuscatedを実行するときとの違いは、出力時のネームテーブルが異なることです。
実際に出力したあとにバイナリエディタかJDで中をのぞいてみたりするとわかるかと思います。

ちなみにsrgはMCPの人のSeargeさんの名前からきていると思われます。
アバター
ayamitsu
ID:40fb00df
ラピスラズリ収集家
 
記事: 1068
登録日時: 2011年8月10日(水) 19:04

1つ前へ次へ

Return to 開発関連

x