[解説]savesフォルダに新しいセーブデータを作る方法

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.36869)

[解説]savesフォルダに新しいセーブデータを作る方法

投稿記事by kyuuban » 2012年5月04日(金) 11:57

.minecraft/saves/ワールド名フォルダの中に新しいセーブデータを作ります。
保存したい変数をシリアライズという物を使って保存します。

まずはシリアライズ用のModSaveDataクラスを作ります
コード: 全て選択
package net.minecraft.src;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ModSaveData{
   private static ModSaveData singleton=new ModSaveData();
   private SaveHandler saveHandler;
   private File path;
   private ModData data;//保存したいデータを入れる変数

   private ModSaveData(){}

   //このクラスのインスタンスを手に入れる
   public static ModSaveData(){
      return singleton;
   }

   //ここでdataという変数をセーブしています
   public void write(){
      try {
         if(ModLoader.getMinecraftInstance().theWorld!=null){
            loadFilePath();
            ObjectOutputStream outObject = new ObjectOutputStream(new FileOutputStream(path));
            outObject.writeObject(data);
            outObject.close();
         }
      }
      catch (FileNotFoundException e) {
      }
      catch (IOException e) {}
   }

   //このメソッドで読み込んでdataという変数にロードしたものを入れています
   public void read(){
      try {
         if(ModLoader.getMinecraftInstance().theWorld!=null){
            loadFilePath();
            ObjectInputStream inObject = new ObjectInputStream(new FileInputStream(path));
            data=(ModData)inObject.readObject();
            inObject.close();
         }
      }
      catch (FileNotFoundException e) {
         try {
            //ファイルが見つからなかった時新しくファイルを生成します
            path.createNewFile();
            //data変数に新しくセーブデータを作って格納します
            data=new ModData();
         } catch (IOException e1) {
            e1.printStackTrace();
         }
         //新しく作ったものをセーブしておく
         write();
      }
      catch (IOException e) {
         e.printStackTrace();
      }
      catch (ClassNotFoundException e) {
         e.printStackTrace();
      }
   }

   //このメソッドでセーブデータを手に入れる
   public ModData getSaveData(){
      return data;
   }

   //保存するパスの設定
   public void loadFilePath(){
      saveHandler=(SaveHandler)ModLoader.getMinecraftInstance().theWorld.saveHandler;
      //"ModData.ser"というファイルがワールドデータのフォルダの中に生成される
      //名前は好きなものに変えて大丈夫です
      path=new File(saveHandler.getSaveDirectory(),"/ModData.ser");
   }
}


次にセーブデータを入れるクラスを作ります
コード: 全て選択
package net.minecraft.src.VarietyKitchenPack;

import java.io.Serializable;

public class ModData implements Serializable{
   //ここに保存したいものを追加していく
   //今回はお金を保存します
   int money;
}


これで外部保存は完成しました。
下のコードはセーブしているお金の取得です
ModSaveData.getInstance().read();
int money=ModSaveData.getInstance().data.money;

変更するときは
ModSaveData.getInstance().read();
ModSaveData.getInstance().data.money+=100;
ModSaveData.getInstance().write();
としてやればmoneyの中身が100ずつ増えます。

注意点としては開発環境では正常に動作しません。
なので開発環境で動くか確かめたい時は
path=new File(saveHandler.getSaveDirectory(),"/ModData.ser");をnew File("ModData.ser");とかに変えてください

あと当然ですが、Worldがnullの時は動作しません。多分例外でるかも・・・?

このコードでバグとか出ちゃったらごめんなさい
石炭っていいよね。石炭
kyuuban
ID:d4841db5
石掘り
 
記事: 122
登録日時: 2012年1月14日(土) 17:29

Return to 質問:開発・制作関連

x