在前几期中,我们“初体验”封包世界,也尝试完成了一个封包小功能——自己封装的封包吃药call。
可想要通过封包吃药,必须在发送给服务器的封包中带有 药品的ID 或者 药品在背包中的位置,总之需要提供相应的信息 服务器才能知道你要吃那瓶药。
在我们的老朋友——私服版幻想神域2中,我们必须要提供药品在背包中的位置下标 才能实现功能。但是我们分析封包吃药的真正目的,肯定是要实现自动使用补给品 这是实现自动化中的重要一环,不然挂机的时候被怪打残了 或者 蓝量不足了,总不可能手动输入药品位置吧,所以最好可以通过药品的名称来使用药品。
于是我们逆向遍历了背包的数据结构,如愿的得到了背包中所有的物品信息。但是上期还有一些问题没有解决,比如我们不好通过某些物品的特定信息 来取出某个特定的物品,像 我想要取出血药的物品信息...可以通过物品ID(上篇我们已经分析出这个属性了)这个唯一的特征来从背包结构中遍历 但是背包中的物品类型太多 全部使用ID表示为免太不方便、太不直观了,如果能通过物品的名字 来从背包结构中取出 那就方便太多了。
所有我们需要找到物品的名称属性,不过在那之前我们需要了解一下计算机是怎么存储文字信息的——经典数据结构:字符串!
如图所示,像游戏中所有显示的文字 实际上都是以字符串格式储存。字符串的重要性可想而知,不仅仅可以逆向它来得到我们想要的文字信息,并且由于它很显眼 很多时候也可以作为我们逆向的突破口,后几篇笔记中 我或许会以字符串为突破口,来优化我们的寻路函数。
没错,上次我们封装的寻路函数实际上是有问题的,一次两次的调用或许没有任何问题,但是一但频繁的调用.... 会出现两种问题:
1. 首先有可能游戏会崩溃。
2. 或者人物一直楞在原地无法操作。
额..闲话扯多了,先让我们看看经典字符串的理论结构吧。
经典“C”字符串:
字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。
下面的声明和初始化创建了一个 "Hello" 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 "Hello" 的字符数多一个。
char greeting[6] = {'H', 'e', 'l', 'l', 'o