楼主: e110110eee

【原创】CMS143启动以及配置

  [复制链接]

中级会员

枫币
551
威望
0
贡献
4
在线时间
79 小时
注册时间
2019-4-1
QQ
 楼主| 发表于 2022-5-12 22:37:39 | 显示全部楼层
lqcstyle 发表于 2022-5-12 09:40
楼主加油,最近在修一个86的端,等这段时间结束了,交流一下

好呀,我也不是很懂,都是慢慢debug

中级会员

枫币
551
威望
0
贡献
4
在线时间
79 小时
注册时间
2019-4-1
QQ
 楼主| 发表于 2022-5-12 22:39:24 | 显示全部楼层
0512 - 修复五转任务
这里涉及到脚本任务的完成,但是脚本任务完成原本的代码实际上并没有任何逻辑,所以要完成任务还是需要wz的任务进行支撑。
一个合理的猜测是脚本任务只能是马上完成的?不能是有过程的?

格兰蒂斯的神秘石任务
数据库添加1463任务的数据即可
```sql
INSERT INTO `chms`.`wz_questdata`(`questid`, `name`, `autoStart`, `autoPreComplete`, `viewMedalItem`, `selectedSkillID`, `blocked`, `autoAccept`, `autoComplete`, `selfStart`) VALUES (1463, '格兰蒂斯的神秘石', 0, 0, 0, 0, 0, 0, 0, 0);

# 我添加的是简单老麦的信息,应该都可以触发。
INSERT INTO `chms`.`wz_questreqdata`(`id`, `questid`, `name`, `type`, `stringStore`, `intStoresFirst`, `intStoresSecond`) VALUES (22729, 1463, 'mob', 1, '0', '8880010', '1');

```

绯红的神秘石
次元之镜加一个废弃营地
脚本是直接完成了任务,说明这个估计不好修复,我也跳过了
server.maps.MapleSlideMenu.SlideMenu5.TownTeleport
最后一行加
bus(24, "万神殿", 400000000, 0),
but(25, "废弃营地", 105300000, 0);

---
然后就是获取神秘球的任务 questId = 1466 添加信息
INSERT INTO `chms`.`wz_questreqdata`(`id`, `questid`, `name`, `type`, `stringStore`, `intStoresFirst`, `intStoresSecond`) VALUES (null, 1466, 'mob', 1, '0', '8641000', '10');
INSERT INTO `chms`.`wz_questdata`(`questid`, `name`, `autoStart`, `autoPreComplete`, `viewMedalItem`, `selectedSkillID`, `blocked`, `autoAccept`, `autoComplete`, `selfStart`) VALUES (1466, '另一种力量,神秘力量', 0, 0, 0, 0, 0, 0, 0, 0);

总结:不太懂脚本任务是怎么完成的,是否可以像系统任务一样完成,还是只能纯对话完成,不能有打怪或者收集的任务?

中级会员

枫币
551
威望
0
贡献
4
在线时间
79 小时
注册时间
2019-4-1
QQ
 楼主| 发表于 2022-5-14 13:03:03 | 显示全部楼层
本帖最后由 e110110eee 于 2023-2-1 23:33 编辑

0514

学习ida,我也不是很会,也是新手,就来简单学习一下:
在swordie代码中可以看到outbound他都有标注,
```java
    // CUserLocal::OnPacket
    EMOTION(685),
```
在我们maplesotry143找到这个包头
``
// handling.opcode.SendPacketOpcode
    USER_EMOTION_LOCAL(0x2d4),
``
02d4换算出来就是724
然后在143的idb文件找到这个CUserLocal::OnPacket
  1. int __thiscall CUserLocal::OnPacket(_DWORD *this, int a2, LPCWSTR lpWideCharStr)
  2. {
  3.   int result; // eax
  4.   int v4; // ecx
  5.   char v5; // [esp-1Ch] [ebp-20h]
  6.   int v6; // [esp-18h] [ebp-1Ch]
  7.   char v7; // [esp-14h] [ebp-18h]
  8.   int v8; // [esp-10h] [ebp-14h]
  9.   int v9; // [esp-Ch] [ebp-10h]
  10.   int v10; // [esp-8h] [ebp-Ch]
  11.   int v11; // [esp-4h] [ebp-8h]

  12.   result = a2 - 724;
  13.   switch ( a2 )
  14.   {
  15.     case 724:
  16.       // 这里的名字是我改的
  17.       result = USER_EMOTION_LOCAL(this, lpWideCharStr);
复制代码

点进这个USER_EMOTION_LOCAL

  1. int __thiscall USER_EMOTION_LOCAL(_DWORD *this, _DWORD *a1)
  2. {
  3.   _DWORD *v2; // ST18_4
  4.   int *v3; // eax
  5.   int *v4; // ebx
  6.   int v5; // eax
  7.   int v6; // esi
  8.   unsigned __int8 v7; // al

  9.   v2 = this;
  10.   CInPacket:: Decode4(a1);  //解析四个字节 一个int
  11.   v4 = v3;
  12.   CInPacket:: Decode4(a1);  //解析四个字节 一个int
  13.   v6 = v5;
  14.   CInPacket:: Decode1(a1);  //解析1个字节 一个byte
  15.   sub_1B27EB0(v2, v4, v6, v7);
  16.   return sub_C2D3B0(1);
  17. }
复制代码
可以看到ida需要两个int 一个 byte,
我们143服务端也是这样封包的,这个包应该是控制用户表情的
  1. public static byte[] getDirectionFacialExpression(int expression, int duration) {
  2.     log.trace("调用");
  3.     MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
  4.     mplew.writeShort(SendPacketOpcode.USER_EMOTION_LOCAL.getValue());
  5.     mplew.writeInt(expression);
  6.     mplew.writeInt(duration);
  7.     mplew.write(0);
  8.     return mplew.getPacket();
  9.     }
复制代码

这样就对应上了,这就是一个简单的例子,具体什么意思我也不懂,需要再研究研究。同理可以把maplestory143代码里的包头也按照Onpacket区分一下

中级会员

枫币
551
威望
0
贡献
4
在线时间
79 小时
注册时间
2019-4-1
QQ
 楼主| 发表于 2022-5-15 21:42:56 | 显示全部楼层
时间0515
今天弄了一天的抓包,没人教自己摸索是真的很艰难。都说使用mapleshark抓,github上拉源码下来,用vscode搞了半天都没启动起来。换成vs2017 就好了。千万不要用vscode启动。然后就是我也看不懂c#的源码,瞎搞了大半天,实在不行就强行开始debug ,看了一会发现代码并不难,

但是有一个问题:已经改了秘钥却一直抓包都报错,十分的奇怪。后来换了snowsniffer也不行,以为snowsniffer用Java写的 改起来会容易一点。谁知道我把mapelstroy的代码复制进去都不行,最后还是回来使用mapleshark,实在不行自己开始用vscode开始debug,最终发现他默认用的网上的密钥进行解密的所以不行,把那一段代码改了就好了

1. github上下载mapleshark
2. 看maplestory143的代码,找到143的密钥
3. 修改mapleshark的源码,去掉加载网络密钥的一段直接加载本地的秘钥,很简单就不放代码了。

就能对应上了




主要是一开始很慌不会c#就不敢去debug,后面发现实在不行只能自己上了。感觉还是不错的

初级会员

枫币
479
威望
0
贡献
1
在线时间
17 小时
注册时间
2017-6-7
发表于 2022-5-15 23:35:21 | 显示全部楼层
支持!!!
回复

使用道具 举报

中级会员

枫币
551
威望
0
贡献
4
在线时间
79 小时
注册时间
2019-4-1
QQ
 楼主| 发表于 2022-5-16 09:35:09 | 显示全部楼层
下一步打算重构一下技能相关的代码,这部分代码太冗杂了,感觉有几百个switch条件,一般都很多bug。当前初步考虑主要是这几点
1. 封包的每一部分具体的意思
2. 响应的封包需要包装成什么样的数据:是伤害还是debuff还是什么七七八八的,感觉这一部分可以责任链来包装
3. 每个职业尽量区分开,技能id区分出职业?然后每个职业走自己的逻辑?
4. 想想swordie会怎么做


这游戏的核心就是打怪,技能放完就到文件末尾,玩个锤子。这一部分还有很多可以做的,只是好不好修复罢了,毕竟143已经不能抓包了?先慢慢来把

初级会员

枫币
479
威望
0
贡献
1
在线时间
17 小时
注册时间
2017-6-7
发表于 2022-5-21 20:04:53 | 显示全部楼层
能不能出个详细的idea  源码导入然后启动运行的视频,小白没看懂

中级会员

枫币
551
威望
0
贡献
4
在线时间
79 小时
注册时间
2019-4-1
QQ
 楼主| 发表于 2022-5-23 15:13:21 | 显示全部楼层
www2109 发表于 2022-5-21 20:04
能不能出个详细的idea  源码导入然后启动运行的视频,小白没看懂

我都寫的很清楚啦,就是圖片加載不出來我也沒辦法咯。導入源碼之後把wz和腳本放到配置的目錄就好了

中级会员

枫币
551
威望
0
贡献
4
在线时间
79 小时
注册时间
2019-4-1
QQ
 楼主| 发表于 2022-5-23 17:10:26 | 显示全部楼层
本帖最后由 e110110eee 于 2022-5-24 14:20 编辑

0520
1. 重构攻击的发现里面有079的技能判定删掉了,侠盗的金钱攻击
2. 主要拆分攻击不同的攻击类型 近战、远程、魔法攻击,不同的职业需要单独实现的功能



1. 解析包体
2. 是否显示暴击
3. 控制被动攻击、例如斗气掉点数(原来代码就是写在近战攻击的处理里面)
4. 攻击类
   1. 判断攻击怪物数
   2. 判断攻击段数
   3. beforeAttack(计算实际数值,比如是否对已经有刺客标记的怪物做出响应,或者其他)
   4. 判断是否无视反伤
   5. onAttack判断攻击应该角色的状态,包括怪物的状态等、
   6. afterAttack  (攻击完后的状态,比如是否无敌等等)



总结:

1. 主要解耦成以上这几个方面,远程和魔法攻击也是类似,先把所有职业都解耦出来,然后打算再一个一个的修复。后面这几个attack的不同状态,会麻烦一些,而且看完代码发现好多都没有实现的。所以还是慢慢来咯。
2. 还要把状态相关的部分也了解,不然技能感觉也不好修复3.主要就三个维度:1.伤害  ,2.不同职业、职业群的效果 3.不同的状态。  职业和状态可能是多对多?

新人上路

枫币
33
威望
0
贡献
0
在线时间
5 小时
注册时间
2019-11-1
发表于 2022-6-6 14:54:26 | 显示全部楼层
楼主搞个群一起交流交流哈
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|枫叶物语冒险岛单机 | 本站已运行:

枫叶物语可能会倒闭,但是绝对不会变质。

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖QQ客服返回顶部