約 2,891,698 件
https://w.atwiki.jp/wot_sengiken/pages/89.html
J1mB0 s Crosshair Mod リロード時間や、自走砲の砲弾の飛翔時間を表示する。 J1mB0's Crosshair Mod機能 入手方法 導入方法 注意事項 使用イメージ コメント 機能 砲弾のリロード時間・残リロード時間を秒で表示。 自走砲の砲弾の飛翔時間を秒で表示。 無砲塔車両の射界を表示。 デバッグパネル(画面上部のping等の表示)に、時計を追加。 入手方法 EUフォーラム - J1mB0 s Crosshair Mod Mirror 01(Curse)からDLしたファイルはフォルダツリーの構造が分かりにくいため、Mirror 02(MediaFire)からのDLを推奨。 当wikiの紹介はMirror 02(MediaFire)からDLしたファイルを基準としているため、Mirror 01(Curse)からDLした場合は適宜読み替える事。 ※Mirror 01(Curse)からDLした場合、"gui\scaleform"フォルダ内の"crosshair_sniper.swf"が欠落しているため、各自で"Options"フォルダからコピーする必要がある。(2014-08-24 18 30時点) 導入方法 解凍したファイルを、res_modsフォルダにコピーする。 自走砲視点以外のレティクル表示の変更は、"optional\aim"フォルダにある"crosshair_sniper.swf"を"res_mods\0.*.*\gui\scaleform"フォルダ内のものに上書きすることで行う。 自走砲視点でのレティクル表示の変更は、"optional\arty"フォルダ内の"crosshair_panel_strategic.swf"を"res_mods\gui\scaleform"内のものに上書きすることで行う。 発砲時の振動を抑制する機能とズーム機能とは、両方とも"avatar_input_handler.xml"ファイルで指定しているため、"optional\xml"フォルダ内の、いずれかを使用すること。デフォルトではズームも振動抑制も無効になっている。 注意事項 時計表示がXVMの与ダメ履歴表示と重なる場合は、XVM側の設定で与ダメ履歴の表示位置を変更すること。 使用イメージ コメント 色々とダウンロードする項目があるのですが、どれをダウンロードすればいいですか? 解凍したらどこに解凍したファイルを入れたらいいですか?後、いじらなきゃいけない項目はありますか? 回答お願いします -- (@@あ) 2014-04-06 19 19 35 作者がフォーラムに記載している説明を理解できないのであれば、MODには手を出さない方がよろしいかと存じ上げます。 -- (YawChang) 2014-04-13 07 57 04 飛翔時間のサイトが1.36からなくなりましたが禁止MODにでもなったんでしょうか? -- (名無しさん) 2014-04-13 04 21 53 飛翔時間付きのパネルが無くなった理由は、作者が フォーラム で「弾速等に変更が入り、正確な値を表示できないため」と記載しています。 -- (YawChang) 2014-04-13 07 57 26 作者がフォーラムに記載している説明を理解できないのであれば、MODには手を出さない方がよろしいかと存じ上げます。 ならば、こういったサイト自体がいらなくなると思いますよ。 質問にたいして必ず”質問する事自体”を否定する方がでますが、他の人の迷惑なので、そのような子供じみた天の邪鬼な態度は止めていただきたいですね 誰しも、必ず分からない事はあるので、自分が知っているからと言って、分かっていないのを悪いとするを前提は、自分勝手な態度でしょう。 -- (名無しさん) 2014-08-11 17 17 20 当方も、ファイルのコピー方法やGoogle翻訳・同検索の使い方の様な初歩的な内容を一から十まで説明する気はありません。 ある程度は自身で調べた方が、ご自身のリテラシの向上にも繋がりますよ。 私も、「当wikiは貴方には不要である」と存じ上げます。 -- (YawChang) 2014-08-11 17 25 13 "optional\aim"というフォルダが出てこないのですが、どうすればよいですか? -- (KIIIIImax) 2014-08-24 17 52 49 Mirror 01(Curse)からDLしたファイルはフォルダツリーの構造が異なっているため、Mirror 02(MediaFire)からDLしたファイルの使用をお奨めします。 -- (YawChang) 2014-08-24 18 47 04 Mirror 02からダウンロードしたら、modが反映されませんでした。Mirror 01でダウンロードしたものは削除したのですが、 なぜでしょうか? -- (K) 2014-08-25 15 44 11 DLしたファイルが、"J1mB0s Crosshair Mod v1.41.zip"であるか確認してください。 "J1mB0s XVM Config v5.3.3 Test 1.zip"だった場合は、照準MODではなくXVMをDLしています。 照準MODをDLし直しましょう。 -- (YawChang) 2014-08-25 15 56 41 導入方法通りやったら無事instできました。aimの見本(artyはあり)が元から付いていると更に便利ですね。 ありがとうございました。 -- (taiki20021120) 2014-10-22 22 51 55 個人的には導入方法の[1]の表記が分かりにくかったので、替えてみてはどうでしょうか 例)解凍して出来た「res_mods」フォルダを「World_of_Tanks」フォルダの中の「res_mods」に上書きする。 -- (名無しさん) 2014-12-10 09 44 45 前のコメントにもありますがやっぱり飛翔時間は表示できないのでしょうか? Download (MediaFire)からいつもDLしていますが表示できないのであきらめていましたが、自走を使う時はやはり参考にしたいです。 -- (名無しさん) 2015-04-09 13 25 31 飛翔時間の計算は正確さに欠けるため機能を削除したと作者の方が述べています -- (名無しさん) 2015-05-16 16 18 25 optionalフォルダってどこにあるんですか? -- (名無しさん) 2015-07-24 13 32 41 YawChang何様wwww -- (名無しさん) 2015-12-20 22 12 42 0.9.13 で同じ導入方法をしても できません -- (名無しさん) 2016-01-16 21 49 03 こうしてただ廃墟が残り、俺様がルールだと大言した輩は無責任に立ち去りましたとさ -- (名無しさん) 2018-11-23 12 46 51 名前 コメント すべてのコメントを見る
https://w.atwiki.jp/akasatanahama/pages/135.html
概要 MinecraftForgeのイベント機能を利用して既存の処理に追加動作を施す。 2017/6/14 全体を確認し、修正や変更を行いました。 仕組み 今までMinecraft内のソースを見てみて、「ForgeHooks」や「EVENT_BUS」という記述を見たことはあるだろうか。 例えば、EntityLivingBase/onUpdateのメソッドを見てみよう。 public void onUpdate() { if (ForgeHooks.onLivingUpdate(this)) return; super.onUpdate(); /* 略 */ } /* 略 */ このように、Forgeがシステムを書き換えてイベントを起こしている場所がある。 ここで、@SubscribeEventのアノテーションを付け、適切な処理をしてあるメソッドが呼ばれる。 クラス書き換えと違って使えるものは限られるものの、競合が起きにくくかつ実装しやすい手段である。 ソースコード AluminiumMod.java package tutorial.aluminiummod; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.monster.EntityIronGolem; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.util.DamageSource; import net.minecraft.world.ChunkPosition; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.living.LivingEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.event.entity.player.AttackEntityEvent; import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.event.world.ExplosionEvent; import java.util.Iterator; @Mod(modid = "AluminiumMod", name = "Aluminium Mod", version = "1.0.0") public class AluminiumMod { @EventHandler public void preInit(FMLPreInitializationEvent event) { // Event処理を記述しているクラスをForgeに登録する。 // Forgeのイベントを受け取る。 MinecraftForge.EVENT_BUS.register(this); // FMLのイベントを受け取りたい場合は以下のように追加で登録する。 //FMLCommonHandler.instance().bus().register(this); } /** EntityLivingBaseがダメージを負った時のイベント。 */ @SubscribeEvent public void onLivingHurt(LivingHurtEvent event) { // プレイヤーがアイアンゴーレムに対して攻撃した時、プレイヤーに同量のダメージを与える。 Entity sourceEntity = event.source.getEntity(); if (event.entityLiving instanceof EntityIronGolem sourceEntity != null sourceEntity instanceof EntityPlayer) sourceEntity.attackEntityFrom(DamageSource.causeMobDamage(event.entityLiving), event.ammount); } /** プレイヤーがEntityを攻撃した時のイベント。 */ @SubscribeEvent public void onPlayerAttackEntity(AttackEntityEvent event) { // ダイヤモンドを持っていたら、HPをハート10個分回復する。 if (event.entityPlayer.getHeldItem() != null event.entityPlayer.getHeldItem().getItem() == Items.diamond) event.entityPlayer.heal(20); } /** EntityLivingBaseが更新される時のイベント。 */ @SubscribeEvent public void onLivingUpdate(LivingEvent.LivingUpdateEvent event) { // クリーパーなら雷雨時に巨匠化させる。 if (event.entityLiving instanceof EntityCreeper event.entityLiving.worldObj.isThundering()) event.entityLiving.getDataWatcher().updateObject(17, (byte) 1); } /** 爆発が起こった時のイベント。 */ @SubscribeEvent public void onExplosionDetonate(ExplosionEvent.Detonate event) { System.out.println("onExplosionDetonate"); // クリーパーが起こした爆発なら、EntityMob継承のEntityを全て爆発対象から除外する。(ダメージやノックバックがなくなる。) if (event.explosion.exploder != null event.explosion.exploder instanceof EntityCreeper) { Iterator Entity iterator = event.getAffectedEntities().iterator(); while (iterator.hasNext()) { if (iterator.next() instanceof EntityMob) iterator.remove(); } } // ブロック破壊と炎上があるなら、氷と氷塊を破壊対象から除外する。 if (event.explosion.isSmoking event.explosion.isFlaming) { Iterator ChunkPosition iterator = event.getAffectedBlocks().iterator(); while (iterator.hasNext()) { ChunkPosition position = iterator.next(); Block block = event.world.getBlock(position.chunkPosX, position.chunkPosY, position.chunkPosZ); if (block == Blocks.ice || block == Blocks.packed_ice) iterator.remove(); } } } /** プレイヤーがブロックを設置した時のイベント。 */ @SubscribeEvent public void onPlayerBlockPlace(BlockEvent.PlaceEvent event) { // 土にカーソルを合わせてダイヤモンドブロックを置こうとしたらキャンセルする。 if (event.placedBlock == Blocks.diamond_block event.placedAgainst == Blocks.dirt) event.setCanceled(true); } } 解説 EventBus イベントを管理するためのクラス。 ForgeとFMLが別でインスタンスを持っているため、利用したいイベントのパッケージを確認して対応したものに登録する。 このチュートリアルではForgeのものしか使っていないが、FMLにもTickEventやKeyInputEventなど多くのイベントが用意されている。 void register(Object target) イベントを処理するメソッドがあるクラスのインスタンスを渡す。 このクラス内にある、@SubscribeEventがついており引数がEventを継承するクラス一つのみのメソッドが、イベントリスナーとして登録される。 Event Minecraft内にフックされているイベントの元クラス。 これを継承したクラスがインスタンス化され、イベントが発生する。 親子関係があるイベントでは、親クラスを引数とするメソッドは、その全ての子クラスのイベントを受け取る。 例:ExplosionEventを引数とするメソッドはExplosionEvent.StartとExplosionEvent.Detonateの双方のイベントを受け取る。(一度の爆発につき二回呼ばれる。) void setResult(Result value) Eventに@HasResultがついている場合、これを利用するとフック元の残りの動作をキャンセルしたり別のものにしたりできる。 setCanseled(boolean cansel) Eventに@Canselableがついている場合、ここにtrueを入れるとフック元の残りの動作をなくせる。 LivingHurtEvent EntityLivingBaseを継承したEntityがダメージを負った時のイベント。 DamageSource source ダメージの種類や性質を持つクラス。 float ammount ダメージ量 EntityLivingBase entityLiving 親クラスであるLivingEventで定義。 LivingHurtEventの場合はダメージを受けたEntity。 AttackEntityEvent プレイヤーがEntityを攻撃した時のイベント。 Entity target 攻撃対象のEntity。 EntityPlayer entityPlayer 親クラスであるPlayerEventで定義。 攻撃したプレイヤー。 LivingUpdateEvent EntityLivingBaseを継承したEntityが更新される時のイベント。 EntityLivingBase.onUpdate()の最初で発生している。 EntityLivingBase entityLiving 親クラスであるLivingEventで定義。 LivingUpdateEventの場合は更新されるEntity。 Detonate ExplosionEventの子クラス。 爆発が起こった時のイベント。 ExplosionEventの別の子クラスであるStartは爆発処理の開始時だが、こちらは影響対象のリストアップとその処理の間で発生する。 そのため、影響対象の操作が可能となる。 List ChunkPosition getAffectedBlocks() 爆発の影響を受けるブロックのリストを返す。 Explosionのインスタンスから直接取得しても同じ。 List Entity getAffectedEntities() 爆発の影響を受けるEntityのリストを返す。 操作すると、爆発処理(ダメージや移動)に反映される。 Explosionはインスタンス変数として持っていないが、DetonateがentityListとして保持している。 World world 親クラスであるExplosionEventで定義。 爆発の発生したWorldのインスタンス。 Explosion explosion 親クラスであるExplosionEventで定義。 爆発の処理を行うクラス。 性質などをインスタンス変数として持っている。 boolean isSmoking 煙パーティクルを発生させるか。 ブロックの破壊もこれで管理されている。 boolean isFlaming 炎を発生させるか。 PlaceEvent プレイヤーがブロックを設置した時のイベント。 実際の設置処理は一通り終わっているので、座標とWorldからは設置されたブロックを得られる。 EntityPlayer player ブロックを設置したプレイヤー。 ItemStack itemInHand プレイヤーが手に持っているItemStackのインスタンス。 ブロック設置の処理を行う前の状態になっている。 BlockSnapshot blockSnapshot ブロック置き換え処理の途中で、置き換え前のブロックを一時的に保持するために使われている。 置き換えられたブロック(通常は空気)を得たい場合はこれを利用する。 また、座標やディメンションIDなども得られる。 Block placedBlock 設置されたブロック。 Block placedAgainst 設置の際に視線の先にあった(設置の支えとなった)ブロック。 コメント この項目に関する質問などをどうぞ。 メニューの「イベントの追加」のリンクがおかしいです。 - mod初心者 2017-05-20 21 26 17 ご指摘ありがとうございます。見事に製作の「製」の字を「制」にしておりました。修正しましたのでご確認ください。 - Tom Kate 2017-05-20 21 45 11 BlockPlacedEventですが、「== Blocks.air」ではなく「!= Blocks.air」だと思います。 - mod初心者 2017-05-30 17 23 56 「設置前のブロックが」空気ブロックであることを判定してますので問題ありません。 - Tom Kate 2017-05-30 19 23 53 ではこのイベントは何をするイベントなんですか? - mod初心者 2017-06-02 18 26 18 返信が遅くなってしまい申し訳ありません。PlaceEvent.placedAgainstは置き換えられたブロックではなく、ブロック設置直前に視線の先にあったブロックでした。本来、ダイヤモンドブロックを設置した時にキャンセルする、という処理を行いたかったため、正しいご指摘でした。少し処理を変更しましたので、ご確認ください。ご迷惑をおかけしてしまい、申し訳ありませんでした。 - 赤砂蛇凪浜 2017-06-14 19 15 35 こちらも説明不足ですみませんでした。大幅なコード修正ありがとうございました! - mod初心者 2017-06-16 19 03 04 List remover = new ArrayList();の型の設定やremover.addの括弧が多いような気がします。 - 名無しさん 2017-05-30 18 23 33 Entity型へのキャストを行っておりますので問題ありません。EclipseやIDEAなどでエラーが出ないかどうかご確認ください。 - Tom Kate 2017-05-30 19 25 56 remover.addのEntityMobの括弧足りなくてエラーになります。 - 名無しさん 2017-06-01 22 25 35 上のは解決しましたが、ListとArrayListの型は設定しなくて良いのでしょうか? - 名無しさん 2017-06-02 18 10 51 返信が遅くなってしまい申し訳ありません。ジェネリクスを利用しないとビルド時に警告が出ます。該当部分の処理方法を変更しましたが、同様のエラーは出ないよう修正しておきました。 - 赤砂蛇凪浜 2017-06-14 19 16 23 いつもこちらで勉強させていただいています。質問なのですが、下にあるブロックを掘ってアイテム化する(ドリルのように)というのは、どうすればいいのでしょうか。onDestroyByPlayerなどいろいろ試しましたが、壊れるのではなくて消えるようになってしまって困っています。 - 美羽 2017-06-04 09 47 06 返信が遅くなってしまい申し訳ありません。どのMODのドリルを指しているのかわかりませんが、アイテムを手に持ちブロックを右クリックした時の処理は、Itemを継承したクラスonItemUseを利用できます。また、ツルハシなどのように左クリック長押しによるブロック破壊の速度を上げたいのであれば、「ツール類の追加」を参考にしていただけると思います。onDestroyByPlayerという名のメソッドは見当たりませんでしたが、Block.onBlockDestroyedByPlayer(World, int, int, int, int)のことでしたら、ブロックがプレイヤーに破壊された時に呼ばれるメソッドです。ブロック破壊時のアイテムのドロップは、Block.harvestBlock(World, EntityPlayer, int, int, int, int)などを見ると分かるかもしれません。 - 赤砂蛇凪浜 2017-06-14 19 17 42 ありがとうございます。単に、下にあるブロックを破壊してアイテム化するブロックが作りたいのです - 美羽 2017-06-22 14 28 21 すみません、途中で書き込んでしまいました - 美羽 2017-06-22 14 29 02 Setblocktoairのように消えてしまうのではなく、つるはしで掘ったときのように徐々にひびが入って、破砕、アイテム化させたいです。 - 美羽 2017-06-22 14 35 06 返信が遅くなってしまい申し訳ありません。コメントのツリーを編集させていただきました。私も挑戦したことがないため、軽く調べてみましたが、間違っていたらすみません。ブロックのひび割れのレンダリングはRenderGlobalを通して行っているようです。drawBlockDamageTextureメソッドでレンダリングしているようですが、対象となるブロックはプレイヤーのEntityIDをキーとしたマップのdamagedBlocksで保持しており、ブロックやTileEntityからの介入は容易ではないと思います。 - 赤砂蛇凪浜 2017-07-08 18 29 55 名前
https://w.atwiki.jp/shunshun_bad/pages/14.html
ここでは有名なMinecraftのシステムMODを紹介します 前提MOD MinecraftForge MODプレイに必須といえるほど大人気、有名な前提、補助MOD。 非常に多くのMODに必要。 Fabric Minecraft1.14以降用に作られたmodloader。 バニラのLauncherやMultiMCに対応しており、Forgeのように .exeと.jarのインストーラーがある。 レシピブック Just Enough Items 通称:JEI。ゲーム内でアイテムとレシピを確認できるMOD。 バージョン ~1.16.2 ナビゲーションマップ VoxelMap 地形表示は勿論の事、Mob索敵機能や空洞マップ機能・ ウェイポイント機能等も持つ高性能Minimap MOD。 バージョン ~1.16.3 JourneyMap ゲーム内Mapとインターネットブラウザ (Firefox、Chrome、Safari、IE)を用いたMapを追加するMOD。 ペットや馬、家畜などのMOBの向いてる方角が見える。 またMapのGUIを変更できるなど凝った作りになっている。 バージョン~1.15.2 FPS向上・負荷軽減 OptiFine フォグ発生距離等Video Settingsに 様々な設定を追加する描画設定拡張・軽量化MOD。 水の透明度を上げたり、朝と夜を切り替えたりもできる。 32x32以上のHDテクスチャの導入の為にも利用可能。 1.10.2版よりEntityのモデルをカスタマイズする機能が追加された。 バージョン ~1.16.3 BetterFPS Minecraft内部のアルゴリズムを変更して、FPSを向上させる。 バニラにインストールすることができ、 【MinecraftForge】にも対応している。 バージョン:~1.12.2 総合系MOD XRay ブロックの透過MOD。Xキーを押すと地中の鉱石を明るさ最大で 透視できる。【MinecraftForge】は不要で共存も可能。 こんな感じ↓ インベントリ・クラフト画面 Inventory Tweaks Rキーで持ち物を整理したり、Wキー+クリックでクラフトエリアに アイテムを送ったり、種や道具などが無くなった際に持ち物に 予備があれば自動で補充する。他にも様々な機能がある。 imageプラグインエラー ご指定のURLはサポートしていません。png, jpg, gif などの画像URLを指定してください。 一括破壊・効率化等 一括破壊系MOD CutAll(斧/原木/onoffはCキー)、MineAll(つるはし/鉱石/ onoffはMキー)、DigAll(シャベル/土砂/onoffはGキー)の3種類があり、 それぞれ個別に導入可能。modsフォルダに置くだけで導入できる。 一括破壊系の中では最も高性能で、Configファイルから設定変更すれば 他MODで追加されたツールにも一括破壊機能を付与し、また他MODで 追加された木材/石材/土砂も一括破壊の対象に含む事ができる。 導入初期の状態ではOffになっているが、葉ブロックも一緒に 一瞬で破壊する機能や、MineAllやDigAllにも一括採掘した ブロックを採掘と同時に自動回収する機能を持たせる事も可能。
https://w.atwiki.jp/maikura125wiki/pages/19.html
RedPower MODマネージャーからdownload可 Eloraam氏の作成による、主にレッドストーン回路に関する要素を大幅に補強・追加するMOD(旧Integrated Redstone) 基幹となる「Core」および、回路系の要素を追加する「Logic」「Wiring」、 Coreのシステムを流用してはいるが回路自体には直接関係のない「Lighting」「World」「Machine」「Control」の、全7MODで構成される。 詳しくはJapan非公式wikiへ
https://w.atwiki.jp/arma3/pages/41.html
■Mod・Addon制作 編集中 かなり役立ちそうなリンク Wolfsburg Editing Bureau ArmedAssault Addon, Modeling制作関係のドキュメント このサイトではWolfsburgさんが制作された数々の優れたMod・Addonの制作過程などがアップされています。とても参考になるので他のページも見てみるといいでしょう。 この方は日本のModの中でも大規模なJSDFModにも関わっておられます。そちらも様々な優れた作品を輩出しているので、興味があればご覧になってはどうでしょうか。
https://w.atwiki.jp/clubutakata/pages/159.html
1.日本語MODなしで即日本語を打てるようにする。 日本語MOD導入が難しい方は、まず上記から試してみましょう! 2.MODを通常通り導入してみる。 これは、Office Online の機能を利用した、Microsoft Office の埋め込み型のプレゼンテーションです。 MACをお使いの方へ 1.Windowsと一緒です。 2.日本語MOD CocoaInputをダウンロード URL http //forum.minecraftuser.jp/viewtopic.php?f=13 t=24394 3.modsファイルに入れる modsフォルダはマインクラフトforgeをインストールし一度起動しないとでて来ません。 MODSフォルダの場所は ~/ライブラリ\Application Support\minecraft\modsにあります ~/ライブラリを開くには、Finderのアイコンを右クリックし、フォルダーへ移動を選択して~/ライブラリと入力しましょう。 導入したあとは起動してみましょう! MAC項目協力_aqu_さん 以下広告
https://w.atwiki.jp/stalker_soc/pages/71.html
字幕入り動画ファイル ~作中の動画に日本語字幕を埋め込んだもの。修正パッチのバージョン問わず使用可能です。 http //www.megaupload.com/?d=O6YLP1KY Stalker VideoCC Modを日本語化 ~Stalker VideoCC Mod を日本語化します color(red){注意!現行バージョン(1.11)は、1.0004以降の環境ではフリーズするため導入できません。(バージョンアップ待ち)}; → 上記字幕入り動画ファイルを使いましょう。; ~ Stalker VideoCC Mod ~導入には、ひらがな化が完全に動作している必要があります。 導入法(簡単) ~ Stalker VideoCC Mod をVideoCCのReadmeに則ってインストールします(英語ですが動作を確認するとベターです) #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (stalker_videocc_v1.11_jp_070625.ZIP) ~(動作している環境に)このファイルを上書きします(これで日本語になります) 導入法(詳細) ~ Stalker VideoCC Mod をDL、解凍します ~日本語MODと同居させるため以下の三つのファイルを変更する必要があります。 ~(VideoCCMod)\gamedata\config\text\eng\ 以下にある ~stable_closecaption.xml ~stable_game_credits.xml ~ui_st_mm.xml ~下二つは、それぞれスタッフロール、GUIメニューのファイルですのでVideoCC Modのものをそのまま上書きで構いませんが ~GUIメニューの日本語を残したい場合は、日本語のui_st_mm.xmlの198行目に string id="ui_mm_play" text Play /text /string string id="ui_mm_play_video" text Movies /text /string ~以上を挿入し上書きしてください ~v1.11追記 更に記述が増えてる部分があります ~3行目に string id="no_GetGSVer_function" text ver. 1.0000 (or below) /text /string string id="ui_mm_playcc" text Subtitles /text /string ~stable_closecaption.xmlを日本語の物にしてください ~以上の物をインストールすることによって動作します。 表記について stable_closecaption.xml を、ひらがな化の表記ルールをベースとし、以下のサイトの「字幕表記のルール」を参考に、若干の修正をしました(07.06.18)。 http //www.con-can.com/blog/jp/project/subtitle/2007/06/43.html アップデート 07/06/25 V1.11対応 ↓旧バージョン(v1.10)用のファイル #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (stalker_videocc_en_v1.10_JP_070618.zip) トラブルシューティング Q 日本語化の方を更新したら字幕が出なくなりました~ A 字幕MODのファイルが上書きされて消えてます~ stable_game_credits.xml ui_st_mm.xml~ この2つのファイルは必ず字幕MOD側のファイルを使用してください~ Q Barで「新米にアドバイス」だかを選ぶと落ちるんだけど~ A 半角中黒(・)が使われているためです。全角か三点リーダー(…)に置き換えましょう。
https://w.atwiki.jp/akasatanahama/pages/27.html
概要 新しい剣・シャベル・斧・ツルハシ・クワや、適正ブロックを自由に設定できるツールを追加する。 ソースコード AluminiumMod.java package tutorial.aluminiummod; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.Item.ToolMaterial; import net.minecraft.item.ItemHoe; import net.minecraft.item.ItemSpade; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import net.minecraftforge.common.util.EnumHelper; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.registry.GameRegistry; @Mod(modid = AluminiumMod.MODID, name = AluminiumMod.MODNAME, version = AluminiumMod.VERSION) public class AluminiumMod { public static final String MODID = "AluminiumMod"; public static final String MODNAME = "Aluminium Mod"; public static final String VERSION = "1.0.0"; public static Item aluminium; public static Item swordAluminium; public static Item shovelAluminium; public static Item pickaxeAluminium; public static Item axeAluminium; public static Item hoeAluminium; public static Item toolAluminium; public static ToolMaterial ALUMINIUM; @EventHandler public void perInit(FMLPreInitializationEvent event) { aluminium = new Item() .setCreativeTab(CreativeTabs.tabMaterials) .setUnlocalizedName("aluminium") .setTextureName("aluminiummod aluminium"); GameRegistry.registerItem(aluminium, "aluminium"); ALUMINIUM = EnumHelper.addToolMaterial("ALUMINIUM", 3, 1000, 7.5F, 2.5F, 10) .setRepairItem(new ItemStack(AluminiumMod.aluminium)); swordAluminium = new ItemSword(ALUMINIUM) .setCreativeTab(CreativeTabs.tabCombat) .setUnlocalizedName("swordAluminium") .setTextureName("aluminiummod aluminium_sword"); GameRegistry.registerItem(swordAluminium, "swordAluminium"); shovelAluminium = new ItemSpade(ALUMINIUM) .setCreativeTab(CreativeTabs.tabTools) .setUnlocalizedName("shovelAluminium") .setTextureName("aluminiummod aluminium_shovel"); GameRegistry.registerItem(shovelAluminium, "shovelAluminium"); pickaxeAluminium = new AluminiumPickaxe(ALUMINIUM) .setCreativeTab(CreativeTabs.tabTools) .setUnlocalizedName("pickaxeAluminium") .setTextureName("aluminiummod aluminium_pickaxe"); GameRegistry.registerItem(pickaxeAluminium, "pickaxeAluminium"); axeAluminium = new AluminiumAxe(ALUMINIUM) .setCreativeTab(CreativeTabs.tabTools) .setUnlocalizedName("axeAluminium") .setTextureName("aluminiummod aluminium_axe"); GameRegistry.registerItem(axeAluminium, "axeAluminium"); hoeAluminium = new ItemHoe(ALUMINIUM) .setCreativeTab(CreativeTabs.tabTools) .setUnlocalizedName("hoeAluminium") .setTextureName("aluminiummod aluminium_hoe"); GameRegistry.registerItem(hoeAluminium, "hoeAluminium"); toolAluminium = new AluminiumTool(ALUMINIUM) .setCreativeTab(CreativeTabs.tabTools) .setUnlocalizedName("toolAluminium") .setTextureName("aluminiummod aluminium_tool"); GameRegistry.registerItem(toolAluminium, "toolAluminium"); } } AluminiumPickaxe.java package tutorial.aluminiummod; import net.minecraft.item.ItemPickaxe; public class AluminiumPickaxe extends ItemPickaxe { public AluminiumPickaxe(ToolMaterial toolMaterial) { super(toolMaterial); } } AluminiumAxe.java package tutorial.aluminiummod; import net.minecraft.item.ItemAxe; public class AluminiumAxe extends ItemAxe { public AluminiumAxe(ToolMaterial toolMaterial) { super(toolMaterial); } } AluminiumTool.java package tutorial.aluminiummod; import java.util.Set; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemTool; import com.google.common.collect.Sets; public class AluminiumTool extends ItemTool { private static final Set canHarvestBlock = Sets.newHashSet(new Block[] { Blocks.diamond_block }); public AluminiumTool(ToolMaterial toolMaterial) { super(0.0F, toolMaterial, canHarvestBlock); } @Override public boolean func_150897_b(Block block) { return true; } @Override public float func_150893_a(ItemStack itemStack, Block block) { if (block.getMaterial() == Material.rock) { return this.efficiencyOnProperMaterial; } return super.func_150893_a(itemStack, block); } // ここにItemHoeのプログラムを張り付ければ、クワの効果も得られる。 } 解説 ToolMaterial ツールの性質を保持するためのenum。 ToolMaterial setRepairItem(ItemStack stack) 金床で修繕するための素材を設定するメソッド。 EnumHelper ToolMaterial addToolMaterial(String name, int harvestLevel, int maxUses, float efficiency, float damage, int enchantability) 新しくツールマテリアルを追加するためのメソッド。 引数は順に、ツールマテリアルの名前・回収レベル・最大耐久値・採掘速度・攻撃に使用したときのダメージ倍率・エンチャントの付きやすさ。 ダイヤモンドは、3, 1561, 8.0F, 3.0F, 10 Item public boolean func_150897_b(Block block) 引数のブロックを回収できるかを返す。 public float func_150893_a(ItemStack itemStack, Block block) 採掘速度を返す。 ItemToolでは、コンストラクタの第3引数のSetに登録されているブロックのときに適性時採掘速度を返している。 使用例 オファレンの万能ツールを追加している部分 +オファレンMOD OfalenModCore.java package nahama.ofalenmod; /*略*/ /** @author Akasata Nahama */ @Mod(modid = OfalenModCore.MODID, name = OfalenModCore.MODNAME, version = OfalenModCore.VERSION) public class OfalenModCore { public static final String MODID = "OfalenMod"; public static final String MODNAME = "Ofalen Mod"; public static final String VERSION = "[1.7.10]1.0.0"; /*略*/ /** 最初に行われる処理。アイテム・ブロックの追加などを行う */ @EventHandler public void preInit(FMLPreInitializationEvent event) { /*略*/ // アイテムを設定するメソッドを実行 OfalenModItemCore.registerItem(); /*略*/ } /*略*/ } OfalenModItemCore.java package nahama.ofalenmod.core; /*略*/ public class OfalenModItemCore { /*略*/ public static Item toolPerfectOfalen; /*略*/ /**アイテムを設定する*/ public static void registerItem () { /*略*/ toolPerfectOfalen = new OfalenPerfectTool(OfalenModMaterialCore.PERFECTT) .setUnlocalizedName("toolPerfectOfalen") .setTextureName("ofalenmod ofalen_perfect_tool"); GameRegistry.registerItem(toolPerfectOfalen, "toolPerfectOfalen"); /*略*/ } } OfalenPerfectTool.java package nahama.ofalenmod.item.tool; import nahama.ofalenmod.OfalenModCore; import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.EnumAction; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemTool; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.UseHoeEvent; import cpw.mods.fml.common.eventhandler.Event.Result; public class OfalenPerfectTool extends ItemTool { public OfalenPerfectTool(ToolMaterial material) { super(0.0F, material, null); this.setCreativeTab(OfalenModCore.tabOfalen); } @Override public boolean func_150897_b(Block block) { return true; } /**採掘速度の設定*/ @Override public float func_150893_a(ItemStack itemStack, Block block) { //他のツールでは適正ブロックの判定をするが、ここではすべてに適正採掘速度を適用する return this.efficiencyOnProperMaterial; } //クワの処理 /**アイテムが使われた(右クリック)時の処理*/ @Override public boolean onItemUse(ItemStack itemStack, EntityPlayer entityPlayer, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { //プレイヤーが編集不可ならば if (!entityPlayer.canPlayerEdit(x, y, z, side, itemStack)) { //falseを返す return false; } else { //eventの登録 UseHoeEvent event = new UseHoeEvent(entityPlayer, itemStack, world, x, y, z); if (MinecraftForge.EVENT_BUS.post(event)) { return false; } if (event.getResult() == Result.ALLOW) { //ダメージを与える itemStack.damageItem(1, entityPlayer); return true; } //右クリックされたブロックを取得する Block block = world.getBlock(x, y, z); //右クリックされたブロックの上が空気ブロックで、右クリックされたブロックが草ブロックか土ブロックならば if (side != 0 world.getBlock(x, y + 1, z).isAir(world, x, y + 1, z) (block == Blocks.grass || block == Blocks.dirt)) { Block block1 = Blocks.farmland; //音を鳴らす world.playSoundEffect((double)((float)x + 0.5F), (double)((float)y + 0.5F), (double)((float)z + 0.5F), block1.stepSound.getStepResourcePath(), (block1.stepSound.getVolume() + 1.0F) / 2.0F, block1.stepSound.getPitch() * 0.8F); //クライアント側では何もせず if (world.isRemote) { return true; //サーバー側では } else { //ブロックを置き換えて world.setBlock(x, y, z, block1); //ダメージを与える itemStack.damageItem(1, entityPlayer); return true; } } else { return false; } } } //剣の処理 /**Entityを叩いたときの処理。ItemToolでは2のダメージをアイテムに与えるが、剣と同じように1与えるようにする。*/ @Override public boolean hitEntity(ItemStack itemStack, EntityLivingBase target, EntityLivingBase player) { itemStack.damageItem(1, player); return true; } @Override public EnumAction getItemUseAction(ItemStack itemStack) { return EnumAction.block; } @Override public int getMaxItemUseDuration(ItemStack itemStack) { return 72000; } @Override public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) { player.setItemInUse(itemStack, this.getMaxItemUseDuration(itemStack)); return itemStack; } } Tips ここで、実装したツールに常時エンチャントを追加する方法を紹介する。 コードは、匠Craftの匠式ツールや対地雷ツールを参考にしていただきたい。 Itemをオーバーライドしたクラスに、以下のメソッドを追加する。 //アイテムに対して毎ティック呼ばれるメソッド。 //引数は、itemStack(アイテムと個数、メタデータ等をまとめたもの),world(ワールド),entity(持っているEntity),slot(現在あるスロット番号),isHeld(手持ちかどうか) public void onUpdate(ItemStack itemStack, World world, Entity entity, int slot, boolean isHeld) { //エンチャントされていないかどうかを確認する。 if (itemStack.isItemEnchanted() == false) { //エンチャントを付与する。引数はエンチャント,レベルの順に追加する。 itemStack.addEnchantment(TEnchantment.enchantmentMS, 1); } } これにより、常時効果を発揮するエンチャントや手に持ってるときに効果を発揮するものなどを実装できる。 コメント この項目に関する質問などをどうぞ。 アルミニウムツールが耐久値を保持しないのですが、、 - 名無しさん 2015-08-22 17 58 35 まだ編集が終わっていません。原因を調べ、テンプレートを使用して修正します。報告ありがとうございます - 赤砂蛇凪浜 2015-08-23 08 51 21 編集完了しましたが、こちらの環境では特に問題はありませんでした。解決できていない場合はもう一度コメントしてくださるとありがたいです。 - 赤砂蛇凪浜 2015-09-04 09 17 25 質問です。黄昏の森のstealeafでできるツールのようにもともとエンチャントがつくツールはどのようなコードにすればいいのでしょうか? - 名無しさん 2017-01-07 16 19 06 解決しました。 - 名無しさん 2017-01-22 10 08 12 方法を教えていただけませんか? - あるふぁ 2017-05-20 16 26 48 匠craftの「地雷除去」のように、新しいエンチャントをつける方法を解説していただけると助かります。 - あるふぁ 2017-05-20 18 53 49 追加いたしました、ご確認ください。 - Tom Kate 2017-05-22 19 34 58 すみません、伝わりにくかったと思います…匠craftの「地雷除去」のように、新しいエンチャントの”種類”を作る方法でした。 - あるふぁ 2017-05-23 20 15 17 エンチャント「追加」ですか。申し訳ありません。追加予定はありますがすぐにはできないと思いますのでご了承ください。 - Tom Kate 2017-05-23 20 26 53 どんなブロックでもクリエイティブの時のように即時破壊し、ドロップさせるツールは作れますか? - あるふぁ 2017-05-31 19 29 48 通常破壊可能なブロックを採掘したいのであれば、比較的容易に作れます。AluminiumTool.javaでの実装を応用し、func_150893_aで常にefficiencyOnProperMaterialを返せば、通常破壊可能なすべてのブロックを、適正採掘速度で破壊できます。さらに、EnumHelper.addToolMaterialの第四引数に大きな値を渡すことで、クリエイティブ以上の採掘速度を出すことが可能です。(1500以上であれば、通常時は黒曜石を最大速度で破壊できます。)岩盤のような破壊不可ブロックは、干渉できるイベントが見当たらないため、左クリック時に破壊することは簡単ではないと思います。アイテム使用時に呼ばれるonItemUseメソッドをオーバーライドすれば、右クリック時に岩盤を破壊し、ドロップさせるといった処理は可能です。 - 赤砂蛇凪浜 2017-06-01 17 50 09 ありがとうございます!実は返信が来る前に試行錯誤して解決してしまったのですが、参考になりました。 - あるふぁ 2017-06-01 18 38 38 こちらも「防具の追加」同様に、金床で修理することが出来ません。 - mod初心者 2017-06-17 12 48 38 ご指摘ありがとうございます。原因は「防具の追加」と同様です。修正しておきました。 - 赤砂蛇凪浜 2017-06-17 16 52 20 解決しました!ありがとうございました! - mod初心者 2017-06-19 17 19 34 参考になりました、ありがとうございます - 名無しさん 2017-08-04 19 14 19 名前
https://w.atwiki.jp/isis/pages/13.html
カーMod コースMod
https://w.atwiki.jp/akasatanahama/pages/130.html
概要 新しく種、作物を追加する。 テクスチャは、 作物(ブロック)が成長段階によって"textures/blocks/cropAluminium_stage_0.png"から"blocks/cropAluminium_stage_7.png"。 種が"textures/items/seedsAluminium.png"、作物が"textures/items/wheatAluminium.png"。 ソースコード AluminiumMod.java package tutorial.aluminiummod; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; @Mod(modid = AluminiumMod.MOD_ID, name = AluminiumMod.MOD_NAME, version = AluminiumMod.MOD_VERSION) public class AluminiumMod { public static final String MOD_ID = "AluminiumMod"; public static final String MOD_NAME = "Aluminium Mod"; public static final String MOD_VERSION = "1.0.0"; public static Block cropAluminium; public static Item seedsAluminium; public static Item wheatAluminium; @EventHandler public void perInit(FMLPreInitializationEvent event) { // 作物ブロックのインスタンス生成。 cropAluminium = new BlockAluminiumCrop().setBlockName("cropAluminium").setBlockTextureName("cropAluminium"); GameRegistry.registerBlock(cropAluminium, "aluminium_crop"); // 種のインスタンス生成。 seedsAluminium = new ItemAluminiumSeeds().setUnlocalizedName("seedsAluminium").setTextureName("seedsAluminium"); GameRegistry.registerItem(seedsAluminium, "aluminium_seeds"); // 小麦のインスタンス生成。 wheatAluminium = new Item().setUnlocalizedName("wheatAluminium").setTextureName("wheatAluminium").setCreativeTab(CreativeTabs.tabMaterials); GameRegistry.registerItem(wheatAluminium, "aluminium_wheat"); } } BlockAluminiumCrop.java +長いので囲みます package tutorial.aluminiummod; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockCrops; import net.minecraft.block.IGrowable; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.EnumPlantType; import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.Random; public class BlockAluminiumCrop extends BlockCrops implements IPlantable, IGrowable { private IIcon[] iIcons; public BlockAluminiumCrop() { // BlockBushのコンストラクタでMaterialはMaterial.plantsを指定されている。 super(); // updateTickがランダムに呼ばれるようにする。 this.setTickRandomly(true); // ブロックの大きさを指定する。あたり判定やカーソルがあった時の枠の大きさに使われる。 float f = 0.5F; this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.25F, 0.5F + f); // クリエイティブタブに表示されないようにする。 this.setCreativeTab(null); // 一瞬で破壊できるようにする。ツールを持っていても耐久値は消費しない。 this.setHardness(0.0F); // 設置時や歩行時の音の種類を指定する。 this.setStepSound(soundTypeGrass); // 統計にカウントされないようにする。(?) this.disableStats(); } /** その座標に設置できるか。 */ @Override public boolean canPlaceBlockAt(World world, int x, int y, int z) { return world.getBlock(x, y, z).isReplaceable(world, x, y, z) this.canBlockStay(world, x, y, z); // 以下はBlockBushでの実装。superを呼び出すと二重に判定されてしまうため変更した。 //return super.canPlaceBlockAt(world, x, y, z) this.canBlockStay(world, x, y, z); } /** そのブロックの上に設置できるか。 */ @Override protected boolean canPlaceBlockOn(Block block) { // 耕地の上のみ。 return block == Blocks.farmland; } /** 隣接ブロックが更新された時の処理。 */ @Override public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { // 二重判定回避のためコメントアウト。実際、Blockクラスでは何もしていない。 //super.onNeighborBlockChange(world, x, y, z, block); this.checkAndDropBlock(world, x, y, z); } /** Tick更新時の処理。 */ @Override public void updateTick(World world, int x, int y, int z, Random random) { // ランダムに呼ばれる。 this.checkAndDropBlock(world, x, y, z); // 一つ上のブロックの光源レベルが9以上の時。 if (world.getBlockLightValue(x, y + 1, z) = 9) { // メタデータを取得。 int l = world.getBlockMetadata(x, y, z); // 成長限界に達していない時。 if (l 7) { // 成長しやすさを取得。 float f = this.func_149864_n(world, x, y, z); // 成長させるかを判定する。 if (random.nextInt((int) (25.0F / f) + 1) == 0) { // 一段階成長させる。 ++l; world.setBlockMetadataWithNotify(x, y, z, l, 2); } } } } /** 設置状態を維持できるかを確認し、維持できなければドロップする。 */ @Override protected void checkAndDropBlock(World world, int x, int y, int z) { // 維持できない時。 if (!this.canBlockStay(world, x, y, z)) { // ドロップする。 this.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); // 空気に上書きする。 world.setBlock(x, y, z, getBlockById(0), 0, 2); } } /** その座標で維持できるか。 */ @Override public boolean canBlockStay(World world, int x, int y, int z) { // 下のブロックが耕地かどうかを判定する。 return world.getBlock(x, y - 1, z).canSustainPlant(world, x, y - 1, z, ForgeDirection.UP, this); } /** 作物の種別を返す。 */ @Override public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) { // IPlantableの実装。作物。耕地の上に設置する。 return EnumPlantType.Crop; } /** 作物ブロックのインスタンスを返す。 */ @Override public Block getPlant(IBlockAccess world, int x, int y, int z) { // IPlantableの実装。 return this; } /** 作物のメタデータを返す。 */ @Override public int getPlantMetadata(IBlockAccess world, int x, int y, int z) { // IPlantableの実装。 return world.getBlockMetadata(x, y, z); } /** 成長しやすさの数値を返す。 */ private float func_149864_n(World world, int x, int y, int z) { // 周囲の耕地、作物の状況を判定し、成長しやすさを算出する。 float f = 1.0F; Block block = world.getBlock(x, y, z - 1); Block block1 = world.getBlock(x, y, z + 1); Block block2 = world.getBlock(x - 1, y, z); Block block3 = world.getBlock(x + 1, y, z); Block block4 = world.getBlock(x - 1, y, z - 1); Block block5 = world.getBlock(x + 1, y, z - 1); Block block6 = world.getBlock(x + 1, y, z + 1); Block block7 = world.getBlock(x - 1, y, z + 1); boolean flag = block2 == this || block3 == this; boolean flag1 = block == this || block1 == this; boolean flag2 = block4 == this || block5 == this || block6 == this || block7 == this; for (int l = x - 1; l = x + 1; ++l) { for (int i1 = z - 1; i1 = z + 1; ++i1) { float f1 = 0.0F; if (world.getBlock(l, y - 1, i1).canSustainPlant(world, l, y - 1, i1, ForgeDirection.UP, this)) { f1 = 1.0F; if (world.getBlock(l, y - 1, i1).isFertile(world, l, y - 1, i1)) { f1 = 3.0F; } } if (l != x || i1 != z) { f1 /= 4.0F; } f += f1; } } if (flag2 || flag flag1) { f /= 2.0F; } return f; } /** あたり判定を返す。 */ @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { // あたり判定をなくす。 return null; } /** 不透明なブロックか。 */ @Override public boolean isOpaqueCube() { // 透明なブロックなのでfalseを返す。 return false; } /** 通常と同様に描画するか。 */ @Override public boolean renderAsNormalBlock() { return false; } /** 描画の種別を返す。 */ @Override public int getRenderType() { // 小麦などと同じ。四枚の板が上から見て「井」の形になるように配置され、そこにテクスチャが表示される。 return 6; } /** 種のアイテムを返す。 */ @Override protected Item func_149866_i() { return AluminiumMod.seedsAluminium; } /** 作物のアイテムを返す。 */ @Override protected Item func_149865_P() { return AluminiumMod.wheatAluminium; } /** ブロックをドロップさせる。 */ @Override public void dropBlockAsItemWithChance(World world, int x, int y, int z, int meta, float dropChance, int fortune) { super.dropBlockAsItemWithChance(world, x, y, z, meta, dropChance, fortune); // BlockCropで以下のようにオーバーライドされている。幸運レベルを0に固定。 //super.dropBlockAsItemWithChance(world, x, y, z, meta, dropChance, 0); } /** ドロップアイテムを返す。 */ @Override public Item getItemDropped(int meta, Random random, int fortune) { // 基本的に種を返すが、完全成長していたら作物を返す。 return meta == 7 ? this.func_149865_P() this.func_149866_i(); } /** ドロップ数を返す。 */ @Override public int quantityDropped(Random random) { return 1; } /** ドロップアイテムのリストを返す。 */ @Override public ArrayList ItemStack getDrops(World world, int x, int y, int z, int metadata, int fortune) { // 未成長なら種を、完全成長していたら作物が追加される。 ArrayList ItemStack ret = new ArrayList (); int count = quantityDropped(metadata, fortune, world.rand); for (int i = 0; i count; i++) { Item item = getItemDropped(metadata, world.rand, fortune); if (item != null) { ret.add(new ItemStack(item, 1, damageDropped(metadata))); } } // 以上はBlockでの実装。以下はBlockCrops出の実装。重複処理回避のため変更した。 //ArrayList ItemStack ret = super.getDrops(world, x, y, z, metadata, fortune); // // 完全成長の時。 if (metadata = 7) { // 幸運レベルにより判定回数が増加する。デフォルトは3回。 for (int i = 0; i 3 + fortune; ++i) { // 0~14 = 7 より、1/2の確率。 if (world.rand.nextInt(15) = metadata) { // 種を追加する。 ret.add(new ItemStack(this.func_149866_i(), 1, 0)); } } } return ret; } /** 対応するアイテムを返す。 */ @Override @SideOnly(Side.CLIENT) public Item getItem(World world, int x, int y, int z) { // 種を返す。 return this.func_149866_i(); } /** ブロックのテクスチャを返す。 */ @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { // メタデータの数値が異常だったら成長限界の値を使う。 if (meta 0 || meta 7) { meta = 7; } return this.iIcons[meta]; } /** ブロックのテクスチャを登録する。 */ @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister register) { this.iIcons = new IIcon[8]; for (int i = 0; i this.iIcons.length; ++i) { this.iIcons[i] = register.registerIcon(this.getTextureName() + "_stage_" + i); } } /** 骨粉を使用できるか。 */ @Override public boolean func_149851_a(World world, int x, int y, int z, boolean isRemote) { // IGrowableの実装。完全成長していたらfalse。 return world.getBlockMetadata(x, y, z) != 7; } /** 骨粉を適用するか。 */ @Override public boolean func_149852_a(World world, Random random, int x, int y, int z) { // IGrowableの実装。 return true; } /** 骨粉を適用する。 */ @Override public void func_149853_b(World world, Random random, int x, int y, int z) { // IGrowableの実装。 this.func_149863_m(world, x, y, z); } /** 骨粉を使用した時の成長させる処理。 */ @Override public void func_149863_m(World world, int x, int y, int z) { // 成長段階を2以上5以下上昇させる。 int l = world.getBlockMetadata(x, y, z) + MathHelper.getRandomIntegerInRange(world.rand, 2, 5); // 成長限界を超えていたら抑える。 if (l 7) { l = 7; } // メタデータを設定する。 world.setBlockMetadataWithNotify(x, y, z, l, 2); } } ItemAluminiumSeeds.java package tutorial.aluminiummod; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemSeeds; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.EnumPlantType; import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.util.ForgeDirection; public class ItemAluminiumSeeds extends ItemSeeds implements IPlantable { private Block field_150925_a; // 土台となるブロックのインスタンス。使われていない。 //private Block soilBlockID; public ItemAluminiumSeeds() { super(AluminiumMod.cropAluminium, Blocks.farmland); // 以下はItemSeedsのコンストラクタ。 this.field_150925_a = AluminiumMod.cropAluminium; //this.soilBlockID = Blocks.farmland; //this.setCreativeTab(CreativeTabs.tabMaterials); } /** アイテムを使用した時の処理。 */ @Override public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { if (side != 1) { return false; } else if (player.canPlayerEdit(x, y, z, side, itemStack) player.canPlayerEdit(x, y + 1, z, side, itemStack)) { // 上からの使用で、プレイヤーが編集可能で、右クリックしたブロックが耕地であり、その上が空気の時。 if (world.getBlock(x, y, z).canSustainPlant(world, x, y, z, ForgeDirection.UP, this) world.isAirBlock(x, y + 1, z)) { // 作物を設置する。 world.setBlock(x, y + 1, z, this.field_150925_a); // スタック数を減らす。 --itemStack.stackSize; return true; } else { return false; } } else { return false; } } /** 作物の種別を返す。 */ @Override public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) { // IPlantableの実装。作物。耕地の上に設置する。 return EnumPlantType.Crop; } /** 作物ブロックのインスタンスを返す。 */ @Override public Block getPlant(IBlockAccess world, int x, int y, int z) { // IPlantableの実装。 return field_150925_a; } /** 作物のメタデータを返す。 */ @Override public int getPlantMetadata(IBlockAccess world, int x, int y, int z) { // IPlantableの実装。 return 0; } } 解説 Block Block setTickRandomly(boolean needsRandomTick) trueにすると、updateTickがランダムなタイミングで呼ばれるようになる。 void setBlockBounds(float minX, float minY, float minZ, float maxX, float maxY, float maxZ) ブロックの大きさを設定する。 あたり判定やカーソルがあった時の枠の大きさに使われる。 Block disableStats() 統計にカウントされないようにする。(?) 正確な挙動を把握できていません。ご存知の方、ご教授いただければ幸いです。 boolean canPlaceBlockAt(World world, int x, int y, int z) その座標に設置できるか。 void onNeighborBlockChange(World world, int x, int y, int z, Block block) 隣接ブロックが更新された時の処理。 void updateTick(World world, int x, int y, int z, Random random) Tick更新時の処理。 boolean canBlockStay(World world, int x, int y, int z) その座標で維持できるか。 AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) あたり判定を返す。 BlockのデフォルトではsetBlockBoundsの設定が適用される。 boolean isOpaqueCube() 不透明なブロックか。 boolean renderAsNormalBlock() 通常と同様に描画するか。 int getRenderType() 描画の種別を返す。 void dropBlockAsItemWithChance(World world, int x, int y, int z, int meta, float dropChance, int fortune) ブロックをドロップさせる。 Item getItemDropped(int meta, Random random, int fortune) ドロップアイテムを返す。 int quantityDropped(Random random) ドロップ数を返す。 ArrayList ItemStack getDrops(World world, int x, int y, int z, int metadata, int fortune) ドロップアイテムのリストを返す。 Item getItem(World world, int x, int y, int z) 対応するアイテムを返す。 Clientのみ。第三ボタンでのピックアップに使っている。 IIcon getIcon(int side, int meta) ブロックのテクスチャを返す。 void registerBlockIcons(IIconRegister register) ブロックのテクスチャを登録する。 BlockBush 植物系ブロックの親クラス。 boolean canPlaceBlockOn(Block block) そのブロックの上に設置できるか。 void checkAndDropBlock(World world, int x, int y, int z) 設置状態を維持できるかを確認し、維持できなければドロップする。 BlockCrops 小麦のクラス。 人参やジャガイモの親クラスでもある。 float func_149864_n(World world, int x, int y, int z) 成長しやすさの数値を返す。 周囲の耕地、作物の状況を判定し、成長しやすさを算出する。 privateメソッドなので、隠蔽して実装しなおしている。 Item func_149866_i() 種のアイテムを返す。 Item func_149865_P() 作物のアイテムを返す。 void func_149863_m(World world, int x, int y, int z) 骨粉を使用した時の成長させる処理。 IPlantable 植物用のインターフェース。 下のブロックの判定などに使う。 ここでは、種と作物(ブロック)が実装している。 EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) 作物の種別を返す。 Block getPlant(IBlockAccess world, int x, int y, int z) 作物ブロックのインスタンスを返す。 int getPlantMetadata(IBlockAccess world, int x, int y, int z) 作物のメタデータを返す。 IGrowable 骨粉を使用できるブロックのためのインターフェース。 boolean func_149851_a(World world, int x, int y, int z, boolean isRemote) 骨粉を使用できるか。 boolean func_149852_a(World world, Random random, int x, int y, int z) 骨粉を適用するか。 void func_149853_b(World world, Random random, int x, int y, int z) 骨粉を適用する。 使用例 オファレンMOD-[1.7.10]2.0.0で実装予定のオファレン草。 ただし、作物はオファレンの欠片で、成長段階数、成長判定、骨粉判定などは小麦と異なる予定。 コメント この項目に関する質問などをどうぞ。 名前