征途翅膀外观特
本帖最后由 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) 牛啊牛:不玩支持: 多谢分享哦 中奖概率太低了。。。。 不信不中奖。。。。
不信不中奖。。。。 不信不中奖。。。。
中奖概率太低了。。。。 不信不中奖。。。。 不信不中奖。。。。 感谢分享 ::::::::::
页:
[1]