找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 17|回复: 0

[教程] MapleStory v83 服务端基础数据封包(需客户端配合ImGUI等使用)

[复制链接]

43

主题

31

回帖

356

积分

管理员

积分
356
发表于 昨天 16:49 | 显示全部楼层 |阅读模式

实现功能:在服务端上将造成伤害、获取金币、获取经验和击杀的怪物数量的数据发送给客户端。(客户端接收汇总和显示部分需自行完成)

适用于 Cosmic、北斗及其衍生版本

如果你只想本地统计的话,在客户端直接实现是最方便的。但是如果你想拿这些数据做排行啥的,那在服务端统计会更好。

本示例旨在告诉新手朋友,在服务端哪些地方可以统计到这些数据,**仅供参考**,像伤害这种数据,按照本示例可能会有遗漏,比如一些特殊伤害类型可能会在其他地方处理。总之如果发现有漏自己又不会找的,请跟帖提出。

## 创建自定义封包
详细介绍参见[实战示例4:GMS083 收发自定义封包](https://moguwuyu.com/thread-27-1-1.html)

编辑 `src/main/java/net/opcodes/SendOpcode.java` 添加新的封包ENUM `STATIC_DATA(0x170)`

编辑 `src/main/java/tools/PacketCreator.java` 添加新封包
```java
    /**
     * 发送数据
     * @param type 0:重置 1:金币 2:经验 3:伤害 4:怪物
     * @param quantity 数量
     * @return OutPacket
     */
    public static Packet staticData(byte type, int quantity) {
        OutPacket p = OutPacket.create(SendOpcode.STATIC_DATA);
        p.writeByte(type);
        p.writeInt(quantity);
        return p;
    }
```

## 发送重置数据命令
编辑 `src/main/java/net/server/channel/handlers/PlayerLoggedinHandler.java`


```java
cserv.addPlayer(player);
```

上面插入
```java
player.broadcastAcquaintances(PacketCreator.staticData((byte) 0, 0)); // 重置基础数据
```

## 发送经验数据
编辑 `src/main/java/client/Character.java`


```java
updateSingleStat(Stat.EXP, exp.addAndGet((int) total));
```
下面插入
```java
sendPacket(PacketCreator.staticData((byte) 2, (int) total)); // 获取经验
```

## 发送金币数据
还是上面的文件,在
```java
updateSingleStat(Stat.MESO, (int) nextMeso, enableActions);
```
下面插入
```java
if (gain > 0) {
    sendPacket(PacketCreator.staticData((byte) 1, gain)); // 获取金币
}
```

## 发送伤害数据
编辑 `src/main/java/net/server/channel/handlers/AbstractDealDamageHandler.java`


```java
if (ret.skill != Corsair.RAPID_FIRE || ret.skill != Aran.HIDDEN_FULL_DOUBLE || ret.skill != Aran.HIDDEN_FULL_TRIPLE || ret.skill != Aran.HIDDEN_OVER_DOUBLE || ret.skill != Aran.HIDDEN_OVER_TRIPLE) {
```
上面插入
```java
chr.sendPacket(PacketCreator.staticData((byte) 3, allDamageNumbers.stream().filter(Objects::nonNull).mapToInt(Integer::intValue).sum())); // 造成伤害
```

## 发送击杀怪物
编辑 `src/main/java/server/life/Monster.java`


```java
distributeExperience(killer != null ? killer.getId() : 0);
```
上面插入
```java
killer.sendPacket(PacketCreator.staticData((byte) 4, 1));
```

有问题欢迎跟帖提问。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|蘑菇物语

GMT+8, 2025-10-4 06:35 , Processed in 0.071930 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表