- 精华
- 阅读权限
- 90
- 贡献
- 人
- 好友
- 相册
- 分享
- 听众
- 收听
- 注册时间
- 2010-1-8
- 在线时间
- 小时
- 最后登录
- 1970-1-1
|
本帖最后由 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]; // 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[count];
- };
- #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[i]);
- if(wings[i].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[i].id == newData->id)
- {
- m_wings[i] = *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[m_curIndex];
-
- // 计算模型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[i] = UI.panel:Find("Slot" .. i)
- UI.slots[i]: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[i]
- if gemId and gemId > 0 then
- local gemData = ConfigManager.GetGem(gemId)
- UI.slots[i]:SetIcon(gemData.icon)
- UI.slots[i]:SetQuality(gemData.quality)
- UI.slots[i]:SetTooltip(gemData.name .. "\n" .. gemData.desc)
- else
- UI.slots[i]:SetIcon("slot_empty.png")
- UI.slots[i]:SetQuality(0)
- UI.slots[i]: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[slotId]
-
- 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[rank] 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[m_curIndex];
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; // 移动速度
-
- // 镶嵌槽 [6个槽位]
- int embedSlot[6]; // 宝石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[i] = 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("[WingSystem] 翅膀系统初始化完成\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[playerId] = newData;
- return &m_playerWings[playerId];
- }
- 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("[Wing] 玩家 %lld 翅膀已达最大等级\n", (long long)playerId);
- return -1; // 已满级
- }
-
- int currentLevel = data->level;
- int successRate = GetUpgradeSuccessRate(currentLevel, useLucky);
-
- printf("[Wing] 玩家 %lld 强化翅膀 (当前Lv.%d, 成功率:%d%%)\n",
- (long long)playerId, currentLevel, successRate);
-
- // 随机判定
- int random = rand() % 100;
- if(random >= successRate)
- {
- // 强化失败
- printf("[Wing] 强化失败!\n");
-
- if(!useProtection && currentLevel > 1)
- {
- // 无保护符,降级处理
- if(currentLevel % 10 == 0)
- {
- // 整十级失败降档
- data->rank--;
- data->level -= 10;
- printf("[Wing] 降级至 %d 阶 %d 级\n", data->rank, data->level);
- }
- else
- {
- data->level--;
- printf("[Wing] 降级至 %d 级\n", data->level);
- }
- }
- else if(useProtection)
- {
- printf("[Wing] 保护符生效,等级不变\n");
- }
-
- return -2; // 失败
- }
-
- // 强化成功
- data->level++;
-
- // 每10级升1阶
- if(data->level % 10 == 0)
- {
- data->rank++;
- printf("[Wing] 恭喜!进阶成功!当前 %d 阶 %d 级\n", data->rank, data->level);
- }
- else
- {
- printf("[Wing] 升级成功!当前 %d 级\n", data->level);
- }
-
- // 重新计算属性
- CalculateAttributes(data);
-
- return 0; // 成功
- }
- int WingSystem::DoEmbed(int64_t playerId, int slotId, int gemId)
- {
- if(slotId < 0 || slotId >= 6)
- {
- printf("[Wing] 错误的槽位ID: %d\n", slotId);
- return -1;
- }
-
- WingBaseData* data = GetPlayerData(playerId);
-
- // 检查槽位是否解锁(简化:前3个槽位默认解锁,后3个需要等级)
- if(slotId >= 3 && data->level < 30)
- {
- printf("[Wing] 槽位 %d 需要翅膀达到30级\n", slotId);
- return -2;
- }
-
- data->embedSlot[slotId] = gemId;
- printf("[Wing] 玩家 %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[playerId] = 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("[Wing] 玩家 %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("[Wing] 羽灵升级!当前等级 %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[i] > 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[i] > 0)
- printf("[%d]:%d ", i, data.embedSlot[i]);
- else
- printf("[%d]:空 ", i);
- }
- printf("\n=====================================\n\n");
- }
- void WingSystem::AutoSave()
- {
- // 这里可以实现定时保存到数据库的逻辑
- // 简化版本:仅打印日志
- static int count = 0;
- if(++count % 100 == 0)
- {
- printf("[WingSystem] 自动保存检查... 当前在线玩家: %d\n", (int)m_playerWings.size());
- }
- }
复制代码 我的启动成功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) |
|