約 3,864,014 件
https://w.atwiki.jp/akasatanahama/pages/68.html
概要 新しい食料アイテムを追加する。 食べたときにポーションエフェクトを確率で付与することもできる。 ソースコード 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.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemFood; import net.minecraft.potion.Potion; @Mod(modid = AluminiumMod.MODID, name = AluminiumMod.MODNAME, version = AluminiumMod.VERSION) public class AluminiumMod { public static final String MODID = "AluminiumMod"; public static final String MODNAME = "Aluminium Mod"; public static final String VERSION = "1.0.0"; public static Item foodAluminium; @EventHandler public void perInit(FMLPreInitializationEvent event) { foodAluminium = new ItemFood(5, 2.0F, false) .setPotionEffect(Potion.regeneration.id, 60, 0, 0.8F) .setCreativeTab(CreativeTabs.tabFood) .setUnlocalizedName("foodAluminium") .setTextureName("aluminiummod foodAluminium"); GameRegistry.registerItem(foodAluminium, "foodAluminium"); } } 解説 ItemFood コンストラクタ(int healAmount, float saturationModifier, boolean isWolfsFavoriteMeat) 引数は順に、満腹度回復量・隠し満腹度回復量(腹持ち)・オオカミが食べられるか ItemFood setPotionEffect(int potionId, int potionDuration, int potionAmplifier, float potionEffectProbability) 食べたときに確率でポーションエフェクトを付与する。 引数は順に、ポーションID・効果時間・効果レベル・付与される確率。 効果時間は単位が秒なので注意。 効果レベルは表示値より1少ない。(0がレベル1) 使用例 オファレンMODの回復玉を追加している部分。 回復玉は、ItemFoodを継承しているが、オーバーライドして変えている部分も多い。 +オファレンMOD OfalenModCore.java package nahama.ofalenmod; /*略*/ /** @author Akasata Nahama */ @Mod(modid = OfalenModCore.MODID, name = OfalenModCore.MODNAME, version = OfalenModCore.VERSION) public class OfalenModCore { public static final String MODID = "OfalenMod"; public static final String MODNAME = "Ofalen Mod"; public static final String VERSION = "[1.7.10]1.0.0"; /*略*/ /** 最初に行われる処理。アイテム・ブロックの追加などを行う */ @EventHandler public void preInit(FMLPreInitializationEvent event) { /*略*/ // アイテムを設定するメソッドを実行 OfalenModItemCore.registerItem(); /*略*/ } /*略*/ } OfalenModItemCore.java package nahama.ofalenmod.core; /*略*/ public class OfalenModItemCore { /*略*/ public static Item ballRecovery; /*略*/ /**アイテムを設定する*/ public static void registerItem () { /*略*/ ballRecovery = new OfalenBall(new PotionEffect[]{new PotionEffect(Potion.heal.id, 1, 0)}) .setUnlocalizedName("ballRecovery") .setTextureName("ofalenmod recovery_ball"); GameRegistry.registerItem(ballRecovery, "ballRecovery"); /*略*/ } } OfalenBall.java package nahama.ofalenmod.item; import nahama.ofalenmod.OfalenModCore; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; public class OfalenBall extends ItemFood { /**付与するポーション効果の配列*/ private final PotionEffect[] effects; /**新規コンストラクター。ポーション効果の配列を受け取る。*/ public OfalenBall(PotionEffect[] effects) { super(0, 0.0F, false); this.effects = effects; this.setCreativeTab(OfalenModCore.tabOfalen); } /**食べるのにかかる時間を返す。(通常よりも少し早い) * @return 20*/ @Override public int getMaxItemUseDuration(ItemStack itemStack) { return 20; } /**右クリックされた時の処理。ItemFoodの満腹度の判定を消している。*/ @Override public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) { player.setItemInUse(itemStack, this.getMaxItemUseDuration(itemStack)); return itemStack; } /**食べる時の処理。クリエイティブモードではアイテム数が減らないようにしている。また、ポーション効果も付与する。*/ /* EntityLivingBase.addPotionEffect(PotionEffect)では、効果時間を上書きしているらしい(?)ので、 * 新たにPotionEffectのオブジェクトを生成して引数として渡している。*/ @Override public ItemStack onEaten(ItemStack itemStack, World world, EntityPlayer player) { //クリエイティブモード以外ならスタックサイズを減らす。 if (!player.capabilities.isCreativeMode) { --itemStack.stackSize; } //つけるポーション効果の数だけ繰り返す。 for (int i = 0; i effects.length; i ++) { //サーバー側の処理で、情報が正常なら処理を続ける。 if (!world.isRemote effects[i] != null effects[i].getPotionID() 0) { //即時回復なら、 if (effects[i].getPotionID() == Potion.heal.id) { //ID・効果時間を固定して、 PotionEffect effect = new PotionEffect(Potion.heal.id, 1, effects[i].getAmplifier()); //プレイヤーに付与。 player.addPotionEffect(effect); //即時回復以外なら、 } else { //効果時間のみ固定して、 PotionEffect effect = new PotionEffect(effects[i].getPotionID(), effects[i].getDuration(), effects[i].getAmplifier()); //プレイヤーに付与。 player.addPotionEffect(effect); } } } world.playSoundAtEntity(player, "random.burp", 0.5F, world.rand.nextFloat() * 0.1F + 0.9F); return itemStack; } } コメント この項目に関する質問などをどうぞ。 ItemFood setPotionEffect の引数が (int, int, int, float) ではなく (string) になっているのですが、なぜですか? - あるふぁ 2017-05-20 14 48 36 自己解決しました。 - あるふぁ 2017-05-20 14 51 35 金リンゴのように、満腹度MAXの時でも食べられるものはどう作るのですか? - あるふぁ 2017-05-20 14 54 50 こちらも解決しました。setAlwaysEdible()を使いました。 - あるふぁ 2017-05-20 18 57 23 名前
https://w.atwiki.jp/sangokukmy9/pages/37.html
結局300円で妥協してもらいました みねこちっ‥安い‥まあいいわ みねこ三国志NETの全体の流れについて説明するわ あやねはーい みねこまず、三国志NETは戦略ゲームということは分かってるわね? あやねはーい みねこ戦略ゲームというからには、戦争がある あやねうんうん みねこ大体この流れで進むの あやねうわっ、なんか複雑そうですね みねこ基本はシンプルよ。まず、プレイヤーは建国または仕官によって、国に参加するの あやね国? みねこ三国志NETはチームプレイなの。何人かのグループに分かれて、協力しあってお互いのグループを倒すの。そのグループを、国と呼んでいるわけ あやねじゃあ、建国って、その国を作ること? みねこそうね。あなた、建国したでしょ?建国した人はその国の君主‥リーダーになるの あやねほえー みねこもっとも‥初心者が建国することはお勧めできないけどね あやねええっ!? みねこある程度ゲームシステムを理解してから建国したほうがいいのよ、本当はね あやねううっ‥ みねこ普通は、もう建国してある国を選択して、仕官するの みねこ建国したからには仕方ないわ‥君主といっても覚えることが増えるだけだしこのまま説明を進めるわよ みねこ他の部分についてはひとまず置いておいて、平時について説明するわね あやねはーい みねこ国を作ると、こうして、地図上にあなたの国ができるのよ。長安を選んで建国したわね あやねはい みねこ国の名前はあやねのステージ‥‥アイスでよかったのに‥‥ みねこあああっ!? あやね!? みねこアイス‥アイス‥もうないよぉ‥アンパンがあった!アンパンスーハースーハースーハースーハー‥‥ みねこ‥うん、もう大丈夫 みねこお騒がせしたわね あやねは‥はい‥ みねこ注射だったらもっと効くけどね‥失礼 あやね(や、やっぱりこの人怖い‥) みねこそして、これがあなたが選んだ都市の情報よ あやねわあ、いろいろありますねー みねこえっとね、それぞれの情報はこうなっていて‥ 名前 説明 農民 高いほど戦争の時に徴兵できる兵士の最大数が増える 民忠 高いほど農民が増えやすくなる 農業 高いほど毎年7月の米収入が上がる 商業 高いほど毎年1月の金収入が上がる 技術 高いほど戦争の時に、強い兵士を雇えるようになる 城壁 高いほど戦争の時に、都市を守りやすくなる あやねなるほど‥パラメータがいろいろなところに影響するんですね ※註:アイコンのアップロードについては別項で説明します みねこそれで、これが武将の情報っぽいわね あやねわあ、ここにもいろんなパラメータがある! みねこ私の分かる範囲で説明するとね‥ 名前 説明 武力 戦争の時の強さに影響する 知力 内政の効果に影響する 統率 戦争の時に徴兵できる兵数に影響する 人望 高いほど民忠を上げやすくなる 金 所持金。内政・徴兵に使ったり、強い武器を買ったりするときに使う 米 徴兵した兵士を雇う時に使う 貢献 1〜6月、7〜12月の間の貢献 階級値 貢献の累積 みねこ他にもあるけど、詳しくはその時その時に説明するわね あやねな、内政? みねこええ、平時には内政をして農業、商業、技術、城壁を上げるの あやねなるほど、都市のパラメータを上げる作業ですね! ???くまさ〜ん‥森のくまさ〜ん‥ あやね!? ???あたしは〜森の妖精さんよ〜 あやねま、また変なのが出てきた‥
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/widget/pages/12.html
https://w.atwiki.jp/takumas72/pages/442.html
nicovideo_mylist エラー ( マイリストURLの取得に失敗しました。正しいURLを入力してください。 ) 作品解説 制作者:P名未定(ユーザーページ) 投稿者削除 GM 水谷絵理 祐樹P(SM) PL 高槻やよい 如月千早 水瀬伊織 星井美希 双海真美
https://w.atwiki.jp/kawai16/pages/33.html
☆出席シートの意味 ☆良くある疑問出席シートにあるKAって何?? ☆出席シートの有効活用志望大学調査 チュートリアルテーマの募集 悩みを募集 チュートリアル評価 ☆注意してほしいこと悩みが書かれていた場合 悩みに対してアドバイスを考える時 チュートリアル構成例 関連項目(関連しそうなページリンク記載) (関連しそうなページリンク記載) (関連しそうなページリンク記載) (関連しそうなページリンク記載) メモ欄(追加情報があるときはココへ) ☆出席シートの意味 出席と講師へのメッセージを取るためにあるツール 普段は授業前に配布して、授業後回収するシステムをとる (ただし途中休憩がある講座は別) 講師へのメッセージ欄以外に『チューターヘのメッセージ』を書く欄もある 生徒からもらったメッセージに返答を書いて次週に返却することもできる その際は個人情報保護に気をつけること また講師へのメッセージも書かれていた場合は コピー&【出席シート=講師】【コピー=チューター】を厳守すること 場合によっては先生から指定の出席シートを使うようにと手渡されることもある ☆良くある疑問 出席シートにあるKAって何?? Knowledge Assistantの略 高校1・2年生対応のチューターをそう呼び、チューターとは別扱い 高1・2グリーンの授業でも同じ出席シートを使うため、KAとTrと分けられている ☆出席シートの有効活用 志望大学調査 学期初めに「チューターへのメッセージ欄」を使って 志望大学調査をすれば、チュートリアルで話す内容やレベルを調べられる ◇大学別講座でないかぎり、志望大学を調べるのは難しい チュートリアルテーマの募集 話をしてほしい内容をチュートリアルで募集 「自分が話したいこと」よりも「生徒が聞きたいこと」を話たい人にオススメ 悩みを募集 模試の直後などは勉強に関する悩みが多くなる チュートリアルで悩みがないかをアナウンスして、欄に書いてもらう チュートリアル評価 チュートリアルが役立っているかを書いてもらう ☆注意してほしいこと 悩みが書かれていた場合 悩みの種類をしっかりと把握すること。 場合によってはチュートリアルで話されたくないことも多い 何でもかんでもチュートリアルで取り上げるのは、トラブルを招きかねない 判断が微妙な場合は教務へ聞こう 悩みに対してアドバイスを考える時 自分だけで考えないことをオススメする 悩み相談に関しては、責任感ゆえに一人で結論を出してアドバイスをする人が多い 内容によってはトラブルになりかねないことを覚えておいて欲しい 先輩チューターや他のチューターが同じ体験をして解決しているかもしれない 色々な人の意見を仰ぐことでより良いアドバイスを心がけるように チュートリアル構成例 関連項目 (関連しそうなページリンク記載) (関連しそうなページリンク記載) (関連しそうなページリンク記載) (関連しそうなページリンク記載) メモ欄(追加情報があるときはココへ) △上へ戻る△ 登録タグリスト・クリックでタグ検索へ
https://w.atwiki.jp/tohokuunivmokeiken/pages/42.html
基本的にすでに存在するページを編集するだけで問題ない人が多いのでその人達用に編集方法だけを抜粋して図解する. 1.編集タブにカーソルを合わせる 2.ページ編集をクリック 3.ログイン 4.編集後,プレビューをして編集後の画面を確認し,保存 5.編集完了
https://w.atwiki.jp/akasatanahama/pages/27.html
概要 新しい剣・シャベル・斧・ツルハシ・クワや、適正ブロックを自由に設定できるツールを追加する。 ソースコード AluminiumMod.java package tutorial.aluminiummod; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.Item.ToolMaterial; import net.minecraft.item.ItemHoe; import net.minecraft.item.ItemSpade; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import net.minecraftforge.common.util.EnumHelper; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.registry.GameRegistry; @Mod(modid = AluminiumMod.MODID, name = AluminiumMod.MODNAME, version = AluminiumMod.VERSION) public class AluminiumMod { public static final String MODID = "AluminiumMod"; public static final String MODNAME = "Aluminium Mod"; public static final String VERSION = "1.0.0"; public static Item aluminium; public static Item swordAluminium; public static Item shovelAluminium; public static Item pickaxeAluminium; public static Item axeAluminium; public static Item hoeAluminium; public static Item toolAluminium; public static ToolMaterial ALUMINIUM; @EventHandler public void perInit(FMLPreInitializationEvent event) { aluminium = new Item() .setCreativeTab(CreativeTabs.tabMaterials) .setUnlocalizedName("aluminium") .setTextureName("aluminiummod aluminium"); GameRegistry.registerItem(aluminium, "aluminium"); ALUMINIUM = EnumHelper.addToolMaterial("ALUMINIUM", 3, 1000, 7.5F, 2.5F, 10) .setRepairItem(new ItemStack(AluminiumMod.aluminium)); swordAluminium = new ItemSword(ALUMINIUM) .setCreativeTab(CreativeTabs.tabCombat) .setUnlocalizedName("swordAluminium") .setTextureName("aluminiummod aluminium_sword"); GameRegistry.registerItem(swordAluminium, "swordAluminium"); shovelAluminium = new ItemSpade(ALUMINIUM) .setCreativeTab(CreativeTabs.tabTools) .setUnlocalizedName("shovelAluminium") .setTextureName("aluminiummod aluminium_shovel"); GameRegistry.registerItem(shovelAluminium, "shovelAluminium"); pickaxeAluminium = new AluminiumPickaxe(ALUMINIUM) .setCreativeTab(CreativeTabs.tabTools) .setUnlocalizedName("pickaxeAluminium") .setTextureName("aluminiummod aluminium_pickaxe"); GameRegistry.registerItem(pickaxeAluminium, "pickaxeAluminium"); axeAluminium = new AluminiumAxe(ALUMINIUM) .setCreativeTab(CreativeTabs.tabTools) .setUnlocalizedName("axeAluminium") .setTextureName("aluminiummod aluminium_axe"); GameRegistry.registerItem(axeAluminium, "axeAluminium"); hoeAluminium = new ItemHoe(ALUMINIUM) .setCreativeTab(CreativeTabs.tabTools) .setUnlocalizedName("hoeAluminium") .setTextureName("aluminiummod aluminium_hoe"); GameRegistry.registerItem(hoeAluminium, "hoeAluminium"); toolAluminium = new AluminiumTool(ALUMINIUM) .setCreativeTab(CreativeTabs.tabTools) .setUnlocalizedName("toolAluminium") .setTextureName("aluminiummod aluminium_tool"); GameRegistry.registerItem(toolAluminium, "toolAluminium"); } } AluminiumPickaxe.java package tutorial.aluminiummod; import net.minecraft.item.ItemPickaxe; public class AluminiumPickaxe extends ItemPickaxe { public AluminiumPickaxe(ToolMaterial toolMaterial) { super(toolMaterial); } } AluminiumAxe.java package tutorial.aluminiummod; import net.minecraft.item.ItemAxe; public class AluminiumAxe extends ItemAxe { public AluminiumAxe(ToolMaterial toolMaterial) { super(toolMaterial); } } AluminiumTool.java package tutorial.aluminiummod; import java.util.Set; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemTool; import com.google.common.collect.Sets; public class AluminiumTool extends ItemTool { private static final Set canHarvestBlock = Sets.newHashSet(new Block[] { Blocks.diamond_block }); public AluminiumTool(ToolMaterial toolMaterial) { super(0.0F, toolMaterial, canHarvestBlock); } @Override public boolean func_150897_b(Block block) { return true; } @Override public float func_150893_a(ItemStack itemStack, Block block) { if (block.getMaterial() == Material.rock) { return this.efficiencyOnProperMaterial; } return super.func_150893_a(itemStack, block); } // ここにItemHoeのプログラムを張り付ければ、クワの効果も得られる。 } 解説 ToolMaterial ツールの性質を保持するためのenum。 ToolMaterial setRepairItem(ItemStack stack) 金床で修繕するための素材を設定するメソッド。 EnumHelper ToolMaterial addToolMaterial(String name, int harvestLevel, int maxUses, float efficiency, float damage, int enchantability) 新しくツールマテリアルを追加するためのメソッド。 引数は順に、ツールマテリアルの名前・回収レベル・最大耐久値・採掘速度・攻撃に使用したときのダメージ倍率・エンチャントの付きやすさ。 ダイヤモンドは、3, 1561, 8.0F, 3.0F, 10 Item public boolean func_150897_b(Block block) 引数のブロックを回収できるかを返す。 public float func_150893_a(ItemStack itemStack, Block block) 採掘速度を返す。 ItemToolでは、コンストラクタの第3引数のSetに登録されているブロックのときに適性時採掘速度を返している。 使用例 オファレンの万能ツールを追加している部分 +オファレンMOD OfalenModCore.java package nahama.ofalenmod; /*略*/ /** @author Akasata Nahama */ @Mod(modid = OfalenModCore.MODID, name = OfalenModCore.MODNAME, version = OfalenModCore.VERSION) public class OfalenModCore { public static final String MODID = "OfalenMod"; public static final String MODNAME = "Ofalen Mod"; public static final String VERSION = "[1.7.10]1.0.0"; /*略*/ /** 最初に行われる処理。アイテム・ブロックの追加などを行う */ @EventHandler public void preInit(FMLPreInitializationEvent event) { /*略*/ // アイテムを設定するメソッドを実行 OfalenModItemCore.registerItem(); /*略*/ } /*略*/ } OfalenModItemCore.java package nahama.ofalenmod.core; /*略*/ public class OfalenModItemCore { /*略*/ public static Item toolPerfectOfalen; /*略*/ /**アイテムを設定する*/ public static void registerItem () { /*略*/ toolPerfectOfalen = new OfalenPerfectTool(OfalenModMaterialCore.PERFECTT) .setUnlocalizedName("toolPerfectOfalen") .setTextureName("ofalenmod ofalen_perfect_tool"); GameRegistry.registerItem(toolPerfectOfalen, "toolPerfectOfalen"); /*略*/ } } OfalenPerfectTool.java package nahama.ofalenmod.item.tool; import nahama.ofalenmod.OfalenModCore; import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.EnumAction; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemTool; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.UseHoeEvent; import cpw.mods.fml.common.eventhandler.Event.Result; public class OfalenPerfectTool extends ItemTool { public OfalenPerfectTool(ToolMaterial material) { super(0.0F, material, null); this.setCreativeTab(OfalenModCore.tabOfalen); } @Override public boolean func_150897_b(Block block) { return true; } /**採掘速度の設定*/ @Override public float func_150893_a(ItemStack itemStack, Block block) { //他のツールでは適正ブロックの判定をするが、ここではすべてに適正採掘速度を適用する return this.efficiencyOnProperMaterial; } //クワの処理 /**アイテムが使われた(右クリック)時の処理*/ @Override public boolean onItemUse(ItemStack itemStack, EntityPlayer entityPlayer, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { //プレイヤーが編集不可ならば if (!entityPlayer.canPlayerEdit(x, y, z, side, itemStack)) { //falseを返す return false; } else { //eventの登録 UseHoeEvent event = new UseHoeEvent(entityPlayer, itemStack, world, x, y, z); if (MinecraftForge.EVENT_BUS.post(event)) { return false; } if (event.getResult() == Result.ALLOW) { //ダメージを与える itemStack.damageItem(1, entityPlayer); return true; } //右クリックされたブロックを取得する Block block = world.getBlock(x, y, z); //右クリックされたブロックの上が空気ブロックで、右クリックされたブロックが草ブロックか土ブロックならば if (side != 0 world.getBlock(x, y + 1, z).isAir(world, x, y + 1, z) (block == Blocks.grass || block == Blocks.dirt)) { Block block1 = Blocks.farmland; //音を鳴らす world.playSoundEffect((double)((float)x + 0.5F), (double)((float)y + 0.5F), (double)((float)z + 0.5F), block1.stepSound.getStepResourcePath(), (block1.stepSound.getVolume() + 1.0F) / 2.0F, block1.stepSound.getPitch() * 0.8F); //クライアント側では何もせず if (world.isRemote) { return true; //サーバー側では } else { //ブロックを置き換えて world.setBlock(x, y, z, block1); //ダメージを与える itemStack.damageItem(1, entityPlayer); return true; } } else { return false; } } } //剣の処理 /**Entityを叩いたときの処理。ItemToolでは2のダメージをアイテムに与えるが、剣と同じように1与えるようにする。*/ @Override public boolean hitEntity(ItemStack itemStack, EntityLivingBase target, EntityLivingBase player) { itemStack.damageItem(1, player); return true; } @Override public EnumAction getItemUseAction(ItemStack itemStack) { return EnumAction.block; } @Override public int getMaxItemUseDuration(ItemStack itemStack) { return 72000; } @Override public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) { player.setItemInUse(itemStack, this.getMaxItemUseDuration(itemStack)); return itemStack; } } Tips ここで、実装したツールに常時エンチャントを追加する方法を紹介する。 コードは、匠Craftの匠式ツールや対地雷ツールを参考にしていただきたい。 Itemをオーバーライドしたクラスに、以下のメソッドを追加する。 //アイテムに対して毎ティック呼ばれるメソッド。 //引数は、itemStack(アイテムと個数、メタデータ等をまとめたもの),world(ワールド),entity(持っているEntity),slot(現在あるスロット番号),isHeld(手持ちかどうか) public void onUpdate(ItemStack itemStack, World world, Entity entity, int slot, boolean isHeld) { //エンチャントされていないかどうかを確認する。 if (itemStack.isItemEnchanted() == false) { //エンチャントを付与する。引数はエンチャント,レベルの順に追加する。 itemStack.addEnchantment(TEnchantment.enchantmentMS, 1); } } これにより、常時効果を発揮するエンチャントや手に持ってるときに効果を発揮するものなどを実装できる。 コメント この項目に関する質問などをどうぞ。 アルミニウムツールが耐久値を保持しないのですが、、 - 名無しさん 2015-08-22 17 58 35 まだ編集が終わっていません。原因を調べ、テンプレートを使用して修正します。報告ありがとうございます - 赤砂蛇凪浜 2015-08-23 08 51 21 編集完了しましたが、こちらの環境では特に問題はありませんでした。解決できていない場合はもう一度コメントしてくださるとありがたいです。 - 赤砂蛇凪浜 2015-09-04 09 17 25 質問です。黄昏の森のstealeafでできるツールのようにもともとエンチャントがつくツールはどのようなコードにすればいいのでしょうか? - 名無しさん 2017-01-07 16 19 06 解決しました。 - 名無しさん 2017-01-22 10 08 12 方法を教えていただけませんか? - あるふぁ 2017-05-20 16 26 48 匠craftの「地雷除去」のように、新しいエンチャントをつける方法を解説していただけると助かります。 - あるふぁ 2017-05-20 18 53 49 追加いたしました、ご確認ください。 - Tom Kate 2017-05-22 19 34 58 すみません、伝わりにくかったと思います…匠craftの「地雷除去」のように、新しいエンチャントの”種類”を作る方法でした。 - あるふぁ 2017-05-23 20 15 17 エンチャント「追加」ですか。申し訳ありません。追加予定はありますがすぐにはできないと思いますのでご了承ください。 - Tom Kate 2017-05-23 20 26 53 どんなブロックでもクリエイティブの時のように即時破壊し、ドロップさせるツールは作れますか? - あるふぁ 2017-05-31 19 29 48 通常破壊可能なブロックを採掘したいのであれば、比較的容易に作れます。AluminiumTool.javaでの実装を応用し、func_150893_aで常にefficiencyOnProperMaterialを返せば、通常破壊可能なすべてのブロックを、適正採掘速度で破壊できます。さらに、EnumHelper.addToolMaterialの第四引数に大きな値を渡すことで、クリエイティブ以上の採掘速度を出すことが可能です。(1500以上であれば、通常時は黒曜石を最大速度で破壊できます。)岩盤のような破壊不可ブロックは、干渉できるイベントが見当たらないため、左クリック時に破壊することは簡単ではないと思います。アイテム使用時に呼ばれるonItemUseメソッドをオーバーライドすれば、右クリック時に岩盤を破壊し、ドロップさせるといった処理は可能です。 - 赤砂蛇凪浜 2017-06-01 17 50 09 ありがとうございます!実は返信が来る前に試行錯誤して解決してしまったのですが、参考になりました。 - あるふぁ 2017-06-01 18 38 38 こちらも「防具の追加」同様に、金床で修理することが出来ません。 - mod初心者 2017-06-17 12 48 38 ご指摘ありがとうございます。原因は「防具の追加」と同様です。修正しておきました。 - 赤砂蛇凪浜 2017-06-17 16 52 20 解決しました!ありがとうございました! - mod初心者 2017-06-19 17 19 34 参考になりました、ありがとうございます - 名無しさん 2017-08-04 19 14 19 名前
https://w.atwiki.jp/sangokushi11/pages/2684.html
タイトルにある通り、体験版チュートリアルの成都攻略戦で本気出したらどれだけ領土拡大できるのか試してみよう!! 以下、5回プレイした中での最高記録(成都陥落時、成都含めて自城数27城)における大まかな手筋を載せておきます。 ◇プレイ条件 制限ターン(360日=36ターン)内にどれだけ多くの城を落とせるか試す 最後にゲームオーバー(=成都を落とすという本来の目的を果たさず終わる)は美学に反するので認めない。必ず成都も落とす。 後は「どんな手段を使っても構いません(by龐統)」 ◇攻略手順 (1)360~300日頃まで 初手でやること:人材探索→尹黙を劉備で確保(必ずといっていいほど舌戦になるので勝つ) 軍団解体・軍師を諸葛亮に変更・官職剥ぎ取り 諸葛亮・趙雲・馬謖・麋竺・張飛・蒋琬の6名を梓潼に呼寄。関羽は史実通り?呼び寄せません 荊南から前線(漢津・夏口港)へ兵力物資を全部輸送。武陵・零陵の物資は漢津港へ、長沙・桂陽の物資は 夏口港へ。 (劉度などの雑魚で輸送。ただし零陵と武陵には兵1と僅かばかりの兵糧を残す。理由は後述) 江夏・江陵で工房建設。政治高いやつを遠慮なく使う 江夏から3部隊・江陵から1部隊出陣。江夏の3部隊は目的地をとりあえず許昌に指定、江陵の部隊には弩を持たせ 陸路で中廬港を狙わせる(襄陽は後で落とすのでスルー)。港を落とした後は上庸方面を占領しつつ宛に 向かわせる算段。兵力は各2000、金は部隊の建設スピードに応じて1600~2000程度 (拠点の金持っていきすぎると後で兵器作る金までなくなるので程々に)、兵糧は360日行軍しきれるように 7200持たせる。一日あたりの部隊の兵糧消費量ってあまり厳密には気にしてませんでしたが、このプレイで初めて 知りました。どうやら兵力の十分の一にあたる数字が毎ターン消費されていくようです。 例によって単位ついてないんでどういう数字かよくわからんですが(笑) そもそも「兵力は兵数ではありません(キリッ)」な世界だしなあ。 さらに漢津港に向けて孫尚香で兵力物資を適宜輸送。 建寧に居る高定ら無駄に野望の高そうな在野武将4名に登用をかける(独立阻止)。 2ターン目: 梓潼で人材探索→馬忠を全力登用。 荊南に点在する港に付近の雑魚将を派遣→次ターン以降で前線に輸送 後は梓潼の武将で適当に登用(張嶷を優先)&尹黙に一人で衝車を造ってもらう 3ターン目: 前のターンでとった馬忠を全力で零陵に送る。後はもう読めると思いますが零陵から雲南を占領しに行きます。 時間制限的にはギリギリ。踏破持ち万歳。 梓潼から輸送隊(兵7001、金2000、米23900・衝車1台・弩2000)を剣閣へ向けて送り出す。途中にある葭萌関も ついでに占領しておく。この物資は漢中&長安攻略に使います。張嶷を優先盗用するのも、衝車を率いて 梓潼-漢中間の桟道を無傷で渡ってもらうためです。サポート役の弩2000には犠牲が出るけど軍楽台立てるため の部隊なので問題なし。 荊南に居残ってるやつの中から適当な将を漢津に呼寄。ここと夏口から出撃します 4ターン目~: 梓潼は全力で流言&盗用タイム。馬一族は流言せんでも引き抜けるので早めに引っこ抜く。 内政なんてものは300日切った後から頑張っても余裕で間に合います。 荊州方面は漢津から順次出陣。狙うのは湖陽港。孫尚香さんを楼船に載せて出せば割とすぐ片付きます。 江陵は工房ができる頃なので衝車を製造。襄陽は衝車一台(すぐ技巧研究して木獣に化けますが)で落とします。 後は…行動力が余ってきたら武陵の兵1で適当に巫県港と永安を落としに行かせます。永安は近いのでもっと後回し でも良かったかも。 (2)300日~150日頃まで(ここらへんから色々適当になってきます 適当にしなければ後1城くらいいける…かなあ?) ◇この期間内にやっておきたいこと ①厳顔じいちゃん&江州の盗用 乱数神の機嫌が悪いと太守が交代してしまい、おじいちゃんは引き抜けても江州がついてこないことがあります。そうなったら やり直し。 ②江州から適当な将一名に兵5000ほど与えて建寧を占領に行かせる おじいちゃんを引き抜いたときに運よくおまけがついてきた場合はそのままおまけに行かせますが、 おまけが居ない場合は梓潼から適当な人を派遣。 ③衝車が出来上がり次第、梓潼から衝車をもう一台+槍2000に兵7000、あとこれがずっと行軍できるだけの金と米を剣閣に輸送。 この兵を率いる組(面子は適当でOK)には安定を落としに行ってもらいます。 ④漢中を攻略できたら、わずかに残っている負傷兵と物資を輸送隊に仕立てて天水と武威を占領しに行かせる ⑤梓潼は江州&成都に流言流しまくりつつ隙を見て内政 劉備軍はチートなので最低限の軍備でいいです。流言してうまく建設部隊の将を引き抜ければ当然寝返った部隊を叩くために 敵出陣→敵が出陣してる隙にさらに流言→迎撃部隊の将も引き抜く(ミイラ取りがミイラ的な)のコンボでさらに相手弱体化。 大体150日くらいを目安に出陣。井蘭含め兵5000×5部隊あれば十分落とせます。何せチート劉備軍ですので。 ⑥漢津・夏口からは順次出陣&基本的に「通りすがりに火攻め」で耐久を減らしつつ進軍する 耐久回復されてもアレなので一部隊は城前に残しますが、基本立ち止まって一つの城を落としてから次の城へ、 ってやってると色々効率悪いです。初手で出した先発部隊は許昌・陳留もスルーして一気に小沛へ。 ⑦技巧は木獣開発→熟練兵→難所行軍→神火計の順に全力で可及的速やかに開発。 まあ難所行軍は無くても何とかならなくはないんですが、建寧に向かわせる武将の質によっては桟道で壊滅しかねんかもな と思ったので一応。このへんまだ研究不足です。これ以上研究する気も起きませんが。 ⑧江夏の衝車(といっても開発が終わるころには木獣になってますが)は完成し次第関興に率いさせて、一人で汝南を落としに 行かせる。関羽は夏口港から適当に出陣。馬良には関興が出陣するのに必要な米を売買させ、次ターンで梓潼に呼寄。 (3)150日~10日まで ◇この期間で気を付けたいこと ①漢津港から出した部隊の振り分け 結局自分はこれが下手なんだと思います。。基本的に漢津港から出した部隊には、湖陽港から宛方面を経由して洛陽&陳留で 二手に分けるルートをとらせたんですが、振り分ける時にどうしても迷いが出てしまう…感覚的には洛陽の方は虎牢関に兵が 1000しかいないこともあり、残り90日前後のところで3~4部隊くらい差し向けておければ十分間に合う気がします。 この辺もっときっちりやれる人はやれるんだろうけど、もう計算するのとかめんどくてやりきれませんでした… ②夏口港から出した後発部隊の進軍速度 夏口港は漢津と比べ距離的に物資が集う時期が遅いので、どうしても出陣の時期も遅れがち。 ここから出した部隊には基本的に新野→許昌→陳留ルートをとらせたんですが、行軍が遅れれば陳留まで行くのがかなり厳しく なるし、かといって通りすがりにしっかり燃やしていかなかったら新野や許昌が落ちないし、でかなり悩まされました。 あるいは若干余り気味だった漢津港からの部隊を一部合流させてもよかったかもしれません。 ③陳留は平野部にあることを利用してとことん通りすがりに攻撃 まともに足止めてる暇はないので、移動しながら火球設置→次に移動してきた部隊で着火、といった感じに適当な攻撃で 落とします。幸いにも耐久もそんなにないし、兵は4000しかいないし、火球設置場所には困らないしで、このプレイでは 一番落としやすい都市かもしれません。 ④小沛は江夏からの先発3部隊のみで落とす ていうか彼ら以外小沛には間に合いません、本当に(苦笑)頑張って濮陽です。 完全に途中にある全ての都市をスルーして行軍に集中すればあるいは下邳には行けるかもですが…その場合本当に色々 ギリギリになりそう。下手すると途中にある都市を落とし切れなくなる可能性も。 ⑤濮陽到着までに神火計を開発しておく 城の南側に二箇所ほど火球設置可能な場所がありますが、うち一箇所は河に阻まれて隣接できないので、神火計がないと 火矢以外に着火手段がありません。火矢が失敗しなければ問題ないんですが、乱数神というやつは本当に空気を読んでくれない ものなので、そういうときに限って連続で失敗したりするんです。…ええ、4回目はそれで濮陽落とし切れませんでした(涙) 濮陽以外の場所でも、こういう速攻が必要なプレイの場合神火計は本当に頼もしい存在です。 ⑥江陵からの木獣部隊は宛へのトドメに回す&途中の移動は輸送隊で 襄陽から湖陽港までは輸送隊にして移動すると、少しだけですが移動時間が縮みます。 しかし折角作っても木獣部隊、出陣時期が遅いせいでどうしても今一つ活用しきれんなあ…いっそ梓潼方面以外は兵器 作らないほうが良かったかもしれません。ここで今書くまでその発想完全に抜け落ちてたけど。 ◇まとめとか気づいたこととか ・濮陽と雲南は本当にギリギリ(10日前)に落とすことになりましたが、一応大体こんなやり方で成都含めてチュートリアルで 27都市を手中に収めました。長安洛陽に加え許昌も落としたので献帝もゲット、ほぼ中原回復したといっても差し支えない 感じです。 劉備「やった!やった、成都を落としたぞ!!」…いや成都以外にも色々落としてますから。すごい血の滲むような(超無駄な) 努力しましたから。 ・ところでひとつ気になったことが…「何故、どうして寿春には進軍できないんだ!!」 何故だか、進軍指示は与えられるのに実際には見えない壁のようなものに阻まれて侵入できません。他の都市では見られない (といっても下邳や河北方面にはプレイ中辿り着けなかったのでそのへんは未確認ですが)&チュートリアルでのみ見られる現象 なのですが、果たしてバグなのか仕様なのか。。入れるんだったら江夏から部隊出して寿春→小沛→下邳のルートが使えたのになあ… ・しかしまあ、敵が活動しないってだけで一年でこんなにも侵攻できちゃうもんなんですねえ。冷静に考えると敵が出てこないって それだけで物足りませんけど。まあ期限つきだったからこそ楽しめた(…のか?色々ツラかった気も)んでしょうなあ。 それでは今回はこの辺で。 ◇コメントございましたらこちらにお願い致します 面白いですね! ノブヤボ・革新のチャレンジモードで全国統一みたいな感じかな? -- 名無しさん (2013-06-10 13 57 17) 12はクソゲー、PK待ち。 11PKの方がずっといい -- 名無しさん (2013-06-13 14 24 37) 寿春は廬江経由から進軍できますよ。PCPK PS2PKで確認しました。面白そうなので挑戦してみます。 -- 名無しさん (2013-06-20 09 16 54) もちろん国号は漢だよね -- 名無しさん (2013-06-25 20 45 44) 自分も、もはや世は13PKの時代とはいえ、まだまだ11好きですから、 -- 名無しさん (2018-05-27 07 58 17) 自分も、もはや世は14の時代とはいえ、まだまだ11好きですから -- 名無しさん (2019-09-05 17 00 07) スイッチとかも三国志あんのかな -- 名無しさん (2020-08-08 14 56 19) 下邳は多分落とせそう。漢津からの第一陣に馬を一部隊混ぜて追いかけさせると確実。あと、難所行軍は取らずに火計系に技巧は全振りしたほうがいいかも。 -- 名無しさん (2021-09-02 20 00 53) 名前 コメント
https://w.atwiki.jp/geck/pages/22.html
今回は敵の作成および配置と簡単なスクリプトを使ってみましょう。 簡単な試射場を作ってみようとおもいます。 まず前回学んだ方法を応用して、このような別の部屋マップを用意しておいてください。 1.新しい敵を作ろう 敵やNPCのキャラクターは、ObjectWindowのActorカテゴリの中にはいっています。 また、実際にダンジョンなどに配置されているのは、敵であればCreatureカテゴリの中にあるものです。 Lvl~ というEDIT ID のものを使ってみます。 同じ敵でもいっぱい種類がある>< というかたは、とりあえずcountタグの数値が高いものを選んどけばなんとかなります。 では、今回はLvlSupermutantGun を右クリックのEditで使いまわしてみましょう。 1.まずIDにわかりやすい名前を入れる(aaTestMan01とする) 2.template Data にあるUse Traits,{Use Inventry)のチェックを外す template data は ActorBaseのキャラデータからチェックを入れたデータを引き継ぐためのものです。 これだけやったらOK。 2.敵を配置してみよう と太字にしてみましたが、家具などと一緒でドラッグして配置するだけです。矢印が向きになっています。 3.スイッチを置いておこう WorldObjectカテゴリのActivatorから適当なswichをEditし、今はそのまま配置します。 4.スクリプトを使ってみよう まずスクリプトを物や人に使う場合、その物や人にReference IDという名前をつけなくてはなりません。同じオブジェクトを複数配置した場合、どれに対して使っているのかわからなくなるからです。 CellViewから右クリックし、Persistent Referenceにチェックをいれ、Reference IDを名付けます。今回の場合、aaTestMan01にTest001と名づけました。 ここから本番です。先ほどのスイッチをObject Windowから右クリックし、Scriptのわきにある...を押してください。ScriptEditウィンドウが開いたはずです。 Script New と選択し、書き始めます。 内容は、 ScriptName TestManScript short a Begin OnActivate IF a == 0 Test001.Enable set a to 1 Else Test001.resurrect 1 Test001.DIsable set a to 0 EndIf End と打ってみましょう。完成したらsaveをクリック。 保存確認なぞありませんので注意。 ScriptEditを閉じ、ActivatorのScriptに先ほどの名前(TestManScript)を選択し、完成です。 これで、スイッチをオンにすると生きたSミュータントが出現し、オフにすると生死問わず消える試射室の完成です。 (´・ω・) ・・・ (´・ω・) カワイソス だが元通り・・・っ