slimeの日記

プログラミングの備忘録的なブログです。

Minecraft forge 1.7.10で鉱石を追加する

鉱石の追加方法をまとめます。

 

まず、鉱石にしたいブロックを追加します。

ここでは、鉱石の名前をMelliteとします。

 

Oreblock.java


public static Block Mellite;

.....

@EventHandler
	public void init1(FMLPreInitializationEvent Event) {
	Mellite = new Melliteore();
	GameRegistry.registerBlock(Mellite, "Mellite");
	}

 Melliteore.java


public class Melliteore extends Block {
	public Melliteore() {
		super(Material.iron);
		setCreativeTab(CreativeTabs.tabBlock);
		setBlockName("Mellite");
		setBlockTextureName("slime:Mellite");
		setHardness(2.0f);
		
	}
}

 それでは、追加したブロックを鉱石にしていきます。

 randomores.java


public class SlimeOres implements IWorldGenerator{
	
	private WorldGenerator ore1
	
	@Override
	public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {
		switch (world.provider.dimensionId) {
		case -1:
			
			break;
		case 0:
			
			break;
		case 1:
			
			break;
		default:
			break;
		}
	}

 Switch文の-1はネザー、0は通常世界、1はエンドです。

次は鉱石の生成です。

randomores.java


public randomores() {
	    this.ore1 = new WorldGenMinable(Oreblock.Mellite, 4);
	}
private void runGenerator(WorldGenerator generator, World world, Random rand, int chunk_X, int chunk_Z, int chancesToSpawn, int minHeight, int maxHeight) {
	    if (minHeight < 0 || maxHeight > 256 || minHeight > maxHeight)
	        throw new IllegalArgumentException("Illegal Height Arguments for WorldGenerator");

	    int heightDiff = maxHeight - minHeight + 1;
	    for (int i = 0; i < chancesToSpawn; i ++) {
	        int x = chunk_X * 16 + rand.nextInt(16);
	        int y = minHeight + rand.nextInt(heightDiff);
	        int z = chunk_Z * 16 + rand.nextInt(16);
	        generator.generate(world, rand, x, y, z);
	    }
	}

 public randomores(){}のところで鉱石の最大生成数を設定しています。

runGeneratorのところは鉱石の生成頻度とランダムに鉱石を生成させるアルゴリズムを設定しています。

先ほどのswitch文でメソッドを呼び出しましょう。

randomores.java


public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {
		switch (world.provider.dimensionId) {
		case -1:
			
			break;
		case 0:
			this.runGenerator(this.ore1, world, random, chunkX, chunkZ, 20, 0, 12);
			break;
		case 1:
			
			break;
		default:
			break;
		}
	}

 

 

 20は生成頻度、0は最小生成高度、12は最高生成高度です。

 

最後に イベントに追加しましょう。

Oreblock.java


@EventHandler
	public void event1(FMLInitializationEvent Event) {
		GameRegistry.registerWorldGenerator(new randomores(), 0);
	}

 

参考にしたページ :  Basic Modding - World Generation - Minecraft Mods & Modding by BedrockMiner

 

 Javafxファイル・チューザの作成と使用方法

 

JavaFXのファイルチューザについて書かれているサイトがあまり見当たらなかったので、作成及び使用方法についてまとめます。

javafx scene builderを使用しています。

 

 

  • ファイルチューザの作成
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open File");
fileChooser.showOpenDialog(null);

で作成できます。

fileChooser.showOpenDialog(stage);でオーナーを設定します。

nullでも大丈夫です。

 

  • Buttonで開く
@FXML
	protected void fileaction(ActionEvent a) {
		FileChooser fileChooser = new FileChooser();
		fileChooser.setTitle("Open File");
		File file = fileChooser.showOpenDialog(null);
		}

 FXMLは省略します。

 

  • ファイルチューザの拡張子フィルタの設定
fileChooser.getExtensionFilters().addAll(
        new FileChooser.ExtensionFilter("All", "*.*"),
        new FileChooser.ExtensionFilter("PNG", "*.png")
            );

 ("タイトル", "名前.拡張子")と書きます。全てを選択する場合は*です。

 

fileChooser.setInitialDirectory(
	   new File(System.getProperty("user.home"))
	        ); 

 この場合ピクチャやビデオなどがあるuserホームを開きます。

 

  • 画像ファイルを開いてwindowに表示する
File file = fileChooser.showOpenDialog(null);

 ファイルを開いて表示するには、fileChooser.showOpenDialog(null);を上記のように変更します。

次に、ファイルのパスを取得します。

String url = "file:///"+file.getPath();

 最初に file:/// を付けないとエラーになってしまうので注意しましょう。

最後に、Imageviewとして表示します。

@FXML ImageView image1;
    .......
Image image2 = new Image(url);
image1.setImage(image2);

 

 

 Sample.FXML


    <!--?xml version="1.0" encoding="UTF-8"?-->

<!--?import javafx.scene.control.*?-->
<!--?import javafx.scene.image.*?-->
<!--?import java.lang.*?-->
<!--?import javafx.scene.layout.*?-->
<!--?import javafx.scene.layout.BorderPane?-->

<borderpane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SampleController"><center>
      <pane prefheight="400.0" prefwidth="400.0" borderpane="" alignment="CENTER">
         <children>
            <imageview fx:id="image1" fitheight="186.0" fitwidth="200.0" layoutx="100.0" layouty="118.0" pickonbounds="true" preserveratio="true"></imageview>
            <button##/button>
         </children>
      </pane>
   </center>
</borderpane>

 Main.java

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.fxml.FXMLLoader;


public class Main extends Application {
	@Override
	public void start(Stage primaryStage) {
		try {
			BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("Sample.fxml"));
			Scene scene = new Scene(root,400,400);
			scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
			primaryStage.setScene(scene);
			primaryStage.show();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		launch(args);
	}
}

 

SampleController.java

import java.io.File;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.FileChooser;

public class SampleController {
	
	@FXML Button file1;
	@FXML ImageView image1;
	
	
	@FXML
	protected void fileaction(ActionEvent a) {
		FileChooser fileChooser = new FileChooser();
		fileChooser.setTitle("Open File");
		fileChooser.setInitialDirectory(
	            new File(System.getProperty("user.home"))
	        ); 
		File file = fileChooser.showOpenDialog(null);
		
		String url = "file:///"+file.getPath();
	    Image image2 = new Image(url);
	    image1.setImage(image2);
	    System.out.println(url);
	}
	
}