流程设计与交互

流程设计与交互

服务端处理方式

  • 使用lua脚本进行流程处理,新增campwar.lua,修改entrance.lua、helper.lua
  • 配置分离,单独使用一份配置
  • 新增ms服务与rks服务的通信
  • 新增玩家上线后插件模块的通知

阵营战活动相关配置

  • 名称: campwar
  • 模块id: 10
  • 配置需要保证同时只能进行一期阵营战活动,不可以有多期同时进行(即时间段不可以有重合)

redis数据记录

阵营积分

  • 键名: campwar区号:act活动期数:campscore:阵营名 (阵营名=camp阵营编号)
  • 内容:阵营积分

玩家数据

  • 键名: campwar区号:act活动期数:user_data
  • 内容(hash): key:账号,value:{joinCamp=加入的阵营编号,helpCnt=助力次数,takeAwards=助力次数奖励领取列表,recommendCamp=推荐的阵营}

阵营关联

  • 键名: campwar区号:act活动期数:Join
  • 内容(hash): key:账号,value:活动期数*10000+加入的阵营
  • 主要提供给阵营战结束后发奖使用

阵营助力排行榜

  • 键名: sortedset:ranktotal_区号_12活动期数_阵营编号
  • 内容: key:账号,value:积分
  • 需要与rks服务的排行榜保持一致

邮件

  • 键名: queue:jobs
  • 内容: 邮件内容
  • 与已有邮件保持一致

阵营战奖励

阵营加入与推荐奖励

  • 未加入阵营,会推荐一个阵营
  • 加入阵营后,会发送加入的奖励;如果加入的阵营与推荐阵营一致,则会发送推荐奖励

助力次数奖励

  • 根据配置,达到相应的次数,即可手动领取该奖励
  • 阵营战助力时间结束前,助力会记录到个人助力次数、助力排行、阵营积分
  • 阵营战助力时间结束后,活动时间结束前,助力只记录到个人助力次数
  • 阵营战活动时间结束后,不可助力

助力排行奖励

  • 阵营战助力时间结束后,根据助力排行以及配置,判断是否有奖励,有则邮件发放

阵营奖励

  • 阵营战助力时间结束后,根据阵营战结果及配置,通过邮件发放相应的奖励

邮件奖励发送

  • 玩家每次登录后,判断是否加入阵营、阵营战助力时间是否结束、助力排行,来决定是否发放奖励邮件
  • 如果玩家一直没有登录,则不会发放奖励邮件
  • 如果数据异常,则不会发放奖励邮件
  • 如果出现玩家应该有奖励实际未发放,则需要人工发送

活动内容交互

客户端请求

  • 协议号
    CLIENT_ACTIVITY_LUA_REQ=22803
  • 协议内容
    struct ClientActivityLuaReq : public PacketBase
    {
      unsigned int module_type; // 模块类型(不同活动)
      unsigned int opid; // 模块操作id
      unsigned int datalen;
      char data[sc_max_activity_data_len];
    };
    

    服务端回复

  • 协议号
    CLIENT_ACTIVITY_LUA_REP=22804
  • 协议内容
    struct ClientActivityLuaRep : public PacketBase
    {
      unsigned int module_type; // 模块类型(不同活动)
      unsigned int opid; // 模块操作id
      unsigned int datalen;
      char data[sc_max_activity_data_len];
    };
    

服务端通知

  • 协议号
    CLIENT_ACTIVITY_LUA_NTF = 22805
    
  • 协议内容
    struct ClientActivityLuaNtf : public PacketBase
    {
      unsigned int module_type; // 模块类型(不同活动)
      unsigned int opid; // 模块操作id
      unsigned int datalen;
      char data[sc_max_activity_data_len];
    };
    

请求的opid

-- 请求的opid
local EmOpID = {
    campwar_get_acklist           = 0,            -- 获取ack列表
    campwar_get_config            = 1,            -- 获取当前活动配置
    campwar_get_data              = 2,            -- 获取阵营信息
    campwar_join                  = 3,            -- 阵营加入
    campwar_help                  = 4,            -- 阵营助力
    campwar_take_help_award       = 5,            -- 领取阵营助力奖励

    -- 以下非客户端请求
    campwar_check_end_award       = 20,           -- 检查赛季结束奖励发送

    -- 以下是gm操作
    campwar_gm_add_camp_score           = 1000,         -- gm增加阵营积分
    campwar_gm_add_self_helpcnt         = 1001,         -- gm增加自己助力次数
    campwar_gm_clear_self_helpcnt_take  = 1002,         -- gm清除自己领取助力次数奖励状态
    campwar_gm_test                     = 2000,         -- gm账号测试
}

处理结果枚举

  • 服务端回复客户端请求的处理结果,客户端只在success表示处理成功并处理数据,其他结果可以进行相应的提示
-- 请求回复的结果
local EnumResult = {
    success = 0,                    -- 成功
    module_close = 1,               -- 模块未开启
    param_error = 2,                -- 参数错误
    click_too_fast = 3,             -- 操作太频繁
    data_error = 4,                 -- 数据错误(resid没有需要的数据)
    activity_no_open = 5,           -- 活动未开启
    redis_error = 6,                -- redis操作失败
    redis_no_data = 7,              -- redis无数据
    logic_error = 8,                -- 逻辑错误
    consume_goods_error = 9,        -- 代币消耗失败
    add_goods_failed = 10,          -- 添加物品失败
    get_camp_score_failed = 11,     -- 获取阵营积分失败
    get_self_data_failed = 12,      -- 获取个人数据失败
    camp_not_exist = 13,            -- 阵营不存在
    camp_join_already = 14,         -- 已加入阵营
    camp_not_join = 15,             -- 未加入阵营
    no_this_award = 16,             -- 没有这个奖励
    award_take_already = 17,        -- 奖励已领取
    help_time_end = 18,             -- 助力时间已结束

}

获取活动列表

请求内容参数

module_type=10
opid=0

处理流程

  1. 获取有效配置并回复;

回复内容

module_type=10
opid=0
data={
    result: EnumResult,
    hadHelpAward = 是否有助力次数奖励可以领取 true/false,
    actlist={
        [id]={
            id=第几期,
            actkey=活动key,
            actnamekey=名称key,
            name=模块名,
            consumelist=代币道具id列表
        }
    }
}

说明

  • 只回复在有效时间内的活动配置,目前是只有一个在有效时间内

获取当前活动配置

请求内容

module_type=10
opid=1
data={
id=第几期,
}

回复内容

module_type=10
opid=1
data={
    result:EnumResul),
    config={
        id=第几期,
        actkey=活动key,
        name=模块名,
        show=是否显示,
        beginTime=开始时间,
        endTime=结束时间,
        countDown=倒计时,
        HelpEndTime=助力结束时间,
        helpCountDown=助力倒计时,
        useList=代币道具使用列表
    }
}

获取数据

请求内容

module_type=10
opid=2
data={id=第几期}

回复内容

module_type=10
opid=2
data={
    result:EnumResult,
    countDown=倒计时,
    helpCountDown=助力倒计时,
    hadHelpAward = 是否有助力次数奖励可以领取 true/false,

    hadJoin=是否加入阵营 true/false
    recommendCamp=推荐阵营  (hadJoin=false有效)“0”表示没有推荐

    selfData={  个人数据  (hadJoin=true有效)
        joinCamp=加入的阵营编号,
        helpCnt=助力次数,
        takeAwards=助力次数奖励领取列表
    },
    campScore=[  个阵营积分,(hadJoin=true或者helpCountDown=0时有效)
        阵营编号(string):阵营积分,
        ...
    ],
    winCamp=胜出阵营编号
}

注意

  • 客户端显示时,需要根据helpCountDown和hadJoin分别进行展示处理;

加入阵营

请求内容

module_type=10
opid=3
data={
id=第几期,
campId=加入的阵营编号
}

回复内容

module_type=10
opid=3
data={
    result:EnumResult,
    campId:加入的阵营,
}

助力

请求内容

module_type=10
opid=4
data={
    id=第几期,
    useCount=助力次数(消耗道具数目),
}

回复内容

module_type=10
opid=4
data={
result:EnumResult,
helpCountDown=助力剩余时间,
helpCnt=本次助力次数,
hadHelpAward=是否有助力次数奖励可以领取 true/false,
}

注意

  • helpCountDown大于0时,表示助力时间未结束,客户端需要自行处理自己和阵营的积分增加;
  • helpCountDown等于0时,表示助力时间未结束,客户端需要自行处理自己的积分增加,阵营不增加;

领取助力次数奖励

请求内容

module_type=10
opid=5
data={
    id=第几期,
    times=领取的助力次数,
}

回复内容

module_type=10
opid=5
data={
result:EnumResult,
takeTimes=领取的助力次数,
hadHelpAward=是否有助力次数奖励可以领取 true/false,
}

排行榜数据拉取

  • 原协议
  • rank_type=3
  • rank_id=12
  • req_param1=活动期数
  • req_param2=加入的阵营
CLIENT_RKS_GAME_RANKING_REQ=45517
struct ClientRksGameRankingReq : PacketBase
{
    BYTE    rank_type;
    unsigned int rank_id;
    unsigned int count;

    unsigned int req_param1;
    unsigned int req_param2;
    ClientRksGameRankingReq() : PacketBase(CLIENT_RKS_GAME_RANKING_REQ, sizeof(ClientRksGameRankingReq))
    {
        PRO_ZERO_MEMORY(this, sizeof(ClientRksGameRankingReq));
    }
};

CLIENT_RKS_GAME_RANKING_REP=45518
struct ClientRksGameRankingRep : public PacketBase
{
    ClientRksGameRankingRep() : PacketBase(CLIENT_RKS_GAME_RANKING_REP, sizeof(ClientRksGameRankingRep))
    {
        PRO_ZERO_MEMORY(this, sizeof(ClientRksGameRankingRep));
    }
    static const unsigned int sc_max_count = 200; // 分页请求,每次10个
    static const unsigned int sc_max_param_cnt = 3;
    struct TRankInfo
    {
        char            nickname[sc_max_nickname_len];
        int                score;
        BYTE            paramcnt;
        unsigned int    param[sc_max_param_cnt];

        friend bistream& operator>>(bistream& bis, TRankInfo& t)
        {
            bis >> t.nickname;
            bis >> t.score;
            bis >> t.paramcnt;
            for (BYTE i = 0; i < t.paramcnt; ++i)
                bis >> t.param[i];
            return bis;
        }

        friend bostream& operator<<(bostream& bos, const TRankInfo& t)
        {
            bos << t.nickname;
            bos << t.score;
            bos << t.paramcnt;
            for (BYTE i = 0; i < t.paramcnt; ++i)
                bos << t.param[i];
            return bos;
        }
    };
    friend bistream& operator>>(bistream& bis, ClientRksGameRankingRep& t)
    {
        //bis >> t.nickname;
        bis >> t.result;
        bis >> t.rank_type;
        bis >> t.rank_id;
        bis >> t.count;
        for (BYTE i = 0; i < t.count; ++i)
            bis >> t.rankinfo[i];
        bis >> t.rep_param1 >> t.rep_param2;
        return bis;
    }

    friend bostream& operator<<(bostream& bos, const ClientRksGameRankingRep& t)
    {
        //bos << t.nickname;
        bos << t.result;
        bos << t.rank_type;
        bos << t.rank_id;
        bos << t.count;
        for (BYTE i = 0; i < t.count; ++i)
            bos << t.rankinfo[i];
        bos << t.rep_param1 << t.rep_param2;
        return bos;
    }
    BYTE    result;
    BYTE    rank_type;
    unsigned int rank_id;
    unsigned int count; //返回的结果数量,如果<sc_page_count说明到最后一页了
    TRankInfo rankinfo[sc_max_count];

    unsigned int rep_param1;
    unsigned int rep_param2;
};

获取排名数据

  • 原协议
  • rank_type=3
  • rank_id=12
  • req_param1=活动期数
  • req_param2=加入的阵营
CLIENT_RKS_MY_GAME_RANKING_REQ=45519
struct ClientMyGameRankingReq : public PacketBase
{
    ClientMyGameRankingReq() : PacketBase(CLIENT_RKS_MY_GAME_RANKING_REQ, sizeof(ClientMyGameRankingReq))
    {
        PRO_ZERO_MEMORY(this, sizeof(ClientMyGameRankingReq));
    }
    char acc[sc_max_account_len];
    BYTE    rank_type;
    unsigned int rank_id;

    unsigned int req_param1;
    unsigned int req_param2;
};

CLIENT_RKS_MY_GAME_RANKING_REP=45520
struct ClientMyGameRankingRep : public PacketBase
{
    ClientMyGameRankingRep() : PacketBase(CLIENT_RKS_MY_GAME_RANKING_REP, sizeof(ClientMyGameRankingRep))
    {
        PRO_ZERO_MEMORY(this, sizeof(ClientMyGameRankingRep));
    }
    BYTE    result;
    BYTE    rank_type;
    unsigned int rank_id;
    unsigned int curpos;
    int score;

    unsigned int rep_param1;
    unsigned int rep_param2;
};