|
死亡或掉线后可以保留 buff,适用于 Cosmic、北斗 及其衍生版本
原理是,角色死亡或下线时将所有 buff 保存起来,当角色状态恢复正常时,重新发送给客户端。
是给客户端发送了新的BUFF,这个新BUFF的剩余时间为`使用时间+可持续时间-当前时间`
例如你在2分使用了某个技能,这个技能的持续时间为5分钟(即7分结束),你在3分死亡,然后在6分复活,那服务端会重新给客户端发送这个BUFF,但是剩余时间只有1分钟
编辑 `src/main/java/client/Character.java` 将
```java
ret.put(srcid, new PlayerBuffValueHolder((int) (curtime - mbsvh.startTime), mbsvh.effect));
```
替换为
```java
ret.put(srcid, new PlayerBuffValueHolder((int) (curtime - mbsvh.startTime), mbsvh.startTime, mbsvh.effect));
```
在
```java
private void playerDead() {
```
下面插入
```java
Server.getInstance().getPlayerBuffStorage().addBuffsToStorage(id, getAllBuffs()); // 保存 buff
```
在同文件中任意空位插入三个新方法
```java
public void retrieveBuff() {
// 取回死前保存的 buff
List<PlayerBuffValueHolder> buffs = Server.getInstance().getPlayerBuffStorage().getBuffsFromStorage(id);
if (buffs != null) {
List<Pair<Long, PlayerBuffValueHolder>> timedBuffs = getOriginalStartTimes(buffs);
silentGiveBuffs(timedBuffs); // 服务端buff重新生效
clientRebuildBuffIcon(timedBuffs); // 客户端buff重新生效
}
}
/**
* 给客户端重新发送 buff
*/
public void clientRebuildBuffIcon(List<Pair<Long, PlayerBuffValueHolder>> timedBuffs) {
// 重建 buff 图标
for (Pair<Long, PlayerBuffValueHolder> mbsv : timedBuffs) {
PlayerBuffValueHolder mbsvh = mbsv.getRight();
boolean isSkill = mbsvh.effect.isSkill();
int sourceId = mbsvh.effect.getSourceId();
long localStartTime = mbsv.getLeft();
int localDuration = mbsvh.effect.alchemistModifyVal(this, mbsvh.effect.getBuffLocalDuration(), false);
int remainingTime = (int) (localStartTime + localDuration - Server.getInstance().getCurrentTime());
Packet buff = PacketCreator.giveBuff((isSkill ? sourceId : -sourceId), remainingTime, mbsvh.effect.getStatups());
sendPacket(buff);
}
}
private static List<Pair<Long, PlayerBuffValueHolder>> getOriginalStartTimes(List<PlayerBuffValueHolder> lpbvl) {
List<Pair<Long, PlayerBuffValueHolder>> timedBuffs = new ArrayList<>();
for (PlayerBuffValueHolder pb : lpbvl) {
timedBuffs.add(new Pair<>(pb.startTime, pb));
}
timedBuffs.sort(Comparator.comparing(Pair::getLeft));
return timedBuffs;
}
```
编辑 `src/main/java/client/Client.java` 在
```java
private void removePlayer(World wserv, boolean serverTransition) {
try {
```
下面插入
```java
Server.getInstance().getPlayerBuffStorage().addBuffsToStorage(player.getId(), // 保存 buffplayer.getAllBuffs());
```
编辑 `src/main/java/net/server/PlayerBuffValueHolder.java` 找到
```java
public class PlayerBuffValueHolder {
public int usedTime;
```
在下面插入
```java
public long startTime;
```
将
```java
public PlayerBuffValueHolder(int usedTime, StatEffect effect) {
```
替换为
```java
public PlayerBuffValueHolder(int usedTime, long startTime, StatEffect effect) {
```
在
```java
this.usedTime = usedTime;
```
下面插入
```java
this.startTime = startTime;
```
编辑 `src/main/java/net/server/channel/handlers/ChangeMapHandler.java`
在
```java
} else {
if (chr.isGM()) {
```
上面插入
```java
chr.retrieveBuff(); // 取回 buff
```
编辑 `src/main/java/net/server/channel/handlers/PlayerLoggedinHandler.java`
找到并删除
```java
List<PlayerBuffValueHolder> buffs = server.getPlayerBuffStorage().getBuffsFromStorage(cid);
if (buffs != null) {
List<Pair<Long, PlayerBuffValueHolder>> timedBuffs = getLocalStartTimes(buffs);
player.silentGiveBuffs(timedBuffs);
}
```
在
```java
if (newcomer) {
player.setLoginTime(System.currentTimeMillis());
}
```
下面插入
```java
player.retrieveBuff(); // 取回 buff
```
找到并删除
```java
private static List<Pair<Long, PlayerBuffValueHolder>> getLocalStartTimes(List<PlayerBuffValueHolder> lpbvl) {
List<Pair<Long, PlayerBuffValueHolder>> timedBuffs = new ArrayList<>();
long curtime = currentServerTime();
for (PlayerBuffValueHolder pb : lpbvl) {
timedBuffs.add(new Pair<>(curtime - pb.usedTime, pb));
}
timedBuffs.sort((p1, p2) -> p1.getLeft().compareTo(p2.getLeft()));
return timedBuffs;
}
```
编辑 `src/main/java/server/StatEffect.java` 将 `int alchemistModifyVal(Character chr, int val, boolean withX)` 方法从私有改为共有
|
|