藏宝湾网游单机站

 找回密码
 注册

QQ登录

只需一步,快速开始

★69 元包站 Gm 手游平台★

★69 元包站 Gm 手游平台★

★Gm 游戏平台【无限资源包站平台,真正体验gm和土豪感觉】★

★白嫖放置传奇 玩通关算你赢★

★白嫖放置传奇 玩通关算你赢★

★白嫖长久耐玩型 放置类挂机传奇游戏 充值可打 安全挂机 可交易 无PK★

★@梦幻长久耐玩全新大唐九黎★

★@!!——梦幻长久耐玩全新大唐九黎——!!★

★★新增全新门派九黎城, ★侵烛系统 ★静脉系统 ★赐福系统 ★战斗动作声效系统 ★全场景NPC、召唤兽迭代最新 ★17个副本,完全还原 ★独家PK系统,享受极致免费PK★★

承接推广
★承接推广★

★承接推广★

☆ 六一活动开放-放置传奇☆

★ 六一活动开放-放置传奇★

★可白嫖 上班摸鱼类 放置文字传奇游戏(放置休闲)qq群756025698★

★三职业复古★开局送神装★爆率100%★零氪首选★

★三职业复古★开局送神装★爆率100%★零氪首选★

★〖双线〗〖无忧传奇〗〖每日新区〗〖开局送神装 100%高爆率 装备元宝打怪爆〗★

承接推广

★承接推广★

★承接推广★

承接推广

★承接推广★

★承接推广★

★DNF★全职业平衡★公益服★
★DNF★全职业平衡★公益服★

【dnf86版本】【怀旧服】【全职业平衡】【非变态服】【非商业服】【774031300】

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

查看: 933|回复: 11

[原创] 征途翅膀外观特

[复制链接]
回帖奖励 100 枚金币 回复本帖可获得 1 枚金币奖励! 每人限 1 次(中奖概率 20%)
 楼主| 发表于 2026-2-10 12:17:43 | 显示全部楼层 |阅读模式
本帖最后由 bfdz49 于 2026-2-10 13:34 编辑

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

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

命令
  1. cd /home/server/ScenesServer


  2. /usr/bin/g++ -c -g -D_USE_EPOLL_ -D_USE_CMD_NAMESPACE -D_ENCDEC_MSG -D_WQH_DEBUG -D_ALL_SUPER_GM \
  3.   -I../base -I../script -I../zise -Wall -D_GNU_SOURCE -D_REENTRANT \
  4.   `mysql_config --cflags` `xml2-config --cflags` \
  5.   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("翅膀系统初始化失败");

客户端
  1. #ifndef WING_SYSTEM_H
  2. #define WING_SYSTEM_H

  3. #include "zType.h"
  4. #include "zSingleton.h"
  5. #include <map>
  6. #include <vector>

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

  21. // 翅膀属性数据(从服务端同步)
  22. struct WingData
  23. {
  24.     DWORD id;             // 翅膀ID
  25.     DWORD level;          // 等级
  26.     DWORD rank;           // 档次
  27.     DWORD exp;            // 当前经验
  28.     DWORD maxExp;         // 升级需要经验
  29.     DWORD power;          // 威力值
  30.     bool equipped;        // 是否装备
  31.    
  32.     // 属性值(显示用)
  33.     int pa;               // 物攻
  34.     int ma;               // 魔攻
  35.     int pd;               // 物防
  36.     int md;               // 魔防
  37.     int hp;               // 生命
  38.     int speed;            // 速度
  39.    
  40.     // 镶嵌
  41.     DWORD gemId[6];       // 6个宝石槽
  42.    
  43.     WingData()
  44.     {
  45.         memset(this, 0, sizeof(*this));
  46.         level = 1;
  47.     }
  48. };

  49. class WingSystem : public zSingleton<WingSystem>
  50. {
  51. public:
  52.     WingSystem();
  53.     ~WingSystem();
  54.    
  55.     // 初始化
  56.     bool init();
  57.     void final();
  58.    
  59.     // 网络消息处理(从服务端接收)
  60.     void onServerMessage(const BYTE* data, int len);
  61.    
  62.     // 用户操作(发送请求到服务端)
  63.     void requestUpgrade(bool useProtect, bool useLucky);
  64.     void requestEquip(DWORD wingId);
  65.     void requestEmbed(int slot, DWORD gemId);
  66.     void requestSoulFeed(DWORD itemId);
  67.     void requestTransform(DWORD targetId);
  68.    
  69.     // 数据查询
  70.     const WingData* getCurrentWing() const;
  71.     const std::vector<WingData>& getWingList() const { return m_wings; }
  72.     bool isEquipped(DWORD wingId) const;
  73.    
  74.     // 显示控制
  75.     void showWing(bool show);
  76.     void updateWingModel(DWORD wingId);  // 更新3D模型
  77.     void playUpgradeEffect();            // 播放升级特效
  78.     void playEquipEffect();              // 播放装备特效
  79.    
  80.     // UI回调注册
  81.     typedef void (*DataChangeCallback)();
  82.     void registerCallback(DataChangeCallback cb) { m_callback = cb; }
  83.    
  84. private:
  85.     std::vector<WingData> m_wings;       // 翅膀列表
  86.     int m_curIndex;                      // 当前装备索引 (-1=无)
  87.     WingViewData m_viewData;             // 显示数据
  88.     DataChangeCallback m_callback;
  89.    
  90.     void parseWingList(const BYTE* data, int len);
  91.     void parseWingUpdate(const BYTE* data, int len);
  92.     void sendToServer(WORD cmd, const void* data, WORD len);
  93.     void refreshDisplay();               // 刷新显示
  94. };

  95. #define WING_SYS WingSystem::getInstance()

  96. #endif
复制代码
  1. #include "WingSystem.h"
  2. #include "GameClient.h"
  3. #include "SceneManager.h"
  4. #include "EffectManager.h"
  5. #include "UIManager.h"
  6. #include "NetClient.h"
  7. #include "Log.h"

  8. // 协议定义(与服务端对应)
  9. enum WING_CMD
  10. {
  11.     WING_REQ_UPGRADE = 0x2001,
  12.     WING_REQ_EQUIP,
  13.     WING_REQ_EMBED,
  14.     WING_REQ_FEED,
  15.     WING_NTF_LIST,
  16.     WING_NTF_UPDATE,
  17.     WING_NTF_UPGRADE_RESULT,
  18. };

  19. // 协议结构
  20. #pragma pack(1)
  21. struct WingUpgradeReq
  22. {
  23.     BYTE useProtect;
  24.     BYTE useLucky;
  25. };

  26. struct WingUpgradeResp
  27. {
  28.     BYTE result;      // 0=成功,1=失败,2=掉级
  29.     DWORD newLevel;
  30.     DWORD newExp;
  31.     DWORD power;
  32. };

  33. struct WingListNtf
  34. {
  35.     WORD count;
  36.     // WingData data[count];
  37. };
  38. #pragma pack()

  39. WingSystem::WingSystem() : m_curIndex(-1), m_callback(NULL)
  40. {
  41. }

  42. WingSystem::~WingSystem()
  43. {
  44. }

  45. bool WingSystem::init()
  46. {
  47.     // 注册网络消息监听
  48.     NetClient::getInstance().registerHandler(WING_NTF_LIST, this,
  49.         std::bind(&WingSystem::onServerMessage, this, std::placeholders::_1, std::placeholders::_2));
  50.     NetClient::getInstance().registerHandler(WING_NTF_UPDATE, this,
  51.         std::bind(&WingSystem::onServerMessage, this, std::placeholders::_1, std::placeholders::_2));
  52.     NetClient::getInstance().registerHandler(WING_NTF_UPGRADE_RESULT, this,
  53.         std::bind(&WingSystem::onServerMessage, this, std::placeholders::_1, std::placeholders::_2));
  54.    
  55.     LOG_INFO("WingSystem initialized");
  56.     return true;
  57. }

  58. void WingSystem::final()
  59. {
  60.     m_wings.clear();
  61.     m_curIndex = -1;
  62. }

  63. void WingSystem::onServerMessage(const BYTE* data, int len)
  64. {
  65.     if(len < 2) return;
  66.     WORD cmd = *(WORD*)data;
  67.     data += 2;
  68.     len -= 2;
  69.    
  70.     switch(cmd)
  71.     {
  72.     case WING_NTF_LIST:
  73.         parseWingList(data, len);
  74.         break;
  75.     case WING_NTF_UPDATE:
  76.         parseWingUpdate(data, len);
  77.         break;
  78.     case WING_NTF_UPGRADE_RESULT:
  79.         {
  80.             WingUpgradeResp* resp = (WingUpgradeResp*)data;
  81.             if(resp->result == 0)  // 成功
  82.             {
  83.                 playUpgradeEffect();
  84.                 UIManager::getInstance().showMessage("翅膀升级成功!", 0x00FF00);
  85.             }
  86.             else if(resp->result == 2)  // 掉级
  87.             {
  88.                 UIManager::getInstance().showMessage("升级失败,等级下降!", 0xFF0000);
  89.                 playEffect("failed_effect");
  90.             }
  91.             else
  92.             {
  93.                 UIManager::getInstance().showMessage("升级失败!", 0xFF0000);
  94.             }
  95.             
  96.             if(m_callback) m_callback();
  97.         }
  98.         break;
  99.     }
  100. }

  101. void WingSystem::requestUpgrade(bool useProtect, bool useLucky)
  102. {
  103.     WingUpgradeReq req;
  104.     req.useProtect = useProtect ? 1 : 0;
  105.     req.useLucky = useLucky ? 1 : 0;
  106.     sendToServer(WING_REQ_UPGRADE, &req, sizeof(req));
  107.    
  108.     // 播放点击音效
  109.     GameClient::getInstance().playSound("button_click");
  110. }

  111. void WingSystem::requestEquip(DWORD wingId)
  112. {
  113.     sendToServer(WING_REQ_EQUIP, &wingId, sizeof(wingId));
  114. }

  115. void WingSystem::requestEmbed(int slot, DWORD gemId)
  116. {
  117.     struct { int slot; DWORD gemId; } req = {slot, gemId};
  118.     sendToServer(WING_REQ_EMBED, &req, sizeof(req));
  119. }

  120. void WingSystem::parseWingList(const BYTE* data, int len)
  121. {
  122.     m_wings.clear();
  123.     WingListNtf* head = (WingListNtf*)data;
  124.     WingData* wings = (WingData*)(data + sizeof(WingListNtf));
  125.    
  126.     for(int i=0; i<head->count; i++)
  127.     {
  128.         m_wings.push_back(wings[i]);
  129.         if(wings[i].equipped)
  130.             m_curIndex = i;
  131.     }
  132.    
  133.     refreshDisplay();
  134.     if(m_callback) m_callback();
  135. }

  136. void WingSystem::parseWingUpdate(const BYTE* data, int len)
  137. {
  138.     if(len < sizeof(WingData)) return;
  139.     WingData* newData = (WingData*)data;
  140.    
  141.     // 更新或添加
  142.     bool found = false;
  143.     for(size_t i=0; i<m_wings.size(); i++)
  144.     {
  145.         if(m_wings[i].id == newData->id)
  146.         {
  147.             m_wings[i] = *newData;
  148.             found = true;
  149.             break;
  150.         }
  151.     }
  152.     if(!found)
  153.     {
  154.         m_wings.push_back(*newData);
  155.     }
  156.    
  157.     refreshDisplay();
  158.     if(m_callback) m_callback();
  159. }

  160. void WingSystem::refreshDisplay()
  161. {
  162.     if(m_curIndex < 0 || m_curIndex >= (int)m_wings.size())
  163.     {
  164.         showWing(false);
  165.         return;
  166.     }
  167.    
  168.     const WingData& data = m_wings[m_curIndex];
  169.    
  170.     // 计算模型ID(根据等级)
  171.     m_viewData.modelId = 100000 + data.id * 100 + data.level;
  172.     m_viewData.effectId = 200000 + data.rank * 10;
  173.     m_viewData.visible = true;
  174.    
  175.     // 更新3D显示
  176.     updateWingModel(data.id);
  177. }

  178. void WingSystem::updateWingModel(DWORD wingId)
  179. {
  180.     SceneManager* scene = GameClient::getInstance().getSceneManager();
  181.     if(!scene) return;
  182.    
  183.     // 移除旧模型
  184.     scene->detachEffect("wing");
  185.    
  186.     if(!m_viewData.visible || m_viewData.modelId == 0)
  187.         return;
  188.    
  189.     // 挂载到角色背部
  190.     SceneEntity* player = scene->getPlayerEntity();
  191.     if(player)
  192.     {
  193.         player->attachModel("wing", m_viewData.modelId, m_viewData.attachBone);
  194.         
  195.         if(m_viewData.effectId > 0)
  196.         {
  197.             player->attachEffect("wing_effect", m_viewData.effectId, m_viewData.attachBone);
  198.         }
  199.     }
  200. }

  201. void WingSystem::playUpgradeEffect()
  202. {
  203.     // 屏幕中央特效
  204.     EffectManager::getInstance().playScreenEffect("wing_upgrade_success");
  205.    
  206.     // 角色身上特效
  207.     SceneManager* scene = GameClient::getInstance().getSceneManager();
  208.     if(scene)
  209.     {
  210.         SceneEntity* player = scene->getPlayerEntity();
  211.         if(player)
  212.         {
  213.             player->playEffect("levelup_glow");
  214.             player->playAnimation("cheer");
  215.         }
  216.     }
  217.    
  218.     // 音效
  219.     GameClient::getInstance().playSound("wing_levelup");
  220. }

  221. void WingSystem::showWing(bool show)
  222. {
  223.     m_viewData.visible = show;
  224.     SceneManager* scene = GameClient::getInstance().getSceneManager();
  225.     if(scene)
  226.     {
  227.         SceneEntity* player = scene->getPlayerEntity();
  228.         if(player)
  229.         {
  230.             player->showAttachment("wing", show);
  231.         }
  232.     }
  233. }<div class="blockcode"><blockquote>-- scripts/client/UI/WingMainPanel.lua
  234. -- 翅膀主界面

  235. local WingMainPanel = {}
  236. local WingSystem = require("WingSystem")

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

  239. function WingMainPanel.Init()
  240.     UI.panel = UIManager.Load("WingMainPanel.layout")
  241.    
  242.     -- 获取控件
  243.     UI.wingModel = UI.panel:Find("WingModel")           -- 3D模型展示
  244.     UI.attrPanel = UI.panel:Find("AttrPanel")           -- 属性面板
  245.     UI.slotPanel = UI.panel:Find("SlotPanel")           -- 镶嵌面板
  246.     UI.btnUpgrade = UI.panel:Find("BtnUpgrade")         -- 升级按钮
  247.     UI.btnAuto = UI.panel:Find("BtnAuto")               -- 自动升级
  248.     UI.protectCheck = UI.panel:Find("CheckProtect")     -- 保护符勾选
  249.     UI.luckyCheck = UI.panel:Find("CheckLucky")         -- 幸运符勾选
  250.     UI.expBar = UI.panel:Find("ExpBar")                 -- 经验条
  251.     UI.soulPanel = UI.panel:Find("SoulPanel")           -- 羽灵面板
  252.    
  253.     -- 属性标签
  254.     UI.lblLevel = UI.panel:Find("LblLevel")
  255.     UI.lblPower = UI.panel:Find("LblPower")
  256.     UI.lblAtk = UI.panel:Find("LblAtk")
  257.     UI.lblDef = UI.panel:Find("LblDef")
  258.     UI.lblHP = UI.panel:Find("LblHP")
  259.     UI.lblRate = UI.panel:Find("LblRate")
  260.    
  261.     -- 镶嵌槽
  262.     UI.slots = {}
  263.     for i = 1, 6 do
  264.         UI.slots[i] = UI.panel:Find("Slot" .. i)
  265.         UI.slots[i]:SetClick(function() WingMainPanel.OnSlotClick(i) end)
  266.     end
  267.    
  268.     -- 按钮事件
  269.     UI.btnUpgrade:SetClick(WingMainPanel.OnUpgradeClick)
  270.     UI.btnAuto:SetClick(WingMainPanel.OnAutoUpgrade)
  271.    
  272.     -- 注册数据监听
  273.     EventManager.On("WING_DATA_CHANGED", WingMainPanel.Refresh)
  274.    
  275.     return UI.panel
  276. end

  277. function WingMainPanel.Refresh(data)
  278.     local current = nil
  279.     for _, wing in pairs(data.myWings) do
  280.         if wing.isEquipped then
  281.             current = wing
  282.             break
  283.         end
  284.     end
  285.    
  286.     if not current then
  287.         UI.panel:Find("NoWingTip"):SetVisible(true)
  288.         return
  289.     end
  290.    
  291.     UI.panel:Find("NoWingTip"):SetVisible(false)
  292.    
  293.     -- 刷新基础信息
  294.     UI.lblLevel:SetText(string.format("Lv.%d %s%d阶",
  295.         current.level,
  296.         WingMainPanel.GetRankName(current.rank),
  297.         current.rank))
  298.    
  299.     UI.lblPower:SetText("战力: " .. (current.power or 0))
  300.    
  301.     -- 刷新属性
  302.     local attrs = current.attrs or {}
  303.     UI.lblAtk:SetText((attrs.atk or 0) .. " (+" .. (attrs.atkGrow or 0) .. ")")
  304.     UI.lblDef:SetText((attrs.def or 0) .. " (+" .. (attrs.defGrow or 0) .. ")")
  305.     UI.lblHP:SetText((attrs.hp or 0) .. " (+" .. (attrs.hpGrow or 0) .. ")")
  306.     UI.lblRate:SetText((attrs.crit or 0) .. "%")
  307.    
  308.     -- 刷新经验条
  309.     local expPct = current.exp / (current.maxExp or 1) * 100
  310.     UI.expBar:SetValue(expPct)
  311.     UI.expBar:SetText(string.format("%d/%d", current.exp, current.maxExp or 0))
  312.    
  313.     -- 刷新成功率
  314.     local rate = WingSystem.GetSuccessRate(current.level, UI.luckyCheck:IsSelected())
  315.     UI.btnUpgrade:SetText(string.format("升级 (%d%%)", rate))
  316.    
  317.     -- 刷新镶嵌槽
  318.     for i = 1, 6 do
  319.         local gemId = current.slots[i]
  320.         if gemId and gemId > 0 then
  321.             local gemData = ConfigManager.GetGem(gemId)
  322.             UI.slots[i]:SetIcon(gemData.icon)
  323.             UI.slots[i]:SetQuality(gemData.quality)
  324.             UI.slots[i]:SetTooltip(gemData.name .. "\n" .. gemData.desc)
  325.         else
  326.             UI.slots[i]:SetIcon("slot_empty.png")
  327.             UI.slots[i]:SetQuality(0)
  328.             UI.slots[i]:SetTooltip("空镶嵌槽\n点击镶嵌宝石")
  329.         end
  330.     end
  331.    
  332.     -- 刷新羽灵
  333.     if data.soul then
  334.         UI.soulPanel:Find("SoulLevel"):SetText("羽灵 Lv." .. data.soul.level)
  335.         UI.soulPanel:Find("SoulBar"):SetValue(data.soul.power / data.soul.maxExp * 100)
  336.     end
  337. end

  338. function WingMainPanel.OnUpgradeClick()
  339.     local useProtect = UI.protectCheck:IsSelected()
  340.     local useLucky = UI.luckyCheck:IsSelected()
  341.    
  342.     WingSystem.DoUpgrade(useProtect, useLucky)
  343. end

  344. function WingMainPanel.OnAutoUpgrade()
  345.     -- 自动升级直到材料用完或满级
  346.     local count = 0
  347.     local timer = Timer.Start(500, function()
  348.         if count >= 20 then  -- 最多20次
  349.             timer:Stop()
  350.             return
  351.         end
  352.         
  353.         WingSystem.DoUpgrade(true, true)
  354.         count = count + 1
  355.         
  356.         -- 检查是否升级成功或满级
  357.         local current = WingSystem.GetCurrentWing()
  358.         if current and current.level >= WingSystem.Config.MAX_LEVEL then
  359.             timer:Stop()
  360.             Tips.Show("已达到最大等级!")
  361.         end
  362.     end)
  363. end

  364. function WingMainPanel.OnSlotClick(slotId)
  365.     local current = WingSystem.GetCurrentWing()
  366.     if not current then return end
  367.    
  368.     local gemId = current.slots[slotId]
  369.    
  370.     if gemId and gemId > 0 then
  371.         -- 已镶嵌,显示菜单
  372.         UIManager.OpenMenu({
  373.             {text = "卸下宝石", func = function() WingMainPanel.DoUnembed(slotId) end},
  374.             {text = "替换宝石", func = function() WingMainPanel.OpenGemSelect(slotId) end},
  375.         })
  376.     else
  377.         -- 空槽,直接选择宝石
  378.         WingMainPanel.OpenGemSelect(slotId)
  379.     end
  380. end

  381. function WingMainPanel.OpenGemSelect(slotId)
  382.     -- 打开宝石选择界面
  383.     local gems = BagSystem.GetGems()
  384.     if #gems == 0 then
  385.         Tips.Show("背包中没有宝石")
  386.         return
  387.     end
  388.    
  389.     UIManager.Open("GemSelectPanel", {
  390.         gems = gems,
  391.         onSelect = function(gemId)
  392.             WingSystem.DoEmbed(slotId, gemId)
  393.         end
  394.     })
  395. end

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

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

  404. return WingMainPanel
复制代码


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

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

  1. #ifndef WING_DEF_H
  2. #define WING_DEF_H

  3. // 翅膀档次
  4. enum EWING_RANK
  5. {
  6.     EWING_RANK_1 = 1,    // 普通
  7.     EWING_RANK_2,        // 精良
  8.     EWING_RANK_3,        // 稀有
  9.     EWING_RANK_4,        // 史诗
  10.     EWING_RANK_5,        // 传说
  11.     EWING_RANK_MAX,
  12. };

  13. // 翅膀品质
  14. enum EWING_QUALITY
  15. {
  16.     EWING_QUALITY_WHITE = 1,   // 白
  17.     EWING_QUALITY_GREEN,       // 绿
  18.     EWING_QUALITY_BLUE,        // 蓝
  19.     EWING_QUALITY_PURPLE,      // 紫
  20.     EWING_QUALITY_ORANGE,      // 橙
  21.     EWING_QUALITY_MAX,
  22. };

  23. // 最大等级
  24. #define WING_MAX_LEVEL      15
  25. #define WING_MIN_LEVEL      1
  26. #define WING_MAX_MODELNUM   5   // 最多5种形态
  27. #define WING_SLOT_COUNT     6   // 6个镶嵌槽

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

  31. #endif
复制代码
服务端
  1. // WingSystem.h - 翅膀系统主类
  2. #ifndef WING_SYSTEM_H
  3. #define WING_SYSTEM_H

  4. #include <map>
  5. #include <vector>
  6. #include <string>
  7. #include <sys/types.h>

  8. // 翅膀基础数据结构
  9. struct WingBaseData
  10. {
  11.     int wingId;           // 翅膀ID
  12.     int level;            // 当前等级
  13.     int rank;             // 当前档次
  14.     int exp;              // 当前经验
  15.     int power;            // 威力值
  16.     int physicalAttack;   // 物理攻击
  17.     int magicAttack;      // 魔法攻击
  18.     int physicalDefense;  // 物理防御
  19.     int magicDefense;     // 魔法防御
  20.     int maxHP;            // 最大生命
  21.     int maxMP;            // 最大魔法
  22.     int critRate;         // 暴击率
  23.     int moveSpeed;        // 移动速度
  24.    
  25.     // 镶嵌槽 [6个槽位]
  26.     int embedSlot[6];     // 宝石ID,0表示空
  27.    
  28.     WingBaseData()
  29.     {
  30.         wingId = 1001;
  31.         level = 1;
  32.         rank = 1;
  33.         exp = 0;
  34.         power = 1000;
  35.         physicalAttack = 100;
  36.         magicAttack = 80;
  37.         physicalDefense = 50;
  38.         magicDefense = 45;
  39.         maxHP = 1000;
  40.         maxMP = 500;
  41.         critRate = 5;
  42.         moveSpeed = 100;
  43.         for(int i=0; i<6; i++) embedSlot[i] = 0;
  44.     }
  45. };

  46. // 羽灵数据
  47. struct WingSoulData
  48. {
  49.     int level;      // 羽灵等级
  50.     int power;      // 当前灵力
  51.     int maxExp;     // 升级所需灵力
  52.     int minProp;    // 最小属性值
  53.     int maxProp;    // 最大属性值
  54.    
  55.     WingSoulData()
  56.     {
  57.         level = 1;
  58.         power = 0;
  59.         maxExp = 1000;
  60.         minProp = 10;
  61.         maxProp = 20;
  62.     }
  63. };

  64. class WingSystem
  65. {
  66. public:
  67.     static WingSystem* Instance();
  68.    
  69.     // 初始化
  70.     bool Initialize();
  71.    
  72.     // 核心功能接口
  73.     int DoUpgrade(int64_t playerId, int wingId, bool useProtection, bool useLucky);
  74.     int DoEmbed(int64_t playerId, int slotId, int gemId);
  75.     int DoSoulFeed(int64_t playerId, int foodId);
  76.    
  77.     // 数据查询
  78.     void GetWingData(int64_t playerId, WingBaseData& data);
  79.     void PrintWingInfo(int64_t playerId);
  80.    
  81.     // 定时保存
  82.     void AutoSave();
  83.    
  84. private:
  85.     WingSystem() {}
  86.     std::map<int64_t, WingBaseData> m_playerWings;
  87.     std::map<int64_t, WingSoulData> m_playerSouls;
  88.    
  89.     WingBaseData* GetPlayerData(int64_t playerId);
  90.     void CalculateAttributes(WingBaseData* data);
  91.     int GetUpgradeSuccessRate(int level, bool useLucky);
  92. };

  93. #endif
复制代码
  1. // WingSystem.cpp - 翅膀系统实现
  2. #include "WingSystem.h"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #include <string.h>

  7. WingSystem* WingSystem::Instance()
  8. {
  9.     static WingSystem instance;
  10.     return &instance;
  11. }

  12. bool WingSystem::Initialize()
  13. {
  14.     srand((unsigned)time(NULL));
  15.     printf("[WingSystem] 翅膀系统初始化完成\n");
  16.     return true;
  17. }

  18. WingBaseData* WingSystem::GetPlayerData(int64_t playerId)
  19. {
  20.     std::map<int64_t, WingBaseData>::iterator it = m_playerWings.find(playerId);
  21.     if(it == m_playerWings.end())
  22.     {
  23.         // 新建玩家翅膀数据
  24.         WingBaseData newData;
  25.         m_playerWings[playerId] = newData;
  26.         return &m_playerWings[playerId];
  27.     }
  28.     return &it->second;
  29. }

  30. int WingSystem::GetUpgradeSuccessRate(int level, bool useLucky)
  31. {
  32.     // 基础成功率:100, 95, 90, 85... 最低10%
  33.     int baseRate = 100 - (level - 1) * 5;
  34.     if(baseRate < 10) baseRate = 10;
  35.    
  36.     if(useLucky) baseRate += 20;
  37.     if(baseRate > 100) baseRate = 100;
  38.    
  39.     return baseRate;
  40. }

  41. int WingSystem::DoUpgrade(int64_t playerId, int wingId, bool useProtection, bool useLucky)
  42. {
  43.     WingBaseData* data = GetPlayerData(playerId);
  44.    
  45.     // 检查最大等级(假设最大100级)
  46.     if(data->level >= 100)
  47.     {
  48.         printf("[Wing] 玩家 %lld 翅膀已达最大等级\n", (long long)playerId);
  49.         return -1; // 已满级
  50.     }
  51.    
  52.     int currentLevel = data->level;
  53.     int successRate = GetUpgradeSuccessRate(currentLevel, useLucky);
  54.    
  55.     printf("[Wing] 玩家 %lld 强化翅膀 (当前Lv.%d, 成功率:%d%%)\n",
  56.            (long long)playerId, currentLevel, successRate);
  57.    
  58.     // 随机判定
  59.     int random = rand() % 100;
  60.     if(random >= successRate)
  61.     {
  62.         // 强化失败
  63.         printf("[Wing] 强化失败!\n");
  64.         
  65.         if(!useProtection && currentLevel > 1)
  66.         {
  67.             // 无保护符,降级处理
  68.             if(currentLevel % 10 == 0)
  69.             {
  70.                 // 整十级失败降档
  71.                 data->rank--;
  72.                 data->level -= 10;
  73.                 printf("[Wing] 降级至 %d 阶 %d 级\n", data->rank, data->level);
  74.             }
  75.             else
  76.             {
  77.                 data->level--;
  78.                 printf("[Wing] 降级至 %d 级\n", data->level);
  79.             }
  80.         }
  81.         else if(useProtection)
  82.         {
  83.             printf("[Wing] 保护符生效,等级不变\n");
  84.         }
  85.         
  86.         return -2; // 失败
  87.     }
  88.    
  89.     // 强化成功
  90.     data->level++;
  91.    
  92.     // 每10级升1阶
  93.     if(data->level % 10 == 0)
  94.     {
  95.         data->rank++;
  96.         printf("[Wing] 恭喜!进阶成功!当前 %d 阶 %d 级\n", data->rank, data->level);
  97.     }
  98.     else
  99.     {
  100.         printf("[Wing] 升级成功!当前 %d 级\n", data->level);
  101.     }
  102.    
  103.     // 重新计算属性
  104.     CalculateAttributes(data);
  105.    
  106.     return 0; // 成功
  107. }

  108. int WingSystem::DoEmbed(int64_t playerId, int slotId, int gemId)
  109. {
  110.     if(slotId < 0 || slotId >= 6)
  111.     {
  112.         printf("[Wing] 错误的槽位ID: %d\n", slotId);
  113.         return -1;
  114.     }
  115.    
  116.     WingBaseData* data = GetPlayerData(playerId);
  117.    
  118.     // 检查槽位是否解锁(简化:前3个槽位默认解锁,后3个需要等级)
  119.     if(slotId >= 3 && data->level < 30)
  120.     {
  121.         printf("[Wing] 槽位 %d 需要翅膀达到30级\n", slotId);
  122.         return -2;
  123.     }
  124.    
  125.     data->embedSlot[slotId] = gemId;
  126.     printf("[Wing] 玩家 %lld 在槽位 %d 镶嵌宝石 %d\n",
  127.            (long long)playerId, slotId, gemId);
  128.    
  129.     // 重新计算属性(宝石加成)
  130.     CalculateAttributes(data);
  131.    
  132.     return 0;
  133. }

  134. int WingSystem::DoSoulFeed(int64_t playerId, int foodId)
  135. {
  136.     std::map<int64_t, WingSoulData>::iterator it = m_playerSouls.find(playerId);
  137.     if(it == m_playerSouls.end())
  138.     {
  139.         WingSoulData newSoul;
  140.         m_playerSouls[playerId] = newSoul;
  141.         it = m_playerSouls.find(playerId);
  142.     }
  143.    
  144.     WingSoulData* soul = &it->second;
  145.    
  146.     // 根据食物ID增加不同经验(简化处理)
  147.     int addExp = 100;
  148.     if(foodId == 2) addExp = 500;
  149.     if(foodId == 3) addExp = 2000;
  150.    
  151.     soul->power += addExp;
  152.     printf("[Wing] 玩家 %lld 喂养羽灵 +%d 经验\n", (long long)playerId, addExp);
  153.    
  154.     // 检查升级
  155.     if(soul->power >= soul->maxExp)
  156.     {
  157.         soul->level++;
  158.         soul->power -= soul->maxExp;
  159.         soul->maxExp = (int)(soul->maxExp * 1.2);
  160.         soul->minProp += 5;
  161.         soul->maxProp += 5;
  162.         printf("[Wing] 羽灵升级!当前等级 %d\n", soul->level);
  163.     }
  164.    
  165.     return 0;
  166. }

  167. void WingSystem::CalculateAttributes(WingBaseData* data)
  168. {
  169.     // 基础计算公式
  170.     int level = data->level;
  171.     int rank = data->rank;
  172.    
  173.     // 等级成长
  174.     data->physicalAttack = 100 + level * 10 + rank * 50;
  175.     data->magicAttack = 80 + level * 8 + rank * 40;
  176.     data->physicalDefense = 50 + level * 5 + rank * 25;
  177.     data->magicDefense = 45 + level * 4 + rank * 20;
  178.     data->maxHP = 1000 + level * 50 + rank * 200;
  179.     data->maxMP = 500 + level * 20 + rank * 100;
  180.     data->critRate = 5 + level / 5;
  181.     data->moveSpeed = 100 + level / 2;
  182.    
  183.     // 镶嵌加成(每个宝石+50攻击)
  184.     int embedBonus = 0;
  185.     for(int i=0; i<6; i++)
  186.     {
  187.         if(data->embedSlot[i] > 0) embedBonus += 50;
  188.     }
  189.     data->physicalAttack += embedBonus;
  190.     data->magicAttack += embedBonus;
  191.    
  192.     // 威力值计算
  193.     data->power = level * 100 + rank * 500 + embedBonus * 2;
  194. }

  195. void WingSystem::GetWingData(int64_t playerId, WingBaseData& data)
  196. {
  197.     WingBaseData* src = GetPlayerData(playerId);
  198.     memcpy(&data, src, sizeof(WingBaseData));
  199. }

  200. void WingSystem::PrintWingInfo(int64_t playerId)
  201. {
  202.     WingBaseData data;
  203.     GetWingData(playerId, data);
  204.    
  205.     printf("\n========== 玩家 %lld 翅膀信息 ==========\n", (long long)playerId);
  206.     printf("翅膀ID: %d\n", data.wingId);
  207.     printf("等级: %d (档次: %d)\n", data.level, data.rank);
  208.     printf("威力: %d\n", data.power);
  209.     printf("物理攻击: %d | 魔法攻击: %d\n", data.physicalAttack, data.magicAttack);
  210.     printf("物理防御: %d | 魔法防御: %d\n", data.physicalDefense, data.magicDefense);
  211.     printf("生命: %d | 魔法: %d\n", data.maxHP, data.maxMP);
  212.     printf("暴击: %d%% | 移速: %d\n", data.critRate, data.moveSpeed);
  213.     printf("镶嵌: ");
  214.     for(int i=0; i<6; i++)
  215.     {
  216.         if(data.embedSlot[i] > 0)
  217.             printf("[%d]:%d ", i, data.embedSlot[i]);
  218.         else
  219.             printf("[%d]:空 ", i);
  220.     }
  221.     printf("\n=====================================\n\n");
  222. }

  223. void WingSystem::AutoSave()
  224. {
  225.     // 这里可以实现定时保存到数据库的逻辑
  226.     // 简化版本:仅打印日志
  227.     static int count = 0;
  228.     if(++count % 100 == 0)
  229.     {
  230.         printf("[WingSystem] 自动保存检查... 当前在线玩家: %d\n", (int)m_playerWings.size());
  231.     }
  232. }
复制代码
我的启动成功60210-11:33:49 ScenesServer TRACE: -------------------加载宝盒数据成功!-------------------
[WingSystem] 翅膀系统初始化完成
260210-11:33:49 ScenesServer  INFO: [WingSystem] 翅膀系统初始化完成
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)
回复

使用道具 举报

发表于 2026-2-10 12:30:09 | 显示全部楼层
牛啊牛不玩支持
[发帖际遇]: bombond 在论坛发帖时没有注意,被小偷偷去了 1 枚 金币. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

发表于 2026-2-10 12:30:34 | 显示全部楼层
多谢分享哦
回复 支持 反对

使用道具 举报

发表于 2026-2-10 12:31:36 | 显示全部楼层
中奖概率太低了。。。。
回复 支持 反对

使用道具 举报

发表于 2026-2-10 12:33:42 | 显示全部楼层

回帖奖励 +10 枚金币

不信不中奖。。。。
[发帖际遇]: 一个袋子砸在了 liyicheng556 头上,liyicheng556 赚了 5 枚 金币. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

发表于 2026-2-10 12:41:57 | 显示全部楼层

不信不中奖。。。。
回复 支持 反对

使用道具 举报

发表于 2026-2-10 18:57:31 | 显示全部楼层
不信不中奖。。。。
回复 支持 反对

使用道具 举报

发表于 2026-2-10 18:58:39 | 显示全部楼层
中奖概率太低了。。。。
回复 支持 反对

使用道具 举报

发表于 2026-2-10 19:23:09 | 显示全部楼层
不信不中奖。。。。
回复 支持 反对

使用道具 举报

发表于 2026-2-10 19:25:53 | 显示全部楼层
不信不中奖。。。。
[发帖际遇]: 点上一支烟 在论坛发帖时没有注意,被小偷偷去了 5 枚 金币. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

发表于 2026-5-14 22:41:47 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

发表于 2026-5-16 23:50:28 | 显示全部楼层
:[fr3taq9g]:[fr3taq9g]:[fr3taq9g]:[fr3taq9g]:[fr3taq9g]:[fr3taq9g]:[fr3taq9g]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

排行榜|联系我们|小黑屋|手机版|Archiver|游戏藏宝湾 |

GMT+8, 2026-6-4 15:00 , Processed in 0.177601 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表