bfdz49 发表于 2026-2-10 12:17:43

征途翅膀外观特

本帖最后由 bfdz49 于 2026-2-10 13:34 编辑

我琢磨了几天终于解决成功,源代码服务端修改文件有两个

第1个文件Makefile增加个WingSystem.o源代码没有WingSystem.o文件创建个

命令
cd /home/server/ScenesServer


/usr/bin/g++ -c -g -D_USE_EPOLL_ -D_USE_CMD_NAMESPACE -D_ENCDEC_MSG -D_WQH_DEBUG -D_ALL_SUPER_GM \
-I../base -I../script -I../zise -Wall -D_GNU_SOURCE -D_REENTRANT \
`mysql_config --cflags` `xml2-config --cflags` \
WingSystem.cpp -o WingSystem.o第2个文件修改ScenesServer.cpp在位置home/server/ScenesServer自己去查找,在ScenesServer.cpp文件里查找


#include "fjconfig.h"//五附件下边增加
#include "WingSystem.h"// 翅膀系统
然后拉下来找到SceneUserVisitor::Thread::instance().start();增加Zebra::logger->error("翅膀系统初始化失败");

客户端
#ifndef WING_SYSTEM_H
#define WING_SYSTEM_H

#include "zType.h"
#include "zSingleton.h"
#include <map>
#include <vector>

// 翅膀显示数据(客户端专用)
struct WingViewData
{
    DWORD modelId;      // 模型ID
    DWORD effectId;       // 光效ID
    DWORD color;          // 染色
    float scale;          // 缩放
    bool visible;         // 是否显示
    int attachBone;       // 挂接骨骼点
   
    WingViewData()
      : modelId(0), effectId(0), color(0xFFFFFFFF), scale(1.0f),
          visible(true), attachBone(9) {}// 9=背部
};

// 翅膀属性数据(从服务端同步)
struct WingData
{
    DWORD id;             // 翅膀ID
    DWORD level;          // 等级
    DWORD rank;         // 档次
    DWORD exp;            // 当前经验
    DWORD maxExp;         // 升级需要经验
    DWORD power;          // 威力值
    bool equipped;      // 是否装备
   
    // 属性值(显示用)
    int pa;               // 物攻
    int ma;               // 魔攻
    int pd;               // 物防
    int md;               // 魔防
    int hp;               // 生命
    int speed;            // 速度
   
    // 镶嵌
    DWORD gemId;       // 6个宝石槽
   
    WingData()
    {
      memset(this, 0, sizeof(*this));
      level = 1;
    }
};

class WingSystem : public zSingleton<WingSystem>
{
public:
    WingSystem();
    ~WingSystem();
   
    // 初始化
    bool init();
    void final();
   
    // 网络消息处理(从服务端接收)
    void onServerMessage(const BYTE* data, int len);
   
    // 用户操作(发送请求到服务端)
    void requestUpgrade(bool useProtect, bool useLucky);
    void requestEquip(DWORD wingId);
    void requestEmbed(int slot, DWORD gemId);
    void requestSoulFeed(DWORD itemId);
    void requestTransform(DWORD targetId);
   
    // 数据查询
    const WingData* getCurrentWing() const;
    const std::vector<WingData>& getWingList() const { return m_wings; }
    bool isEquipped(DWORD wingId) const;
   
    // 显示控制
    void showWing(bool show);
    void updateWingModel(DWORD wingId);// 更新3D模型
    void playUpgradeEffect();            // 播放升级特效
    void playEquipEffect();            // 播放装备特效
   
    // UI回调注册
    typedef void (*DataChangeCallback)();
    void registerCallback(DataChangeCallback cb) { m_callback = cb; }
   
private:
    std::vector<WingData> m_wings;       // 翅膀列表
    int m_curIndex;                      // 当前装备索引 (-1=无)
    WingViewData m_viewData;             // 显示数据
    DataChangeCallback m_callback;
   
    void parseWingList(const BYTE* data, int len);
    void parseWingUpdate(const BYTE* data, int len);
    void sendToServer(WORD cmd, const void* data, WORD len);
    void refreshDisplay();               // 刷新显示
};

#define WING_SYS WingSystem::getInstance()

#endif
#include "WingSystem.h"
#include "GameClient.h"
#include "SceneManager.h"
#include "EffectManager.h"
#include "UIManager.h"
#include "NetClient.h"
#include "Log.h"

// 协议定义(与服务端对应)
enum WING_CMD
{
    WING_REQ_UPGRADE = 0x2001,
    WING_REQ_EQUIP,
    WING_REQ_EMBED,
    WING_REQ_FEED,
    WING_NTF_LIST,
    WING_NTF_UPDATE,
    WING_NTF_UPGRADE_RESULT,
};

// 协议结构
#pragma pack(1)
struct WingUpgradeReq
{
    BYTE useProtect;
    BYTE useLucky;
};

struct WingUpgradeResp
{
    BYTE result;      // 0=成功,1=失败,2=掉级
    DWORD newLevel;
    DWORD newExp;
    DWORD power;
};

struct WingListNtf
{
    WORD count;
    // WingData data;
};
#pragma pack()

WingSystem::WingSystem() : m_curIndex(-1), m_callback(NULL)
{
}

WingSystem::~WingSystem()
{
}

bool WingSystem::init()
{
    // 注册网络消息监听
    NetClient::getInstance().registerHandler(WING_NTF_LIST, this,
      std::bind(&WingSystem::onServerMessage, this, std::placeholders::_1, std::placeholders::_2));
    NetClient::getInstance().registerHandler(WING_NTF_UPDATE, this,
      std::bind(&WingSystem::onServerMessage, this, std::placeholders::_1, std::placeholders::_2));
    NetClient::getInstance().registerHandler(WING_NTF_UPGRADE_RESULT, this,
      std::bind(&WingSystem::onServerMessage, this, std::placeholders::_1, std::placeholders::_2));
   
    LOG_INFO("WingSystem initialized");
    return true;
}

void WingSystem::final()
{
    m_wings.clear();
    m_curIndex = -1;
}

void WingSystem::onServerMessage(const BYTE* data, int len)
{
    if(len < 2) return;
    WORD cmd = *(WORD*)data;
    data += 2;
    len -= 2;
   
    switch(cmd)
    {
    case WING_NTF_LIST:
      parseWingList(data, len);
      break;
    case WING_NTF_UPDATE:
      parseWingUpdate(data, len);
      break;
    case WING_NTF_UPGRADE_RESULT:
      {
            WingUpgradeResp* resp = (WingUpgradeResp*)data;
            if(resp->result == 0)// 成功
            {
                playUpgradeEffect();
                UIManager::getInstance().showMessage("翅膀升级成功!", 0x00FF00);
            }
            else if(resp->result == 2)// 掉级
            {
                UIManager::getInstance().showMessage("升级失败,等级下降!", 0xFF0000);
                playEffect("failed_effect");
            }
            else
            {
                UIManager::getInstance().showMessage("升级失败!", 0xFF0000);
            }
            
            if(m_callback) m_callback();
      }
      break;
    }
}

void WingSystem::requestUpgrade(bool useProtect, bool useLucky)
{
    WingUpgradeReq req;
    req.useProtect = useProtect ? 1 : 0;
    req.useLucky = useLucky ? 1 : 0;
    sendToServer(WING_REQ_UPGRADE, &req, sizeof(req));
   
    // 播放点击音效
    GameClient::getInstance().playSound("button_click");
}

void WingSystem::requestEquip(DWORD wingId)
{
    sendToServer(WING_REQ_EQUIP, &wingId, sizeof(wingId));
}

void WingSystem::requestEmbed(int slot, DWORD gemId)
{
    struct { int slot; DWORD gemId; } req = {slot, gemId};
    sendToServer(WING_REQ_EMBED, &req, sizeof(req));
}

void WingSystem::parseWingList(const BYTE* data, int len)
{
    m_wings.clear();
    WingListNtf* head = (WingListNtf*)data;
    WingData* wings = (WingData*)(data + sizeof(WingListNtf));
   
    for(int i=0; i<head->count; i++)
    {
      m_wings.push_back(wings);
      if(wings.equipped)
            m_curIndex = i;
    }
   
    refreshDisplay();
    if(m_callback) m_callback();
}

void WingSystem::parseWingUpdate(const BYTE* data, int len)
{
    if(len < sizeof(WingData)) return;
    WingData* newData = (WingData*)data;
   
    // 更新或添加
    bool found = false;
    for(size_t i=0; i<m_wings.size(); i++)
    {
      if(m_wings.id == newData->id)
      {
            m_wings = *newData;
            found = true;
            break;
      }
    }
    if(!found)
    {
      m_wings.push_back(*newData);
    }
   
    refreshDisplay();
    if(m_callback) m_callback();
}

void WingSystem::refreshDisplay()
{
    if(m_curIndex < 0 || m_curIndex >= (int)m_wings.size())
    {
      showWing(false);
      return;
    }
   
    const WingData& data = m_wings;
   
    // 计算模型ID(根据等级)
    m_viewData.modelId = 100000 + data.id * 100 + data.level;
    m_viewData.effectId = 200000 + data.rank * 10;
    m_viewData.visible = true;
   
    // 更新3D显示
    updateWingModel(data.id);
}

void WingSystem::updateWingModel(DWORD wingId)
{
    SceneManager* scene = GameClient::getInstance().getSceneManager();
    if(!scene) return;
   
    // 移除旧模型
    scene->detachEffect("wing");
   
    if(!m_viewData.visible || m_viewData.modelId == 0)
      return;
   
    // 挂载到角色背部
    SceneEntity* player = scene->getPlayerEntity();
    if(player)
    {
      player->attachModel("wing", m_viewData.modelId, m_viewData.attachBone);
      
      if(m_viewData.effectId > 0)
      {
            player->attachEffect("wing_effect", m_viewData.effectId, m_viewData.attachBone);
      }
    }
}

void WingSystem::playUpgradeEffect()
{
    // 屏幕中央特效
    EffectManager::getInstance().playScreenEffect("wing_upgrade_success");
   
    // 角色身上特效
    SceneManager* scene = GameClient::getInstance().getSceneManager();
    if(scene)
    {
      SceneEntity* player = scene->getPlayerEntity();
      if(player)
      {
            player->playEffect("levelup_glow");
            player->playAnimation("cheer");
      }
    }
   
    // 音效
    GameClient::getInstance().playSound("wing_levelup");
}

void WingSystem::showWing(bool show)
{
    m_viewData.visible = show;
    SceneManager* scene = GameClient::getInstance().getSceneManager();
    if(scene)
    {
      SceneEntity* player = scene->getPlayerEntity();
      if(player)
      {
            player->showAttachment("wing", show);
      }
    }
}<div class="blockcode"><blockquote>-- scripts/client/UI/WingMainPanel.lua
-- 翅膀主界面

local WingMainPanel = {}
local WingSystem = require("WingSystem")

-- 界面元素缓存
local UI = {}

function WingMainPanel.Init()
    UI.panel = UIManager.Load("WingMainPanel.layout")
   
    -- 获取控件
    UI.wingModel = UI.panel:Find("WingModel")         -- 3D模型展示
    UI.attrPanel = UI.panel:Find("AttrPanel")         -- 属性面板
    UI.slotPanel = UI.panel:Find("SlotPanel")         -- 镶嵌面板
    UI.btnUpgrade = UI.panel:Find("BtnUpgrade")         -- 升级按钮
    UI.btnAuto = UI.panel:Find("BtnAuto")               -- 自动升级
    UI.protectCheck = UI.panel:Find("CheckProtect")   -- 保护符勾选
    UI.luckyCheck = UI.panel:Find("CheckLucky")         -- 幸运符勾选
    UI.expBar = UI.panel:Find("ExpBar")               -- 经验条
    UI.soulPanel = UI.panel:Find("SoulPanel")         -- 羽灵面板
   
    -- 属性标签
    UI.lblLevel = UI.panel:Find("LblLevel")
    UI.lblPower = UI.panel:Find("LblPower")
    UI.lblAtk = UI.panel:Find("LblAtk")
    UI.lblDef = UI.panel:Find("LblDef")
    UI.lblHP = UI.panel:Find("LblHP")
    UI.lblRate = UI.panel:Find("LblRate")
   
    -- 镶嵌槽
    UI.slots = {}
    for i = 1, 6 do
      UI.slots = UI.panel:Find("Slot" .. i)
      UI.slots:SetClick(function() WingMainPanel.OnSlotClick(i) end)
    end
   
    -- 按钮事件
    UI.btnUpgrade:SetClick(WingMainPanel.OnUpgradeClick)
    UI.btnAuto:SetClick(WingMainPanel.OnAutoUpgrade)
   
    -- 注册数据监听
    EventManager.On("WING_DATA_CHANGED", WingMainPanel.Refresh)
   
    return UI.panel
end

function WingMainPanel.Refresh(data)
    local current = nil
    for _, wing in pairs(data.myWings) do
      if wing.isEquipped then
            current = wing
            break
      end
    end
   
    if not current then
      UI.panel:Find("NoWingTip"):SetVisible(true)
      return
    end
   
    UI.panel:Find("NoWingTip"):SetVisible(false)
   
    -- 刷新基础信息
    UI.lblLevel:SetText(string.format("Lv.%d %s%d阶",
      current.level,
      WingMainPanel.GetRankName(current.rank),
      current.rank))
   
    UI.lblPower:SetText("战力: " .. (current.power or 0))
   
    -- 刷新属性
    local attrs = current.attrs or {}
    UI.lblAtk:SetText((attrs.atk or 0) .. " (+" .. (attrs.atkGrow or 0) .. ")")
    UI.lblDef:SetText((attrs.def or 0) .. " (+" .. (attrs.defGrow or 0) .. ")")
    UI.lblHP:SetText((attrs.hp or 0) .. " (+" .. (attrs.hpGrow or 0) .. ")")
    UI.lblRate:SetText((attrs.crit or 0) .. "%")
   
    -- 刷新经验条
    local expPct = current.exp / (current.maxExp or 1) * 100
    UI.expBar:SetValue(expPct)
    UI.expBar:SetText(string.format("%d/%d", current.exp, current.maxExp or 0))
   
    -- 刷新成功率
    local rate = WingSystem.GetSuccessRate(current.level, UI.luckyCheck:IsSelected())
    UI.btnUpgrade:SetText(string.format("升级 (%d%%)", rate))
   
    -- 刷新镶嵌槽
    for i = 1, 6 do
      local gemId = current.slots
      if gemId and gemId > 0 then
            local gemData = ConfigManager.GetGem(gemId)
            UI.slots:SetIcon(gemData.icon)
            UI.slots:SetQuality(gemData.quality)
            UI.slots:SetTooltip(gemData.name .. "\n" .. gemData.desc)
      else
            UI.slots:SetIcon("slot_empty.png")
            UI.slots:SetQuality(0)
            UI.slots:SetTooltip("空镶嵌槽\n点击镶嵌宝石")
      end
    end
   
    -- 刷新羽灵
    if data.soul then
      UI.soulPanel:Find("SoulLevel"):SetText("羽灵 Lv." .. data.soul.level)
      UI.soulPanel:Find("SoulBar"):SetValue(data.soul.power / data.soul.maxExp * 100)
    end
end

function WingMainPanel.OnUpgradeClick()
    local useProtect = UI.protectCheck:IsSelected()
    local useLucky = UI.luckyCheck:IsSelected()
   
    WingSystem.DoUpgrade(useProtect, useLucky)
end

function WingMainPanel.OnAutoUpgrade()
    -- 自动升级直到材料用完或满级
    local count = 0
    local timer = Timer.Start(500, function()
      if count >= 20 then-- 最多20次
            timer:Stop()
            return
      end
      
      WingSystem.DoUpgrade(true, true)
      count = count + 1
      
      -- 检查是否升级成功或满级
      local current = WingSystem.GetCurrentWing()
      if current and current.level >= WingSystem.Config.MAX_LEVEL then
            timer:Stop()
            Tips.Show("已达到最大等级!")
      end
    end)
end

function WingMainPanel.OnSlotClick(slotId)
    local current = WingSystem.GetCurrentWing()
    if not current then return end
   
    local gemId = current.slots
   
    if gemId and gemId > 0 then
      -- 已镶嵌,显示菜单
      UIManager.OpenMenu({
            {text = "卸下宝石", func = function() WingMainPanel.DoUnembed(slotId) end},
            {text = "替换宝石", func = function() WingMainPanel.OpenGemSelect(slotId) end},
      })
    else
      -- 空槽,直接选择宝石
      WingMainPanel.OpenGemSelect(slotId)
    end
end

function WingMainPanel.OpenGemSelect(slotId)
    -- 打开宝石选择界面
    local gems = BagSystem.GetGems()
    if #gems == 0 then
      Tips.Show("背包中没有宝石")
      return
    end
   
    UIManager.Open("GemSelectPanel", {
      gems = gems,
      onSelect = function(gemId)
            WingSystem.DoEmbed(slotId, gemId)
      end
    })
end

function WingMainPanel.GetRankName(rank)
    local names = {"普通", "精良", "稀有", "史诗", "传说"}
    return names or "未知"
end

function WingMainPanel.ShowUpgrading(show)
    UI.panel:Find("UpgradingEffect"):SetVisible(show)
    UI.btnUpgrade:SetEnabled(not show)
end

return WingMainPanel


const WingData* WingSystem::getCurrentWing() const
{
    if(m_curIndex >= 0 && m_curIndex < (int)m_wings.size())
      return &m_wings;
    return NULL;
}

void WingSystem::sendToServer(WORD cmd, const void* data, WORD len)
{
    NetClient::getInstance().send(cmd, data, len);
}

#ifndef WING_DEF_H
#define WING_DEF_H

// 翅膀档次
enum EWING_RANK
{
    EWING_RANK_1 = 1,    // 普通
    EWING_RANK_2,      // 精良
    EWING_RANK_3,      // 稀有
    EWING_RANK_4,      // 史诗
    EWING_RANK_5,      // 传说
    EWING_RANK_MAX,
};

// 翅膀品质
enum EWING_QUALITY
{
    EWING_QUALITY_WHITE = 1,   // 白
    EWING_QUALITY_GREEN,       // 绿
    EWING_QUALITY_BLUE,      // 蓝
    EWING_QUALITY_PURPLE,      // 紫
    EWING_QUALITY_ORANGE,      // 橙
    EWING_QUALITY_MAX,
};

// 最大等级
#define WING_MAX_LEVEL      15
#define WING_MIN_LEVEL      1
#define WING_MAX_MODELNUM   5   // 最多5种形态
#define WING_SLOT_COUNT   6   // 6个镶嵌槽

// 配置文件路径(客户端)
#define WING_MODEL_CFG      "Config/WingModel.cfg"
#define WING_EFFECT_CFG   "Config/WingEffect.cfg"

#endif
服务端
// WingSystem.h - 翅膀系统主类
#ifndef WING_SYSTEM_H
#define WING_SYSTEM_H

#include <map>
#include <vector>
#include <string>
#include <sys/types.h>

// 翅膀基础数据结构
struct WingBaseData
{
    int wingId;         // 翅膀ID
    int level;            // 当前等级
    int rank;             // 当前档次
    int exp;            // 当前经验
    int power;            // 威力值
    int physicalAttack;   // 物理攻击
    int magicAttack;      // 魔法攻击
    int physicalDefense;// 物理防御
    int magicDefense;   // 魔法防御
    int maxHP;            // 最大生命
    int maxMP;            // 最大魔法
    int critRate;         // 暴击率
    int moveSpeed;      // 移动速度
   
    // 镶嵌槽
    int embedSlot;   // 宝石ID,0表示空
   
    WingBaseData()
    {
      wingId = 1001;
      level = 1;
      rank = 1;
      exp = 0;
      power = 1000;
      physicalAttack = 100;
      magicAttack = 80;
      physicalDefense = 50;
      magicDefense = 45;
      maxHP = 1000;
      maxMP = 500;
      critRate = 5;
      moveSpeed = 100;
      for(int i=0; i<6; i++) embedSlot = 0;
    }
};

// 羽灵数据
struct WingSoulData
{
    int level;      // 羽灵等级
    int power;      // 当前灵力
    int maxExp;   // 升级所需灵力
    int minProp;    // 最小属性值
    int maxProp;    // 最大属性值
   
    WingSoulData()
    {
      level = 1;
      power = 0;
      maxExp = 1000;
      minProp = 10;
      maxProp = 20;
    }
};

class WingSystem
{
public:
    static WingSystem* Instance();
   
    // 初始化
    bool Initialize();
   
    // 核心功能接口
    int DoUpgrade(int64_t playerId, int wingId, bool useProtection, bool useLucky);
    int DoEmbed(int64_t playerId, int slotId, int gemId);
    int DoSoulFeed(int64_t playerId, int foodId);
   
    // 数据查询
    void GetWingData(int64_t playerId, WingBaseData& data);
    void PrintWingInfo(int64_t playerId);
   
    // 定时保存
    void AutoSave();
   
private:
    WingSystem() {}
    std::map<int64_t, WingBaseData> m_playerWings;
    std::map<int64_t, WingSoulData> m_playerSouls;
   
    WingBaseData* GetPlayerData(int64_t playerId);
    void CalculateAttributes(WingBaseData* data);
    int GetUpgradeSuccessRate(int level, bool useLucky);
};

#endif
// WingSystem.cpp - 翅膀系统实现
#include "WingSystem.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

WingSystem* WingSystem::Instance()
{
    static WingSystem instance;
    return &instance;
}

bool WingSystem::Initialize()
{
    srand((unsigned)time(NULL));
    printf(" 翅膀系统初始化完成\n");
    return true;
}

WingBaseData* WingSystem::GetPlayerData(int64_t playerId)
{
    std::map<int64_t, WingBaseData>::iterator it = m_playerWings.find(playerId);
    if(it == m_playerWings.end())
    {
      // 新建玩家翅膀数据
      WingBaseData newData;
      m_playerWings = newData;
      return &m_playerWings;
    }
    return &it->second;
}

int WingSystem::GetUpgradeSuccessRate(int level, bool useLucky)
{
    // 基础成功率:100, 95, 90, 85... 最低10%
    int baseRate = 100 - (level - 1) * 5;
    if(baseRate < 10) baseRate = 10;
   
    if(useLucky) baseRate += 20;
    if(baseRate > 100) baseRate = 100;
   
    return baseRate;
}

int WingSystem::DoUpgrade(int64_t playerId, int wingId, bool useProtection, bool useLucky)
{
    WingBaseData* data = GetPlayerData(playerId);
   
    // 检查最大等级(假设最大100级)
    if(data->level >= 100)
    {
      printf(" 玩家 %lld 翅膀已达最大等级\n", (long long)playerId);
      return -1; // 已满级
    }
   
    int currentLevel = data->level;
    int successRate = GetUpgradeSuccessRate(currentLevel, useLucky);
   
    printf(" 玩家 %lld 强化翅膀 (当前Lv.%d, 成功率:%d%%)\n",
         (long long)playerId, currentLevel, successRate);
   
    // 随机判定
    int random = rand() % 100;
    if(random >= successRate)
    {
      // 强化失败
      printf(" 强化失败!\n");
      
      if(!useProtection && currentLevel > 1)
      {
            // 无保护符,降级处理
            if(currentLevel % 10 == 0)
            {
                // 整十级失败降档
                data->rank--;
                data->level -= 10;
                printf(" 降级至 %d 阶 %d 级\n", data->rank, data->level);
            }
            else
            {
                data->level--;
                printf(" 降级至 %d 级\n", data->level);
            }
      }
      else if(useProtection)
      {
            printf(" 保护符生效,等级不变\n");
      }
      
      return -2; // 失败
    }
   
    // 强化成功
    data->level++;
   
    // 每10级升1阶
    if(data->level % 10 == 0)
    {
      data->rank++;
      printf(" 恭喜!进阶成功!当前 %d 阶 %d 级\n", data->rank, data->level);
    }
    else
    {
      printf(" 升级成功!当前 %d 级\n", data->level);
    }
   
    // 重新计算属性
    CalculateAttributes(data);
   
    return 0; // 成功
}

int WingSystem::DoEmbed(int64_t playerId, int slotId, int gemId)
{
    if(slotId < 0 || slotId >= 6)
    {
      printf(" 错误的槽位ID: %d\n", slotId);
      return -1;
    }
   
    WingBaseData* data = GetPlayerData(playerId);
   
    // 检查槽位是否解锁(简化:前3个槽位默认解锁,后3个需要等级)
    if(slotId >= 3 && data->level < 30)
    {
      printf(" 槽位 %d 需要翅膀达到30级\n", slotId);
      return -2;
    }
   
    data->embedSlot = gemId;
    printf(" 玩家 %lld 在槽位 %d 镶嵌宝石 %d\n",
         (long long)playerId, slotId, gemId);
   
    // 重新计算属性(宝石加成)
    CalculateAttributes(data);
   
    return 0;
}

int WingSystem::DoSoulFeed(int64_t playerId, int foodId)
{
    std::map<int64_t, WingSoulData>::iterator it = m_playerSouls.find(playerId);
    if(it == m_playerSouls.end())
    {
      WingSoulData newSoul;
      m_playerSouls = newSoul;
      it = m_playerSouls.find(playerId);
    }
   
    WingSoulData* soul = &it->second;
   
    // 根据食物ID增加不同经验(简化处理)
    int addExp = 100;
    if(foodId == 2) addExp = 500;
    if(foodId == 3) addExp = 2000;
   
    soul->power += addExp;
    printf(" 玩家 %lld 喂养羽灵 +%d 经验\n", (long long)playerId, addExp);
   
    // 检查升级
    if(soul->power >= soul->maxExp)
    {
      soul->level++;
      soul->power -= soul->maxExp;
      soul->maxExp = (int)(soul->maxExp * 1.2);
      soul->minProp += 5;
      soul->maxProp += 5;
      printf(" 羽灵升级!当前等级 %d\n", soul->level);
    }
   
    return 0;
}

void WingSystem::CalculateAttributes(WingBaseData* data)
{
    // 基础计算公式
    int level = data->level;
    int rank = data->rank;
   
    // 等级成长
    data->physicalAttack = 100 + level * 10 + rank * 50;
    data->magicAttack = 80 + level * 8 + rank * 40;
    data->physicalDefense = 50 + level * 5 + rank * 25;
    data->magicDefense = 45 + level * 4 + rank * 20;
    data->maxHP = 1000 + level * 50 + rank * 200;
    data->maxMP = 500 + level * 20 + rank * 100;
    data->critRate = 5 + level / 5;
    data->moveSpeed = 100 + level / 2;
   
    // 镶嵌加成(每个宝石+50攻击)
    int embedBonus = 0;
    for(int i=0; i<6; i++)
    {
      if(data->embedSlot > 0) embedBonus += 50;
    }
    data->physicalAttack += embedBonus;
    data->magicAttack += embedBonus;
   
    // 威力值计算
    data->power = level * 100 + rank * 500 + embedBonus * 2;
}

void WingSystem::GetWingData(int64_t playerId, WingBaseData& data)
{
    WingBaseData* src = GetPlayerData(playerId);
    memcpy(&data, src, sizeof(WingBaseData));
}

void WingSystem::PrintWingInfo(int64_t playerId)
{
    WingBaseData data;
    GetWingData(playerId, data);
   
    printf("\n========== 玩家 %lld 翅膀信息 ==========\n", (long long)playerId);
    printf("翅膀ID: %d\n", data.wingId);
    printf("等级: %d (档次: %d)\n", data.level, data.rank);
    printf("威力: %d\n", data.power);
    printf("物理攻击: %d | 魔法攻击: %d\n", data.physicalAttack, data.magicAttack);
    printf("物理防御: %d | 魔法防御: %d\n", data.physicalDefense, data.magicDefense);
    printf("生命: %d | 魔法: %d\n", data.maxHP, data.maxMP);
    printf("暴击: %d%% | 移速: %d\n", data.critRate, data.moveSpeed);
    printf("镶嵌: ");
    for(int i=0; i<6; i++)
    {
      if(data.embedSlot > 0)
            printf("[%d]:%d ", i, data.embedSlot);
      else
            printf("[%d]:空 ", i);
    }
    printf("\n=====================================\n\n");
}

void WingSystem::AutoSave()
{
    // 这里可以实现定时保存到数据库的逻辑
    // 简化版本:仅打印日志
    static int count = 0;
    if(++count % 100 == 0)
    {
      printf(" 自动保存检查... 当前在线玩家: %d\n", (int)m_playerWings.size());
    }
}
我的启动成功60210-11:33:49 ScenesServer TRACE: -------------------加载宝盒数据成功!-------------------
翅膀系统初始化完成
260210-11:33:49 ScenesServerINFO: 翅膀系统初始化完成
260210-11:33:49 ScenesServer TRACE: zSubNetService::validate
260210-11:33:49 SuperServer TRACE: ServerTask::waitSync
260210-11:33:49 SuperServer TRACE: ServerTask::processSequence(wdServerType=22)
260210-11:33:49 SuperServer TRACE: ServerTask::verifyTypeOK(wdType=11)
260210-11:33:49 SuperServer TRACE: ServerManager::getServer(serverid=11)
260210-11:33:49 SuperServer TRACE: ServerTask::verifyTypeOK(wdType=12)
260210-11:33:49 SuperServer TRACE: ServerManager::getServer(serverid=12)
260210-11:33:49 SuperServer TRACE: ServerTask::verifyTypeOK(wdType=20)
260210-11:33:49 SuperServer TRACE: ServerManager::getServer(serverid=20)
260210-11:33:49 SuperServer TRACE: ServerTask::verifyTypeOK(wdType=21)
260210-11:33:49 SuperServer TRACE: ServerManager::getServer(serverid=21)
260210-11:33:49 SuperServer TRACE: ServerTask::notifyOther()
260210-11:33:49 SuperServer TRACE: ServerManager::broadcastByID(serverid=11)
260210-11:33:49 SuperServer TRACE: ServerTask::notifyOther()srcid=11 curval = 1
260210-11:33:49 SuperServer TRACE: ServerManager::broadcastByID(serverid=12)
260210-11:33:49 SuperServer TRACE: ServerTask::notifyOther()srcid=12 curval = 1
260210-11:33:49 SuperServer TRACE: ServerManager::broadcastByID(serverid=20)
260210-11:33:49 SuperServer TRACE: ServerTask::notifyOther()srcid=20 curval = 1
260210-11:33:49 SuperServer DEBUG: 检查处理启动顺序checkSequenceTime()=false
260210-11:33:49 SuperServer DEBUG: 检查处理启动顺序processSequence()=false
260210-11:33:49 SuperServer TRACE: ServerTask::notifyMe(serverid=22 servertype=22)

bombond 发表于 2026-2-10 12:30:09

牛啊牛:不玩支持:

liyicheng556 发表于 2026-2-10 12:30:34

多谢分享哦

liyicheng556 发表于 2026-2-10 12:31:36

中奖概率太低了。。。。

liyicheng556 发表于 2026-2-10 12:33:42

不信不中奖。。。。

花花哥哥 发表于 2026-2-10 12:41:57


不信不中奖。。。。

qq449279758 发表于 2026-2-10 18:57:31

不信不中奖。。。。

qq449279758 发表于 2026-2-10 18:58:39

中奖概率太低了。。。。

点上一支烟 发表于 2026-2-10 19:23:09

不信不中奖。。。。

点上一支烟 发表于 2026-2-10 19:25:53

不信不中奖。。。。

chu_jian 发表于 2026-5-14 22:41:47

感谢分享

305209371 发表于 2026-5-16 23:50:28

::::::::::
页: [1]
查看完整版本: 征途翅膀外观特

本站内容如若侵犯到您的权益,请来电来函告知,我们会尽快处理!
联系QQ:1953150286,2251387361,123784736,免责申明