View Full Version : [C#] Errore strano
Salve,
ho un problema nel server che stò facendo in c#.
in poche parole da un errore del genere:
11/25/2010 11:44:13 PM
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()
at Uber.HabboHotel.Rooms.RoomManager.ProcessEngine()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
il problema penso sia su tcpconnection.cs
using System;
using System.Threading;
using System.Net.Sockets;
using Uber.Core;
using Uber.Util;
using Uber.Messages;
namespace Uber.Net
{
class TcpConnection
{
private readonly int RCV_BUFFER_SIZE = 0x200;
public readonly uint Id;
public readonly DateTime Created;
private Socket Socket;
private byte[] Buffer;
private AsyncCallback DataReceivedCallback;
private RouteReceivedDataCallback RouteDataCallback;
public delegate void RouteReceivedDataCallback(ref byte[] Data);
public int AgeInSeconds
{
get
{
int s = (int)(DateTime.Now - Created).TotalSeconds;
if (s < 0)
{
s = 0;
}
return s;
}
}
public string IPAddress
{
get
{
if (Socket == null)
{
return "";
}
return Socket.RemoteEndPoint.ToString().Split(':')[0];
}
}
public Boolean IsAlive
{
get { return (Socket != null); }
}
public TcpConnection(uint Id, Socket Sock)
{
this.Id = Id;
this.Socket = Sock;
this.Created = DateTime.Now;
}
public void Start(RouteReceivedDataCallback DataRouter)
{
this.Buffer = new byte[RCV_BUFFER_SIZE];
this.DataReceivedCallback = new AsyncCallback(DataReceived);
this.RouteDataCallback = DataRouter;
WaitForData();
}
public Boolean TestConnection()
{
try
{
return this.Socket.Send(new byte[] { 1 }) > 0;
}
catch { }
return false;
}
private void ConnectionDead()
{
UberEnvironment.GetGame().GetClientManager().StopClient(Id);
}
public void SendData(byte[] Data)
{
if (!this.IsAlive)
{
return;
}
try
{
this.Socket.Send(Data);
}
catch (SocketException)
{
ConnectionDead();
}
catch (ObjectDisposedException)
{
ConnectionDead();
}
catch (Exception e)
{
UberEnvironment.GetLogging().WriteLine("Errore Critico: " + e.Message, LogLevel.Error);
}
}
public void SendData(string Data)
{
SendData(UberEnvironment.GetDefaultEncoding().GetBytes(Data));
}
public Socket GetSocket()
{
return this.Socket;
}
public void SendMessage(ServerMessage Message)
{
if (Message == null)
{
return;
}
//UberEnvironment.GetLogging().WriteLine("[" + Id + "] <-- " + Message.ToString(), LogLevel.Debug);
SendData(Message.GetBytes());
}
private void WaitForData()
{
if (this.IsAlive)
{
try
{
Socket.BeginReceive(this.Buffer, 0, RCV_BUFFER_SIZE, SocketFlags.None, DataReceivedCallback, null);
}
catch (SocketException)
{
ConnectionDead();
}
catch (ObjectDisposedException)
{
ConnectionDead();
}
catch (Exception e)
{
UberEnvironment.GetLogging().WriteLine("Errore Critico: " + e.Message, LogLevel.Error);
ConnectionDead();
}
}
}
private void DataReceived(IAsyncResult iAr)
{
if (!this.IsAlive)
{
return;
}
int rcvBytesCount = 0;
try
{
rcvBytesCount = Socket.EndReceive(iAr);
}
catch (ObjectDisposedException)
{
ConnectionDead();
return;
}
catch (Exception e)
{
UberEnvironment.GetLogging().WriteLine(" Errore Critico: " + e.Message, LogLevel.Error);
ConnectionDead();
return;
}
if (rcvBytesCount < 1)
{
ConnectionDead();
return;
}
if (rcvBytesCount > 0)
{
byte[] toProcess = ByteUtil.ChompBytes(Buffer, 0, rcvBytesCount);
RouteData(ref toProcess);
}
WaitForData();
}
private void RouteData(ref Byte[] Data)
{
if (this.RouteDataCallback != null)
{
this.RouteDataCallback.Invoke(ref Data);
}
}
}
}
non capisco dove sta l'errore, chi mi può dare una mano? :mc:
downloader
26-11-2010, 13:23
in genere questo accade quando fai ad esempio un
foreach(var pippo in lista_generica)
{
lista_generica.RemoveAt(2);
}
ti fa partire questa eccezione, perché tu usi un puntamento a cui riferirti e nel frattempo cambi l'oggetto di riferimento.
La tua iterazione, fallisce su un dictionary^2 (due tipi che hai dichiarato da qualche parte)
Ora io penso che tu non protegga questo dictionary tra i vari thread che fai partire. Ma dal tuo codice non riesco a capire più di tanto
downloader
26-11-2010, 13:26
Credo che il problemi nasca dal quel RoomManager...
immagino dal codice tu stia proprio facendo una chat. Con tanto di stanze :D
questo RoomManager denuncia molte eccezioni nel suo codice, stando a google
bhè ecco anche il codice del roommanager.cs
è un pò un casino lo ammetto:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Threading;
using Uber.stanza.Items;
using Uber.stanza.GameClients;
using Uber.Storage;
namespace Uber.stanza.Rooms
{
class RoomManager
{
public readonly int MAX_PETS_PER_ROOM = 100;
private Dictionary<uint, Room> Rooms;
private Dictionary<string, RoomModel> Models;
private List<TeleUserData> TeleActions;
private Thread EngineThread;
private List<uint> RoomsToUnload;
public int LoadedRoomsCount
{
get
{
return this.Rooms.Count;
}
}
public RoomManager()
{
this.Rooms = new Dictionary<uint, Room>();
this.Models = new Dictionary<string, RoomModel>();
this.TeleActions = new List<TeleUserData>();
this.EngineThread = new Thread(ProcessEngine);
this.EngineThread.Name = "Room Engine";
this.EngineThread.Priority = ThreadPriority.AboveNormal;
this.EngineThread.Start();
this.RoomsToUnload = new List<uint>();
}
public void AddTeleAction(TeleUserData Act)
{
{
this.TeleActions.Add(Act);
}
}
public List<Room> GetEventRoomsForCategory(int Category)
{
List<Room> EventRooms = new List<Room>();
{
Dictionary<uint, Room>.Enumerator eRooms = this.Rooms.GetEnumerator();
while (eRooms.MoveNext())
{
Room Room = eRooms.Current.Value;
if (Room.Event == null)
{
continue;
}
if (Category > 0 && Room.Event.Category != Category)
{
continue;
}
EventRooms.Add(Room);
}
}
return EventRooms;
}
public void ProcessEngine()
{
Thread.Sleep(5000);
while (true)
{
DateTime ExecutionStart = DateTime.Now;
try
{
{
Dictionary<uint, Room>.Enumerator eRooms = this.Rooms.GetEnumerator();
while (eRooms.MoveNext())
{
Room Room = eRooms.Current.Value;
if (!Room.KeepAlive)
{
continue;
}
Room.ProcessRoom();
}
}
{
foreach (uint RoomId in this.RoomsToUnload)
{
UnloadRoom(RoomId);
}
this.RoomsToUnload.Clear();
}
{
List<TeleUserData>.Enumerator eTeleActions = this.TeleActions.GetEnumerator();
while (eTeleActions.MoveNext())
{
eTeleActions.Current.Execute();
}
this.TeleActions.Clear();
}
}
catch (InvalidOperationException)
{
UberEnvironment.GetLogging().WriteLine("InvalidOpException in Room Manager..", Core.LogLevel.Error);
}
finally
{
DateTime ExecutionComplete = DateTime.Now;
TimeSpan Diff = ExecutionComplete - ExecutionStart;
double sleepTime = 500 - Diff.TotalMilliseconds;
if (sleepTime < 0)
{
sleepTime = 0;
}
if (sleepTime > 500)
{
sleepTime = 500;
}
Thread.Sleep((int)Math.Floor(sleepTime));
}
}
}
public void LoadModels()
{
DataTable Data = null;
Models.Clear();
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
Data = dbClient.ReadDataTable("SELECT id,door_x,door_y,door_z,door_dir,heightmap,public_items,club_only FROM room_models");
}
if (Data == null)
{
return;
}
foreach (DataRow Row in Data.Rows)
{
Models.Add((string)Row["id"], new RoomModel((string)Row["id"], (int)Row["door_x"],
(int)Row["door_y"], (Double)Row["door_z"], (int)Row["door_dir"], (string)Row["heightmap"],
(string)Row["public_items"], UberEnvironment.EnumToBool(Row["club_only"].ToString())));
}
}
public RoomModel GetModel(string Model)
{
if (Models.ContainsKey(Model))
{
return Models[Model];
}
return null;
}
public RoomData GenerateNullableRoomData(uint RoomId)
{
if (GenerateRoomData(RoomId) != null)
{
return GenerateRoomData(RoomId);
}
RoomData Data = new RoomData();
Data.FillNull(RoomId);
return Data;
}
public RoomData GenerateRoomData(uint RoomId)
{
RoomData Data = new RoomData();
if (IsRoomLoaded(RoomId))
{
Data.Fill(GetRoom(RoomId));
}
else
{
DataRow Row = null;
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
Row = dbClient.ReadDataRow("SELECT * FROM rooms WHERE id = '" + RoomId + "' LIMIT 1");
}
if (Row == null)
{
return null;
}
Data.Fill(Row);
}
return Data;
}
public Boolean IsRoomLoaded(uint RoomId)
{
if (GetRoom(RoomId) != null)
{
return true;
}
return false;
}
public void LoadRoom(uint Id)
{
if (IsRoomLoaded(Id))
{
return;
}
RoomData Data = GenerateRoomData(Id);
if (Data == null)
{
return;
}
Room Room = new Room(Data.Id, Data.Name, Data.Description, Data.Type, Data.Owner, Data.Category, Data.State,
Data.UsersMax, Data.ModelName, Data.CCTs, Data.Score, Data.Tags, Data.AllowPets, Data.AllowPetsEating,
Data.AllowWalkthrough, Data.Hidewall, Data.Icon, Data.Password, Data.Wallpaper, Data.Floor, Data.Landscape);
{
Rooms.Add(Room.RoomId, Room);
}
Room.InitBots();
Room.InitPets();
UberEnvironment.GetLogging().WriteLine("[RoomMgr] Loaded room: \"" + Room.Name + "\" (ID: " + Id + ")", Uber.Core.LogLevel.Information);
}
public void RequestRoomUnload(uint Id)
{
if (!IsRoomLoaded(Id))
{
return;
}
{
GetRoom(Id).KeepAlive = false;
RoomsToUnload.Add(Id);
}
}
public void UnloadRoom(uint Id)
{
Room Room = GetRoom(Id);
if (Room == null)
{
return;
}
{
Room.Destroy();
Rooms.Remove(Id);
}
UberEnvironment.GetLogging().WriteLine("[RoomMgr] Unloaded room: \"" + Room.Name + "\" (ID: " + Id + ")", Uber.Core.LogLevel.Information);
}
public Room GetRoom(uint RoomId)
{
{
Dictionary<uint, Room>.Enumerator eRooms = this.Rooms.GetEnumerator();
while (eRooms.MoveNext())
{
Room Room = eRooms.Current.Value;
if (Room.RoomId == RoomId)
{
return Room;
}
}
}
return null;
}
public RoomData CreateRoom(GameClient Session, string Name, string Model)
{
Name = UberEnvironment.FilterInjectionChars(Name);
if (!Models.ContainsKey(Model))
{
Session.SendNotif("Sorry, this room model has not been added yet. Try again later.");
return null;
}
if (Models[Model].ClubOnly && !Session.GetHabbo().HasFuse("fuse_use_special_room_layouts"))
{
Session.SendNotif("You must be an Club member to use that room layout.");
return null;
}
if (Name.Length < 3)
{
Session.SendNotif("Room name is too short for room creation!");
return null;
}
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.AddParamWithValue("caption", Name);
dbClient.AddParamWithValue("model", Model);
dbClient.AddParamWithValue("username", Session.GetHabbo().Username);
dbClient.ExecuteQuery("INSERT INTO rooms (roomtype,caption,owner,model_name) VALUES ('private',@caption,@username,@model)");
}
uint RoomId = 0;
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.AddParamWithValue("caption", Name);
dbClient.AddParamWithValue("username", Session.GetHabbo().Username);
RoomId = (uint)dbClient.ReadDataRow("SELECT id FROM rooms WHERE owner = @username AND caption = @caption ORDER BY id DESC")[0];
}
return GenerateRoomData(RoomId);
}
}
class TeleUserData
{
private RoomUser User;
private uint RoomId;
private uint TeleId;
public TeleUserData(RoomUser User, uint RoomId, uint TeleId)
{
this.User = User;
this.RoomId = RoomId;
this.TeleId = TeleId;
}
public void Execute()
{
if (User == null || User.IsBot)
{
return;
}
User.GetClient().GetHabbo().IsTeleporting = true;
User.GetClient().GetHabbo().TeleporterId = TeleId;
User.GetClient().GetMessageHandler().PrepareRoomForUser(RoomId, "");
}
}
}
questo è il codice del roommanager dove dovrebbe esserci l'errore.
cosa ho sbagliato a me sembra tutto giusto :confused:
downloader
26-11-2010, 14:46
schiatta qui
while (eRooms.MoveNext())
{
Room Room = eRooms.Current.Value;
if (!Room.KeepAlive)
{
continue;
}
Room.ProcessRoom();
}
se una di queste "eRoom" viene cancellata si incasina quel ciclo.
Non so che fa quel ProcessRoom...
while (eRooms.MoveNext())
{
Room Room = eRooms.Current.Value;
if (!Room.KeepAlive)
{
continue;
}
così non genera nessun errore al debug mentre con
while (eRooms.MoveNext())
{
Room Room = eRooms.Current.Value;
if (!Room.KeepAlive)
{
continue;
}
Room.ProcessRoom();
}
da 18 errori tra cui una decina su:
è previsto un identificatore
downloader
26-11-2010, 15:15
in tanto non chiamare quella variabile Room
"Room Room" non si può guardà :D
Errore Critico: An existing connection was forcibly closed by the remote host
ecco l'errore del server quando è avviato e ci sono utenti dentro.
ed ecco l'altro:
11/26/2010 10:21:14 AM
System.ArgumentException: An item with the same key has already been added.
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at Uber.HabboHotel.Rooms.Room.UpdateUserStatus(RoomUser User)
at Uber.HabboHotel.Rooms.Room.ProcessRoom()
at Uber.HabboHotel.Rooms.RoomManager.ProcessEngine()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
ancora non si risolve ma non so alla fine non ho messo:
Room.ProcessRoom();
perchè mi dava 18 errori :(
downloader
26-11-2010, 15:50
e qui metti una chiave duplicata sul dictionary nel quale il primo tipo di dato deve essere appunto una chiave univoca.
Carissimo non posso aiutarti via msn, perché sto a lavoro e sto più che incasinato. Posso darti delle dritte quando mi prendo una pausa per leggere.
11/26/2010 1:27:17 PM
System.ArgumentException: An item with the same key has already been added.
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at Uber.HabboHotel.Rooms.Room.UpdateUserStatus(RoomUser User) in C:\Users\kulosia\Desktop\azz\HabboHotel\Rooms\Room.cs:line 1841
at Uber.HabboHotel.Rooms.Room.ProcessRoom() in C:\Users\kulosia\Desktop\azz\HabboHotel\Rooms\Room.cs:line 825
at Uber.HabboHotel.Rooms.RoomManager.ProcessEngine() in C:\Users\kulosia\Desktop\azz\HabboHotel\Rooms\RoomManager.cs:line 108
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Uber.HabboHotel.Pets;
using Uber.HabboHotel.Navigators;
using Uber.HabboHotel.Items;
using Uber.HabboHotel.GameClients;
using Uber.HabboHotel.Users.Badges;
using Uber.HabboHotel.Misc;
using Uber.HabboHotel.Pathfinding;
using Uber.HabboHotel.Advertisements;
using Uber.HabboHotel.Users.Messenger;
using Uber.HabboHotel.Rooms;
using Uber.HabboHotel.Catalogs;
using Uber.Storage;
namespace Uber.Messages
{
partial class GameClientMessageHandler
{
private void GetAdvertisement()
{
RoomAdvertisement Ad = UberEnvironment.GetGame().GetAdvertisementManager().GetRandomRoomAdvertisement();
GetResponse().Init(258);
if (Ad == null)
{
GetResponse().AppendStringWithBreak("");
GetResponse().AppendStringWithBreak("");
}
else
{
GetResponse().AppendStringWithBreak(Ad.AdImage);
GetResponse().AppendStringWithBreak(Ad.AdLink);
Ad.OnView();
}
SendResponse();
}
private void GetPub()
{
uint Id = Request.PopWiredUInt();
RoomData Data = UberEnvironment.GetGame().GetRoomManager().GenerateRoomData(Id);
if (Data == null || Data.Type != "public")
{
return;
}
GetResponse().Init(453);
GetResponse().AppendUInt(Data.Id);
GetResponse().AppendStringWithBreak(Data.CCTs);
GetResponse().AppendUInt(Data.Id);
SendResponse();
}
private void OpenFlat()
{
uint Id = Request.PopWiredUInt();
string Password = Request.PopFixedString();
int Junk = Request.PopWiredInt32();
RoomData Data = UberEnvironment.GetGame().GetRoomManager().GenerateRoomData(Id);
if (Data == null || Data.Type != "private")
{
return;
}
PrepareRoomForUser(Id, Password);
}
private void OpenPub()
{
int Junk = Request.PopWiredInt32();
uint Id = Request.PopWiredUInt();
int Junk2 = Request.PopWiredInt32();
RoomData Data = UberEnvironment.GetGame().GetRoomManager().GenerateRoomData(Id);
if (Data == null || Data.Type != "public")
{
return;
}
PrepareRoomForUser(Data.Id, "");
}
private void GetGroupBadges()
{
GetResponse().Init(309);
GetResponse().AppendStringWithBreak("IcIrDs43103s19014d5a1dc291574a508bc80a64663e61a00");
SendResponse();
}
private void GetInventory()
{
Session.SendMessage(Session.GetHabbo().GetInventoryComponent().SerializeItemInventory());
}
private void GetRoomData1()
{
if (Session.GetHabbo().LoadingRoom <= 0)
{
return;
}
GetResponse().Init(297);
GetResponse().AppendInt32(0);
SendResponse();
}
private void GetRoomData2()
{
if (Session.GetHabbo().LoadingRoom <= 0)
{
return;
}
RoomData Data = UberEnvironment.GetGame().GetRoomManager().GenerateRoomData(Session.GetHabbo().LoadingRoom);
if (Data == null)
{
return;
}
if (Data.Model == null)
{
Session.SendNotif("Sorry, model data is missing from this room and therefore cannot be loaded.");
Session.SendMessage(new ServerMessage(18));
ClearRoomLoading();
return;
}
Session.SendMessage(Data.Model.SerializeHeightmap());
Session.SendMessage(Data.Model.SerializeRelativeHeightmap());
}
private void GetRoomData3()
{
if (Session.GetHabbo().LoadingRoom <= 0 || !Session.GetHabbo().LoadingChecksPassed)
{
return;
}
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().LoadingRoom);
if (Room == null)
{
return;
}
ClearRoomLoading();
GetResponse().Init(30);
if (Room.Model.StaticFurniMap != "")
{
GetResponse().AppendStringWithBreak(Room.Model.StaticFurniMap);
}
else
{
GetResponse().AppendInt32(0);
}
SendResponse();
if (Room.Type == "private")
{
List<RoomItem> FloorItems = Room.FloorItems;
List<RoomItem> WallItems = Room.WallItems;
GetResponse().Init(32);
GetResponse().AppendInt32(FloorItems.Count);
foreach (RoomItem Item in FloorItems)
{
Item.Serialize(GetResponse());
}
SendResponse();
GetResponse().Init(45);
GetResponse().AppendInt32(WallItems.Count);
foreach (RoomItem Item in WallItems)
{
Item.Serialize(GetResponse());
}
SendResponse();
}
Room.AddUserToRoom(Session, Session.GetHabbo().SpectatorMode);
List<RoomUser> UsersToDisplay = new List<RoomUser>();
{
foreach (RoomUser User in Room.UserList)
{
if (User.IsSpectator)
{
continue;
}
UsersToDisplay.Add(User);
}
}
GetResponse().Init(28);
GetResponse().AppendInt32(UsersToDisplay.Count);
foreach (RoomUser User in UsersToDisplay)
{
User.Serialize(GetResponse());
}
SendResponse();
//GXI
GetResponse().Init(472);
GetResponse().AppendBoolean(Room.Hidewall);
SendResponse();
if (Room.Type == "public")
{
GetResponse().Init(471);
GetResponse().AppendBoolean(false);
GetResponse().AppendStringWithBreak(Room.ModelName);
GetResponse().AppendBoolean(false);
SendResponse();
}
else if (Room.Type == "private")
{
GetResponse().Init(471);
GetResponse().AppendBoolean(true);
GetResponse().AppendUInt(Room.RoomId);
if (Room.CheckRights(Session, true))
{
GetResponse().AppendBoolean(true);
}
else
{
GetResponse().AppendBoolean(false);
}
SendResponse();
// GQhntX]uberEmu PacketloggingDescriptionHQMSCQFJtag1tag2Ika^SMqurbIHH
GetResponse().Init(454);
GetResponse().AppendInt32(1);
GetResponse().AppendUInt(Room.RoomId);
GetResponse().AppendInt32(0);
GetResponse().AppendStringWithBreak(Room.Name);
GetResponse().AppendStringWithBreak(Room.Owner);
GetResponse().AppendInt32(Room.State);
GetResponse().AppendInt32(0);
GetResponse().AppendInt32(25);
GetResponse().AppendStringWithBreak(Room.Description);
GetResponse().AppendInt32(0);
GetResponse().AppendInt32(1);
GetResponse().AppendInt32(8228);
GetResponse().AppendInt32(Room.Category);
GetResponse().AppendStringWithBreak("");
GetResponse().AppendInt32(Room.TagCount);
foreach (string Tag in Room.Tags)
{
GetResponse().AppendStringWithBreak(Tag);
}
Room.Icon.Serialize(GetResponse());
GetResponse().AppendBoolean(false);
SendResponse();
}
ServerMessage Updates = Room.SerializeStatusUpdates(true);
if (Updates != null)
{
Session.SendMessage(Updates);
}
{
foreach (RoomUser User in Room.UserList)
{
if (User.IsSpectator)
{
continue;
}
if (User.IsDancing)
{
GetResponse().Init(480);
GetResponse().AppendInt32(User.VirtualId);
GetResponse().AppendInt32(User.DanceId);
SendResponse();
}
if (User.IsAsleep)
{
GetResponse().Init(486);
GetResponse().AppendInt32(User.VirtualId);
GetResponse().AppendBoolean(true);
SendResponse();
}
if (User.CarryItemID > 0 && User.CarryTimer > 0)
{
GetResponse().Init(482);
GetResponse().AppendInt32(User.VirtualId);
GetResponse().AppendInt32(User.CarryTimer);
SendResponse();
}
if (!User.IsBot)
{
if (User.GetClient().GetHabbo() != null && User.GetClient().GetHabbo().GetAvatarEffectsInventoryComponent() != null && User.GetClient().GetHabbo().GetAvatarEffectsInventoryComponent().CurrentEffect >= 1)
{
GetResponse().Init(485);
GetResponse().AppendInt32(User.VirtualId);
GetResponse().AppendInt32(User.GetClient().GetHabbo().GetAvatarEffectsInventoryComponent().CurrentEffect);
SendResponse();
}
}
}
}
}
public void PrepareRoomForUser(uint Id, string Password)
{
ClearRoomLoading();
if (UberEnvironment.GetGame().GetRoomManager().GenerateRoomData(Id) == null)
{
return;
}
if (Session.GetHabbo().InRoom)
{
Room OldRoom = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (OldRoom != null)
{
OldRoom.RemoveUserFromRoom(Session, false, false);
}
}
if (!UberEnvironment.GetGame().GetRoomManager().IsRoomLoaded(Id))
{
UberEnvironment.GetGame().GetRoomManager().LoadRoom(Id);
}
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Id);
if (Room == null)
{
return;
}
Session.GetHabbo().LoadingRoom = Id;
if (Room.UserIsBanned(Session.GetHabbo().Id))
{
if (Room.HasBanExpired(Session.GetHabbo().Id))
{
Room.RemoveBan(Session.GetHabbo().Id);
}
else
{
// C`PA
GetResponse().Init(224);
GetResponse().AppendInt32(4);
SendResponse();
GetResponse().Init(18);
SendResponse();
return;
}
}
if (Room.UsersNow >= Room.UsersMax)
{
if (!UberEnvironment.GetGame().GetRoleManager().RankHasRight(Session.GetHabbo().Rank, "fuse_enter_full_rooms"))
{
GetResponse().Init(224);
GetResponse().AppendInt32(1);
SendResponse();
GetResponse().Init(18);
SendResponse();
return;
}
}
if (Room.Type == "public")
{
if (Room.State > 0 && !Session.GetHabbo().HasFuse("fuse_mod"))
{
Session.SendNotif("This public room is accessible to staff only.");
GetResponse().Init(18);
SendResponse();
return;
}
GetResponse().Init(166);
GetResponse().AppendStringWithBreak("/client/public/" + Room.ModelName + "/" + Room.RoomId);
SendResponse();
}
else if (Room.Type == "private")
{
GetResponse().Init(19);
SendResponse();
if (!Session.GetHabbo().HasFuse("fuse_enter_any_room") && !Room.CheckRights(Session, true) && !Session.GetHabbo().IsTeleporting)
{
if (Room.State == 1)
{
if (Room.UserCount == 0)
{
GetResponse().Init(131);
SendResponse();
}
else
{
GetResponse().Init(91);
GetResponse().AppendStringWithBreak("");
SendResponse();
ServerMessage RingMessage = new ServerMessage(91);
RingMessage.AppendStringWithBreak(Session.GetHabbo().Username);
Room.SendMessageToUsersWithRights(RingMessage);
}
return;
}
else if (Room.State == 2)
{
if (Password.ToLower() != Room.Password.ToLower())
{
GetResponse().Init(33);
GetResponse().AppendInt32(-100002);
SendResponse();
GetResponse().Init(18);
SendResponse();
return;
}
}
}
GetResponse().Init(166);
GetResponse().AppendStringWithBreak("/client/private/" + Room.RoomId + "/id");
SendResponse();
}
Session.GetHabbo().LoadingChecksPassed = true;
LoadRoomForUser();
}
private void ReqLoadRoomForUser()
{
LoadRoomForUser();
}
public void LoadRoomForUser()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().LoadingRoom);
if (Room == null || !Session.GetHabbo().LoadingChecksPassed)
{
return;
}
// todo: Room.SerializeGroupBadges()
GetResponse().Init(309);
GetResponse().AppendStringWithBreak("IcIrDs43103s19014d5a1dc291574a508bc80a64663e61a00");
SendResponse();
GetResponse().Init(69);
GetResponse().AppendStringWithBreak(Room.ModelName);
GetResponse().AppendUInt(Room.RoomId);
SendResponse();
if (Session.GetHabbo().SpectatorMode)
{
GetResponse().Init(254);
SendResponse();
}
if (Room.Type == "private")
{
if (Room.Wallpaper != "0.0")
{
GetResponse().Init(46);
GetResponse().AppendStringWithBreak("wallpaper");
GetResponse().AppendStringWithBreak(Room.Wallpaper);
SendResponse();
}
if (Room.Floor != "0.0")
{
GetResponse().Init(46);
GetResponse().AppendStringWithBreak("floor");
GetResponse().AppendStringWithBreak(Room.Floor);
SendResponse();
}
GetResponse().Init(46);
GetResponse().AppendStringWithBreak("landscape");
GetResponse().AppendStringWithBreak(Room.Landscape);
SendResponse();
if (Room.CheckRights(Session, true))
{
GetResponse().Init(42);
SendResponse();
GetResponse().Init(47);
SendResponse();
}
else if (Room.CheckRights(Session))
{
GetResponse().Init(42);
SendResponse();
}
GetResponse().Init(345);
if (Session.GetHabbo().RatedRooms.Contains(Room.RoomId) || Room.CheckRights(Session, true))
{
GetResponse().AppendInt32(Room.Score);
}
else
{
GetResponse().AppendInt32(-1);
}
SendResponse();
if (Room.HasOngoingEvent)
{
Session.SendMessage(Room.Event.Serialize(Session));
}
else
{
GetResponse().Init(370);
GetResponse().AppendStringWithBreak("-1");
SendResponse();
}
}
}
public void ClearRoomLoading()
{
Session.GetHabbo().LoadingRoom = 0;
Session.GetHabbo().LoadingChecksPassed = false;
}
private void Talk()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
RoomUser User = Room.GetRoomUserByHabbo(Session.GetHabbo().Id);
if (User == null)
{
return;
}
User.Chat(Session, UberEnvironment.FilterInjectionChars(Request.PopFixedString()), false);
}
private void Shout()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
RoomUser User = Room.GetRoomUserByHabbo(Session.GetHabbo().Id);
if (User == null)
{
return;
}
User.Chat(Session, UberEnvironment.FilterInjectionChars(Request.PopFixedString()), true);
}
private void Whisper()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
if (Session.GetHabbo().Muted)
{
Session.SendNotif("You are muted.");
return;
}
string Params = UberEnvironment.FilterInjectionChars(Request.PopFixedString());
string ToUser = Params.Split(' ')[0];
string Message = Params.Substring(ToUser.Length + 1);
RoomUser User = Room.GetRoomUserByHabbo(Session.GetHabbo().Id);
RoomUser User2 = Room.GetRoomUserByHabbo(ToUser);
ServerMessage TellMsg = new ServerMessage();
TellMsg.Init(25);
TellMsg.AppendInt32(User.VirtualId);
TellMsg.AppendStringWithBreak(Message);
TellMsg.AppendBoolean(false);
if (User != null && !User.IsBot)
{
User.GetClient().SendMessage(TellMsg);
}
User.Unidle();
if (User2 != null && !User2.IsBot)
{
if (!User2.GetClient().GetHabbo().MutedUsers.Contains(Session.GetHabbo().Id))
{
User2.GetClient().SendMessage(TellMsg);
}
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
// dbClient.AddParamWithValue("message", "<Whisper to " + User2.GetClient().GetHabbo().Username + ">: " + Message);
// dbClient.ExecuteQuery("INSERT INTO chatlogs (user_id,room_id,hour,minute,timestamp,message,user_name,full_date) VALUES ('" + Session.GetHabbo().Id + "','" + Room.RoomId + "','" + DateTime.Now.Hour + "','" + DateTime.Now.Minute + "','" + UberEnvironment.GetUnixTimestamp() + "',@message,'" + Session.GetHabbo().Username + "','" + DateTime.Now.ToLongDateString() + "')");
}
}
}
private void Move()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
RoomUser User = Room.GetRoomUserByHabbo(Session.GetHabbo().Id);
if (User == null || !User.CanWalk)
{
return;
}
int MoveX = Request.PopWiredInt32();
int MoveY = Request.PopWiredInt32();
if (MoveX == User.X && MoveY == User.Y)
{
return;
}
User.MoveTo(MoveX, MoveY);
}
private void CanCreateRoom()
{
GetResponse().Init(512);
GetResponse().AppendBoolean(false); // true = show error with number below
GetResponse().AppendInt32(99999);
SendResponse();
// todo: room limit
}
private void CreateRoom()
{
string RoomName = UberEnvironment.FilterInjectionChars(Request.PopFixedString());
string ModelName = Request.PopFixedString();
string RoomState = Request.PopFixedString(); // unused, room open by default on creation. may be added in later build of Habbo?
RoomData NewRoom = UberEnvironment.GetGame().GetRoomManager().CreateRoom(Session, RoomName, ModelName);
if (NewRoom != null)
{
GetResponse().Init(59);
GetResponse().AppendUInt(NewRoom.Id);
GetResponse().AppendStringWithBreak(NewRoom.Name);
SendResponse();
}
}
private void GetRoomEditData()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true))
{
return;
}
GetResponse().Init(465);
GetResponse().AppendUInt(Room.RoomId);
GetResponse().AppendStringWithBreak(Room.Name);
GetResponse().AppendStringWithBreak(Room.Description);
GetResponse().AppendInt32(Room.State);
GetResponse().AppendInt32(Room.Category);
GetResponse().AppendInt32(Room.UsersMax);
GetResponse().AppendInt32(25);
GetResponse().AppendInt32(Room.TagCount);
foreach (string Tag in Room.Tags)
{
GetResponse().AppendStringWithBreak(Tag);
}
GetResponse().AppendInt32(Room.UsersWithRights.Count); // users /w rights count
foreach (uint UserId in Room.UsersWithRights)
{
GetResponse().AppendUInt(UserId);
GetResponse().AppendStringWithBreak(UberEnvironment.GetGame().GetClientManager().GetNameById(UserId));
}
GetResponse().AppendInt32(Room.UsersWithRights.Count); // users /w rights count
GetResponse().AppendBoolean(Room.AllowPets); // allows pets in room - pet system lacking, so always off
GetResponse().AppendBoolean(Room.AllowPetsEating); // allows pets to eat your food - pet system lacking, so always off
GetResponse().AppendBoolean(Room.AllowWalkthrough);
GetResponse().AppendBoolean(Room.Hidewall);
SendResponse();
}
private void SaveRoomIcon()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true))
{
return;
}
int Junk = Request.PopWiredInt32(); // always 3
Dictionary<int, int> Items = new Dictionary<int, int>();
int Background = Request.PopWiredInt32();
int TopLayer = Request.PopWiredInt32();
int AmountOfItems = Request.PopWiredInt32();
for (int i = 0; i < AmountOfItems; i++)
{
int Pos = Request.PopWiredInt32();
int Item = Request.PopWiredInt32();
if (Pos < 0 || Pos > 10)
{
return;
}
if (Item < 1 || Item > 27)
{
return;
}
if (Items.ContainsKey(Pos))
{
return;
}
Items.Add(Pos, Item);
}
if (Background < 1 || Background > 24)
{
return;
}
if (TopLayer < 0 || TopLayer > 11)
{
return;
}
StringBuilder FormattedItems = new StringBuilder();
int j = 0;
foreach (KeyValuePair<int, int> Item in Items)
{
if (j > 0)
{
FormattedItems.Append("|");
}
FormattedItems.Append(Item.Key + "," + Item.Value);
j++;
}
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.ExecuteQuery("UPDATE rooms SET icon_bg = '" + Background + "', icon_fg = '" + TopLayer + "', icon_items = '" + FormattedItems.ToString() + "' WHERE id = '" + Room.RoomId + "' LIMIT 1");
}
Room.Icon = new RoomIcon(Background, TopLayer, Items);
GetResponse().Init(457);
GetResponse().AppendUInt(Room.RoomId);
GetResponse().AppendBoolean(true);
SendResponse();
GetResponse().Init(456);
GetResponse().AppendUInt(Room.RoomId);
SendResponse();
RoomData Data = new RoomData();
Data.Fill(Room);
GetResponse().Init(454);
GetResponse().AppendBoolean(false);
Data.Serialize(GetResponse(), false);
SendResponse();
}
private void SaveRoomData()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true))
{
return;
}
int Id = Request.PopWiredInt32();
string Name = UberEnvironment.FilterInjectionChars(Request.PopFixedString());
string Description = UberEnvironment.FilterInjectionChars(Request.PopFixedString());
int State = Request.PopWiredInt32();
string Password = UberEnvironment.FilterInjectionChars(Request.PopFixedString());
int MaxUsers = Request.PopWiredInt32();
int CategoryId = Request.PopWiredInt32();
int TagCount = Request.PopWiredInt32();
List<string> Tags = new List<string>();
StringBuilder formattedTags = new StringBuilder();
for (int i = 0; i < TagCount; i++)
{
if (i > 0)
{
formattedTags.Append(",");
}
string tag = UberEnvironment.FilterInjectionChars(Request.PopFixedString().ToLower());
Tags.Add(tag);
formattedTags.Append(tag);
}
int AllowPets = 0;
int AllowPetsEat = 0;
int AllowWalkthrough = 0;
int Hidewall = 0;
string _AllowPets = Request.PlainReadBytes(1)[0].ToString();
Request.AdvancePointer(1);
string _AllowPetsEat = Request.PlainReadBytes(1)[0].ToString();
Request.AdvancePointer(1);
string _AllowWalkthrough = Request.PlainReadBytes(1)[0].ToString();
Request.AdvancePointer(1);
string _Hidewall = Request.PlainReadBytes(1)[0].ToString();
Request.AdvancePointer(1);
if (Name.Length < 1)
{
return;
}
if (State < 0 || State > 2)
{
return;
}
if (MaxUsers != 10 && MaxUsers != 15 && MaxUsers != 20 && MaxUsers != 25)
{
return;
}
FlatCat FlatCat = UberEnvironment.GetGame().GetNavigator().GetFlatCat(CategoryId);
if (FlatCat == null)
{
return;
}
if (FlatCat.MinRank > Session.GetHabbo().Rank)
{
Session.SendNotif("You are not allowed to use this category. Your room has been moved to no category instead.");
CategoryId = 0;
}
if (TagCount > 2)
{
return;
}
if (State < 0 || State > 2)
{
return;
}
if (_AllowPets == "65")
{
AllowPets = 1;
Room.AllowPets = true;
}
else
{
Room.AllowPets = false;
}
if (_AllowPetsEat == "65")
{
AllowPetsEat = 1;
Room.AllowPetsEating = true;
}
else
{
Room.AllowPetsEating = false;
}
if (_AllowWalkthrough == "65")
{
AllowWalkthrough = 1;
Room.AllowWalkthrough = true;
}
else
{
Room.AllowWalkthrough = false;
}
if (_Hidewall == "65")
{
Hidewall = 1;
Room.Hidewall = true;
}
else
{
Room.Hidewall = false;
}
Room.Name = Name;
Room.State = State;
Room.Description = Description;
Room.Category = CategoryId;
Room.Password = Password;
Room.Tags = Tags;
Room.UsersMax = MaxUsers;
string formattedState = "open";
if (Room.State == 1)
{
formattedState = "locked";
}
else if (Room.State > 1)
{
formattedState = "password";
}
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.AddParamWithValue("caption", Room.Name);
dbClient.AddParamWithValue("description", Room.Description);
dbClient.AddParamWithValue("password", Room.Password);
dbClient.AddParamWithValue("tags", formattedTags.ToString());
dbClient.ExecuteQuery("UPDATE rooms SET caption = @caption, description = @description, password = @password, category = '" + CategoryId + "', state = '" + formattedState + "', tags = @tags, users_max = '" + MaxUsers + "', allow_pets = '" + AllowPets + "', allow_pets_eat = '" + AllowPetsEat + "', allow_walkthrough = '" + AllowWalkthrough + "', allow_hidewall = '" + Hidewall + "' WHERE id = '" + Room.RoomId + "' LIMIT 1");
}
GetResponse().Init(467);
GetResponse().AppendUInt(Room.RoomId);
SendResponse();
GetResponse().Init(456);
GetResponse().AppendUInt(Room.RoomId);
SendResponse();
GetResponse().Init(472);
GetResponse().AppendBoolean(Room.Hidewall);
UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId).SendMessage(Response);
RoomData Data = new RoomData();
Data.Fill(Room);
GetResponse().Init(454);
GetResponse().AppendBoolean(false);
Data.Serialize(GetResponse(), false);
SendResponse();
}
private void GiveRights()
{
uint UserId = Request.PopWiredUInt();
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
RoomUser RoomUser = Room.GetRoomUserByHabbo(UserId);
if (Room == null || !Room.CheckRights(Session, true) || RoomUser == null || RoomUser.IsBot)
{
return;
}
if (Room.UsersWithRights.Contains(UserId))
{
// todo: fix silly bug
Session.SendNotif("User already has rights! (There appears to be a bug with the rights button, we are looking into it - for now rely on 'Advanced settings')");
return;
}
Room.UsersWithRights.Add(UserId);
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.ExecuteQuery("INSERT INTO room_rights (room_id,user_id) VALUES ('" + Room.RoomId + "','" + UserId + "')");
}
GetResponse().Init(510);
GetResponse().AppendUInt(Room.RoomId);
GetResponse().AppendUInt(UserId);
GetResponse().AppendStringWithBreak(RoomUser.GetClient().GetHabbo().Username);
SendResponse();
RoomUser.AddStatus("flatcrtl", "");
RoomUser.UpdateNeeded = true;
RoomUser.GetClient().SendMessage(new ServerMessage(42));
// G~hntX]h_u@UMeth0d9
}
private void TakeRights()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true))
{
return;
}
StringBuilder DeleteParams = new StringBuilder();
int Amount = Request.PopWiredInt32();
for (int i = 0; i < Amount; i++)
{
if (i > 0)
{
DeleteParams.Append(" OR ");
}
uint UserId = Request.PopWiredUInt();
Room.UsersWithRights.Remove(UserId);
DeleteParams.Append("room_id = '" + Room.RoomId + "' AND user_id = '" + UserId + "'");
RoomUser User = Room.GetRoomUserByHabbo(UserId);
if (User != null && !User.IsBot)
{
User.GetClient().SendMessage(new ServerMessage(43));
}
// GhntX]hqu@U
GetResponse().Init(511);
GetResponse().AppendUInt(Room.RoomId);
GetResponse().AppendUInt(UserId);
SendResponse();
}
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.ExecuteQuery("DELETE FROM room_rights WHERE " + DeleteParams.ToString());
}
}
private void TakeAllRights()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true))
{
return;
}
foreach (uint UserId in Room.UsersWithRights)
{
RoomUser User = Room.GetRoomUserByHabbo(UserId);
if (User != null && !User.IsBot)
{
User.GetClient().SendMessage(new ServerMessage(43));
}
GetResponse().Init(511);
GetResponse().AppendUInt(Room.RoomId);
GetResponse().AppendUInt(UserId);
SendResponse();
}
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.ExecuteQuery("DELETE FROM room_rights WHERE room_id = '" + Room.RoomId + "'");
}
Room.UsersWithRights.Clear();
}
private void KickUser()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
if (!Room.CheckRights(Session))
{
return; // insufficient permissions
}
uint UserId = Request.PopWiredUInt();
RoomUser User = Room.GetRoomUserByHabbo(UserId);
if (User == null || User.IsBot)
{
return;
}
if (Room.CheckRights(User.GetClient(), true) || User.GetClient().GetHabbo().HasFuse("fuse_mod"))
{
return; // can't kick room owner or mods!
}
Room.RemoveUserFromRoom(User.GetClient(), true, true);
}
private void BanUser()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true))
{
return; // insufficient permissions
}
uint UserId = Request.PopWiredUInt();
RoomUser User = Room.GetRoomUserByHabbo(UserId);
if (User == null || User.IsBot)
{
return;
}
if (User.GetClient().GetHabbo().HasFuse("fuse_mod"))
{
return;
}
Room.AddBan(UserId);
Room.RemoveUserFromRoom(User.GetClient(), true, true);
}
private void SetHomeRoom()
{
uint RoomId = Request.PopWiredUInt();
RoomData Data = UberEnvironment.GetGame().GetRoomManager().GenerateRoomData(RoomId);
if (RoomId != 0)
{
if (Data == null || Data.Owner.ToLower() != Session.GetHabbo().Username.ToLower())
{
return;
}
}
Session.GetHabbo().HomeRoom = RoomId;
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.ExecuteQuery("UPDATE users SET home_room = '" + RoomId + "' WHERE id = '" + Session.GetHabbo().Id + "' LIMIT 1");
}
GetResponse().Init(455);
GetResponse().AppendUInt(RoomId);
SendResponse();
}
private void DeleteRoom()
{
uint RoomId = Request.PopWiredUInt();
RoomData Data = UberEnvironment.GetGame().GetRoomManager().GenerateRoomData(RoomId);
if (Data == null || Data.Owner.ToLower() != Session.GetHabbo().Username.ToLower())
{
return;
}
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.ExecuteQuery("DELETE FROM rooms WHERE id = '" + Data.Id + "' LIMIT 1");
dbClient.ExecuteQuery("DELETE FROM user_favorites WHERE room_id = '" + Data.Id + "'");
dbClient.ExecuteQuery("DELETE FROM room_items WHERE room_id = '" + Data.Id + "'");
dbClient.ExecuteQuery("DELETE FROM room_rights WHERE room_id = '" + Data.Id + "'");
dbClient.ExecuteQuery("UPDATE users SET home_room = '0' WHERE home_room = '" + Data.Id + "'");
// todo: delete room stuff
}
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Data.Id);
if (Room != null)
{
{
foreach (RoomUser User in Room.UserList)
{
if (User.IsBot)
{
continue;
}
User.GetClient().SendMessage(new ServerMessage(18));
User.GetClient().GetHabbo().OnLeaveRoom();
}
}
UberEnvironment.GetGame().GetRoomManager().UnloadRoom(Data.Id);
}
GetResponse().Init(101);
SendResponse();
Session.SendMessage(UberEnvironment.GetGame().GetNavigator().SerializeRoomListing(Session, -3));
}
private void LookAt()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
RoomUser User = Room.GetRoomUserByHabbo(Session.GetHabbo().Id);
if (User == null)
{
return;
}
User.Unidle();
int X = Request.PopWiredInt32();
int Y = Request.PopWiredInt32();
if (X == User.X && Y == User.Y)
{
return;
}
int Rot = Rotation.Calculate(User.X, User.Y, X, Y);
User.SetRot(Rot);
}
private void StartTyping()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
RoomUser User = Room.GetRoomUserByHabbo(Session.GetHabbo().Id);
if (User == null)
{
return;
}
ServerMessage Message = new ServerMessage(361);
Message.AppendInt32(User.VirtualId);
Message.AppendBoolean(true);
Room.SendMessage(Message);
}
private void StopTyping()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
RoomUser User = Room.GetRoomUserByHabbo(Session.GetHabbo().Id);
if (User == null)
{
return;
}
ServerMessage Message = new ServerMessage(361);
Message.AppendInt32(User.VirtualId);
Message.AppendBoolean(false);
Room.SendMessage(Message);
}
private void IgnoreUser()
{
/*Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoom);
if (Room == null)
{
return;
}
uint Id = Request.PopWiredUInt();
if (Session.GetHabbo().MutedUsers.Contains(Id))
{
return;
}
Session.GetHabbo().MutedUsers.Add(Id);
GetResponse().Init(419);
GetResponse().AppendInt32(1);
SendResponse();*/
}
private void UnignoreUser()
{
/*Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoom);
if (Room == null)
{
return;
}
uint Id = Request.PopWiredUInt();
if (!Session.GetHabbo().MutedUsers.Contains(Id))
{
return;
}
Session.GetHabbo().MutedUsers.Remove(Id);
GetResponse().Init(419);
GetResponse().AppendInt32(3);
SendResponse();*/
}
private void CanCreateRoomEvent()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true))
{
return;
}
Boolean Allow = true;
int ErrorCode = 0;
if (Room.State != 0)
{
Allow = false;
ErrorCode = 3;
}
GetResponse().Init(367);
GetResponse().AppendBoolean(Allow);
GetResponse().AppendInt32(ErrorCode);
SendResponse();
}
private void StartEvent()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true) || Room.Event != null || Room.State != 0)
{
return;
}
int category = Request.PopWiredInt32();
string name = UberEnvironment.FilterInjectionChars(Request.PopFixedString());
string descr = UberEnvironment.FilterInjectionChars(Request.PopFixedString());
int tagCount = Request.PopWiredInt32();
Room.Event = new RoomEvent(Room.RoomId, name, descr, category, null);
Room.Event.Tags = new List<string>();
for (int i = 0; i < tagCount; i++)
{
Room.Event.Tags.Add(UberEnvironment.FilterInjectionChars(Request.PopFixedString()));
}
Room.SendMessage(Room.Event.Serialize(Session));
}
private void StopEvent()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true) || Room.Event == null)
{
return;
}
Room.Event = null;
ServerMessage Message = new ServerMessage(370);
Message.AppendStringWithBreak("-1");
Room.SendMessage(Message);
}
private void EditEvent()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true) || Room.Event == null)
{
return;
}
int category = Request.PopWiredInt32();
string name = UberEnvironment.FilterInjectionChars(Request.PopFixedString());
string descr = UberEnvironment.FilterInjectionChars(Request.PopFixedString());
int tagCount = Request.PopWiredInt32();
Room.Event.Category = category;
Room.Event.Name = name;
Room.Event.Description = descr;
Room.Event.Tags = new List<string>();
for (int i = 0; i < tagCount; i++)
{
Room.Event.Tags.Add(UberEnvironment.FilterInjectionChars(Request.PopFixedString()));
}
Room.SendMessage(Room.Event.Serialize(Session));
}
private void Wave()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
RoomUser User = Room.GetRoomUserByHabbo(Session.GetHabbo().Id);
if (User == null)
{
return;
}
User.Unidle();
User.DanceId = 0;
ServerMessage Message = new ServerMessage(481);
Message.AppendInt32(User.VirtualId);
Room.SendMessage(Message);
}
private void GetUserTags()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
RoomUser User = Room.GetRoomUserByHabbo(Request.PopWiredUInt());
if (User == null || User.IsBot)
{
return;
}
GetResponse().Init(350);
GetResponse().AppendUInt(User.GetClient().GetHabbo().Id);
GetResponse().AppendInt32(User.GetClient().GetHabbo().Tags.Count);
{
foreach (string Tag in User.GetClient().GetHabbo().Tags)
{
GetResponse().AppendStringWithBreak(Tag);
}
}
SendResponse();
}
private void GetUserBadges()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
RoomUser User = Room.GetRoomUserByHabbo(Request.PopWiredUInt());
if (User == null || User.IsBot)
{
return;
}
// CdjUzYZJIACH_RespectEarned1JACH_EmailVerification1E^jUzYZH
GetResponse().Init(228);
GetResponse().AppendUInt(User.GetClient().GetHabbo().Id);
GetResponse().AppendInt32(User.GetClient().GetHabbo().GetBadgeComponent().EquippedCount);
{
foreach (Badge Badge in User.GetClient().GetHabbo().GetBadgeComponent().BadgeList)
{
if (Badge.Slot <= 0)
{
continue;
}
GetResponse().AppendInt32(Badge.Slot);
GetResponse().AppendStringWithBreak(Badge.Code);
}
}
SendResponse();
}
private void RateRoom()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || Session.GetHabbo().RatedRooms.Contains(Room.RoomId) || Room.CheckRights(Session, true))
{
return;
}
int Rating = Request.PopWiredInt32();
switch (Rating)
{
case -1:
Room.Score--;
break;
case 1:
Room.Score++;
break;
default:
return;
}
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.ExecuteQuery("UPDATE rooms SET score = '" + Room.Score + "' WHERE id = '" + Room.RoomId + "' LIMIT 1");
}
Session.GetHabbo().RatedRooms.Add(Room.RoomId);
GetResponse().Init(345);
GetResponse().AppendInt32(Room.Score);
SendResponse();
}
private void Dance()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
RoomUser User = Room.GetRoomUserByHabbo(Session.GetHabbo().Id);
if (User == null)
{
return;
}
User.Unidle();
int DanceId = Request.PopWiredInt32();
if (DanceId < 0 || DanceId > 4 || (!Session.GetHabbo().HasFuse("fuse_use_club_dance") && DanceId > 1))
{
DanceId = 0;
}
if (DanceId > 0 && User.CarryItemID > 0)
{
User.CarryItem(0);
}
User.DanceId = DanceId;
ServerMessage DanceMessage = new ServerMessage(480);
DanceMessage.AppendInt32(User.VirtualId);
DanceMessage.AppendInt32(DanceId);
Room.SendMessage(DanceMessage);
}
private void AnswerDoorbell()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session))
{
return;
}
string Name = Request.PopFixedString();
byte[] Result = Request.ReadBytes(1);
GameClient Client = UberEnvironment.GetGame().GetClientManager().GetClientByHabbo(Name);
if (Client == null)
{
return;
}
if (Result[0] == Convert.ToByte(65))
{
Client.GetHabbo().LoadingChecksPassed = true;
Client.GetMessageHandler().GetResponse().Init(41);
Client.GetMessageHandler().SendResponse();
}
else
{
Client.GetMessageHandler().GetResponse().Init(131);
Client.GetMessageHandler().SendResponse();
}
}
private void ApplyRoomEffect()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true))
{
return;
}
UserItem Item = Session.GetHabbo().GetInventoryComponent().GetItem(Request.PopWiredUInt());
if (Item == null)
{
return;
}
string type = "floor";
if (Item.GetBaseItem().Name.ToLower().Contains("wallpaper"))
{
type = "wallpaper";
}
else if (Item.GetBaseItem().Name.ToLower().Contains("landscape"))
{
type = "landscape";
}
switch (type)
{
case "floor":
Room.Floor = Item.ExtraData;
break;
case "wallpaper":
Room.Wallpaper = Item.ExtraData;
break;
case "landscape":
Room.Landscape = Item.ExtraData;
break;
}
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.ExecuteQuery("UPDATE rooms SET " + type + " = '" + Item.ExtraData + "' WHERE id = '" + Room.RoomId + "' LIMIT 1");
}
Session.GetHabbo().GetInventoryComponent().RemoveItem(Item.Id);
ServerMessage Message = new ServerMessage(46);
Message.AppendStringWithBreak(type);
Message.AppendStringWithBreak(Item.ExtraData);
Room.SendMessage(Message);
}
private void PlaceItem()
{
// AZ@J16 10 10 0
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session))
{
return;
}
string PlacementData = Request.PopFixedString();
string[] DataBits = PlacementData.Split(' ');
uint ItemId = uint.Parse(DataBits[0]);
UserItem Item = Session.GetHabbo().GetInventoryComponent().GetItem(ItemId);
if (Item == null)
{
return;
}
switch (Item.GetBaseItem().InteractionType.ToLower())
{
case "dimmer":
if (Room.ItemCountByType("dimmer") >= 1)
{
Session.SendNotif("You can only have one moodlight in a room.");
return;
}
break;
}
// Wall Item
if (DataBits[1].StartsWith(":"))
{
string WallPos = Room.WallPositionCheck(":" + PlacementData.Split(':')[1]);
if (WallPos == null)
{
GetResponse().Init(516);
GetResponse().AppendInt32(11);
SendResponse();
return;
}
RoomItem RoomItem = new RoomItem(Item.Id, Room.RoomId, Item.BaseItem, Item.ExtraData, 0, 0, 0.0, 0, WallPos);
if (Room.SetWallItem(Session, RoomItem))
{
Session.GetHabbo().GetInventoryComponent().RemoveItem(ItemId);
}
}
// Floor Item
else
{
int X = int.Parse(DataBits[1]);
int Y = int.Parse(DataBits[2]);
int Rot = int.Parse(DataBits[3]);
RoomItem RoomItem = new RoomItem(Item.Id, Room.RoomId, Item.BaseItem, Item.ExtraData, 0, 0, 0, 0, "");
if (Room.SetFloorItem(Session, RoomItem, X, Y, Rot, true))
{
Session.GetHabbo().GetInventoryComponent().RemoveItem(ItemId);
}
}
}
private void TakeItem()
{
int junk = Request.PopWiredInt32();
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true))
{
return;
}
RoomItem Item = Room.GetItem(Request.PopWiredUInt());
if (Item == null)
{
return;
}
switch (Item.GetBaseItem().InteractionType.ToLower())
{
case "postit":
return; // not allowed to pick up post.its
}
Room.RemoveFurniture(Session, Item.Id);
Session.GetHabbo().GetInventoryComponent().AddItem(Item.Id, Item.BaseItem, Item.ExtraData);
Session.GetHabbo().GetInventoryComponent().UpdateItems(false);
}
private void MoveItem()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session))
{
return;
}
RoomItem Item = Room.GetItem(Request.PopWiredUInt());
if (Item == null)
{
return;
}
int x = Request.PopWiredInt32();
int y = Request.PopWiredInt32();
int Rotation = Request.PopWiredInt32();
int Junk = Request.PopWiredInt32();
Room.SetFloorItem(Session, Item, x, y, Rotation, false);
}
private void TriggerItem()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
RoomItem Item = Room.GetItem(Request.PopWiredUInt());
if (Item == null)
{
return;
}
Boolean hasRights = false;
if (Room.CheckRights(Session))
{
hasRights = true;
}
Item.Interactor.OnTrigger(Session, Item, Request.PopWiredInt32(), hasRights);
}
private void TriggerItemDiceSpecial()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
RoomItem Item = Room.GetItem(Request.PopWiredUInt());
if (Item == null)
{
return;
}
Boolean hasRights = false;
if (Room.CheckRights(Session))
{
hasRights = true;
}
Item.Interactor.OnTrigger(Session, Item, -1, hasRights);
}
private void OpenPostit()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
RoomItem Item = Room.GetItem(Request.PopWiredUInt());
if (Item == null || Item.GetBaseItem().InteractionType.ToLower() != "postit")
{
return;
}
// @p181855059CFF9C stickynotemsg
GetResponse().Init(48);
GetResponse().AppendStringWithBreak(Item.Id.ToString());
GetResponse().AppendStringWithBreak(Item.ExtraData);
SendResponse();
}
private void SavePostit()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null)
{
return;
}
RoomItem Item = Room.GetItem(Request.PopWiredUInt());
if (Item == null || Item.GetBaseItem().InteractionType.ToLower() != "postit")
{
return;
}
String Data = Request.PopFixedString();
String Color = Data.Split(' ')[0];
String Text = UberEnvironment.FilterInjectionChars(Data.Substring(Color.Length + 1), true);
if (!Room.CheckRights(Session))
{
if (!Data.StartsWith(Item.ExtraData))
{
return; // we can only ADD stuff! older stuff changed, this is not allowed
}
}
switch (Color)
{
case "FFFF33":
case "FF9CFF":
case "9CCEFF":
case "9CFF9C":
break;
default:
return; // invalid color
}
Item.ExtraData = Color + " " + Text;
Item.UpdateState(true, true);
}
private void DeletePostit()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true))
{
return;
}
RoomItem Item = Room.GetItem(Request.PopWiredUInt());
if (Item == null || Item.GetBaseItem().InteractionType.ToLower() != "postit")
{
return;
}
Room.RemoveFurniture(Session, Item.Id);
}
private void OpenPresent()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true))
{
return;
}
RoomItem Present = Room.GetItem(Request.PopWiredUInt());
if (Present == null)
{
return;
}
DataRow Data = null;
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
Data = dbClient.ReadDataRow("SELECT base_id,amount,extra_data FROM user_presents WHERE item_id = '" + Present.Id + "' LIMIT 1");
}
if (Data == null)
{
return;
}
Item BaseItem = UberEnvironment.GetGame().GetItemManager().GetItem((uint)Data["base_id"]);
if (BaseItem == null)
{
return;
}
Room.RemoveFurniture(Session, Present.Id);
GetResponse().Init(219);
GetResponse().AppendUInt(Present.Id);
SendResponse();
GetResponse().Init(129);
GetResponse().AppendStringWithBreak(BaseItem.Type);
GetResponse().AppendInt32(BaseItem.SpriteId);
GetResponse().AppendStringWithBreak(BaseItem.Name);
SendResponse();
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.ExecuteQuery("DELETE FROM user_presents WHERE item_id = '" + Present.Id + "' LIMIT 1");
}
UberEnvironment.GetGame().GetCatalog().DeliverItems(Session, BaseItem, (int)Data["amount"], (String)Data["extra_data"]);
}
private void GetMoodlight()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true) || Room.MoodlightData == null)
{
return;
}
GetResponse().Init(365);
GetResponse().AppendInt32(Room.MoodlightData.Presets.Count);
GetResponse().AppendInt32(Room.MoodlightData.CurrentPreset);
{
int i = 0;
foreach (MoodlightPreset Preset in Room.MoodlightData.Presets)
{
i++;
GetResponse().AppendInt32(i);
GetResponse().AppendInt32(int.Parse(UberEnvironment.BoolToEnum(Preset.BackgroundOnly)) + 1);
GetResponse().AppendStringWithBreak(Preset.ColorCode);
GetResponse().AppendInt32(Preset.ColorIntensity);
}
}
SendResponse();
}
private void UpdateMoodlight()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true) || Room.MoodlightData == null)
{
return;
}
RoomItem Item = null;
{
foreach (RoomItem I in Room.Items)
{
if (I.GetBaseItem().InteractionType.ToLower() == "dimmer")
{
Item = I;
break;
}
}
}
if (Item == null)
{
return;
}
// EVIH@G#EA4532RbI
int Preset = Request.PopWiredInt32();
int BackgroundMode = Request.PopWiredInt32();
string ColorCode = Request.PopFixedString();
int Intensity = Request.PopWiredInt32();
bool BackgroundOnly = false;
if (BackgroundMode >= 2)
{
BackgroundOnly = true;
}
Room.MoodlightData.Enabled = true;
Room.MoodlightData.CurrentPreset = Preset;
Room.MoodlightData.UpdatePreset(Preset, ColorCode, Intensity, BackgroundOnly);
Item.ExtraData = Room.MoodlightData.GenerateExtraData();
Item.UpdateState();
}
private void SwitchMoodlightStatus()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true) || Room.MoodlightData == null)
{
return;
}
RoomItem Item = null;
{
foreach (RoomItem I in Room.Items)
{
if (I.GetBaseItem().InteractionType.ToLower() == "dimmer")
{
Item = I;
break;
}
}
}
if (Item == null)
{
return;
}
if (Room.MoodlightData.Enabled)
{
Room.MoodlightData.Disable();
}
else
{
Room.MoodlightData.Enable();
}
Item.ExtraData = Room.MoodlightData.GenerateExtraData();
Item.UpdateState();
}
private void InitTrade()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CanTradeInRoom)
{
return;
}
RoomUser User = Room.GetRoomUserByHabbo(Session.GetHabbo().Id);
RoomUser User2 = Room.GetRoomUserByVirtualId(Request.PopWiredInt32());
Room.TryStartTrade(User, User2);
}
private void OfferTradeItem()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CanTradeInRoom)
{
return;
}
Trade Trade = Room.GetUserTrade(Session.GetHabbo().Id);
UserItem Item = Session.GetHabbo().GetInventoryComponent().GetItem(Request.PopWiredUInt());
if (Trade == null || Item == null)
{
return;
}
Trade.OfferItem(Session.GetHabbo().Id, Item);
}
private void TakeBackTradeItem()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CanTradeInRoom)
{
return;
}
Trade Trade = Room.GetUserTrade(Session.GetHabbo().Id);
UserItem Item = Session.GetHabbo().GetInventoryComponent().GetItem(Request.PopWiredUInt());
if (Trade == null || Item == null)
{
return;
}
Trade.TakeBackItem(Session.GetHabbo().Id, Item);
}
private void StopTrade()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CanTradeInRoom)
{
return;
}
Room.TryStopTrade(Session.GetHabbo().Id);
}
private void AcceptTrade()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CanTradeInRoom)
{
return;
}
Trade Trade = Room.GetUserTrade(Session.GetHabbo().Id);
if (Trade == null)
{
return;
}
Trade.Accept(Session.GetHabbo().Id);
}
private void UnacceptTrade()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CanTradeInRoom)
{
return;
}
Trade Trade = Room.GetUserTrade(Session.GetHabbo().Id);
if (Trade == null)
{
return;
}
Trade.Unaccept(Session.GetHabbo().Id);
}
private void CompleteTrade()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CanTradeInRoom)
{
return;
}
Trade Trade = Room.GetUserTrade(Session.GetHabbo().Id);
if (Trade == null)
{
return;
}
Trade.CompleteTrade(Session.GetHabbo().Id);
}
private void GiveRespect()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || Session.GetHabbo().DailyRespectPoints <= 0)
{
return;
}
RoomUser User = Room.GetRoomUserByHabbo(Request.PopWiredUInt());
if (User == null || User.GetClient().GetHabbo().Id == Session.GetHabbo().Id || User.IsBot)
{
return;
}
Session.GetHabbo().DailyRespectPoints--;
User.GetClient().GetHabbo().Respect++;
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.ExecuteQuery("UPDATE users SET respect = respect + 1 WHERE id = '" + User.GetClient().GetHabbo().Id + "' LIMIT 1");
dbClient.ExecuteQuery("UPDATE users SET daily_respect_points = daily_respect_points - 1 WHERE id = '" + Session.GetHabbo().Id + "' LIMIT 1");
}
// FxkqUzYP_
ServerMessage Message = new ServerMessage(440);
Message.AppendUInt(User.GetClient().GetHabbo().Id);
Message.AppendInt32(User.GetClient().GetHabbo().Respect);
Room.SendMessage(Message);
}
private void ApplyEffect()
{
Session.GetHabbo().GetAvatarEffectsInventoryComponent().ApplyEffect(Request.PopWiredInt32());
}
private void EnableEffect()
{
Session.GetHabbo().GetAvatarEffectsInventoryComponent().EnableEffect(Request.PopWiredInt32());
}
private void RecycleItems()
{
if (!Session.GetHabbo().InRoom)
{
return;
}
int itemCount = Request.PopWiredInt32();
if (itemCount != 5)
{
return;
}
for (int i = 0; i < itemCount; i++)
{
UserItem Item = Session.GetHabbo().GetInventoryComponent().GetItem(Request.PopWiredUInt());
if (Item != null && Item.GetBaseItem().AllowRecycle)
{
Session.GetHabbo().GetInventoryComponent().RemoveItem(Item.Id);
}
else
{
return;
}
}
uint newItemId = UberEnvironment.GetGame().GetCatalog().GenerateItemId();
EcotronReward Reward = UberEnvironment.GetGame().GetCatalog().GetRandomEcotronReward();
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.ExecuteQuery("INSERT INTO user_items (id,user_id,base_item,extra_data) VALUES ('" + newItemId + "','" + Session.GetHabbo().Id + "','1478','" + DateTime.Now.ToLongDateString() + "')");
dbClient.ExecuteQuery("INSERT INTO user_presents (item_id,base_id,amount,extra_data) VALUES ('" + newItemId + "','" + Reward.BaseId + "','1','')");
}
Session.GetHabbo().GetInventoryComponent().UpdateItems(true);
GetResponse().Init(508);
GetResponse().AppendBoolean(true);
GetResponse().AppendUInt(newItemId);
SendResponse();
}
private void RedeemExchangeFurni()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true))
{
return;
}
RoomItem Exchange = Room.GetItem(Request.PopWiredUInt());
if (Exchange == null)
{
return;
}
if (!Exchange.GetBaseItem().Name.StartsWith("CF_") && !Exchange.GetBaseItem().Name.StartsWith("CFC_"))
{
return;
}
string[] Split = Exchange.GetBaseItem().Name.Split('_');
int Value = int.Parse(Split[1]);
if (Value > 0)
{
Session.GetHabbo().Credits += Value;
Session.GetHabbo().UpdateCreditsBalance(true);
}
Room.RemoveFurniture(null, Exchange.Id);
GetResponse().Init(219);
SendResponse();
}
private void EnterInfobus()
{
// AQThe Infobus is currently closed.
GetResponse().Init(81);
GetResponse().AppendStringWithBreak("The Uber Infobus is not yet in use.");
SendResponse();
}
private void KickBot()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || !Room.CheckRights(Session, true))
{
return;
}
RoomUser Bot = Room.GetRoomUserByVirtualId(Request.PopWiredInt32());
if (Bot == null || !Bot.IsBot)
{
return;
}
Room.RemoveBot(Bot.VirtualId, true);
}
private void PlacePet()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || (!Room.AllowPets && !Room.CheckRights(Session, true)))
{
return;
}
uint PetId = Request.PopWiredUInt();
Pet Pet = Session.GetHabbo().GetInventoryComponent().GetPet(PetId);
if (Pet == null || Pet.PlacedInRoom)
{
return;
}
int X = Request.PopWiredInt32();
int Y = Request.PopWiredInt32();
if (!Room.CanWalk(X, Y, 0, true))
{
return;
}
if (Room.PetCount >= UberEnvironment.GetGame().GetRoomManager().MAX_PETS_PER_ROOM)
{
Session.SendNotif("There are too many pets in this room. A room may only contain up to " + UberEnvironment.GetGame().GetRoomManager().MAX_PETS_PER_ROOM + " pets.");
return;
}
Pet.PlacedInRoom = true;
Pet.RoomId = Room.RoomId;
RoomUser PetUser = Room.DeployBot(new HabboHotel.RoomBots.RoomBot(Pet.PetId, Pet.RoomId, "pet", "freeroam", Pet.Name, "", Pet.Look, X, Y, 0, 0, 0, 0, 0, 0), Pet);
if (Room.CheckRights(Session, true))
{
Session.GetHabbo().GetInventoryComponent().MovePetToRoom(Pet.PetId, Room.RoomId);
}
}
private void GetPetInfo()
{
uint PetId = Request.PopWiredUInt();
DataRow Row = null;
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.AddParamWithValue("petid", PetId);
Row = dbClient.ReadDataRow("SELECT * FROM user_pets WHERE id = @petid LIMIT 1");
}
if (Row == null)
{
return;
}
Session.SendMessage(UberEnvironment.GetGame().GetCatalog().GeneratePetFromRow(Row).SerializeInfo());
}
private void PickUpPet()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || Room.IsPublic || (!Room.AllowPets && !Room.CheckRights(Session, true)))
{
return;
}
uint PetId = Request.PopWiredUInt();
RoomUser PetUser = Room.GetPet(PetId);
if (PetUser == null || PetUser.PetData == null || PetUser.PetData.OwnerId != Session.GetHabbo().Id)
{
return;
}
Session.GetHabbo().GetInventoryComponent().AddPet(PetUser.PetData);
Room.RemoveBot(PetUser.VirtualId, false);
}
private void RespectPet()
{
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
if (Room == null || Room.IsPublic || (!Room.AllowPets && !Room.CheckRights(Session, true)))
{
return;
}
uint PetId = Request.PopWiredUInt();
RoomUser PetUser = Room.GetPet(PetId);
if (PetUser == null || PetUser.PetData == null || PetUser.PetData.OwnerId != Session.GetHabbo().Id)
{
return;
}
PetUser.PetData.OnRespect();
Session.GetHabbo().DailyPetRespectPoints--;
using (DatabaseClient dbClient = UberEnvironment.GetDatabase().GetClient())
{
dbClient.AddParamWithValue("userid", Session.GetHabbo().Id);
dbClient.ExecuteQuery("UPDATE users SET daily_pet_respect_points = daily_pet_respect_points - 1 WHERE id = @userid LIMIT 1");
}
}
private void GetTrainerPanel()
{
uint PetID = Request.PopWiredUInt();
Room Room = UberEnvironment.GetGame().GetRoomManager().GetRoom(Session.GetHabbo().CurrentRoomId);
RoomUser PetUser = Room.GetPet(PetID);
GetResponse().Init(605);
GetResponse().AppendUInt(PetID);
int level = PetUser.PetData.Level;
GetResponse().AppendInt32(level);
for (int i = 0; level > i; )
{
i++;
GetResponse().AppendInt32(i - 1);
}
SendResponse();
}
public void RegisterRooms()
{
RequestHandlers[391] = new RequestHandler(OpenFlat);
RequestHandlers[182] = new RequestHandler(GetAdvertisement);
RequestHandlers[388] = new RequestHandler(GetPub);
RequestHandlers[2] = new RequestHandler(OpenPub);
RequestHandlers[230] = new RequestHandler(GetGroupBadges);
RequestHandlers[215] = new RequestHandler(GetRoomData1);
RequestHandlers[390] = new RequestHandler(GetRoomData2);
RequestHandlers[126] = new RequestHandler(GetRoomData3);
RequestHandlers[52] = new RequestHandler(Talk);
RequestHandlers[55] = new RequestHandler(Shout);
RequestHandlers[56] = new RequestHandler(Whisper);
RequestHandlers[75] = new RequestHandler(Move);
RequestHandlers[387] = new RequestHandler(CanCreateRoom);
RequestHandlers[29] = new RequestHandler(CreateRoom);
RequestHandlers[400] = new RequestHandler(GetRoomEditData);
RequestHandlers[386] = new RequestHandler(SaveRoomIcon);
RequestHandlers[401] = new RequestHandler(SaveRoomData);
RequestHandlers[96] = new RequestHandler(GiveRights);
RequestHandlers[97] = new RequestHandler(TakeRights);
RequestHandlers[155] = new RequestHandler(TakeAllRights);
RequestHandlers[95] = new RequestHandler(KickUser);
RequestHandlers[320] = new RequestHandler(BanUser);
RequestHandlers[71] = new RequestHandler(InitTrade);
RequestHandlers[384] = new RequestHandler(SetHomeRoom);
RequestHandlers[23] = new RequestHandler(DeleteRoom);
RequestHandlers[79] = new RequestHandler(LookAt);
RequestHandlers[317] = new RequestHandler(StartTyping);
RequestHandlers[318] = new RequestHandler(StopTyping);
RequestHandlers[319] = new RequestHandler(IgnoreUser);
RequestHandlers[322] = new RequestHandler(UnignoreUser);
RequestHandlers[345] = new RequestHandler(CanCreateRoomEvent);
RequestHandlers[346] = new RequestHandler(StartEvent);
RequestHandlers[347] = new RequestHandler(StopEvent);
RequestHandlers[348] = new RequestHandler(EditEvent);
RequestHandlers[94] = new RequestHandler(Wave);
RequestHandlers[263] = new RequestHandler(GetUserTags);
RequestHandlers[159] = new RequestHandler(GetUserBadges);
RequestHandlers[261] = new RequestHandler(RateRoom);
RequestHandlers[93] = new RequestHandler(Dance);
RequestHandlers[98] = new RequestHandler(AnswerDoorbell);
RequestHandlers[59] = new RequestHandler(ReqLoadRoomForUser);
RequestHandlers[66] = new RequestHandler(ApplyRoomEffect);
RequestHandlers[90] = new RequestHandler(PlaceItem);
RequestHandlers[67] = new RequestHandler(TakeItem);
RequestHandlers[73] = new RequestHandler(MoveItem);
RequestHandlers[392] = new RequestHandler(TriggerItem); // Generic trigger item
RequestHandlers[393] = new RequestHandler(TriggerItem); // Generic trigger item
RequestHandlers[83] = new RequestHandler(OpenPostit);
RequestHandlers[84] = new RequestHandler(SavePostit);
RequestHandlers[85] = new RequestHandler(DeletePostit);
RequestHandlers[78] = new RequestHandler(OpenPresent);
RequestHandlers[341] = new RequestHandler(GetMoodlight);
RequestHandlers[342] = new RequestHandler(UpdateMoodlight);
RequestHandlers[343] = new RequestHandler(SwitchMoodlightStatus);
RequestHandlers[72] = new RequestHandler(OfferTradeItem);
RequestHandlers[405] = new RequestHandler(TakeBackTradeItem);
RequestHandlers[70] = new RequestHandler(StopTrade);
RequestHandlers[403] = new RequestHandler(StopTrade);
RequestHandlers[69] = new RequestHandler(AcceptTrade);
RequestHandlers[68] = new RequestHandler(UnacceptTrade);
RequestHandlers[402] = new RequestHandler(CompleteTrade);
RequestHandlers[371] = new RequestHandler(GiveRespect);
RequestHandlers[372] = new RequestHandler(ApplyEffect);
RequestHandlers[373] = new RequestHandler(EnableEffect);
RequestHandlers[232] = new RequestHandler(TriggerItem); // One way gates
RequestHandlers[314] = new RequestHandler(TriggerItem); // Love Shuffler
RequestHandlers[247] = new RequestHandler(TriggerItem); // Habbo Wheel
RequestHandlers[76] = new RequestHandler(TriggerItem); // Dice
RequestHandlers[77] = new RequestHandler(TriggerItemDiceSpecial); // Dice (special)
RequestHandlers[414] = new RequestHandler(RecycleItems);
RequestHandlers[183] = new RequestHandler(RedeemExchangeFurni);
RequestHandlers[113] = new RequestHandler(EnterInfobus);
RequestHandlers[441] = new RequestHandler(KickBot);
RequestHandlers[3002] = new RequestHandler(PlacePet);
RequestHandlers[3001] = new RequestHandler(GetPetInfo);
RequestHandlers[3003] = new RequestHandler(PickUpPet);
RequestHandlers[3005] = new RequestHandler(RespectPet);
RequestHandlers[3004] = new RequestHandler(GetTrainerPanel);
}
}
}
su questo errore cosa mi consiglieresti? vedendo anche le source di sopra?
non ho capito a cosa si riferisce l'errore a quale tabella fa riferimento?
Intanto devi imparare a fare uno sforzo e capire che cosa ti sta dicendo l'errore (che poi non è così criptico... se non sai cos'è un dictionary e cos'è la chiave allora forse devi andarti a rivedere un po' il C#).
Non so perchè tu abbia copiato il GameClientMessageHandler quando l'eccezione riguarda la classe Room, forse hai fatto un po' di casino con le copie e le eccezioni (perchè a me avevi parlato di SocketException, poi qui hai messo un InvalidOperationException etc).
Comunque per l'ArgumentException non devi andare a far altro che vedere quella funzione UpdateUserStatus, ti dà pure la linea... e sta semplicemente dicendo che stai tentando di inserire un nuovo elemento nel dizionario con una chiave che già esiste in esso.
Ora la soluzione veloce sarebbe di mettere un controllo prima dell'aggiunta dell'elemento.. cioè se c'è già la chiave allora non lo aggiungo.
Non è il metodo migliore però perchè magari il fatto che aggiunga due volte un elemento già inserito può non essere un comportamento corretto e la causa sarebbe da ricercare altrove.
Per il SocketException la causa potrebbe essere che hai troppi client/socket nella lista della listen...
Sei ancora sotto attacco? ti capita quando lo sei? Allora devi ricontrollare il codice che scollega i client che ti dossano.. perchè fillano la lista.
Poi può anche essere che non è il tuo programma che lavora male, ma semplicemente visto che raggiungono il tuo pc l'attacco è già andato a buon fine.. accodando pacchetti.. e quindi la lista di client in waiting per l'accettazione si riempie (questo non lo so con sicurezza).
gli errori che sono sulle linee 825 e 1841 sono
UpdateUserStatus(User);
BallThread.Add(User.HabboId, BallT);
per il fatto del Dos si c'è ancora ma per ora riesco a bloccarli con
FortGuard,ho provato a levare
BallThread.Add(User.HabboId, BallT);
e l'errore nelle stanze non c'è più, solo che arrivato intorno ai 170 online
vedo dal pannello di FortGuard che consuma tra i 350-400 connessioni in TCP
praticamente è come se fossi sotto dos mentre invece se rimane
BallThread.Add(User.HabboId, BallT);
oppure senza però tolto il ping, nelle stanze ho il problema di prima.
se devo aggiungere un eccezione al dictionary per non far modificare l'utente
in modo da non dare l'errore? perchè penso che così forse può darsi che mi sbaglio ma non si risolverebbe.
oppure se avete capito il problema per favore mi potreste scrivere almeno un esempio per farmi arrivare al problema?
EDIT.
11/27/2010 2:38:41 PM
Uber.Storage.DatabaseException: [DBClient.Connect]: Could not open MySQL Connection - Unable to connect to any of the specified MySQL hosts.
at Uber.Storage.DatabaseClient.Connect() in C:\Users\kulosia\Desktop\azz\Storage\Database.cs:line 361
at Uber.Storage.DatabaseManager.GetClient() in C:\Users\kulosia\Desktop\azz\Storage\Database.cs:line 200
at Uber.HabboHotel.Items.TeleHandler.GetLinkedTele(UInt32 TeleId) in C:\Users\kulosia\Desktop\azz\HabboHotel\Items\TeleHandler.cs:line 15
at Uber.HabboHotel.Items.TeleHandler.IsTeleLinked(UInt32 TeleId) in C:\Users\kulosia\Desktop\azz\HabboHotel\Items\TeleHandler.cs:line 49
at Uber.HabboHotel.Items.RoomItem.ProcessUpdates() in C:\Users\kulosia\Desktop\azz\HabboHotel\Items\RoomItem.cs:line 290
at Uber.HabboHotel.Rooms.Room.ProcessRoom() in C:\Users\kulosia\Desktop\azz\HabboHotel\Rooms\Room.cs:line 770
at Uber.HabboHotel.Rooms.RoomManager.ProcessEngine() in C:\Users\kulosia\Desktop\azz\HabboHotel\Rooms\RoomManager.cs:line 110
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
questo è l'errore che esce togliendo
BallThread.Add(User.HabboId, BallT);
e arrivando intorno ai 170 on, è come se mysql non risponde.
errore linea 361
throw new DatabaseException("[DBClient.Connect]: Could not open MySQL Connection - " + e.Message);
errore linea 200
Anonymous.Connect();
errore linea 15
DataRow Row = null;
questi sono gli errori che escono in database.cs
poi se vuoi che metto il sorgente oppure metto il resto degli errori.
ah e poi cmq gli errori incominciano ad uscire solamente dopo i 30-35 utenti online prima sembra vada tutto bene
infatti ora me ne sono accorto dell'errore visto che stanno più utenti.
no fino ad ora ho detto solo stupidagini...
il problema che dava cioè:
11/28/2010 11:03:44 AM
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()
at Uber.HabboHotel.Rooms.RoomManager.GetEventRoomsForCategory(Int32 Category) in C:\Users\kulosia\Desktop\azz\HabboHotel\Rooms\RoomManager.cs:line 63
at Uber.HabboHotel.Navigators.Navigator.SerializeEventListing(GameClient Session, Int32 Category) in C:\Users\kulosia\Desktop\azz\HabboHotel\Navigators\Navigator.cs:line 207
at Uber.Messages.GameClientMessageHandler.GetEvents() in C:\Users\kulosia\Desktop\azz\Messages\Requests\Navigator.cs:line 146
at Uber.Messages.GameClientMessageHandler.HandleRequest(ClientMessage Request) in C:\Users\kulosia\Desktop\azz\Messages\GameClientMessageHander.cs:line 62
at Uber.HabboHotel.GameClients.GameClient.HandleConnectionData(Byte[]& data) in C:\Users\kulosia\Desktop\azz\HabboHotel\GameClients\GameClient.cs:line 280
at Uber.Net.TcpConnection.RouteData(Byte[]& Data) in C:\Users\kulosia\Desktop\azz\Net\TcpConnection.cs:line 215
at Uber.Net.TcpConnection.DataReceived(IAsyncResult iAr) in C:\Users\kulosia\Desktop\azz\Net\TcpConnection.cs:line 205
at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
at System.Net.ContextAwareResult.CompleteCallback(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Net.ContextAwareResult.Complete(IntPtr userToken)
at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
è su RoomManager.cs
sulla linea 63 quindi
while (eRooms.MoveNext())
se levo questo succede un casino nelle stanze quindi come ha detto Downloader
devo mettere una chiave duplicata sul dictionary nel quale il primo tipo di dato deve essere una chiave univoca.
quindi:
Dictionary<uint, Room>.Enumerator eRooms = this.Rooms.GetEnumerator();
e cambiarlo giusto? oppure dopo di questo esce qualche altro problema?
Room Room = new Room(Data.Id, Data.Name, Data.Description, Data.Type, Data.Owner, Data.Category, Data.State,
Data.UsersMax, Data.ModelName, Data.CCTs, Data.Score, Data.Tags, Data.AllowPets, Data.AllowPetsEating,
Data.AllowWalkthrough, Data.Hidewall, Data.Icon, Data.Password, Data.Wallpaper, Data.Floor, Data.Landscape);
ecco qui prende già id che dovrebbe essere chiave univoca,
poi non so perchè da errore.
downloader
29-11-2010, 21:26
no fino ad ora ho detto solo stupidagini...
while (eRooms.MoveNext())
se levo questo succede un casino nelle stanze quindi come ha detto Downloader
devo mettere una chiave duplicata sul dictionary nel quale il primo tipo di dato deve essere una chiave univoca.
aaaahhhh argherrimo :D
non ho detto che devi mettere chiave duplicata ma che una delle eccezioni arriva perché metti chiave duplicata in un dictionary.
Tu stai facendo secondo me una cosa sbagliata... fai manutenzione in un codice non tuo che non hai capito appieno né nel come funziona né nel come si usa...
secondo me tu chiami dei metodi impropriamente e farlo all'interno di un ciclo non va bene perché uno di questo cambia l'iteratore.
COMUNQUE
al limite se proprio vuoi, fa una prova
prendi l'iteratore e fattene una copia, fai una find sulla vecchia dictionary e lancia i metodi dal metodo trovato. La find la fai con la chiave dell'elemento corrente.
tomminno
29-11-2010, 22:46
Continui ad essere fuori strada o a portare noi fuori strada: l'utlimo errore che hai riportato è:
Collection was modified; enumeration operation may not execute.
Suppongo che l'applicativo sia multithread per cui mentre in un thread stai enumerando quella collection in qualche altro la stai modificando.
prova con
lock(eRooms)
{
while (eRooms.MoveNext())
...
}
Ora non avendo sotto mano l'intero codice non so se possa essere la soluzione o comunque la soluzione migliore e se possano esserci altri punti dove intervenire.
Ah scusami Downloader non avevo capito,
ho provato sia il metodo che hai detto tu che Lock
che mi ha consigliato Tomminno il problema non si è risolto.
forse è meglio se metto link del sorgente?
perchè forse vi porto io sulla strada sbagliata.
tomminno
02-12-2010, 08:58
up
Ma stai provando in debug?
Se il problema si verifica solo con un numero elevato di utenti è un problema di concorrenza, non è che possiamo provarlo noi per te.
il server sta su vps windows 2003 e non fa fare il debug perchè mancano alcuni componenti del .Net
devo passare per un giorno tutto sul mio Computer.
per il problema che si verifica mi sono sbagliato non era un problema
di utenza.
si blocca nelle stanze a volte crasha il server oppure rimane attivo ma dentro
le stanze è tutto bloccato
prima di usare look il file errorlog.txt dopo 30-40 minuti era a
50-60kb di errori ma che ripeteva sempre lo stesso errore.
ora con look direttamente un solo errore e si blocca nelle stanze.
12/2/2010 7:22:44 AM
System.ArgumentException: An item with the same key has already been added.
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at Uber.HabboHotel.Rooms.Room.UpdateUserStatus(RoomUser User) in C:\Users\kulosia\Desktop\azz - Copia (2)\HabboHotel\Rooms\Room.cs:line 1841
at Uber.HabboHotel.Rooms.Room.ProcessRoom() in C:\Users\kulosia\Desktop\azz - Copia (2)\HabboHotel\Rooms\Room.cs:line 825
at Uber.HabboHotel.Rooms.RoomManager.ProcessEngine() in C:\Users\kulosia\Desktop\azz - Copia (2)\HabboHotel\Rooms\RoomManager.cs:line 107
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Rooms.cs
foreach (RoomItem Item in Ball)
{
if (Item.GetBaseItem().InteractionType.ToLower() == "ball")
{
Thread BallT = new Thread(delegate() { BallProcess(Item, User); });
BallT.Start();
BallThread.Add(User.HabboId, BallT); //errore 1841
}
}
Rooms.cs
bool invalidSetStep = false;
if (User.SetStep)
{
if (CanWalk(User.SetX, User.SetY, 0, true) || User.AllowOverride || AllowWalkthrough == true)
{
UserMatrix[User.X, User.Y] = false;
User.X = User.SetX;
User.Y = User.SetY;
User.Z = User.SetZ;
UserMatrix[User.X, User.Y] = true;
UpdateUserStatus(User); //Errore 825
}
else
{
invalidSetStep = true;
}
User.SetStep = false;
}
RoomManager.cs
lock (Rooms)
{
Dictionary<uint, Room>.Enumerator eRooms = this.Rooms.GetEnumerator();
while (eRooms.MoveNext())
{
Room Room = eRooms.Current.Value;
if (!Room.KeepAlive)
{
continue;
}
Room.ProcessRoom(); // Errore 107
}
}
ho riportato gli errori che da errorlog.txt
per il debug questa sera provo sul mio pc.
ho lasciato tutta la notte acceso in debug,
ecco gli errori che riporta:
[Codice esterno]
> MeLuX Emulatore.exe!Uber.HabboHotel.GameClients.GameClientManager.StartConnectionChecker() Riga 95 C#
MeLuX Emulatore.exe!Uber.HabboHotel.GameClients.GameClientManager.TestClientConnections() Riga 164 + 0xc byte C#
[Codice esterno]
12/3/2010 3:24:51 AM
System.Threading.ThreadStartException: Thread failed to start. ---> System.Threading.ThreadAbortException: Thread was being aborted.
--- End of inner exception stack trace ---
at System.Threading.Thread.StartInternal(IPrincipal principal, StackCrawlMark& stackMark)
at System.Threading.Thread.Start()
at Uber.HabboHotel.GameClients.GameClientManager.StartConnectionChecker() in C:\Users\kulosia\Desktop\azz - Copia (2)\HabboHotel\GameClients\GameClientManager.cs:line 95
at Uber.HabboHotel.GameClients.GameClientManager.TestClientConnections() in C:\Users\kulosia\Desktop\azz - Copia (2)\HabboHotel\GameClients\GameClientManager.cs:line 164
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
catch (ThreadAbortException)
{
UberEnvironment.GetLogging().WriteLine("Ping Thread has aborted unexpectedly.", Core.LogLevel.Error);
StopConnectionChecker();
StartConnectionChecker(); //Errore linea 164
}
catch (InvalidOperationException)
{
UberEnvironment.GetLogging().WriteLine("Invalid Operation Exception on Ping Thread.", Core.LogLevel.Error);
StopConnectionChecker();
StartConnectionChecker();
}
public void StartConnectionChecker()
{
if (ConnectionChecker != null)
{
return;
}
ConnectionChecker = new Thread(TestClientConnections);
ConnectionChecker.Name = "Connection Checker";
ConnectionChecker.Priority = ThreadPriority.Lowest;
ConnectionChecker.Start();
} //Errore linea 95
in debug l'errore cambia.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.