|
实现功能:在服务端上将造成伤害、获取金币、获取经验和击杀的怪物数量的数据发送给客户端。(客户端接收汇总和显示部分需自行完成)
适用于 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));
```
|
|