MultiplayerSystem.java 5.26 KB
Newer Older
Melledy's avatar
Melledy committed
1
2
3
4
package emu.grasscutter.game.managers;

import emu.grasscutter.game.CoopRequest;
import emu.grasscutter.game.props.EnterReason;
Melledy's avatar
Melledy committed
5
import emu.grasscutter.game.world.World;
Melledy's avatar
Melledy committed
6
7
import emu.grasscutter.net.proto.EnterTypeOuterClass.EnterType;
import emu.grasscutter.net.proto.PlayerApplyEnterMpReasonOuterClass.PlayerApplyEnterMpReason;
Melledy's avatar
Melledy committed
8
9
import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.player.Player.SceneLoadState;
10
import emu.grasscutter.net.proto.PlayerApplyEnterMpResultNotifyOuterClass;
11
import emu.grasscutter.server.game.BaseGameSystem;
Melledy's avatar
Melledy committed
12
13
14
15
16
import emu.grasscutter.server.game.GameServer;
import emu.grasscutter.server.packet.send.PacketPlayerApplyEnterMpNotify;
import emu.grasscutter.server.packet.send.PacketPlayerApplyEnterMpResultNotify;
import emu.grasscutter.server.packet.send.PacketPlayerEnterSceneNotify;

17
public class MultiplayerSystem extends BaseGameSystem {
Melledy's avatar
Melledy committed
18

19
20
	public MultiplayerSystem(GameServer server) {
	    super(server);
Melledy's avatar
Melledy committed
21
22
	}

23
24
	public void applyEnterMp(Player player, int targetUid) {
		Player target = getServer().getPlayerByUid(targetUid);
Melledy's avatar
Melledy committed
25
		if (target == null) {
26
			player.sendPacket(new PacketPlayerApplyEnterMpResultNotify(targetUid, "", false, PlayerApplyEnterMpResultNotifyOuterClass.PlayerApplyEnterMpResultNotify.Reason.REASON_PLAYER_CANNOT_ENTER_MP));
Melledy's avatar
Melledy committed
27
28
29
30
31
32
33
34
			return;
		}
		
		// Sanity checks - Dont let player join if already in multiplayer
		if (player.getWorld().isMultiplayer()) {
			return;
		}
		
35
		/*
Melledy's avatar
Melledy committed
36
37
38
39
		if (target.getWorld().isDungeon()) {
			player.sendPacket(new PacketPlayerApplyEnterMpResultNotify(targetUid, "", false, PlayerApplyEnterMpReason.SceneCannotEnter));
			return;
		}
40
		*/
Melledy's avatar
Melledy committed
41
42
		
		// Get request
43
		CoopRequest request = target.getCoopRequests().get(player.getUid());
Melledy's avatar
Melledy committed
44
45
46
47
48
49
50
51
		
		if (request != null && !request.isExpired()) {
			// Join request already exists
			return;
		}
		
		// Put request in
		request = new CoopRequest(player);
52
		target.getCoopRequests().put(player.getUid(), request);
Melledy's avatar
Melledy committed
53
54
55
56
57
		
		// Packet
		target.sendPacket(new PacketPlayerApplyEnterMpNotify(player));
	}

58
	public void applyEnterMpReply(Player hostPlayer, int applyUid, boolean isAgreed) {
Melledy's avatar
Melledy committed
59
		// Checks
60
		CoopRequest request = hostPlayer.getCoopRequests().get(applyUid);
Melledy's avatar
Melledy committed
61
62
63
64
65
		if (request == null || request.isExpired()) {
			return;
		}
		
		// Remove now that we are handling it
66
		Player requester = request.getRequester();
67
		hostPlayer.getCoopRequests().remove(applyUid);
Melledy's avatar
Melledy committed
68
		
69
		// Sanity checks - Dont let the requesting player join if they are already in multiplayer
Melledy's avatar
Melledy committed
70
		if (requester.getWorld().isMultiplayer()) {
71
			request.getRequester().sendPacket(new PacketPlayerApplyEnterMpResultNotify(hostPlayer, false, PlayerApplyEnterMpResultNotifyOuterClass.PlayerApplyEnterMpResultNotify.Reason.REASON_PLAYER_CANNOT_ENTER_MP));
Melledy's avatar
Melledy committed
72
73
74
75
			return;
		}
		
		// Response packet
76
		request.getRequester().sendPacket(new PacketPlayerApplyEnterMpResultNotify(hostPlayer, isAgreed, PlayerApplyEnterMpResultNotifyOuterClass.PlayerApplyEnterMpResultNotify.Reason.REASON_PLAYER_JUDGE));
Melledy's avatar
Melledy committed
77
78
79
80
81
82
83
		
		// Declined
		if (!isAgreed) {
			return;
		}

		// Success
84
		if (!hostPlayer.getWorld().isMultiplayer()) {
Melledy's avatar
Melledy committed
85
			// Player not in multiplayer, create multiplayer world
86
			World world = new World(hostPlayer, true);
Melledy's avatar
Melledy committed
87
88

			// Add
89
			world.addPlayer(hostPlayer);
Melledy's avatar
Melledy committed
90
91
			
			// Rejoin packet
92
			hostPlayer.sendPacket(new PacketPlayerEnterSceneNotify(hostPlayer, hostPlayer, EnterType.ENTER_TYPE_SELF, EnterReason.HostFromSingleToMp, hostPlayer.getScene().getId(), hostPlayer.getPosition()));
Melledy's avatar
Melledy committed
93
94
		}
		
95
		// Set scene pos and id of requester to the host player's
96
		requester.getPosition().set(hostPlayer.getPosition());
97
98
		requester.getRotation().set(hostPlayer.getRotation());
		requester.setSceneId(hostPlayer.getSceneId());
Melledy's avatar
Melledy committed
99
		
100
101
102
		// Make requester join
		hostPlayer.getWorld().addPlayer(requester);

Melledy's avatar
Melledy committed
103
		// Packet
104
		requester.sendPacket(new PacketPlayerEnterSceneNotify(requester, hostPlayer, EnterType.ENTER_TYPE_OTHER, EnterReason.TeamJoin, hostPlayer.getScene().getId(), hostPlayer.getPosition()));
Melledy's avatar
Melledy committed
105
106
	}
	
107
	public boolean leaveCoop(Player player) {
Melledy's avatar
Melledy committed
108
109
110
111
112
113
		// Make sure player's world is multiplayer
		if (!player.getWorld().isMultiplayer()) {
			return false;
		}
		
		// Make sure everyone's scene is loaded
114
		for (Player p : player.getWorld().getPlayers()) {
Melledy's avatar
Melledy committed
115
116
117
118
119
120
121
122
123
124
			if (p.getSceneLoadState() != SceneLoadState.LOADED) {
				return false;
			}
		}
		
		// Create new world for player
		World world = new World(player);
		world.addPlayer(player);
	
		// Packet
125
		player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.ENTER_TYPE_SELF, EnterReason.TeamBack, player.getScene().getId(), player.getPosition()));
Melledy's avatar
Melledy committed
126
127
128
129
		
		return true;
	}

130
	public boolean kickPlayer(Player player, int targetUid) {
Melledy's avatar
Melledy committed
131
132
133
134
135
136
		// Make sure player's world is multiplayer and that player is owner
		if (!player.getWorld().isMultiplayer() || player.getWorld().getHost() != player) {
			return false;
		}
		
		// Get victim and sanity checks
137
		Player victim = player.getServer().getPlayerByUid(targetUid);
Melledy's avatar
Melledy committed
138
139
140
141
142
143
144
145
146
147
148
149
150
151
		
		if (victim == null || victim == player) {
			return false;
		}
		
		// Make sure victim's scene has loaded
		if (victim.getSceneLoadState() != SceneLoadState.LOADED) {
			return false;
		}
		
		// Kick
		World world = new World(victim);
		world.addPlayer(victim);
		
152
		victim.sendPacket(new PacketPlayerEnterSceneNotify(victim, EnterType.ENTER_TYPE_SELF, EnterReason.TeamKick, victim.getScene().getId(), victim.getPosition()));
Melledy's avatar
Melledy committed
153
154
155
		return true;
	}
}