流程设计与交互

打年兽流程设计与交互

服务端处理方式

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

煮酒活动相关配置

  • 名称: yearbeast
  • 模块id: 7
  • 配置需要保证同时只能进行一期打年兽活动,不可以有多期同时进行(即时间段不可以有重合)

redis数据记录

  • hash键名: hash:yearbeast_areaid_actid (areaid:区号 actid:期数id)
  • 内容:
    • key: 玩家账号,分为两类
    • value: 玩家数据,分为两类
      (1)玩家数据: key=玩家账号,value={“totalHarm”:个人累计伤害值,”globalAward”:{“全服奖励列表的idx”:1(表示已领取该奖励)}};
      (2)全服数据:key=000(玩家账号不可能是这个),value={“totalHarm”:全服累计伤害值,”awardGet”:{“全服奖励列表的idx”:全服已领取人数}};

活动内容交互

客户端请求

  • 协议号
    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 = {
    yearbeast_get_acklist           = 0,            -- 获取ack列表
    yearbeast_get_config            = 1,            -- 获取当前活动配置
    yearbeast_get_personaldata      = 2,            -- 获取个人信息
    yearbeast_get_globaldata        = 3,            -- 获取全服信息
    yearbeast_do_hurt               = 4,            -- 打年兽
    yearbeast_take_global_award     = 5,            -- 领取全服奖励

    -- 以下是gm操作
    yearbeast_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,          -- 添加物品失败
    award_take_already = 11,        -- 奖励已领取
    award_take_not_finish = 12,     -- 奖励不可能领取,未完成条件
}

奖励领取状态

  • 玩家领取累计奖励项的状态
  • 个人累计奖励是自动发放,故状态只有not_finish和had_take
  • 全服累计奖励是手动领取,故状态有3个
-- 奖励领取状态
local AwardTakeState = {
    not_finish = 0,      -- 未完成
    can_take = 1,        -- 已完成未领取
    had_take = 2,        -- 已领取
}

年兽生命状态

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

获取活动列表

请求内容参数

module_type=7
opid=0

处理流程

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

回复内容

module_type=7
opid=0
data={
    result: EnumResult(success/activity_no_open),
    hasGlobalAward = 是否有去全服奖励可以领取 01没有,
    actlist={
        [id]={
            id=第几期,
            actkey=活动key,
            actnamekey=名称key,
            targetState=年兽生命状态LiveState,
            name=模块名,
            consumelist=代币道具id列表
        }
    }
}

说明

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

获取当前活动配置

请求内容

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

处理流程

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

回复内容

module_type=7
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=7
opid=2
data={id=第几期}

处理流程

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

回复内容

module_type=7
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:个人累计伤害值
    awardSupport:是否支持个人累计伤害奖励,
    awardStateList=[  累计伤害奖励领取状态,personalAwardSupport为1时有效
        {
            idx = 序号,
            state = 领取奖励状态AwardTakeState,
        },
        ...
    ]
}

获取(通知)全服数据

请求内容

module_type=7
opid=3
data={id=第几期}

处理流程

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

回复内容

module_type=7
opid=3
data={
    result:EnumResult(success/activity_no_open/redis_error),
    totalHarm:全服累计伤害值
    awardSupport:是否支持全服累计伤害奖励,
    awardStateList=[  累计伤害奖励项,globalAwardSupport为1时有效
        {
            idx = 序号,
            state = 领取奖励状态AwardTakeState,
        },
        ...
    ]
}

打年兽

请求内容

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

处理流程

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

回复内容

module_type=7
opid=4
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=物品数目
    },
    ...
]
}

领取全服奖励

请求内容

module_type=7
opid=5
data={
    id=第几期,
    awardIdx=领取的奖励序号,
}

处理流程

  1. 获取当前有效配置,无则返错;
  2. 查询玩家和全服数据(redis),查询失败则返错;
  3. 判断是否可以领取,不能则返错;
  4. 添加掉落道具(redis), 失败则返错;
  5. 回复客户端领取成功;
  6. 广播获得的奖励道具;
  7. 更新玩家数据和全服数据(redis),失败不处理;

回复内容

module_type=7
opid=5
data={    result:EnumResult(success/activity_no_open/param_error/redis_error/click_too_fast/award_take_already/award_take_not_finish/add_goods_failed),
awardGoods={  领取的奖励信息
    idx = 序号,
    goodsList=[  物品列表
    {
        idx = 序号,
        goodsId=物品id,
        goodsCount=物品数目
    },
    ...
    ]
    totalHarm = 达到该伤害值可领取奖励,
}
}