Skip to content

自定義任務目標 Custom Quest Objects

Cutiemango edited this page Dec 9, 2017 · 9 revisions

今天來教學如何建立一個自定義的任務目標吧!
(這個部分必須要有點java基礎才能使用唷~)

【一】、將你的插件專案的Build Path加入MangoQuest插件!

【二】、在你的插件專案中新增一個class並繼承me.Cutiemango.MangoQuest.questobject.CustomQuestObject:

繼承後將需要被實作的load方法先創建Override。

package me.Cutiemango.MangoQuestObjectEX;

import me.Cutiemango.MangoQuest.QuestIO;
import me.Cutiemango.MangoQuest.questobject.CustomQuestObject;

public class MyCustomQuestObject extends CustomQuestObject
{

	@Override
	public boolean load(QuestIO io, String path)
	{
		return true;
	}
	
}

【三】、開始建立你想要的目標!

這裡以"受到傷害次數"為例,宣告一個int變數儲存玩家需要受到多少次傷害才算完成任務目標。
順便將Getter與Setter宣告起來。

	private int damageTimes;
	
	public int getTimes()
	{
		return damageTimes;
	}
	
	public void setTimes(int i)
	{
		damageTimes = i;
	}

【四】、Save&Load的方法

一個任務目標的儲存與讀取是非常重要的, 所以在新建任務目標的時候必須要Override以下這兩個方法:

	@Override
	public boolean load(QuestIO config, String path)
	{
		damageTimes = config.getInt(path + "DamageTimes");
		return true;
	}
	
	@Override
	public void save(QuestIO config, String objpath)
	{
		config.set(objpath + "DamageTimes", damageTimes);
		super.save(config, objpath);
	}

作法如同上面的代碼,將要儲存的物件在物件名稱前面加上path的名稱並用set方法儲存即可。
值得注意的是,load方法傳回true表示讀取成功,false表示讀取失敗,設定檔案中可能有些地方出了錯誤。
save方法必須永遠記得加入

	super.save(config, objpath);

這一行喔,不然系統會出錯的(這一行是保存你自訂任務目標的class用的)。

【五】、一些其他目標的資料修改

	@Override
	public String getObjectName()
	{
		return "受到傷害次數";
	}
	
	@Override
	public String getProgressText(QuestObjectProgress qop)
	{
		return toDisplayText() + " " + I18n.locMsg("CommandInfo.Progress", Integer.toString(qop.getProgress()),Integer.toString(damageTimes));
	}
	
	@Override
	public TextComponent toTextComponent(boolean isFinished)
	{
		return new TextComponent(toDisplayText());
	}

	@Override
	public String toDisplayText()
	{
		return QuestChatManager.translateColor("&a受到 &f" + damageTimes + " &a次傷害");
	}

(選擇性)getObjectName() - 更改這個自訂任務目標的目標名稱
例:受到傷害次數

(必須)getProgressText() - 更改這個自訂任務目標完成一部份目標時顯示的文字內容
例:「任務名稱」受到 5 次傷害 進度:(1/5)

(必須)toDisplayText() - 更改這個自訂任務目標顯示於任務書上的目標內容
例:「任務名稱」受到 5 次傷害

(必須)toTextComponent() - 同toDisplayText(),不過是使用TextComponent顯示的版本,顯示某些物品資料時可能會需要用到
例:「任務名稱」提交 [物品] 給 NPC001
(物品會是有物品資料浮現的,需要用TextComponent下去做才可以)

【六】、註冊你的監聽器並監測你的任務目標!

本次示範中,需要的目標為「受到傷害次數」,應監聽的事件便為EntityDamageEvent。
code如下,如有不懂再找作者吧!
相信大家模仿起來應該是沒有問題的。

package me.Cutiemango.MangoQuestObjectEX;

import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import me.Cutiemango.MangoQuest.QuestUtil;
import me.Cutiemango.MangoQuest.data.QuestObjectProgress;
import me.Cutiemango.MangoQuest.data.QuestPlayerData;
import me.Cutiemango.MangoQuest.data.QuestProgress;

public class QuestListener implements Listener
{
	@EventHandler
	public void onEntityDamage(EntityDamageEvent e)
	{
		Entity victim = e.getEntity();
		if (!(victim instanceof Player))
			return;
		Player p = (Player)victim;
		QuestPlayerData pd = QuestUtil.getData(p);
		for (QuestProgress qp : pd.getProgresses())
		{
			for (QuestObjectProgress qop : qp.getCurrentObjects())
			{
				if (qop.getObject() instanceof MyCustomQuestObject)
				{
					qop.setProgress(qop.getProgress() + 1);
					if (qop.getProgress() >= ((MyCustomQuestObject)qop.getObject()).getTimes())
						qop.finish();
					pd.checkFinished(qp, qop);
				}
			}
		}
	}
}

【七】、完成後必須在主class(onEnable方法內)註冊你的任務目標!
註冊方法為:

	CustomObjectManager.registerObject(Class<? extends CustomQuestObject> object);

註冊時須將整個Class<?>進行註冊,在你剛剛創建完成的任務目標後面加個.class當作參數即大功告成。

package me.Cutiemango.MangoQuestObjectEX;

import java.util.logging.Level;

import org.bukkit.plugin.java.JavaPlugin;
import me.Cutiemango.MangoQuest.manager.CustomObjectManager;

public class Main extends JavaPlugin
{
	@Override
	public void onEnable()
	{
		CustomObjectManager.registerObject(MyCustomQuestObject.class);
		getLogger().log(Level.INFO, "已經開啟!");
	}
	
	@Override
	public void onDisable()
	{

		getLogger().log(Level.INFO, "已經關閉!");
	}
}

【八】、將你新做好的任務目標加進你的任務吧!
在quests.yml找到你要編輯的任務,
並在Stages下面新增你的任務目標資料:

    Stages:
      '1':
        '1':
          ObjectType: KILL_MOB
          Amount: 10
          MobType: SPIDER
        '2':
          ObjectType: CUSTOM_OBJECT
          ObjectClass: me.Cutiemango.MangoQuest.questobject.CustomQuestObject
          DamageTimes: 5

ObjectType - 一律都必須填CUSTOM_OBJECT,因為是自訂任務目標的關係。

ObjectClass - 讓系統判斷這是哪個自訂任務目標,所以要輸入你自訂任務目標的完整Class名稱。

DamageTimes - 自訂義的任務參數,在示範任務目標中是受到的傷害次數。

Clone this wiki locally