mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-16 17:05:20 +01:00
Move PlayerTeleportEvent occurrences into World
This commit is contained in:
@@ -5,12 +5,11 @@ import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.proto.MapMarkPointTypeOuterClass.MapMarkPointType;
|
||||
import emu.grasscutter.net.proto.MarkMapReqOuterClass.MarkMapReq;
|
||||
import emu.grasscutter.net.proto.MarkMapReqOuterClass.MarkMapReq.Operation;
|
||||
import emu.grasscutter.server.event.player.PlayerTeleportEvent;
|
||||
import emu.grasscutter.server.event.player.PlayerTeleportEvent.TeleportType;
|
||||
import emu.grasscutter.server.packet.send.PacketMarkMapRsp;
|
||||
import emu.grasscutter.server.packet.send.PacketSceneEntityAppearNotify;
|
||||
import emu.grasscutter.utils.Position;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class MapMarksManager extends BasePlayerManager {
|
||||
@@ -21,7 +20,7 @@ public class MapMarksManager extends BasePlayerManager {
|
||||
}
|
||||
|
||||
public Map<String, MapMark> getMapMarks() {
|
||||
return getPlayer().getMapMarks();
|
||||
return this.getPlayer().getMapMarks();
|
||||
}
|
||||
|
||||
public void handleMapMarkReq(MarkMapReq req) {
|
||||
@@ -31,26 +30,26 @@ public class MapMarksManager extends BasePlayerManager {
|
||||
MapMark createMark = new MapMark(req.getMark());
|
||||
// keep teleporting functionality on fishhook mark.
|
||||
if (createMark.getMapMarkPointType() == MapMarkPointType.MAP_MARK_POINT_TYPE_FISH_POOL) {
|
||||
teleport(player, createMark);
|
||||
this.teleport(player, createMark);
|
||||
return;
|
||||
}
|
||||
addMapMark(createMark);
|
||||
this.addMapMark(createMark);
|
||||
}
|
||||
case OPERATION_MOD -> {
|
||||
MapMark oldMark = new MapMark(req.getOld());
|
||||
removeMapMark(oldMark.getPosition());
|
||||
this.removeMapMark(oldMark.getPosition());
|
||||
MapMark newMark = new MapMark(req.getMark());
|
||||
addMapMark(newMark);
|
||||
this.addMapMark(newMark);
|
||||
}
|
||||
case OPERATION_DEL -> {
|
||||
MapMark deleteMark = new MapMark(req.getMark());
|
||||
removeMapMark(deleteMark.getPosition());
|
||||
this.removeMapMark(deleteMark.getPosition());
|
||||
}
|
||||
}
|
||||
if (op != Operation.OPERATION_GET) {
|
||||
save();
|
||||
this.save();
|
||||
}
|
||||
player.getSession().send(new PacketMarkMapRsp(getMapMarks()));
|
||||
player.getSession().send(new PacketMarkMapRsp(this.getMapMarks()));
|
||||
}
|
||||
|
||||
public String getMapMarkKey(Position position) {
|
||||
@@ -58,12 +57,12 @@ public class MapMarksManager extends BasePlayerManager {
|
||||
}
|
||||
|
||||
public void removeMapMark(Position position) {
|
||||
getMapMarks().remove(getMapMarkKey(position));
|
||||
this.getMapMarks().remove(this.getMapMarkKey(position));
|
||||
}
|
||||
|
||||
public void addMapMark(MapMark mapMark) {
|
||||
if (getMapMarks().size() < mapMarkMaxCount) {
|
||||
getMapMarks().put(getMapMarkKey(mapMark.getPosition()), mapMark);
|
||||
if (this.getMapMarks().size() < mapMarkMaxCount) {
|
||||
this.getMapMarks().put(this.getMapMarkKey(mapMark.getPosition()), mapMark);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,14 +74,7 @@ public class MapMarksManager extends BasePlayerManager {
|
||||
}
|
||||
|
||||
Position pos = mapMark.getPosition();
|
||||
PlayerTeleportEvent event = new PlayerTeleportEvent(player, PlayerTeleportEvent.TeleportType.MAP,
|
||||
player.getPosition(), new Position(pos.getX(), y, pos.getZ()));
|
||||
|
||||
event.call(); if(event.isCanceled()) return;
|
||||
|
||||
player.getPosition().set(event.getDestination());
|
||||
if (mapMark.getSceneId() != player.getSceneId()) {
|
||||
player.getWorld().transferPlayerToScene(player, mapMark.getSceneId(), player.getPosition());
|
||||
} player.getScene().broadcastPacket(new PacketSceneEntityAppearNotify(player));
|
||||
player.getWorld().transferPlayerToScene(player, mapMark.getSceneId(), TeleportType.MAP, new Position(pos.getX(), y, pos.getZ()));
|
||||
player.getScene().broadcastPacket(new PacketSceneEntityAppearNotify(player));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,8 @@ import emu.grasscutter.data.excels.SceneData;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.proto.EnterTypeOuterClass.EnterType;
|
||||
import emu.grasscutter.scripts.data.SceneConfig;
|
||||
import emu.grasscutter.server.event.player.PlayerTeleportEvent;
|
||||
import emu.grasscutter.server.event.player.PlayerTeleportEvent.TeleportType;
|
||||
import emu.grasscutter.server.game.GameServer;
|
||||
import emu.grasscutter.server.packet.send.PacketDelTeamEntityNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketPlayerEnterSceneNotify;
|
||||
@@ -53,7 +55,7 @@ public class World implements Iterable<Player> {
|
||||
this.players = Collections.synchronizedList(new ArrayList<>());
|
||||
this.scenes = Int2ObjectMaps.synchronize(new Int2ObjectOpenHashMap<>());
|
||||
|
||||
this.levelEntityId = getNextEntityId(EntityIdType.MPLEVEL);
|
||||
this.levelEntityId = this.getNextEntityId(EntityIdType.MPLEVEL);
|
||||
this.worldLevel = player.getWorldLevel();
|
||||
this.isMultiplayer = isMultiplayer;
|
||||
|
||||
@@ -101,7 +103,7 @@ public class World implements Iterable<Player> {
|
||||
|
||||
public Scene getSceneById(int sceneId) {
|
||||
// Get scene normally
|
||||
Scene scene = getScenes().get(sceneId);
|
||||
Scene scene = this.getScenes().get(sceneId);
|
||||
if (scene != null) {
|
||||
return scene;
|
||||
}
|
||||
@@ -118,7 +120,7 @@ public class World implements Iterable<Player> {
|
||||
}
|
||||
|
||||
public int getPlayerCount() {
|
||||
return getPlayers().size();
|
||||
return this.getPlayers().size();
|
||||
}
|
||||
|
||||
public boolean isMultiplayer() {
|
||||
@@ -131,7 +133,7 @@ public class World implements Iterable<Player> {
|
||||
|
||||
public synchronized void addPlayer(Player player) {
|
||||
// Check if player already in
|
||||
if (getPlayers().contains(player)) {
|
||||
if (this.getPlayers().contains(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -142,11 +144,11 @@ public class World implements Iterable<Player> {
|
||||
|
||||
// Register
|
||||
player.setWorld(this);
|
||||
getPlayers().add(player);
|
||||
this.getPlayers().add(player);
|
||||
|
||||
// Set player variables
|
||||
player.setPeerId(this.getNextPeerId());
|
||||
player.getTeamManager().setEntityId(getNextEntityId(EntityIdType.TEAM));
|
||||
player.getTeamManager().setEntityId(this.getNextEntityId(EntityIdType.TEAM));
|
||||
|
||||
// Copy main team to multiplayer team
|
||||
if (this.isMultiplayer()) {
|
||||
@@ -169,12 +171,12 @@ public class World implements Iterable<Player> {
|
||||
player.sendPacket(
|
||||
new PacketDelTeamEntityNotify(
|
||||
player.getSceneId(),
|
||||
getPlayers().stream().map(p -> p.getTeamManager().getEntityId()).collect(Collectors.toList())
|
||||
this.getPlayers().stream().map(p -> p.getTeamManager().getEntityId()).collect(Collectors.toList())
|
||||
)
|
||||
);
|
||||
|
||||
// Deregister
|
||||
getPlayers().remove(player);
|
||||
this.getPlayers().remove(player);
|
||||
player.setWorld(null);
|
||||
|
||||
// Remove from scene
|
||||
@@ -187,7 +189,7 @@ public class World implements Iterable<Player> {
|
||||
}
|
||||
|
||||
// Disband world if host leaves
|
||||
if (getHost() == player) {
|
||||
if (this.getHost() == player) {
|
||||
List<Player> kicked = new ArrayList<>(this.getPlayers());
|
||||
for (Player victim : kicked) {
|
||||
World world = new World(victim);
|
||||
@@ -207,14 +209,28 @@ public class World implements Iterable<Player> {
|
||||
}
|
||||
|
||||
public boolean transferPlayerToScene(Player player, int sceneId, Position pos) {
|
||||
return transferPlayerToScene(player, sceneId, null, pos);
|
||||
return this.transferPlayerToScene(player, sceneId, TeleportType.INTERNAL, null, pos);
|
||||
}
|
||||
|
||||
public boolean transferPlayerToScene(Player player, int sceneId, TeleportType teleportType, Position pos) {
|
||||
return this.transferPlayerToScene(player, sceneId, teleportType, null, pos);
|
||||
}
|
||||
|
||||
public boolean transferPlayerToScene(Player player, int sceneId, DungeonData data) {
|
||||
return transferPlayerToScene(player, sceneId, data, null);
|
||||
return this.transferPlayerToScene(player, sceneId, TeleportType.DUNGEON, data, null);
|
||||
}
|
||||
|
||||
public boolean transferPlayerToScene(Player player, int sceneId, DungeonData dungeonData, Position pos) {
|
||||
public boolean transferPlayerToScene(Player player, int sceneId, TeleportType teleportType, DungeonData dungeonData, Position teleportTo) {
|
||||
// Call player teleport event.
|
||||
PlayerTeleportEvent event = new PlayerTeleportEvent(player, teleportType, player.getPosition(), teleportTo);
|
||||
// Call event & check if it was canceled.
|
||||
event.call(); if (event.isCanceled()) {
|
||||
return false; // Teleport was canceled.
|
||||
}
|
||||
|
||||
// Set the destination.
|
||||
teleportTo = event.getDestination();
|
||||
|
||||
if (GameData.getSceneDataMap().get(sceneId) == null) {
|
||||
return false;
|
||||
}
|
||||
@@ -224,7 +240,7 @@ public class World implements Iterable<Player> {
|
||||
if (player.getScene() != null) {
|
||||
oldScene = player.getScene();
|
||||
|
||||
// Dont deregister scenes if the player is going to tp back into them
|
||||
// Don't deregister scenes if the player is going to tp back into them
|
||||
if (oldScene.getId() == sceneId) {
|
||||
oldScene.setDontDestroyWhenEmpty(true);
|
||||
}
|
||||
@@ -238,9 +254,9 @@ public class World implements Iterable<Player> {
|
||||
|
||||
// Dungeon
|
||||
SceneConfig config = newScene.getScriptManager().getConfig();
|
||||
if (pos == null && config != null) {
|
||||
if (teleportTo == null && config != null) {
|
||||
if (config.born_pos != null) {
|
||||
pos = newScene.getScriptManager().getConfig().born_pos;
|
||||
teleportTo = newScene.getScriptManager().getConfig().born_pos;
|
||||
}
|
||||
if (config.born_rot != null) {
|
||||
player.getRotation().set(config.born_rot);
|
||||
@@ -248,11 +264,11 @@ public class World implements Iterable<Player> {
|
||||
}
|
||||
|
||||
// Set player position
|
||||
if (pos == null) {
|
||||
pos = player.getPosition();
|
||||
if (teleportTo == null) {
|
||||
teleportTo = player.getPosition();
|
||||
}
|
||||
|
||||
player.getPosition().set(pos);
|
||||
player.getPosition().set(teleportTo);
|
||||
|
||||
if (oldScene != null) {
|
||||
newScene.setPrevScene(oldScene.getId());
|
||||
@@ -276,12 +292,12 @@ public class World implements Iterable<Player> {
|
||||
}
|
||||
|
||||
// Teleport packet
|
||||
player.sendPacket(new PacketPlayerEnterSceneNotify(player, enterType, enterReason, sceneId, pos));
|
||||
player.sendPacket(new PacketPlayerEnterSceneNotify(player, enterType, enterReason, sceneId, teleportTo));
|
||||
return true;
|
||||
}
|
||||
|
||||
private void updatePlayerInfos(Player paramPlayer) {
|
||||
for (Player player : getPlayers()) {
|
||||
for (Player player : this.getPlayers()) {
|
||||
// Dont send packets if player is logging in and filter out joining player
|
||||
if (!player.hasSentLoginPackets() || player == paramPlayer) {
|
||||
continue;
|
||||
@@ -292,7 +308,7 @@ public class World implements Iterable<Player> {
|
||||
player.getTeamManager().getMpTeam().copyFrom(player.getTeamManager().getMpTeam(), player.getTeamManager().getMaxTeamSize());
|
||||
player.getTeamManager().updateTeamEntities(null);
|
||||
}
|
||||
|
||||
|
||||
// Dont send packets if player is loading into the scene
|
||||
if (player.getSceneLoadState().getValue() < SceneLoadState.INIT.getValue() ) {
|
||||
// World player info packets
|
||||
@@ -326,6 +342,6 @@ public class World implements Iterable<Player> {
|
||||
|
||||
@Override
|
||||
public Iterator<Player> iterator() {
|
||||
return getPlayers().iterator();
|
||||
return this.getPlayers().iterator();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user