From e2c56e6efe911795a512be547cc2770c2d9db435 Mon Sep 17 00:00:00 2001 From: Alejandro <25-alejandro@users.noreply.git.krews.org> Date: Tue, 30 Jul 2019 17:51:27 +0300 Subject: [PATCH] Dispose games properly upon room disposal --- .../commands/ReloadRoomCommand.java | 21 ++++++++----------- .../com/eu/habbo/habbohotel/games/Game.java | 8 +++++++ .../eu/habbo/habbohotel/games/GameTeam.java | 13 ++++++++++++ .../com/eu/habbo/habbohotel/rooms/Room.java | 3 ++- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/ReloadRoomCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/ReloadRoomCommand.java index de2768e1..1ccd20d0 100644 --- a/src/main/java/com/eu/habbo/habbohotel/commands/ReloadRoomCommand.java +++ b/src/main/java/com/eu/habbo/habbohotel/commands/ReloadRoomCommand.java @@ -17,18 +17,15 @@ public class ReloadRoomCommand extends Command { @Override public boolean handle(GameClient gameClient, String[] params) throws Exception { - Emulator.getThreading().run(new Runnable() { - @Override - public void run() { - Room room = gameClient.getHabbo().getHabboInfo().getCurrentRoom(); - if (room != null) { - Collection habbos = new ArrayList<>(room.getHabbos()); - Emulator.getGameEnvironment().getRoomManager().unloadRoom(room); - room = Emulator.getGameEnvironment().getRoomManager().loadRoom(room.getId()); - ServerMessage message = new ForwardToRoomComposer(room.getId()).compose(); - for (Habbo habbo : habbos) { - habbo.getClient().sendResponse(message); - } + Emulator.getThreading().run(() -> { + Room room = gameClient.getHabbo().getHabboInfo().getCurrentRoom(); + if (room != null) { + Collection habbos = new ArrayList<>(room.getHabbos()); + Emulator.getGameEnvironment().getRoomManager().unloadRoom(room); + room = Emulator.getGameEnvironment().getRoomManager().loadRoom(room.getId()); + ServerMessage message = new ForwardToRoomComposer(room.getId()).compose(); + for (Habbo habbo : habbos) { + habbo.getClient().sendResponse(message); } } }, 100); diff --git a/src/main/java/com/eu/habbo/habbohotel/games/Game.java b/src/main/java/com/eu/habbo/habbohotel/games/Game.java index e2b2a2ae..1336c272 100644 --- a/src/main/java/com/eu/habbo/habbohotel/games/Game.java +++ b/src/main/java/com/eu/habbo/habbohotel/games/Game.java @@ -223,6 +223,14 @@ public abstract class Game implements Runnable { } } + public void dispose() { + for (GameTeam team : this.teams.values()) { + team.clearMembers(); + } + this.teams.clear(); + + this.stop(); + } private void saveScores() { if (this.room == null) diff --git a/src/main/java/com/eu/habbo/habbohotel/games/GameTeam.java b/src/main/java/com/eu/habbo/habbohotel/games/GameTeam.java index 38748c8e..67fa54e0 100644 --- a/src/main/java/com/eu/habbo/habbohotel/games/GameTeam.java +++ b/src/main/java/com/eu/habbo/habbohotel/games/GameTeam.java @@ -1,6 +1,9 @@ package com.eu.habbo.habbohotel.games; +import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.plugin.Event; +import com.eu.habbo.plugin.events.games.GameHabboLeaveEvent; import gnu.trove.set.hash.THashSet; public class GameTeam { @@ -65,6 +68,16 @@ public class GameTeam { } } + public void clearMembers() { + for (GamePlayer player : this.members) { + player.getHabbo().getHabboInfo().getGamePlayer().reset(); + player.getHabbo().getHabboInfo().setCurrentGame(null); + player.getHabbo().getHabboInfo().setGamePlayer(null); + } + + this.members.clear(); + } + public THashSet getMembers() { return this.members; diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java index 61c409df..ffd420a6 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java @@ -853,7 +853,7 @@ public class Room implements Comparable, ISerialize, Runnable { } for (Game game : this.games) { - game.stop(); + game.dispose(); } this.games.clear(); @@ -2130,6 +2130,7 @@ public class Room implements Comparable, ISerialize, Runnable { public boolean deleteGame(Game game) { game.stop(); + game.dispose(); synchronized (this.games) { return this.games.remove(game); }