【发布时间】:2015-02-19 03:34:47
【问题描述】:
我仍在使用 C# 进行开发,突然间我遇到了这个错误。这是它记录的错误代码;
TokenID: 1System.ArgumentException: An item with the same key has already been added.
at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
at Butterfly.HabboHotel.Rooms.RoomManager.LoadRoom(UInt32 Id) in c:\Users\michael-webb\Desktop\BFLY\Butterfly Emulator\HabboHotel\Rooms\RoomManager.cs:line 207
at Butterfly.Messages.GameClientMessageHandler.PrepareRoomForUser(UInt32 Id, String Password, Boolean StaffRule) in c:\Users\michael-webb\Desktop\BFLY\Butterfly Emulator\Messages\Requests\Rooms.cs:line 528
at Butterfly.Messages.GameClientMessageHandler.OpenFlat() in c:\Users\michael-webb\Desktop\BFLY\Butterfly Emulator\Messages\Requests\Navigator.cs:line 177
at Butterfly.Messages.StaticMessageHandlers.SharedPacketLib.OpenFlat(GameClientMessageHandler handler) in c:\Users\michael-webb\Desktop\BFLY\Butterfly Emulator\Messages\StaticMessageHandlers\SharedPacketLib.cs:line 372
at Butterfly.Messages.StaticMessageHandlers.StaticClientMessageHandler.HandlePacket(GameClientMessageHandler handler, ClientMessage message) in c:\Users\michael-webb\Desktop\BFLY\Butterfly Emulator\Messages\StaticMessageHandlers\StaticClientMessageHandler.cs:line 25
at Butterfly.Messages.GameClientMessageHandler.HandleRequest(ClientMessage request) in c:\Users\michael-webb\Desktop\BFLY\Butterfly Emulator\Messages\GameClientMessageHander.cs:line 57
at Butterfly.HabboHotel.GameClients.GameClient.parser_onNewPacket(ClientMessage Message) in c:\Users\michael-webb\Desktop\BFLY\Butterfly Emulator\HabboHotel\GameClients\GameClient.cs:line 70
这是 RoomManager.cs 第 207 行的代码 - loadedRooms.Add(Id, Room);哪个是这个虚空的一部分;
internal Room LoadRoom(UInt32 Id)
{
if (IsRoomLoaded(Id))
{
return GetRoom(Id);
}
try
{
if (loadedRooms.ContainsValue(GetRoom(Id)))
return GetRoom(Id);
}
catch { }
RoomData Data = GenerateRoomData(Id);
if (Data == null)
return null;
Room Room = new Room(Data);
//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, Data, Data.AllowRightsOverride);
lock (roomsToAddQueue.SyncRoot)
{
roomsToAddQueue.Enqueue(Room);
}
Room.InitBots();
Room.InitPets();
//Logging.WriteLine("[RoomMgr] Loaded room: \"" + Room.Name + "\" (ID: " + Id + ")");
loadedRooms.Add(Id, Room);
return Room;
}
这是 Rooms.cs 第 528 行的代码 - Room room2 = ButterflyEnvironment.GetGame().GetRoomManager().LoadRoom(Id); - 这是这个虚空的一部分;
internal void PrepareRoomForUser(uint Id, string Password, bool StaffRule = false)
{
if (((this.Session != null) && (this.Session.GetConnection() != null)) && (this.Session.GetHabbo() != null))
{
this.ClearRoomLoading();
QueuedServerMessage message = new QueuedServerMessage(this.Session.GetConnection());
if (ButterflyEnvironment.ShutdownStarted)
{
this.Session.SendNotif(LanguageLocale.GetValue("shutdown.alert"));
}
else
{
if (this.Session.GetHabbo().InRoom)
{
Room room = ButterflyEnvironment.GetGame().GetRoomManager().GetRoom(this.Session.GetHabbo().CurrentRoomId);
if (room != null)
{
room.GetRoomUserManager().RemoveUserFromRoom(this.Session, false, false);
this.Session.CurrentRoomUserID = -1;
}
}
Room room2 = ButterflyEnvironment.GetGame().GetRoomManager().LoadRoom(Id);
if ((((room2 != null) && (this.Session != null)) && (this.Session.GetHabbo() != null)) && (!this.Session.GetHabbo().IsTeleporting || (this.Session.GetHabbo().TeleportingRoomID == Id)))
{
this.Session.GetHabbo().LoadingRoom = Id;
this.CurrentLoadingRoom = room2;
if (this.Session.GetHabbo().SpectatorMode && (this.Session.GetHabbo().Rank < 4))
{
this.Session.GetHabbo().SpectatorMode = false;
}
if (!StaffRule)
{
IQueryAdapter adapter;
uint id;
using (adapter = ButterflyEnvironment.GetDatabaseManager().getQueryreactor())
{
adapter.setQuery("SELECT * FROM users WHERE id = '" + this.Session.GetHabbo().Id + "'");
foreach (DataRow row in adapter.getTable().Rows)
{
id = Convert.ToUInt32(row["lock_room"]);
string str = Convert.ToString(row["lock_rooms"]);
if (!((id <= 0) || str.Contains(Convert.ToString(room2.RoomId))))
{
RoomData data = ButterflyEnvironment.GetGame().GetRoomManager().GenerateRoomData(id);
this.Session.GetMessageHandler().PrepareRoomForUser(id, data.Password, true);
}
}
}
其余的不用担心。这只是其他的东西,我怎么能粘贴它。据我所知,它试图用 Id 做两次不应该做的事情?我以前从未遇到过这个错误,所以我不知道该怎么做。有人能带我去吗?
【问题讨论】:
-
这里发生了很多事情,而且很多事情看起来很奇怪。我想知道的第一件事是 IsRoomLoaded() 是什么样的?还有,这是多线程的吗?
-
内部布尔 IsRoomLoaded(UInt32 RoomId) { return loadedRooms.ContainsKey(RoomId); }
-
没有理由将 .ContainsKey() 包装在另一种类似的方法中。调用 .ContainsKey() 会更清楚
-
因为关键是要返回 Room 对象,如果它在那里,使用 TryGetValue(key, out Room)
标签: c# argumentexception