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

クライアント/サーバーMODの開発に関する話題、技術交換はこちらで。質問は質問フォーラムへお願いします。
  • (PostNo.29134)

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

投稿記事by アルゴ » 2012年3月13日(火) 21:36

トピックにするには大げさだけど、開発に便利なライブラリやコード片を公開するトピックです。

・ライブラリの説明
・ライセンスなどの利用条件
を記載し圧縮ファイルにまとめて添付してください。

短いコードなどはそのままcodeタグで書き込んでも構いません
最後に編集したユーザー アルゴ [ 2012年4月25日(水) 17:43 ], 累計 2 回
アルゴ
ID:56c9117e
石炭掘り
 
記事: 218
登録日時: 2011年12月26日(月) 03:13

  • (PostNo.29136)

NBTとJSONでの変換クラス

投稿記事by アルゴ » 2012年3月13日(火) 21:41

ライセンス:特にありません。改造含め、自由に使ってください。

NBTをJSON形式で書き出すNBTJsonFormatterクラスと、JSONからNBTを組み立てるためのNBTJsonListnerクラスが含まれます。
minecraft1.2.3用に作っています。

NBTJsonFormatterクラスは以下のようにNBTデータをPrintWriterを使用して書き出します。
コード: 全て選択
PrintWriter writer = new PrintWriter(new FileWriter(file));
(new NBTJsonFormatter()).format(nbt, writer);
 writer.close();


NBTJsonListnerクラスもReaderからJSONを読み取ってNBTデータを作成します。
コード: 全て選択
NBTJsonListner saj = new NBTJsonListner();
Reader reader = new FileReader(file);
(new SajParser()).parse(reader, saj);
nbtdata = saj.getNBTRoot();
reader.close();

ただし、argo.saj.SajParserのインポートが必要なことに注意してください。

添付ファイルのmod_JsonTestは/config/nbt.datからアイテムのリストをつくり、
新規ワールドのプレイヤーのインベントリに加えるサンプルです。

既に同様のものがあるかもしれませんが、何か役に立つかもしれないので公開しておきます。
添付ファイル
jsonutil.zip
(3.87 KiB) ダウンロード数: 50 回
アルゴ
ID:56c9117e
石炭掘り
 
記事: 218
登録日時: 2011年12月26日(月) 03:13

  • (PostNo.32178)

Re: トピックを立てるまでもないライブラリとかの公開所

投稿記事by Unyuho » 2012年3月31日(土) 01:06

ライセンス:特にありません。自己責任でお使いください。

ModLoaderのaddOverrideメソッドをForge用に作成してみました。
minecraft1.2.3で動作確認済。
コード: 全て選択
int icon = ForgeLoader.addOverride("/tex/TerrainSample.png", "/tex/ItemSample.png")
ItemSample itemsample = new ItemSample(itemID).setIconIndex(icon);

"/tex/TerrainSample.png"は、各クラスのgetTextureFileで指定したパスと同一にしてください。

[2012/05/09 16:20 更新]
v1.2.5追加
添付ファイル
[1.2.5]ForgeLoader.zip
v1.2.5
(1.15 KiB) ダウンロード数: 31 回
ForgeLoader.zip
v1.2.3
(1.14 KiB) ダウンロード数: 21 回
最後に編集したユーザー Unyuho [ 2012年5月09日(水) 16:19 ], 累計 1 回
もぢんぐ再開
アバター
Unyuho
ID:d3a4ae03
鉄鉱掘り
 
記事: 278
登録日時: 2012年2月21日(火) 23:51
お住まい: 日本の何処かに住んでます。

  • (PostNo.35752)

zip内からファイルをコピー

投稿記事by アルゴ » 2012年4月25日(水) 19:20

ライセンス:特にありません。・・・使ってもいいのよ?

MLPropで対処できないような特殊な初期設定ファイルを使用するMODで役に立ちそうなメソッドを作ったので投稿しておきます。
これを使うと、ユーザーにいちいちmod本体と別に設定ファイルをダウンロードさせたり、
ソースコード内に長大な文字列リテラルを埋め込む必要がありません。

コード: 全て選択
    public void copyFromResource(File file, String res) throws IOException
    {
        InputStream inputRes = this.getClass().getResourceAsStream(res);
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputRes));
        PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(file, true)));
       
        try {
            while (reader.ready()) {
                writer.println(reader.readLine());
            }
        } finally {
            reader.close();
            writer.close();
        }
    }

解説:
zipに同梱したファイルをFileで指定した場所へコピーするメソッドです。

引数:
file: コピー先のファイルを指定します。
res: zip内のファイルを指定します。


使用例:
以下のように使用するとzip内のdefault.txtを.minecraft/config/setting.iniへコピーすることができます。
コード: 全て選択
copyFromResource(new File(Minecraft.getMinecraftDir(), "/config/setting.ini"), "/default.txt")
アルゴ
ID:5c81c08e
石炭掘り
 
記事: 218
登録日時: 2011年12月26日(月) 03:13

  • (PostNo.36137)

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

投稿記事by SpringMine » 2012年4月28日(土) 18:57

独自モデルのレンダー追加のサンプルに。
球ブロック
SpringMine
ID:7bacda2c
石炭掘り
 
記事: 177
登録日時: 2011年12月07日(水) 22:14

  • (PostNo.37890)

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

投稿記事by ayamitsu » 2012年5月11日(金) 19:16

ライセンス:ないです、ご自由にどうぞ

mobのちょっとしたAIです。1.2.5
使用するときはご自分で改変するなり、このまま使うなりどうぞ。
添付ファイル
ちょっとAIパック.zip
(5.51 KiB) ダウンロード数: 125 回
アバター
ayamitsu
ID:b39d215b
ラピスラズリ収集家
 
記事: 1068
登録日時: 2011年8月10日(水) 19:04
お住まい: 琵琶湖の底らへん

  • (PostNo.39574)

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

投稿記事by URANOS1260 » 2012年5月20日(日) 01:05

【GuiInputForms ver.1.0.1】
スクリーンキーボードなどの入力フォームを複数追加します。
使い方はソースを見て下さい。
サンプルMODが入っています。

【TextureImageFX ver.1.1.0】
テクスチャのアニメーションを画像から作成できるようにします。
使い方はソースを見て下さい。
サンプルMODが入っています。
2012/5/21更新:アニメーションの速度を指定できる変数を追加

【その他】
ライセンスとか特にありません。自由に改変しちゃってください。
MOD配布時に、上のクラスファイルをjarにいれてもらえるよにしていただけると嬉しいです。
添付ファイル
TextureImageFX_ver110.zip
(4.34 KiB) ダウンロード数: 67 回
GuiInputForms_ver101.zip
(6.18 KiB) ダウンロード数: 49 回
アバター
URANOS1260
ID:2eff8df9
石掘り
 
記事: 82
登録日時: 2012年1月08日(日) 00:10

  • (PostNo.47198)

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

投稿記事by URANOS1260 » 2012年7月16日(月) 00:37

【FileTool ver.1.0.0】
ファイル関係のツールです
独自のコンフィグ&データ保存ツールの使用、画像加工ができます。
中にテストMODが入っています。
添付ファイル
FileTool_ver100.zip
(5.62 KiB) ダウンロード数: 68 回
アバター
URANOS1260
ID:2eff8df9
石掘り
 
記事: 82
登録日時: 2012年1月08日(日) 00:10

  • (PostNo.57908)

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

投稿記事by ayamitsu » 2012年10月11日(木) 20:03

ライセンス:ないです、ご自由に
目的:NBTを使用した外部保存をWorldごとに切り替えて簡単に行うため

サンプルは2つあります。
簡単な実装をするサンプルが1つ("/mod/nbt/sample"のフォルダ内)。
実際に使用する場合に使うエンダーチェストを使用したサンプル("/sample_enderchest"のフォルダ内)。
1.2.5で作成しましたので、他のバージョンだと仕様の違いで使えないかもしれません。

使用方法
コード: 全て選択
インスタンスはNBTSaveManagerのgetObjectで取得してください

BaseModを継承したmod_XXX内でやること

NBTSaveManager manager;

public void load() {
    // 必須、GUIのフックを使用するので
    ModLoader.setInGUIHook(this, true, true);
   
    // INBTSaveObjectを実装した保存をするインスタンスをつくる
    // このインスタンスのコンストラクタはpublicかつ引数無しで
    // ClassからnewInstanceでインスタンスを作成するので
    INBTSaveObject nbtsaveobject = new NBTSaveObject();

    // インスタンス生成時はINBTSaveObjectを実装したクラスのインスタンスが必要
    this.manager = new NBTSaveManager(nbtsaveobject);
}

public boolean onTickInGUI(float f, Minecraft mc, GuiScreen guiscreen) {
    // 必須
    manager.update();
}
添付ファイル
NBTSave.zip
(12.28 KiB) ダウンロード数: 22 回
アバター
ayamitsu
ID:030452e0
ラピスラズリ収集家
 
記事: 1068
登録日時: 2011年8月10日(水) 19:04
お住まい: 琵琶湖の底らへん

  • (PostNo.74046)

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

投稿記事by FirstSpring » 2013年1月17日(木) 02:28

ライセンス:パブリックドメインです。煮るなり焼くなり好きにしてください。

特定のレシピを削除するコードです。実行された時点で条件に一致するレシピを削除します。
コード: 全て選択
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.getItem() == Item.blazePowder)
         i.remove();
}

使用する際にはItem.blazePowderの所を削除したいアイテムに変えて下さい。

2013/3/2追記:色々おかしかったので修正
最後に編集したユーザー FirstSpring [ 2013年5月03日(金) 17:05 ], 累計 2 回
FirstSpring
ID:5ab9d9c0
レッドストーン掘り
 
記事: 517
登録日時: 2012年10月12日(金) 23:14
お住まい: null

  • (PostNo.74280)

コピーリソース

投稿記事by takanasayo » 2013年1月18日(金) 19:22

:not: copyResource
  • zip内のファイルを指定フォルダにバイナリコピーするメソッドです。
  • ModLoader もしくは MinecraftForge が必要です。

:ply: 使用例:
  • zip同梱のサウンドファイルを自動でresources/modフォルダにコピー。
  • レシピ自作MODなどでサンプルレシピをコピー。
  • InputStreamを引数で渡すように改造して汎用Stream書き出しメソッドに。

:ply: ライセンス:
  • 特にありません。そのまま埋め込んでも、改造して利用してもOKです。
  • 公開場所かReadMeに、この記事への誘導リンクを置くとモアベターよ!

:ply: コード:
コード: 全て選択
import java.io.*;

public static void copyResource(BaseMod mod, String res, File outputFile)
{
    try
    {
        BufferedInputStream reader = new BufferedInputStream(mod.getClass().getResourceAsStream(res));
        BufferedOutputStream writer = new BufferedOutputStream(new FileOutputStream(outputFile));
        int size = 0;
       
        while((size = reader.read()) != -1)
        {
            writer.write(size);
        }
        writer.flush();
        writer.close();
        reader.close();
    }
    catch (IOException e)
    {
        //エラー時の処理を記述
    }
}


:ply: サンプル:
BaseMod.load() で、zip内のsound/sample.oggを、resources/mod/sound/sample.ogg にコピーする例
コード: 全て選択
public void load()
{
    File outFile = new File(Minecraft.getMinecraftDir()+"resources/mod/sound","sample.ogg");
    if(!outFile.exists())
    {
        outputFile.getParentFile().mkdirs();
        copyResource(this, "sound/sample.ogg", outFile);
    }
}
アバター
takanasayo
ID:0269d120
ラピスラズリ収集家
 
記事: 954
登録日時: 2012年7月26日(木) 04:00
お住まい: 石の中にいる

  • (PostNo.80226)

ListHash

投稿記事by ponkotate » 2013年2月15日(金) 21:34

What's ListHash?
HashMapの中にArrayListを組み込んだ補助クラスだと考えられて結構です。
ちなみにMinecraft外でも使用可能です。

How to use?:
該当フィールドをnew ListHash<K, E>でインスタンス生成を行ってください。
KはHashMapと同じくKeyの略です。EはElementの略でArrayListのTypeParameterを指定します。
putメソッドはHashMapと同じ機能です。
getメソッドでは、第一引数にKey、第二引数にIndex(何番目かって事)を入れて取得します。
その他のArrayList(ちょっと特殊かな?)・HashMapの機能に関してはソースをご覧ください。

License:
綺麗にするべし!!…それ以外はご自由にお使いください。

Source:
コード: 全て選択
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;

public class ListHash<K, E>
{
   /**
    * @author Ponkotate version:1.0.0 dev
    *
    *         Create ArrayList in HashMap.
    */

   protected ArrayList<K> keysList = new ArrayList<K>();
   protected HashMap<K, ArrayList<E>> elementsHash = new HashMap<K, ArrayList<E>>();

   public boolean add(K par1Key, E par2Element)
   {
      try
      {
         return this.elementsHash.get(par1Key).add(par2Element);
      } catch (Exception e)
      {
         return this.put(par1Key, par2Element);
      }
   }

   public boolean addAll(K par1Key, Collection<? extends E> par2Collection)
   {
      return this.elementsHash.get(par1Key).addAll(par2Collection);
   }

   public boolean addAll(K par1Key, int par2Index, Collection<? extends E> par3Collection)
   {
      return this.elementsHash.get(par1Key).addAll(par2Index, par3Collection);
   }

   public void clear()
   {
      this.elementsHash.clear();
   }

   public boolean containsKey(K par1Key)
   {
      return this.elementsHash.containsKey(par1Key);
   }

   public boolean containsValue(K par1Key)
   {
      return this.elementsHash.containsValue(par1Key);
   }

   public boolean contains(K par1Key, E par2Element)
   {
      return this.elementsHash.get(par1Key).contains(par2Element);
   }

   public boolean containsAll(K par1Key, Collection<?> par2Collection)
   {
      return this.elementsHash.get(par1Key).containsAll(par2Collection);
   }

   public Set<java.util.Map.Entry<K, E>> entrySet()
   {
      return this.entrySet();
   }

   public K getKeyList(int par1Index)
   {
      return this.keysList.get(par1Index);
   }

   public E get(K par1Key, int par2Index)
   {
      return this.elementsHash.get(par1Key).get(par2Index);
   }

   public int indexOf(K par1Key, E par2Element)
   {
      return this.elementsHash.get(par1Key).indexOf(par2Element);
   }

   public boolean isKeysListEmpty(K par1Key)
   {
      return this.elementsHash.get(par1Key).isEmpty();
   }

   public boolean isElementsHashEmpty()
   {
      return this.elementsHash.isEmpty();
   }

   public Iterator<E> iterator(K par1Key)
   {
      return this.elementsHash.get(par1Key).iterator();
   }

   public int lastIndexOf(K par1Key, E par2Element)
   {
      return this.elementsHash.get(par1Key).lastIndexOf(par2Element);
   }

   public ListIterator<E> listIterator(K par1Key)
   {
      return this.elementsHash.get(par1Key).listIterator();
   }

   public ListIterator<E> listIterator(K par1Key, int par2Index)
   {
      return this.elementsHash.get(par1Key).listIterator(par2Index);
   }

   public Set<K> keySet()
   {
      return this.elementsHash.keySet();
   }

   public boolean put(K par1Key, E par2Element)
   {
      this.keysList.add(par1Key);

      ArrayList<E> elementList = new ArrayList<E>();
      this.elementsHash.put(par1Key, elementList);
      return this.add(par1Key, par2Element);
   }

   public void putAll(Map<? extends K, ? extends ArrayList<E>> par1Map)
   {
      this.elementsHash.putAll(par1Map);
   }

   public ArrayList<E> remove(K par1Key)
   {
      return this.elementsHash.remove(par1Key);
   }

   public boolean remove(K par1Key, E par2Element)
   {
      return this.elementsHash.get(par1Key).remove(par2Element);
   }

   public E remove(K par1Key, int par2Index)
   {
      return this.elementsHash.get(par1Key).remove(par2Index);
   }

   public boolean removeAll(K par1Key, Collection<?> par2Collection)
   {
      return this.elementsHash.get(par1Key).removeAll(par2Collection);
   }

   public boolean retainAll(K par1Key, Collection<?> par2Collection)
   {
      return this.elementsHash.get(par1Key).retainAll(par2Collection);
   }

   public E set(K par1Key, int par2Index, E par3Element)
   {
      return this.elementsHash.get(par1Key).set(par2Index, par3Element);
   }

   public int sizeElementsHash()
   {
      return this.elementsHash.size();
   }

   public int sizeKeysList()
   {
      return this.keysList.size();
   }

   public int sizeElementsList(K par1Key)
   {
      return this.elementsHash.get(par1Key).size();
   }

   public List<E> subList(K par1Key, int par2FromIndex, int par3ToIndex)
   {
      return this.elementsHash.get(par1Key).subList(par2FromIndex, par3ToIndex);
   }

   public E[] toArray(K par1Key)
   {
      return (E[])this.elementsHash.get(par1Key).toArray();
   }

   public <T> T[] toArray(K par1Key, T[] par2Array)
   {
      return this.elementsHash.get(par1Key).toArray(par2Array);
   }

   public Collection<ArrayList<E>> values()
   {
      return this.elementsHash.values();
   }

}
ponkotate
ID:bc3f620f
石掘り
 
記事: 143
登録日時: 2012年9月24日(月) 06:51

  • (PostNo.86240)

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");
    }
}
最後に編集したユーザー flameFox [ 2013年3月15日(金) 16:19 ], 累計 1 回
flameFox
ID:2fb62aeb
石炭掘り
 
記事: 230
登録日時: 2013年1月19日(土) 19:53

  • (PostNo.86245)

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");
    }
}
flameFox
ID:2fb62aeb
石炭掘り
 
記事: 230
登録日時: 2013年1月19日(土) 19:53

  • (PostNo.87306)

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

投稿記事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
}

を書けばデバッグ時のみ真になる変数の出来上がりです。
dewfalse
ID:1fd27f1e
金掘り
 
記事: 373
登録日時: 2012年2月28日(火) 21:09
お住まい: Y=1

  • (PostNo.87588)

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からの無言の圧力を感じる…
dewfalse
ID:1fd27f1e
金掘り
 
記事: 373
登録日時: 2012年2月28日(火) 21:09
お住まい: Y=1

  • (PostNo.90149)

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();

ライセンス:自分で作ったと言わない限りはコピー可。自分用に改変した場合はライセンスなし
画像
UsefulMilletなどの製作を行っています。
よろしければどうぞ。
ニコニコミュニティ:co2105535
サイト:http://mozipi.jpn.ph/

NAGServerの運営もしております。ぜひ投票・サーバーログインお願い致します
画像
アバター
mozipi
ID:a0859c9d
レッドストーン掘り
 
記事: 569
登録日時: 2011年12月26日(月) 19:44
お住まい: 岐阜

  • (PostNo.95221)

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));
   }

}
画像
UsefulMilletなどの製作を行っています。
よろしければどうぞ。
ニコニコミュニティ:co2105535
サイト:http://mozipi.jpn.ph/

NAGServerの運営もしております。ぜひ投票・サーバーログインお願い致します
画像
アバター
mozipi
ID:9837eedb
レッドストーン掘り
 
記事: 569
登録日時: 2011年12月26日(月) 19:44
お住まい: 岐阜

  • (PostNo.103485)

[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の鉱石辞書対応パッチ作成に使う予定で改変したのを更に改良しました✌('ω')
アバター
そば娘
ID:189b3cd0
石掘り
 
記事: 147
登録日時: 2011年9月16日(金) 21:55
お住まい: 闇に飲まれてる

  • (PostNo.108297)

言語リソースを分離

投稿記事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環境で実行できない問題を修正しました。
アバター
alice
ID:c6f58fce
金掘り
 
記事: 440
登録日時: 2011年10月23日(日) 20:10
お住まい: 舞天市

次へ

Return to 開発関連

x