Skip to content

C++ 接入指南

v2.1.0

本指南介绍如何在 C++ 插件中接入 MoneyCore 经济系统。

📥 立即下载
只需 1 个头文件,完整 API 接口!
下载 money_api.h

📥 准备工作

1. 下载 API 文件

money_api.h 复制到你的插件 include/ 目录:

your_plugin/
├── include/
│   └── money_api.h  ← 放这里
├── src/
│   └── main_plugin.cpp
└── CMakeLists.txt

2. 包含头文件

cpp
#include "money_api.h"

🚀 快速开始

获取服务

cpp
auto service = getServer().getServiceManager().load<IMoneyService>("MoneyService");
if (service) {
    // 使用服务...
}

完整示例

cpp
#include <endstone/plugin/plugin.h>
#include "money_api.h"

class MyShopPlugin : public endstone::Plugin {
public:
    void onEnable() override {
        getLogger().info("MyShopPlugin 已启动!");
    }
    
    bool buyItem(endstone::Player &player, const std::string &item, double price) {
        auto service = getServer().getServiceManager().load<IMoneyService>("MoneyService");
        if (!service) {
            player.sendMessage("§c经济系统未加载!");
            return false;
        }
        
        std::string playerName = player.getName();
        
        // 尝试扣款
        if (service->trySubMoney(playerName, price, "购买" + item)) {
            player.sendMessage("§a购买成功!花费 " + 
                service->formatMoney(price) + " " + 
                service->getCurrencySuffix());
            // 给予物品...
            return true;
        } else {
            double bal = service->getMoney(playerName);
            player.sendMessage("§c余额不足!当前余额: " + 
                service->formatMoney(bal) + " " + 
                service->getCurrencySuffix());
            return false;
        }
    }
    
    void showBalance(endstone::Player &player) {
        auto service = getServer().getServiceManager().load<IMoneyService>("MoneyService");
        if (!service) return;
        
        double bal = service->getMoney(player.getName());
        player.sendMessage("§e你的余额: §a" + 
            service->formatMoney(bal) + " " + 
            service->getCurrencySuffix());
    }
};

📋 常见用法

检查并扣款

cpp
// 推荐方式:原子操作
if (service->trySubMoney(playerName, 100, "购买道具")) {
    // 扣款成功
    giveItem(player, "diamond_sword");
} else {
    // 余额不足
    player.sendMessage("§c余额不足!");
}

奖励玩家

cpp
service->addMoney(playerName, 500, "完成任务奖励");
player.sendMessage("§a获得 500 金币奖励!");

获取排行榜

cpp
auto top = service->getTopPlayers(10);
for (int i = 0; i < top.size(); i++) {
    getLogger().info("#{}: {} - {}", 
        i + 1, 
        top[i].first, 
        service->formatMoney(top[i].second));
}

玩家间交易

cpp
if (service->transfer(fromPlayer, toPlayer, amount, "玩家交易")) {
    // 转账成功
} else {
    // 余额不足
}

📋 API 方法一览

方法返回值说明
getMoney(playerName)double获取余额
setMoney(playerName, amount)void设置余额
addMoney(playerName, amount, reason)void增加余额(有音效、记录)
subMoney(playerName, amount, reason)void扣除余额(有音效、记录)
hasMoney(playerName, amount)bool检查余额是否足够
trySubMoney(playerName, amount, reason)bool尝试扣款 ✨推荐
transfer(from, to, amount, reason)bool转账(原子操作)
playerExists(playerName)bool玩家是否存在
formatMoney(amount)std::string格式化金额
getCurrencySuffix()std::string获取货币后缀
getTopPlayers(limit)std::vector<std::pair<std::string, double>>获取排行榜
getTotalEconomy()double获取服务器总经济

⚠️ 注意事项

  1. 每次使用时获取服务 - 不要缓存服务指针,插件加载顺序不确定
  2. 检查服务是否存在 - MoneyCore 可能未安装
  3. 使用原子操作 - 推荐 trySubMoney 而非 hasMoney + subMoney
  4. 提供操作原因 - 所有扣款/加款操作都应提供 reason

重要

不要在 onEnable() 中缓存服务指针!应该每次需要时调用 load<IMoneyService>

🔗 相关链接

Made with ❤️ by EVIL-ZIXIE