Arcturus-Community/src/main/java/com/eu/habbo/habbohotel/users/Habbo.java

465 lines
15 KiB
Java
Raw Normal View History

2018-07-06 15:30:00 +02:00
package com.eu.habbo.habbohotel.users;
import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.achievements.AchievementManager;
import com.eu.habbo.habbohotel.bots.Bot;
import com.eu.habbo.habbohotel.gameclients.GameClient;
import com.eu.habbo.habbohotel.messenger.Messenger;
import com.eu.habbo.habbohotel.pets.Pet;
import com.eu.habbo.habbohotel.rooms.*;
import com.eu.habbo.habbohotel.users.inventory.BadgesComponent;
2019-04-22 01:42:00 +02:00
import com.eu.habbo.messages.outgoing.generic.alerts.*;
2018-07-06 15:30:00 +02:00
import com.eu.habbo.messages.outgoing.inventory.*;
import com.eu.habbo.messages.outgoing.rooms.FloodCounterComposer;
import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer;
2018-10-07 00:28:00 +02:00
import com.eu.habbo.messages.outgoing.rooms.users.*;
2018-07-06 15:30:00 +02:00
import com.eu.habbo.messages.outgoing.users.*;
import com.eu.habbo.plugin.events.users.UserCreditsEvent;
import com.eu.habbo.plugin.events.users.UserDisconnectEvent;
import com.eu.habbo.plugin.events.users.UserPointsEvent;
import gnu.trove.TIntCollection;
2018-10-07 00:28:00 +02:00
import gnu.trove.map.hash.THashMap;
2018-07-06 15:30:00 +02:00
import gnu.trove.set.hash.THashSet;
2020-05-04 22:24:09 +02:00
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
2018-07-06 15:30:00 +02:00
import java.net.InetSocketAddress;
2019-08-05 18:35:26 +02:00
import java.net.SocketAddress;
2018-07-06 15:30:00 +02:00
import java.sql.ResultSet;
import java.util.*;
import java.util.stream.Collectors;
2018-07-06 15:30:00 +02:00
2019-05-26 20:14:53 +02:00
public class Habbo implements Runnable {
2020-05-04 22:24:09 +02:00
private static final Logger LOGGER = LoggerFactory.getLogger(Habbo.class);
2018-07-06 15:30:00 +02:00
private final HabboInfo habboInfo;
private final HabboStats habboStats;
private final Messenger messenger;
private final HabboInventory habboInventory;
2019-05-26 20:14:53 +02:00
private GameClient client;
2018-07-06 15:30:00 +02:00
private RoomUnit roomUnit;
private volatile boolean update;
private volatile boolean disconnected = false;
private volatile boolean disconnecting = false;
2019-05-26 20:14:53 +02:00
public Habbo(ResultSet set) {
2018-07-06 15:30:00 +02:00
this.client = null;
this.habboInfo = new HabboInfo(set);
2019-05-11 00:45:07 +02:00
this.habboStats = HabboStats.load(this.habboInfo);
2018-07-06 15:30:00 +02:00
this.habboInventory = new HabboInventory(this);
this.messenger = new Messenger();
this.messenger.loadFriends(this);
this.messenger.loadFriendRequests(this);
this.roomUnit = new RoomUnit();
this.roomUnit.setRoomUnitType(RoomUnitType.USER);
this.update = false;
}
2019-05-26 20:14:53 +02:00
public boolean isOnline() {
2018-07-06 15:30:00 +02:00
return this.habboInfo.isOnline();
}
2019-05-26 20:14:53 +02:00
void isOnline(boolean value) {
2018-07-06 15:30:00 +02:00
this.habboInfo.setOnline(value);
this.update();
}
2019-05-26 20:14:53 +02:00
void update() {
2018-07-06 15:30:00 +02:00
this.update = true;
2019-04-22 01:42:00 +02:00
this.run();
2018-07-06 15:30:00 +02:00
}
2019-05-26 20:14:53 +02:00
void needsUpdate(boolean value) {
2018-07-06 15:30:00 +02:00
this.update = value;
}
2019-05-26 20:14:53 +02:00
boolean needsUpdate() {
2018-07-06 15:30:00 +02:00
return this.update;
}
2019-05-26 20:14:53 +02:00
public Messenger getMessenger() {
2018-07-06 15:30:00 +02:00
return this.messenger;
}
2019-05-26 20:14:53 +02:00
public HabboInfo getHabboInfo() {
2018-07-06 15:30:00 +02:00
return this.habboInfo;
}
2019-05-26 20:14:53 +02:00
public HabboStats getHabboStats() {
2018-07-06 15:30:00 +02:00
return this.habboStats;
}
2019-05-26 20:14:53 +02:00
public HabboInventory getInventory() {
2018-07-06 15:30:00 +02:00
return this.habboInventory;
}
2019-05-26 20:14:53 +02:00
public RoomUnit getRoomUnit() {
2018-07-06 15:30:00 +02:00
return this.roomUnit;
}
2019-05-26 20:14:53 +02:00
public void setRoomUnit(RoomUnit roomUnit) {
2018-07-06 15:30:00 +02:00
this.roomUnit = roomUnit;
}
2019-05-26 20:14:53 +02:00
public GameClient getClient() {
2018-07-06 15:30:00 +02:00
return this.client;
}
2019-05-26 20:14:53 +02:00
public void setClient(GameClient client) {
2018-07-06 15:30:00 +02:00
this.client = client;
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void connect() {
2019-07-30 13:03:50 +02:00
if (!Emulator.getConfig().getBoolean("networking.tcp.proxy") && this.client.getChannel().remoteAddress() != null) {
2019-08-05 18:35:26 +02:00
SocketAddress address = this.client.getChannel().remoteAddress();
if (address != null) this.habboInfo.setIpLogin(((InetSocketAddress) address).getAddress().getHostAddress());
2018-07-06 15:30:00 +02:00
}
2018-09-28 21:25:00 +02:00
this.habboInfo.setMachineID(this.client.getMachineId());
2018-07-06 15:30:00 +02:00
this.isOnline(true);
this.messenger.connectionChanged(this, true, false);
Emulator.getGameEnvironment().getRoomManager().loadRoomsForHabbo(this);
2020-05-04 22:24:09 +02:00
LOGGER.info("{} logged in from IP {}", this.habboInfo.getUsername(), this.habboInfo.getIpLogin());
2018-07-06 15:30:00 +02:00
}
2019-05-26 20:14:53 +02:00
public synchronized void disconnect() {
if (!Emulator.isShuttingDown) {
if (Emulator.getPluginManager().fireEvent(new UserDisconnectEvent(this)).isCancelled()) return;
2018-07-06 15:30:00 +02:00
}
2018-10-07 00:28:00 +02:00
if (this.disconnected || this.disconnecting)
2018-07-06 15:30:00 +02:00
return;
this.disconnecting = true;
2019-05-26 20:14:53 +02:00
try {
if (this.getHabboInfo().getCurrentRoom() != null) {
2018-07-06 15:30:00 +02:00
Emulator.getGameEnvironment().getRoomManager().leaveRoom(this, this.getHabboInfo().getCurrentRoom());
}
2019-05-26 20:14:53 +02:00
if (this.getHabboInfo().getRoomQueueId() > 0) {
2018-07-06 15:30:00 +02:00
Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getHabboInfo().getRoomQueueId());
2019-05-26 20:14:53 +02:00
if (room != null) {
2018-07-06 15:30:00 +02:00
room.removeFromQueue(this);
}
}
2019-05-26 20:14:53 +02:00
} catch (Exception e) {
2020-05-04 22:24:09 +02:00
LOGGER.error("Caught exception", e);
2018-07-06 15:30:00 +02:00
}
2019-05-26 20:14:53 +02:00
try {
2018-07-06 15:30:00 +02:00
Emulator.getGameEnvironment().getGuideManager().userLogsOut(this);
this.isOnline(false);
this.needsUpdate(true);
this.run();
this.getInventory().dispose();
this.messenger.connectionChanged(this, false, false);
this.messenger.dispose();
this.disconnected = true;
AchievementManager.saveAchievements(this);
this.habboStats.dispose();
2019-05-26 20:14:53 +02:00
} catch (Exception e) {
2020-05-04 22:24:09 +02:00
LOGGER.error("Caught exception", e);
2018-07-06 15:30:00 +02:00
return;
2019-05-26 20:14:53 +02:00
} finally {
2018-07-06 15:30:00 +02:00
Emulator.getGameEnvironment().getRoomManager().unloadRoomsForHabbo(this);
Emulator.getGameEnvironment().getHabboManager().removeHabbo(this);
}
2020-05-04 22:24:09 +02:00
LOGGER.info("{} disconnected.", this.habboInfo.getUsername());
2018-07-06 15:30:00 +02:00
this.client = null;
}
2018-10-07 00:28:00 +02:00
2018-07-06 15:30:00 +02:00
@Override
2019-05-26 20:14:53 +02:00
public void run() {
if (this.needsUpdate()) {
2018-07-06 15:30:00 +02:00
this.habboInfo.run();
this.needsUpdate(false);
}
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public boolean hasPermission(String key) {
2019-03-18 02:22:00 +01:00
return this.hasPermission(key, false);
2018-07-06 15:30:00 +02:00
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public boolean hasPermission(String key, boolean hasRoomRights) {
2018-07-06 15:30:00 +02:00
return Emulator.getGameEnvironment().getPermissionsManager().hasPermission(this, key, hasRoomRights);
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void giveCredits(int credits) {
2018-07-06 15:30:00 +02:00
if (credits == 0)
return;
UserCreditsEvent event = new UserCreditsEvent(this, credits);
if (Emulator.getPluginManager().fireEvent(event).isCancelled())
return;
this.getHabboInfo().addCredits(event.credits);
2019-08-05 18:35:26 +02:00
if (this.client != null) this.client.sendResponse(new UserCreditsComposer(this.client.getHabbo()));
2018-07-06 15:30:00 +02:00
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void givePixels(int pixels) {
2018-07-06 15:30:00 +02:00
if (pixels == 0)
return;
UserPointsEvent event = new UserPointsEvent(this, pixels, 0);
if (Emulator.getPluginManager().fireEvent(event).isCancelled())
return;
this.getHabboInfo().addPixels(event.points);
2019-08-05 18:35:26 +02:00
if (this.client != null) this.client.sendResponse(new UserCurrencyComposer(this.client.getHabbo()));
2018-07-06 15:30:00 +02:00
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void givePoints(int points) {
2018-07-06 15:30:00 +02:00
this.givePoints(Emulator.getConfig().getInt("seasonal.primary.type"), points);
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void givePoints(int type, int points) {
2018-07-06 15:30:00 +02:00
if (points == 0)
return;
UserPointsEvent event = new UserPointsEvent(this, points, type);
if (Emulator.getPluginManager().fireEvent(event).isCancelled())
return;
this.getHabboInfo().addCurrencyAmount(event.type, event.points);
2019-08-05 18:35:26 +02:00
if (this.client != null) this.client.sendResponse(new UserPointsComposer(this.client.getHabbo().getHabboInfo().getCurrencyAmount(type), event.points, event.type));
2018-07-06 15:30:00 +02:00
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void whisper(String message) {
2018-07-06 15:30:00 +02:00
this.whisper(message, this.habboStats.chatColor);
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void whisper(String message, RoomChatMessageBubbles bubble) {
if (this.getRoomUnit().isInRoom()) {
2019-03-18 02:22:00 +01:00
this.client.sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(message, this.client.getHabbo().getRoomUnit(), bubble)));
2018-07-06 15:30:00 +02:00
}
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void talk(String message) {
2018-07-06 15:30:00 +02:00
this.talk(message, this.habboStats.chatColor);
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void talk(String message, RoomChatMessageBubbles bubble) {
if (this.getRoomUnit().isInRoom()) {
2019-03-18 02:22:00 +01:00
this.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserTalkComposer(new RoomChatMessage(message, this.client.getHabbo().getRoomUnit(), bubble)).compose());
2018-07-06 15:30:00 +02:00
}
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void shout(String message) {
2018-07-06 15:30:00 +02:00
this.shout(message, this.habboStats.chatColor);
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void shout(String message, RoomChatMessageBubbles bubble) {
if (this.getRoomUnit().isInRoom()) {
2019-03-18 02:22:00 +01:00
this.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserShoutComposer(new RoomChatMessage(message, this.client.getHabbo().getRoomUnit(), bubble)).compose());
2018-07-06 15:30:00 +02:00
}
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void alert(String message) {
if (Emulator.getConfig().getBoolean("hotel.alert.oldstyle")) {
2019-03-18 02:22:00 +01:00
this.client.sendResponse(new MessagesForYouComposer(new String[]{message}));
2019-05-26 20:14:53 +02:00
} else {
2019-03-18 02:22:00 +01:00
this.client.sendResponse(new GenericAlertComposer(message));
}
2018-07-06 15:30:00 +02:00
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void alert(String[] messages) {
2018-07-06 15:30:00 +02:00
this.client.sendResponse(new MessagesForYouComposer(messages));
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void alertWithUrl(String message, String url) {
2018-07-06 15:30:00 +02:00
this.client.sendResponse(new StaffAlertWithLinkComposer(message, url));
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void goToRoom(int id) {
2018-07-06 15:30:00 +02:00
this.client.sendResponse(new ForwardToRoomComposer(id));
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void addFurniture(HabboItem item) {
2018-07-06 15:30:00 +02:00
this.habboInventory.getItemsComponent().addItem(item);
this.client.sendResponse(new AddHabboItemComposer(item));
this.client.sendResponse(new InventoryRefreshComposer());
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void addFurniture(THashSet<HabboItem> items) {
2018-07-06 15:30:00 +02:00
this.habboInventory.getItemsComponent().addItems(items);
this.client.sendResponse(new AddHabboItemComposer(items));
this.client.sendResponse(new InventoryRefreshComposer());
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void removeFurniture(HabboItem item) {
2018-07-06 15:30:00 +02:00
this.habboInventory.getItemsComponent().removeHabboItem(item);
this.client.sendResponse(new RemoveHabboItemComposer(item.getId()));
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void addBot(Bot bot) {
2018-07-06 15:30:00 +02:00
this.habboInventory.getBotsComponent().addBot(bot);
this.client.sendResponse(new AddBotComposer(bot));
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void removeBot(Bot bot) {
2018-07-06 15:30:00 +02:00
this.habboInventory.getBotsComponent().removeBot(bot);
this.client.sendResponse(new RemoveBotComposer(bot));
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void deleteBot(Bot bot) {
2018-07-06 15:30:00 +02:00
this.removeBot(bot);
bot.getRoom().removeBot(bot);
Emulator.getGameEnvironment().getBotManager().deleteBot(bot);
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void addPet(Pet pet) {
2018-07-06 15:30:00 +02:00
this.habboInventory.getPetsComponent().addPet(pet);
this.client.sendResponse(new AddPetComposer(pet));
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void removePet(Pet pet) {
2018-07-06 15:30:00 +02:00
this.habboInventory.getPetsComponent().removePet(pet);
this.client.sendResponse(new RemovePetComposer(pet));
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public boolean addBadge(String code) {
if (this.habboInventory.getBadgesComponent().getBadge(code) == null) {
2018-07-06 15:30:00 +02:00
HabboBadge badge = BadgesComponent.createBadge(code, this);
this.habboInventory.getBadgesComponent().addBadge(badge);
this.client.sendResponse(new AddUserBadgeComposer(badge));
this.client.sendResponse(new AddHabboItemComposer(badge.getId(), AddHabboItemComposer.AddHabboItemCategory.BADGE));
2019-04-22 01:42:00 +02:00
THashMap<String, String> keys = new THashMap<>();
keys.put("display", "BUBBLE");
keys.put("image", "${image.library.url}album1584/" + badge.getCode() + ".gif");
keys.put("message", Emulator.getTexts().getValue("commands.generic.cmd_badge.received"));
this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.RECEIVED_BADGE.key, keys));
2018-07-06 15:30:00 +02:00
return true;
}
return false;
}
2018-07-08 23:32:00 +02:00
2019-05-26 20:14:53 +02:00
public void deleteBadge(HabboBadge badge) {
if (badge != null) {
2019-04-22 01:42:00 +02:00
this.habboInventory.getBadgesComponent().removeBadge(badge);
BadgesComponent.deleteBadge(this.getHabboInfo().getId(), badge.getCode());
this.client.sendResponse(new InventoryBadgesComposer(this));
}
2018-07-06 15:30:00 +02:00
}
public void mute(int seconds, boolean isFlood) {
2020-06-03 02:30:32 +02:00
if (seconds <= 0) {
LOGGER.warn("Tried to mute user for {} seconds, which is invalid.", seconds);
return;
}
2019-05-26 20:14:53 +02:00
if (!this.hasPermission("acc_no_mute")) {
2018-07-06 15:30:00 +02:00
int remaining = this.habboStats.addMuteTime(seconds);
this.client.sendResponse(new FloodCounterComposer(remaining));
this.client.sendResponse(new MutedWhisperComposer(remaining));
Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom();
if (room != null && !isFlood) {
2018-07-06 15:30:00 +02:00
room.sendComposer(new RoomUserIgnoredComposer(this, RoomUserIgnoredComposer.MUTED).compose());
}
}
}
2019-05-26 20:14:53 +02:00
public void unMute() {
2018-07-06 15:30:00 +02:00
this.habboStats.unMute();
this.client.sendResponse(new FloodCounterComposer(3));
Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom();
2019-05-26 20:14:53 +02:00
if (room != null) {
2018-07-06 15:30:00 +02:00
room.sendComposer(new RoomUserIgnoredComposer(this, RoomUserIgnoredComposer.UNIGNORED).compose());
}
}
2018-09-28 21:25:00 +02:00
2019-05-26 20:14:53 +02:00
public int noobStatus() {
2018-09-28 21:25:00 +02:00
2019-05-26 20:14:53 +02:00
return 1;
2018-09-28 21:25:00 +02:00
}
2018-10-07 00:28:00 +02:00
2019-05-26 20:14:53 +02:00
public void clearCaches() {
2018-10-07 00:28:00 +02:00
int timestamp = Emulator.getIntUnixTimestamp();
THashMap<Integer, List<Integer>> newLog = new THashMap<>();
2019-05-26 20:14:53 +02:00
for (Map.Entry<Integer, List<Integer>> ltdLog : this.habboStats.ltdPurchaseLog.entrySet()) {
for (Integer time : ltdLog.getValue()) {
if (time > timestamp) {
if (!newLog.containsKey(ltdLog.getKey())) {
2019-03-18 02:22:00 +01:00
newLog.put(ltdLog.getKey(), new ArrayList<>());
2018-10-07 00:28:00 +02:00
}
newLog.get(ltdLog.getKey()).add(time);
}
}
}
this.habboStats.ltdPurchaseLog = newLog;
}
2019-05-26 20:14:53 +02:00
public void respect(Habbo target) {
if (target != null && target != this.client.getHabbo())
2018-10-07 00:28:00 +02:00
{
target.getHabboStats().respectPointsReceived++;
this.client.getHabbo().getHabboStats().respectPointsGiven++;
this.client.getHabbo().getHabboStats().respectPointsToGive--;
this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserRespectComposer(target).compose());
this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserActionComposer(this.client.getHabbo().getRoomUnit(), RoomUserAction.THUMB_UP).compose());
AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("RespectGiven"));
AchievementManager.progressAchievement(target, Emulator.getGameEnvironment().getAchievementManager().getAchievement("RespectEarned"));
this.client.getHabbo().getHabboInfo().getCurrentRoom().unIdle(this.client.getHabbo());
}
}
public Set<Integer> getForbiddenClothing() {
TIntCollection clothingIDs = this.getInventory().getWardrobeComponent().getClothing();
return Emulator.getGameEnvironment().getCatalogManager().clothing.values().stream()
.filter(c -> !clothingIDs.contains(c.id))
.map(c -> c.setId)
.flatMap(c -> Arrays.stream(c).boxed())
.collect(Collectors.toSet());
}
2019-04-29 06:18:19 +02:00
}