約 2,202,395 件
https://w.atwiki.jp/battlefield1942/pages/48.html
国内MOD
https://w.atwiki.jp/akasatanahama/pages/137.html
概要 Minecraft内のクラス書き換えインターフェイス、"IClassTransformer"を用いてバニラクラスの書き換えを行う。 このチュートリアルはとても難解な内容を含んでいます。 中級編までをひとしきり出来るようになってから挑戦してください。 バニラクラスを書き換えるため競合に注意して行ってください。 事前準備 今回は事前の準備が幾つか必要である。 まず、クラス書き換え用の別ディレクトリをsrc/main/java内に作成する。今回はalcore.asmとする。 ディレクトリを分けずにやると正しく読み込めなくなるため必ずディレクトリを分ける。 次に、coremodとして働かせる(→クラス書き換え用に通常のMODより早く読み込む)MODとして、開発環境とビルド環境にそれぞれ読み込ませる。 今回はcoremodのクラスをalcore.asm.ALCorePluginとする。 ビルド環境 MODのjarファイル内に情報を埋め込めるよう、build.gradleファイルの末尾に以下のコードを追加する。 //manifestファイルの書き込みをビルドに追加する。これにより、coremodの読み込みが可能になる。 //なお、テスト起動時にはこのオプションが効かないためVMオプションに以下の引数を追加する。 //-Dfml.coreMods.load=alcore.asm.ALCorePlugin jar { manifest { //coremodのパスを指定する。 attributes FMLCorePlugin alcore.asm.ALCorePlugin //今回はAluminiummodが別で入っているためそれも読み込む。 attributes FMLCorePluginContainsFMLMod true } } 開発環境 開発環境では上記のものが効かないためVMオプションに以下の引数を追加する。 -Dfml.coreMods.load=alcore.asm.ALCorePlugin ソースコード 今回は、ディレクトリ"tutorial.aluminiummod"でアイテムの追加とレシピの追加及び鉱石の追加を参考にアルミニウムインゴット、アルミニウム鉱石とその精錬レシピまでを実装してある前提で解説する。 もしそこまでのやり方がわからない場合は、一旦上記三つのチュートリアルをよく読んでから戻ってきていただきたい。 ALCorePlugin.java package alcore.asm; import cpw.mods.fml.relauncher.IFMLLoadingPlugin; import java.util.Map; public class ALCorePlugin implements IFMLLoadingPlugin { //書き換え機能を実装したクラス一覧を渡す関数。書き方はパッケージ名+クラス名。 @Override public String[] getASMTransformerClass() { return new String[]{"alcore.asm.ALCoreTransformer"}; } //あとは今回は使わない為適当に。 @Override public String getSetupClass() { return null; } @Override public void injectData(Map String, Object data) { } @Override public String getAccessTransformerClass() { return null; } @Override public String getModContainerClass() { return null; } } ALCoreTransformer.java package alcore.asm; import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; import net.minecraft.launchwrapper.IClassTransformer; import org.objectweb.asm.*; import static org.objectweb.asm.Opcodes.*; public class ALCoreTransformer implements IClassTransformer { //IClassTransformerにより呼ばれる書き換え用のメソッド。 @Override public byte[] transform(final String name, final String transformedName, byte[] bytes) { //対象クラス以外を除外する。対象は呼び出し元があるクラスである。 if (!"net.minecraft.tileentity.TileEntityFurnace".equals(transformedName)) return bytes; ClassReader cr = new ClassReader(bytes); ClassWriter cw = new ClassWriter(1); ClassVisitor cv = new ClassVisitor(ASM4, cw) { //クラス内のメソッドを訪れる。 @Override public MethodVisitor visitMethod(int access, String methodName, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, methodName, desc, signature, exceptions); //呼び出し元のメソッドを参照していることを確認する。 String s1 = FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(name, methodName, desc); //C \Users\ ユーザー名 \.gradle\caches\minecraft\net\minecraftforge\forge\1.7.10-10.13.4.1558-1.7.10\forge-1.7.10-10.13.4.1558-1.7.10-decomp.jar\より名称を検索、比較してメソッドの難読化名を探す。 if (s1.equals("updateEntity") || s1.equals("func_145845_h") || methodName.equals("updateEntity") || methodName.equals("func_145845_h")) { //もし対象だったらMethodVisitorを差し替える。 mv = new MethodVisitor(ASM4, mv) { //呼び出す予定のメソッドを読み込む。 @Override public void visitMethodInsn(int opcode, String owner, String methodName, String desc, boolean itf) { //書き換え対象のメソッドであることを確認する。 String s2 = FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(name, methodName, desc); if (s2.equals("isBurning") || s2.equals("func_145950_i") || methodName.equals("isBurning") || methodName.equals("func_145950_i")) { //引数として次に渡す値にthisを指定する。 mv.visitVarInsn(ALOAD, 0); //メソッドを読み込む。INVOKESTATICでstaticメソッドを呼び出す。 super.visitMethodInsn(INVOKESTATIC, "alcore/asm/ALCoreHook", "ALFurnaceHook", Type.getMethodDescriptor(Type.VOID_TYPE, Type.getObjectType("net/minecraft/tileentity/TileEntity")), false); //今回はフックを差し込むだけだが、ここで書き換えも出来る。 } //今回は最後に元のクラスを読み込んでreturnする。 super.visitMethodInsn(opcode, owner, methodName, desc, itf); } }; } return mv; } }; cr.accept(cv, ClassReader.EXPAND_FRAMES); return cw.toByteArray(); } } ALCoreHook.java package alcore.asm; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityFurnace; import tutorial.aluminiummod.AluminiumMod; public class ALCoreHook { //差し込むフック。フック内の詳細は割愛。簡単に言うと、鉄鉱石とアルミニウムインゴットがある状態で火がついていたら爆発して鉄を撒き散らす。 public static void ALFurnaceHook(TileEntity tileEntity) { if (tileEntity instanceof TileEntityFurnace) { TileEntityFurnace furnace = ((TileEntityFurnace) tileEntity); if (furnace.furnaceBurnTime 0 furnace.getStackInSlot(0) != null furnace.getStackInSlot(0).getItem() == Item.getItemFromBlock(Blocks.iron_ore) furnace.getStackInSlot(2) != null furnace.getStackInSlot(2).getItem() == AluminiumMod.aluminium) { furnace.setInventorySlotContents(0, null); furnace.setInventorySlotContents(1, null); furnace.setInventorySlotContents(2, null); if (!furnace.getWorldObj().isRemote) { furnace.getWorldObj().newExplosion(null, furnace.xCoord, furnace.yCoord, furnace.zCoord, 15, true, true); EntityItem entityItem = new EntityItem(furnace.getWorldObj(), furnace.xCoord, furnace.yCoord, furnace.zCoord, new ItemStack(Items.iron_ingot, furnace.getWorldObj().rand.nextInt(32) + 32)); entityItem.fireResistance = Integer.MAX_VALUE; furnace.getWorldObj().spawnEntityInWorld(entityItem); } } } } } 解説 ALCorePlugin.java public String[] getASMTransformerClass() 書き換えするコードを記述したIClassTransformerを実装してあるクラスを渡す。 配列形式であるため、トランスフォーマーはいくつも追加することが出来る。 public String getModContainerClass() 今回はModとして見えないように実装するため、nullを返してある。 もしModとして見えるようにする(CodeChickenCoreのように別MODとしてリリースする)ならば、DummyModContainerを継承したクラス名をStringで渡す。 ex. "alcore.asm.ALModContainer" ALCoreTransformer.java public byte[] transform(final String name, final String transformedName, byte[] bytes) 書き換えの実態を担うクラス。引数は クラス名、易読化クラス名、バイトコードである。 バイトコードはそのままでは読めない読めたらすごいため、 ClassReader(バイトコードをASMで読めるようにする)→ClassWriter(ClassReaderを書き出せるようにする)→ClassVisitor(内部クラスでクラスを書き換えられるようにする) と手順を踏んで使えるようにする。 最終的にClassWriterをバイトコードに書き出して返す。 間違って別のクラス・メソッドを書き換えてしまってはいけないため、名称でのチェックが必要。 FMLDeobfuscatingRemapper public String mapMethodName(String owner, String name, String desc) クラス名、難読化されたメソッド名、引数記述Type(後述)の順で引数を与えて易読化メソッド名を返す…… はずなのだが、forge1.7.10だと何故かうまく動かない事がある。そのため、コメントの通り難読化されたソースコードと易読化されたものを比較し、難読化名も判定しておいたほうがいい。 ClassVisitor public MethodVisitor visitMethod(int access, String methodName, String desc, String signature, String[] exceptions) ここで、呼び出し元のメソッドをチェックする。今回は"onUpdateEntity"から呼ばれた"isBurning"に対して書き換えを施しているが、もし無差別にあるメソッドを書き換えるならif節は不要。 MethodVisitor public void visitMethodInsn(int opcode, String owner, String methodName, String desc, boolean itf) メソッド内での呼び出しされたメソッドを訪れる。 同様にintやstringなども訪れることが出来る(Methodvisitorのソース参照)。 ここで他のメソッドを呼び出してやることで、書き換えが実現できる。 ビルド・コンパイル coremodが正しく読み込まれているならば以下が出力されているはずである。テストプレイ時はまずこれをチェックしてみてほしい。 Found a command line coremod alcore.asm.ALCorePlugin また、このデータをjarファイルにコンパイルしたらMinecraftのディレクトリにあるmodsフォルダに入れてテストプレイをしたほうが良い。 難読化の都合上環境を変えるとうまく動かないためである。 不具合がある場合はロガーやSystem.out.printInを使って引数や変数の内容を出力させてみるのも手である。 コメント この項目に関する質問などをどうぞ。 名前
https://w.atwiki.jp/synced/pages/14.html
永遠に編集中 ランナーMOD 確認できたMODを列挙する。 多すぎるので畳んだ。情報求ム + MOD一覧 MOD名 アイコン 特性 白 青 紫 金 赤 【状態異常】アーマーブレイク いずれかの状態異常をナノに付与するとアーマーを破壊する。クールタイム10秒。1.発動率2.アーマーダメージ 1.50%2.+20% 【状態異常】エクステンダー いずれかの状態異常をナノに付与すると、状態異常の継続時間が延長される。1.【状態異常】継続時間2.継続ダメージ 1.8秒2.+10% 1.16秒2.+20% 【状態異常】コンフリクト 状態異常を2つナノに付与したとき追加ダメージを与える。クールタイム8秒。1.与ダメージ2.継続ダメージ 1.4002.+8% 1.4002.+15% 【状態異常】スプレッダー いずれかの状態異常をナノに付与すると【状態異常】ウェーブが発生する。クールタイム5秒1.【状態異常】ウェーブ範囲2.継続ダメージ 1.6m2.+10% 1.10m2.+20% 【状態異常】スロウ 状態異常がナノに拡散し減速効果を与える。1.発動率2.継続ダメージ 1.1002.+20% 【状態異常】ドッジウェーブ パーフェクトドッジに成功すると【状態異常】ウェーブが発生する。1.【状態異常】ウェーブ範囲2.回避クールタイム速度 1.10m2.+25% アーマーブレイク エナジーラウンドがナノアーマーを破壊することがある。1.発動率2.エナジーラウンド・サイズ 1.40%2.+200% アーマーリコシェイ リロード後、最初の3発がナノの間で跳弾し、アーマーを破壊する。1.発動率2.跳弾数 1.100%2.+1 アームドシーフ 弱点キルに成功すると医療キットがドロップする。1.発動率 1.40% アニマルパワー コンパニオンの体力が40%以下になると、クリティカルダメージ量が上昇する。1.コンパニオン・クリティカルダメージ2.継続時間 1.+200%2.60秒 イージードッジ パーフェクトドッジができる判定時間が延長される。1.判定時間2.回避クールタイム速度 1.0.3秒2.+25% インビンシブルアーマー アーマーを回復中、最初の被ダメージを無効化する。1.クールタイム2.アーマー回復速度 1.15秒2.+40% ウィークハンター ランナースキルを使用する度に、与える弱点ダメージが上昇する。※(60%)は上限60%の意1.弱点ダメージ 1.+20%(60%) ウィークポイントスタン ナノの弱点を攻撃するとスタンを引き起こす。1.発動率2.スタンダメージ 1.40%2.+20% 1.50%2.+30% エクスプローシブリコシェイ とどめの銃弾がナノの間で跳弾し、爆発を引き起こす。1.発動率2.爆破ダメージ 1.100%2.+50% エナジーラウンド・ショック エナジーラウンドが【状態異常】ショックを付与する。1.発動率2.チャージ速度 1.100%2.40% オービタースキル オービターがナノに命中するとスキルクールタイムを短縮する。スタック3回1.オービター速度2.オービタークールタイム短縮 1.+66%2.2秒 オービタースタン オービターがナノをスタンする。クールタイム5秒。1.オービター速度2.オービタークールタイム短縮 1.66%2.2秒 オービタースロウ オービターがナノに減速効果を与える。1.オービター速度2.オービタークールタイム短縮 1.+66%2.2秒 オービタープロテクター オービターが自身の被ダメージを軽減する。1.ダメージ軽減2.ボーナス 1.10%2.ノックバックなし ガンスリンガー サブ武器のリロード速度と制度が上昇する。1.リロード速度と精度2.ハンドガンダメージ 1.100%2.+100% キネティックアーマー 他のナノにダメージを与えると、付近のナノのアーマーを破壊する。1.発動率2.アーマー最大値 1.100%2.+100% クリティカルケア クリティカルヒット発生時に体力を少量回復する。1.体力回復2.クールタイム 1.10%2.8秒 クリティカルディール クリティカルヒット発生時にメイン武器のダメージが上昇する。1.武器ダメージ2.持続時間 1.+20%2.15秒 クリティカルリロード リロード後、クリティカルダメージが数秒間上昇する。1.クリティカルダメージ2.持続時間 1.+40%2.15秒 シックネスストライク 近接攻撃でナノに状態異常を付与する。1.発動率2.近接攻撃時に出現 1.100%2.ブリーズブレード シューターズタッチ 弱点キルに成功するとクリティカルダメージ発生率が一時的に上昇する。1.クリティカルダメージ2.持続時間 1.+30%2.15秒 スキルスリル ランナースキルを使用した直後、メイン武器のダメージが上昇する。1.武器ダメージ2.継続時間 1.+50%2.30秒 スタンアンドガン スタン状態で体力が低下しているナノを、一撃で倒せる。1.体力下限2.スタン+ 1.35%2.1秒 1.40%2.2秒 ステディショット サブ武器でナノを二発連続で撃つと、一時的に弾が二発同時に発射される。1.2発目の弾のダメージ2.ハンドガンダメージ 1.-10%2.+50% スナッフアウト 自身が受けている【状態異常】ファイアの継続時間を短縮する。1.継続時間短縮 1.100% スローリコシェイ 銃弾がナノの間で跳弾し、命中した対象に減速効果を与える。1.クールタイム2.跳弾数 1.1秒2.+2 セカンドウィンド 体力とアーマーの回復速度が上昇する。1.回復速度2.アーマー回復速度 1.+40%2.+40% チェーンブレーカー ナノのアーマーを破壊すると、付近のナノのアーマーも同時に破壊する。1.発動率2.アーマーダメージ 1.50%2.+20% チャージウェーブ ランナースキルが再使用可能となった直後、【状態異常】ウェーブが発生する。1.発動率2.スキルクールタイム 1.100%2.20% ノックバックアウト ナノがノックバック中に障害物や敵同士に衝突すると、追加ダメージを与えることがある。1.与ダメージ2.ノックバック・ダメージ 1.3002.+25% 1.3002.+40% ノックバックエクスプロード ナノをノックバックすると爆発を引き起こす。クールタイム1秒。1.発動率2.爆破ダメージ 1.80%2.+50% 1.100%2.+75% ノックバックバレット リロード後、最初の6発が命中するとノックバックを引き起こす。1.発動率2.ノックバック・ダメージ 1.40%2.+35% 1.50%2.+50% パーティクラッシャー 呼び出し直後、一時的にコンパニオンの与ダメージが上昇する。1.コンパニオン・ダメージ2.継続時間 1.+50%2.60秒 パートナーズヘルプ プライムを倒す度にコンパニオンのクリティカルダメージ発生率が上昇する。3回スタック。※(60%)は上限60%の意1.コンパニオン・クリティカルダメージ 1.+20%(60%) ハードヒッター ナノを倒すと、同じタイプのナノにダイレクトダメージを与える。1.継続時間2.ショックウェーブ・ダメージ 1.4.5秒2.+50% バードフェザー ナノを倒すと付近の同じタイプのナノにダメージを与えられる。。1.トリガー範囲2.ショックウェーブ・ダメージ 1.15m2.+50% ハイパーインシュレータ 自身が受けている【状態異常】ショックの継続時間を短縮する。1.継続時間短縮 1.100% ヒーリングタイム 医療キットを使用中、付近のナノに減速効果を与える1.クールタイム2.医療キット回復量 1.15秒2.+100% ピストルスプリッター 15メートル以内にいる敵をサブ武器で攻撃した時、サブ武器の銃弾がまれに分裂し、多段攻撃を与えられる。1.発動率2.ハンドガンダメージ 1.100%2.+50% フォールンバースト ナノを銃弾で倒すとグレネードを落とす。1.爆破範囲2.爆破ダメージ 1.8m2.+50% 1.12m2.+75% プッシュバック ノックバックを継続的に繰り出す。1.最大ノックバック回数2.ノックバック・ダメージ 1.42.+40% 1.52.+60% プライムスタン スタン状態のナノを倒すと、付近のナノにスタンを拡散する。1.発動率2.スタンダメージ 1.80%2.+20% 1.100%2.+30% ブラッドタックス ナノを倒す度に体力を少量回復する。1.体力回復 1.3% ブリーズバレット 近接武器を所持している状態でブリーズバレットを放つことができる。1.クールタイム2.近接ダメージ 1.1秒2.+75% フレンドリーファイア ナノを倒すと、コンパニオンの体力を少量回復する。1.体力回復 1.10% ヘルシードッジ パーフェクトドッジに成功すると体力を回復する。クールタイム5秒。1.体力回復2.回避クールタイム速度 1.50%2.+25% ポイズンコントロール 自身が受けている【状態異常】ポイズンの継続時間を短縮する。1.継続時間短縮 1.100% メイクレモネード ダメージを受けると、スキルクールタイムを短縮する。クールタイム5秒。1.残りクールタイム短縮2.スキルクールタイム 1.15%2.10% メレーマスター プライムに近接攻撃時、ダメージが上昇し体力を少量回復する。1.ダメージ率2.体力回復 1.1.5%2.2% メレーレンジ 近接攻撃の範囲を拡大する。1.攻撃範囲2.近接ダメージ 1.600%2.+75% リベンジリバイバル ノックダウン中、サブ武器でナノを倒すと蘇生する。1.クールタイム2.ハンドガンダメージ 1.400秒2.+50% リロードブラスト フルリロードするとグレネードを落とす。1.爆破数2.爆破ダメージ 1.32.+30% 1.42.+40% ワンヒットワンダー ナノを倒すと、同じタイプのナノを一撃で倒すフィールドが自身の周りに生成される。1.発動率2.ショックウェーブ・ダメージ 1.50%2.+50% ランダム特性の種類 MODスロットの1・2枠と3・4枠で効果が違う 1・2枠がランナー強化で、3・4枠がコンパニオン強化 + MODスロ1・2 多分クリダメとクリ発生率2個ずつがいいんじゃないですかね。 ランナーダメージもあり? ランダム特性 白 青 紫 金 各武器ダメージ 3% 6% 9% 12% ランナー・クリティカルダメージ 5% 10% 15% 20% ランナー・クリティカル発生率 2% 3% 4% 5% ランナー・ダメージ 2% 4% 6% 8% ランナー・エナジーダメージ 3% 6% 9% 12% ランナー・ショックウェーブダメージ 3% 6% 9% 12% ランナー・継続ダメージ 3% 6% 9% 12% ランナー・ノックバックダメージ 6% 12% 18% 24% ランナー・ノックバック衝突ダメージ 6% 12% 18% 24% ランナー・非シールドダメージ 2% 3% 4% 5% ランナー・アーマーダメージ 3% 6% 9% 12% ランナー・スタンダメージ 2% 3% 4% 5% ランナー・非シールドダメージ 2% 3% 4% 5% ランナー・爆破ダメージ 3% 6% 9% 12% 最大体力値 10% 20% 30% 40% 医療キット回復量 2% % % % 近接武器ダメージ 3% 6% 9% 12% 弾薬数 2% 4% 6% 8% + MODスロ3・4 これいる? ランダム特性 白 青 紫 金 赤MODの特性 赤MODのみ、通常の効果に加えて一個強力な特性が付く。 ↑こんな感じ。 おそらく、特性の効果幅は三段階存在する。 これらもランダム特性同様、1・2枠目がランナー強化で3・4枠目がコンパニオン強化。 なので基本的に1・2枠目の赤MODを厳選することになる。 一応確認したものだけ記入。情報求ム!!! 特性名 効果量(%) 各武器ダメージ 18/24/30 ランナー・クリティカルダメージ 30/40/50 ランナー・クリティカル発生率 6/8/10 ランナー・ダメージ 15/20/25 ランナー・非シールドダメージ 9/12 ランナー・アーマーダメージ 18/24 ランナー・スタンダメージ 6/9/12 ランナー・継続ダメージ 18/24/30 ランナー・ノックバックダメージ 36/48 ランナー・ノックバック衝突ダメージ 36/48 ランナー・爆破ダメージ 18/24/30 ランナー・ショックウェーブダメージ 18/24 ランナー・エナジーダメージ 18/24 最大体力値 60 近接武器ダメージ 24/30 3・4スロのまとめは、多分需要ないから気が向いたらやれるときにやると思われる可能性があります。(やらない)
https://w.atwiki.jp/gtafreedom/pages/14.html
MODとは Modificationの略で最初の3文字をとったものです。 意味は 拡張や改変を加えたようなものです。 --導入に関して Q.1導入は簡単ですか? A.基本的にSAのMOD導入はファイルを入れ替えるだけなので 簡単です。 基本的には 特殊なツールを使って導入します。 Q.2.MODはタダですか? A.タダです。 場合によっては登録が必要なサイトが、ありますが 基本的にはタダです。 Q.3MOD使ってのマルチプレイは可能ですか? A. [SA-MP]を使えば可能です コチラのMODはタダですよ~ Q.4 MODを作ってみたいのですが・・・ A. 作るとしたらテクスチャの改造 (.txdを使う)からはじめることをオススメします。 いきなり車MODの作成は ムリに近いです。
https://w.atwiki.jp/eftkouryaku/pages/86.html
武器MOD マガジン バレル マウント サイト グリップ ハンドガード ストック ダストカバー
https://w.atwiki.jp/csjake/pages/24.html
アメリカ ラプターチーム Jake Dunn我らが主人公。コードネームはNomad Laurence Barnesラプターチームの隊長。コードネームはProphet Michael Sykesチームメンバー。コードネームはPsycho Martin Hawkerチームメンバー。コードネームはJester Harry Cortezチームメンバー。コードネームはAztec 調査隊 Dr. Rosenthal調査チームのリーダー Helena Rosenthalローゼンタール博士の娘 指揮官 Major Stricklandアイダホチーム(地上部隊)の指揮官 Major Bradley指揮官 Admiral Morrison米軍艦隊の指揮官 アメリカ中央情報局 Sarah HansenCIAの諜報員 北朝鮮 General Ri Chan Kyong北朝鮮軍の指揮官
https://w.atwiki.jp/mountandblade/pages/125.html
モーション変更MOD、Ryuzaki's animation mini-modの解説。 ダウンロード('09.03.15時点):http //depositfiles.com/en/files/z97di90cq フォーラム:Ryuzaki's animation mini-mod 0.7 MODによる変更点変更箇所 特徴と注意点 インストール、アンインストール方法ファイルのダウンロード 丸ごと差し替え 個別に差し替え アンインストール スクリーンショットモーション比較(一部) MODによる変更点 変更箇所 このMODでは以下のモーションに変更を加えます。 Swing (onehanded) ―片手武器:上段 Slashleft (onehanded) ―片手武器:左 Slashright (onehanded) ―片手武器:右 Thrust (onehanded) ―片手武器:突き Swing (twohanded) ―両手武器:上段 Slashright for horseman ―馬上(片手,両手とも):右 Slashleft for horseman ―馬上(同上):左 Reaction on atacking in the shield ―攻撃を盾で弾かれた際の反動 Thrust (onehanded lance) ―片手槍:突き Shield defend ―防御(盾) Stun ―馬や鈍器による攻撃を受けた際の怯み 特徴と注意点 構える際のモーションが変わる事で、攻撃それ自体の挙動も微妙に変化します。 例えば従来の左右からの斬撃は相手の胴体へ斬りつけていましたが、変更後は頭へ斬りつけるようになります。 (翻せば、こちらの頭も狙われやすくなります) そのため、緩やかな丘などで対峙した際は頭上を掠めて空振りしてしまう事が多くなるので、 相手の足元に視点を気持ち程度落とすと当てやすくなります。 どのモーションも素晴らしい出来栄えなのでデフォルトと併用するかどうかは個人の好みによりますが、 変更後のStun―strike_fall_back_rise(馬の蹴飛ばし、鈍器による怯み)はゲームのバランスを損なうため、元に戻すことをお勧めします。 大抵のMODのモーションは素のままなので、カスタマイズしたactions.txtをそのまま差し替えれば流用できます。 インストール、アンインストール方法 ファイルのダウンロード http //depositfiles.com/en/files/z97di90cq ページ内の「Download the file」をクリック→保存。 丸ごと差し替え 差し替える前に、導入したいMODフォルダ内にあるactions.txtのバックアップを取っておいて下さい。 ダウンロード、解凍したフォルダ内にあるactions.txtをMODフォルダ内のactions.txtに上書き (例:Mount Blade/Modules/Native/actions.txt) 個別に差し替え 上と同じく、差し替える前にMODフォルダ内のactions.txtのバックアップを取っておいて下さい。 本家フォーラム内のSpoilerタブ内に、個別の差し替え箇所が記述されています。 各モーションごとに2種類ずつ記述されていますが、上がデフォルト、下がMODによる変更箇所です。 例えば一番上に記載されているSwing (onehanded)= 片手武器(上段)の場合、 ready_overswing_onehanded 532992 1 0.350000 anim_human 29300 29305 7 0 0.0 0.0 0.0 0.0 ready_overswing_onehanded 8192 1 0.350000 anim_human 22060 22070 7 0 0.0 0.0 0.0 0.0 メモ帳などでactions.txtを開き、上の二行を探して下の二行で上書きすればこのMODのモーションになります。 逆に、変更後デフォルトに戻したい場合は該当箇所を上の二行で上書きすれば元に戻ります。 アンインストール バックアップしておいたactions.txtで上書きすれば全て本来のモーションに戻ります。 スクリーンショット モーション比較(一部) 左側がMOD適用後、右側がデフォルトのモーション(それぞれ武器を完全に構えた状態) 片手武器:上段 片手武器:左 片手武器:右 片手武器:突き 両手武器:上段
https://w.atwiki.jp/wiki1_general/pages/17.html
MODの使い方 ~オリジナルと共存可能な適用法~ 注意!!MODの追加は自己責任で行ってください。 MOD追加により不具合が発生しても責任は負えません。 MODとは? MODとは、簡単に言うと、ゲームのグラフィックや、文字列を変更して雰囲気を変えたりするものです。たいていのMODは一つのテーマでまとまって配布されています。 General MOD の適用方法 MODで変更される個所は主にゲーム内の画像や、iniファイルになります。 試しに拙作サンプルのMiddleEastMODを追加してみましょう。 Generalをインストールしたフォルダを[GENERAL]とします。 1.まず、[GENERAL]の中に新規フォルダを作り、フォルダ名をMOD識別名にする。(MiddleEastMODの場合は「MEM」) 以下、これをMODフォルダと呼ぶ。 2.General.exeをコピーし、MODページの「設定」の「ファイル名」の「.exeファイル」の部分に記載されている名前にリネームする。 (MiddleEastMODの場合は「general_MEM.exe」)以下、これをMODexeと呼ぶ。 3.General.iniもコピーし、General.exeと同様にリネームする。 (MiddleEastMODの場合は「general_MEM.ini」)以下、これをMODiniと呼ぶ。 4.MODページの「設定」の「ファイル名」の「general_MEM.ini」の部分をコピーし、日本語化の時と同じ要領でMODiniに貼り付ける。 5.日本語化のときと同じ要領で、国名、将軍名等をコピーし、MODiniに貼り付ける。 また、英語表記・日本語表記があるものについては、好みに応じてどちらかを選ぶ。 6.画像などがある場合、ダウンロードしてMODフォルダに入れる。 7.MOD追加作業完了。実行する時はMODexeでプレイする。 8.今までの元のGeneralをプレイしたい場合はGeneral.exeでプレイすればよい。 つまり、元のファイルは変更されていないので、両立できている。 名前 コメント
https://w.atwiki.jp/motomods/pages/15.html
商品紹介 Moto Zシリーズに横持ち型のスライドキーボードを追加するMod。 バックライト・1500mAhの追加バッテリーを備える他、最大45度まで傾けることもできる。 また、音量調整などのショートカットキー機能(うち二つはユーザーによるキー割り当てが可能)もある。 出資タイプ Fixed Funding(目標金額に達しなかった場合返金) PERKS(報酬)一覧 名前 金額 内容 限定数 Super Early Bird (Black) $60 Mods本体(割引・黒のみ) 2500 Super Early Bird Other Layout $60 Mods本体(割引・黒のみ・QWERTY以外の配列) 2500 Early Bird $80 Mods本体(黒/白/金) 5000 Early Bird Other Layout $80 Mods本体(黒/白/金・QWERTY以外の配列) 5000 Livermorium Starter Edition $200 Mods本体(Indiegogoキャンペーン限定色) 1500 Donation $500 Mods本体(Indiegogo限定色+レーザー刻印) 100 Retail Bulk Order X10 $600 Mods本体(黒/白/金・10個セット) 500 Retail Bulk Order Other Layout $600 Mods本体(黒/白/金・10個セット・QWERTY以外の配列) 500 リンク
https://w.atwiki.jp/akasatanahama/pages/102.html
概要 MOBを追加する。 今回は、匠型のMOBを追加する。 ソースコード AluminiumMod.java +長いので囲みます package tutorial.aluminiummod; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EnumCreatureType; import net.minecraft.item.Item; import net.minecraft.world.biome.BiomeGenBase; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @Mod(modid = "AluminiumMod", name = "Aluminium Mod", version = "1.0.0") public class AluminiumMod { //追加するアイテムの宣言 public static Item aluminiumEgg; @EventHandler public void perInit(FMLPreInitializationEvent event) { //Itemのインスタンスを生成し、代入する aluminiumEgg = new ItemAluminiumEgg() //クリエイティブタブの登録 .setCreativeTab(CreativeTabs.tabMaterials) //システム名の登録 .setUnlocalizedName("aluminiumEgg") //テクスチャ名の登録 .setTextureName("aluminiummod aluminiumEgg"); //GameRegistryへの登録 GameRegistry.registerItem(aluminiumEgg, "aluminiumEgg"); } @EventHandler public void init(FMLInitializationEvent event) { //Entityを登録する EntityRegistry.registerModEntity(EntityAluminiumCreeper.class, "AluminiumCreeper", 0, this, 250, 1, false); //Entityの自然スポーンを登録する EntityRegistry.addSpawn(EntityAluminiumCreeper.class, 20, 1, 4, EnumCreatureType.creature, BiomeGenBase.plains); /*EntityのRenderを登録する *Client側でのみ登録するため、今回はif文で処理をする。*/ if(FMLCommonHandler.instance().getSide() == Side.CLIENT) { this.render(); } } @SideOnly(Side.CLIENT) public void render() { RenderingRegistry.registerEntityRenderingHandler(EntityAluminiumCreeper.class, new RenderAluminiumCreeper()); } } EntityAluminiumCreeper.java +長いので囲みます package tutorial.aluminiummod; import net.minecraft.block.material.Material; import net.minecraft.entity.EnumCreatureAttribute; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIAttackOnCollide; import net.minecraft.entity.ai.EntityAIAvoidEntity; import net.minecraft.entity.ai.EntityAIHurtByTarget; import net.minecraft.entity.ai.EntityAILookIdle; import net.minecraft.entity.ai.EntityAINearestAttackableTarget; import net.minecraft.entity.ai.EntityAISwimming; import net.minecraft.entity.ai.EntityAIWander; import net.minecraft.entity.ai.EntityAIWatchClosest; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.passive.EntityOcelot; import net.minecraft.entity.passive.EntityPig; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.stats.AchievementList; import net.minecraft.util.ChatComponentText; import net.minecraft.util.DamageSource; import net.minecraft.world.World; public class EntityAluminiumCreeper extends EntityMob { public EntityAluminiumCreeper(World world) { super(world); /*EntiyのAIを登録する*/ this.tasks.addTask(1, new EntityAISwimming(this)); this.tasks.addTask(2, new EntityAIAttackOnCollide(this, EntityPig.class, 1.0D, false)); this.tasks.addTask(2, new EntityAIAvoidEntity(this, EntityOcelot.class, 6.0F, 1.0D, 1.2D)); this.tasks.addTask(3, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); this.tasks.addTask(4, new EntityAIWander(this, 0.8D)); this.tasks.addTask(5, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); this.tasks.addTask(6, new EntityAILookIdle(this)); this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityPig.class, 1,false)); this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 1, true)); this.targetTasks.addTask(2, new EntityAIHurtByTarget(this, false)); } /**MOBの速度やHPを変更するメソッド*/ @Override protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.5D); this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(128D); this.getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setBaseValue(100D); this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(1.5D); } /**MOBの属性を返すメソッド*/ @Override public EnumCreatureAttribute getCreatureAttribute() { return EnumCreatureAttribute.UNDEFINED; } /**MOBのドロップアイテムを返すメソッド*/ @Override public Item getDropItem() { return Item.getItemFromBlock(Blocks.wool) ; } /**MOBのドロップアイテムをドロップさせるメソッド*/ @Override protected void dropFewItems(boolean isCanDropRare, int fortuneLv){ Item item = this.getDropItem(); int amount = 1; if(isCanDropRare this.rand.nextBoolean()) { item = Item.getItemFromBlock(Blocks.stained_glass); } if(fortuneLv 0) { amount += fortuneLv; } int damage = this.rand.nextInt(16); for(int i = 0; i amount; i++) { this.entityDropItem(new ItemStack(item, amount, damage), 0.0F); } } /**Tickごとに呼ばれるメソッド*/ @Override public void onUpdate() { int x = (int) this.posX; int y = (int) this.posY; int z = (int) this.posZ; if(this.worldObj.getBlock(x, y - 1, z).getMaterial() == Material.iron) { this.worldObj.createExplosion(this, x, y, z, 3F, true); } super.onUpdate(); } /**MOB死亡時に呼ばれるメソッド*/ public void onDeath(DamageSource source) { super.onDeath(source); if(source.getSourceOfDamage() != null source.getSourceOfDamage() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) source.getSourceOfDamage(); if(!this.worldObj.isRemote) { player.addChatMessage(new ChatComponentText("You slayed.")); player.triggerAchievement(AchievementList.mineWood); } } } /**ダメージを食らうか否かを判定するメソッド*/ @Override public boolean attackEntityFrom(DamageSource source, float damage) { if(source.isExplosion()) { return false; } else if(source.isFireDamage()) { return super.attackEntityFrom(source, damage * 2); } else { return super.attackEntityFrom(source, damage); } } } RenderAluminiumCreeper.java +長いので囲みます package tutorial.aluminiummod; import net.minecraft.client.renderer.entity.RenderLiving; import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; public class RenderAluminiumCreeper extends RenderLiving { public RenderAluminiumCreeper() { super(new ModelAluminiumCreeper() , 0.5F); } /**テクスチャを登録するメソッド*/ @Override protected ResourceLocation getEntityTexture(Entity entity) { return new ResourceLocation("aluminiummod textures/mobs/aluminium_creeper.png"); } } ModelAluminiumCreeper.java +長いので囲みます package tutorial.aluminiummod; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; import net.minecraft.entity.Entity; import net.minecraft.util.MathHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class ModelAluminiumCreeper extends ModelBase { public ModelRenderer head; public ModelRenderer head2; public ModelRenderer body; public ModelRenderer leg1; public ModelRenderer leg2; public ModelRenderer leg3; public ModelRenderer leg4; public ModelAluminiumCreeper() { this(0.0F); } /**Modelを登録するメソッド*/ public ModelAluminiumCreeper(float size) { byte b0 = 4; this.head = new ModelRenderer(this, 0, 0); this.head.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, size); this.head.setRotationPoint(0.0F, (float)b0, 0.0F); this.head2 = new ModelRenderer(this, 32, 0); this.head2.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, size + 0.5F); this.head2.setRotationPoint(0.0F, (float)b0, 0.0F); this.body = new ModelRenderer(this, 16, 16); this.body.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, size); this.body.setRotationPoint(0.0F, (float)b0, 0.0F); this.leg1 = new ModelRenderer(this, 0, 16); this.leg1.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, size); this.leg1.setRotationPoint(-2.0F, (float)(12 + b0), 4.0F); this.leg2 = new ModelRenderer(this, 0, 16); this.leg2.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, size); this.leg2.setRotationPoint(2.0F, (float)(12 + b0), 4.0F); this.leg3 = new ModelRenderer(this, 0, 16); this.leg3.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, size); this.leg3.setRotationPoint(-2.0F, (float)(12 + b0), -4.0F); this.leg4 = new ModelRenderer(this, 0, 16); this.leg4.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, size); this.leg4.setRotationPoint(2.0F, (float)(12 + b0), -4.0F); } /**Modelをレンダリングするメソッド*/ public void render(Entity entity, float f1, float f2, float f3, float yaw, float pitch, float size) { this.setRotationAngles(f1, f2, f3, yaw, pitch, size, entity); this.head.render(size); this.body.render(size); this.leg1.render(size); this.leg2.render(size); this.leg3.render(size); this.leg4.render(size); } /**頭、足、腕などの角度を設定するメソッド*/ public void setRotationAngles(float f1, float f2, float f3, float yaw, float pitch, float size, Entity entity) { this.head.rotateAngleY = yaw / (180F / (float)Math.PI); this.head.rotateAngleX = pitch / (180F / (float)Math.PI); this.leg1.rotateAngleX = MathHelper.cos(f1 * 0.6662F) * 1.4F * f2; this.leg2.rotateAngleX = MathHelper.cos(f1 * 0.6662F + (float)Math.PI) * 1.4F * f2; this.leg3.rotateAngleX = MathHelper.cos(f1 * 0.6662F + (float)Math.PI) * 1.4F * f2; this.leg4.rotateAngleX = MathHelper.cos(f1 * 0.6662F) * 1.4F * f2; } } ItemAluminiumEgg.java +長いので囲みます package tutorial.aluminiummod; import net.minecraft.block.Block; import net.minecraft.block.BlockLiquid; import net.minecraft.entity.Entity; import net.minecraft.entity.IEntityLivingData; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.Facing; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; /**このクラスは、net.minecraft.Item.ItemMonsterPlacerをもとに作成しています。*/ public class ItemAluminiumEgg extends Item { /**アイテムでブロックを右クリックしたのメソッド。ItemMonsterPlacer参照。*/ @Override public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float posX, float posY, float posZ) { //サーバー側の場合は処理をスキップする if (world.isRemote) { return true; } else { Block block = world.getBlock(x, y, z); x += Facing.offsetsXForSide[side]; y += Facing.offsetsYForSide[side]; z += Facing.offsetsZForSide[side]; double height = 0.0D; if (side == 1 block.getRenderType() == 11) { height = 0.5D; } Entity entity = spawnEntity(world, (double)x + 0.5D, (double)y + height, (double)z + 0.5D); if (entity != null) { if (!player.capabilities.isCreativeMode) { --itemStack.stackSize; } } return true; } } /**アイテムを使ったときのメソッド。ItemMonsterPlacer参照。*/ @Override public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) { //サーバー側の場合は処理をスキップする if (world.isRemote) { return itemStack; } else { MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); if (movingobjectposition == null) { return itemStack; } else { if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { int x = movingobjectposition.blockX; int y = movingobjectposition.blockY; int z = movingobjectposition.blockZ; if (!world.canMineBlock(player, x, y, z)) { return itemStack; } if (!player.canPlayerEdit(x, y, z, movingobjectposition.sideHit, itemStack)) { return itemStack; } if (world.getBlock(x, y, z) instanceof BlockLiquid) { Entity entity = spawnEntity(world, (double)x, (double)y, (double)z); if (entity != null) { if (!player.capabilities.isCreativeMode) { --itemStack.stackSize; } } } } return itemStack; } } } /**Mobをスポーンさせるメソッド*/ public Entity spawnEntity(World world, double x, double y, double z) { EntityAluminiumCreeper entityliving = new EntityAluminiumCreeper(world); entityliving.setLocationAndAngles(x, y, z, MathHelper.wrapAngleTo180_float(world.rand.nextFloat() * 360.0F), 0.0F); entityliving.rotationYawHead = entityliving.rotationYaw; entityliving.renderYawOffset = entityliving.rotationYaw; entityliving.onSpawnWithEgg((IEntityLivingData)null); world.spawnEntityInWorld(entityliving); entityliving.playLivingSound(); return entityliving; } } 解説 AluminiumMod +長いので囲みます void registerModEntity(Class ? extends Entity entityClass, String entityName, int id, Object mod, int trackingRange, int updateFrequency, boolean sendsVelocityUpdates) Mod用のMOBを追加するメソッド。 引数は、以下の通り。 引数 内容 entityClass 追加するEntityをClass型で渡す。 entityName 追加するEntityの名称。langファイルで、entity.[MODIDで登録した名称].[entityNameで登録した名称].name=[ローカル名]でローカル名を登録できる。 id 追加するEntityのID。同一MOD内で被るとエラーを吐く。 mod MODを渡す。thisで渡せばOK。 trackingRange MOBの更新範囲。 updateFrequency MOBの更新頻度。何tickごとにMOBを更新するかの値。基本的に2以下の値を渡す。 sendsVelocityUpdates MOBの更新時に加速度の情報を更新させるか否か。MOBや動物の場合は基本的にtrueを渡す。 void addSpawn(Class ? extends EntityLiving entityClass, int weightedProb, int min, int max, EnumCreatureType typeOfCreature, BiomeGenBase... biomes) Entityの自然スポーンを追加するメソッド。 引数は、以下の通り。 引数 内容 entityClass スポーンを追加させるEntityをClass型で渡す。 weightProb Entityのスポーンがどれくらいの頻度で抽選されるかの値。値が大きいほうがスポーンしやすい。 min Entityがスポーンする際の最低数。 max Entityがスポーンする際の最高数。 typeOfCreature Entityのスポーンタイプ。EnumCreatureType一覧-monster...敵性MOBの属性。夜にスポーンする。-creature...友好MOB(とオオカミ、ヤマネコ)の属性。昼にスポーンする。-ambient...コウモリの属性。-waterCreature...イカの属性。これのみ、スポーン場所が空気中でなく水中になる。 biomes Entityがスポーンするバイオーム。複数バイオームを渡す場合は、先にfinal定数でリストを作ってからそのリストをそのまま引数に渡した方がいい。 void registerEntityRenderingHandler(Class ? extends Entity entityClass, Render renderer) Entityのレンダーを追加するメソッド。 Client限定の処理であり、Serverで処理してしまうとクラッシュの原因になるため、必ずif文とSideOnlyアノテーションを付けたメソッドで処理をする。 もしくは、proxyで分化させる手もある。 第一引数には登録EntityをClass型で、第二引数は登録Renderをインスタンス型で渡す。 EntityAluminiumCreeper +長いので囲みます tasks.addTask(int p_75776_1_, EntityAIBase p_75776_2_) Entityに攻撃、移動AIを追加するメソッド。 ターゲットAIは後述のtargetTasks.addTaskを用いる。 第一引数はAIの順位(小さいほうが先に行動される。)、第二引数がAI。 主なAI EntityAISwimming(EntityLiving p_i1624_1_) 水を泳ぐAI。 第一引数にはthisを渡す。 EntityAIAttackOnCollide(EntityCreature p_i1635_1_, Class p_i1635_2_, double p_i1635_3_, boolean p_i1635_5_) 特定のEntityを襲うAI。 第一引数にはthis、第二引数には襲う対象のEntityをクラス型で、第三引数には自分の通常移動速度に対する倍率、第四引数には追い続けるか否かの判定を渡す。 第三引数が1より大きいと、通常の移動スピードより高速で襲ってくることになる。 EntityAIAvoidEntity(EntityCreature p_i1616_1_, Class p_i1616_2_, float p_i1616_3_, double p_i1616_4_, double p_i1616_6_) 特定のEntityから逃げるAI。 第一引数にはthis、第二引数には逃げる対象のEntityをクラス型で、第三引数には対象からどれだけ逃げるかの距離、第四引数には対象と十分離れたときの逃げる速度の倍率、第五引数には対象と近いときの逃げる速度の倍率を渡す。 第四引数 第五引数となれば、対象と近いときはより急いで逃げるようになる。 EntityAIWander(EntityCreature p_i1648_1_, double p_i1648_2_) うろうろするAI。 第一引数にはthis、第二引数には速度の倍率を渡す。 第二引数は、基本的に1より小さい値を渡す。 EntityAIWatchClosest(EntityLiving p_i1631_1_, Class p_i1631_2_, float p_i1631_3_) 特定のEntityを睨むAI。 第一引数にはthis、第二引数には睨む対象のEntityをクラス型で、第三引数は対象との距離を渡す。 第三引数が大きいと、対象が離れていても視認する。 EntityAILookIdle(EntityLiving p_i1647_1_) きょろきょろするAI。thisを渡す。 targetTasks.addTask(int p_75776_1_, EntityAIBase p_75776_2_) EntityにターゲットAIを追加するメソッド。 第一引数はAIの順位(小さいほうが先に行動される。)、第二引数がAI。 主なAI EntityAINearestAttackableTarget(EntityCreature p_i1663_1_, Class p_i1663_2_, int p_i1663_3_, boolean p_i1663_4_) 特定のEntityをターゲッティングするAI。 第一引数にはthis、第二引数には対象のEntityをクラス型で、第三引数には行動しない確率(0だと攻撃できる場所に入れば必ずターゲッティングされる)、第四引数にはブロックに囲まれていてもターゲッティングするか否かを渡す。 第四引数をtrueにすると、ゾンビのように対象がブロックに囲まれていても、視認できれば攻撃しようとする。 EntityAIHurtByTarget(EntityCreature p_i1660_1_, boolean p_i1660_2_) 攻撃したEntityに反撃するAI。 第一引数にはthis、第二引数には反撃する際周囲の同種のEntityに助けを求めるか否かを渡す。 第二引数をtrueにすると、第一引数のEntityを攻撃したEntityは、第一引数と同種の周囲のEntityにも狙われる。ゾンビやゾンビピッグマンのような行動をする。 EntityLivingBase.getEntityAttribute(IAttribute p_110148_1_).setBaseValue(double p_111128_1_) Entityに対してHPやスピード等の数値を追加するメソッド。 getEntityAttributeに追加する数値の種類、setBaseValueにその値を渡す。 引数一覧 すべてSharedMonsterAttributesのstatic定数である。 定数名 説明 既定値 movementSpeed 移動速度 0.7(ただし、バニラのMOBは基本的に0.25) followRange 追跡距離 32 knockbackResistance ノックバック耐性 0 maxHealth 体力 20 RenderAluminiumCreeper ResourceLocation(String p_i1293_1_) Entityなどでテクスチャを指定する際につかうコンストラクター。 "aluminiummod textures/mobs/aluminium_creeper.png"のように、ファイルと修飾子まで入れる必要がある。 また、テクスチャを実装する場合は、今回のものはモデルをクリーパーのものを流用したため、クリーパーのテクスチャをaluminiummod/mobs/に放り込んでaluminium_creeperと名前を付ければよい。 ItemAluminiumEgg spawnEntityInWorld(Entity p_72838_1_) Entityをワールドにスポーンさせるメソッド。 ただし、setLocationAndAnglesなどで先にスポーン位置を指定する必要がある。 Tips クリーパーに因んでEntityを光らせる方法と爆発を発生させる方法を説明する。 Entityを光らせる 以下のコードを追加する。 @SideOnly(Side.CLIENT) public int getBrightnessForRender(float p_70070_1_) { return 15728880; } public float getBrightness(float p_70013_1_) { return 50.0F; } getBrightnessForRenderが描画側、getBrightnessが計算側に明るさを渡す。数値はこれらが最大値である。 爆発を発生させる 爆発を発生させる方法は二種類ある。どちらもWorldクラスに属する。 createExplosion(Entity entity, double x, double y, double z, float power, boolean destroyBlocks) 引数は発生Entity(このEntityは爆発によるダメージ、処理から除外されることになる)、座標(double三つ)、威力(大体土ブロックでの爆発半径に等しい。威力15以上は何故か正方形状に削れてしまう上範囲がほぼ広がらないため別処理の実装が望ましい。匠CraftのEntityGiantCreeper参照。)、ブロックを破壊するか否か、となっている。 newExplosion(Entity entity, double x, double y, double z, float power, boolean destroyBlocks, boolean spreadFire) 最終引数以外上記と一緒。最終引数は炎を撒き散らすかどうか。ファイアボールのような処理にしか使わない。なお、上のcreateExplosionはこの関数にfalseを渡しているだけである。 また、この二つの関数はExplosion型を返すため、イベントの追加にある爆発のフック処理をこの爆発限定で行うことも出来る。 コメント この項目に関する質問などをどうぞ。 EntityAluminiumCreeperの解説のEntityLivingBase.getEntityAttributeの下にあるmaxHealth|体力|20|がミスってますよ - 名無しさん 2016-02-02 19 49 20 ご指摘ありがとうございます。修正いたしました。 - Tom Kate 2016-02-02 20 28 33 AluminiumModの解説の(Class ? extends Entity entityClass, String entityName, int id, Object mod, int trackingRange, int updateFrequency, boolean sendsVelocityUpdates)のObject modをthisを使わないで処理しようと思ったら何を入れればいいですか? - west_village 2016-08-08 21 53 19 public static final AluminumMod instance = new AluminumMod();のように、インスタンスを作ってインスタンスを引数に渡してください。 - Tom Kate 2016-08-08 22 37 24 匠Craftの光匠やグロウストーン匠のように、光るMOBを作る方法はありますか?(実際は光っていないのかもしれないのか…?) - あるふぁ 2017-05-30 19 48 05 追記いたします。ご確認ください。 - Tom Kate 2017-06-01 19 39 57 たびたびすみません。プレイヤーなど既存のMOBを光らせる方法はありますか? - あるふぁ 2017-06-01 20 53 42 返信遅くなりまして申し訳ありません。こちらのチュートリアルにTipsとして追記しました。 - Tom Kate 2017-06-07 19 27 42 追記できておりません。Tom氏が多忙のようですので、もうしばらくお時間いただくことになりそうです。申し訳ありません。 - 赤砂蛇凪浜 2017-06-16 18 11 48 名前