mirror of
https://github.com/Melledy/Nebula.git
synced 2025-12-12 20:34:36 +01:00
Only allow one session per player
This commit is contained in:
@@ -65,12 +65,12 @@ public class GameContext {
|
||||
while (it.hasNext()) {
|
||||
var session = it.next().getValue();
|
||||
|
||||
if (timeout > session.getLastActiveTime()) {
|
||||
if (timeout > session.getLastActiveTime() || session.isRemove()) {
|
||||
// Remove from session map
|
||||
it.remove();
|
||||
|
||||
// Clear player
|
||||
session.clearPlayer(this);
|
||||
session.clearPlayer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package emu.nebula.game.player;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.Stack;
|
||||
|
||||
import dev.morphia.annotations.Entity;
|
||||
@@ -44,7 +42,7 @@ public class Player implements GameDatabaseObject {
|
||||
@Indexed private String accountUid;
|
||||
|
||||
private transient Account account;
|
||||
private transient Set<GameSession> sessions;
|
||||
private transient GameSession session;
|
||||
|
||||
// Details
|
||||
private String name;
|
||||
@@ -80,7 +78,6 @@ public class Player implements GameDatabaseObject {
|
||||
|
||||
@Deprecated // Morphia only
|
||||
public Player() {
|
||||
this.sessions = new HashSet<>();
|
||||
this.characters = new CharacterStorage(this);
|
||||
this.gachaManager = new GachaManager(this);
|
||||
|
||||
@@ -135,22 +132,17 @@ public class Player implements GameDatabaseObject {
|
||||
return this.account;
|
||||
}
|
||||
|
||||
public void addSession(GameSession session) {
|
||||
synchronized (this.sessions) {
|
||||
this.sessions.add(session);
|
||||
public void setSession(GameSession session) {
|
||||
if (this.session != null) {
|
||||
this.session.clearPlayer();
|
||||
}
|
||||
|
||||
this.session = session;
|
||||
}
|
||||
|
||||
public void removeSession(GameSession session) {
|
||||
synchronized (this.sessions) {
|
||||
this.sessions.remove(session);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean hasSessions() {
|
||||
synchronized (this.sessions) {
|
||||
return !this.sessions.isEmpty();
|
||||
}
|
||||
public void removeSession() {
|
||||
this.session = null;
|
||||
Nebula.getGameContext().getPlayerModule().removeFromCache(this);
|
||||
}
|
||||
|
||||
public boolean getGender() {
|
||||
|
||||
@@ -7,7 +7,6 @@ import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
|
||||
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
|
||||
|
||||
import emu.nebula.Nebula;
|
||||
import emu.nebula.game.GameContext;
|
||||
import emu.nebula.game.account.Account;
|
||||
import emu.nebula.game.account.AccountHelper;
|
||||
import emu.nebula.game.player.Player;
|
||||
@@ -32,19 +31,24 @@ public class GameSession {
|
||||
private byte[] serverPrivateKey;
|
||||
private byte[] key;
|
||||
|
||||
//
|
||||
// Session cleanup
|
||||
private boolean remove;
|
||||
private long lastActiveTime;
|
||||
|
||||
public GameSession() {
|
||||
this.updateLastActiveTime();
|
||||
}
|
||||
|
||||
public void setPlayer(Player player) {
|
||||
this.player = player;
|
||||
this.player.addSession(this);
|
||||
public synchronized Player getPlayer() {
|
||||
return this.player;
|
||||
}
|
||||
|
||||
public void clearPlayer(GameContext context) {
|
||||
public synchronized void setPlayer(Player player) {
|
||||
this.player = player;
|
||||
this.player.setSession(this);
|
||||
}
|
||||
|
||||
public synchronized void clearPlayer() {
|
||||
// Sanity check
|
||||
if (this.player == null) {
|
||||
return;
|
||||
@@ -55,15 +59,13 @@ public class GameSession {
|
||||
this.player = null;
|
||||
|
||||
// Remove session from player
|
||||
player.removeSession(this);
|
||||
player.removeSession();
|
||||
|
||||
// Clean up from player module
|
||||
if (!player.hasSessions()) {
|
||||
context.getPlayerModule().removeFromCache(player);
|
||||
}
|
||||
// Set remove flag
|
||||
this.remove = true;
|
||||
}
|
||||
|
||||
public boolean hasPlayer() {
|
||||
public synchronized boolean hasPlayer() {
|
||||
return this.player != null;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user