第十五章:L2JMobius学习 – 刷新NPC和对话

news2025/1/12 4:08:40

首先,我们介绍一下城镇里面的传送师NPC的刷新和对话。

传送师对应的类是L2TeleporterInstance,它继承L2FolkInstance,再继承L2NpcInstance。

我们要处理的是“单击/双击”传送师的业务逻辑,对应的是Action数据包。这个数据包具有普遍性,我们很多的点击操作都会发送该数据包。我们如何处理这个Action数据包呢?这里要分两种情况,第一次“单击”和第二次“单击”。第一次单击是选中传送师NPC,第二次单击就是弹出对话框。虽然我们可以双击,但是代码处理还是两次进行的。

第一次单击选中传送师NPC的时候,会向客户端发送TargetSelected 数据包和MyTargetSelected数据包。通过数据包名称我们也能知道,这个就代表选中目标的意思。

第二次单击传送师的时候,对应的依然是Action数据包的处理。由于已经选中了传送师NPC,所以这次向客户端发送NpcHtmlMessage数据包。这个数据包的内容本质是一段html代码。不同的传送师,对应的html代码是不一样的。这些html代码在哪里呢?就在工程根目录下的“data\html\teleporter”下。如下图所示:

在上面的“30006.html”文件对应的是“说话岛村庄”里面的传送师“拉普吉儿”。这个数字30006其实就是npc表中传送师“拉普吉儿”的主键ID。

我们打开这个“30006.html”文件,如下所示:

我们简单翻译一下,

上图中的文件内容就是我们双击传送师“拉普吉儿”出现的对话框的内容。也就是我们的NpcHtmlMessage数据包要返回的数据。

接下来,当我们在对话框里面选择“传送”的时候,客户端会向服务器端发送RequestBypassToServer请求,然后服务器端会向客户端继续发送NpcHtmlMessage数据包,实际上读取的就是“30006-1.htm”文件。

之所以读取“30006-1.htm”文件是由NPC的ID和后面传递的参数“1”决定的。我们在RequestBypassToServer数据包中需要获取一个“_command”的请求参数。这个参数的格式类似于:npc_268466749_Chat 1  我们可以看到,这个字符串格式就是上面<a>里面决定的。而数字268466749 则是传送师“拉普吉儿”游戏对象的ID。L2World游戏世界类中的Map<Integer, L2Object> _allObjects集合就是以游戏对象的ID为KEY来存储该游戏对象的。

接下来,我们介绍RequestBypassToServer数据包中的代码处理。

// 点击NPC后的反馈,就是返回NpcHtmlMessage数据包
((L2NpcInstance)object).onBypassFeedback(activeChar, this._command.substring(endOfId + 1));

我们发现,代码处理就是调用L2TeleporterInstance类的onBypassFeedback方法,以及父类L2FolkInstance里面的onBypassFeedback方法,以及父类L2NpcInstance中的onBypassFeedback方法。这些被重写的onBypassFeedback方法处理的对话方式是不一样的。例如,对于“Chat”是在L2NpcInstance中处理的,而“goto”则是在L2TeleporterInstance中处理的。他们处理的大致逻辑都是相似的,就是找到对应的html文件,然后封装到NpcHtmlMessage数据包中发送给客户端。最终当我们选择传送到某一个村庄的时候,则会执行L2TeleporterInstance类中的doTeleport方法,参数为村庄的ID。这里,我们需要根据村庄来查询teleport数据表来获取传送点坐标信息。有了传送点之后,我们就可以调用L2Character的teleToLocation方法进行传送,向客户端广播TeleportToLocation数据包(向周围的玩家发送此数据包)。接下来,我们在GamePacketHandler中增加两种数据包的处理。

case 4: { msg = new Action(); break; }
case 33: { msg = new RequestBypassToServer(); break; }

如果你的角色没有金币的话,不用担心,我们在“characters”数据表中找到你的角色的“obj_Id”值(比如说是268478822),然后去“items”数据表中查询“owner_id = 268478822 AND item_id = 57”的数据记录,然后直接修改该纪录的“count”数值(这就是金币数量)。

现在,我们就来测试一下传送功能吧。

本章节涉及的内容均已上传百度网盘:

https://pan.baidu.com/s/1XdlcCFPvXnzfwFoVK7Sn7Q?pwd=avd4

欢迎加企鹅交流裙:874700842(裙文件里面也可以下载所有内容)。

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

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

相关文章

Linux系统上安装FTP服务

文章背景 最近为了调试Linux系统FTP传输工具&#xff0c;刚好有Linux虚拟机环境&#xff0c;于是就搭建了vsftpd服务。 使用环境 Linux系统&#xff1a;BigCloud Enterprise Linux 7.8 (Core) 安装 1. 查询是否安装vsftpd [rootlocalhost ~]# rpm -qa | grep vsftpd 2. 安…

【CHI】Transaction structure

我们在前文【CHI】CHI协议&#xff0c;transaction事务汇总已经总结了事务类型&#xff0c;这篇开始讲述事务可以完成的方式。它显示了参与事务的各种组件可以使用的所有允许的选项。 注&#xff1a; 除了PCrdReturn 和PrefetchTgt之外&#xff0c;其他的事务在开始的时候都可…

APP分发-CDN加速原理

摘要 CDN的全称是(Content Delivery Network)&#xff0c;即内容分发网络。其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层&#xff0c;将网站的内容发布到最接近用户的网络”边缘“的节点&#xff0c;使用户可以就近取得所需的内容&#xff0c;提高用户访问网站的…

疯狂java 三-六章

第三章 数据类型和运算符 Java语言是强类型语言&#xff0c;意思是每个变量和每个表达式都有一个在编译时就确定的类型&#xff0c;所有的变量都必须显式声明类型 标识符就是类&#xff0c;变量、方法命名的符号 标识符不能包含空格 标识符只能包含美元符($)&#xff0c;不…

2000-2021年三批“智慧城市”试点名单匹配数据

2000-2021年三批“智慧城市”试点名单匹配数据 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;行政区划代码、地区、所属省份、年份、智慧城市试点、最早试点年份 3、来源&#xff1a;住建部公布的三批“国家智慧城市名单” 4、说明&#xff1a;内含原始文件和匹配结…

AcWing 1.1 数字三角形模型 dp动态规划

&#xff08;1&#xff09;ACWing 1015. 摘花生 1015. 摘花生 - AcWing题库 Hello Kitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。地里每个道路的交叉点上都有种着一株花生苗&#xff0c;上…

从设计、制造到封测,XSKY 智能存储助力半导体行业数字化转型

近日&#xff0c;ECS2023 第五届中国电子通信与半导体 CIO 峰会在深圳召开&#xff0c;峰会以“数字科技与业务重塑”为主题&#xff0c;汇聚了 300来自电子通信与半导体行业知名企业高管、CIO、信息化与数字化负责人&#xff0c;交流电子通信与半导体行业的创新的产品和解决方…

65、内网安全-域环境工作组局域网探针方案

目录 案例1-基本信息收集操作演示案例2-网络信息收集操作演示案例3-用户信息收集操作演示案例4-凭据信息收集操作演示案例5-探针主机域控架构服务操作演示涉及资源 我们攻击内网一般是借助web攻击&#xff0c;直接进去&#xff0c;然后再去攻击内网&#xff0c;那么攻击的对象一…

Python 继承和子类示例:从 Person 到 Student 的演示

继承允许我们定义一个类&#xff0c;该类继承另一个类的所有方法和属性。父类是被继承的类&#xff0c;也叫做基类。子类是从另一个类继承的类&#xff0c;也叫做派生类。 创建一个父类 任何类都可以成为父类&#xff0c;因此语法与创建任何其他类相同&#xff1a; 示例&…

贪心算法学习——加油站

目录 一&#xff0c;题目 二&#xff0c;题目接口 三&#xff0c;解题思路及其代码 一&#xff0c;题目 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油…

单链表的定义(数据结构与算法)

单链表的定义 单链表是一种常见的数据结构&#xff0c;用于存储元素的序列。它由一系列节点组成&#xff0c;每个节点包含一个数据元素和一个指向下一个节点的引用&#xff08;指针&#xff09;。单链表中的节点之间通过指针连接起来&#xff0c;形成一个线性结构。单链表是一种…

【C++进阶之路】第三篇:二叉搜索树 kv模型

文章目录 一、二叉搜索树1.二叉搜索树概念2.二叉搜索树操作3.二叉搜索树的实现 二、二叉搜索树的应用1.kv模型2.kv模型的实现 三、 二叉搜索树的性能分析 一、二叉搜索树 1.二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性…

使用 kind 集群实现 all-in-one 在线安装 DCE 5.0 社区版

文章目录 一、什么是DCE 5.0二、部署先决条件三、创建云服务器实例3.1 实例节点配置[最低配置要求]3.2 远程连接云实例3.3 更新系统 四、安装Docker-CE五、使用 Kind 搭建 Kubernetes 集群六、安装依赖包6.1 helm安装6.2 skopeo安装6.3 kubectl安装6.4 yq安装 七、安装 DCE 5.0…

软考系列(系统架构师)- 2014年系统架构师软考案例分析考点

试题一 软件架构&#xff08;MYC 架构、扩展接口模式&#xff09; MVC架构风格最初是Smalltalk-80中用来构建用户界面时采用的架构设计风格。其中M代表模型&#xff08;Model)&#xff0c;V代表视图&#xff08;View)&#xff0c;C代表控制器&#xff08;Controller)。在该风格…

Transformers实战(一)快速入门命名实体识别、多项选择

Transformers实战&#xff08;一&#xff09;快速入门命名实体识别、多项选择 1、命名实体识别(NER) 1.1 命名实体识别简介 1.1.1 NER数据标注体系 命名实体识别(Named Entity Recognition&#xff0c;简称NER)是指识别文本中具有特定意义的实体&#xff0c;主要包括人名、…

【管理运筹学】第 10 章 | 排队论(4,系统容量有限制和顾客源有限的情形)

文章目录 引言一、系统的容量有限制&#xff08; M / M / 1 / N / ∞ M/M/1/N/\infty M/M/1/N/∞&#xff09;二、顾客源为有限的情形&#xff08; M / M / 1 / ∞ / m M/M/1/\infty/m M/M/1/∞/m&#xff09;写在最后 引言 了解了标准的 M / M / 1 M/M/1 M/M/1 模型后&#…

[UDS] --- DiagnosticSessionControl 0x10 service

1 会话 $10包含3个子功能&#xff0c;01 Default默认会话&#xff0c;02 Programming编程会话&#xff0c;03 Extended扩展会话&#xff0c;ECU上电时&#xff0c;进入的是默认会话&#xff08;Default&#xff09;。 为什么设计三个会话模式呢&#xff1f;因为权限问题。默认…

华为eNSP配置专题-路由策略的配置

文章目录 华为eNSP配置专题-路由策略的配置0、概要介绍1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、终端构成和连接2.2、终端的基本配置 3、配置路由策略3.1、目标3.2、配置路由策略 华为eNSP配置专题-路由策略的配置 0、概要介绍 路由策略就是通过一系列工具…

Java SE 学习笔记(十四)—— IO流(2)

目录 1 字节流1.1 字节流写数据1.1.1 创建字节输出流对象1.1.2 字节流写数据 1.2 字节流读数据1.2.1 创建字节输入流对象1.2.2 字节流读数据 1.3 字节流复制文件1.4 流的刷新与关闭1.5 资源释放方式1.5.1 try-catch-finally1.5.2 try-with-resource 2 字符流2.1 字符流概述2.2 …

Spring中Bean的作用域

目录 一、什么是Bean的作用域 二、Scope注解 三、Bean的6种作用域 3.1 singleton单例模式 3.2 prototype 原型模式 3.3 request 3.4 session 3.5 application 3.6 websocket 一、什么是Bean的作用域 在之前学习的过程中&#xff0c;我们把作用域定义为&#xff1a;限定程序中变…