mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-05-12 06:56:02 +08:00
Teleport still exists on fish hook mark. Added mapMark-related protos. Map marking data is stored in players collection.
87 lines
3.0 KiB
Java
87 lines
3.0 KiB
Java
package emu.grasscutter.server.packet.recv;
|
|
|
|
import emu.grasscutter.game.managers.MapMarkManager.MapMark;
|
|
import emu.grasscutter.game.managers.MapMarkManager.MapMarksManager;
|
|
import emu.grasscutter.game.player.Player;
|
|
import emu.grasscutter.net.packet.Opcodes;
|
|
import emu.grasscutter.net.packet.PacketHandler;
|
|
import emu.grasscutter.net.packet.PacketOpcodes;
|
|
import emu.grasscutter.net.proto.*;
|
|
import emu.grasscutter.net.proto.MarkMapReqOuterClass.MarkMapReq;
|
|
import emu.grasscutter.server.game.GameSession;
|
|
import emu.grasscutter.server.packet.send.PacketMarkMapRsp;
|
|
import emu.grasscutter.server.packet.send.PacketMarkNewNotify;
|
|
import emu.grasscutter.server.packet.send.PacketSceneEntityAppearNotify;
|
|
import emu.grasscutter.utils.Position;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
@Opcodes(PacketOpcodes.MarkMapReq)
|
|
public class HandlerMarkMapReq extends PacketHandler {
|
|
|
|
private static boolean isInt(String str) {
|
|
|
|
try {
|
|
@SuppressWarnings("unused")
|
|
int x = Integer.parseInt(str);
|
|
return true; // String is an Integer
|
|
} catch (NumberFormatException e) {
|
|
return false; // String is not an Integer
|
|
}
|
|
|
|
}
|
|
|
|
@Override
|
|
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
|
MarkMapReq req = MarkMapReq.parseFrom(payload);
|
|
MarkMapReq.Operation op = req.getOp();
|
|
Player player = session.getPlayer();
|
|
MapMarksManager mapMarksManager = player.getMapMarksManager();
|
|
if (op == MarkMapReq.Operation.ADD) {
|
|
MapMark newMapMark = new MapMark(req.getMark());
|
|
// keep teleporting functionality on fishhook mark.
|
|
if (newMapMark.getMapMarkPointType() == MapMarkPointTypeOuterClass.MapMarkPointType.MAP_MARK_POINT_TYPE_FISH_POOL) {
|
|
teleport(player, newMapMark);
|
|
return;
|
|
}
|
|
if (mapMarksManager.addMapMark(newMapMark)) {
|
|
player.save();
|
|
}
|
|
} else if (op == MarkMapReq.Operation.MOD) {
|
|
MapMark newMapMark = new MapMark(req.getMark());
|
|
if (mapMarksManager.removeMapMark(newMapMark.getPosition())) {
|
|
if (mapMarksManager.addMapMark(newMapMark)) {
|
|
player.save();
|
|
}
|
|
}
|
|
} else if (op == MarkMapReq.Operation.DEL) {
|
|
MapMark newMapMark = new MapMark(req.getMark());
|
|
if (mapMarksManager.removeMapMark(newMapMark.getPosition())) {
|
|
player.save();
|
|
}
|
|
} else if (op == MarkMapReq.Operation.GET) {
|
|
// no-op
|
|
}
|
|
// send all marks to refresh client map view.
|
|
HashMap<String, MapMark> mapMarks = mapMarksManager.getAllMapMarks();
|
|
session.send(new PacketMarkMapRsp(player, mapMarks));
|
|
}
|
|
|
|
private void teleport(Player player, MapMark mapMark) {
|
|
// Increased height means you can fly to the top of dragonspine now,
|
|
// at the cost of slightly longer falling to your destination.
|
|
float y = 700;
|
|
float x = mapMark.getPosition().getX();
|
|
float z = mapMark.getPosition().getZ();
|
|
player.getPos().set(x, y, z);
|
|
if (mapMark.getSceneId() != player.getSceneId()) {
|
|
player.getWorld().transferPlayerToScene(player, mapMark.getSceneId(),
|
|
player.getPos());
|
|
} else {
|
|
player.getScene().broadcastPacket(new PacketSceneEntityAppearNotify(player));
|
|
}
|
|
}
|
|
}
|