約 1,084,368 件
https://w.atwiki.jp/akasi3/pages/449.html
#blognavi TonyuBBSで話題に上がった 「一つのオブジェクドにforを使わせ・・・」 ということにヒントを得て、 Tonyuの動作を軽量化するライブラリを作ってみました。 思った以上の軽量化に成功。 以下にその詳細を記します。 以下、プログラムに興味がない人にとっては 面白くもなんともない話が続きます。 - - Tonyuでは(Tonyuに限らないが)、 「全てのオブジェクトを調べる」という処理がよくある。 例えば、シューティングで敵が弾に当たっているかどうか、 アクションで、自キャラが敵に当たっているかどうか。 で、そんなよく使う処理が実はとても重い。 例えば弾幕系シューティングなんかでは、 オブジェクト(弾やキャラクタ)の数は100を平気で超えるが、 その全てが「全てのオブジェクトを調べる」という処理を行った場合、 単純計算で”100×100=10000”という膨大な処理量になる。 (当然ながらオブジェクトが増えれば増えるほど処理は多くなる) そして、Tonyuの処理速度はそれほど速くないため、 その様な処理を行うゲームを作るのは困難。 で、少し前にTonyuサイトのBBSにも似た話題が挙がっていて、 その中の、 「一つのオブジェクドにforを使わせ・・・」と、 「#先日話題に上った『マップ座標系でのオブジェクトの位置をあらかじめ求めておく』話とかも・・・」 という言葉でピンときた。 「予め、ある程度近いオブジェクトだけでも分かれば、高速に処理できる」 ”ある程度近いオブジェクト”を高速に求める方法はある。 それは、画面座標に対応した2次元配列を使う方法。 例えば、先ず座標の0~9は配列の0番、座標10~19は配列の1番、というように対応付ける。 そして、各オブジェクトを配列の対応する位置に格納する。 そうして、全オブジェクトを格納すると、 近い位置にあるオブジェクト同士は配列内で近い位置に格納されている という仕組み。 (これは以前ミスティックロンドの高速化に使用した手法と似ている) (人間ならぱっと見で分かるものでも、コンピュータにはここまでしないと分からない。難儀な) そうして、”ある程度近いオブジェクト”を求めたら後は簡単。 近い場所にいるオブジェクトを配列から取得し、 その中から、必要な処理(衝突判定等)を行えばいい。 こうして軽量化が完了する。 ただ、途中省略したが、 この手法は「”ある程度近いオブジェクト”に対する処理(ex.衝突判定)」にしか使用できない。 つまり、「”遠距離にいるオブジェクト”にも行う必要がある処理(ex.誘導弾)」には使えない。 これは大きな問題。 もっと上手い方法を御存知の方、 ありましたら御一報を。 - - - - せっかくなので、簡単な軽量化手法を一つ紹介。 全てのオブジェクトを調べる必要がある処理(接触判定等)の多くは、 実はその処理を毎フレーム行う必要はない。 数フレームに一度実行するだけで十分。 案外知らない人も多いのでは。 自分が上で懸命に作ったライブラリを使うより、 この手法の方が、圧倒的に手軽で確実。 お勧め。 カテゴリ [ゲーム制作] - trackback() - 2006年09月05日 11 53 41 し、知らなかった。為になります。 -- 少佐 (2006-09-05 23 28 15) 名前 コメント #blognavi
https://w.atwiki.jp/mozuk68/pages/23.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で実装予定のオファレン草。 ただし、作物はオファレンの欠片で、成長段階数、成長判定、骨粉判定などは小麦と異なる予定。 コメント この項目に関する質問などをどうぞ。 名前
https://w.atwiki.jp/akasatanahama/pages/103.html
概要 新しく苗木・原木・葉を追加し、苗木が育ったら木が生成されるようにする。 今回は一つのIDで一種類の木しか追加していないが、バニラの木のようにメタデータを利用して何種類かの木を追加することも可能。 ※5/22更新 葉のテクスチャの指定ができていなかったため、追記・修正しました。 テクスチャは、sapling_aluminium,log_aluminium_top,log_aluminium_side,leaves_aluminium,leaves_aluminium_opaqueでそれぞれ指定できます。 ソースコード 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.minecraftforge.oredict.OreDictionary; @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 Block saplingAluminium; public static Block logAluminium; public static Block leavesAluminium; @EventHandler public void perInit(FMLPreInitializationEvent event) { saplingAluminium = new BlockAluminiumSapling() .setBlockName("saplingAluminium") .setBlockTextureName("aluminiummod sapling_aluminium"); GameRegistry.registerBlock(saplingAluminium, "saplingAluminium"); OreDictionary.registerOre("saplingAluminium", saplingAluminium); logAluminium = new BlockAluminiumLog() .setBlockName("logAluminium") .setBlockTextureName("aluminiummod log_aluminium"); GameRegistry.registerBlock(logAluminium, "logAluminium"); OreDictionary.registerOre("logAluminium", logAluminium); leavesAluminium = new BlockAluminiumLeaves() .setBlockName("leavesAluminium") .setBlockTextureName("aluminiummod leaves_aluminium"); GameRegistry.registerBlock(leavesAluminium, ItemAluminiumLeaves.class, "leavesAluminium"); OreDictionary.registerOre("leavesAluminium", leavesAluminium); } } BlockAluminiumSapling.java +長いので囲みます package tutorial.aluminiummod; import static net.minecraftforge.common.EnumPlantType.*; import java.util.List; import java.util.Random; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockSapling; import net.minecraft.block.IGrowable; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; 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.world.IBlockAccess; import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenerator; import net.minecraftforge.common.EnumPlantType; import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.event.terraingen.TerrainGen; public class BlockAluminiumSapling extends BlockSapling implements IPlantable, IGrowable { public BlockAluminiumSapling() { super(); this.setCreativeTab(CreativeTabs.tabDecorations); this.setTickRandomly(true); this.setHardness(0F); this.setStepSound(soundTypeGrass); float f = 0.4F; this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f); } @Override public boolean canPlaceBlockAt(World world, int x, int y, int z) { // Blockで上書き可能なブロックかどうかの判定をしているが、BlockBushでcanBlockStayの判定を追加している。 return world.getBlock(x, y, z).isReplaceable(world, x, y, z) this.canBlockStay(world, x, y, z); } @Override protected boolean canPlaceBlockOn(Block block) { // 草、土、耕された土ならtrueを返す。 return block == Blocks.grass || block == Blocks.dirt || block == Blocks.farmland; } @Override public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { this.checkAndDropBlock(world, x, y, z); } @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.setBlockToAir(x, y, z); } } @Override public boolean canBlockStay(World world, int x, int y, int z) { // 下のブロックのcanSustainPlantで判定している。 return world.getBlock(x, y - 1, z).canSustainPlant(world, x, y - 1, z, ForgeDirection.UP, this); } @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { // 当たり判定を消すため、nullを返している。 return null; } @Override public boolean isOpaqueCube() { return false; } @Override public boolean renderAsNormalBlock() { return false; } @Override public int getRenderType() { return 1; } @Override public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) { return Plains; } @Override public Block getPlant(IBlockAccess world, int x, int y, int z) { return this; } @Override public int getPlantMetadata(IBlockAccess world, int x, int y, int z) { return world.getBlockMetadata(x, y, z); } @Override public void updateTick(World world, int x, int y, int z, Random random) { // サーバー側で、checkAndDropBlock・明るさの判定を行い、条件を満たしていれば1/7の確率で成長する。 if (!world.isRemote) { this.checkAndDropBlock(world, x, y, z); if (world.getBlockLightValue(x, y + 1, z) = 9 random.nextInt(7) == 0) { this.func_149879_c(world, x, y, z, random); } } } @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { // Blockと同様。 return blockIcon; } @Override public void func_149879_c(World world, int x, int y, int z, Random random) { // 一度も成長していないなら一段階成長させ、二段階目なら木を生成する。 // 一段階目の成長が終わったかどうかは、メタデータの二進数四桁目で判断する。 int meta = world.getBlockMetadata(x, y, z); if ((meta 8) == 0) { world.setBlockMetadataWithNotify(x, y, z, meta | 8, 4); } else { this.func_149878_d(world, x, y, z, random); } } @Override public void func_149878_d(World world, int x, int y, int z, Random random) { // Eventを呼び出しているが、他MODでキャンセルされたくなければこの部分は削除してよい。 if (!TerrainGen.saplingGrowTree(world, random, x, y, z)) return; // メタデータを利用して複数種類の木を追加したい場合はバニラの苗木を参考にするとよい。 int meta = 0; // 大木を生成したい場合はこの部分を参考にするとよい。 // Object object = random.nextInt(10) == 0 ? new WorldGenBigTree(true) new WorldGenTrees(true); Object object = new WorldGenAluminiumTrees(true); world.setBlock(x, y, z, Blocks.air, 0, 4); if (!((WorldGenerator) object).generate(world, random, x, y, z)) { world.setBlock(x, y, z, this, meta, 4); } } @Override public boolean func_149880_a(World world, int x, int y, int z, int type) { return world.getBlock(x, y, z) == this (world.getBlockMetadata(x, y, z) 7) == type; } @Override public int damageDropped(int meta) { // Blockと同様。 return 0; } @Override @SideOnly(Side.CLIENT) public void getSubBlocks(Item item, CreativeTabs tab, List list) { // Blockと同様。 list.add(new ItemStack(item, 1, 0)); } @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister register) { // Blockと同様。 blockIcon = register.registerIcon(this.getTextureName()); } @Override public boolean func_149851_a(World world, int x, int y, int z, boolean isRemote) { return true; } @Override public boolean func_149852_a(World world, Random random, int x, int y, int z) { return world.rand.nextFloat() 0.45D; } @Override public void func_149853_b(World world, Random random, int x, int y, int z) { this.func_149879_c(world, x, y, z, random); } } WorldGenAluminiumTrees.java +長いので囲みます package tutorial.aluminiummod; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockSapling; import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; import net.minecraft.util.Direction; import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenAbstractTree; import net.minecraftforge.common.util.ForgeDirection; public class WorldGenAluminiumTrees extends WorldGenAbstractTree { private final int minTreeHeight; private final boolean vinesGrow; private final int metaWood; private final int metaLeaves; public WorldGenAluminiumTrees(boolean doBlockNotify) { this(doBlockNotify, 4, 0, 0, false); } public WorldGenAluminiumTrees(boolean doBlockNotify, int minTreeHeight, int metaWood, int metaLeaves, boolean vinesGrow) { super(doBlockNotify); this.minTreeHeight = minTreeHeight; this.metaWood = metaWood; this.metaLeaves = metaLeaves; this.vinesGrow = vinesGrow; } @Override public boolean generate(World world, Random random, int x, int y, int z) { int l = random.nextInt(3) + minTreeHeight; if (y 1 || y + l + 1 256) return false; byte b0; int k1; Block block; for (int iy = y; iy = y + 1 + l; ++iy) { b0 = 1; if (iy == y) { b0 = 0; } if (iy = y + 1 + l - 2) { b0 = 2; } for (int ix = x - b0; ix = x + b0; ++ix) { for (int iz = z - b0; iz = z + b0; ++iz) { if (iy 0 || iy = 256) return false; block = world.getBlock(ix, iy, iz); if (!this.isReplaceable(world, ix, iy, iz)) return false; } } } Block block2 = world.getBlock(x, y - 1, z); boolean isSoil = block2.canSustainPlant(world, x, y - 1, z, ForgeDirection.UP, (BlockSapling) AluminiumMod.saplingAluminium); if (!isSoil || y = 256 - l - 1) return false; block2.onPlantGrow(world, x, y - 1, z, x, y, z); b0 = 3; byte b1 = 0; int l1; int i2; int j2; int i3; for (k1 = y - b0 + l; k1 = y + l; ++k1) { i3 = k1 - (y + l); l1 = b1 + 1 - i3 / 2; for (i2 = x - l1; i2 = x + l1; ++i2) { j2 = i2 - x; for (int k2 = z - l1; k2 = z + l1; ++k2) { int l2 = k2 - z; if (Math.abs(j2) != l1 || Math.abs(l2) != l1 || random.nextInt(2) != 0 i3 != 0) { Block block1 = world.getBlock(i2, k1, k2); if (block1.isAir(world, i2, k1, k2) || block1.isLeaves(world, i2, k1, k2)) { this.setBlockAndNotifyAdequately(world, i2, k1, k2, AluminiumMod.leavesAluminium, metaLeaves); } } } } } for (k1 = 0; k1 l; ++k1) { block = world.getBlock(x, y + k1, z); if (block.isAir(world, x, y + k1, z) || block.isLeaves(world, x, y + k1, z)) { setBlockAndNotifyAdequately(world, x, y + k1, z, AluminiumMod.logAluminium, metaWood); if (vinesGrow k1 0) { if (random.nextInt(3) 0 world.isAirBlock(x - 1, y + k1, z)) { this.setBlockAndNotifyAdequately(world, x - 1, y + k1, z, Blocks.vine, 8); } if (random.nextInt(3) 0 world.isAirBlock(x + 1, y + k1, z)) { this.setBlockAndNotifyAdequately(world, x + 1, y + k1, z, Blocks.vine, 2); } if (random.nextInt(3) 0 world.isAirBlock(x, y + k1, z - 1)) { this.setBlockAndNotifyAdequately(world, x, y + k1, z - 1, Blocks.vine, 1); } if (random.nextInt(3) 0 world.isAirBlock(x, y + k1, z + 1)) { this.setBlockAndNotifyAdequately(world, x, y + k1, z + 1, Blocks.vine, 4); } } } } if (vinesGrow) { for (k1 = y - 3 + l; k1 = y + l; ++k1) { i3 = k1 - (y + l); l1 = 2 - i3 / 2; for (i2 = x - l1; i2 = x + l1; ++i2) { for (j2 = z - l1; j2 = z + l1; ++j2) { if (world.getBlock(i2, k1, j2).isLeaves(world, i2, k1, j2)) { if (random.nextInt(4) == 0 world.getBlock(i2 - 1, k1, j2).isAir(world, i2 - 1, k1, j2)) { this.growVines(world, i2 - 1, k1, j2, 8); } if (random.nextInt(4) == 0 world.getBlock(i2 + 1, k1, j2).isAir(world, i2 + 1, k1, j2)) { this.growVines(world, i2 + 1, k1, j2, 2); } if (random.nextInt(4) == 0 world.getBlock(i2, k1, j2 - 1).isAir(world, i2, k1, j2 - 1)) { this.growVines(world, i2, k1, j2 - 1, 1); } if (random.nextInt(4) == 0 world.getBlock(i2, k1, j2 + 1).isAir(world, i2, k1, j2 + 1)) { this.growVines(world, i2, k1, j2 + 1, 4); } } } } } if (random.nextInt(5) == 0 l 5) { for (k1 = 0; k1 2; ++k1) { for (i3 = 0; i3 4; ++i3) { if (random.nextInt(4 - k1) == 0) { l1 = random.nextInt(3); this.setBlockAndNotifyAdequately(world, x + Direction.offsetX[Direction.rotateOpposite[i3]], y + l - 5 + k1, z + Direction.offsetZ[Direction.rotateOpposite[i3]], Blocks.cocoa, l1 2 | i3); } } } } } return true; } @Override protected boolean isReplaceable(World world, int x, int y, int z) { Block block = world.getBlock(x, y, z); return block.isAir(world, x, y, z) || block.isLeaves(world, x, y, z) || block.isWood(world, x, y, z) || this.func_150523_a(block); } @Override protected boolean func_150523_a(Block block) { return block.getMaterial() == Material.air || block.getMaterial() == Material.leaves || block == Blocks.grass || block == Blocks.dirt || block == Blocks.log || block == Blocks.log2 || block == Blocks.sapling || block == Blocks.vine; } private void growVines(World world, int x, int y, int z, int length) { this.setBlockAndNotifyAdequately(world, x, y, z, Blocks.vine, length); int i1 = 4; while (true) { --y; if (!world.getBlock(x, y, z).isAir(world, x, y, z) || i1 = 0) { return; } this.setBlockAndNotifyAdequately(world, x, y, z, Blocks.vine, length); --i1; } } } BlockAluminiumLog.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.BlockLog; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public class BlockAluminiumLog extends BlockLog { private IIcon[] iicon = new IIcon[2]; public BlockAluminiumLog() { super(); this.setCreativeTab(CreativeTabs.tabBlock); this.setHardness(2.0F); this.setStepSound(soundTypeWood); } @Override public int getRenderType() { return 31; } @Override public int onBlockPlaced(World world, int x, int y, int z, int side, float posX, float posY, float posZ, int meta) { // 設置された方向に応じてメタデータを設定する。 int metaType = meta 3; byte direction = 0; switch (side) { case 0 case 1 direction = 0; break; case 2 case 3 direction = 8; break; case 4 case 5 direction = 4; } return metaType | direction; } @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { int k = meta 12; int l = meta 3; return k == 0 (side == 1 || side == 0) ? this.getTopIcon(l) (k == 4 (side == 5 || side == 4) ? this.getTopIcon(l) (k == 8 (side == 2 || side == 3) ? this.getTopIcon(l) this.getSideIcon(l))); } @Override public int damageDropped(int meta) { return meta 3; } @Override @SideOnly(Side.CLIENT) protected IIcon getSideIcon(int meta) { return this.iicon[1]; } @Override @SideOnly(Side.CLIENT) protected IIcon getTopIcon(int meta) { return this.iicon[0]; } @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iicon) { this.iicon[0] = iicon.registerIcon(this.getTextureName() + "_top"); this.iicon[1] = iicon.registerIcon(this.getTextureName() + "_side"); } @Override protected ItemStack createStackedBlock(int meta) { return new ItemStack(Item.getItemFromBlock(this), 1, meta 3); } @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { // 周囲の葉ブロックの消滅を始める。 byte b0 = 4; int i1 = b0 + 1; if (!world.checkChunksExist(x - i1, y - i1, z - i1, x + i1, y + i1, z + i1)) return; for (int ix = -b0; ix = b0; ++ix) { for (int iy = -b0; iy = b0; ++iy) { for (int iz = -b0; iz = b0; ++iz) { Block block1 = world.getBlock(x + ix, y + iy, z + iz); if (block1.isLeaves(world, x + ix, y + iy, z + iz)) { block1.beginLeavesDecay(world, x + ix, y + iy, z + iz); } } } } } @Override public boolean canSustainLeaves(IBlockAccess world, int x, int y, int z) { return true; } @Override public boolean isWood(IBlockAccess world, int x, int y, int z) { return true; } } BlockAluminiumLeaves.java +長いので囲みます package tutorial.aluminiummod; import java.util.ArrayList; import java.util.Random; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockLeaves; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.ColorizerFoliage; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.IShearable; public class BlockAluminiumLeaves extends BlockLeaves implements IShearable { protected boolean isFancy; protected IIcon[] iicon = new IIcon[2]; int[] array; public BlockAluminiumLeaves() { super(); this.setTickRandomly(true); this.setCreativeTab(CreativeTabs.tabDecorations); this.setHardness(0.2F); this.setLightOpacity(1); this.setStepSound(soundTypeGrass); } @Override @SideOnly(Side.CLIENT) public int getBlockColor() { double d0 = 0.5D; double d1 = 1.0D; return ColorizerFoliage.getFoliageColor(d0, d1); } @Override @SideOnly(Side.CLIENT) public int getRenderColor(int color) { return ColorizerFoliage.getFoliageColorBasic(); } @Override @SideOnly(Side.CLIENT) public int colorMultiplier(IBlockAccess iBlockAccess, int x, int y, int z) { // バイオームの境目である程度スムーズになるよう、周囲9ブロックのバイオームから平均を求めている。 int ir = 0; int ig = 0; int ib = 0; for (int iz = -1; iz = 1; ++iz) { for (int ix = -1; ix = 1; ++ix) { int color = iBlockAccess.getBiomeGenForCoords(x + ix, z + iz).getBiomeFoliageColor(x + ix, y, z + iz); ir += (color 16711680) 16; ig += (color 65280) 8; ib += color 255; } } return (ir / 9 255) 16 | (ig / 9 255) 8 | ib / 9 255; } @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { // 周囲の葉ブロックの消滅を始める。 byte b0 = 1; int i1 = b0 + 1; if (world.checkChunksExist(x - i1, y - i1, z - i1, x + i1, y + i1, z + i1)) { for (int j1 = -b0; j1 = b0; ++j1) { for (int k1 = -b0; k1 = b0; ++k1) { for (int l1 = -b0; l1 = b0; ++l1) { Block block1 = world.getBlock(x + j1, y + k1, z + l1); if (block1.isLeaves(world, x + j1, y + k1, z + l1)) { block1.beginLeavesDecay(world, x + j1, y + k1, z + l1); } } } } } } @Override public void updateTick(World world, int x, int y, int z, Random random) { if (world.isRemote) return; int meta = world.getBlockMetadata(x, y, z); // メタデータの二進数四桁目が0(周囲で原木/葉が破壊されていない)か、 // 三桁目が0以外(プレイヤーに設置されたもの)なら消滅させない。 if ((meta 8) == 0 || (meta 4) != 0) return; // 周囲のブロックを調査し、葉の消滅を抑えるブロック(原木)がなければ消滅させる。 byte b4 = 4; int i5 = b4 + 1; byte b32 = 32; int i1024 = b32 * b32; int i16 = b32 / 2; if (array == null) { array = new int[b32 * b32 * b32]; } int l1; if (world.checkChunksExist(x - i5, y - i5, z - i5, x + i5, y + i5, z + i5)) { for (int ix = -b4; ix = b4; ++ix) { for (int iy = -b4; iy = b4; ++iy) { for (int iz = -b4; iz = b4; ++iz) { Block block = world.getBlock(x + ix, y + iy, z + iz); if (!block.canSustainLeaves(world, x + ix, y + iy, z + iz)) { if (block.isLeaves(world, x + ix, y + iy, z + iz)) { array[(ix + i16) * i1024 + (iy + i16) * b32 + iz + i16] = -2; } else { array[(ix + i16) * i1024 + (iy + i16) * b32 + iz + i16] = -1; } } else { array[(ix + i16) * i1024 + (iy + i16) * b32 + iz + i16] = 0; } } } } for (l1 = 1; l1 = 4; ++l1) { for (int ix = -b4; ix = b4; ++ix) { for (int iy = -b4; iy = b4; ++iy) { for (int iz = -b4; iz = b4; ++iz) { if (array[(ix + i16) * i1024 + (iy + i16) * b32 + iz + i16] == l1 - 1) { if (array[(ix + i16 - 1) * i1024 + (iy + i16) * b32 + iz + i16] == -2) { array[(ix + i16 - 1) * i1024 + (iy + i16) * b32 + iz + i16] = l1; } if (array[(ix + i16 + 1) * i1024 + (iy + i16) * b32 + iz + i16] == -2) { array[(ix + i16 + 1) * i1024 + (iy + i16) * b32 + iz + i16] = l1; } if (array[(ix + i16) * i1024 + (iy + i16 - 1) * b32 + iz + i16] == -2) { array[(ix + i16) * i1024 + (iy + i16 - 1) * b32 + iz + i16] = l1; } if (array[(ix + i16) * i1024 + (iy + i16 + 1) * b32 + iz + i16] == -2) { array[(ix + i16) * i1024 + (iy + i16 + 1) * b32 + iz + i16] = l1; } if (array[(ix + i16) * i1024 + (iy + i16) * b32 + (iz + i16 - 1)] == -2) { array[(ix + i16) * i1024 + (iy + i16) * b32 + (iz + i16 - 1)] = l1; } if (array[(ix + i16) * i1024 + (iy + i16) * b32 + iz + i16 + 1] == -2) { array[(ix + i16) * i1024 + (iy + i16) * b32 + iz + i16 + 1] = l1; } } } } } } } l1 = array[i16 * i1024 + i16 * b32 + i16]; if (l1 = 0) { world.setBlockMetadataWithNotify(x, y, z, meta 7, 4); } else { this.removeLeaves(world, x, y, z); } } @Override @SideOnly(Side.CLIENT) public void randomDisplayTick(World world, int x, int y, int z, Random random) { // 水を滴らせる? if (world.canLightningStrikeAt(x, y + 1, z) !World.doesBlockHaveSolidTopSurface(world, x, y - 1, z) random.nextInt(15) == 1) { double dx = x + random.nextFloat(); double dy = y - 0.05D; double dz = z + random.nextFloat(); world.spawnParticle("dripWater", dx, dy, dz, 0.0D, 0.0D, 0.0D); } } private void removeLeaves(World world, int x, int y, int z) { // ドロップさせ、空気ブロックに置き換える。 this.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); world.setBlockToAir(x, y, z); } @Override public int quantityDropped(Random random) { return random.nextInt(20) == 0 ? 1 0; } @Override public Item getItemDropped(int meta, Random random, int fortune) { return Item.getItemFromBlock(AluminiumMod.saplingAluminium); } @Override public void dropBlockAsItemWithChance(World world, int x, int y, int z, int meta, float chance, int par7) { super.dropBlockAsItemWithChance(world, x, y, z, meta, 1.0f, par7); } @Override protected void func_150124_c(World world, int x, int y, int z, int meta, int chance) {} @Override protected int func_150123_b(int meta) { return 20; } @Override public boolean isOpaqueCube() { return !isFancy; } @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { return iicon[isFancy ? 0 1]; } @Override @SideOnly(Side.CLIENT) public void setGraphicsLevel(boolean isFancy) { this.isFancy = isFancy; } @Override protected ItemStack createStackedBlock(int meta) { return new ItemStack(Item.getItemFromBlock(this), 1, 0); } @Override public String[] func_150125_e() { return null; } @Override @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockAccess iBlockAccess, int x, int y, int z, int side) { Block block = iBlockAccess.getBlock(x, y, z); // 処理優先で隣が同じブロックだったらfalse。 return !isFancy block == this ? false super.shouldSideBeRendered(iBlockAccess, x, y, z, side); } @Override public boolean isShearable(ItemStack item, IBlockAccess world, int x, int y, int z) { return true; } @Override public ArrayList ItemStack onSheared(ItemStack item, IBlockAccess world, int x, int y, int z, int fortune) { ArrayList ItemStack ret = new ArrayList ItemStack (); ret.add(new ItemStack(this, 1, world.getBlockMetadata(x, y, z) 3)); return ret; } @Override public void beginLeavesDecay(World world, int x, int y, int z) { int meta = world.getBlockMetadata(x, y, z); if ((meta 8) == 0) { world.setBlockMetadataWithNotify(x, y, z, meta | 8, 4); } world.setBlockMetadataWithNotify(x, y, z, world.getBlockMetadata(x, y, z) | 8, 4); } @Override public boolean isLeaves(IBlockAccess world, int x, int y, int z) { return true; } @Override public ArrayList ItemStack getDrops(World world, int x, int y, int z, int meta, int fortune) { ArrayList ItemStack ret = new ArrayList ItemStack (); int chance = this.func_150123_b(meta); if (fortune 0) { chance -= 2 fortune; if (chance 10) chance = 10; } if (world.rand.nextInt(chance) == 0) ret.add(new ItemStack(this.getItemDropped(meta, world.rand, fortune), 1, this.damageDropped(meta))); chance = 200; if (fortune 0) { chance -= 10 fortune; if (chance 40) chance = 40; } this.captureDrops(true); this.func_150124_c(world, x, y, z, meta, chance); ret.addAll(this.captureDrops(false)); return ret; } @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister register) { iicon[0] = register.registerIcon(this.getTextureName()); iicon[1] = register.registerIcon(this.getTextureName() + "_opaque"); } } ItemAluminiumLeaves.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.BlockLeaves; import net.minecraft.item.ItemLeaves; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; public class ItemAluminiumLeaves extends ItemLeaves { protected final Block leaves; public ItemAluminiumLeaves(Block block) { super((BlockLeaves) block); this.leaves = block; this.setMaxDamage(0); this.setHasSubtypes(true); } @Override public int getMetadata(int meta) { // 設置時は二進数三桁目が1になる。 return meta | 4; } @Override public String getUnlocalizedName(ItemStack itemStack) { return leaves.getUnlocalizedName(); } @Override @SideOnly(Side.CLIENT) public IIcon getIconFromDamage(int meta) { return leaves.getIcon(0, meta); } @Override @SideOnly(Side.CLIENT) public int getColorFromItemStack(ItemStack itemStack, int pass) { return leaves.getRenderColor(itemStack.getItemDamage()); } } 解説 Block +長いので囲みます Block setTickRandomly(boolean needsRandomTick) trueに設定すると、ランダムでupdateTickが呼ばれるようになる。 植物の成長判定や葉の消滅などに使う。 void setBlockBounds(float minX, float minY, float minZ, float maxX, float maxY, float maxZ) ブロックの大きさを設定する。 カーソルがあったかどうかの判定や、合わせたときの枠線の描画に使われる。 boolean canPlaceBlockAt(World world, int x, int y, int z) ブロックを設置できるかを判定する。 void onNeighborBlockChange(World world, int x, int y, int z, Block block) 隣接するブロックが更新された時の処理。 boolean canBlockStay(World world, int x, int y, int z) ブロックがとどまれるかどうか。 AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) 当たり判定を返す。 BlockではAxisAlignedBB.getBoundingBox(x + minX, y + minY, z + minZ, x + maxX, y + maxY, z + maxZ)を返している。 このメソッドをオーバーライドすれば当たり判定を変更できる。 boolean isOpaqueCube() 不透明なブロックかどうかを返す。 boolean renderAsNormalBlock() 通常のブロックのように描画するかどうかを返す。 柵や壁がつながるかどうかの判定にも使われる。 int getRenderType() レンダ―タイプを返す。 通常は0。 苗木や花、キノコなどは1。 原木、干草の俵などは31。 1を返すとTileEntityの設定などが適用される。 void updateTick(World world, int x, int y, int z, Random random) ブロックのアップデート時の処理。 needsRandomTickがtrueの時はランダムに呼ばれる。 falseだと何tick後に呼び出すなどの処理が可能。 int onBlockPlaced(World world, int x, int y, int z, int side, float posX, float posY, float posZ, int meta) ブロックが設置された時の処理。 ItemStack createStackedBlock(int meta) メタデータを反映してItemStackを生成し返す。 void breakBlock(World world, int x, int y, int z, Block block, int meta) ブロックが破壊された時の処理。 boolean canSustainLeaves(IBlockAccess world, int x, int y, int z) 葉を維持させられるブロックかどうかを返す。 boolean isWood(IBlockAccess world, int x, int y, int z) 原木かどうかを返す。 木の生成時の判定に使う。 Block setLightOpacity(int lightOpacity) 光の透過度を設定する。 0で不透過。1で完全に透過。 int getBlockColor() ブロックの色を返す。 int getRenderColor(int color) 描画するときの色を返す。 インベントリ内での描画などに使う。 int colorMultiplier(IBlockAccess iBlockAccess, int x, int y, int z) ブロックを描画するときの色の係数を返す。 void randomDisplayTick(World world, int x, int y, int z, Random random) クライアントで描画されるときにランダムで呼ばれる。 int quantityDropped(Random random) ドロップ数を返す。 Item getItemDropped(int meta, Random random, int fortune) ドロップするアイテムを返す。 void dropBlockAsItemWithChance(World world, int x, int y, int z, int meta, float chance, int par7) ブロックをドロップさせる。 boolean shouldSideBeRendered(IBlockAccess iBlockAccess, int x, int y, int z, int side) 引数の面を描画するかどうか。 引数の座標はメソッドを呼ばれたブロックではなく、その隣にあるブロック。 Blockでは、ブロックの大きさが通常より小さいでないか、引数の座標のブロックが不透明でないならtrueを返す。 void beginLeavesDecay(World world, int x, int y, int z) 葉の消滅を始める。 boolean isLeaves(IBlockAccess world, int x, int y, int z) 葉かどうかを返す。 ArrayList ItemStack getDrops(World world, int x, int y, int z, int meta, int fortune) ドロップアイテムのリストを返す。 BlockBush boolean canPlaceBlockOn(Block block) 引数のブロックの上に設置が可能かどうか。 void checkAndDropBlock(World world, int x, int y, int z) 設置されている状況が保てるかどうか判定し、保てないならドロップさせる。 BlockSapling void func_149879_c(World world, int x, int y, int z, Random random) 苗木を成長させる処理。 void func_149878_d(World world, int x, int y, int z, Random random) 木を生成する処理。 boolean func_149880_a(World world, int x, int y, int z, int type) 引数の座標のブロックが同じ種類の苗木かどうか。 ダークオーク・松などの生成に使っている。 EnumPlantType 植物の植え方を表すenum。 Plains 苗木や草、花など。 草・土・耕された土に植えられる。 ForgeDirection 方向を表すenum。 UP 上方向。 AxisAlignedBB ブロックの当たり判定などを保持するクラス。 TerrainGen 生成に関するEventを呼び出すクラス。 saplingGrowTree SaplingGrowTreeEventを呼び出す。 IPlantable 植物のインターフェース。 EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) 植物の植え方によってenumを返す。 Block getPlant(IBlockAccess world, int x, int y, int z) 引数の座標にある植物を返す。 基本的にはthisでよい。 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) 成長させる処理。 BlockRotatedPillar IIcon getSideIcon(int meta) 横の面のアイコンを返す。 IIcon getTopIcon(int meta) 上下面のアイコンを返す。 ColorizerFoliage 葉や草などの色を扱うクラス。 int getFoliageColor(double temperature, double humidity) 気温・湿度から色を生成して返す。 int getFoliageColorBasic() 基本の色を返す。 4764952(0x48A518, RGB (72,181,24))。 BlockLeaves void func_150124_c(World world, int x, int y, int z, int meta, int chance) リンゴのドロップに使うメソッド。 int func_150123_b(int meta) 苗木のドロップ確率を返す。 void setGraphicsLevel(boolean isFancy) 描画優先/処理優先の設定を反映する。 String[] func_150125_e() 木の種類名の配列を返す。 void removeLeaves(World world, int x, int y, int z) 引数の座標にあるブロックをドロップして破壊する。 privateなのでBlockAluminiumLeavesでは新しく実装していることになる。 IShearable ハサミで回収できるブロックのインターフェース。 boolean isShearable(ItemStack item, IBlockAccess world, int x, int y, int z) ハサミで回収できるかどうかを返す。 ArrayList ItemStack onSheared(ItemStack item, IBlockAccess world, int x, int y, int z, int fortune) ハサミで回収された時の処理。 ハサミで回収した時のドロップアイテムのリストを返す。 使用例 星の樹MODは木のカスタマイズ機能の影響で非常にわかりにくくなっているため、使用例は載せません。 Beta 1.0.0以前のコードは参考になるかもしれません。 コメント この項目に関する質問などをどうぞ。 左のメニューでTileEntityの追加を押すとこのページに来てしまいます。 - 名無しさん 2016-01-09 22 38 31 申し訳ありません。訂正いたしました。 - Tom Kate 2016-01-10 08 41 18 1.7.10で丸ごとコピーしてみたのですが、preInitのLeavesのところで落ちてしまいます。 - 名無しさん 2016-04-30 05 28 57 ご報告ありがとうございます。修正しました。 - 赤砂蛇凪浜 2016-04-30 16 13 34 葉のテクスチャは新しい文で指定する必要があるのでしょうか - 名無しさん 2016-05-20 16 43 05 テクスチャの指定に関する部分はいくつかあるため、どこについてなのかもう少し詳しくお願いします。 - 赤砂蛇凪浜 2016-05-20 17 28 58 葉のブロックのテクスチャ(描画設定で切り替わったり)です。例えばここのコードを丸ごと持ってきた場合、画像ファイルの名前や位置次第でテクスチャは表示されうるのでしょうか。すみません枝間違えました - ポン酢 2016-05-20 20 44 34 入力ミスのようですので、コメントは片方削除させていただきます。チュートリアルに不備があり、葉のテクスチャの指定がうまくできていなかったので修正しました。AluminiumMod.javaおよびBlockAluminiumLeaves.javaに変更がありますのでご確認ください。ご迷惑をおかけして申し訳ありませんでした。解説がわかりにくければ、またご質問いただけるとありがたいです。 - 赤砂蛇凪浜 2016-05-22 13 42 04 同じIDでいくつかの原木ブロックを追加するには、どのようにすれば良いのでしょうか。 - 名無しさん 2016-06-17 23 31 47 「メタデータを持つブロックの追加」に記載している方法で、getSubBlocksなどをオーバーライドしてテクスチャの指定を少し変更すればできます。ただし、原木の場合は向きをメタデータで記録しているので、一つのIDで追加できるのは4種類までです。バニラのコードや、(カスタム機能の影響で少しわかりにくくなっていますが)星の樹MODのソースコードも見てみてください。返信が遅くなってしまい、申し訳ありません。 - 赤砂蛇凪浜 2016-06-25 10 48 37 ありがとうございます! - 名無しさん 2016-06-25 21 53 03 返信するとこ間違えました... - 名無しさん 2016-06-25 21 53 43 このソースコードは1.10でも使用することができますか? - 名無しさん 2016-10-06 00 48 58 こちらのチュートリアルは記載の通り1.7.10版のものです。1.8以降は大きくコーディングが変更されておりますので使うことはできません。 - Tom Kate 2016-10-06 23 07 20 名前
https://w.atwiki.jp/cod4mod/pages/14.html
Welcome to the Mod Tools Category This Category outlines every article which falls under the area of Mod Tools. Whether it be Mod Tool tutorials, guides, break down of specific functions or features, or any other discussion focused on the tools themselves, you can find it in this category. If you notice an Article which belongs in this category, and is not, please add the Mod Tools category to the end of the article. このカテゴリは mod ツールのエリアの下にあるすべての記事を概説します。 それがツールチュートリアル、ガイド、特定のファンクションのブレークダウンあるいは機能、あるいは他のいかなる解説がそれら自身ツールに集中した mod であるかにかかわらず、あなたはこのカテゴリにおいてそれを見つけられます。 もしあなたがこのカテゴリに属して、そしてそうではない記事に気付くなら、どうか記事の終わりに mod ツールカテゴリを加えてください。 Articles in category "Mod Tools" Battlechatter System Cod4 Compile Tools について CoD4 Map light settings Creating a custom minimap image Creating a grid file DAE2XME ~ COLLADAモデルコンバータ Direct Light Editing Terrain End User License Agreement Frequently Asked Questions ( FAQ ) Gameplay standards Lighting Making a custom MP load screen Making a room Models in Radiant MP Fast Files MP Game Script Files MP Map Checklist MP Mapping Nodes Radiant Basics Radiant Command List Radiant Command List Mapping Reflection Probes Script Commands Scripting Basics Tool Textures World Textures ミニマップを作ろう! ロードスクリーンを作ろう! (Original "http //www.infinityward.com/wiki/index.php?title=Category Mod_Tools") ff - 名無しさん 2010-02-08 21 07 12 ここは「ベトナム語化」の website - 名無しさん 2011-11-16 08 36 40 ここは「ベトナム語化」のwebsiteではないんですが、もしめわくなりましたら但当者に下のcomment を消して貰います。 - 名無しさん 2011-11-16 08 43 24 あつかましいお願いですが。COD mw3 をベトナム語化したいんで、皆さん やい方 - artisttong 2011-11-16 08 16 18 やり方を教えて頂けませんか! - artisttong 2011-11-16 08 18 49 多分日本語化のやり方と同じでしょうか?さっばり分かりませんので詳しく教えてくれましたらうれしいです。 - 名無しさん 2011-11-16 08 27 39 名前 すべて読む
https://w.atwiki.jp/hirasawa2ch/pages/35.html
音楽産業廃棄物~P-MODEL OR DIE (MP3) (1999年9月1日より配信中) 音楽産業廃棄物~P-MODEL OR DIE SAMPLES VIRTUAL LIVE-1 (MP3) (1999年7月6日配信) VIRTUAL LIVE-2 (MP3) (1999年10月25日配信) VIRTUAL LIVE-3 (MP3) (1999年11月25日配信) VIRTUAL LIVE SAMPLES 不法投棄 (1999年12月26日配信) グローバルトリビュート大作戦 (2000年3月1日配信) その他MP3配信 音楽産業廃棄物~P-MODEL OR DIE (MP3) (1999年9月1日より配信中) 曲名 別アレンジ 関連曲 備考 01 論理空軍 ● 論理空軍(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」/「P-PLANT CD Vol.1」)● 論理空軍(カラオケ)(「グローバルトリビュート大作戦」) PVあり。「音楽産業廃棄物~P-MODEL OR DIE」にも収録 02 ローレシア ● ローレシア(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● ローレシア(カラオケ)(「グローバルトリビュート大作戦」)● ローレシア(できかけ)(「結合チェンバー」) 「音楽産業廃棄物~P-MODEL OR DIE」にも収録 03 回収船 ● 回収船[Kaisyu-sen](sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● 回収船(カラオケ)(「グローバルトリビュート大作戦」) 「音楽産業廃棄物~P-MODEL OR DIE」にも収録 04 Moon Plant-II ● Moon Plant-II (sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● Moon Plant-II(カラオケ)(「グローバルトリビュート大作戦」)● Moon Plant-II(できかけ)(「結合チェンバー」) ● Moon Plant-I(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」/「WORLD WIDE KIND」) 「Moon Plant-I」が没になったため作られた。「音楽産業廃棄物~P-MODEL OR DIE」にも収録 05 Heaven 2000 ● Heaven2000(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● Heaven 2000(カラオケ)(「グローバルトリビュート大作戦」) ● HEAVEN(「Perspective I」/「Perspective +11 Tracks」) 小西健司が「HEAVEN」の2000年風を意識して作曲。「音楽産業廃棄物~P-MODEL OR DIE」にも収録 06 Ancient Sounds ● Ancient Sounds(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● Ancient Sounds(カラオケ)(「グローバルトリビュート大作戦」) 「音楽産業廃棄物~P-MODEL OR DIE」にも収録 07 Rehash ● Salvage/Rehash(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● Rehash(カラオケ)(「グローバルトリビュート大作戦」) 「音楽産業廃棄物~P-MODEL OR DIE」にも収録 08 Waste Cabaret ● Waste Cabaret(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● Waste Cabaret(カラオケ)(「グローバルトリビュート大作戦」)● Waste Cabaret(できかけ)(「結合チェンバー」) 「音楽産業廃棄物~P-MODEL OR DIE」にも収録 09 Mind Scape ● MindScape(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● Mind Scape(カラオケ)(「グローバルトリビュート大作戦」) 「音楽産業廃棄物~P-MODEL OR DIE」にも収録 10 DUSToidよ歩行は快適か? ● DUSToidよ歩行は快適か?(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● DUSToidよ歩行は快適か?(カラオケ)(「グローバルトリビュート大作戦」)● DUSToidよ歩行は快適か?(できかけ)(「結合チェンバー」) ● DUSToidよ歩行は快適か?(「突弦変異」) ● Trashoid(「独立メディアのための無料音楽素材」) ● Theme_Trashoid(「独立メディアのための無料音楽素材」) ● DUSToidよ歩行は快適か? スケッチ1(「凝集する過去 還弦主義8760時間」)● 「DUSToidよ歩行は快適か?」スケッチ2(「凝集する過去 還弦主義8760時間」)● 「DUSToidよ歩行は快適か?」スケッチ3(「凝集する過去 還弦主義8760時間」) 「音楽産業廃棄物~P-MODEL OR DIE」にも収録 音楽産業廃棄物~P-MODEL OR DIE SAMPLES 曲名 別アレンジ 関連曲 備考 01 回収船[Kaisyu-sen] (sample) ● 回収船(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● 回収船(カラオケ)(「グローバルトリビュート大作戦」)」) 1999年6月29日配信(P-Plant/日経ネットナビ) 02 Salvage / Rehash (sample) ● Rehash(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● Rehash(カラオケ)(「グローバルトリビュート大作戦」) 1999年6月29日配信(P-Plant/日経ネットナビ) 03 論理空軍 (sample) ● 論理空軍(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● 論理空軍(カラオケ)(「グローバルトリビュート大作戦」) 1999年7月29日配信(P-Plant/日経ネットナビ)。「P-PLANT CD Vol.1」にも収録 04 Mind Scape (sample) ● Mind Scape(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● Mind Scape(カラオケ)(「グローバルトリビュート大作戦」) 1999年7月29日配信(P-Plant/日経ネットナビ) 05 Heaven2000 (sample) ● Heaven2000(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● Heaven 2000(カラオケ)(「グローバルトリビュート大作戦」) 1999年8月29日配信(P-Plant/日経ネットナビ) 06 WASTE CABARET (sample) ● Waste Cabaret(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● Waste Cabaret(カラオケ)(「グローバルトリビュート大作戦」)● Waste Cabaret(できかけ)(「結合チェンバー」) 1999年8月29日配信(P-Plant/日経ネットナビ) 07 Moon Plant (sample) ● Moon Plant-I(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」/「WORLD WIDE KIND」) ● Moon Plant-II(「音楽産業廃棄物」/MP3「音楽産業廃棄物」) 1999年9月29日配信(P-Plant/日経ネットナビ) 08 Moon Plant-II (sample) ● Moon Plant-II(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● Moon Plant-II(カラオケ)(「グローバルトリビュート大作戦」)● Moon Plant-II(できかけ)(「結合チェンバー」) ● Moon Plant-I(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」/「WORLD WIDE KIND」) 1999年9月29日配信(P-Plant/日経ネットナビ) 09 DUSToidよ歩行は快適か? (sample) ● DUSToidよ歩行は快適か?(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● DUSToidよ歩行は快適か?(カラオケ)(「グローバルトリビュート大作戦」)● DUSToidよ歩行は快適か?(できかけ)(「結合チェンバー」) ● DUSToidよ歩行は快適か?(「突弦変異」) ● Trashoid(「独立メディアのための無料音楽素材」) ● Theme_Trashoid(「独立メディアのための無料音楽素材」) ● DUSToidよ歩行は快適か? スケッチ1(「凝集する過去 還弦主義8760時間」)● 「DUSToidよ歩行は快適か?」スケッチ2(「凝集する過去 還弦主義8760時間」)● 「DUSToidよ歩行は快適か?」スケッチ3(「凝集する過去 還弦主義8760時間」) 1999年9月29日配信(P-Plant/日経ネットナビ) 10 ローレシア (sample) ● ローレシア(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● ローレシア(カラオケ)(「グローバルトリビュート大作戦」)● ローレシア(できかけ)(「結合チェンバー」) 1999年9月29日配信(P-Plant/日経ネットナビ) 11 Ancient Sounds (sample) ● Ancient Sounds(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● Ancient Sounds(カラオケ)(「グローバルトリビュート大作戦」) 2001年4月5日配信(P-Plant/日経ネットナビ) VIRTUAL LIVE-1 (MP3) (1999年7月6日配信) 曲名 別アレンジ 関連曲 備考 01 ルームランナー ● ルームランナー(「IN A MODEL ROOM」)● roomrunner(「demo」) 「ルームランナー」のライブ風アレンジ。「VIRTUAL LIVE-1」にも収録 02 サンシャイン・シティー ● サンシャイン・シティー(sg「美術館で会った人だろ」/「IN A MODEL ROOM」) 「サンシャイン・シティー」のライブ風アレンジ。「VIRTUAL LIVE-1」にも収録 03 MOMO色トリック ● MOMO色トリック(「IN A MODEL ROOM」) 「MOMO色トリック」のライブ風アレンジ。「VIRTUAL LIVE-1」にも収録 04 ホワイト・シガレット ● ホワイト・シガレット(「IN A MODEL ROOM」) 「ホワイト・シガレット」のライブ風アレンジ。「VIRTUAL LIVE-1」にも収録 05 偉大なる頭脳 ● 偉大なる頭脳(「IN A MODEL ROOM」) 「偉大なる頭脳」のライブ風アレンジ。「VIRTUAL LIVE-1」にも収録 06 KAMEARI POP ● KAMEARI POP(sg「KAMEARI POP」/「IN A MODEL ROOM」)● Town-K(「P-PLANT CD Vol.1」)● Town-K (sample)(「VIRTUAL LIVE SAMPLES」)● KAMEARI POP 此岸のパラダイス篇(「太陽系亞種音」) 「KAMEARI POP」のライブ風アレンジ。「VIRTUAL LIVE-1」にも収録 07 美術館で会った人だろ ● 美術館で会った人だろ(sg「美術館で会った人だろ」/「IN A MODEL ROOM」)● bijutsu-kan de atta hito daro(「demo」)● Be a Jews Kantian(「P-PLANT CD Vol.1」)● Be a Jews Kantian (sample)(「VIRTUAL LIVE SAMPLES」) ● NO ROOM(「P-MODEL」/「ゴールデン☆ベスト P-MODEL」) 「美術館で会った人だろ」のライブ風アレンジ。「VIRTUAL LIVE-1」にも収録 08 ヘルス・エンジェル ● ヘルス・エンジェル(sg「KAMEARI POP」/「IN A MODEL ROOM」)● Angela(「P-PLANT CD Vol.1」)● Angela (sample)(「VIRTUAL LIVE SAMPLES」) 「ヘルス・エンジェル」のライブ風アレンジ。「VIRTUAL LIVE-1」にも収録 09 子供たちどうも ● 子供たちどうも(「IN A MODEL ROOM」) 「子供たちどうも」のライブ風アレンジ。「VIRTUAL LIVE-1」にも収録 10 アート・ブラインド ● アート・ブラインド(「IN A MODEL ROOM」)● Me Line Whats?(「P-PLANT CD Vol.1」)● ME-LINE-WHAT? (sample)(「VIRTUAL LIVE SAMPLES」)● アート・ブラインド(「突弦変異」) ● 途中経過-01(「凝集する過去 還弦主義8760時間」)● 途中経過-02(「凝集する過去 還弦主義8760時間」)● 途中経過-03(「凝集する過去 還弦主義8760時間」) 「アート・ブラインド」のライブ風アレンジ。「VIRTUAL LIVE-1」にも収録 VIRTUAL LIVE-2 (MP3) (1999年10月25日配信) 曲名 別アレンジ 関連曲 備考 01 ダイジョブ ● ダイジョブ(「LANDSALE」)● Dai(「P-PLANT CD Vol.1」)● Dai (sample)(「VIRTUAL LIVE SAMPLES」) 「ダイジョブ」のライブ風アレンジ。「VIRTUAL LIVE-2」にも収録 02 「ラヴ」ストーリー ● 「ラヴ」ストーリー(sg「ミサイル」/「LANDSALE」) 「「ラヴ」ストーリー」のライブ風アレンジ。「VIRTUAL LIVE-2」にも収録 03 ミサイル ● ミサイル(sg「ミサイル」/「LANDSALE」)● ミサイル(「突弦変異」) ● ミサイル・スケッチ1(「凝集する過去 還弦主義8760時間」)● ミサイル・スケッチ2(「凝集する過去 還弦主義8760時間」)● ミサイル・スケッチ3(「凝集する過去 還弦主義8760時間」)● ミサイル・スケッチ4(「凝集する過去 還弦主義8760時間」)● ミサイル・スケッチ5(「凝集する過去 還弦主義8760時間」) 「ミサイル」のライブ風アレンジ。「VIRTUAL LIVE-2」にも収録 04 ナ・カ・ヨ・シ ● ナ・カ・ヨ・シ(「LANDSALE」) 「ナ・カ・ヨ・シ」のライブ風アレンジ。「VIRTUAL LIVE-2」にも収録 05 ドクター・ストップ ● ドクター・ストップ(「LANDSALE」) 「ドクター・ストップ」のライブ風アレンジ。「VIRTUAL LIVE-2」にも収録 06 異邦人 ● 異邦人(「LANDSALE」) 「異邦人」のライブ風アレンジ。「VIRTUAL LIVE-2」にも収録 07 I AM ONLY YOUR MODEL ● I AM ONLY YOUR MODEL(「LANDSALE」) ● クロシロクロシロクロシロクロシ(未CD化) 「I AM ONLY YOUR MODEL」のライブ風アレンジ。「VIRTUAL LIVE-2」にも収録 08 ワン ウェイ ラヴ ● ワン ウェイ ラヴ(「LANDSALE」) 「ワン ウェイ ラヴ」のライブ風アレンジ。「VIRTUAL LIVE-2」にも収録 09 リトル ボーイ ● リトルボーイ(「LANDSALE」) 「リトル ボーイ」のライブ風アレンジ。「VIRTUAL LIVE-2」にも収録 10 オハヨウ ● オハヨウ(「LANDSALE」) ● オハヨウ II(「SCUBA」) ● オハヨウ II(「SCUBA(CD)」) ● オハヨウ II(「SCUBA RECYCLE」) 「オハヨウ」のライブ風アレンジ。「VIRTUAL LIVE-2」にも収録 VIRTUAL LIVE-3 (MP3) (1999年11月25日配信) 曲名 別アレンジ 関連曲 備考 01 ジャングルベッド I ● ジャングルベッド I(「Potpourri」)● Astro-Ho(「P-PLANT CD Vol.1」) ● Astro-Ho(narration Ver.)(「P-PLANT CD Vol.1」/MP3配布) 「ジャングルベッド I」のライブ風アレンジ。「VIRTUAL LIVE-3」にも収録 02 列車 ● 列車(「Perspective」/「Perspective +11 Tracks」) ● 列車(「Perspective II」/「Perspective +11 Tracks」)● 列車(「LIVEの方法」) 「列車」のライブ風アレンジ。「VIRTUAL LIVE-3」にも収録 03 ジャングルベッド II ● ジャングルベッド II(sg「ジャングルベッド II」/「Potpourri」) 「ジャングルベッド II」のライブ風アレンジ。「VIRTUAL LIVE-3」にも収録 04 モノクローム・スクリーン ● モノクローム・スクリーン(「Potpourri」) 「モノクローム・スクリーン」のライブ風アレンジ。「VIRTUAL LIVE-3」にも収録 05 青十字 ● 青十字(「Potpourri」) 「青十字」のライブ風アレンジ。「VIRTUAL LIVE-3」にも収録 06 Perspective II ● Perspective II(「Perspective」/「Perspective +11 Tracks」)● Perspective II(「Perspective II」/「Perspective +11 Tracks」)● Astro-4D(「P-PLANT CD Vol.1」)● Astro-4D (sample)(「VIRTUAL LIVE SAMPLES」) 「Perspective II」のライブ風アレンジ。「VIRTUAL LIVE-3」にも収録 07 Perspective ● Perspective(「Perspective」/「Perspective +11 Tracks」)● Perspective(「Perspective II」/「Perspective +11 Tracks」) 「Perspective」のライブ風アレンジ。「VIRTUAL LIVE-3」にも収録 08 ブループリント ● ブループリント(「Potpourri」)● Printed Blue(「P-PLANT CD Vol.1」)● Printed Blue (sample)(「VIRTUAL LIVE SAMPLES」) 「ブループリント」のライブ風アレンジ。「VIRTUAL LIVE-3」にも収録 09 Potpourri ● Potpourri(「Potpourri」) 「Potpourri」のライブ風アレンジ。「VIRTUAL LIVE-3」にも収録 10 うわばみ ● うわばみ(「Perspective」/「Perspective +11 Tracks」) ● うわばみ(「Perspective II」/「Perspective +11 Tracks」) 「うわばみ」のライブ風アレンジ。「VIRTUAL LIVE-3」にも収録 VIRTUAL LIVE SAMPLES 曲名 別アレンジ 関連曲 備考 01 Be a Jews Kantian (sample) ● 美術館で会った人だろ(sg「美術館で会った人だろ」/「IN A MODEL ROOM」)● Be a Jews Kantian(「P-PLANT CD Vol.1」)● bijutsu-kan de atta hito daro(「demo」) ● 美術館で会った人だろ(「VIRTUAL LIVE-1」/MP3「VIRTUAL LIVE-1」) ● NO ROOM(「P-MODEL」/「ゴールデン☆ベスト P-MODEL」) 1999年5月29日配信(P-Plant/日経ネットナビ) 02 Angela (sample) ● ヘルス・エンジェル(sg「KAMEARI POP」/「IN A MODEL ROOM」)● ヘルス・エンジェル(「VIRTUAL LIVE-1」/MP3「VIRTUAL LIVE-1」)● Angela(「P-PLANT CD Vol.1」) 1999年5月29日配信(P-Plant/日経ネットナビ) 03 ME-LINE-WHAT? (sample) ● アート・ブラインド(「IN A MODEL ROOM」)● アート・ブラインド(「VIRTUAL LIVE-1」/MP3「VIRTUAL LIVE-1」)● Me Line Whats?(「P-PLANT CD Vol.1」)● アート・ブラインド(「突弦変異」) ● 途中経過-01(「凝集する過去 還弦主義8760時間」)● 途中経過-02(「凝集する過去 還弦主義8760時間」)● 途中経過-03(「凝集する過去 還弦主義8760時間」) 1999年5月29日配信(P-Plant/日経ネットナビ) 04 Town-K (sample) ● KAMEARI POP(sg「KAMEARI POP」/「IN A MODEL ROOM」)● KAMEARI POP(「VIRTUAL LIVE-1」/MP3「VIRTUAL LIVE-1」)● Town-K(「P-PLANT CD Vol.1」) ● KAMEARI POP 此岸のパラダイス篇(「太陽系亞種音」) 1999年6月29日配信(P-Plant/日経ネットナビ) 05 Dai (sample) ● ダイジョブ(「LANDSALE」)● ダイジョブ(「VIRTUAL LIVE-2」/MP3「VIRTUAL LIVE-2」)● Dai(「P-PLANT CD Vol.1」) 1999年10月29日配信(P-Plant/日経ネットナビ) 06 Thai(Falling Rain) (sample) ● Thai(Falling Rain) (full)(「不法投棄」)● Thai Live(「P-PLANTCD Vol.1」)● Falling Rain(P-MODEL version)(MP3配布) タイ国王作「Falling Rain」の別アレンジ。1999年10月29日配信(P-Plant/日経ネットナビ) 07 Printed Blue (sample) ● ブループリント(「Potpourri」)● ブループリント(「VIRTUAL LIVE-3」/MP3「VIRTUAL LIVE-3」) ● ブループリント(「PAUSE」)● Printed Blue(「P-PLANT CD Vol.1」) 1999年11月29日配信(P-Plant/日経ネットナビ) 08 Astro-Ho (sample) ● ジャングルベッド I(「Potpourri」)● ジャングルベッド I(「VIRTUAL LIVE-3」/MP3「VIRTUAL LIVE-3」)● Astro-Ho(「P-PLANT CD Vol.1」)● Astro-Ho(narration Ver.)(「P-PLANT CD Vol.1」/MP3配布) 1999年12月24日配信(P-Plant/日経ネットナビ) 09 Astro-4D (sample) ● Perspective II(「Perspective」/「Perspective +11 Tracks」)● Perspective II(「Perspective II」/「Perspective +11 Tracks」) ● Perspective II(「VIRTUAL LIVE-3」/MP3「VIRTUAL LIVE-3」)●Astro-4D(「P-PLANT CD Vol.1」) 1999年12月24日配信(P-Plant/日経ネットナビ) 不法投棄 (1999年12月26日配信) 曲名 別アレンジ 関連曲 備考 01 Manifesto ワーグナー「ニュルンベルグのマイスタージンガー」をBGMにした宣言 02 Densha twenty2productにおいて動画配信 03 en Soiree de Cherubin 04 Thai (Falling Rain) (full) ● Thai (Falling Rain) (sample)(「VIRTUAL LIVE SAMPLES」)● Thai Live(「P-PLANTCD Vol.1」)● Falling Rain(P-MODEL version)(MP3配布) タイ国王作「Falling Rain」の別アレンジ グローバルトリビュート大作戦 (2000年3月1日配信) 曲名 別アレンジ 関連曲 備考 01 論理空軍(カラオケ) ● 論理空軍(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● 論理空軍(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」/「P-PLANT CD Vol.1」) 「論理空軍」のカラオケバージョン 02 ローレシア(カラオケ) ● ローレシア(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● ローレシア(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● ローレシア(できかけ)(「結合チェンバー」) 「ローレシア」のカラオケバージョン 03 回収船(カラオケ) ● 回収船(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● 回収船[Kaisyu-sen](sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」) 「回収船」のカラオケバージョン 04 Moon Plant-II(カラオケ) ● Moon Plant-II(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● Moon Plant-II (sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● Moon Plant-II(できかけ)(「結合チェンバー」) ● Moon Plant-I(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」/「WORLD WIDE KIND」) 「Moon Plant-II」のカラオケバージョン 05 Heaven 2000(カラオケ) ● Heaven 2000(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● Heaven 2000(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」) ● HEAVEN(「Perspective I」/「Perspective +11 Tracks」) 「Heaven 2000」のカラオケバージョン 06 Ancient Sounds(カラオケ) ● Ancient Sounds(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● Ancient Sounds(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」) 「Ancient Sounds」のカラオケバージョン 07 Rehash(カラオケ) ● Rehash(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● Salvage/Rehash(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」) 「Rehash」のカラオケバージョン 08 Waste Cabaret(カラオケ) ● Waste Cabaret(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● Waste Cabaret(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● Waste Cabaret(できかけ)(「結合チェンバー」) 「Waste Cabaret」のカラオケバージョン 09 Mind Scape(カラオケ) ● Mind Scape(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● MindScape(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」) 「Mind Scape」のカラオケバージョン 10 DUSToidよ歩行は快適か?(カラオケ) ● DUSToidよ歩行は快適か?(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● DUSToidよ歩行は快適か?(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● DUSToidよ歩行は快適か?(できかけ)(「結合チェンバー」) ● DUSToidよ歩行は快適か?(「突弦変異」) ● Trashoid(「独立メディアのための無料音楽素材」) ● Theme_Trashoid(「独立メディアのための無料音楽素材」) ● DUSToidよ歩行は快適か? スケッチ1(「凝集する過去 還弦主義8760時間」)● 「DUSToidよ歩行は快適か?」スケッチ2(「凝集する過去 還弦主義8760時間」)● 「DUSToidよ歩行は快適か?」スケッチ3(「凝集する過去 還弦主義8760時間」) 「DUSToidよ歩行は快適か?」のカラオケバージョン 11 出囃子2000 その他MP3配信 曲名 別アレンジ 関連曲 備考 01 ローレシア(できかけ) ● ローレシア(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● ローレシア(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● ローレシア(カラオケ)(「グローバルトリビュート大作戦」) 1999年8月25日配信(結合チェンバー) 02 Moon Plant-II(できかけ) ● Moon Plant-II(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● Moon Plant-II (sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● Moon Plant-II(カラオケ)(「グローバルトリビュート大作戦」) 1999年8月25日配信(結合チェンバー) 03 WASTE CABARET (できかけ) ● Waste Cabaret(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● Waste Cabaret(sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● Waste Cabaret(カラオケ)(「グローバルトリビュート大作戦」) 1999年8月25日配信(結合チェンバー) 04 DUSToidよ歩行は快適か? (できかけ) ● DUSToidよ歩行は快適か?(「音楽産業廃棄物」/MP3「音楽産業廃棄物」)● DUSToidよ歩行は快適か?(「グローバルトリビュート大作戦」)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● DUSToidよ歩行は快適か?(カラオケ)(MP3配布)● DUSToidよ歩行は快適か?(「突弦変異」) ● Trashoid(「独立メディアのための無料音楽素材」) ● Theme_Trashoid(「独立メディアのための無料音楽素材」) ● DUSToidよ歩行は快適か? スケッチ1(「凝集する過去 還弦主義8760時間」)● 「DUSToidよ歩行は快適か?」スケッチ2(「凝集する過去 還弦主義8760時間」)● 「DUSToidよ歩行は快適か?」スケッチ3(「凝集する過去 還弦主義8760時間」) 1999年8月25日配信(結合チェンバー) 05 Moon Plant-I(full) ● Moon Plant (sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」) ● Moon Plant-II(「音楽産業廃棄物」/MP3「音楽産業廃棄物」) 1999年12月24日配信(日経ネットナビアンケートウェア)。DVD「賢者のプロペラ Version1.4」にカラオケバージョンが収録。「WORLD WIDE KIND」にも収録 06 Astro-Ho(narration Ver.) ● Astro-Ho(「P-PLANT CD Vol.1」)● Astro-Ho (sample)(「音楽産業廃棄物~P-MODEL OR DIE SAMPLES」)● ジャングルベッド I(「Potpourri」)● ジャングルベッド I(「VIRTUAL LIVE-3」/MP3「VIRTUAL LIVE-3」) 1999年12月24日配信(日経ネットナビアンケートウェア)「P-PLANT CD Vol.1」にも収録 07 Falling Rain(P-MODEL version) ● Thai (Falling Rain) (full)(「不法投棄」)● Thai (Falling Rain) (sample)(「VIRTUAL LIVE SAMPLES」)● Thai Live(「P-PLANTCD Vol.1」) タイ国王作「Falling Rain」の別アレンジ。ナレーション抜きバージョン
https://w.atwiki.jp/monosepia/pages/12428.html
(※ ヌクレオシド修飾メッセンジャーRNA。Nucleoside-modified messenger RNA) mRNA + ニュースサーチ〔modRNA〕 RNAベースのワクチン技術について:この「トロイの木馬」はmRNAを含んでいない(上) - 大紀元 ● ヌクレオシド修飾メッセンジャーRNA - Wikipedia .
https://w.atwiki.jp/spaceempires/pages/12.html
SE4 MOD SE4 MODSpace Empires IV PowerUpCustomMOD Space Empires IV PowerUpCustomMOD SE 4の拡張MODです。 AI改善系のMODと共存可能です。 以下の内容があります。 新しい技術(主に最大上限レベルの加増) 新しいファクトリー(主に最大上限レベルの加増) 以下の新しい銀河形態が追加されます。 Splash1 Galactic Edge スプラッシュ化された銀河で、突飛な形をしています。 Splash2 Galactic Edge スプラッシュ化された銀河で、より突飛な形をしています。 Huge1 Galactic Edge とにかく巨大です。惑星数を追加。 Huge2 Galactic Edge とにかく巨大です。惑星数を追加。 Ugly1 Galactic Edge 非常に見た目が美しくない銀河です。奇抜さを求める方へ。 Ugly2 Galactic Edge 非常に見た目が美しくない銀河です。奇抜さを求める方へ。 コンポーネントを一部改良(あまりにも使えなかったコンポーネントを、より使えるように)
https://w.atwiki.jp/paintball/pages/15.html
Paintball Mod kitに関するページです。 Paintball Mod Kitとは 武器に存在する(しない物もある)Upgrade枠にはめ込み、武器を強化するアイテムです。 5種類存在し、Small,Medium,Largeの順に効果が高くなります。 (例 Kit of Brutalityの場合。 Small=2dmg・Large=4dmg) Modの入手方法 Small=Power mall 2FのNickより購入 Medium,Large=PaintballのCapture The Flagをプレイし、勝利するとレアアイテムとしてLootすることがある。 Modの消去方法 Plastic Surgery ClinitのEther LoadよりRemovalKitを購入する。(4Crystal) 消去したModは消える Mod名 効果 Small Medium Large Fury FireRate 30 40 50 Brutality 火力 2 3 4 Endurance Clip数*1 1 2 3 Madness 弾速上昇 2 3 4 Penetration 射撃精度 2 3 4 *1 リロードせずに撃てる数ではなく、リロードできる回数が上昇。
https://w.atwiki.jp/gyakumo/pages/127.html
日本語化導入 結果 ACE2 SIX UPLOADER導入 日本語化 UIおよび火器類すべてを日本語化するMODを導入する手順 参考サイト:ArmA2 wiki 導入 ココから、MODファイルをダウンロード(zipファイル 189MB) 解凍してできたフォルダの、中身のフォルダを C \Program Files (x86)\Steam\SteamApps\common\arma 2 に入れる 起動設定に -mod=@a2jpm_full を追加 (例) "D \Steam\steamapps\common\arma 2\arma2.exe" -mod=@a2jpm_full 結果 ACE2 SIX UPLOADER 日本で稼動するほぼ全てのサーバーが導入している ゲームのリアリティをさらに向上させる基本鉄板MOD SIXUPLOADERはMODなどを自動的に管理してくれるツール 導入 SIX UPLOADERの導入説明からまずSIXUPLOADERを導入 ACE2の導入説明からACE2を導入