流程设计与交互

侍灵付费活动设计与交互

服务端处理方式

  • 使用lua脚本进行流程处理,新增deer.lua,修改entrance.lua、helper.lua
  • 配置分离,单独使用一份配置

侍灵付费活动相关配置

  • 名称: deer
  • 模块id: 9
  • 配置需要保证同时只能进行一期侍灵付费活动,不可以有多期同时进行(即时间段不可以有重合)

redis数据记录

  • hash键名: hash:deer_areaid_actid (areaid:区号 actid:期数id)
  • 内容:
    • key=玩家账号
    • value=个人累计伤害值

活动内容交互

客户端请求

  • 协议号
    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 = {
    deer_get_acklist           = 0,            -- 获取ack列表
    deer_get_config            = 1,            -- 获取当前活动配置
    deer_get_data              = 2,            -- 获取个人信息
    deer_do_hurt               = 3,            -- 打侍灵

    -- 以下是gm操作
    deer_gm_harm_add           = 1000,         -- 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无数据

    target_death_not_hurt = 8,      -- 目标已死不可以再打
    consume_goods_error = 9,        -- 代币消耗失败
    add_goods_failed = 10,          -- 添加物品失败
}

侍灵状态

-- 侍灵状态
local LiveState = {
    Live = 0,               -- 活着
    Dead = 1,               -- 被打死了, 不能接着打
    DeadAttack = 2,         -- 被打死了,还能接着打
}

奖励领取状态

-- 奖励领取状态
local AwardTakeState = {
    not_finish = 0,      -- 未完成
    can_take = 1,        -- 已完成未领取
    had_take = 2,        -- 已领取
}

获取活动列表

请求内容参数

module_type=9
opid=0

处理流程

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

回复内容

module_type=9
opid=0
data={
    result: EnumResult(success/activity_no_open),
    targetState = 侍灵状态LiveState,
    actlist={
        [id]={
            id=第几期,
            actkey=活动key,
            actnamekey=名称key,
            name=模块名,
            consumelist=代币道具id列表
        }
    }
}

说明

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

获取当前活动配置

请求内容

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

处理流程

  1. 获取有效配置并回复;
  2. 年兽和掉落奖池配置信息由客户端配置读取

回复内容

module_type=9
opid=1
data={
    result:EnumResult(success/activity_no_open),
    config={
        id=第几期,
        actkey=活动key,
        name=模块名,
        show=是否显示,
        beginTime=开始时间,
        endTime=结束时间,
        countDown=倒计时,
        useList=[ 代币道具使用列表
            {
                idx=序号,
                cost=消耗代币数目,
                get=获得道具数目,
                discount=折扣,
                costGoodsId=代币道具id,
                award="必得奖励ID(目前无用),数目"
            },
            ...
        ],
    }
}

获取(通知)数据

请求内容

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

处理流程

  1. 获取当前有效配置,无则返错;
  2. 查询玩家数据(redis),查询失败则返错;
  3. 获取玩家累计伤害值,并计算累计伤害奖励各项的状态,回复客户端

回复内容

module_type=9
opid=2
data={
    result:EnumResult(success/activity_no_open/redis_error),
    sendAward:是否发放了奖励(请求数据时为false, 通知时为true),
    sendAwardList: [ 发放的奖励列表,sendAward为true时有效
        {
            idx = 序号,
            goodsId=物品id,
            goodsCount=物品数目,
            flag=是否是大奖
        },
        ...
    ],
    nextAwardIdx=下一个累计伤害奖励的idx,0表示没有了,
    targetState=年兽生命状态LiveState
    totalHarm:累计伤害值
    awardStateList=[  累计伤害奖励领取状态
        {
            idx = 序号,
            state = 领取奖励状态AwardTakeState,
        },
        ...
    ]
}

打侍灵

请求内容

module_type=9
opid=3
data={
    id=第几期,
    useIdx=使用的代币序号,
}

处理流程

  1. 获取当前有效配置,无则返错;
  2. 查询玩家和全服数据(redis),查询失败则返错;
  3. 判断是否可以继续打侍灵,不能则返错;
  4. 消耗代币道具(redis), 失败则返错;
  5. 计算可以获得的道具与对应的掉落;
  6. 添加掉落道具(redis), 失败则返错;
  7. 回复客户端打侍灵成功;
  8. 广播获得的掉落道具;
  9. 更新玩家数据(redis),失败则结束;
  10. 计算累计伤害奖励,有奖励满足条件可领取则直接发放并通知玩家,并广播获得的奖励->获取(通知)个人数据;

回复内容

module_type=9
opid=3
data={
result:EnumResult(success/activity_no_open/param_error/redis_error/data_error/click_too_fast/target_death_not_hurt/consume_goods_error/add_goods_failed),
targetState=侍灵状态LiveState,
harmProps=[  道具
    {
        propType=道具类型
        harm=伤害值,
    },
    ...
],
harmDrops=[ 伤害掉落
    {
        goodsId=物品id,
        goodsCount=物品数目
    },
    ...
]
}