mirror of
https://github.com/Melledy/LunarCore.git
synced 2025-12-14 22:34:35 +01:00
Delete player data when an account is deleted
This commit is contained in:
@@ -29,7 +29,7 @@ public class AccountCommand implements CommandHandler {
|
|||||||
reservedUid = Utils.parseSafeInt(args.get(2));
|
reservedUid = Utils.parseSafeInt(args.get(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AccountHelper.createAccount(username, null, reservedUid)) {
|
if (AccountHelper.createAccount(username, null, reservedUid) != null) {
|
||||||
this.sendMessage(sender, "Account created");
|
this.sendMessage(sender, "Account created");
|
||||||
} else {
|
} else {
|
||||||
this.sendMessage(sender, "Account already exists");
|
this.sendMessage(sender, "Account already exists");
|
||||||
|
|||||||
@@ -7,18 +7,18 @@ import emu.lunarcore.LunarCore;
|
|||||||
*/
|
*/
|
||||||
public class AccountHelper {
|
public class AccountHelper {
|
||||||
|
|
||||||
public static boolean createAccount(String username, String password, int reservedUid) {
|
public static Account createAccount(String username, String password, int reservedUid) {
|
||||||
Account account = LunarCore.getAccountDatabase().getObjectByField(Account.class, "username", username);
|
Account account = LunarCore.getAccountDatabase().getObjectByField(Account.class, "username", username);
|
||||||
|
|
||||||
if (account != null) {
|
if (account != null) {
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
account = new Account(username);
|
account = new Account(username);
|
||||||
account.setReservedPlayerUid(reservedUid);
|
account.setReservedPlayerUid(reservedUid);
|
||||||
account.save();
|
account.save();
|
||||||
|
|
||||||
return true;
|
return account;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean deleteAccount(String username) {
|
public static boolean deleteAccount(String username) {
|
||||||
@@ -28,6 +28,13 @@ public class AccountHelper {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete the player too
|
||||||
|
// IMPORTANT: This will only delete the player from the current game server
|
||||||
|
if (LunarCore.getGameServer() != null) {
|
||||||
|
LunarCore.getGameServer().deletePlayer(account.getUid());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete the account first
|
||||||
return LunarCore.getAccountDatabase().delete(account);
|
return LunarCore.getAccountDatabase().delete(account);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,11 +17,9 @@ import lombok.Setter;
|
|||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Entity(value = "heroPaths", useDiscriminator = false)
|
@Entity(value = "heroPaths", useDiscriminator = false)
|
||||||
public class HeroPath {
|
public class AvatarHeroPath {
|
||||||
@Id
|
@Id private int id; // Equivalent to HeroBaseType
|
||||||
private int id; // Equivalent to HeroBaseType
|
@Indexed private int ownerUid;
|
||||||
@Indexed
|
|
||||||
private int ownerUid;
|
|
||||||
|
|
||||||
private AvatarData data;
|
private AvatarData data;
|
||||||
|
|
||||||
@@ -29,11 +27,11 @@ public class HeroPath {
|
|||||||
private transient AvatarExcel excel;
|
private transient AvatarExcel excel;
|
||||||
|
|
||||||
@Deprecated // Morphia only!
|
@Deprecated // Morphia only!
|
||||||
public HeroPath() {
|
public AvatarHeroPath() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public HeroPath(Player player, AvatarExcel excel) {
|
public AvatarHeroPath(Player player, AvatarExcel excel) {
|
||||||
// Set excel avatar id as id
|
// Set excel avatar id as id
|
||||||
this.id = excel.getId();
|
this.id = excel.getId();
|
||||||
this.ownerUid = player.getUid();
|
this.ownerUid = player.getUid();
|
||||||
@@ -19,7 +19,7 @@ import lombok.Getter;
|
|||||||
@Getter
|
@Getter
|
||||||
public class AvatarStorage extends BasePlayerManager implements Iterable<GameAvatar> {
|
public class AvatarStorage extends BasePlayerManager implements Iterable<GameAvatar> {
|
||||||
private final Int2ObjectMap<GameAvatar> avatars;
|
private final Int2ObjectMap<GameAvatar> avatars;
|
||||||
private final Int2ObjectMap<HeroPath> heroPaths;
|
private final Int2ObjectMap<AvatarHeroPath> heroPaths;
|
||||||
|
|
||||||
public AvatarStorage(Player player) {
|
public AvatarStorage(Player player) {
|
||||||
super(player);
|
super(player);
|
||||||
@@ -65,7 +65,7 @@ public class AvatarStorage extends BasePlayerManager implements Iterable<GameAva
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HeroPath getHeroPathById(int id) {
|
public AvatarHeroPath getHeroPathById(int id) {
|
||||||
return getHeroPaths().get(id);
|
return getHeroPaths().get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ public class AvatarStorage extends BasePlayerManager implements Iterable<GameAva
|
|||||||
AvatarExcel excel = GameData.getAvatarExcelMap().get(heroExcel.getId());
|
AvatarExcel excel = GameData.getAvatarExcelMap().get(heroExcel.getId());
|
||||||
if (excel == null) continue;
|
if (excel == null) continue;
|
||||||
|
|
||||||
HeroPath path = new HeroPath(getPlayer(), excel);
|
AvatarHeroPath path = new AvatarHeroPath(getPlayer(), excel);
|
||||||
path.save();
|
path.save();
|
||||||
getHeroPaths().put(path.getId(), path);
|
getHeroPaths().put(path.getId(), path);
|
||||||
}
|
}
|
||||||
@@ -94,7 +94,7 @@ public class AvatarStorage extends BasePlayerManager implements Iterable<GameAva
|
|||||||
|
|
||||||
public void loadFromDatabase() {
|
public void loadFromDatabase() {
|
||||||
// Load hero paths
|
// Load hero paths
|
||||||
Stream<HeroPath> heroStream = LunarCore.getGameDatabase().getObjects(HeroPath.class, "ownerUid", this.getPlayer().getUid());
|
Stream<AvatarHeroPath> heroStream = LunarCore.getGameDatabase().getObjects(AvatarHeroPath.class, "ownerUid", this.getPlayer().getUid());
|
||||||
|
|
||||||
heroStream.forEach(heroPath -> {
|
heroStream.forEach(heroPath -> {
|
||||||
// Load avatar excel data
|
// Load avatar excel data
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ public class GameAvatar implements GameEntity {
|
|||||||
private transient int entityId;
|
private transient int entityId;
|
||||||
private transient Int2ObjectMap<GameItem> equips;
|
private transient Int2ObjectMap<GameItem> equips;
|
||||||
private transient Int2LongMap buffs;
|
private transient Int2LongMap buffs;
|
||||||
private transient HeroPath heroPath;
|
private transient AvatarHeroPath heroPath;
|
||||||
|
|
||||||
@Deprecated // Morphia only
|
@Deprecated // Morphia only
|
||||||
public GameAvatar() {
|
public GameAvatar() {
|
||||||
@@ -86,7 +86,7 @@ public class GameAvatar implements GameEntity {
|
|||||||
this.setExcel(excel);
|
this.setExcel(excel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public GameAvatar(HeroPath path) {
|
public GameAvatar(AvatarHeroPath path) {
|
||||||
this();
|
this();
|
||||||
this.avatarId = GameConstants.TRAILBLAZER_AVATAR_ID;
|
this.avatarId = GameConstants.TRAILBLAZER_AVATAR_ID;
|
||||||
this.timestamp = System.currentTimeMillis() / 1000;
|
this.timestamp = System.currentTimeMillis() / 1000;
|
||||||
@@ -188,7 +188,7 @@ public class GameAvatar implements GameEntity {
|
|||||||
return this.getData().getSkills();
|
return this.getData().getSkills();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setHeroPath(HeroPath heroPath) {
|
public void setHeroPath(AvatarHeroPath heroPath) {
|
||||||
// Clear prev set hero path from avatar
|
// Clear prev set hero path from avatar
|
||||||
if (this.getHeroPath() != null) {
|
if (this.getHeroPath() != null) {
|
||||||
this.getHeroPath().setAvatar(null);
|
this.getHeroPath().setAvatar(null);
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package emu.lunarcore.game.player;
|
|||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.mongodb.client.model.Filters;
|
||||||
|
|
||||||
import dev.morphia.annotations.Entity;
|
import dev.morphia.annotations.Entity;
|
||||||
import dev.morphia.annotations.Id;
|
import dev.morphia.annotations.Id;
|
||||||
import dev.morphia.annotations.Indexed;
|
import dev.morphia.annotations.Indexed;
|
||||||
@@ -17,8 +19,10 @@ import emu.lunarcore.data.excel.MazePlaneExcel;
|
|||||||
import emu.lunarcore.game.account.Account;
|
import emu.lunarcore.game.account.Account;
|
||||||
import emu.lunarcore.game.avatar.AvatarStorage;
|
import emu.lunarcore.game.avatar.AvatarStorage;
|
||||||
import emu.lunarcore.game.avatar.GameAvatar;
|
import emu.lunarcore.game.avatar.GameAvatar;
|
||||||
import emu.lunarcore.game.avatar.HeroPath;
|
import emu.lunarcore.game.avatar.AvatarHeroPath;
|
||||||
import emu.lunarcore.game.battle.Battle;
|
import emu.lunarcore.game.battle.Battle;
|
||||||
|
import emu.lunarcore.game.challenge.ChallengeGroupReward;
|
||||||
|
import emu.lunarcore.game.challenge.ChallengeHistory;
|
||||||
import emu.lunarcore.game.challenge.ChallengeInstance;
|
import emu.lunarcore.game.challenge.ChallengeInstance;
|
||||||
import emu.lunarcore.game.challenge.ChallengeManager;
|
import emu.lunarcore.game.challenge.ChallengeManager;
|
||||||
import emu.lunarcore.game.chat.ChatManager;
|
import emu.lunarcore.game.chat.ChatManager;
|
||||||
@@ -26,12 +30,16 @@ import emu.lunarcore.game.chat.ChatMessage;
|
|||||||
import emu.lunarcore.game.enums.PlaneType;
|
import emu.lunarcore.game.enums.PlaneType;
|
||||||
import emu.lunarcore.game.enums.PropState;
|
import emu.lunarcore.game.enums.PropState;
|
||||||
import emu.lunarcore.game.gacha.PlayerGachaInfo;
|
import emu.lunarcore.game.gacha.PlayerGachaInfo;
|
||||||
|
import emu.lunarcore.game.inventory.GameItem;
|
||||||
import emu.lunarcore.game.inventory.Inventory;
|
import emu.lunarcore.game.inventory.Inventory;
|
||||||
|
import emu.lunarcore.game.mail.Mail;
|
||||||
import emu.lunarcore.game.mail.Mailbox;
|
import emu.lunarcore.game.mail.Mailbox;
|
||||||
import emu.lunarcore.game.player.lineup.LineupManager;
|
import emu.lunarcore.game.player.lineup.LineupManager;
|
||||||
|
import emu.lunarcore.game.player.lineup.PlayerExtraLineup;
|
||||||
import emu.lunarcore.game.player.lineup.PlayerLineup;
|
import emu.lunarcore.game.player.lineup.PlayerLineup;
|
||||||
import emu.lunarcore.game.rogue.RogueInstance;
|
import emu.lunarcore.game.rogue.RogueInstance;
|
||||||
import emu.lunarcore.game.rogue.RogueManager;
|
import emu.lunarcore.game.rogue.RogueManager;
|
||||||
|
import emu.lunarcore.game.rogue.RogueTalentData;
|
||||||
import emu.lunarcore.game.scene.Scene;
|
import emu.lunarcore.game.scene.Scene;
|
||||||
import emu.lunarcore.game.scene.entity.EntityProp;
|
import emu.lunarcore.game.scene.entity.EntityProp;
|
||||||
import emu.lunarcore.game.scene.entity.GameEntity;
|
import emu.lunarcore.game.scene.entity.GameEntity;
|
||||||
@@ -332,12 +340,12 @@ public class Player {
|
|||||||
return this.exp - GameData.getPlayerExpRequired(this.level);
|
return this.exp - GameData.getPlayerExpRequired(this.level);
|
||||||
}
|
}
|
||||||
|
|
||||||
public HeroPath getCurHeroPath() {
|
public AvatarHeroPath getCurHeroPath() {
|
||||||
return this.getAvatars().getHeroPathById(this.getCurBasicType());
|
return this.getAvatars().getHeroPathById(this.getCurBasicType());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setHeroBasicType(int heroType) {
|
public void setHeroBasicType(int heroType) {
|
||||||
HeroPath path = this.getAvatars().getHeroPathById(heroType);
|
AvatarHeroPath path = this.getAvatars().getHeroPathById(heroType);
|
||||||
if (path == null) return;
|
if (path == null) return;
|
||||||
|
|
||||||
GameAvatar mainCharacter = this.getAvatarById(GameConstants.TRAILBLAZER_AVATAR_ID);
|
GameAvatar mainCharacter = this.getAvatarById(GameConstants.TRAILBLAZER_AVATAR_ID);
|
||||||
@@ -601,17 +609,6 @@ public class Player {
|
|||||||
this.updateStamina();
|
this.updateStamina();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Database
|
|
||||||
|
|
||||||
public void save() {
|
|
||||||
if (this.uid <= 0) {
|
|
||||||
LunarCore.getLogger().error("Tried to save a player object without a uid!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
LunarCore.getGameDatabase().save(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onLogin() {
|
public void onLogin() {
|
||||||
// Validate
|
// Validate
|
||||||
this.getLineupManager().setPlayer(this);
|
this.getLineupManager().setPlayer(this);
|
||||||
@@ -645,6 +642,42 @@ public class Player {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Database
|
||||||
|
|
||||||
|
public void save() {
|
||||||
|
if (this.uid <= 0) {
|
||||||
|
LunarCore.getLogger().error("Tried to save a player object without a uid!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LunarCore.getGameDatabase().save(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete() {
|
||||||
|
// Close session first
|
||||||
|
if (this.getSession() != null) {
|
||||||
|
this.getSession().close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cache filter object so we can reuse it for our delete queries
|
||||||
|
var filter = Filters.eq("ownerUid", uid);
|
||||||
|
|
||||||
|
// Delete data from collections
|
||||||
|
LunarCore.getGameDatabase().getDatastore().getCollection(GameAvatar.class).deleteMany(filter);
|
||||||
|
LunarCore.getGameDatabase().getDatastore().getCollection(ChallengeHistory.class).deleteMany(filter);
|
||||||
|
LunarCore.getGameDatabase().getDatastore().getCollection(ChallengeGroupReward.class).deleteMany(filter);
|
||||||
|
LunarCore.getGameDatabase().getDatastore().getCollection(AvatarHeroPath.class).deleteMany(filter);
|
||||||
|
LunarCore.getGameDatabase().getDatastore().getCollection(GameItem.class).deleteMany(filter);
|
||||||
|
LunarCore.getGameDatabase().getDatastore().getCollection(PlayerLineup.class).deleteMany(filter);
|
||||||
|
LunarCore.getGameDatabase().getDatastore().getCollection(PlayerExtraLineup.class).deleteMany(filter);
|
||||||
|
LunarCore.getGameDatabase().getDatastore().getCollection(Mail.class).deleteMany(filter);
|
||||||
|
LunarCore.getGameDatabase().getDatastore().getCollection(RogueTalentData.class).deleteMany(filter);
|
||||||
|
|
||||||
|
// Delete the player last
|
||||||
|
LunarCore.getGameDatabase().delete(this);
|
||||||
|
}
|
||||||
|
|
||||||
// Protobuf serialization
|
// Protobuf serialization
|
||||||
|
|
||||||
public PlayerBasicInfo toProto() {
|
public PlayerBasicInfo toProto() {
|
||||||
@@ -678,5 +711,4 @@ public class Player {
|
|||||||
|
|
||||||
return proto;
|
return proto;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -93,6 +93,31 @@ public class GameServer extends KcpServer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Player getOnlinePlayerByAccountId(String accountUid) {
|
||||||
|
synchronized (this.players) {
|
||||||
|
return this.players.values()
|
||||||
|
.stream()
|
||||||
|
.filter(p -> accountUid.equals(p.getAccountUid()))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean deletePlayer(String accountUid) {
|
||||||
|
// Check if player exists
|
||||||
|
Player player = this.getOnlinePlayerByAccountId(accountUid);
|
||||||
|
|
||||||
|
// Try to get player from database
|
||||||
|
if (player == null) {
|
||||||
|
player = LunarCore.getGameDatabase().getObjectByField(Player.class, "accountUid", accountUid);
|
||||||
|
if (player == null) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete the player
|
||||||
|
player.delete();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
// Setup config and init server
|
// Setup config and init server
|
||||||
ChannelConfig channelConfig = new ChannelConfig();
|
ChannelConfig channelConfig = new ChannelConfig();
|
||||||
|
|||||||
@@ -176,6 +176,8 @@ public class GameSession {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void close() {
|
public void close() {
|
||||||
|
if (this.ukcp != null) {
|
||||||
this.ukcp.close();
|
this.ukcp.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package emu.lunarcore.server.packet.send;
|
package emu.lunarcore.server.packet.send;
|
||||||
|
|
||||||
import emu.lunarcore.game.avatar.HeroPath;
|
import emu.lunarcore.game.avatar.AvatarHeroPath;
|
||||||
import emu.lunarcore.game.player.Player;
|
import emu.lunarcore.game.player.Player;
|
||||||
import emu.lunarcore.proto.GetHeroBasicTypeInfoScRspOuterClass.GetHeroBasicTypeInfoScRsp;
|
import emu.lunarcore.proto.GetHeroBasicTypeInfoScRspOuterClass.GetHeroBasicTypeInfoScRsp;
|
||||||
import emu.lunarcore.server.packet.BasePacket;
|
import emu.lunarcore.server.packet.BasePacket;
|
||||||
@@ -15,7 +15,7 @@ public class PacketGetHeroBasicTypeInfoScRsp extends BasePacket {
|
|||||||
.setGenderValue(player.getGender().getVal())
|
.setGenderValue(player.getGender().getVal())
|
||||||
.setCurBasicTypeValue(player.getCurBasicType());
|
.setCurBasicTypeValue(player.getCurBasicType());
|
||||||
|
|
||||||
for (HeroPath path : player.getAvatars().getHeroPaths().values()) {
|
for (AvatarHeroPath path : player.getAvatars().getHeroPaths().values()) {
|
||||||
data.addAllBasicTypeInfoList(path.toProto());
|
data.addAllBasicTypeInfoList(path.toProto());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,10 +3,9 @@ package emu.lunarcore.server.packet.send;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import emu.lunarcore.game.avatar.GameAvatar;
|
import emu.lunarcore.game.avatar.GameAvatar;
|
||||||
import emu.lunarcore.game.avatar.HeroPath;
|
import emu.lunarcore.game.avatar.AvatarHeroPath;
|
||||||
import emu.lunarcore.game.inventory.GameItem;
|
import emu.lunarcore.game.inventory.GameItem;
|
||||||
import emu.lunarcore.game.player.Player;
|
import emu.lunarcore.game.player.Player;
|
||||||
import emu.lunarcore.proto.AvatarSyncOuterClass.AvatarSync;
|
|
||||||
import emu.lunarcore.proto.BoardDataSyncOuterClass.BoardDataSync;
|
import emu.lunarcore.proto.BoardDataSyncOuterClass.BoardDataSync;
|
||||||
import emu.lunarcore.proto.PlayerSyncScNotifyOuterClass.PlayerSyncScNotify;
|
import emu.lunarcore.proto.PlayerSyncScNotifyOuterClass.PlayerSyncScNotify;
|
||||||
import emu.lunarcore.server.packet.BasePacket;
|
import emu.lunarcore.server.packet.BasePacket;
|
||||||
@@ -109,7 +108,7 @@ public class PacketPlayerSyncScNotify extends BasePacket {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public PacketPlayerSyncScNotify(HeroPath heroPath) {
|
public PacketPlayerSyncScNotify(AvatarHeroPath heroPath) {
|
||||||
this();
|
this();
|
||||||
|
|
||||||
var data = PlayerSyncScNotify.newInstance()
|
var data = PlayerSyncScNotify.newInstance()
|
||||||
|
|||||||
Reference in New Issue
Block a user