Doc ID: SIRC-075

Jobs Reborn API 知识文档

Jobs Reborn Plugin API 文档总结

Overview

Jobs Reborn 插件 API 文档

插件基本信息

核心 API 事件

1. JobsAreaSelectionEvent

包名: com.gamingmesh.jobs.api.events.JobsAreaSelectionEvent
描述: 当使用指定物品选择区域时触发
是否可取消: 否
主要方法:

  • getPlayer() – 获取选择区域的玩家
  • getArea() – 获取选择的区域对象
  • getArea().getHighLoc() – 获取区域高点位置
  • getArea().getLowLoc() – 获取区域低点位置

示例代码:

@EventHandler
public void onJobsAreaSelection(JobsAreaSelectionEvent event) {
    event.getPlayer().sendMessage("You have selected the area in high and low location: " + event.getArea().getHighLoc() + " " + event.getArea().getLowLoc());
}

2. JobsChunkChangeEvent

包名: com.gamingmesh.jobs.api.events.JobsChunkChangeEvent
描述: 当区块发生变化时触发
是否可取消: 是
主要方法:

  • getPlayer() – 获取玩家
  • getNewChunk() – 获取新的区块

示例代码:

@EventHandler
public void onJobsChunkChange(JobsChunkChangeEvent event) {
    event.getPlayer().sendMessage("The new chunk is: " + event.getNewChunk());
}

3. JobsExpGainEvent

包名: com.gamingmesh.jobs.api.events.JobsExpGainEvent
描述: 当玩家从工作中获得经验时触发
是否可取消: 是
主要方法:

  • getPlayer() – 获取玩家
  • getExp() – 获取获得的经验值
  • getJob() – 获取工作对象
  • getJob().getName() – 获取工作名称

示例代码:

@EventHandler
public void onJobsExpGain(JobsExpGainEvent event) {
    event.getPlayer().sendMessage("You got " + event.getExp() + " amount exp in job " + event.getJob().getName());
}

4. JobsJoinEvent

包名: com.gamingmesh.jobs.api.events.JobsJoinEvent
描述: 当玩家加入指定工作时触发
是否可取消: 是
主要方法:

  • getPlayer() – 获取玩家
  • getJob() – 获取工作对象
  • getJob().getName() – 获取工作名称

示例代码:

@EventHandler
public void onJobsJoin(JobsJoinEvent event) {
    event.getPlayer().getPlayer().sendMessage("You have joined to " + event.getJob().getName() + " job!");
}

5. JobsLeaveEvent

包名: com.gamingmesh.jobs.api.events.JobsLeaveEvent
描述: 当玩家离开指定工作时触发
是否可取消: 是
主要方法:

  • getPlayer() – 获取玩家
  • getJob() – 获取工作对象
  • getJob().getName() – 获取工作名称

示例代码:

@EventHandler
public void onJobsLeave(JobsLeaveEvent event) {
    event.getPlayer().getPlayer().sendMessage("You have left from " + event.getJob().getName() + " job!");
}

6. JobsLevelUpEvent

包名: com.gamingmesh.jobs.api.events.JobsLevelUpEvent
描述: 当玩家在该工作中升级时触发
是否可取消: 是
主要方法:

  • getPlayer() – 获取玩家
  • getJob() – 获取工作对象
  • getJob().getName() – 获取工作名称

示例代码:

@EventHandler
public void onJobsLevelUp(JobsLevelUpEvent event) {
    event.getPlayer().getPlayer().sendMessage("You have leveled up in " + event.getJob().getName() + " job!");
}

7. JobsPaymentEvent

包名: com.gamingmesh.jobs.api.events.JobsPaymentEvent
描述: 当计算支付时触发
是否可取消: 是
主要方法:

  • getPlayer() – 获取玩家
  • get(CurrencyType.MONEY) – 获取金钱金额
  • get(CurrencyType.POINTS) – 获取点数金额
  • get(CurrencyType.EXP) – 获取经验金额

示例代码:

@EventHandler
public void onJobsPayment(JobsPaymentEvent event) {
    event.getPlayer().sendMessage("You got " + event.get(CurrencyType.MONEY) + " money!");
}

8. JobsPrePaymentEvent

包名: com.gamingmesh.jobs.api.events.JobsPrePaymentEvent
描述: 在支付计算过程开始前触发
是否可取消: 是
主要方法:

  • getPlayer() – 获取玩家
  • getJob() – 获取工作对象
  • getJob().getName() – 获取工作名称
  • setCancelled(true) – 取消支付事件

示例代码:

@EventHandler
public void onJobsPrePayment(JobsPrePaymentEvent e) {
    e.getPlayer().sendMessage("Payment event is cancelled in " + e.getJob().getName() + " job!");
    e.getPlayer().sendMessage("You not get any income for doing actions.");
    e.setCancelled(true);
}

9. JobsScheduleStartEvent

包名: com.gamingmesh.jobs.api.events.JobsScheduleStartEvent
描述: 当调度器启动时触发
是否可取消: 是
主要方法:

  • getSchedule() – 获取调度器对象
  • getSchedule().isStarted() – 检查调度器是否已启动

示例代码:

@EventHandler
public void onJobsScheduleStart(JobsScheduleStartEvent ev) {
    if (e.getSchedule().isStarted()) {
        Bukkit.getLogger().log(Level.INFO, "The scheduler has started.");
    }
}

10. JobsScheduleStopEvent

包名: com.gamingmesh.jobs.api.events.JobsScheduleStopEvent
描述: 当调度器停止时触发
是否可取消: 是
主要方法:

  • getSchedule() – 获取调度器对象
  • getSchedule().isStoped() – 检查调度器是否已停止

示例代码:

@EventHandler
public void onJobsScheduleStop(JobsScheduleStopEvent ev) {
    if (e.getSchedule().isStoped()) {
        Bukkit.getLogger().log(Level.INFO, "The scheduler has stopped.");
    }
}

玩家信息获取 API

获取玩家信息对象

JobsPlayer jobsPlayer = Jobs.getPlayerManager().getJobsPlayer(player);

注意: 如果玩家未缓存到内存中,此方法可能返回 null

获取玩家工作进度列表(不可修改)

JobsPlayer jobsPlayer = Jobs.getPlayerManager().getJobsPlayer(player);
if (jobsPlayer != null) {
    List<JobProgression> jobs = jobsPlayer.getJobProgression();
    for (JobProgression prog : jobs) {
        // 在此处执行操作
    }
}

获取不可修改的工作列表

Jobs.getJobs();

主要类结构

核心类

  1. Jobs – 主类,提供静态访问方法
  2. JobsPlayer – 玩家信息类
  3. JobProgression – 工作进度类
  4. CurrencyType – 货币类型枚举(MONEY, POINTS, EXP)

包结构

  • com.gamingmesh.jobs.api.events – 所有事件类
  • com.gamingmesh.jobs – 核心功能类
  • com.gamingmesh.jobs.container – 容器类

命令 API

区域命令

  • /jobs area add – 添加限制区域
  • /jobs area remove – 移除限制区域
  • /jobs area info – 显示区域信息
  • /jobs area list – 列出所有区域

物品奖励编辑

  • /jobs edititembonus add – 添加物品奖励NBT
  • /jobs edititembonus remove – 移除物品奖励NBT
  • /jobs edititembonus list – 列出物品奖励

点数编辑

  • /jobs editpoints add – 添加点数
  • /jobs editpoints take – 扣除点数
  • /jobs editpoints set – 设置点数

经验和等级

  • /jobs exp add – 添加经验
  • /jobs level take – 扣除等级
  • /jobs exp set – 设置经验

提升命令

  • /jobs expboost – 经验提升
  • /jobs pointboost – 点数提升
  • /jobs moneyboost – 金钱提升

权限系统

核心权限

  • jobs.use – 使用插件的基本权限
  • jobs.world.worldname – 世界权限
  • jobs.max.[number] – 最大工作数量权限
  • jobs.join.jobname – 加入特定工作的权限

新增权限(v4.17.0+)

  • jobs.tax.money.[number] – 金钱税收权限
  • jobs.tax.points.[number] – 点数税收权限
  • jobs.petpay.[number] – 宠物支付权限
  • jobs.all.vipmaxlevel.[number] – VIP最大等级权限
  • jobs.tax.bypass – 税收绕过权限
  • jobs.command.leave.[jobName] – 基于工作的离开权限
  • jobs.maxblastfurnaces.[number] – 最大高炉数量
  • jobs.maxsmokers.[number] – 最大烟熏炉数量

任务权限(v4.17.0+)

  • jobs.maxquest.[jobName].[number] – 特定工作最大任务数
  • jobs.maxquest.all.[number] – 所有工作最大任务数

所有权权限(v4.17.3+)

  • jobs.maxownership.[number] – 最大所有权数量
  • jobs.maxfurnaceownership.[number] – 最大熔炉所有权数量

提升权限

  • jobs.boost.jobName.money.amount – 特定工作金钱提升
  • jobs.boost.jobName.exp.amount – 特定工作经验提升
  • jobs.boost.jobName.points.amount – 特定工作点数提升
  • jobs.boost.all.money.amount – 所有工作金钱提升
  • jobs.boost.all.exp.amount – 所有工作经验提升

Placeholders API

基础占位符

  • %jobsr_user_id% – 玩家数据库ID
  • %jobsr_user_points% – 当前点数
  • %jobsr_user_total_points% – 总点数
  • %jobsr_user_totallevels% – 总等级数
  • %jobsr_user_jobs% – 玩家所有工作
  • %jobsr_user_joinedjobcount% – 加入的工作数量
  • %jobsr_maxjobs% – 最大可加入工作数

设备计数占位符

  • %jobsr_user_furncount% – 熔炉数量
  • %jobsr_user_maxfurncount% – 最大熔炉数量
  • %jobsr_user_smokercount% – 烟熏炉数量
  • %jobsr_user_maxsmokercount% – 最大烟熏炉数量
  • %jobsr_user_blastcount% – 高炉数量
  • %jobsr_user_maxblastcount% – 最大高炉数量
  • %jobsr_user_bstandcount% – 酿造台数量
  • %jobsr_user_maxbstandcount% – 最大酿造台数量

任务占位符

  • %jobsr_user_doneq% – 已完成任务数量
  • %jobsr_user_dailyquests_pending% – 待处理任务数量
  • %jobsr_user_dailyquests_completed% – 已完成任务数量
  • %jobsr_user_dailyquests_total% – 总任务数量
  • %jobsr_user_quests% – 当前可用任务

复杂占位符

  • %jobsr_user_boost_(jname/number)_(money/exp/points)% – 特定工作和类型的提升
  • %jobsr_user_isin_(jname/number)% – 检查玩家是否在特定工作中

使用示例

监听工作加入事件

@EventHandler
public void onJobsJoin(JobsJoinEvent event) {
    Player player = event.getPlayer().getPlayer();
    String jobName = event.getJob().getName();
    
    player.sendMessage(ChatColor.GREEN + "恭喜你加入了 " + jobName + " 工作!");
    
    // 记录到日志
    Bukkit.getLogger().info(player.getName() + " 加入了工作: " + jobName);
}

获取玩家工作信息

public void displayPlayerJobs(Player player) {
    JobsPlayer jobsPlayer = Jobs.getPlayerManager().getJobsPlayer(player);
    
    if (jobsPlayer != null) {
        List<JobProgression> jobs = jobsPlayer.getJobProgression();
        
        player.sendMessage(ChatColor.GOLD + "=== 你的工作 ===");
        for (JobProgression prog : jobs) {
            player.sendMessage(ChatColor.YELLOW + "- " + prog.getJob().getName() + 
                             " 等级: " + prog.getLevel() + 
                             " 经验: " + prog.getExperience());
        }
    }
}

检查玩家是否在特定工作中

public boolean isPlayerInJob(Player player, String jobName) {
    JobsPlayer jobsPlayer = Jobs.getPlayerManager().getJobsPlayer(player);
    
    if (jobsPlayer != null) {
        for (JobProgression prog : jobsPlayer.getJobProgression()) {
            if (prog.getJob().getName().equalsIgnoreCase(jobName)) {
                return true;
            }
        }
    }
    return false;
}

最佳实践

  1. 空值检查: 始终检查 getJobsPlayer() 返回的 JobsPlayer 对象是否为 null
  2. 事件取消: 在需要时使用 setCancelled(true) 取消事件
  3. 异步操作: 避免在事件处理中进行耗时操作
  4. 错误处理: 妥善处理可能出现的异常
  5. 权限验证: 在使用API前验证玩家权限

版本兼容性

  • 本API文档基于 Jobs Reborn v4.17.0+ 版本
  • 部分功能可能需要特定版本支持
  • 建议使用最新版本以获得完整功能支持

支持与贡献