[技術共有] トピックを立てるまでもないライブラリとかコードとかの公開所

返信する

:
不正プログラムによるアクセスを防ぐため、reCaptcha 認証コードの入力を強制しています。表示されている 2 つのワードをテキストフィールドにご入力ください。

BBCode: OFF
スマイリー: OFF
トピックのレビュー
   

展開ビュー トピックのレビュー: [技術共有] トピックを立てるまでもないライブラリとかコードとかの公開所

spigot-api:1.11.2-R0.1-SNAPSHOTのPlayerInteractEventでハマった

投稿記事 by tsuttsu305 » 2017年8月12日(土) 00:55

4年ぐらい前に作ったBukkitPluginをSpigot用に書き直したときにハマったメモ

PlayerInteractEventを使うときにメインのHANDと反対のHANDの二回Eventが呼ばれる…

ブロックを右クリックした時になんかしたいときのEventHandlerの書き方メモ…
コード: 全て選択
@EventHandler
    public void onPlayerRightClick(PlayerInteractEvent event) {
        if (event.getHand() != EquipmentSlot.HAND) return;
        if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return;
    }


Re: [技術共有] トピックを立てるまでもないライブラリとかコードとかの公開所

投稿記事 by MG36 » 2017年5月06日(土) 10:44

1.8から廃止されたAdvancedModelLoaderを1.10以降用に対応させたライブラリです。
インポート先をこちらのライブラリ内に指定すれば1.7.10と同じようにobjモデル等が読み込めます。

<使用方法>
1..zipを解凍する。
2.中のobjmodelフォルダを、開発環境/src/main/java内に配置する。
3.モデル使用時にライブラリ内のAdvancedModelLoaderおよびIModelCustom等をインポートして使用する。
添付ファイル
AdvancedModelLoader-1.10.2.zip
(15.46 KiB) ダウンロード数: 7 回
AdvancedModelLoader-1.11.2.zip
(15.46 KiB) ダウンロード数: 5 回

Re: [技術共有] トピックを立てるまでもないライブラリとかコードとかの公開所

投稿記事 by zyando123 » 2017年4月08日(土) 15:50

.obj(WavefrontObject)形式のファイルを読み込み、VBOで描画するやつです。
利用条件などは一つ上のものと同じです。

source.zip
(4.62 KiB) ダウンロード数: 7 回

Re: [技術共有] トピックを立てるまでもないライブラリとかコードとかの公開所

投稿記事 by zyando123 » 2017年4月01日(土) 00:25

InputStreamからテクスチャを生成するやつです。
GIFアニメーションも読み込めますが、アニメーションを進めるのが適当な作りなのでTextureAnimationのupdataらへんを改良してください。
ライセンスなどはないので煮るなり焼くなりどうぞ。

textureloader.zip
(3.14 KiB) ダウンロード数: 4 回


使用例(テクスチャのパスは拡張子判別とMapに登録することにしか使わないので、実際に存在しないパスでも問題ないです)
コード: 全て選択
ITexture texture = TextureLoader.instance.getTexture(inputStream, texturePath);
texture.bindTexture();

[1.7.10]EntityFallingBlockを破壊&入手できるように

投稿記事 by 新人もっだー » 2017年3月29日(水) 15:12

備忘録。
1.7.10でのEntityFallingBlockの改良。ご自由に再利用ください。
*EntityFallingBreakableBlock.java
コード: 全て選択
import net.minecraft.block.Block;
import net.minecraft.entity.item.EntityFallingBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;

public class EntityFallingBreakableBlock extends EntityFallingBlock{

   public EntityFallingBreakableBlock(World world)
    { super(world); }

   public EntityFallingBreakableBlock(World world, double x, double y, double z, Block block)
   { super(world, x, y, z, block); }

   public EntityFallingBreakableBlock(World world, double x, double y, double z, Block block, int meta)
   { super(world, x, y, z, block, meta); }

   public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_)
    {
      
      if(p_70097_1_.getEntity() == null)
         return false;
      
        if (!this.worldObj.isRemote && !this.isDead)
        {
            if(this.isEntityInvulnerable())//Mobからでないならreturn。
                return false;

            else if(!this.onGround)//二重取得防止(?)
            {

               this.setDead();
               this.entityDropItem(new ItemStack(this.func_145805_f(), 1, this.field_145814_a), 0);
               p_70097_1_.getEntity().playSound(this.func_145805_f().stepSound.getBreakSound(), this.func_145805_f().stepSound.getVolume(), this.func_145805_f().stepSound.getPitch());
                return true;
            }
            else
               return false;
        }
        else
            return true;
    }

}


*BlockFallingBreakable
コード: 全て選択
import java.util.Random;

import eggpower.entity.EntityFallingBreakableBlock;
import net.minecraft.block.BlockFalling;
import net.minecraft.block.material.Material;
import net.minecraft.world.World;

public class BlockFallingBreakable extends BlockFalling {

   public BlockFallingBreakable(Material material) {
      super(material);
   }

   @Override
   public void updateTick(World p_149674_1_, int p_149674_2_, int p_149674_3_, int p_149674_4_, Random p_149674_5_)
    {
        if (!p_149674_1_.isRemote)
            this.update(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_);
    }

    private void update(World p_149830_1_, int p_149830_2_, int p_149830_3_, int p_149830_4_)//privateの為、func_149830_mの再実装&EntityFallingBreakableBlockへの変更
    {
        if (func_149831_e(p_149830_1_, p_149830_2_, p_149830_3_ - 1, p_149830_4_) && p_149830_3_ >= 0)
        {
            byte b0 = 32;

            if (!fallInstantly && p_149830_1_.checkChunksExist(p_149830_2_ - b0, p_149830_3_ - b0, p_149830_4_ - b0, p_149830_2_ + b0, p_149830_3_ + b0, p_149830_4_ + b0))
            {
                if (!p_149830_1_.isRemote)
                {
                   EntityFallingBreakableBlock entityfallingblock = new EntityFallingBreakableBlock(p_149830_1_, (double)((float)p_149830_2_ + 0.5F), (double)((float)p_149830_3_ + 0.5F), (double)((float)p_149830_4_ + 0.5F), this, p_149830_1_.getBlockMetadata(p_149830_2_, p_149830_3_, p_149830_4_));
                    this.func_149829_a(entityfallingblock);
                    p_149830_1_.spawnEntityInWorld(entityfallingblock);
                }
            }
            else
            {
                p_149830_1_.setBlockToAir(p_149830_2_, p_149830_3_, p_149830_4_);

                while (func_149831_e(p_149830_1_, p_149830_2_, p_149830_3_ - 1, p_149830_4_) && p_149830_3_ > 0)
                {
                    --p_149830_3_;
                }

                if (p_149830_3_ > 0)
                {
                    p_149830_1_.setBlock(p_149830_2_, p_149830_3_, p_149830_4_, this);
                }
            }
        }
    }

   @Override
    public int tickRate(World p_149738_1_)
    {
        return 1;//落ちるのが早くなる。(気持ち程度)
    }

}

Re: [技術共有] トピックを立てるまでもないライブラリとかコードとかの公開所

投稿記事 by gatya1129 » 2016年8月25日(木) 14:05

1.7.10の自分の環境で
コード: 全て選択
world.destroyBlock()
が使えなかったので代用品のメモを。

ライセンス?いらないです。
煮るなり焼くなり食べるなりしてください。

コード: 全て選択
world.func147480_a()
でできました。

なお、引数は以下のようになっています。
コード: 全て選択
第一引数:壊すブロックのx座標(int)
第二引数:   〃   y座標(int)
第三引数:   〃   z座標(int)
第四引数:壊したブロックをドロップさせるか(boolean)

Re: [技術共有] トピックを立てるまでもないライブラリとかコードとかの公開所

投稿記事 by smn » 2015年4月11日(土) 14:22

Scala による modding のすすめ with Eclipse

投稿記事 by GreenStone » 2014年12月05日(金) 00:19

やってみたらできたので、手順を公開します。
  1. Scala IDE for Eclipse の導入
  2. Forge のセットアップ
    コード: 全て選択
    ./gradlew setupDecompWorkspace eclipse
  3. build.gradle, .project, .classpath の編集
    編集手順
    build.gradle
    apply plugin: 'forge' の前の行に apply plugin: 'scala'

    どこかの行に
    sourceSets.main.scala.srcDir "src/main/java"
    sourceSets.main.java.srcDirs = []

    .project
    <nature>org.eclipse.jdt.core.javanature</nature>とあるので、その前の行に<nature>org.scala-ide.sdt.core.scalanature</nature>
    <name>org.eclipse.jdt.core.javabuilder</name>とあるので、書き換え<name>org.scala-ide.sdt.core.scalabuilder</name>

    .classpath
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER" とあるので、その前の行に<classpathentry kind="con" path="org.scala-\
    ide.sdt.launching.SCALA_CONTAINER"/>

*nix, OS X の方向け
patch.sh
コード: 全て選択
#!/bin/sh
cat $0 | awk 'NR>=4 {print}' | ed -s
return $?
e .project
/<nature>/i
                <nature>org.scala-ide.sdt.core.scalanature</nature>
.
/<name>org.eclipse.jdt.core.javabuilder/c
                        <name>org.scala-ide.sdt.core.scalabuilder</name>
.
w
e .classpath
/JRE_CONTAINER/y
/JRE_CONTAINER/s/org\.eclipse\.jdt\.launching\.JRE_CONTAINER/org.scala-ide.sdt.launching.SCALA_CONTAINER/
x
w
e build.gradle
/apply plugin: 'forge'/i
apply plugin: 'scala'
.
//a

sourceSets.main.scala.srcDir "src/main/java"
sourceSets.main.java.srcDirs = []
.
wq

Forge による Server-side Mod のすすめ

投稿記事 by GreenStone » 2014年12月04日(木) 18:33

Minecraft Forge を利用したサーバーサイドModがあまりにも少ないので。
コマンドの追加程度ならば、クライアント側への導入の必要のないModが作れます。

Forgeでは、Modの構成とサーバー側かクライアント側かという情報から、プレイヤーのログインをさせるさせないを決定する処理があります。
例として、ExampleMod.java がありますが、素の ExampleMod はサーバーに入れると、プレイヤーがログインできません。
そこで、メソッドを追加します。
コード: 全て選択
   @NetworkCheckHandler
   public boolean accept(Map<String, String>modList, Side side) {
      return true;
   }

意味は、『Modが入っているのがクライアント側かサーバー側かに関わらず、ExampleModはクライアントのログインを許可する』といった感じです。
ソースコード
ExampleMod.java
コード: 全て選択
package com.example.examplemod;

import 略

@Mod(modid = "examplemod", version = "1.0")
public class ExampleMod
{

   @EventHandler
   public void init(FMLInitializationEvent event) {}

   @NetworkCheckHandler
   public boolean accept(Map<String, String>modList, Side side) {
      return true;
   }
}

ExampleMod.scala (Scala版)
コード: 全て選択
package com.example.examplemod;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.network.NetworkCheckHandler;
import cpw.mods.fml.relauncher.Side;

@Mod(modid = "examplemod", version = "1.0")
class ExampleMod
{

  @EventHandler
  def init(event: FMLInitializationEvent): Unit = {}

  @NetworkCheckHandler
  def accept(modList: java.util.Map[String, String], side: Side): Boolean = true;
}


もっと広がれサーバーサイド、というわけで、参考にどうぞ。バージョン1.7以降です

Re: [技術共有] トピックを立てるまでもないライブラリとかコードとかの公開所

投稿記事 by redolyr 75724 » 2014年10月18日(土) 15:06

NBTとHashMap管理でレシピを追加する

Forge Mod Loader Ver: 6.4.3.883
Minecraft Forge Ver: 9.11.0.883

ライセンス(?): 書き換えが無い場合、パッケージの移動を禁止します。

コード: 全て選択
package redolyr.library.minecraft;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import cpw.mods.fml.common.registry.GameRegistry;

/**
 *
 * Minecraft Version is: 1.6.4
 *
 * Licence: Don't replace of package.
 *
 * @author redolyr
 *
 */
public class CraftingNBTManager
{
   public static final CraftingNBTManager instance = new CraftingNBTManager();
   
   private CraftingNBTManager() {}
   
   public void writeRecipeToNBT(NBTTagCompound nbtTagCompound, Map<ItemStack, ItemStack[]> recipes)
   {
      NBTTagList nbtTagList = new NBTTagList();
      {
         NBTTagCompound nbtTagCompounds = new NBTTagCompound();
         ItemStack exportItemStack = null;
         ItemStack[] importItemStacks = new ItemStack[9];
         
         Iterator<ItemStack> itemStackIterator = recipes.keySet().iterator();
         while (itemStackIterator.hasNext())
         {
            exportItemStack = itemStackIterator.next();
            importItemStacks = recipes.get(exportItemStack);
         }
         
         NBTTagList importList = new NBTTagList();
         for (int len = 0; len < importItemStacks.length; ++len)
         {
            ItemStack itemStack = importItemStacks[len];
            if (itemStack != null) importList.appendTag(itemStack.writeToNBT(new NBTTagCompound()));
            else importList.appendTag(new NBTTagCompound());
         }
         nbtTagCompounds.setTag("Import", importList);
         nbtTagCompounds.setTag("Export", exportItemStack != null ? exportItemStack.writeToNBT(new NBTTagCompound()) : new NBTTagCompound());
         nbtTagList.appendTag(nbtTagCompounds);
      }
      nbtTagCompound.setTag("Recipes", nbtTagList);
   }
   
   public Map<ItemStack, ItemStack[]> readRecipeFromNBT(NBTTagCompound nbtTagCompound)
   {
      Map<ItemStack, ItemStack[]> recipes = new HashMap<ItemStack, ItemStack[]>();
      NBTTagList nbtTagList = nbtTagCompound.getTagList("Recipes");
      for (int count = 0; count < nbtTagList.tagCount(); ++count)
      {
         NBTTagCompound nbtTagCompounds = (NBTTagCompound) nbtTagList.tagAt(count);
         ItemStack[] recipeItemStacks = new ItemStack[9];
         NBTTagList importList = nbtTagCompounds.getTagList("Import");
         ItemStack exportItemStack = ItemStack.loadItemStackFromNBT((NBTTagCompound) nbtTagCompounds.getTag("Export"));
         for (int len = 0; len < importList.tagCount(); ++len) recipeItemStacks[len] = ItemStack.loadItemStackFromNBT((NBTTagCompound) importList.tagAt(len));
         recipes.put(exportItemStack, recipeItemStacks);
      }
      return recipes;
   }
   
   public void addRecipes(Map<ItemStack, ItemStack[]> recipes)
   {
      Iterator<ItemStack> itemStackIterator = recipes.keySet().iterator();
      while (itemStackIterator.hasNext())
      {
         ItemStack key = itemStackIterator.next();
         ItemStack[] value = recipes.get(key);
         String[] buffer = new String[3];
         buffer[0] = "abc".replace('a', value[0] == null ? ' ' : 'a').replace('b', value[1] == null ? ' ' : 'b').replace('c', value[2] == null ? ' ' : 'c');
         buffer[1] = "def".replace('d', value[3] == null ? ' ' : 'd').replace('e', value[4] == null ? ' ' : 'e').replace('f', value[5] == null ? ' ' : 'f');
         buffer[2] = "ghi".replace('g', value[6] == null ? ' ' : 'g').replace('h', value[7] == null ? ' ' : 'h').replace('i', value[8] == null ? ' ' : 'i');
         if (key != null && buffer[0] != "   " && buffer[1] != "   " && buffer[2] != "   ")
         {
            GameRegistry.addRecipe(key, new Object[] {
                  buffer[0],
                  buffer[1],
                  buffer[2],
                  'a', value[0],
                  'b', value[1],
                  'c', value[2],
                  'd', value[3],
                  'e', value[4],
                  'f', value[5],
                  'g', value[6],
                  'h', value[7],
                  'i', value[8]});
         }
      }
   }
}


例:
コード: 全て選択
NBTTagCompound nbtTagCompound = new NBTTagCompound();
Map<ItemStack, ItemStack[]> recipes = readRecipeFromNBT(nbtTagCompound);
recipes.put(new ItemStack(Item.ingotGold), new ItemStack[] {
   new ItemStack(Item.ingotIron), null, new ItemStack(Item.ingotIron),
   null, new ItemStack(Item.ingotIron), null,
   null, new ItemStack(Item.ingotIron), null
});
writeRecipeToNBT(nbtTagCompound);
addRecipes(recipes);

Re: [技術共有] トピックを立てるまでもないライブラリとかコードとかの公開所

投稿記事 by kegare » 2014年9月28日(日) 20:15

上に同じくです。
エンティティのインスタンスをクラスから生成します。
エンティティ登録名とかいちいち指定するの面倒くさいので、特定のエンティティのインスタンスを生成シたいときはこれを使ってヤッてます。

コード: 全て選択
public static <T extends Entity> T createEntity(Class<T> clazz, World world)
{
    try
    {
        String name = String.valueOf(EntityList.classToStringMapping.get(clazz));

        if (name == null || name.length() <= 0)
        {
            return null;
        }

        Entity entity = EntityList.createEntityByName(name, world);

        if (entity == null || entity.getClass() != clazz)
        {
            return null;
        }

        return clazz.cast(entity);
    }
    catch (Exception e)
    {
        System.err.println("Failed to create entity: " + clazz.getSimpleName());
        e.printStackTrace();

        return null;
    }
}

Re: [技術共有] トピックを立てるまでもないライブラリとかコードとかの公開所

投稿記事 by kegare » 2014年9月28日(日) 19:42

主に自分用の備忘録ですが、ご紹介。
プレイヤーのディメンション移動をTeleporterを介さずに安全に行います。
ライセンスはWTFPLライセンスです。勝手に改変だとかコピペだとかしちゃってください。

環境: Forge 10.13.0.1180
他のバージョンでも必要に応じて多少修正すれば使えると思います。

コード: 全て選択
public static EntityPlayerMP respawnPlayer(EntityPlayerMP player, int dim)
{
    player.isDead = false;
    player.forceSpawn = true;
    player.timeUntilPortal = player.getPortalCooldown();
    player.playerNetServerHandler.playerEntity = player.mcServer.getConfigurationManager().respawnPlayer(player, dim, true);

    return player.playerNetServerHandler.playerEntity;
}

public static EntityPlayerMP forceTeleport(EntityPlayerMP player, int dim)
{
    MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance();
    int dimOld = player.dimension;
    WorldServer world = server.worldServerForDimension(dim);

    if (dim != player.dimension)
    {
        player = respawnPlayer(player, dim);

        FMLCommonHandler.instance().bus().post(new PlayerChangedDimensionEvent(player, dimOld, dim));
    }

    ChunkCoordinates spawn = world.getSpawnPoint();
    int var1 = 64;

    for (int x = spawn.posX - var1; x < spawn.posX + var1; ++x)
    {
        for (int z = spawn.posZ - var1; z < spawn.posZ + var1; ++z)
        {
            for (int y = world.getActualHeight() - 3; y > world.provider.getAverageGroundLevel(); --y)
            {
                if (world.isAirBlock(x, y, z) && world.isAirBlock(x, y + 1, z) &&
                    world.isAirBlock(x - 1, y, z) && world.isAirBlock(x - 1, y + 1, z) &&
                    world.isAirBlock(x + 1, y, z) && world.isAirBlock(x + 1, y + 1, z) &&
                    world.isAirBlock(x, y, z - 1) && world.isAirBlock(x, y + 1, z - 1) &&
                    world.isAirBlock(x, y, z + 1) && world.isAirBlock(x, y + 1, z + 1) &&
                    !world.getBlock(x, y - 1, z).getMaterial().isLiquid())
                {
                    while (world.isAirBlock(x, y - 1, z))
                    {
                        --y;
                    }

                    if (!world.getBlock(x, y - 1, z).getMaterial().isLiquid())
                    {
                        player.playerNetServerHandler.setPlayerLocation(x + 0.5D, y + 0.8D, z + 0.5D, player.rotationYaw, player.rotationPitch);
                        player.addExperienceLevel(0);

                        return player;
                    }
                }
            }
        }
    }

    return player;
}


respawnPlayerメソッドで実際にディメンションを移動させた後、forceTeleportで安全な場所を探しまわっています。

別のディメンションに手っ取り早く強制送還したいときに使ってます。

言語リソースを分離

投稿記事 by alice » 2013年6月19日(水) 11:00

ライセンスは、修正BSDライセンスとします。

①言語一覧を/mods/HOGEHOGE/lang/languages.txtに記述する。
小文字2文字+アンダーバー+大文字2文字でないと無視されます。
アルファベットとアンダーバー以外の文字は認識されませんし、日本語などを入れると落ちますがそもそもこのファイルには必要ありません。
コード: 全て選択
en_US
ja_JP

②それぞれの言語を、minecraft.jarのlang以下にあるファイルの形式で作成して/mods/HOGEHOGE/lang/以下にen_US.txtのように配置する。
この時、UTF-8で出力していないと読み込み時にForgeが激おこだよになります。
コード: 全て選択
block.hogeblock.name=Hoge Block
item.hogeitem.name=Hoge Item

③loadLanguagesを呼び出す。
コード: 全て選択
void loadLanguages()
{
   InputStream languageListFile;
   InputStreamReader reader;
   LanguageRegistry lang = LanguageRegistry.instance();
   LineNumberReader lineReader;
   List<String> languageList;
   Matcher m;
   Pattern r;
   String line, matchedLine;

   languageListFile = CommonProxy.class.getResourceAsStream("/mods/HOGEHOGE/lang/languages.txt");
   if(languageListFile == null)
   {
      doLoadLang(lang, "en_US");
      return;
   }
   //reader = new InputStreamReader(languageListFile, StandardCharsets.US_ASCII);
   try
   {
      reader = new InputStreamReader(languageListFile, "US-ASCII");
   }
   catch(UnsupportedEncodingException e)
   {
      reader = null;
   }
   if(reader == null)
   {
      throw new RuntimeException("Unsupported encoding exception. Running under non-standard Java VM?");
   }
   lineReader = new LineNumberReader(reader);

   languageList = new ArrayList<String>();
   r = Pattern.compile("([a-z]{2}_[A-Z]{2})");

   for(;;)
   {
      try
      {
         line = lineReader.readLine();
      }
      catch(IOException e)
      {
         break;
      }

      if(line == null)
      {
         break;
      }
      if(line.length() > 0)
      {
         m = r.matcher(line);
         if(m.find())
         {
            matchedLine = m.group();

            languageList.add(matchedLine);
         }
      }
   }
   try
   {
      lineReader.close();
      reader.close();
      languageListFile.close();
   }
   catch(IOException e)
   {
   }

   if(languageList.size() > 0)
   {
      for(String langName : languageList)
      {
         doLoadLang(lang, langName);
      }
   }
}

コード: 全て選択
static void doLoadLang(LanguageRegistry lang, String langName)
{
   String langPath;

   langPath = String.format("/mods/HOGEHOGE/lang/%s.txt", langName);
   lang.loadLocalization(langPath, langName, false);
}

④おわり
[hr]
修正:Java 1.6環境で実行できない問題を修正しました。

[Forge] RecipeDeleter

投稿記事 by そば娘 » 2013年5月29日(水) 21:55

:cre: RecipeDeleter :cre:

FirstSpring さんが書きました:ライセンス:パブリックドメインです。煮るなり焼くなり好きにしてください。
特定のレシピを削除するコードです。実行された時点で条件に一致するレシピを削除します。


こちらのコードを個人用に改変し、アイテム・ブロック両方使える物を公開。
ライセンスは同じくパブリックドメインです。

コード: 全て選択
// RecipeDeleter.java"

import java.util.Iterator;
import java.util.List;

import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.IRecipe;

public class RecipeDeleter
{
   public static void DeleteRecipe(ItemStack par1ItemStack)
   {
      List recipes = CraftingManager.getInstance().getRecipeList();

      for(Iterator i = recipes.listIterator(); i.hasNext();)
      {
         IRecipe recipe = (IRecipe)i.next();
         ItemStack is = recipe.getRecipeOutput();

         if(is != null)
         {
            if(is.itemID == par1ItemStack.itemID)
            {
               i.remove();
            }
         }
      }
   }
}


※ つかいかた ※
コード: 全て選択
// アイテムのレシピ削除 (スイカ)
RecipeDeleter.DeleteRecipe(new ItemStack(Item.melon));
// ブロックのレシピ削除 (ブロック)
RecipeDeleter.DeleteRecipe(new ItemStack(Block.melon));


Let's Recipe Delete! ✌('ω')

"備考"
greg先輩ごっこ出来るようなります✌('ω')

ちなみに私はこれゾンMODの鉱石辞書対応パッチ作成に使う予定で改変したのを更に改良しました✌('ω')

Re: [技術共有] トピックを立てるまでもないライブラリとかコードとかの公開所

投稿記事 by mozipi » 2013年4月23日(火) 20:30

割れかどうか調べるものです。
ライセンスは上に投稿されたやつと同じです。
コード: 全て選択
package hspid;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HasPayID {

   /**
    * 割れ(海賊版)でなければtrueを返します。
    * @param username チェックするユーザー名
    * @param doOriginErrorTheUse オリジナルエラーを使用するか
    * @return 割れ(海賊版)でなければtrue
    * @throws IOException
    */
   public static boolean hspid(String username, boolean doOriginErrorTheUse) throws IOException {
      if (doOriginErrorTheUse) {
         try {
            boolean hspid = hspid(username);
            if (!hspid) {
               throw new RuntimeException("This minecraft is pirated!");
            } else {
               return true;
            }
         } catch (IOException e) {
            throw new IOException();
         }
      } else {
         return hspid(username);
      }
   }

   /**
    * 割れ(海賊版)でなければtrueを返します。
    * @param username チェックするユーザー名
    * @return 割れ(海賊版)でなければtrue
    * @throws IOException
    */
   public static boolean hspid(String username) throws IOException {
      URL url = new URL("http://minecraft.net/haspaid.jsp?user=" + username);
      HttpURLConnection connecter = (HttpURLConnection) url.openConnection();
      connecter.setDoInput(true);
      connecter.connect();

      String result = inputStreamReadToString(connecter.getInputStream());

      connecter.disconnect();

      return Boolean.getBoolean(result);
   }

   public static String inputStreamReadToString(InputStream is) throws IOException {
      BufferedInputStream input = new BufferedInputStream(is);
      String result = "";
      int read;
      while ((read = input.read()) != -1) {
         charToString(result, read);
      }
      is.close();
      return result;
   }

   public static void charToString(String s, int c) {
      s = s.concat(String.valueOf((char) c));
   }

   public static void charToString(String s, char c) {
      s = s.concat(String.valueOf(c));
   }

}

Re: [技術共有] トピックを立てるまでもないライブラリとかコードとかの公開所

投稿記事 by mozipi » 2013年3月30日(土) 08:19

すべてのMODが利用できるようになったら実行される処理です
コード: 全て選択
      Thread loadCheckThread = new Thread() {
         @Override
         public void run() {
            while (true) {
               List<ModContainer> mod = Loader.instance().getModList();
               ModContainer finalMod = mod.get(mod.size()-1);
               ModState finalModState = Loader.instance().getModState(finalMod);
               if (finalModState == ModState.AVAILABLE) {
                  //ここにすべてのMODが利用できるようになったら実行される処理
                                                break;
               }
            }
         }
      };
      loadCheckThread.start();

ライセンス:自分で作ったと言わない限りはコピー可。自分用に改変した場合はライセンスなし

1.5.0の新しいテクスチャを利用したブロック・アイテムの追加

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

やっとForgeの求めているベストプラクティスが理解できました…

新しいテクスチャの利用 - Minecraft Modding Wiki
を参照しながらバージョンアップ作業をしていましたが、

コード: 全て選択
      sampleItem     = (new ItemSample(30000))
         .setUnlocalizedName("itemSample")
         .setCreativeTab(CreativeTabs.tabMaterials);
      sampleBlock    = (new BlockSample(3800))
         .setUnlocalizedName("blockSample")
         .setCreativeTab(CreativeTabs.tabBlock);


コード: 全て選択
      sampleItem     = (newItem(30000))
         .setUnlocalizedName("sample:item")
         .setCreativeTab(CreativeTabs.tabMaterials);
      sampleBlock    = (new Block(3800, Material.wood))
         .setUnlocalizedName("sample:block")
         .setCreativeTab(CreativeTabs.tabBlock);

とすることでfunc_94581_aやfunc_94332_aをオーバーライドせずにテクスチャを指定できました。
無機能なアイテムやブロックなら新しいクラスを作らずにテクスチャが指定できます。

テクスチャのパスはModding Wikiと変わらず
コード: 全て選択
Block : (bin/minecraft)/mods/"domain名"/textures/blocks/"テクスチャのファイル名".png
Item  : (bin/minecraft)/mods/"domain名"/textures/items/"テクスチャのファイル名".png

であり、
eclipseからデバッグ実行した場合は、
コード: 全て選択
forge/mcp/src/minecraft/mods/"domain名"/textures/blocks/"テクスチャのファイル名".png
forge/mcp/src/minecraft/mods/"domain名"/textures/items/"テクスチャのファイル名".png

に配置することでテクスチャがロードされました。

アイテム・ブロックのunlocalizedNameにはドメイン指定を加えよというForgeからの無言の圧力を感じる…

[技術共有] デバッグ時のみ実行するコードを書く小技

投稿記事 by dewfalse » 2013年3月19日(火) 21:58

System.out.printlnデバッグはModderの嗜み。
MODをリリースしてから消し忘れたデバッグコードに気づくことはよくあると思いますが、そうならないための小技です。

ライセンス:なし

■小技1
環境変数を使う

eclipseを使用している場合、
メニューバーの「プロジェクト」→「プロパティー」を開き、
「実行/デバッグ設定」の「Minecraft」選択して「編集(E)...」ボタンを押し、
「環境」タブを選択し、「新規(E)...」ボタンを押します。
表示されるダイアログで
名前欄に「MYDEBUGMODE」(なんでもいい)
値欄に「DEBUG」(なんでもいい)
を入力してOKボタンを押します。

あとは以下のように環境変数の有無をチェックすれば作者だけが知っている環境変数をセットした場合だけ動くコードの出来上がりです。
コード: 全て選択
      String debugmode = System.getenv("MYDEBUGMODE");
      if(debugmode != null && debugmode.equals("DEBUG")) {
         System.out.println("This is debug");
      }

eclipseを使用していない場合は適当に環境変数を設定してください。

■小技2
Forgeの設定ファイルを使う

以下のようにsave()の後で設定を読み込むと設定ファイルが更新されないため、隠し設定のような動作をさせることができます。
コード: 全て選択
   public static boolean debug = false;
   @PreInit
   public void preInit(FMLPreInitializationEvent event) {
      Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
      try {
         // 設定の読み込み
         cfg.load();
         // 設定の書き込み
         cfg.save();

         // ファイルに反映しない設定の読み込み
         debug = cfg.get(Configuration.CATEGORY_GENERAL, "debug", false).getBoolean(false);
      } catch (Exception e) {
         FMLLog.log(Level.SEVERE, e,"load config exception");
      } finally {
      }
   }


デバッグ時には
コード: 全て選択
# Configuration file

####################
# general
####################

general {
    B:debug=true
}

を書けばデバッグ時のみ真になる変数の出来上がりです。

Forge1.5.0でバニラのテクスチャを使用したアイテムの追加する[サンプルコード]

投稿記事 by flameFox » 2013年3月15日(金) 15:49

表題どおりのコードです。

サンプルコードですので、ライセンス等はありません。
改変、転載等も問題ありません。
環境はminecraftforge-src-1.5-7.7.0.582です。

コードは「\forge\mcp\src\minecraft」フォルダに「sampleMod」のパッケージを作ってご使用ください。

・アイテム名が「sampleEggName」
・卵のテクスチャを持つアイテムを追加する。
・動作は通常の卵と同じ動作をします。
・クリエイティブでは「Materials」タブに、サバイバルでは卵1コでクラフトできます。

sampleMod.java
コード: 全て選択
package sampleMod;

import java.util.logging.Level;

import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.Configuration;

@Mod(modid = "sampleMod", name = "Sample Item Mod", version = "0.0.1")
@NetworkMod(clientSideRequired=true, serverSideRequired=false)
public class sampleMod
{
    public static int sampleItemID;

    public static Item sampleItem;
    public String sampleItemName = "sampleEggName";

    @Mod.PreInit
    public void preInit(FMLPreInitializationEvent event)
    {
        Configuration config = new Configuration(event.getSuggestedConfigurationFile());
        try{
            config.load();
            this.sampleItemID = config.getItem("sampleItemID", 5256).getInt();
        }
        catch (Exception e)
        {
            FMLLog.log(Level.SEVERE, e, "Sample Item Mod : Error configuration file");
        }
        finally
        {
            config.save();
        }
    }

   @Mod.Init
   public void load(FMLInitializationEvent event)
   {
        sampleItem = (new ItemEggSample(sampleItemID)).setUnlocalizedName(sampleItemName).setCreativeTab(CreativeTabs.tabMaterials);
        GameRegistry.registerItem(sampleItem, sampleItemName);
        LanguageRegistry.addName(sampleItem, sampleItemName);

        GameRegistry.addRecipe(new ItemStack(sampleItem,1),new Object[]{ "X", Character.valueOf('X'),Item.egg });
    }
}


ItemEggSample.java
コード: 全て選択
package sampleMod;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityEgg;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;


public class ItemEggSample extends Item
{
    public ItemEggSample(int par1)
    {
        super(par1);
        this.maxStackSize = 16;
        this.setCreativeTab(CreativeTabs.tabMaterials);
    }

    public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
    {
        if (!par3EntityPlayer.capabilities.isCreativeMode)
        {
            par1ItemStack.stackSize--;
        }

        par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));

        if (!par2World.isRemote)
        {
            par2World.spawnEntityInWorld(new EntityEgg(par2World, par3EntityPlayer));
        }
        return par1ItemStack;
    }

    @Override
    @SideOnly(Side.CLIENT)
    public void func_94581_a(IconRegister par1IconRegister)
    {
        this.iconIndex = par1IconRegister.func_94245_a("egg");
    }
}

ModLoader1.5.0でバニラのテクスチャを使用したアイテムの追加する[サンプルコード]

投稿記事 by flameFox » 2013年3月15日(金) 14:25

表題どおりのコードです。

サンプルコードですので、ライセンス等はありません。
改変、転載等も問題ありません。
環境はModloder1.5.0です。

・アイテム名が「sampleEggName」
・卵のテクスチャを持つアイテムを追加する。
・動作は通常の卵と同じ動作をします。
・クリエイティブでは「Materials」タブに、サバイバルでは卵1コでクラフトできます。

mod_sample.java
コード: 全て選択
package net.minecraft.src;

import java.util.*;
import net.minecraft.client.*;

public class mod_sample extends BaseMod
{
    @MLProp(info = "please assign sampleItemID", min = 256, max = 31999)
    public static int sampleItemID = 5256;

    public static Item sampleItem;
    public String sampleItemName = "sampleEggName";

        public String getName()
    {
        return "mod_sample";
    }

    public String getVersion()
    {
        return "0.0.1";
    }

    public void load()
    {
        sampleItem = (new ItemEggSample(sampleItemID)).setUnlocalizedName(sampleItemName).setCreativeTab(CreativeTabs.tabMaterials);
        ModLoader.addName(sampleItem, sampleItemName);

        ModLoader.addRecipe(new ItemStack(sampleItem,1),new Object[]{ "X", Character.valueOf('X'),Item.egg });
    }
}


ItemEggSample.java
コード: 全て選択
package net.minecraft.src;

import net.minecraft.src.*;

public class ItemEggSample extends Item
{
    public ItemEggSample(int par1)
    {
        super(par1);
        this.maxStackSize = 16;
        this.setCreativeTab(CreativeTabs.tabMaterials);
    }

    public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
    {
        if (!par3EntityPlayer.capabilities.isCreativeMode)
        {
            par1ItemStack.stackSize--;
        }

        par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));

        if (!par2World.isRemote)
        {
            par2World.spawnEntityInWorld(new EntityEgg(par2World, par3EntityPlayer));
        }
        return par1ItemStack;
    }

    @Override
    public void func_94581_a(IconRegister par1IconRegister)
    {
        this.iconIndex = par1IconRegister.func_94245_a("egg");
    }
}

ページトップ

x