Пример #1
0
    /// <summary>
    /// 处理请求升级逻辑
    /// </summary>
    /// <param name="pack"></param>
    public void ReqStrong(MsgPack pack)
    {
        ReqStrong data = pack.msg.reqStrong;
        GameMsg   msg  = new GameMsg
        {
            cmd = (int)CMD.RspStrong,
        };
        PlayerData pd          = cacheSvc.GetPlayerDataBySettion(pack.session);
        int        curtStartLv = pd.strongArr[data.pos];//请求升级的武器
        StrongCfg  nextSd      = cfgSvc.GetStrongCfg(data.pos, curtStartLv + 1);

        //数据校验(这是必须的,如果客户端均已校验,则此校验结果可以作为玩家是否作弊的依据)
        if (pd.lv < nextSd.minlv)
        {
            msg.err = (int)ErrorCode.LackLevel;
        }
        else if (pd.coin < nextSd.coin)
        {
            msg.err = (int)ErrorCode.LackCoin;
        }
        else if (pd.crystal < nextSd.crystal)
        {
            msg.err = (int)ErrorCode.LackCrystal;
        }
        else//校验通过
        {
            //资产变化
            pd.coin                -= nextSd.coin;
            pd.crystal             -= nextSd.crystal;
            pd.strongArr[data.pos] += 1;
            //属性变化
            pd.hp    += nextSd.addhp;
            pd.ad    += nextSd.addhurt;
            pd.ap    += nextSd.addhurt;
            pd.addef += nextSd.adddef;
            pd.apdef += nextSd.adddef;
            //任务进度更新
            TaskSys.Instance.CalcTaskPrgs(pd, 3);
            //数据库更新
            if (cacheSvc.UpdatePlayerData(pd.id, pd))
            {
                msg.rspStrong = new RspStrong
                {
                    coin      = pd.coin,
                    crystal   = pd.crystal,
                    hp        = pd.hp,
                    ad        = pd.ad,
                    ap        = pd.ap,
                    addef     = pd.addef,
                    apdef     = pd.apdef,
                    strongArr = pd.strongArr
                };
            }
            else
            {
                msg.err = (int)ErrorCode.UpdateDbError;
            }
        }
        pack.session.SendMsg(msg);
    }
Пример #2
0
    public void SndChat(MsgPack msgPack)
    {
        SndChat    data = msgPack.msg.sndChat;
        PlayerData pd   = cacheSvc.GetPlayerDataBySettion(msgPack.session);
        GameMsg    msg  = new GameMsg
        {
            cmd     = (int)CMD.PshChat,
            pshChat = new PshChat
            {
                name = pd.name,
                chat = data.chat,
            },
        };

        //任务进度更新
        TaskSys.Instance.CalcTaskPrgs(pd, 6);//?需要更新吗
        //广播消息
        var lst = cacheSvc.GetOnlineSvrSessions();

        byte[] msgData = PENet.PETool.PackNetMsg(msg);//广播前提前序列化,减少次数
        foreach (var svrsin in lst)
        {
            svrsin.SendMsg(msgData);
        }
    }
Пример #3
0
    /// <summary>
    /// 处理重命名请求
    /// </summary>
    /// <param name="pack"></param>
    public void ReqRename(MsgPack pack)
    {
        ReqRename data = pack.msg.reqRename;
        //给客户端的回应消息
        GameMsg rspMsg = new GameMsg()
        {
            cmd = (int)CMD.RsqRename,
        };

        //名字已经存在 返回错误码
        if (cacheSvc.IsNameExit(data.name))
        {
            rspMsg.err = (int)ErrorCode.NameIsExit;
        }
        //名字不存在 更新缓存与数据库 再返回给客户端
        else
        {
            //更新缓冲区数据(代替更新数据库)
            PlayerData cachePlayerData = cacheSvc.GetPlayerDataBySettion(pack.session);
            if (cachePlayerData != null)
            {
                cachePlayerData.name = data.name;
            }
            //更新数据库失败,返回错误码(这里是简化处理了,仍然同步写入数据库;对于高并发操作,应该由驱动负责将数据更新入数据库中,但是会分离逻辑,更为复杂)
            if (!cacheSvc.UpdatePlayerData(cachePlayerData.id, cachePlayerData))
            {
                rspMsg.err = (int)ErrorCode.UpdateDbError;
            }
            //更新数据库成功 返回数据
            else
            {
                rspMsg.rspRename = new RspRename
                {
                    name = data.name
                };
            }
        }
        pack.session.SendMsg(rspMsg);
    }
Пример #4
0
    /// <summary>
    /// 处理任务完成逻辑
    /// </summary>
    public void ReqGuide(MsgPack pack)
    {
        ReqGuide data = pack.msg.reqGuide;
        GameMsg  msg  = new GameMsg
        {
            cmd = (int)CMD.RspGuide,
        };

        PlayerData pd = cacheSvc.GetPlayerDataBySettion(pack.session);

        if (pd.guideid == data.guideid)//一次安全校验,如果客户端数据和服务端对不上,直接踢下线
        {
            //是否为智者引导任务
            if (pd.guideid == 1001)
            {
                TaskSys.Instance.CalcTaskPrgs(pd, 1);
            }
            GuideTaskCfg gtc = cfgSvc.GetGuideTaskCfgData(pd.guideid);
            //缓存数据变化
            pd.guideid++;
            pd.coin += gtc.coin;
            PECommon.CaculExp(pd, gtc.exp);
            if (cacheSvc.UpdatePlayerData(pd.id, pd))
            {
                msg.rspGuide = new RspGuide
                {
                    guideid = pd.guideid,
                    coin    = pd.coin,
                    exp     = pd.exp,
                    lv      = pd.lv
                };
            }
            else
            {
                msg.err = (int)ErrorCode.UpdateDbError;
            }
        }
        else
        {
            msg.err = (int)ErrorCode.ServerDataError;
        }
        pack.session.SendMsg(msg);
    }
Пример #5
0
    public void ReqTakeTaskReward(MsgPack pack)
    {
        ReqTakeTaskReward data = pack.msg.reqTakeTaskReward;
        GameMsg           msg  = new GameMsg
        {
            cmd = (int)CMD.RspTakeTaskReward,
        };
        PlayerData     pd  = cacheSvc.GetPlayerDataBySettion(pack.session);
        TaskRewardCfg  trc = cfgSvc.GetTaskRewardCfg(data.rid);
        TaskRewardData trd = CalcTaskRewardData(pd, data.rid);

        if (trd.prgs == trc.count && !trd.taked)
        {
            pd.coin += trc.coin;
            PECommon.CaculExp(pd, trc.exp);
            trd.taked = true;
            //更新任务进度数据
            CalcTaskArr(pd, trd);

            if (!cacheSvc.UpdatePlayerData(pd.id, pd))
            {
                msg.err = (int)ErrorCode.UpdateDbError;
            }
            else
            {
                RspTakeTaskReward rspTakeTaskReward = new RspTakeTaskReward
                {
                    coin    = pd.coin,
                    lv      = pd.lv,
                    exp     = pd.exp,
                    taskArr = pd.taskStrArr
                };
                msg.rspTakeTaskReward = rspTakeTaskReward;
            }
        }
        else
        {
            msg.err = (int)ErrorCode.ClientDataError;
        }
        pack.session.SendMsg(msg);
    }
Пример #6
0
    public void ReqFBFight(MsgPack pack)
    {
        ReqFBFight data = pack.msg.reqFBFight;

        GameMsg msg = new GameMsg
        {
            cmd = (int)CMD.RspFBFight
        };

        PlayerData pd    = cacheSvc.GetPlayerDataBySettion(pack.session);
        int        power = cfgSvc.GetMapCfg(data.fbid).power;

        if (pd.fuben < data.fbid)
        {
            msg.err = (int)ErrorCode.ClientDataError;
        }
        else if (pd.power < power)
        {
            msg.err = (int)ErrorCode.LackPower;
        }
        else
        {
            pd.power -= power;
            if (cacheSvc.UpdatePlayerData(pd.id, pd))
            {
                RspFBFight rspFBFight = new RspFBFight
                {
                    fbid  = data.fbid,
                    power = pd.power
                };
                msg.rspFBFight = rspFBFight;
            }
            else
            {
                msg.err = (int)ErrorCode.UpdateDbError;
            }
        }
        pack.session.SendMsg(msg);
    }