World.java
ワールドに関するオブジェクト。光、時間、天候、現存キャラクターリスト など
- getInitialSpawnLocation()
初期スポーン座標の決定&保持。陸地かつ砂ブロックの高さ64。
座標(i,j,k)のブロックのIDを読む。帰ってきた結果が1なら石、2なら土、etc。ブロックIDはBlock.java内に記載されているし、 ここにも一覧が記載されている
Blocj.java
ここに書かれてる
羊毛ブロック(wool)は、BlockClothなので注意。「wool」で検索しても出ません。
羊毛ブロックのIDは35ですが、ブロックの色はメタデータとしてセット、かつ画面更新フラグを立てるメソッドを使わないと反映されないので注意。
→world.setBlockMetadataWithNotify(i, j, k, l)
Item.java
- setIconCoord(int i, int j)
アイコンの画像(minecraft.jar内、gui>items.png)を指定する。左上のアイコンが(0,0)で、右下が(15,15)。iが横、jが縦。
- public final int shiftedIndex
IDに256値をプラスしたもの。
例えば、豚が生肉をアイテムとしてドロップする場合は、
return Item.porkRaw.shiftedIndex;
という指定で生肉のIDを取得している。
ブロックのID(0~255)とアイテムのID(256~)はIDが重複しないようにしているが、
アイテムのIDはいちいち256足した所からカウントするとややこしい為、1から順にIDを割り当てている。
IDを呼ぶときのみ、値にプラス256を行うようになっている。
このプラス256するために噛ませているのがshiftedIndexという値。
EntityLiving.java
- protected void dropFewItems()
生き物倒した時のアイテム数はここ?
0~2個のいずれかの個数からランダムでアイテムを落とす、という処理。
Chunk.java
ブロックの配置管理
ChunkProviderGenerate.java
マインクラフトの肝となる、地形や気候の生成ロジック。ワールド生成時のブロックを配置。
チャンク単位で生成される。
- provideChunk(int i, int j)
ここから各メソッド呼び出し。//つまり、ここのi.jで条件分岐させれば、チャンク毎にバラバラの地形生成が可能・・・?
- generateTerrain(int i, int j, byte abyte0[], BiomeGenBase abiomegenbase[], double ad[])
一番基礎となる地形の生成。石と水(氷)のみ配置。(陸地と海なのですね)
abyte0[] = new byte[32768]; //32768=16*16*128:1チャンクのサイズ(縦横16ブロック、高さ128ブロック)。
abyteの中に値をセットしている。このセット値がそのまま基本の地形となる。
先頭から順に配列128個ごとに、高さ0から127までのブロックのIDを入れる。
こうなっている感じ。(縦横の座標は適当)
ad[]は気温?
BioGenBaseは基本バイオーム(氷河とか砂漠とか森とか・・・)
- replaceBlocksForBiome(int i, int j, byte abyte0[], BiomeGenBase abiomegenbase[])
2番目に基礎となる地形。地盤、砂利、砂、砂石を配置
- populate(IChunkProvider ichunkprovider, int i, int j)
鉱物やら植物、洞窟生成や植物配置など、基盤ワールドにマインクラフトの要素を付加する大事なメソッド。
何故かChunkProviderから呼ばれてる?
if(rand.nextInt(4) == 0):4分の1の確率で、湖を作成するメソッドを呼び出す。
{
int i1 = k + rand.nextInt(16) + 8; //i1, l4, i8がワールドの座標i1, i8が横幅、奥行きで、l4は高さ。
int l4 = rand.nextInt(128);
int i8 = l + rand.nextInt(16) + 8;
(new WorldGenLakes(Block.waterStill.blockID)).generate(worldObj, rand, i1, l4, i8);
}
WorldGenerator.java
chunkProviderGenerate.populateから呼ばれて、鉱物やマグマやら植物やらカボチャやらのブロックを配置する。
マルチサーバーMODについてメモ
マインクラフトはminecraft.jar(クライアント:個人で遊ぶ用)とminecraft_server.jar(サーバー:マルチ提供用)の二種類があって、
マルチサーバー用は後者の中身をいじるだけかと思っていたけれど、実際はサーバーとクライアントと両方の中身を
同じように変更しないと駄目な場合がある事が判明。(サーバーだけ変えたら良い、という例は少ない…?調査不足中。)
例1:新アイテム追加の場合
新しいIDにアイテム割り当てを行う場合、サーバーのみにアイテムを追加しただけだと、
プレイ中に該当アイテムを落とした瞬間に画面が真っ青になった後ブラックアウトして落ちる。
クライアントにもアイテム追加した後だと落ちない。参加者全員にMOD導入の必要有り。
モブの落とすアイテムはサーバー側の設定に依存する。
例2:レコード曲追加の場合
minecraft_server.jarには曲に関する機能が無い??処理はクライアントのjarを参照しているっぽい。
レコード曲「cat」をマルチで流す時は、各クライアントのローカルファイル上のcat.oggを鳴らす指示が出されている。
なので、曲を追加したければ、参加者全員に曲ファイルを指定フォルダに導入してもらう必要有り。
サーバー単体で動くわけではなく、クライアントのjarも参照して色々やってるらしいので、やや複雑。テストも困難。
ModLoaderとAudioModを入れたら上手くいきますね by セギナー
↑上手くいくってのは、どこにどういうものを導入した時でしょうか?手順も含めお願いします
↑クライアントjarに対して、レコードとBGMを追加するMOD「Dubstep Discs」のレコード情報対応部分を書き換えたらシングル・マルチ両方で希望の音楽を再生できるようになりました。
取得条件を追加すればレコードもしっかりアイテムとして入手できます。
「Dubstep Discs」の.java内には読みだしコードのようなものは見当たらなかったので、読み出しはModLoaderかAudioModのどちらかに依存しているようです。
サーバーはアイテム情報と取得条件を追加するだけ。まだ他の人にテストしてもらってないので不確定です。
手順は後でマルチのページにも載せようと思ってます。
+
|
手順 |
※MOD導入の前に「mcrunman」などのMOD使い分けソフトを入れるのを推奨
※minecraft.jarは\AppData\Roaming\.minecraft\binにある
○用意するもの
- ModLoader マイクラwikiのMODの項参照
- AudioMod マイクラwikiのMODの項参照
- 7-ZipやExplznなどのjar形式に対応した展開ソフト
(ドラッグ&ドロップでminecraft.jarの中に直接ファイルをコピーすることが出来る)
○導入方法
1.ModLoaderを展開して出てくるファイルをminecraft.jar内に上書き
2.AudioModを展開して出てくるファイルをminecraft.jar内に上書き
3.一度マインクラフトを起動させ、終了する
4.配布する5つの.classファイルをminecraft.jar内に上書き
5.recordフォルダをminecraft.jar内にコピー
6.appdata内の .minecraft -> resources -> mod -> streamingとフォルダを辿り、
その中にoggファイルをコピー。 "mod"フォルダ内なので間違えないように
7.マルチサーバーに入って動作確認をする
|
|