【副本向】高等级副本全流程开发

news2024/12/26 22:18:22

副本的创建

1.从配置表通过副本ID获取此副本参数

 Tab_CopyScene rCopyScene = TableManager.GetCopySceneByID(m_CopySceneID);
        if (rCopyScene != null)
        {
            //只要配置了组队的Rule,就是组队模式,否则就是单人模式
            bool bSolo = true;
            for (int n = 0; n < rCopyScene.getTeamRuleCount(); ++n)
            {
                if (rCopyScene.GetTeamRulebyIndex(n) > 0)
                {
                    bSolo = false;
                    break;
                }
            }

            //m_bSolo = bSolo;

            int nLeftCount = GameManager.PlayerDataPool.GetCopySceneJoinCount(m_SceneID, bSolo);
            if (nLeftCount > 0 || nLeftCount == -1)
            {
                doEnter();
            }

2.客户端判断参数是否有效

比如团队副本限制单人挑战、当前玩家id是否合法(与服务器guid一致)

public void doEnter()
    {
        if (m_SceneID == (int)SCENE_DEFINE.SCENE_ZHENMOGUDONG || m_SceneID == (int)SCENE_DEFINE.SCENE_MOSHENJIANGLIN)
        {
            if (ObjManager.MainPlayer != null && ObjManager.MainPlayer.IsTeamLeader() && CopySceneRootLogic.GetCopySceneNeedMemCount(m_SceneID, m_GradeID) <= GameManager.PlayerDataPool.TeamInfo.GetTeamMemberCount() && GameManager.PlayerDataPool.TeamInfo.IsFull() == false)
            {
                MessageBoxController.OpenOKCancelBox(StrDictionary.GetClientDictionaryString("#{15344}"), "", () => SendEnterCopyScene_WithCombat((int)COPYSCENE_MODE.TEAM));
            }
            else
            {
                SendEnterCopyScene_WithCombat((int)COPYSCENE_MODE.TEAM);
            }
        }
        else
        {
            SendEnterCopyScene((int)COPYSCENE_MODE.TEAM);
        }
    }

3.数据无误向服务器发送CG请求

copyScene.txt
image.png
其中ScriptID > -1表示该副本的热更新Lua脚本号为3323
副本最大关闭时间是20min,心跳检测是1000ms(1秒)
参考配置表这里主要传输了 SceneID(副本号)、GradeID(难度)、Mode(游玩模式)、needCombat(最小共战数(多人本 大于等于2))

 private void SendEnterCopyScene_WithCombat(int mode)
    {
        if (m_SceneID == (int)SCENE_DEFINE.SCENE_ZHENMOGUDONG && m_GradeID == (int)COPYSCENE_GRADE.GRADE1 && mode == (int)COPYSCENE_MODE.TEAM &&
            GameManager.PlayerDataPool.IsHaveTeam())
        {
            Tab_CopyScene rCopyScene = TableManager.GetCopySceneByID(m_CopySceneID);
            if (rCopyScene != null)
            {
                int nRuleID = rCopyScene.GetTeamRulebyIndex(m_GradeID);
                Tab_CopySceneRule rRule = TableManager.GetCopySceneRuleByID(nRuleID);
                if (rRule != null)
                {
                    int nMinCombat = GetMinCombat(rRule.MinCombatIndex);

                    CG_OPEN_COPYSCENE_COMBATCONFIRM_PAK pak = new CG_OPEN_COPYSCENE_COMBATCONFIRM_PAK();
                    pak.data.SceneID = m_SceneID;
                    pak.data.Grade = m_GradeID;
                    pak.data.Mode = mode;
                    pak.data.NeedCombat = nMinCombat;
                    pak.SendPacket();
                    return;
                }
            }
        }

        SendEnterCopyScene(mode);
    }

4.服务器校验

CG_OPEN_COPYSCENE_COMBATCONFIRM 消息接受后

  1. 先查询玩家战力是否符合推荐区间、如果低于(弹窗提示【不细讨论】)
  2. 执行CG_OPEN_COPYSCENE消息内容

以下是open_copyscene的消息内容
image.png
服务器拿到SceneID(副本号)、GradeID(难度)、Mode(游玩模式)、needCombat参数后会查 server的配置表目录,得到需要的初始化信息

  1. 检测是否非法包(把客户端法宝的参数在服务器对应的copyscene.txt配置表中查询信息是否一致)
  2. 查看GameConfig配置表是否开启此副本
  3. 异步创建副本(先数据后切场景)

image.png
先向客户端发送 GC_SYNC_COPYSCENECOUNT (传输副本初始化信息到客户端)
创建副本(场景文件)
先确定副本等级
再判断是否切场景.

public class GC_SYNC_COPYSCENECOUNT_Handler
{
    public static void ReceivePacket(GC_SYNC_COPYSCENECOUNT packet)
    {
        for(int n = 0; n < packet.nSceneClassID.Count; ++ n )
        {
            if ( packet.nSceneClassID[n] > 0 )
            {
                //初始化的参数本地化存储
            }
        }

        List<int> BossGroupData = GameManager.PlayerDataPool.BossGroupData;
        BossGroupData.Clear();
        for (int i = 0; i < packet.nBossGroup.Count; i++)
        {
            //BOSS序列进入缓存
            BossGroupData.Add(packet.nBossGroup[i]);
        }
        if (CopySceneChallenge.Instance() != null)
        {
            CopySceneChallenge.Instance().OnCopySceneCountChange();
        }
    }
}

到这里副本的初始化信息(生命、任务目标、任务奖励、怪物信息、BOSS等)已经拿到了。
接下来,是Routine线程监听客户端通过Lua脚本以热更新的方式创建副本。

5.Routine线程监听客户端通过Lua脚本以热更新的方式创建副本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1640780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

菜鸡学习netty源码(三)—— Reactor 模型

1.概述 我们先进行理解一下Reactor模型&#xff0c;知道什么是Reactor模型&#xff0c;它有什么特别之处。我们先来简单介绍一下这个Reactor模型。 Reactor模型的核心思想&#xff1a; 就是将所关注的I/O事件进行注册到一个多路复用器上&#xff0c;一旦有I/O事件的发生&#…

Debian 12 -bash: netstat: command not found 解决办法

问题表现&#xff1a; debian 12系统中&#xff0c;不能使用 netstat命令 处理办法&#xff1a; netstat 命令就的net-tools中&#xff0c;把net-tools工具安装上就好了。 apt-get install netstat 安装之后就可以使用netstat 命令了&#xff0c;如查询端口情况&#xff1a; …

快速排序的单趟排序方法对比

这里的霍尔法内容来自文章&#xff1a;【排序算法】快速排序&#xff08;C语言&#xff09;_c语言快速排序-CSDN博客 霍尔法 单趟排序使用霍尔法&#xff0c;这样的话我们必须保证除了指针停留的位置到头之外&#xff0c;最后首尾指针共同指向的是一个比key小的值&#xff0c…

启动盘制作

魔术师pe安装教程 我一般使用魔术师来安装windows系统 魔术师pe地址下载 解压后使用 把ios映像文件放入pe系统u盘下 开机按f1,进入bios,将usb接口拉到本电脑&#xff0c;在按f10保存&#xff0c;在按f12即可找到pe的u盘 ventoy安装教程 其他系统安装我使用ventoy ventoy地…

一个5000刀的XSS

背景介绍 今天分享国外一个白帽小哥Crypto通过发现Apple某网站XSS而获得5000美元赏金的故事。废话不多说&#xff0c;让我们开始吧&#xff5e; 狩猎过程 易受攻击的 Apple 服务网站是&#xff1a;https://discussions.apple.com&#xff0c;该服务是苹果用户和开发者讨论问题…

【笔记】Simulink与Workbench交互+自定义m函数封装为Simulink模块

以如下三角函数为例&#xff0c;说明建模方法 ya*sin(b*2*pi*uc);0.总模型总代码 总模型 总代码&#xff1a; clc clear close allt_all10; a10; b1; c0;%pi/2; delta_t0.01; simOutsim(test240430); out_tsimOut.tout; out_y1simOut.yout{1}.Values; out_y2simOut.yout{2}.…

栈的磁盘优化:降低存取成本的算法与实现

栈的磁盘优化&#xff1a;降低存取成本的算法与实现 问题背景简单实现方法的分析实现方法PUSH操作POP操作成本分析渐近分析 优化实现方法实现方法成本分析渐近分析 进一步优化&#xff1a;双页管理策略实现方法管理策略成本分析 伪代码示例C代码示例结论 问题背景 在具有有限快…

WAAP动态安全解决方案

随着企业数字化进程不断加速&#xff0c;应用安全面临多重威胁&#xff0c;新型攻击方式层出不穷&#xff0c;常见的攻击形式包括Web应用攻击、DDoS攻击、API攻击、恶意爬虫攻击等。企业正面临严峻的安全防护挑战&#xff0c;需寻找一个可靠、全面的安全解决方案。在此情况下&a…

题目:吃奶酪

问题描述&#xff1a; 解题思路&#xff1a; 枚举每种吃奶酪顺序&#xff0c;并计算其距离&#xff0c;选择最小的距离即答案。v数组&#xff1a;记录顺序。 注意点&#xff1a;1. 每次用于min的s需要重置为0。 2. 实数包括小数&#xff0c;所以结构体内x,y为double类型。 3. 第…

基于大爆炸优化算法的PID控制器参数寻优matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于大爆炸优化算法的PID控制器参数寻优matlab仿真。对比优化前后的PID控制输出。 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MATLAB2022a .....................…

文件API及其操作

这里介绍两类文件操作、三个文件类。包括文件系统操作&#xff08;File类&#xff09;、文件内容操作&#xff08;操作字节流、操作字符流&#xff09; 1.文件类File 1.1.认识File类 &#xff08;1&#xff09;什么是File类呢&#xff1f;其实就是可以操作文件的一个类。通过…

Hdfs小文件治理策略以及治理经验

小文件是 Hadoop 集群运维中的常见挑战&#xff0c;尤其对于大规模运行的集群来说可谓至关重要。如果处理不好&#xff0c;可能会导致许多并发症。Hadoop集群本质是为了TB,PB规模的数据存储和计算因运而生的。为啥大数据开发都说小文件的治理重要&#xff0c;说HDFS 存储小文件…

LeetCode 139 —— 单词拆分

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 定义 d p [ i ] dp[i] dp[i] 表示 s [ 0 , i ] s[0, i] s[0,i] 是否可以被字典中出现的单词拼接&#xff0c;那么状态转移方程为&#xff1a; d p [ i ] t r u e &#xff0c;如果存在任意 j ∈ [ 0 , i − 1…

无人机+飞行汽车:低空经济新引擎,有望爆发式增长

无人机和飞行汽车作为低空经济的新引擎&#xff0c;正在引领一场全新的交通革命。随着技术的不断进步和政策的支持&#xff0c;低空经济有望成为未来经济发展的重要领域&#xff0c;实现爆发式增长。 首先&#xff0c;无人机和飞行汽车具有独特的优势和应用场景。无人机可以在…

数据结构与算法-单向环形链表与约瑟夫问题

1.简介 单向环形链表&#xff0c;闭合的形成一个环。 单向环形链表的一个应用场景是约瑟夫问题。 约瑟夫问题为&#xff1a;设编号为1&#xff0c;2&#xff0c;…&#xff0c;n的n个人围坐一圈&#xff0c;约定编号为k(1<k<n)的人从1开始报数&#xff0c;数到m的那个人…

可完成两个变量数值的交换的两种方式【swap函数定义及调用的两种方式】

既然传值调用无法完成两个变量数值的交换&#xff0c;那么可完成该任务的正确方式有以下两种&#xff1a; 方式一&#xff1a;传址调用 //方式一&#xff1a;传址调用 #include <stdio.h>void swap(int* p1, int* p2);int main() {int a 5;int b 9;int* pointer_1 &…

【iOS】pthread、NSThread

文章目录 前言一、pthread 使用方法pthread 其他相关方法 二、 NSThread创建、启动线程线程相关用法线程状态控制方法NSThread 线程安全和线程同步场景 线程的状态转换 前言 五一这两天准备将GCD相关的知识完&#xff0c;同时NSOperation与NSThread、pthread也是相关知识&…

240503-关于Unity的二三事

240503-关于Unity的二三事 1 常用快捷键 快捷键描述CtrlP播放/停止Ctrl1打开Scene窗口Ctrl2打开Game窗口Ctrl3打开Inspect窗口Ctrl4打开Hierarchy窗口Ctrl5打开Project窗口Ctrl6打开Animation窗口 2 关联VisualStudio2022 3 节约时间&#xff1a;将最新声明的参数移动到最上…

MySQL-集群1

一、为什么要用mysql集群&#xff1f;&#xff1a; mysql单体架构在企业中很少用&#xff0c;原因&#xff1a;①会形成单点故障&#xff0c;没有高可用的效果&#xff1b;②mysql本身是一个I/O能力比较差&#xff0c;并发能力比较差的应用服务&#xff0c;在较高规模的网络I/…

C#知识|将选中的账号信息展示到控制台(小示例)

哈喽,你好啊,我是雷工! 上篇学习了控件事件的统一关联, 本篇通过实例练习继续学习事件统一处理中Tag数据获取、对象的封装及泛型集合List的综合运用。 01 实现功能 在上篇的基础上实现,点击选中喜欢的账号,选中按钮底色变为蓝色,当选择完毕,点击保存选择时,将选中的…