public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            uint x = packet.ReadInt();
            uint y = packet.ReadInt();
            ushort id = packet.ReadShort();
            ushort item_slot = packet.ReadShort();

            if (client.Player.TargetObject == null)
            {
                client.Out.SendMessage("You must select an NPC to sell to.", eChatType.CT_Merchant, eChatLoc.CL_SystemWindow);
                return;
            }

            lock (client.Player.Inventory)
            {
                InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)item_slot);
                if (item == null)
                    return;

                int itemCount = Math.Max(1, item.Count);
                int packSize = Math.Max(1, item.PackSize);

                if (client.Player.TargetObject is GameMerchant)
                {
                    //Let the merchant choos how to handle the trade.
                    ((GameMerchant)client.Player.TargetObject).OnPlayerSell(client.Player, item);
                }
                else if (client.Player.TargetObject is GameLotMarker)
                {
                    ((GameLotMarker)client.Player.TargetObject).OnPlayerSell(client.Player, item);
                }
            }
        }
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			uint X = packet.ReadInt();
			uint Y = packet.ReadInt();
			ushort id = packet.ReadShort();
			ushort item_slot = packet.ReadShort();

			new AppraiseActionHandler(client.Player, item_slot).Start(1);
		}
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			var groundX = (int) packet.ReadInt();
			var groundY = (int) packet.ReadInt();
			var groundZ = (int) packet.ReadInt();
			ushort flag = packet.ReadShort();
//			ushort unk2 = packet.ReadShort();

			new ChangeGroundTargetHandler(client.Player, groundX, groundY, groundZ, flag).Start(1);
		}
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			// packet.Skip(10);
			uint playerX = packet.ReadInt();
			uint playerY = packet.ReadInt();
			int sessionId = packet.ReadShort();
			ushort targetOid = packet.ReadShort();

            //TODO: utilize these client-sent coordinates to possibly check for exploits which are spoofing position packets but not spoofing them everywhere
			new InteractActionHandler(client.Player, targetOid).Start(1);
		}
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            if (client.Player == null)
                return;

            int slot = packet.ReadByte();
            int unk1 = packet.ReadByte();
            ushort unk2 = packet.ReadShort();
            uint price = packet.ReadInt();
            GameConsignmentMerchant con = client.Player.ActiveConMerchant;
            House house = HouseMgr.GetHouse(con.HouseNumber);
            if (house == null)
                return;
            if (!house.HasOwnerPermissions(client.Player))
                return;
            int dbSlot = (int)eInventorySlot.Consignment_First + slot;
            InventoryItem item = GameServer.Database.SelectObject<InventoryItem>("OwnerID = '" + client.Player.DBCharacter.ObjectId + "' AND SlotPosition = '" + dbSlot.ToString() + "'");
            if (item != null)
            {
                item.SellPrice = (int)price;
                GameServer.Database.SaveObject(item);
            }
            else
            {
                client.Player.TempProperties.setProperty(NEW_PRICE, (int)price);
            }

            // another update required here,currently the player needs to reopen the window to see the price, thats why we msg him
            client.Out.SendMessage("New price set! (open the merchant window again to see the price)", eChatType.CT_System, eChatLoc.CL_SystemWindow);
        }
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			lock (this)
			{
				string dllName = packet.ReadString(16);
				packet.Position = 0x50;
				uint upTime = packet.ReadInt();
				string text = string.Format("Client crash ({0}) dll:{1} clientUptime:{2}sec", client.ToString(), dllName, upTime);
				if (log.IsInfoEnabled)
					log.Info(text);

				if (log.IsDebugEnabled)
				{
					log.Debug("Last client sent/received packets (from older to newer):");
					
					foreach (IPacket prevPak in client.PacketProcessor.GetLastPackets())
					{
						log.Info(prevPak.ToHumanReadable());
					}
				}
					
				//Eden
				if(client.Player!=null)
				{
					GamePlayer player = client.Player;
					client.Out.SendPlayerQuit(true);
					client.Player.SaveIntoDatabase();
					client.Player.Quit(true);
					client.Disconnect();
				}
			}
		}
Beispiel #7
0
		/// <summary>
		/// Called when the packet has been received
		/// </summary>
		/// <param name="client">Client that sent the packet</param>
		/// <param name="packet">Packet data</param>
		/// <returns>Non zero if function was successfull</returns>
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			packet.Skip(4); //Skip the first 4 bytes
			long pingDiff = (DateTime.Now.Ticks - client.PingTime)/1000;
			client.PingTime = DateTime.Now.Ticks;
			ulong timestamp = packet.ReadInt();

			client.Out.SendPingReply(timestamp,packet.Sequence);
		}
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			if (client.Player == null)
				return;

			uint X = packet.ReadInt();
			uint Y = packet.ReadInt();
			ushort id = packet.ReadShort();
			ushort item_slot = packet.ReadShort();
			byte item_count = (byte)packet.ReadByte();
			byte menu_id = (byte)packet.ReadByte();

			switch ((eMerchantWindowType)menu_id)
			{
				case eMerchantWindowType.HousingInsideShop:
				case eMerchantWindowType.HousingOutsideShop:
				case eMerchantWindowType.HousingBindstoneHookpoint:
				case eMerchantWindowType.HousingCraftingHookpoint:
				case eMerchantWindowType.HousingNPCHookpoint:
				case eMerchantWindowType.HousingVaultHookpoint:
					{
						HouseMgr.BuyHousingItem(client.Player, item_slot, item_count, (eMerchantWindowType)menu_id);
						break;
					}
				default:
					{
						if (client.Player.TargetObject == null)
							return;

						//Forward the buy process to the merchant
						if (client.Player.TargetObject is GameMerchant)
						{
							//Let merchant choose what happens
							((GameMerchant)client.Player.TargetObject).OnPlayerBuy(client.Player, item_slot, item_count);
						}
						else if (client.Player.TargetObject is GameLotMarker)
						{
							((GameLotMarker)client.Player.TargetObject).OnPlayerBuy(client.Player, item_slot, item_count);
						}
						break;
					}
			}
		}
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            if (client.Player == null)
                return;
            uint X = packet.ReadInt();
            uint Y = packet.ReadInt();
            ushort id = (ushort)packet.ReadShort();
            ushort obj = (ushort)packet.ReadShort();

            GameObject target = client.Player.TargetObject;
            if (target == null)
            {
                client.Out.SendMessage(LanguageMgr.GetTranslation(client, "PlayerPickUpRequestHandler.HandlePacket.Target"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
                return;
            }
            if (target.ObjectState != GameObject.eObjectState.Active)
            {
                client.Out.SendMessage(LanguageMgr.GetTranslation(client, "PlayerPickUpRequestHandler.HandlePacket.InvalidTarget"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
                return;
            }

            client.Player.PickupObject(target, false);
        }
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            if (client == null || client.Player == null)
                return;

            int slot = packet.ReadByte();
            int unk1 = packet.ReadByte();
            ushort unk2 = packet.ReadShort();
            uint price = packet.ReadInt();

            // ChatUtil.SendDebugMessage(client.Player, "PlayerSetMarketPriceHandler");

            // only IGameInventoryObjects can handle set price commands
            if (client.Player.TargetObject == null || (client.Player.TargetObject is IGameInventoryObject) == false)
                return;

            (client.Player.TargetObject as IGameInventoryObject).SetSellPrice(client.Player, (ushort)slot, price);
        }
Beispiel #11
0
        public bool HandleCommand(TankMarryLogicProcessor process, GamePlayer player, GSPacketIn packet)
        {
            if (player.CurrentMarryRoom != null /* && player.CurrentMarryRoom.RoomState == eRoomState.FREE*/)
            {
                int userID     = packet.ReadInt();
                int templateID = packet.ReadInt();


                ItemTemplateInfo template = ItemMgr.FindItemTemplate(templateID);

                if (template != null)
                {
                    if (player.CurrentMarryRoom.Info.IsGunsaluteUsed == false && (player.CurrentMarryRoom.Info.GroomID == player.PlayerCharacter.ID ||
                                                                                  player.CurrentMarryRoom.Info.BrideID == player.PlayerCharacter.ID))
                    {
                        player.CurrentMarryRoom.ReturnPacketForScene(player, packet);
                        player.CurrentMarryRoom.Info.IsGunsaluteUsed = true;
                        GSPacketIn msg = player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("GunsaluteCommand.Successed1", player.PlayerCharacter.NickName));
                        player.CurrentMarryRoom.SendToPlayerExceptSelfForScene(msg, player);
                        GameServer.Instance.LoginServer.SendMarryRoomInfoToPlayer(player.CurrentMarryRoom.Info.GroomID, true, player.CurrentMarryRoom.Info);
                        GameServer.Instance.LoginServer.SendMarryRoomInfoToPlayer(player.CurrentMarryRoom.Info.BrideID, true, player.CurrentMarryRoom.Info);

                        using (PlayerBussiness db = new PlayerBussiness())
                        {
                            db.UpdateMarryRoomInfo(player.CurrentMarryRoom.Info);
                        }

                        return(true);
                    }
                    //未开始
                    //if(template.PayType == 0)
                    //{
                    //    if(player.PlayerCharacter.Gold >= template.Price1)
                    //    {
                    //        player.RemoveGold(template.Price1, GoldRemoveType.Firecrackers);
                    //        CountBussiness.InsertSystemPayCount(player.PlayerCharacter.ID, 0, template.Price1, (int)eConsumerType.Marry, (int)eSubConsumerType.Marry_Gunsalute);
                    //        //0 player.CurrentMarryRoom.ReturnPacket(player, packet);
                    //        player.CurrentMarryRoom.ReturnPacketForScene(player, packet);
                    //        GSPacketIn msg = player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("GunsaluteCommand.Successed1", player.PlayerCharacter.NickName));
                    //        player.CurrentMarryRoom.SendToPlayerExceptSelfForScene(msg, player);
                    //        return true;
                    //    }
                    //    else
                    //    {
                    //        player.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("GunsaluteCommand.GoldNotEnough"));
                    //    }
                    //}
                    //else
                    //{
                    //    if(player.PlayerCharacter.Money >= template.Price1)
                    //    {
                    //        player.RemoveMoney(template.Price1, MoneyRemoveType.Firecrackers);
                    //        CountBussiness.InsertSystemPayCount(player.PlayerCharacter.ID, template.Price1, 0, (int)eConsumerType.Marry, (int)eSubConsumerType.Marry_Gunsalute);
                    //        //0 player.CurrentMarryRoom.ReturnPacket(player, packet);
                    //        player.CurrentMarryRoom.ReturnPacketForScene(player, packet);
                    //        GSPacketIn msg = player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("GunsaluteCommand.Successed1", player.PlayerCharacter.NickName));
                    //        player.CurrentMarryRoom.SendToPlayerExceptSelfForScene(msg, player);
                    //        return true;
                    //    }
                    //    else
                    //    {
                    //        player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("GunsaluteCommand.MoneyNotEnough"));
                    //    }
                    //}
                }
            }
            return(false);
        }
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            if (client.Player == null)
                return;

            string filter = packet.ReadString(64);
            int slot = (int)packet.ReadInt();
            int skill = (int)packet.ReadInt();
            int resist = (int)packet.ReadInt();
            int bonus = (int)packet.ReadInt();
            int hp = (int)packet.ReadInt();
            int power = (int)packet.ReadInt();
            int proc = (int)packet.ReadInt();
            int qtyMin = (int)packet.ReadInt();
            int qtyMax = (int)packet.ReadInt();
            int levelMin = (int)packet.ReadInt();
            int levelMax = (int)packet.ReadInt();
            int priceMin = (int)packet.ReadInt();
            int priceMax = (int)packet.ReadInt();
            int visual = (int)packet.ReadInt();
            byte page = (byte)packet.ReadByte();
            byte unk1 = (byte)packet.ReadByte();
            short unk2 = (short)packet.ReadShort();
			if(client.Version >= GameClient.eClientVersion.Version198)
			{
				// Dunnerholl 2009-07-28 Version 1.98 introduced new options to Market search. 12 Bytes were added, but only 7 are in usage so far in my findings.
				// update this, when packets change and keep in mind, that this code reflects only the 1.98 changes
				byte armorType = page; // page is now used for the armorType (still has to be logged, i just checked that 2 means leather, 0 = standard
				byte damageType = (byte)packet.ReadByte(); // 1=crush, 2=slash, 3=thrust
				// 3 bytes unused
				packet.Skip(3);
				byte playerCrafted = (byte)packet.ReadByte(); // 1 = show only Player crafted, 0 = all
				// 3 bytes unused
				packet.Skip(3);
				page = (byte)packet.ReadByte(); // page is now sent here
				byte unknown = (byte)packet.ReadByte(); // always been 0xE5, if u page it is 0x4B, tested on alb only
				byte unknown2 = (byte)packet.ReadByte(); //always been 0x12, if u page it is 0x7C, tested on alb only
				byte unknown3 = (byte)packet.ReadByte(); //always been 0x00, if u page it is 0x1B, tested on alb only
			}
            int requestedPage = (int)page;

            int firstSlot = 0 + (requestedPage * 20);
            int lastSlot = 19 + (requestedPage * 20);

            StringBuilder sql = new StringBuilder();

            sql.Append("SlotPosition >= 1500 AND OwnerLot != 0 ");

            if (filter != null && filter != "")
                sql.Append(" AND Name LIKE '%" + filter + "%'");


			#region Slot
			if (slot != -1)
			{
				switch (slot)
				{
					case 0:
						sql.Append(" AND Item_Type = '22'");
						break;
					case 1:
						sql.Append(" AND Item_Type = '23'");
						break;
					case 2:
						sql.Append(" AND Item_Type = '21'");
						break;
					case 3:
						sql.Append(" AND Item_Type = '28'");
						break;
					case 4:
						sql.Append(" AND Item_Type = '27'");
						break;
					case 5:
						sql.Append(" AND Item_Type = '25'");
						break;
					case 6:
						sql.Append(" AND Item_Type IN (35, 36)");
						break;
					case 7:
						sql.Append(" AND Item_Type IN (33, 34)");
						break;
					case 8:
						sql.Append(" AND Item_Type = '32'");
						break;
					case 9:
						sql.Append(" AND Item_Type = '29'");
						break;
					case 10:
						sql.Append(" AND Item_Type = '26'");
						break;
					case 11:
						sql.Append(" AND Item_Type = '24'");
						break;
					case 12:
						sql.Append(" AND Item_Type IN (10, 11)");
						break;
					case 13:
						sql.Append(" AND Object_Type = '42'");
						break;
					case 14:
						sql.Append(" AND Item_Type = '12'");
						break;
					case 15:
						sql.Append(" AND Item_Type = '13'");
						break;
					case 16:
						sql.Append(" AND Item_Type = '11'");
						break;
					case 17:
						sql.Append(" AND Object_Type = '45'");
						break;
					case 18:
						sql.Append(" AND (Item_Type = '0' OR Object_Type = '0')");
						break;
				}
			}
			#endregion

			#region Bonus
			if (bonus > 0)
				sql.Append(" AND (Bonus >= '" + bonus + "')");
			#endregion

			#region Price
			if (priceMax > 0 && priceMin < priceMax)
				sql.Append(" AND (SellPrice >= '" + priceMin + "' AND SellPrice <= '" + priceMax + "')");
			#endregion

			#region Level
			if (levelMax > 0 && levelMin < levelMax)
				sql.Append(" AND (Level >= '" + levelMin + "' AND Level <= '" + levelMax + "')");
			#endregion

			#region Visual Effect
			if (visual > 0)
				sql.Append(" AND (Effect > '0')");
			#endregion

			#region Skill
			if (skill > 0)
			sql.Append(" AND (Bonus1Type = '" + skill + "' OR " +
								"Bonus2Type = '" + skill + "' OR " +
								"Bonus3Type = '" + skill + "' OR " +
								"Bonus4Type = '" + skill + "' OR " +
								"Bonus5Type = '" + skill + "' OR " +
								"Bonus6Type = '" + skill + "' OR " +
								"Bonus7Type = '" + skill + "' OR " +
								"Bonus8Type = '" + skill + "' OR " +
								"Bonus9Type = '" + skill + "' OR " +
								"Bonus10Type = '" + skill + "' OR " +
								"ExtraBonusType = '" + skill + "')");
			#endregion

			#region Resist
			if(resist > 0)
			sql.Append(" AND (Bonus1Type = '" + resist + "' OR " +
								"Bonus2Type = '" + resist + "' OR " +
								"Bonus3Type = '" + resist + "' OR " +
								"Bonus4Type = '" + resist + "' OR " +
								"Bonus5Type = '" + resist + "' OR " +
								"Bonus6Type = '" + resist + "' OR " +
								"Bonus7Type = '" + resist + "' OR " +
								"Bonus8Type = '" + resist + "' OR " +
								"Bonus9Type = '" + resist + "' OR " +
								"Bonus10Type = '" + resist + "' OR " +
								"ExtraBonusType = '" + resist + "')");
			#endregion

			#region Health
			if(hp > 0)
			sql.Append(" AND (Bonus1Type = '" + eProperty.MaxHealth + "' AND Bonus1 >= '" + hp + "' OR " +
								"Bonus2Type = '" + eProperty.MaxHealth + "' AND Bonus2 >= '" + hp + "' OR " +
								"Bonus3Type = '" + eProperty.MaxHealth + "' AND Bonus3 >= '" + hp + "' OR " +
								"Bonus4Type = '" + eProperty.MaxHealth + "' AND Bonus4 >= '" + hp + "' OR " +
								"Bonus5Type = '" + eProperty.MaxHealth + "' AND Bonus5 >= '" + hp + "' OR " +
								"Bonus6Type = '" + eProperty.MaxHealth + "' AND Bonus6 >= '" + hp + "' OR " +
								"Bonus7Type = '" + eProperty.MaxHealth + "' AND Bonus7 >= '" + hp + "' OR " +
								"Bonus8Type = '" + eProperty.MaxHealth + "' AND Bonus8 >= '" + hp + "' OR " +
								"Bonus9Type = '" + eProperty.MaxHealth + "' AND Bonus9 >= '" + hp + "' OR " +
								"Bonus10Type = '" + eProperty.MaxHealth + "' AND Bonus10 >= '" + hp + "' OR " +
								"ExtraBonusType = '" + eProperty.MaxHealth + "' AND ExtraBonus >= '" + hp + "')");
			#endregion

			#region Power
			if(power > 0)
			sql.Append(" AND (Bonus1Type = '" + eProperty.MaxMana + "' AND Bonus1 >= '" + power + "' OR " +
								"Bonus2Type = '" + eProperty.MaxMana + "' AND Bonus2 >= '" + power + "' OR " +
								"Bonus3Type = '" + eProperty.MaxMana + "' AND Bonus3 >= '" + power + "' OR " +
								"Bonus4Type = '" + eProperty.MaxMana + "' AND Bonus4 >= '" + power + "' OR " +
								"Bonus5Type = '" + eProperty.MaxMana + "' AND Bonus5 >= '" + power + "' OR " +
								"Bonus6Type = '" + eProperty.MaxMana + "' AND Bonus6 >= '" + power + "' OR " +
								"Bonus7Type = '" + eProperty.MaxMana + "' AND Bonus7 >= '" + power + "' OR " +
								"Bonus8Type = '" + eProperty.MaxMana + "' AND Bonus8 >= '" + power + "' OR " +
								"Bonus9Type = '" + eProperty.MaxMana + "' AND Bonus9 >= '" + power + "' OR " +
								"Bonus10Type = '" + eProperty.MaxMana + "' AND Bonus10 >= '" + power + "' OR " +
								"ExtraBonusType = '" + eProperty.MaxMana + "' AND ExtraBonus >= '" + power + "')");
			#endregion

			string qryString = GameServer.Database.Escape(sql.ToString());

            var items = GameServer.Database.SelectObjects<InventoryItem>(qryString);
			int itemsOnPage = page < (int)Math.Ceiling((double)items.Count / 20) ? 20 : items.Count % 20;
            if (itemsOnPage > 0)
            {
				int itemCount = items.Count;
				int pageCount = (int)Math.Ceiling((double)itemCount / 20) - 1;
				client.Player.Out.SendMarketExplorerWindow(items, page, (byte)pageCount);
                client.Player.Out.SendMessage(itemsOnPage.ToString() + " Results found for page " + (page + 1) + ".", eChatType.CT_Important, eChatLoc.CL_ChatWindow);
                client.Player.TempProperties.removeProperty(EXPLORER_LIST);
				client.Player.TempProperties.setProperty(EXPLORER_LIST, items);
            }
            else
                client.Player.Out.SendMessage("No Items found", eChatType.CT_Important, eChatLoc.CL_ChatWindow);
        }
        public override int HandlePacket(GamePlayer player, GSPacketIn packet)
        {
            SpaRoom room = null;
            string  msg  = "";
            int     id   = packet.ReadInt();
            string  pwd  = packet.ReadString();

            if (id != 0)
            {
                room = SpaRoomMgr.GetSpaRoombyID(id, (pwd == null) ? "" : pwd, ref msg);
            }
            int result;

            if (room != null)
            {
                if (room.Count >= room.Spa_Room_Info.MaxCount)
                {
                    player.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("SpaRoom.Msg1", new object[0]));
                }
                else
                {
                    if (room.Spa_Room_Info.RoomType == 1)
                    {
                        if (player.PlayerCharacter.SpaPubGoldRoomLimit <= 0)
                        {
                            player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("SpaRoomLoginHandler.Failed", new object[0]));
                            result = 0;
                            return(result);
                        }
                        if (player.PlayerCharacter.IsInSpaPubGoldToday)
                        {
                            if (SpaRoomMgr.LoginSpaRoom(player, room, msg))
                            {
                                result = 1;
                                return(result);
                            }
                            result = 0;
                            return(result);
                        }
                    }
                    else
                    {
                        if (room.Spa_Room_Info.RoomType != 2)
                        {
                            result = 1;
                            return(result);
                        }
                        if (player.PlayerCharacter.SpaPubMoneyRoomLimit <= 0)
                        {
                            player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("SpaRoomLoginHandler.Failed", new object[0]));
                            result = 0;
                            return(result);
                        }
                        if (player.PlayerCharacter.IsInSpaPubMoneyToday)
                        {
                            if (SpaRoomMgr.LoginSpaRoom(player, room, msg))
                            {
                                result = 1;
                                return(result);
                            }
                            result = 0;
                            return(result);
                        }
                    }
                    player.Out.SendSpaRoomLoginRemind(room);
                }
            }
            result = 0;
            return(result);
        }
 public int HandlePacket(GameClient client, GSPacketIn packet)
 {
     packet.ReadInt();
     return(0);
 }
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			if (client == null) return;
			uint extraID = 0;
			ushort objectType = packet.ReadShort();
			if (client.Version >= GameClient.eClientVersion.Version186)
				extraID = packet.ReadInt();
			ushort objectID = packet.ReadShort();
			string caption = "";
			var objectInfo = new List<string>();

			/*
			Type    Description         Id
			1       Inventory item      Slot (ie. 0xC for 2 handed weapon)
			2       Spell               spell level + spell line ID * 100 (starting from 0)
			3       ???
			4       Merchant item       Slot (divide by 30 to get page)
			5       Buff/effect         The buff id (each buff has a unique id)
			6       Style               style list index = ID-100-abilities count
			7       Trade window        position in trade window (starting form 0)
			8       Ability             100+position in players abilities list (?)
			9       Trainers skill      position in trainers window list
			10		Market Search		slot?
			19		Reward Quest
			 */

			ChatUtil.SendDebugMessage(client, string.Format("Delve objectType={0}, objectID={1}, extraID={2}", objectType, objectID, extraID));

			ItemTemplate item = null;
			InventoryItem invItem = null;

			switch (objectType)
			{
					#region Inventory Item
				case 1: //Display Infos on inventory item
				case 10: // market search
					{
						if (objectType == 1)
						{
							invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
							if (invItem == null)
							{
								if (client.Player.ActiveConMerchant != null)
								{
									GameConsignmentMerchant con = client.Player.ActiveConMerchant;
									invItem = con.ConInventory[objectID];
									if (invItem == null)
										return;
								}
								else if (client.Player.ActiveVault != null)
								{
									GameVault vault = client.Player.ActiveVault;
									invItem = vault.GetVaultInventory(client.Player)[objectID];
									if (invItem == null)
										return;
								}
								else
								{
									return;
								}
							}
						}
						else if (objectType == 10)
						{
							List<InventoryItem> list = client.Player.TempProperties.getProperty<object>(DOL.GS.PacketHandler.Client.v168.PlayerMarketSearchRequestHandler.EXPLORER_LIST, null) as List<InventoryItem>;
							if (list == null)
							{
								list = client.Player.TempProperties.getProperty<object>("TempSearchKey", null) as List<InventoryItem>;
								if (list == null)
									return;
							}

							if (objectID >= list.Count)
								return;

							invItem = list[objectID];

							if (invItem == null)
								return;
						}

						// Aredhel: Start of a more sophisticated item delve system.
						// The idea is to have every item inherit from an item base class,
						// this base class will provide a method
						//
						// public virtual void Delve(List<String>, GamePlayer player)
						//
						// which can be overridden in derived classes to provide additional
						// information. Same goes for spells, just add the spell delve
						// in the Delve() hierarchy. This will on one hand make this class
						// much more concise (1800 lines at the time of this writing) and
						// on the other hand the whole delve system much more flexible, for
						// example when adding new item types (artifacts, for example) you
						// provide *only* an overridden Delve() method, use the base
						// Delve() and you're done, spells, charges and everything else.

						// Let the player class create the appropriate item to delve
						caption = invItem.Name;

						if (client.Player.DelveItem<InventoryItem>(invItem, objectInfo))
							break;

						#region Old Delve

						if (invItem is InventoryArtifact)
						{
							List<String> delve = new List<String>();
							(invItem as InventoryArtifact).Delve(delve, client.Player);

							foreach (string line in delve)
								objectInfo.Add(line);

							break;
						}

						//**********************************
						//show crafter name
						//**********************************
						if (invItem.IsCrafted)
						{
							objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.CrafterName", invItem.Creator));
							objectInfo.Add(" ");
						}
						else if (invItem.Description != null && invItem.Description != "")
						{
							objectInfo.Add(invItem.Description);
							objectInfo.Add(" ");
						}

						if ((invItem.Object_Type >= (int)eObjectType.GenericWeapon) && (invItem.Object_Type <= (int)eObjectType._LastWeapon) ||
						    invItem.Object_Type == (int)eObjectType.Instrument)
						{
							WriteUsableClasses(objectInfo, invItem, client);
							WriteMagicalBonuses(objectInfo, invItem, client, false);
							WriteClassicWeaponInfos(objectInfo, invItem, client);
						}

						if (invItem.Object_Type >= (int)eObjectType.Cloth && invItem.Object_Type <= (int)eObjectType.Scale)
						{
							WriteUsableClasses(objectInfo, invItem, client);
							WriteMagicalBonuses(objectInfo, invItem, client, false);
							WriteClassicArmorInfos(objectInfo, invItem, client);
						}

						if (invItem.Object_Type == (int)eObjectType.Shield)
						{
							WriteUsableClasses(objectInfo, invItem, client);
							WriteMagicalBonuses(objectInfo, invItem, client, false);
							WriteClassicShieldInfos(objectInfo, invItem, client);
						}

						if (invItem.Object_Type == (int)eObjectType.Magical || invItem.Object_Type == (int)eObjectType.AlchemyTincture || invItem.Object_Type == (int)eObjectType.SpellcraftGem)
						{
							WriteMagicalBonuses(objectInfo, invItem, client, false);
						}

						//***********************************
						//shows info for Poison Potions
						//***********************************
						if (invItem.Object_Type == (int)eObjectType.Poison)
						{
							WritePoisonInfo(objectInfo, invItem, client);
						}

						if (invItem.Object_Type == (int)eObjectType.Magical && invItem.Item_Type == (int)eInventorySlot.FirstBackpack) // potion
						{
							WritePotionInfo(objectInfo, invItem, client);
						}
						else if (invItem.CanUseEvery > 0)
						{
							// Items with a reuse timer (aka cooldown).
							objectInfo.Add(" ");

							int minutes = invItem.CanUseEvery / 60;
							int seconds = invItem.CanUseEvery % 60;

							if (minutes == 0)
							{
								objectInfo.Add(String.Format("Can use item every: {0} sec", seconds));
							}
							else
							{
								objectInfo.Add(String.Format("Can use item every: {0}:{1:00} min", minutes, seconds));
							}

							// objectInfo.Add(String.Format("Can use item every: {0:00}:{1:00}", minutes, seconds));

							int cooldown = invItem.CanUseAgainIn;

							if (cooldown > 0)
							{
								minutes = cooldown / 60;
								seconds = cooldown % 60;

								if (minutes == 0)
								{
									objectInfo.Add(String.Format("Can use again in: {0} sec", seconds));
								}
								else
								{
									objectInfo.Add(String.Format("Can use again in: {0}:{1:00} min", minutes, seconds));
								}

								// objectInfo.Add(String.Format("Can use again in: {0:00}:{1:00}", minutes, seconds));
							}
						}

						if (!invItem.IsDropable || !invItem.IsPickable || invItem.IsIndestructible)
							objectInfo.Add(" ");

						if (!invItem.IsPickable)
							objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.CannotTraded"));

						if (!invItem.IsDropable)
							objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.CannotSold"));

						if (invItem.IsIndestructible)
							objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.CannotDestroyed"));


						if (invItem.BonusLevel > 0)
						{
							objectInfo.Add(" ");
							objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.BonusLevel", invItem.BonusLevel));

						}

						//Add admin info
						if (client.Account.PrivLevel > 1)
						{
							WriteTechnicalInfo(objectInfo, invItem);
						}

						break;

						#endregion Old Delve
					}
					#endregion
					#region Spell
				case 2: //spell
					{
						int lineID = objectID / 100;
						int spellID = objectID % 100;

						SpellLine spellLine = client.Player.GetSpellLines()[lineID] as SpellLine;
						if (spellLine == null)
							return;

						Spell spell = null;
						foreach (Spell spl in SkillBase.GetSpellList(spellLine.KeyName))
						{
							if (spl.Level == spellID)
							{
								spell = spl;
								break;
							}
						}
						if (spell == null)
							return;

						caption = spell.Name;
						WriteSpellInfo(objectInfo, spell, spellLine, client);
						break;
					}
				case 3: //spell
					{
						IList skillList = client.Player.GetNonTrainableSkillList();
						IList styles = client.Player.GetStyleList();
						int index = objectID - skillList.Count - styles.Count - 100;

						List<SpellLine> spelllines = client.Player.GetSpellLines();
						if (spelllines == null || index < 0)
							break;

						lock (client.Player.lockSpellLinesList)
						{
							Dictionary<string, KeyValuePair<Spell, SpellLine>> spelllist = client.Player.GetUsableSpells(spelllines, false);

							if (index >= spelllist.Count)
							{
								index -= spelllist.Count;
							}
							else
							{
								Dictionary<string, KeyValuePair<Spell, SpellLine>>.ValueCollection.Enumerator spellenum = spelllist.Values.GetEnumerator();
								int i = 0;
								while (spellenum.MoveNext())
								{
									if (i == index)
									{
										caption = spellenum.Current.Key.Name;
										WriteSpellInfo(objectInfo, spellenum.Current.Key, spellenum.Current.Value, client);
										break;
									}

									i++;
								}
							}
						}
						break;
					}
					#endregion
					#region Merchant / RewardQuest
				case 4: //Display Infos on Merchant objects
				case 19: //Display Info quest reward
					{
						if (objectType == 4)
						{
							GameMerchant merchant = null;
							if (client.Player.TargetObject != null && client.Player.TargetObject is GameMerchant)
								merchant = (GameMerchant)client.Player.TargetObject;
							if (merchant == null)
								return;

							int pagenumber = objectID / MerchantTradeItems.MAX_ITEM_IN_TRADEWINDOWS;
							int slotnumber = objectID % MerchantTradeItems.MAX_ITEM_IN_TRADEWINDOWS;

							item = merchant.TradeItems.GetItem(pagenumber, (eMerchantWindowSlot)slotnumber);
						}
						else if (objectType == 19)
						{
							ushort questID = (ushort)((extraID << 12) | (ushort)(objectID >> 4));
							int index = objectID & 0x0F;

							GameLiving questGiver = null;
							if (client.Player.TargetObject != null && client.Player.TargetObject is GameLiving)
								questGiver = (GameLiving)client.Player.TargetObject;

							ChatUtil.SendDebugMessage(client, "Quest ID: " + questID);

							if (questID == 0)
								return; // questID == 0, wrong ID ?
							
							if (questID <= DataQuest.DATAQUEST_CLIENTOFFSET)
							{
								AbstractQuest q = client.Player.IsDoingQuest(QuestMgr.GetQuestTypeForID(questID));

								if (q == null)
								{
									// player not doing quest, most likely on offer screen
									if (questGiver != null)
									{
										try
										{
											q = (AbstractQuest)Activator.CreateInstance(QuestMgr.GetQuestTypeForID(questID), new object[] { client.Player, 1 });
										}
										catch
										{
											// we tried!
										}
									}

									if (q == null)
									{
										ChatUtil.SendDebugMessage(client, "Can't find or create quest!");
										return;
									}
								}

								if (!(q is RewardQuest))
									return; // this is not new quest

								List<ItemTemplate> rewards = null;
								if (index < 8)
									rewards = (q as RewardQuest).Rewards.BasicItems;
								else
								{
									rewards = (q as RewardQuest).Rewards.OptionalItems;
									index -= 8;
								}
								if (rewards != null && index >= 0 && index < rewards.Count)
								{
									item = rewards[index];
								}
							}
							else // Data quest support, check for RewardQuest type
							{
								DataQuest dq = null;

								foreach (DBDataQuest d in GameObject.DataQuestCache)
								{
									if (d.ID == questID - DataQuest.DATAQUEST_CLIENTOFFSET)
									{
										dq = new DataQuest(d);
										break;
									}
								}

								if (dq != null && dq.StartType == DataQuest.eStartType.RewardQuest)
								{
									List<ItemTemplate> rewards = null;
									if (index < 8)
										rewards = dq.FinalRewards;
									else
									{
										rewards = dq.OptionalRewards;
										index -= 8;
									}
									if (rewards != null && index >= 0 && index < rewards.Count)
									{
										item = rewards[index];
									}
								}
							}

						}


						if (item == null)
							return;

						caption = item.Name;

						if (client.Player.DelveItem<ItemTemplate>(item, objectInfo))
							break;

						#region Old Delve

						// fallback to old delve

						if (item.Item_Type == (int)eInventorySlot.Horse)
						{
							WriteHorseInfo(objectInfo, item, client, "");
						}

						if ((item.Item_Type == (int)eInventorySlot.HorseBarding || item.Item_Type == (int)eInventorySlot.HorseArmor) && item.Level > 0)
						{
							objectInfo.Add(" ");//empty line
							objectInfo.Add(" ");//empty line
							objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.ChampionLevel", item.Level));
						}

						if ((item.Object_Type >= (int)eObjectType.GenericWeapon) && (item.Object_Type <= (int)eObjectType.MaulerStaff) ||
						    item.Object_Type == (int)eObjectType.Instrument)
						{
							WriteUsableClasses(objectInfo, item, client);
							WriteMagicalBonuses(objectInfo, item, client, false);
							WriteClassicWeaponInfos(objectInfo, GameInventoryItem.Create<ItemTemplate>(item), client);
						}

						if (item.Object_Type >= (int)eObjectType.Cloth && item.Object_Type <= (int)eObjectType.Scale)
						{
							WriteUsableClasses(objectInfo, item, client);
							WriteMagicalBonuses(objectInfo, item, client, false);
							WriteClassicArmorInfos(objectInfo, GameInventoryItem.Create<ItemTemplate>(item), client);
						}

						if (item.Object_Type == (int)eObjectType.Shield)
						{
							WriteUsableClasses(objectInfo, item, client);
							WriteMagicalBonuses(objectInfo, item, client, false);
							WriteClassicShieldInfos(objectInfo, item, client);
						}

						if ((item.Item_Type != (int)eInventorySlot.Horse && item.Object_Type == (int)eObjectType.Magical) || item.Object_Type == (int)eObjectType.AlchemyTincture || item.Object_Type == (int)eObjectType.SpellcraftGem)
						{
							WriteMagicalBonuses(objectInfo, item, client, false);
						}

						if (item.Object_Type == (int)eObjectType.Poison)
						{
							WritePoisonInfo(objectInfo, item, client);
						}

						if (item.Object_Type == (int)eObjectType.Magical && item.Item_Type == 40) // potion
							WritePotionInfo(objectInfo, item, client);

						//Add admin info
						if (client.Account.PrivLevel > 1)
						{
							WriteTechnicalInfo(objectInfo, GameInventoryItem.Create<ItemTemplate>(item), item.MaxDurability, item.MaxCondition);
						}
						break;

						#endregion Old Delve
					}
					#endregion
					#region Effect
				case 5: //icons on top (buffs/dots)
					{
						IGameEffect foundEffect = null;
						lock (client.Player.EffectList)
						{
							foreach (IGameEffect effect in client.Player.EffectList)
							{
								if (effect.InternalID == objectID)
								{
									foundEffect = effect;
									break;
								}
							}
						}

						if (foundEffect == null) break;

						caption = foundEffect.Name;
						objectInfo.AddRange(foundEffect.DelveInfo);

						if (client.Account.PrivLevel > 1 && foundEffect is GameSpellEffect)
						{
							if ((foundEffect as GameSpellEffect).Spell != null)
							{
								if (client.Account.PrivLevel > 1)
								{
									objectInfo.Add(" ");
									objectInfo.Add("----------Technical informations----------");
									objectInfo.Add("Line: " + ((foundEffect as GameSpellEffect).SpellHandler == null ? "unknown" : (foundEffect as GameSpellEffect).SpellHandler.SpellLine.Name));
									objectInfo.Add("SpellID: " + (foundEffect as GameSpellEffect).Spell.ID);
									objectInfo.Add("Type: " + (foundEffect as GameSpellEffect).Spell.SpellType);
									objectInfo.Add("ClientEffect: " + (foundEffect as GameSpellEffect).Spell.ClientEffect);
									objectInfo.Add("Icon: " + (foundEffect as GameSpellEffect).Spell.Icon);
									if ((foundEffect as GameSpellEffect).SpellHandler != null)
										objectInfo.Add("HasPositiveEffect: " + (foundEffect as GameSpellEffect).SpellHandler.HasPositiveEffect);
								}
							}
						}


						break;
					}
					#endregion
					#region Style
				case 6: //style
					{
						IList styleList = client.Player.GetStyleList();
						IList skillList = client.Player.GetNonTrainableSkillList();
						Style style = null;
						int styleID = objectID - skillList.Count - 100;

						if (styleID < 0 || styleID >= styleList.Count) break;

						style = styleList[styleID] as Style;
						if (style == null) break;

						caption = style.Name;

						WriteStyleInfo(objectInfo, style, client);
						break;
					}
					#endregion
					#region Trade Window
				case 7: //trade windows
					{
						ITradeWindow playerTradeWindow = client.Player.TradeWindow;
						if (playerTradeWindow == null)
							return;

						if (playerTradeWindow.PartnerTradeItems != null && objectID < playerTradeWindow.PartnerItemsCount)
							invItem = (InventoryItem)playerTradeWindow.PartnerTradeItems[objectID];

						if (invItem == null)
							return;

						// Let the player class create the appropriate item to delve
						caption = invItem.Name;

						if (client.Player.DelveItem<InventoryItem>(invItem, objectInfo))
							break;

						#region Old Delve
						// fallback to old delve

						if (invItem.Item_Type == (int)eInventorySlot.Horse)
						{
							WriteHorseInfo(objectInfo, invItem, client, "");
						}

						if ((invItem.Item_Type == (int)eInventorySlot.HorseBarding || invItem.Item_Type == (int)eInventorySlot.HorseArmor) && invItem.Level > 0)
						{
							objectInfo.Add(" ");//empty line
							objectInfo.Add(" ");//empty line
							objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.ChampionLevel", invItem.Level));
						}
						if ((invItem.Object_Type >= (int)eObjectType.GenericWeapon) && (invItem.Object_Type <= (int)eObjectType.MaulerStaff) ||
						    invItem.Object_Type == (int)eObjectType.Instrument)
						{
							WriteUsableClasses(objectInfo, invItem, client);
							WriteMagicalBonuses(objectInfo, invItem, client, false);
							WriteClassicWeaponInfos(objectInfo, invItem, client);
						}

						if (invItem.Object_Type >= (int)eObjectType.Cloth && invItem.Object_Type <= (int)eObjectType.Scale)
						{
							WriteUsableClasses(objectInfo, invItem, client);
							WriteMagicalBonuses(objectInfo, invItem, client, false);
							WriteClassicArmorInfos(objectInfo, invItem, client);
						}

						if (invItem.Object_Type == (int)eObjectType.Shield)
						{
							WriteUsableClasses(objectInfo, invItem, client);
							WriteMagicalBonuses(objectInfo, invItem, client, false);
							WriteClassicShieldInfos(objectInfo, invItem, client);
						}

						if ((invItem.Item_Type != (int)eInventorySlot.Horse && invItem.Object_Type == (int)eObjectType.Magical) || invItem.Object_Type == (int)eObjectType.AlchemyTincture || invItem.Object_Type == (int)eObjectType.SpellcraftGem)
						{
							WriteMagicalBonuses(objectInfo, invItem, client, false);
						}

						if (invItem.Object_Type == (int)eObjectType.Poison)
						{
							WritePoisonInfo(objectInfo, invItem, client);
						}

						if (invItem.Object_Type == (int)eObjectType.Magical && invItem.Item_Type == 40) // potion
							WritePotionInfo(objectInfo, invItem, client);

						//Add admin info
						if (client.Account.PrivLevel > 1)
						{
							WriteTechnicalInfo(objectInfo, invItem);
						}

						break;

						#endregion Old Delve
					}
					#endregion
					#region Ability
				case 8://abilities
					{
						int id = objectID - 100;
						IList skillList = client.Player.GetNonTrainableSkillList();
						Ability abil = (Ability)skillList[id];
						if (abil != null)
						{
							IList allabilitys = client.Player.GetAllAbilities();
							foreach (Ability checkab in allabilitys)
							{
								if (checkab.Name == abil.Name)
								{
									if (checkab.DelveInfo.Count > 0)
										objectInfo.AddRange(checkab.DelveInfo);
									else
										objectInfo.Add("There is no special information.");


								}
							}
						}
						break;
					}
					#endregion
					#region Trainer
				case 9: //trainer window "info" button
					{
						IList specList = client.Player.GetSpecList();
						Specialization spec;
						if (objectID < specList.Count)
						{
							spec = (Specialization)specList[objectID];
						}
						else
						{
							//delve on realm abilities [by Suncheck]
							if (objectID >= 50)
							{
								int clientclassID = client.Player.CharacterClass.ID;
								int sub = 50;
								List<RealmAbility> ra_list = SkillBase.GetClassRealmAbilities(clientclassID);
								Ability ra5abil = SkillBase.getClassRealmAbility(clientclassID);
								RealmAbility ab = ra_list[objectID - sub];
								if (ra5abil != null) //check if player have rr
								{
									if (client.Player.RealmPoints < 513500) //player have not rr5 abilty
										sub--;
								}
								for (int i = 0; i <= (objectID - sub); i++) //get all ra's at full level
								{
									RealmAbility raabil = ra_list[i];
									RealmAbility playerra = (RealmAbility)client.Player.GetAbility(raabil.KeyName);
									if (playerra != null)
										if (playerra.Level >= playerra.MaxLevel)
											sub--;
								}
								ab = ra_list[objectID - sub];
								if (ab != null)
								{
									caption = ab.Name;
									objectInfo.AddRange(ab.DelveInfo);
									break;
								}
							}
							caption = "Specialization not found";
							objectInfo.Add("that specialization is not found, id=" + objectID);
							break;
						}

						List<Style> styles = SkillBase.GetStyleList(spec.KeyName, client.Player.CharacterClass.ID);
						IList playerSpells = client.Player.GetSpellLines();
						SpellLine selectedSpellLine = null;

						lock (playerSpells.SyncRoot)
						{
							foreach (SpellLine line in playerSpells)
							{
								if (!line.IsBaseLine && line.Spec == spec.KeyName)
								{
									selectedSpellLine = line;
									break;
								}
							}
						}

						List<Spell> spells = new List<Spell>();
						if (selectedSpellLine != null)
							spells = SkillBase.GetSpellList(selectedSpellLine.KeyName);

						caption = spec.Name;

						if (styles.Count <= 0 && playerSpells.Count <= 0)
						{
							objectInfo.Add("no info found for this spec");
							break;
						}

						objectInfo.Add(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.LevName"));
						foreach (Style style in styles)
						{
							objectInfo.Add(style.Level + ": " + style.Name);
						}
						foreach (Spell spell in spells)
						{
							objectInfo.Add(spell.Level + ": " + spell.Name);
						}
						break;
					}
					#endregion
					#region Group
				case 12: // Item info to Group Chat
					{
						invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
						if (invItem == null) return;
						string str = LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.Item", client.Player.Name, GetShortItemInfo(invItem, client));
						if (client.Player.Group == null)
						{
							client.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.NoGroup"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						client.Player.Group.SendMessageToGroupMembers(str, eChatType.CT_Group, eChatLoc.CL_ChatWindow);
						return;
					}
					#endregion
					#region Guild
				case 13: // Item info to Guild Chat
					{
						invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
						if (invItem == null) return;
						string str = LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.GuildItem", client.Player.Name, GetShortItemInfo(invItem, client));
						if (client.Player.Guild == null)
						{
							client.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.DontBelongGuild"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						if (!client.Player.Guild.HasRank(client.Player, Guild.eRank.GcSpeak))
						{
							client.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.NoPermissionToSpeak"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						foreach (GamePlayer ply in client.Player.Guild.GetListOfOnlineMembers())
						{
							if (!client.Player.Guild.HasRank(ply, Guild.eRank.GcHear)) continue;
							ply.Out.SendMessage(str, eChatType.CT_Guild, eChatLoc.CL_ChatWindow);
						}
						return;
					}
					#endregion
					#region ChatGroup
				case 15: // Item info to Chat group
					{
						invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
						if (invItem == null) return;

						ChatGroup mychatgroup = (ChatGroup)client.Player.TempProperties.getProperty<object>(ChatGroup.CHATGROUP_PROPERTY, null);
						if (mychatgroup == null)
						{
							client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.MustBeInChatGroup"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						if (mychatgroup.Listen == true && (((bool)mychatgroup.Members[client.Player]) == false))
						{
							client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.OnlyModerator"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						string str = LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.ChatItem", client.Player.Name, GetShortItemInfo(invItem, client));
						foreach (GamePlayer ply in mychatgroup.Members.Keys)
						{
							ply.Out.SendMessage(str, eChatType.CT_Chat, eChatLoc.CL_ChatWindow);
						}
						return;
					}
					#endregion
					#region Trainer Window
					//styles
				case 20:
					{
						Style style = SkillBase.GetStyleByID((int)objectID, client.Player.CharacterClass.ID);
						if (style == null) return;

						caption = style.Name;
						WriteStyleInfo(objectInfo, style, client);
						break;
					}
					//spells
				case 22:
					{
						Spell spell = SkillBase.GetSpellByID((int)objectID);
						if (spell == null) return;

						caption = spell.Name;
						WriteSpellInfo(objectInfo, spell, SkillBase.GetSpellLine(GlobalSpellsLines.Reserved_Spells), client);
						break;
					}
					#endregion
					#region Repair
				case 100://repair
					{
						invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
						if (invItem != null)
						{
							client.Player.RepairItem(invItem);
						}
						else
						{
							client.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.VeryStrange"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
						}
						return;
					}
					#endregion
					#region Self Craft
				case 101://selfcraft
					{
						invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
						if (invItem != null)
						{
							client.Player.OpenSelfCraft(invItem);
						}
						else
						{
							client.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.VeryStrange"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
						}
						return;
					}
					#endregion
					#region Salvage
				case 102://salvage
					{
						invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
						if (invItem != null)
						{
							client.Player.SalvageItem(invItem);
						}
						else
						{
							client.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.VeryStrange"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
						}
						return;
					}
					#endregion
					#region BattleGroup
				case 103: // Item info to battle group
					{
						invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
						if (invItem == null) return;

						BattleGroup mybattlegroup = (BattleGroup)client.Player.TempProperties.getProperty<object>(BattleGroup.BATTLEGROUP_PROPERTY, null);
						if (mybattlegroup == null)
						{
							client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.MustBeInBattleGroup"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						if (mybattlegroup.Listen == true && (((bool)mybattlegroup.Members[client.Player]) == false))
						{
							client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.OnlyModerator"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						string str = LanguageMgr.GetTranslation(client, "DetailDisplayHandler.HandlePacket.ChatItem", client.Player.Name, GetShortItemInfo(invItem, client));
						foreach (GamePlayer ply in mybattlegroup.Members.Keys)
						{
							ply.Out.SendMessage(str, eChatType.CT_Chat, eChatLoc.CL_ChatWindow);
						}
						return;
					}
					#endregion
					#region ChampionAbilities delve from trainer window
				default:
					{
						// Try and handle all Champion lines, including custom lines
						ChampSpec spec = ChampSpecMgr.GetAbilityFromIndex(objectType - 150, objectID / 256 + 1, objectID % 256 + 1);
						if (spec != null)
						{
							Spell spell = SkillBase.GetSpellByID(spec.SpellID);
							if (spell != null)
							{
								SpellLine spellLine = client.Player.GetChampionSpellLine();
								if (spellLine != null)
								{
									caption = spell.Name;
									WriteSpellInfo(objectInfo, spell, spellLine, client);
								}
								else
								{
									objectInfo.Add("Champion spell line not found!");
								}
							}
						}

						break;
					}
					#endregion
			}

			if (objectInfo.Count > 0)
			{
				client.Out.SendCustomTextWindow(caption, objectInfo);
			}
			else
			{
				log.WarnFormat("DetailDisplayHandler no info for objectID {0} of type {1}. Item: {2}, client: {3}", objectID, objectType, (item == null ? (invItem == null ? "null" : invItem.Id_nb) : item.Id_nb), client);
			}
		}
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            int        num         = packet.ReadInt();
            int        num2        = packet.ReadInt();
            bool       val         = false;
            GSPacketIn gSPacketIn  = new GSPacketIn(193, client.Player.PlayerCharacter.ID);
            string     translateId = "AuctionUpdateHandler.Fail";

            if (client.Player.PlayerCharacter.HasBagPassword && client.Player.PlayerCharacter.IsLocked)
            {
                client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("Bag.Locked", new object[0]));
                return(0);
            }
            using (PlayerBussiness playerBussiness = new PlayerBussiness())
            {
                AuctionInfo auctionSingle = playerBussiness.GetAuctionSingle(num);
                if (auctionSingle == null)
                {
                    translateId = "AuctionUpdateHandler.Msg1";
                }
                else
                {
                    if (auctionSingle.PayType == 0 && num2 > client.Player.PlayerCharacter.Gold)
                    {
                        translateId = "AuctionUpdateHandler.Msg2";
                    }
                    else
                    {
                        if (auctionSingle.PayType == 1 && num2 > client.Player.PlayerCharacter.Money)
                        {
                            translateId = "AuctionUpdateHandler.Msg3";
                        }
                        else
                        {
                            if (auctionSingle.BuyerID == 0 && auctionSingle.Price > num2)
                            {
                                translateId = "AuctionUpdateHandler.Msg4";
                            }
                            else
                            {
                                if (auctionSingle.BuyerID != 0 && auctionSingle.Price + auctionSingle.Rise > num2 && (auctionSingle.Mouthful == 0 || auctionSingle.Mouthful > num2))
                                {
                                    translateId = "AuctionUpdateHandler.Msg5";
                                }
                                else
                                {
                                    int buyerID = auctionSingle.BuyerID;
                                    auctionSingle.BuyerID   = client.Player.PlayerCharacter.ID;
                                    auctionSingle.BuyerName = client.Player.PlayerCharacter.NickName;
                                    auctionSingle.Price     = num2;
                                    if (auctionSingle.Mouthful != 0 && num2 >= auctionSingle.Mouthful)
                                    {
                                        auctionSingle.Price   = auctionSingle.Mouthful;
                                        auctionSingle.IsExist = false;
                                    }
                                    if (playerBussiness.UpdateAuction(auctionSingle))
                                    {
                                        if (auctionSingle.PayType == 0)
                                        {
                                            client.Player.RemoveGold(auctionSingle.Price);
                                        }
                                        else
                                        {
                                            client.Player.RemoveMoney(auctionSingle.Price);
                                            LogMgr.LogMoneyAdd(LogMoneyType.Auction, LogMoneyType.Auction_Update, client.Player.PlayerCharacter.ID, auctionSingle.Price, client.Player.PlayerCharacter.Money, 0, 0, 0, 0, "", "", "");
                                        }
                                        if (auctionSingle.IsExist)
                                        {
                                            translateId = "AuctionUpdateHandler.Msg6";
                                        }
                                        else
                                        {
                                            translateId = "AuctionUpdateHandler.Msg7";
                                            client.Out.SendMailResponse(auctionSingle.AuctioneerID, eMailRespose.Receiver);
                                            client.Out.SendMailResponse(auctionSingle.BuyerID, eMailRespose.Receiver);
                                        }
                                        if (buyerID != 0)
                                        {
                                            client.Out.SendMailResponse(buyerID, eMailRespose.Receiver);
                                        }
                                        val = true;
                                    }
                                }
                            }
                        }
                    }
                }
                client.Out.SendAuctionRefresh(auctionSingle, num, auctionSingle != null && auctionSingle.IsExist, null);
                client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation(translateId, new object[0]));
            }
            gSPacketIn.WriteBoolean(val);
            gSPacketIn.WriteInt(num);
            client.Out.SendTCP(gSPacketIn);
            return(0);
        }
Beispiel #17
0
        public bool HandleCommand(TankHotSpringLogicProcessor process, GamePlayer player, GSPacketIn packet)
        {
            if (player.CurrentHotSpringRoom == null)
            {
                return(false);
            }
            if ((player.PlayerCharacter.ID != player.CurrentHotSpringRoom.Info.GroomID) && (player.PlayerCharacter.ID != player.CurrentHotSpringRoom.Info.playerID))
            {
                return(false);
            }
            int time = packet.ReadInt();

            string[] strArray = GameProperties.PRICE_MARRY_ROOM.Split(new char[] { ',' });
            if (strArray.Length < 3)
            {
                if (log.IsErrorEnabled)
                {
                    log.Error("HotSpringRoomCreateMoney node in configuration file is wrong");
                }
                return(false);
            }
            int num2 = 0;

            switch (time)
            {
            case 2:
                num2 = int.Parse(strArray[0]);
                break;

            case 3:
                num2 = int.Parse(strArray[1]);
                break;

            case 4:
                num2 = int.Parse(strArray[2]);
                break;

            default:
                num2 = int.Parse(strArray[2]);
                time = 4;
                break;
            }
            if (player.PlayerCharacter.Money < num2)
            {
                player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("MarryApplyHandler.Msg1", new object[0]));
                return(false);
            }
            player.RemoveMoney(num2);
            //LogMgr.LogMoneyAdd(LogMoneyType.Marry, LogMoneyType.Marry_RoomAdd, player.PlayerCharacter.ID, num2, player.PlayerCharacter.Money, 0, 0, 0, "", "", "");
            CountBussiness.InsertSystemPayCount(player.PlayerCharacter.ID, num2, 0, 0, 6);
            player.CurrentHotSpringRoom.RoomContinuation(time);
            GSPacketIn pkg      = player.Out.SendContinuation(player, player.CurrentHotSpringRoom.Info);
            int        playerId = 0;

            if (player.PlayerCharacter.ID == player.CurrentHotSpringRoom.Info.GroomID)
            {
                playerId = player.CurrentHotSpringRoom.Info.playerID;
            }
            else
            {
                playerId = player.CurrentHotSpringRoom.Info.GroomID;
            }
            GamePlayer playerById = WorldMgr.GetPlayerById(playerId);

            if (playerById != null)
            {
                playerById.Out.SendTCP(pkg);
            }
            player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("ContinuationCommand.Successed"));
            return(true);
        }
        public override int HandlePacket(GamePlayer player, GSPacketIn packet)
        {
            MarryRoom room    = null;
            string    msg     = "";
            int       id      = packet.ReadInt();
            string    pwd     = packet.ReadString();
            int       sceneID = packet.ReadInt();
            int       result;

            if (id != 0)
            {
                room = MarryRoomMgr.GetMarryRoombyID(id, (pwd == null) ? "" : pwd, ref msg);
            }
            else
            {
                if (player.PlayerCharacter.IsCreatedMarryRoom)
                {
                    MarryRoom[] rooms = MarryRoomMgr.GetAllMarryRoom();
                    MarryRoom[] array = rooms;
                    for (int i = 0; i < array.Length; i++)
                    {
                        MarryRoom r = array[i];
                        if (r.Info.GroomID == player.PlayerCharacter.ID || r.Info.BrideID == player.PlayerCharacter.ID)
                        {
                            room = r;
                            break;
                        }
                    }
                }
                if (room == null && player.PlayerCharacter.SelfMarryRoomID != 0)
                {
                    player.Out.SendMarryRoomLogin(player, false);
                    MarryRoomInfo info = null;
                    using (PlayerBussiness db = new PlayerBussiness())
                    {
                        info = db.GetMarryRoomInfoSingle(player.PlayerCharacter.SelfMarryRoomID);
                    }
                    if (info != null)
                    {
                        player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("MarryRoomLoginHandler.RoomExist", new object[]
                        {
                            info.ServerID,
                            player.PlayerCharacter.SelfMarryRoomID
                        }));
                        result = 0;
                        return(result);
                    }
                }
            }
            if (room != null)
            {
                if (room.CheckUserForbid(player.PlayerCharacter.ID))
                {
                    player.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("MarryRoomLoginHandler.Forbid", new object[0]));
                    player.Out.SendMarryRoomLogin(player, false);
                    result = 1;
                    return(result);
                }
                if (room.RoomState == eRoomState.FREE)
                {
                    if (room.AddPlayer(player))
                    {
                        player.MarryMap = sceneID;
                        GSPacketIn pkg = player.Out.SendMarryRoomLogin(player, true);
                        room.SendMarryRoomInfoUpdateToScenePlayers(room);
                        result = 0;
                        return(result);
                    }
                }
                else
                {
                    player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("MarryRoomLoginHandler.AlreadyBegin", new object[0]));
                }
                player.Out.SendMarryRoomLogin(player, false);
            }
            else
            {
                player.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation(string.IsNullOrEmpty(msg) ? "MarryRoomLoginHandler.Failed" : msg, new object[0]));
                player.Out.SendMarryRoomLogin(player, false);
            }
            result = 1;
            return(result);
        }
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            int          num  = packet.ReadInt();
            byte         b    = packet.ReadByte();
            List <int>   list = new List <int>();
            string       text = "";
            eMessageType type = eMessageType.Normal;

            if (client.Player.PlayerCharacter.HasBagPassword && client.Player.PlayerCharacter.IsLocked)
            {
                client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("Bag.Locked", new object[0]));
                return(0);
            }
            GSPacketIn gSPacketIn = new GSPacketIn(113, client.Player.PlayerCharacter.ID);

            using (PlayerBussiness playerBussiness = new PlayerBussiness())
            {
                MailInfo mailSingle = playerBussiness.GetMailSingle(client.Player.PlayerCharacter.ID, num);
                if (mailSingle != null)
                {
                    bool       flag       = true;
                    int        money      = mailSingle.Money;
                    GamePlayer playerById = WorldMgr.GetPlayerById(mailSingle.ReceiverID);
                    if (mailSingle.Type > 100 && mailSingle.Money > client.Player.PlayerCharacter.Money)
                    {
                        client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("MailGetAttachHandler.NoMoney", new object[0]));
                        return(0);
                    }
                    if (!mailSingle.IsRead)
                    {
                        mailSingle.IsRead    = true;
                        mailSingle.ValidDate = 72;
                        mailSingle.SendTime  = DateTime.Now;
                    }
                    if (flag && (b == 0 || b == 1) && !string.IsNullOrEmpty(mailSingle.Annex1) && this.GetAnnex(mailSingle.Annex1, client.Player, ref text, ref flag, ref type))
                    {
                        list.Add(1);
                        mailSingle.Annex1 = null;
                    }
                    if (flag && (b == 0 || b == 2) && !string.IsNullOrEmpty(mailSingle.Annex2) && this.GetAnnex(mailSingle.Annex2, client.Player, ref text, ref flag, ref type))
                    {
                        list.Add(2);
                        mailSingle.Annex2 = null;
                    }
                    if (flag && (b == 0 || b == 3) && !string.IsNullOrEmpty(mailSingle.Annex3) && this.GetAnnex(mailSingle.Annex3, client.Player, ref text, ref flag, ref type))
                    {
                        list.Add(3);
                        mailSingle.Annex3 = null;
                    }
                    if (flag && (b == 0 || b == 4) && !string.IsNullOrEmpty(mailSingle.Annex4) && this.GetAnnex(mailSingle.Annex4, client.Player, ref text, ref flag, ref type))
                    {
                        list.Add(4);
                        mailSingle.Annex4 = null;
                    }
                    if (flag && (b == 0 || b == 5) && !string.IsNullOrEmpty(mailSingle.Annex5) && this.GetAnnex(mailSingle.Annex5, client.Player, ref text, ref flag, ref type))
                    {
                        list.Add(5);
                        mailSingle.Annex5 = null;
                    }
                    if ((b == 0 || b == 6) && mailSingle.Gold > 0)
                    {
                        list.Add(6);
                        playerById.AddGold(mailSingle.Gold);
                        mailSingle.Gold = 0;
                    }
                    if ((b == 0 || b == 7) && mailSingle.Type < 100 && mailSingle.Money > 0)
                    {
                        list.Add(7);
                        playerById.AddMoney(mailSingle.Money);
                        LogMgr.LogMoneyAdd(LogMoneyType.Mail, LogMoneyType.Mail_Money, playerById.PlayerCharacter.ID, mailSingle.Money, playerById.PlayerCharacter.Money, 0, 0, 0, 0, "", "", "");
                        mailSingle.Money = 0;
                    }
                    if (mailSingle.Type > 100 && mailSingle.GiftToken > 0)
                    {
                        list.Add(8);
                        playerById.AddGiftToken(mailSingle.GiftToken);
                        mailSingle.GiftToken = 0;
                    }
                    if (mailSingle.Type > 100 && mailSingle.Money > 0)
                    {
                        mailSingle.Money = 0;
                        text             = LanguageMgr.GetTranslation("MailGetAttachHandler.Deduct", new object[0]) + (string.IsNullOrEmpty(text) ? LanguageMgr.GetTranslation("MailGetAttachHandler.Success", new object[0]) : text);
                    }
                    if (playerBussiness.UpdateMail(mailSingle, money) && mailSingle.Type > 100 && money > 0)
                    {
                        playerById.RemoveMoney(money);
                        LogMgr.LogMoneyAdd(LogMoneyType.Mail, LogMoneyType.Mail_Pay, client.Player.PlayerCharacter.ID, money, client.Player.PlayerCharacter.Money, 0, 0, 0, 0, "", "", "");
                        client.Out.SendMailResponse(mailSingle.SenderID, eMailRespose.Receiver);
                        client.Out.SendMailResponse(mailSingle.ReceiverID, eMailRespose.Send);
                    }
                    gSPacketIn.WriteInt(num);
                    gSPacketIn.WriteInt(list.Count);
                    foreach (int current in list)
                    {
                        gSPacketIn.WriteInt(current);
                    }
                    client.Out.SendTCP(gSPacketIn);
                    client.Out.SendMessage(type, string.IsNullOrEmpty(text) ? LanguageMgr.GetTranslation("MailGetAttachHandler.Success", new object[0]) : text);
                }
                else
                {
                    client.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("MailGetAttachHandler.Falied", new object[0]));
                }
            }
            return(0);
        }
Beispiel #20
0
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            if (client == null)
            {
                return;
            }

            string ipAddress = client.TcpEndpointAddress;

            byte   major;
            byte   minor;
            byte   build;
            string password;
            string userName;

            /// <summary>
            /// Packet Format Change above 1.115
            /// </summary>

            if (client.Version < GameClient.eClientVersion.Version1115)
            {
                packet.Skip(2);                 //Skip the client_type byte

                major    = (byte)packet.ReadByte();
                minor    = (byte)packet.ReadByte();
                build    = (byte)packet.ReadByte();
                password = packet.ReadString(20);


                bool v174;
                //the logger detection we had is no longer working
                //bool loggerUsing = false;
                switch (client.Version)
                {
                case GameClient.eClientVersion.Version168:
                case GameClient.eClientVersion.Version169:
                case GameClient.eClientVersion.Version170:
                case GameClient.eClientVersion.Version171:
                case GameClient.eClientVersion.Version172:
                case GameClient.eClientVersion.Version173:
                    v174 = false;
                    break;

                default:
                    v174 = true;
                    break;
                }

                if (v174)
                {
                    packet.Skip(11);
                }
                else
                {
                    packet.Skip(7);
                }

                uint c2 = packet.ReadInt();
                uint c3 = packet.ReadInt();
                uint c4 = packet.ReadInt();

                if (v174)
                {
                    packet.Skip(27);
                }
                else
                {
                    packet.Skip(31);
                }

                userName = packet.ReadString(20);
            }
            else if (client.Version < GameClient.eClientVersion.Version1126)             // 1.125+ only // we support 1.109 and 1.125+ only
            {
                // client type
                packet.Skip(1);

                //version
                major = (byte)packet.ReadByte();
                minor = (byte)packet.ReadByte();
                build = (byte)packet.ReadByte();

                // revision
                packet.Skip(1);
                // build
                packet.Skip(2);

                if (client.Version <= GameClient.eClientVersion.Version1124)
                {
                    userName = packet.ReadShortPascalStringLowEndian();
                    password = packet.ReadShortPascalStringLowEndian();
                }
                else
                {
                    userName = packet.ReadIntPascalStringLowEndian();
                    password = packet.ReadIntPascalStringLowEndian();
                }
            }
            else
            {
                userName = packet.ReadIntPascalStringLowEndian();
                password = packet.ReadIntPascalStringLowEndian();
            }


            /*
             * if (c2 == 0 && c3 == 0x05000000 && c4 == 0xF4000000)
             * {
             *      loggerUsing = true;
             *      Log.Warn("logger detected (" + username + ")");
             * }*/

            // check server status
            if (GameServer.Instance.ServerStatus == eGameServerStatus.GSS_Closed)
            {
                client.IsConnected = false;
                client.Out.SendLoginDenied(eLoginError.GameCurrentlyClosed);
                Log.Info(ipAddress + " disconnected because game is closed!");
                GameServer.Instance.Disconnect(client);

                return;
            }

            // check connection allowed with serverrules
            try
            {
                if (!GameServer.ServerRules.IsAllowedToConnect(client, userName))
                {
                    if (Log.IsInfoEnabled)
                    {
                        Log.Info(ipAddress + " disconnected because IsAllowedToConnect returned false!");
                    }

                    GameServer.Instance.Disconnect(client);

                    return;
                }
            }
            catch (Exception e)
            {
                if (Log.IsErrorEnabled)
                {
                    Log.Error("Error shutting down Client after IsAllowedToConnect failed!", e);
                }
            }

            // Handle connection
            EnterLock(userName);

            try
            {
                Account playerAccount;
                // Make sure that client won't quit
                lock (client)
                {
                    GameClient.eClientState state = client.ClientState;
                    if (state != GameClient.eClientState.NotConnected)
                    {
                        Log.DebugFormat("wrong client state on connect {0} {1}", userName, state.ToString());
                        return;
                    }

                    if (Log.IsInfoEnabled)
                    {
                        Log.Info(string.Format("({0})User {1} logging on! ({2} type:{3} add:{4})", ipAddress, userName, client.Version,
                                               (client.ClientType), client.ClientAddons.ToString("G")));
                    }
                    // check client already connected
                    GameClient findclient = WorldMgr.GetClientByAccountName(userName, true);
                    if (findclient != null)
                    {
                        client.IsConnected = false;

                        if (findclient.ClientState == GameClient.eClientState.Connecting)
                        {
                            if (Log.IsInfoEnabled)
                            {
                                Log.Info("User is already connecting, ignored.");
                            }

                            client.Out.SendLoginDenied(eLoginError.AccountAlreadyLoggedIn);

                            return;
                        }                         // in login

                        if (findclient.ClientState == GameClient.eClientState.Linkdead)
                        {
                            if (Log.IsInfoEnabled)
                            {
                                Log.Info("User is still being logged out from linkdeath!");
                            }

                            client.Out.SendLoginDenied(eLoginError.AccountIsInLogoutProcedure);
                        }
                        else
                        {
                            if (Log.IsInfoEnabled)
                            {
                                Log.Info("User already logged in!");
                            }

                            client.Out.SendLoginDenied(eLoginError.AccountAlreadyLoggedIn);
                        }

                        GameServer.Instance.Disconnect(client);

                        return;
                    }

                    Regex goodName = new Regex("^[a-zA-Z0-9]*$");
                    if (!goodName.IsMatch(userName) || string.IsNullOrWhiteSpace(userName))
                    {
                        if (Log.IsInfoEnabled)
                        {
                            Log.Info("Invalid symbols in account name \"" + userName + "\" found!");
                        }

                        client.IsConnected = false;
                        if (client != null && client.Out != null)
                        {
                            client.Out.SendLoginDenied(eLoginError.AccountInvalid);
                        }
                        else
                        {
                            Log.Warn("Client or Client.Out null on invalid name failure.  Disconnecting.");
                        }

                        GameServer.Instance.Disconnect(client);

                        return;
                    }
                    else
                    {
                        playerAccount = GameServer.Database.FindObjectByKey <Account>(userName);

                        client.PingTime = DateTime.Now.Ticks;

                        if (playerAccount == null)
                        {
                            //check autocreate ...

                            if (GameServer.Instance.Configuration.AutoAccountCreation && Properties.ALLOW_AUTO_ACCOUNT_CREATION)
                            {
                                // autocreate account
                                if (string.IsNullOrEmpty(password))
                                {
                                    client.IsConnected = false;
                                    client.Out.SendLoginDenied(eLoginError.AccountInvalid);
                                    GameServer.Instance.Disconnect(client);

                                    if (Log.IsInfoEnabled)
                                    {
                                        Log.Info("Account creation failed, no password set for Account: " + userName);
                                    }

                                    return;
                                }

                                // check for account bombing
                                TimeSpan ts;
                                var      allAccByIp = DOLDB <Account> .SelectObjects(DB.Column("LastLoginIP").IsEqualTo(ipAddress));

                                int totalacc = 0;
                                foreach (Account ac in allAccByIp)
                                {
                                    ts = DateTime.Now - ac.CreationDate;
                                    if (ts.TotalMinutes < Properties.TIME_BETWEEN_ACCOUNT_CREATION_SAMEIP && totalacc > 1)
                                    {
                                        Log.Warn("Account creation: too many from same IP within set minutes - " + userName + " : " + ipAddress);

                                        client.IsConnected = false;
                                        client.Out.SendLoginDenied(eLoginError.PersonalAccountIsOutOfTime);
                                        GameServer.Instance.Disconnect(client);

                                        return;
                                    }

                                    totalacc++;
                                }
                                if (totalacc >= Properties.TOTAL_ACCOUNTS_ALLOWED_SAMEIP)
                                {
                                    Log.Warn("Account creation: too many accounts created from same ip - " + userName + " : " + ipAddress);

                                    client.IsConnected = false;
                                    client.Out.SendLoginDenied(eLoginError.AccountNoAccessThisGame);
                                    GameServer.Instance.Disconnect(client);

                                    return;
                                }

                                // per timeslice - for preventing account bombing via different ip
                                if (Properties.TIME_BETWEEN_ACCOUNT_CREATION > 0)
                                {
                                    ts = DateTime.Now - m_lastAccountCreateTime;
                                    if (ts.TotalMinutes < Properties.TIME_BETWEEN_ACCOUNT_CREATION)
                                    {
                                        Log.Warn("Account creation: time between account creation too small - " + userName + " : " + ipAddress);

                                        client.IsConnected = false;
                                        client.Out.SendLoginDenied(eLoginError.PersonalAccountIsOutOfTime);
                                        GameServer.Instance.Disconnect(client);

                                        return;
                                    }
                                }

                                m_lastAccountCreateTime = DateTime.Now;

                                playerAccount                   = new Account();
                                playerAccount.Name              = userName;
                                playerAccount.Password          = CryptPassword(password);
                                playerAccount.Realm             = 0;
                                playerAccount.CreationDate      = DateTime.Now;
                                playerAccount.LastLogin         = DateTime.Now;
                                playerAccount.LastLoginIP       = ipAddress;
                                playerAccount.LastClientVersion = ((int)client.Version).ToString();
                                playerAccount.Language          = Properties.SERV_LANGUAGE;
                                playerAccount.PrivLevel         = 1;

                                if (Log.IsInfoEnabled)
                                {
                                    Log.Info("New account created: " + userName);
                                }

                                GameServer.Database.AddObject(playerAccount);

                                // Log account creation
                                AuditMgr.AddAuditEntry(client, AuditType.Account, AuditSubtype.AccountCreate, "", userName);
                            }
                            else
                            {
                                if (Log.IsInfoEnabled)
                                {
                                    Log.Info("No such account found and autocreation deactivated!");
                                }

                                client.IsConnected = false;
                                client.Out.SendLoginDenied(eLoginError.AccountNotFound);
                                GameServer.Instance.Disconnect(client);

                                return;
                            }
                        }
                        else
                        {
                            // check password
                            if (!playerAccount.Password.StartsWith("##"))
                            {
                                playerAccount.Password = CryptPassword(playerAccount.Password);
                            }

                            if (!CryptPassword(password).Equals(playerAccount.Password))
                            {
                                if (Log.IsInfoEnabled)
                                {
                                    Log.Info("(" + client.TcpEndpoint + ") Wrong password!");
                                }

                                client.IsConnected = false;
                                client.Out.SendLoginDenied(eLoginError.WrongPassword);

                                // Log failure
                                AuditMgr.AddAuditEntry(client, AuditType.Account, AuditSubtype.AccountFailedLogin, "", userName);

                                GameServer.Instance.Disconnect(client);

                                return;
                            }

                            // save player infos
                            playerAccount.LastLogin         = DateTime.Now;
                            playerAccount.LastLoginIP       = ipAddress;
                            playerAccount.LastClientVersion = ((int)client.Version).ToString();
                            if (string.IsNullOrEmpty(playerAccount.Language))
                            {
                                playerAccount.Language = Properties.SERV_LANGUAGE;
                            }

                            GameServer.Database.SaveObject(playerAccount);
                        }
                    }

                    //Save the account table
                    client.Account = playerAccount;

                    // create session ID here to disable double login bug
                    if (WorldMgr.CreateSessionID(client) < 0)
                    {
                        if (Log.IsInfoEnabled)
                        {
                            Log.InfoFormat("Too many clients connected, denied login to " + playerAccount.Name);
                        }

                        client.IsConnected = false;
                        client.Out.SendLoginDenied(eLoginError.TooManyPlayersLoggedIn);
                        client.Disconnect();

                        return;
                    }

                    client.Out.SendLoginGranted();
                    client.ClientState = GameClient.eClientState.Connecting;

                    // Log entry
                    AuditMgr.AddAuditEntry(client, AuditType.Account, AuditSubtype.AccountSuccessfulLogin, "", userName);
                }
            }
            catch (DatabaseException e)
            {
                if (Log.IsErrorEnabled)
                {
                    Log.Error("LoginRequestHandler", e);
                }

                client.IsConnected = false;
                client.Out.SendLoginDenied(eLoginError.CannotAccessUserAccount);
                GameServer.Instance.Disconnect(client);
            }
            catch (Exception e)
            {
                if (Log.IsErrorEnabled)
                {
                    Log.Error("LoginRequestHandler", e);
                }

                client.Out.SendLoginDenied(eLoginError.CannotAccessUserAccount);
                GameServer.Instance.Disconnect(client);
            }
            finally
            {
                ExitLock(userName);
            }
        }
Beispiel #21
0
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            if (!client.Player.PlayerCharacter.IsMarried)
            {
                return(1);
            }
            if (client.Player.PlayerCharacter.IsCreatedMarryRoom)
            {
                return(1);
            }
            if (client.Player.PlayerCharacter.HasBagPassword && client.Player.PlayerCharacter.IsLocked)
            {
                client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("Bag.Locked", new object[0]));
                return(0);
            }
            if (client.Player.CurrentRoom != null)
            {
                client.Player.CurrentRoom.RemovePlayerUnsafe(client.Player);
            }
            if (client.Player.CurrentMarryRoom != null)
            {
                client.Player.CurrentMarryRoom.RemovePlayer(client.Player);
            }
            MarryRoomInfo marryRoomInfo = new MarryRoomInfo();

            marryRoomInfo.Name             = packet.ReadString().Replace(";", "");
            marryRoomInfo.Pwd              = packet.ReadString();
            marryRoomInfo.MapIndex         = packet.ReadInt();
            marryRoomInfo.AvailTime        = packet.ReadInt();
            marryRoomInfo.MaxCount         = packet.ReadInt();
            marryRoomInfo.GuestInvite      = packet.ReadBoolean();
            marryRoomInfo.RoomIntroduction = packet.ReadString();
            marryRoomInfo.ServerID         = GameServer.Instance.Configuration.ServerID;
            marryRoomInfo.IsHymeneal       = false;
            string[] array = GameProperties.PRICE_MARRY_ROOM.Split(new char[]
            {
                ','
            });
            if (array.Length < 3)
            {
                if (MarryRoomCreateHandler.log.IsErrorEnabled)
                {
                    MarryRoomCreateHandler.log.Error("MarryRoomCreateMoney node in configuration file is wrong");
                }
                return(1);
            }
            int num;

            switch (marryRoomInfo.AvailTime)
            {
            case 2:
                num = int.Parse(array[0]);
                break;

            case 3:
                num = int.Parse(array[1]);
                break;

            case 4:
                num = int.Parse(array[2]);
                break;

            default:
                num = int.Parse(array[2]);
                marryRoomInfo.AvailTime = 4;
                break;
            }
            if (client.Player.PlayerCharacter.Money >= num)
            {
                MarryRoom marryRoom = MarryRoomMgr.CreateMarryRoom(client.Player, marryRoomInfo);
                if (marryRoom != null)
                {
                    client.Player.RemoveMoney(num);
                    LogMgr.LogMoneyAdd(LogMoneyType.Marry, LogMoneyType.Marry_Room, client.Player.PlayerCharacter.ID, num, client.Player.PlayerCharacter.Money, 0, 0, 0, 0, "", "", "");
                    GSPacketIn packet2 = client.Player.Out.SendMarryRoomInfo(client.Player, marryRoom);
                    client.Player.Out.SendMarryRoomLogin(client.Player, true);
                    marryRoom.SendToScenePlayer(packet2);
                    CountBussiness.InsertSystemPayCount(client.Player.PlayerCharacter.ID, num, 0, 0, 0);
                }
                return(0);
            }
            client.Player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("UserFirecrackersCommand.MoneyNotEnough", new object[0]));
            return(1);
        }
Beispiel #22
0
        public bool HandleCommand(TankHotSpringLogicProcessor process, GamePlayer player, GSPacketIn packet)
        {
            if (player.CurrentHotSpringRoom == null /*|| player.CurrentHotSpringRoom.RoomState != eRoomState.FREE*/)
            {
                return(false);
            }

            //if (player.PlayerCharacter.ID == player.CurrentHotSpringRoom.Info.GroomID || player.PlayerCharacter.ID == player.CurrentHotSpringRoom.Info.BrideID)
            //{
            //    return false;
            //}

            int num = packet.ReadInt();

            if (num > 0)
            {
                if (player.PlayerCharacter.Money >= num)
                {
                    //player.SetMoney(-num, MoneyAddType.Marry);
                    player.RemoveMoney(num);
                    LogMgr.LogMoneyAdd(LogMoneyType.Marry, LogMoneyType.Marry_Gift, player.PlayerCharacter.ID, num, player.PlayerCharacter.Money, 0, 0, 0, "", "", "");
                }
                else
                {
                    player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("UserFirecrackersCommand.MoneyNotEnough"));
                    return(false);
                }


                using (PlayerBussiness pb = new PlayerBussiness())
                {
                    string content = LanguageMgr.GetTranslation("LargessCommand.Content", player.PlayerCharacter.NickName, num / 2);
                    string title   = LanguageMgr.GetTranslation("LargessCommand.Title", player.PlayerCharacter.NickName);

                    MailInfo mail1 = new MailInfo();
                    mail1.Annex1     = "";
                    mail1.Content    = content;
                    mail1.Gold       = 0;
                    mail1.IsExist    = true;
                    mail1.Money      = num / 2;
                    mail1.Receiver   = player.CurrentHotSpringRoom.Info.BrideName;
                    mail1.ReceiverID = player.CurrentHotSpringRoom.Info.BrideID;
                    mail1.Sender     = LanguageMgr.GetTranslation("LargessCommand.Sender");
                    mail1.SenderID   = 0;
                    mail1.Title      = title;
                    mail1.Type       = (int)eMailType.Marry;
                    pb.SendMail(mail1);

                    player.Out.SendMailResponse(mail1.ReceiverID, eMailRespose.Receiver);

                    MailInfo mail2 = new MailInfo();
                    mail2.Annex1     = "";
                    mail2.Content    = content;
                    mail2.Gold       = 0;
                    mail2.IsExist    = true;
                    mail2.Money      = num / 2;
                    mail2.Receiver   = player.CurrentHotSpringRoom.Info.GroomName;
                    mail2.ReceiverID = player.CurrentHotSpringRoom.Info.GroomID;
                    mail2.Sender     = LanguageMgr.GetTranslation("LargessCommand.Sender");
                    mail2.SenderID   = 0;
                    mail2.Title      = title;
                    mail2.Type       = (int)eMailType.Marry;
                    pb.SendMail(mail2);

                    player.Out.SendMailResponse(mail2.ReceiverID, eMailRespose.Receiver);
                }

                player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("LargessCommand.Succeed"));
                GSPacketIn msg = player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("LargessCommand.Notice", player.PlayerCharacter.NickName, num));
                player.CurrentHotSpringRoom.SendToPlayerExceptSelf(msg, player);

                return(true);
            }

            return(false);
        }
Beispiel #23
0
        public void HandleGameRoomCreate(GSPacketIn pkg)
        {
            int  totalLevel      = 0;
            int  totalFightPower = 0;
            int  roomId          = pkg.ReadInt();
            int  gameType        = pkg.ReadInt();
            int  guildId         = pkg.ReadInt();
            int  areaId          = pkg.ReadInt();
            bool IsArea          = pkg.ReadBoolean();
            int  count           = pkg.ReadInt();

            IGamePlayer[] players = new IGamePlayer[count];
            for (int i = 0; i < count; i++)
            {
                PlayerInfo      info            = new PlayerInfo();
                ProxyPlayerInfo proxyPlayerInfo = new ProxyPlayerInfo();
                proxyPlayerInfo.m_AreaID   = pkg.ReadInt();
                proxyPlayerInfo.m_AreaName = pkg.ReadString();
                info.ID              = pkg.ReadInt();
                info.NickName        = pkg.ReadString();
                info.Sex             = pkg.ReadBoolean();
                info.Hide            = pkg.ReadInt();
                info.Style           = pkg.ReadString();
                info.Colors          = pkg.ReadString();
                info.Skin            = pkg.ReadString();
                info.Offer           = pkg.ReadInt();
                info.GP              = pkg.ReadInt();
                info.Grade           = pkg.ReadInt();
                info.Repute          = pkg.ReadInt();
                info.Nimbus          = pkg.ReadInt();
                info.ConsortiaID     = pkg.ReadInt();
                info.ConsortiaName   = pkg.ReadString();
                info.ConsortiaLevel  = pkg.ReadInt();
                info.ConsortiaRepute = pkg.ReadInt();
                info.Win             = pkg.ReadInt();
                info.Total           = pkg.ReadInt();
                info.Attack          = pkg.ReadInt();
                info.Defence         = pkg.ReadInt();
                info.Agility         = pkg.ReadInt();
                info.Luck            = pkg.ReadInt();
                info.FightPower      = pkg.ReadInt();
                info.IsMarried       = pkg.ReadBoolean();
                if (info.IsMarried)
                {
                    info.SpouseID   = pkg.ReadInt();
                    info.SpouseName = pkg.ReadString();
                }
                totalFightPower                      += info.FightPower;
                proxyPlayerInfo.BaseAttack            = pkg.ReadDouble();
                proxyPlayerInfo.BaseDefence           = pkg.ReadDouble();
                proxyPlayerInfo.BaseAgility           = pkg.ReadDouble();
                proxyPlayerInfo.BaseBlood             = pkg.ReadDouble();
                proxyPlayerInfo.TemplateId            = pkg.ReadInt();
                proxyPlayerInfo.CanUserProp           = pkg.ReadBoolean();
                proxyPlayerInfo.SecondWeapon          = pkg.ReadInt();
                proxyPlayerInfo.StrengthLevel         = pkg.ReadInt();
                proxyPlayerInfo.GPAddPlus             = pkg.ReadDouble();
                proxyPlayerInfo.GMExperienceRate      = pkg.ReadFloat();
                proxyPlayerInfo.AuncherExperienceRate = pkg.ReadFloat();
                proxyPlayerInfo.OfferAddPlus          = pkg.ReadDouble();
                proxyPlayerInfo.GMOfferRate           = pkg.ReadFloat();
                proxyPlayerInfo.AuncherOfferRate      = pkg.ReadFloat();
                proxyPlayerInfo.GMRichesRate          = pkg.ReadFloat();
                proxyPlayerInfo.AuncherRichesRate     = pkg.ReadFloat();
                proxyPlayerInfo.AntiAddictionRate     = pkg.ReadDouble();
                List <BufferInfo> infos = new List <BufferInfo>();
                int buffercout          = pkg.ReadInt();
                for (int j = 0; j < buffercout; j++)
                {
                    BufferInfo buffinfo = new BufferInfo();
                    buffinfo.Type      = pkg.ReadInt();
                    buffinfo.IsExist   = pkg.ReadBoolean();
                    buffinfo.BeginDate = pkg.ReadDateTime();
                    buffinfo.ValidDate = pkg.ReadInt();
                    buffinfo.Value     = pkg.ReadInt();
                    if (info != null)
                    {
                        infos.Add(buffinfo);
                    }
                }
                players[i]            = new ProxyPlayer(this, info, proxyPlayerInfo, infos);
                players[i].CanUseProp = proxyPlayerInfo.CanUserProp;
                int ec = pkg.ReadInt();
                for (int j = 0; j < ec; j++)
                {
                    players[i].EquipEffect.Add(pkg.ReadInt());
                }
                totalLevel += info.Grade;
            }
            if (players.Length != 0)
            {
                ProxyRoom room = new ProxyRoom(ProxyRoomMgr.NextRoomId(), roomId, players, this, totalLevel, totalFightPower, IsArea);
                room.GuildId  = guildId;
                room.AreaID   = areaId;
                room.GameType = (eGameType)gameType;
                ProxyRoom oldroom = null;
                Dictionary <int, ProxyRoom> rooms;
                Monitor.Enter(rooms = this.m_rooms);
                try
                {
                    if (this.m_rooms.ContainsKey(roomId))
                    {
                        oldroom = this.m_rooms[roomId];
                        this.m_rooms.Remove(roomId);
                    }
                }
                finally
                {
                    Monitor.Exit(rooms);
                }
                if (oldroom != null)
                {
                    ProxyRoomMgr.RemoveRoom(oldroom);
                }
                Monitor.Enter(rooms = this.m_rooms);
                try
                {
                    if (!this.m_rooms.ContainsKey(roomId))
                    {
                        this.m_rooms.Add(roomId, room);
                        this.SendFightRoomID(roomId, room.RoomId);
                    }
                    else
                    {
                        room = null;
                    }
                }
                finally
                {
                    Monitor.Exit(rooms);
                }
                if (room != null)
                {
                    ProxyRoomMgr.AddRoom(room);
                }
                else
                {
                    ServerClient.log.ErrorFormat("Room already exists:{0}", roomId);
                }
            }
        }
Beispiel #24
0
        public bool HandleCommand(TankMarryLogicProcessor process, GamePlayer player, GSPacketIn packet)
        {
            bool result;

            if (player.CurrentMarryRoom == null)
            {
                result = false;
            }
            else
            {
                int num = packet.ReadInt();
                if (num > 0)
                {
                    if (player.PlayerCharacter.Money >= num)
                    {
                        player.RemoveMoney(num, LogMoneyType.Marry, LogMoneyType.Marry_Gift);
                        using (PlayerBussiness pb = new PlayerBussiness())
                        {
                            string content = LanguageMgr.GetTranslation("LargessCommand.Content", new object[]
                            {
                                player.PlayerCharacter.NickName,
                                num / 2
                            });
                            string title = LanguageMgr.GetTranslation("LargessCommand.Title", new object[]
                            {
                                player.PlayerCharacter.NickName
                            });
                            MailInfo mail = new MailInfo();
                            mail.Annex1     = "";
                            mail.Content    = content;
                            mail.Gold       = 0;
                            mail.IsExist    = true;
                            mail.Money      = num / 2;
                            mail.GiftToken  = 0;
                            mail.Receiver   = player.CurrentMarryRoom.Info.BrideName;
                            mail.ReceiverID = player.CurrentMarryRoom.Info.BrideID;
                            mail.Sender     = LanguageMgr.GetTranslation("LargessCommand.Sender", new object[0]);
                            mail.SenderID   = 0;
                            mail.Title      = title;
                            mail.Type       = 14;
                            pb.SendMail(mail);
                            player.Out.SendMailResponse(mail.ReceiverID, eMailRespose.Receiver);
                            MailInfo mail2 = new MailInfo();
                            mail2.Annex1     = "";
                            mail2.Content    = content;
                            mail2.Gold       = 0;
                            mail2.IsExist    = true;
                            mail2.Money      = num / 2;
                            mail2.GiftToken  = 0;
                            mail2.Receiver   = player.CurrentMarryRoom.Info.GroomName;
                            mail2.ReceiverID = player.CurrentMarryRoom.Info.GroomID;
                            mail2.Sender     = LanguageMgr.GetTranslation("LargessCommand.Sender", new object[0]);
                            mail2.SenderID   = 0;
                            mail2.Title      = title;
                            mail2.Type       = 14;
                            pb.SendMail(mail2);
                            player.Out.SendMailResponse(mail2.ReceiverID, eMailRespose.Receiver);
                        }
                        player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("LargessCommand.Succeed", new object[0]));
                        GSPacketIn msg = player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("LargessCommand.Notice", new object[]
                        {
                            player.PlayerCharacter.NickName,
                            num
                        }));
                        player.CurrentMarryRoom.SendToPlayerExceptSelf(msg, player);
                        result = true;
                    }
                    else
                    {
                        player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("UserFirecrackersCommand.MoneyNotEnough", new object[0]));
                        result = false;
                    }
                }
                else
                {
                    result = false;
                }
            }
            return(result);
        }
        /// <summary>
        /// door index which is unique
        /// </summary>
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            var doorID = (int)packet.ReadInt();
            m_handlerDoorID = doorID;
            var doorState = (byte)packet.ReadByte();
            int doorType = doorID / 100000000;

            int radius = ServerProperties.Properties.WORLD_PICKUP_DISTANCE * 2;
            int zoneDoor = (int)(doorID / 1000000);

            string debugText = "";

            // For ToA the client always sends the same ID so we need to construct an id using the current zone
            if (client.Player.CurrentRegion.Expansion == (int)eClientExpansion.TrialsOfAtlantis)
            {
                debugText = "ToA DoorID: " + doorID + " ";

                doorID -= zoneDoor * 1000000;
                zoneDoor = client.Player.CurrentZone.ID;
                doorID += zoneDoor * 1000000;
                m_handlerDoorID = doorID;

                // experimental to handle a few odd TOA door issues
                if (client.Player.CurrentRegion.IsDungeon)
                    radius *= 4;
            }

            // debug text
            if (client.Account.PrivLevel > 1 || Properties.ENABLE_DEBUG)
            {
                if (doorType == 7)
                {
                    int ownerKeepId = (doorID / 100000) % 1000;
                    int towerNum = (doorID / 10000) % 10;
                    int keepID = ownerKeepId + towerNum * 256;
                    int componentID = (doorID / 100) % 100;
                    int doorIndex = doorID % 10;
                    client.Out.SendDebugMessage(
                        "Keep Door ID: {0} state:{1} (Owner Keep: {6} KeepID:{2} ComponentID:{3} DoorIndex:{4} TowerNumber:{5})", doorID,
                        doorState, keepID, componentID, doorIndex, towerNum, ownerKeepId);
                }
                else if (doorType == 9)
                {
                    int doorIndex = doorID - doorType * 10000000;
                    client.Out.SendDebugMessage("House DoorID:{0} state:{1} (doorType:{2} doorIndex:{3})", doorID, doorState, doorType,
                                                doorIndex);
                }
                else
                {
                    int fixture = (doorID - zoneDoor * 1000000);
                    int fixturePiece = fixture;
                    fixture /= 100;
                    fixturePiece = fixturePiece - fixture * 100;

                    client.Out.SendDebugMessage("{6}DoorID:{0} state:{1} zone:{2} fixture:{3} fixturePiece:{4} Type:{5}",
                                                doorID, doorState, zoneDoor, fixture, fixturePiece, doorType, debugText);
                }
            }

            var target = client.Player.TargetObject as GameDoor;

            if (target != null && !client.Player.IsWithinRadius(target, radius))
            {
                client.Player.Out.SendMessage("You are too far to open this door", eChatType.CT_Important, eChatLoc.CL_SystemWindow);
                return;
            }

            var door = GameServer.Database.SelectObject<DBDoor>("InternalID = '" + doorID + "'");

            if (door != null)
            {
                if (doorType == 7 || doorType == 9)
                {
                    new ChangeDoorAction(client.Player, doorID, doorState, radius).Start(1);
                    return;
                }

                if (client.Account.PrivLevel == 1)
                {
                    if (door.Locked == 0)
                    {
                        if (door.Health == 0)
                        {
                            new ChangeDoorAction(client.Player, doorID, doorState, radius).Start(1);
                            return;
                        }

                        if (GameServer.Instance.Configuration.ServerType == eGameServerType.GST_PvP)
                        {
                            if (door.Realm != 0)
                            {
                                new ChangeDoorAction(client.Player, doorID, doorState, radius).Start(1);
                                return;
                            }
                        }

                        if (GameServer.Instance.Configuration.ServerType == eGameServerType.GST_Normal)
                        {
                            if (client.Player.Realm == (eRealm)door.Realm || door.Realm == 6)
                            {
                                new ChangeDoorAction(client.Player, doorID, doorState, radius).Start(1);
                                return;
                            }
                        }
                    }
                }

                if (client.Account.PrivLevel > 1)
                {
                    client.Out.SendDebugMessage("GM: Forcing locked door open.");
                    new ChangeDoorAction(client.Player, doorID, doorState, radius).Start(1);
                    return;
                }
            }

            if (door == null)
            {
                if (doorType != 9 && client.Account.PrivLevel > 1 && client.Player.CurrentRegion.IsInstance == false)
                {
                    if (client.Player.TempProperties.getProperty(DoorMgr.WANT_TO_ADD_DOORS, false))
                    {
                        client.Player.Out.SendCustomDialog(
                            "This door is not in the database. Place yourself nearest to this door and click Accept to add it.", AddingDoor);
                    }
                    else
                    {
                        client.Player.Out.SendMessage(
                            "This door is not in the database. Use '/door show' to enable the add door dialog when targeting doors.",
                            eChatType.CT_Important, eChatLoc.CL_SystemWindow);
                    }
                }

                new ChangeDoorAction(client.Player, doorID, doorState, radius).Start(1);
                return;
            }
        }
Beispiel #26
0
        public void HandleMailResponse(GSPacketIn pkg)
        {
            int playerid = pkg.ReadInt();

            HandleUserPrivateMsg(pkg, playerid);
        }
Beispiel #27
0
        public static int countConnect = 0; public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            if (countConnect >= 3000)
            {
                client.Disconnect(); return(0);
            }

            GSPacketIn pkg = packet.Clone();

            pkg.ClearContext();

            int ItemBagType = packet.ReadInt();
            int ItemPlace   = packet.ReadInt();

            int HoleNum = packet.ReadInt();

            int GemBagType = packet.ReadInt();
            int GemPlace   = packet.ReadInt();

            ItemInfo Item = client.Player.GetItemAt((eBageType)ItemBagType, ItemPlace);

            ItemInfo Gem = client.Player.GetItemAt((eBageType)GemBagType, GemPlace);

            string BeginProperty = null;
            string AddItem       = "";

            using (ItemRecordBussiness db = new ItemRecordBussiness())
            {
                db.PropertyString(Item, ref BeginProperty);
            }

            int Glod = 2000;

            if (Item == null || Gem == null || Gem.Template.Property1 != 31)
            {
                return(0);
            }
            if (client.Player.PlayerCharacter.Gold > Glod)
            {
                string[] Hole = Item.Template.Hole.Split('|');
                if (HoleNum > 0 && HoleNum < 7)
                {
                    client.Player.RemoveGold(Glod);
                    bool result = false;
                    switch (HoleNum)
                    {
                    case 1:
                        if (Item.Hole1 >= 0)
                        {
                            string[] str = Hole[0].Split(',');

                            if (Convert.ToInt32(str[1]) == Gem.Template.Property2)
                            {
                                Item.Hole1 = Gem.TemplateID;
                                AddItem   += "," + Gem.ItemID + "," + Gem.Template.Name;
                                result     = true;
                            }
                        }
                        break;

                    case 2:
                        if (Item.Hole2 >= 0)
                        {
                            string[] str = Hole[1].Split(',');

                            if (Convert.ToInt32(str[1]) == Gem.Template.Property2)
                            {
                                Item.Hole2 = Gem.TemplateID;
                                AddItem   += "," + Gem.ItemID + "," + Gem.Template.Name;
                                result     = true;
                            }
                        }
                        break;

                    case 3:
                        if (Item.Hole3 >= 0)
                        {
                            string[] str = Hole[2].Split(',');

                            if (Convert.ToInt32(str[1]) == Gem.Template.Property2)
                            {
                                Item.Hole3 = Gem.TemplateID;
                                AddItem   += "," + Gem.ItemID + "," + Gem.Template.Name;
                                result     = true;
                            }
                        }
                        break;

                    case 4:
                        if (Item.Hole4 >= 0)
                        {
                            string[] str = Hole[3].Split(',');

                            if (Convert.ToInt32(str[1]) == Gem.Template.Property2)
                            {
                                Item.Hole4 = Gem.TemplateID;
                                AddItem   += "," + Gem.ItemID + "," + Gem.Template.Name;
                                result     = true;
                            }
                        }
                        break;

                    case 5:
                        if (Item.Hole5 >= 0)
                        {
                            string[] str = Hole[4].Split(',');

                            if (Convert.ToInt32(str[1]) == Gem.Template.Property2)
                            {
                                Item.Hole5 = Gem.TemplateID;
                                AddItem   += "," + Gem.ItemID + "," + Gem.Template.Name;
                                result     = true;
                            }
                        }
                        break;

                    case 6:
                        if (Item.Hole6 >= 0)
                        {
                            string[] str = Hole[5].Split(',');

                            if (Convert.ToInt32(str[1]) == Gem.Template.Property2)
                            {
                                Item.Hole6 = Gem.TemplateID;
                                AddItem   += "," + Gem.ItemID + "," + Gem.Template.Name;
                                result     = true;
                            }
                        }
                        break;
                    }

                    if (result)
                    {
                        //client.Player.StoreBag2.MoveToStore(client.Player.StoreBag2, 0, client.Player.MainBag.FindFirstEmptySlot(31), client.Player.MainBag, 9);
                        pkg.WriteInt(0);
                        Gem.Count--;
                        client.Player.StoreBag2.UpdateItem(Item);
                        client.Player.UpdateItem(Gem);
                        //client.Player.UpdateItem(Item);
                        //client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("ItemInlayHandle.Success", Gem.Template.Name));
                    }
                    LogMgr.LogItemAdd(client.Player.PlayerCharacter.ID, LogItemType.Insert, BeginProperty, Item, AddItem, Convert.ToInt32(result));
                }
                else
                {
                    pkg.WriteByte(1);
                    client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("ItemInlayHandle.NoPlace"));
                }
                client.Player.SendTCP(pkg);
                client.Player.SaveIntoDatabase();//保存到数据库
            }

            else
            {
                client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("UserBuyItemHandler.NoMoney"));
            }
            return(0);
        }
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            int           num      = packet.ReadInt();
            PlayerInfo    arg_12_0 = client.Player.PlayerCharacter;
            CardInventory cardBag  = client.Player.CardBag;
            string        text     = "";

            switch (num)
            {
            case 0:
            {
                int num2       = packet.ReadInt();
                int num3       = packet.ReadInt();
                int templateID = cardBag.GetItemAt(num2).TemplateID;
                if (cardBag.FindEquipCard(templateID) && num2 != num3)
                {
                    text = "Thẻ này đã trang bị!";
                }
                else
                {
                    if (num2 != num3)
                    {
                        text = "Trang bị thành công!";
                    }
                    cardBag.MoveItem(num2, num3);
                    client.Player.MainBag.UpdatePlayerProperties();
                }
                if (text != "")
                {
                    client.Out.SendMessage(eMessageType.Normal, text);
                }
                break;
            }

            case 1:
            {
                int              slot          = packet.ReadInt();
                int              count         = packet.ReadInt();
                ItemInfo         itemAt        = client.Player.MainBag.GetItemAt(slot);
                int              property      = itemAt.Template.Property5;
                int              place         = client.Player.CardBag.FindFirstEmptySlot(5);
                UsersCardInfo    usersCardInfo = new UsersCardInfo();
                CardTemplateInfo card          = CardMgr.GetCard(itemAt.Template.Property5);
                bool             flag          = false;
                if (card != null)
                {
                    if (client.Player.CardBag.FindPlaceByTamplateId(5, property) == -1)
                    {
                        usersCardInfo.CardType   = card.CardType;
                        usersCardInfo.UserID     = client.Player.PlayerCharacter.ID;
                        usersCardInfo.Place      = place;
                        usersCardInfo.TemplateID = card.CardID;
                        usersCardInfo.isFirstGet = true;
                        usersCardInfo.Attack     = 0;
                        usersCardInfo.Agility    = 0;
                        usersCardInfo.Defence    = 0;
                        usersCardInfo.Luck       = 0;
                        usersCardInfo.Damage     = 0;
                        usersCardInfo.Guard      = 0;
                        client.Player.CardBag.AddCardTo(usersCardInfo, place);
                        client.Out.SendGetCard(client.Player.PlayerCharacter, usersCardInfo);
                    }
                    else
                    {
                        flag = true;
                    }
                }
                else
                {
                    flag = true;
                }
                if (flag)
                {
                    int num4 = CardDataHander.random.Next(5, 50);
                    client.Player.AddCardSoul(num4);
                    client.Player.Out.SendPlayerCardSoul(client.Player.PlayerCharacter, true, num4);
                }
                client.Player.MainBag.RemoveCountFromStack(itemAt, count);
                break;
            }

            case 4:
            {
                int              slot2      = packet.ReadInt();
                int              count      = packet.ReadInt();
                ItemInfo         itemAt     = client.Player.PropBag.GetItemAt(slot2);
                int              id         = CardDataHander.random.Next(CardMgr.CardCount());
                CardTemplateInfo singleCard = CardMgr.GetSingleCard(id);
                bool             flag2      = false;
                if (singleCard == null)
                {
                    flag2 = true;
                }
                else
                {
                    int place2                      = client.Player.CardBag.FindFirstEmptySlot(5);
                    int cardID                      = singleCard.CardID;
                    CardTemplateInfo card2          = CardMgr.GetCard(cardID);
                    UsersCardInfo    usersCardInfo2 = new UsersCardInfo();
                    if (card2 == null)
                    {
                        flag2 = true;
                    }
                    else
                    {
                        if (client.Player.CardBag.FindPlaceByTamplateId(5, cardID) == -1)
                        {
                            usersCardInfo2.CardType   = card2.CardType;
                            usersCardInfo2.UserID     = client.Player.PlayerCharacter.ID;
                            usersCardInfo2.Place      = place2;
                            usersCardInfo2.TemplateID = card2.CardID;
                            usersCardInfo2.isFirstGet = true;
                            usersCardInfo2.Attack     = 0;
                            usersCardInfo2.Agility    = 0;
                            usersCardInfo2.Defence    = 0;
                            usersCardInfo2.Luck       = 0;
                            usersCardInfo2.Damage     = 0;
                            usersCardInfo2.Guard      = 0;
                            client.Player.CardBag.AddCardTo(usersCardInfo2, place2);
                            client.Out.SendGetCard(client.Player.PlayerCharacter, usersCardInfo2);
                        }
                        else
                        {
                            flag2 = true;
                        }
                    }
                }
                if (flag2)
                {
                    int num5 = CardDataHander.random.Next(5, 50);
                    client.Player.AddCardSoul(num5);
                    client.Player.Out.SendPlayerCardSoul(client.Player.PlayerCharacter, true, num5);
                }
                client.Player.PropBag.RemoveCountFromStack(itemAt, count);
                break;
            }
            }
            cardBag.SaveToDatabase();
            return(0);
        }
Beispiel #29
0
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            int    num  = packet.ReadInt();
            int    num2 = packet.ReadInt();
            int    num3 = packet.ReadInt();
            string text = "";
            List <UsersCardInfo> items = client.Player.CardBag.GetItems(0, 5);

            switch (num)
            {
            case 0:
                if (num3 <= client.Player.PlayerCharacter.CardSoul && num3 > 0)
                {
                    int type  = items[num2].Type;
                    int gP    = items[num2].CardGP + num3;
                    int level = CardMgr.GetLevel(gP, type);
                    int num4  = CardMgr.GetGP(level, type) - items[num2].CardGP;
                    if (level == 40)
                    {
                        num3 = num4;
                    }
                    client.Player.CardBag.UpGraceSlot(num3, level, num2);
                    client.Player.RemoveCardSoul(num3);
                    client.Player.Out.SendPlayerCardSlot(client.Player.PlayerCharacter, items[num2]);
                    client.Player.MainBag.UpdatePlayerProperties();
                }
                else
                {
                    text = "Thẻ hồn không đủ!";
                }
                break;

            case 1:
                if (client.Player.PlayerCharacter.Money >= 300)
                {
                    int num5 = 0;
                    for (int i = 0; i < items.Count; i++)
                    {
                        num5 += items[i].CardGP;
                    }
                    client.Player.CardBag.ResetCardSoul();
                    client.Player.AddCardSoul(num5);
                    text = LanguageMgr.GetTranslation("UpdateSLOT.ResetComplete", new object[]
                    {
                        num5
                    });
                    client.Player.RemoveMoney(300);
                    client.Player.Out.SendPlayerCardSlot(client.Player.PlayerCharacter, items);
                    client.Player.MainBag.UpdatePlayerProperties();
                }
                else
                {
                    text = "Xu không đủ!";
                }
                break;
            }
            if (text != "")
            {
                client.Out.SendMessage(eMessageType.Normal, text);
            }
            return(0);
        }
Beispiel #30
0
 public void HandleCommand(BaseGame game, Player player, GSPacketIn packet)
 {
     player.Direction = packet.ReadInt();
     game.SendLivingUpdateDirection(player);
 }
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            int result2;

            if (client.Player.PlayerCharacter.ConsortiaID == 0)
            {
                result2 = 0;
            }
            else
            {
                int    bagType = (int)packet.ReadByte();
                int    place   = packet.ReadInt();
                bool   result  = false;
                string msg     = "ConsortiaUpGradeHandler.Failed";
                using (ConsortiaBussiness db = new ConsortiaBussiness())
                {
                    ConsortiaInfo info = db.GetConsortiaSingle(client.Player.PlayerCharacter.ConsortiaID);
                    if (info == null)
                    {
                        msg = "ConsortiaUpGradeHandler.NoConsortia";
                    }
                    else
                    {
                        ConsortiaLevelInfo levelInfo = ConsortiaLevelMgr.FindConsortiaLevelInfo(info.Level + 1);
                        if (levelInfo == null)
                        {
                            msg = "ConsortiaUpGradeHandler.NoUpGrade";
                        }
                        else
                        {
                            if (levelInfo.NeedGold > client.Player.PlayerCharacter.Gold)
                            {
                                msg = "ConsortiaUpGradeHandler.NoGold";
                            }
                            else
                            {
                                using (ConsortiaBussiness cb = new ConsortiaBussiness())
                                {
                                    if (cb.UpGradeConsortia(client.Player.PlayerCharacter.ConsortiaID, client.Player.PlayerCharacter.ID, ref msg))
                                    {
                                        info.Level++;
                                        client.Player.RemoveGold(levelInfo.NeedGold);
                                        GameServer.Instance.LoginServer.SendConsortiaUpGrade(info);
                                        msg    = "ConsortiaUpGradeHandler.Success";
                                        result = true;
                                    }
                                }
                            }
                        }
                    }
                    if (info.Level >= 5 && info.Level <= 10)
                    {
                        string msg2 = LanguageMgr.GetTranslation("ConsortiaUpGradeHandler.Notice", new object[]
                        {
                            info.ConsortiaName,
                            info.Level
                        });
                        GSPacketIn pkg = new GSPacketIn(10);
                        pkg.WriteInt(2);
                        pkg.WriteString(msg2);
                        GameServer.Instance.LoginServer.SendPacket(pkg);
                        GamePlayer[] players = WorldMgr.GetAllPlayers();
                        GamePlayer[] array   = players;
                        for (int i = 0; i < array.Length; i++)
                        {
                            GamePlayer p = array[i];
                            if (p != client.Player && p.PlayerCharacter.ConsortiaID != client.Player.PlayerCharacter.ConsortiaID)
                            {
                                p.Out.SendTCP(pkg);
                            }
                        }
                    }
                }
                packet.WriteBoolean(result);
                packet.WriteString(LanguageMgr.GetTranslation(msg, new object[0]));
                client.Out.SendTCP(packet);
                result2 = 1;
            }
            return(result2);
        }
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
            if (client.Account.PrivLevel == (int)ePrivLevel.Player)
            {
                GameTrainer trainer = client.Player.TargetObject as DOL.GS.GameTrainer;
                if (trainer == null || (trainer.CanTrain(client.Player) == false && trainer.CanTrainChampionLevels(client.Player) == false))
                {
                    client.Out.SendMessage("You must select a valid trainer for your class.", eChatType.CT_Important, eChatLoc.CL_ChatWindow);
                    return;
                }
            }

			uint x = packet.ReadInt();
			uint y = packet.ReadInt();
			int idLine = packet.ReadByte();
			int unk = packet.ReadByte();
			int row = packet.ReadByte();
			int skillIndex = packet.ReadByte();

			// idline not null so this is a Champion level training window
			if (idLine > 0)
			{
				if (row > 0 && skillIndex > 0)
				{
					// Get Player CL Spec
					var clspec = client.Player.GetSpecList().Where(sp => sp is LiveChampionsSpecialization).Cast<LiveChampionsSpecialization>().FirstOrDefault();
					
					// check if the tree can be used
					List<Tuple<MiniLineSpecialization, List<Tuple<Skill, byte>>>> tree = null;
					if (clspec != null)
					{
						tree = clspec.GetTrainerTreeDisplay(client.Player, clspec.RetrieveTypeForIndex(idLine));
					}
					
					if (tree != null)
					{
						Tuple<byte, MiniLineSpecialization> skillstatus = clspec.GetSkillStatus(tree, row-1, skillIndex-1);

						if (skillstatus.Item1 == 1)
						{
							client.Out.SendMessage("You already have that ability!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						if (skillstatus.Item1 != 2)
						{
							client.Out.SendMessage("You do not meet the requirements for that ability!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						if (client.Player.ChampionSpecialtyPoints < 1)
						{
							client.Out.SendMessage("You do not have enough champion specialty points for that ability!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						
						skillstatus.Item2.Level++;
						client.Player.AddSpecialization(skillstatus.Item2);
						client.Player.RefreshSpecDependantSkills(false);
						client.Player.Out.SendUpdatePlayer();
						client.Player.Out.SendUpdatePoints();
						client.Player.Out.SendUpdatePlayerSkills();
						client.Player.UpdatePlayerStatus();
						client.Player.Out.SendChampionTrainerWindow(idLine);

						return;
					}
					else
					{
						client.Out.SendMessage("Could not find Champion Spec!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
						log.ErrorFormat("Could not find Champion Spec idline {0}, row {1}, skillindex {2}", idLine, row, skillIndex);
					}
				}
			}
			else
			{
				// Trainable Specs or RA's
				IList<Specialization> speclist = client.Player.GetSpecList().Where(e => e.Trainable).ToList();

				if (skillIndex < speclist.Count)
				{
					Specialization spec = (Specialization)speclist[skillIndex];
					if (spec.Level >= client.Player.BaseLevel)
					{
						client.Out.SendMessage("You can't train in this specialization again this level!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
						return;
					}

					// Graveen - autotrain 1.87 - allow players to train their AT specs even if no pts left
					int temp = client.Player.SkillSpecialtyPoints + client.Player.GetAutoTrainPoints(spec, 2);

					if (temp >= spec.Level + 1)
					{
						spec.Level++;
						client.Player.OnSkillTrained(spec);

						client.Out.SendUpdatePoints();
						client.Out.SendTrainerWindow();
						return;
					}
					else
					{
						client.Out.SendMessage("That specialization costs " + (spec.Level + 1) + " specialization points!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
						client.Out.SendMessage("You don't have that many specialization points left for this level.", eChatType.CT_System, eChatLoc.CL_SystemWindow);
						return;
					}
				}
				else if (skillIndex >= 100)
				{
					// Realm Abilities
					var raList = SkillBase.GetClassRealmAbilities(client.Player.CharacterClass.ID).Where(ra => !(ra is RR5RealmAbility));
					if (skillIndex < raList.Count() + 100)
					{
						RealmAbility ra = raList.ElementAtOrDefault(skillIndex - 100);
						if (ra != null)
						{
							ra.Level = client.Player.GetAbilityLevel(ra.KeyName);
							int cost = ra.CostForUpgrade(ra.Level);
							ra.Level++;
							
							if (client.Player.RealmSpecialtyPoints < cost)
							{
								client.Out.SendMessage(ra.Name + " costs " + (cost) + " realm ability points!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
								client.Out.SendMessage("You don't have that many realm ability points left to get this.", eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							if (!ra.CheckRequirement(client.Player))
							{
								client.Out.SendMessage("You are not experienced enough to get " + ra.Name + " now. Come back later.", eChatType.CT_System, eChatLoc.CL_SystemWindow);
								return;
							}
							
							client.Player.AddRealmAbility(ra, true);
							client.Out.SendUpdatePoints();
							client.Out.SendUpdatePlayer();
							client.Out.SendUpdatePlayerSkills();
							client.Out.SendTrainerWindow();
						}
						else
						{
							client.Out.SendMessage("Unfortunately your training failed. Please report that to admins or game master. Thank you.", eChatType.CT_System, eChatLoc.CL_SystemWindow);
							log.Error("Realm Ability " + ra.Name + "(" + ra.KeyName + ") unexpected not found");
						}
					}
				}

				if (log.IsErrorEnabled)
					log.Error("Player <" + client.Player.Name + "> requested to train incorrect skill index");
			}
		}
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            // A trainer of the appropriate class must be around (or global trainer, with TrainedClass = eCharacterClass.Unknow
            GameTrainer trainer = client.Player.TargetObject as DOL.GS.GameTrainer;
            if (trainer == null || (trainer.CanTrain(client.Player) == false && trainer.CanTrainChampionLevels(client.Player) == false))
            {
                client.Out.SendMessage("You must select a valid trainer for your class.", eChatType.CT_Important, eChatLoc.CL_ChatWindow);
                return;
            }

            //Specializations - 8 trainable specs max
            uint size = 8;
            long position = packet.Position;
            IList<uint> skills = new List<uint>();
            Dictionary<uint, uint> amounts = new Dictionary<uint, uint>();
            bool stop = false;
            for (uint i = 0; i < size; i++)
            {
                uint code = packet.ReadInt();
                if (!stop)
                {
                    if (code == 0xFFFFFFFF) stop = true;
                    else
                    {
                        if (!skills.Contains(code))
                            skills.Add(code);
                    }
                }
            }

            foreach (uint code in skills)
            {
                uint val = packet.ReadInt();

                if (!amounts.ContainsKey(code) && val > 1)
                    amounts.Add(code, val);
            }

            IList specs = client.Player.GetSpecList();
            uint skillcount = 0;
            IList<string> done = new List<string>();
            bool trained = false;

            // Graveen: the trainline command is called
            foreach (Specialization spec in specs)
            {
                if (amounts.ContainsKey(skillcount))
                {
                    if (spec.Level < amounts[skillcount])
                    {
                        TrainCommandHandler train = new TrainCommandHandler(true);
                        train.OnCommand(client, new string[] { "&trainline", spec.KeyName, amounts[skillcount].ToString() });
                        trained = true;
                    }
                }
                skillcount++;
            }

            //RealmAbilities
            packet.Seek(position + 64, System.IO.SeekOrigin.Begin);
            size = 50;//50 RA's max?
            amounts.Clear();
            for (uint i = 0; i < size; i++)
            {
                uint val = packet.ReadInt();

                if (val > 0 && !amounts.ContainsKey(i))
                {
                    amounts.Add(i, val);
                }
            }
            uint index = 0;
            if (amounts != null && amounts.Count > 0)
            {
                List<RealmAbility> ras = SkillBase.GetClassRealmAbilities(client.Player.CharacterClass.ID);
                foreach (RealmAbility ra in ras)
                {
                    if (ra is RR5RealmAbility)
                        continue;

                    if (amounts.ContainsKey(index))
                    {
                        RealmAbility playerRA = (RealmAbility)client.Player.GetAbility(ra.KeyName);
                        if (playerRA != null
                            && (playerRA.Level >= ra.MaxLevel || playerRA.Level >= amounts[index]))
                        {
                            index++;
                            continue;
                        }

                        int cost = 0;
                        for (int i = playerRA != null ? playerRA.Level : 0; i < amounts[index]; i++)
                            cost += ra.CostForUpgrade(i);
                        if (client.Player.RealmSpecialtyPoints < cost)
                        {
                            client.Out.SendMessage(ra.Name + " costs " + (cost) + " realm ability points!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                            client.Out.SendMessage("You don't have that many realm ability points left to get this.", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                            index++;
                            continue;
                        }
                        if (!ra.CheckRequirement(client.Player))
                        {
                            client.Out.SendMessage("You are not experienced enough to get " + ra.Name + " now. Come back later.", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                            index++;
                            continue;
                        }

                        bool valid = false;
                        if (playerRA != null)
                        {
                            playerRA.Level = (int)amounts[index];
                            valid = true;
                        }
                        else
                        {
                            RealmAbility ability = SkillBase.GetAbility(ra.KeyName, (int)amounts[index]) as RealmAbility;
                            if (ability != null)
                            {
                                valid = true;
                                client.Player.AddAbility(ability, false);
                            }
                        }
                        if (valid)
                        {
                            client.Player.RealmSpecialtyPoints -= cost;
                            client.Out.SendUpdatePoints();
                            client.Out.SendUpdatePlayer();
                            client.Out.SendCharResistsUpdate();
                            client.Out.SendCharStatsUpdate();
                            client.Out.SendUpdatePlayerSkills();
                            client.Out.SendTrainerWindow();
                            trained = true;
                        }
                        else
                        {
                            client.Out.SendMessage("Unfortunately your training failed. Please report that to admins or game master. Thank you.", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                        }
                    }

                    index++;
                }
            }

            if (trained)
                client.Player.SaveIntoDatabase();
        }
Beispiel #34
0
        public override int HandlePacket(GamePlayer player, GSPacketIn packet)
        {
            string msg               = "";
            bool   result            = false;
            int    re_Type           = 0;
            bool   addInfo           = false;
            int    Count             = 0;
            string PasswordTwo       = packet.ReadString();
            string PasswordTwo_new   = packet.ReadString();
            int    Type              = packet.ReadInt();
            string PasswordQuestion  = packet.ReadString();
            string PasswordAnswer    = packet.ReadString();
            string PasswordQuestion2 = packet.ReadString();
            string PasswordAnswer2   = packet.ReadString();

            switch (Type)
            {
            case 1:
                re_Type = 1;
                if (string.IsNullOrEmpty(player.PlayerCharacter.PasswordTwo))
                {
                    using (PlayerBussiness db = new PlayerBussiness())
                    {
                        if (PasswordTwo != "")
                        {
                            if (db.UpdatePasswordTwo(player.PlayerCharacter.ID, PasswordTwo))
                            {
                                player.PlayerCharacter.PasswordTwo = PasswordTwo;
                                player.PlayerCharacter.IsLocked    = false;
                                msg = "SetPassword.success";
                            }
                        }
                        if (PasswordQuestion != "" && PasswordAnswer != "" && PasswordQuestion2 != "" && PasswordAnswer2 != "")
                        {
                            if (db.UpdatePasswordInfo(player.PlayerCharacter.ID, PasswordQuestion, PasswordAnswer, PasswordQuestion2, PasswordAnswer2, 5))
                            {
                                result  = true;
                                addInfo = false;
                                msg     = "UpdatePasswordInfo.Success";
                            }
                            else
                            {
                                result = false;
                            }
                        }
                        else
                        {
                            result  = true;
                            addInfo = true;
                        }
                    }
                }
                else
                {
                    msg     = "SetPassword.Fail";
                    result  = false;
                    addInfo = false;
                }
                break;

            case 2:
                re_Type = 2;
                if (PasswordTwo == player.PlayerCharacter.PasswordTwo)
                {
                    player.PlayerCharacter.IsLocked = false;
                    msg    = "BagUnlock.success";
                    result = true;
                }
                else
                {
                    msg     = "PasswordTwo.error";
                    result  = false;
                    addInfo = false;
                }
                break;

            case 3:
                re_Type = 3;
                using (PlayerBussiness db = new PlayerBussiness())
                {
                    db.GetPasswordInfo(player.PlayerCharacter.ID, ref PasswordQuestion, ref PasswordAnswer, ref PasswordQuestion2, ref PasswordAnswer2, ref Count);
                    Count--;
                    if (Count >= 0)
                    {
                        db.UpdatePasswordInfo(player.PlayerCharacter.ID, PasswordQuestion, PasswordAnswer, PasswordQuestion2, PasswordAnswer2, Count);
                    }
                    if (PasswordTwo == player.PlayerCharacter.PasswordTwo)
                    {
                        if (db.UpdatePasswordTwo(player.PlayerCharacter.ID, PasswordTwo_new))
                        {
                            player.PlayerCharacter.IsLocked    = false;
                            player.PlayerCharacter.PasswordTwo = PasswordTwo_new;
                            msg     = "UpdatePasswordTwo.Success";
                            result  = true;
                            addInfo = false;
                        }
                        else
                        {
                            msg     = "UpdatePasswordTwo.Fail";
                            result  = false;
                            addInfo = false;
                        }
                    }
                    else
                    {
                        msg     = "UpdatePasswordTwo.Fail";
                        result  = false;
                        addInfo = false;
                    }
                }
                break;

            case 4:
            {
                re_Type = 4;
                string db_PasswordAnswer  = "";
                string PassWordTwo        = "";
                string db_PasswordAnswer2 = "";
                using (PlayerBussiness db = new PlayerBussiness())
                {
                    db.GetPasswordInfo(player.PlayerCharacter.ID, ref PasswordQuestion, ref db_PasswordAnswer, ref PasswordQuestion2, ref db_PasswordAnswer2, ref Count);
                    Count--;
                    if (Count >= 0)
                    {
                        db.UpdatePasswordInfo(player.PlayerCharacter.ID, PasswordQuestion, db_PasswordAnswer, PasswordQuestion2, db_PasswordAnswer2, Count);
                    }
                    if (db_PasswordAnswer == PasswordAnswer && db_PasswordAnswer2 == PasswordAnswer2 && db_PasswordAnswer != "" && db_PasswordAnswer2 != "")
                    {
                        if (db.UpdatePasswordTwo(player.PlayerCharacter.ID, PassWordTwo))
                        {
                            player.PlayerCharacter.PasswordTwo = PassWordTwo;
                            player.PlayerCharacter.IsLocked    = false;
                            msg     = "DeletePassword.success";
                            result  = true;
                            addInfo = false;
                        }
                        else
                        {
                            msg    = "DeletePassword.Fail";
                            result = false;
                        }
                    }
                    else
                    {
                        if (PasswordTwo == player.PlayerCharacter.PasswordTwo)
                        {
                            if (db.UpdatePasswordTwo(player.PlayerCharacter.ID, PassWordTwo))
                            {
                                player.PlayerCharacter.PasswordTwo = PassWordTwo;
                                player.PlayerCharacter.IsLocked    = false;
                                msg     = "DeletePassword.success";
                                result  = true;
                                addInfo = false;
                            }
                        }
                        else
                        {
                            msg    = "DeletePassword.Fail";
                            result = false;
                        }
                    }
                }
                break;
            }

            case 5:
                re_Type = 5;
                if (player.PlayerCharacter.PasswordTwo != null)
                {
                    if (PasswordQuestion != "" && PasswordAnswer != "" && PasswordQuestion2 != "" && PasswordAnswer2 != "")
                    {
                        using (PlayerBussiness db = new PlayerBussiness())
                        {
                            if (db.UpdatePasswordInfo(player.PlayerCharacter.ID, PasswordQuestion, PasswordAnswer, PasswordQuestion2, PasswordAnswer2, 5))
                            {
                                result  = true;
                                addInfo = false;
                                msg     = "UpdatePasswordInfo.Success";
                            }
                            else
                            {
                                result = false;
                                msg    = "";
                            }
                        }
                    }
                }
                break;
            }
            GSPacketIn pkg = packet.Clone();

            pkg.ClearContext();
            pkg.WriteInt(player.PlayerCharacter.ID);
            pkg.WriteInt(re_Type);
            pkg.WriteBoolean(result);
            pkg.WriteBoolean(addInfo);
            pkg.WriteString(LanguageMgr.GetTranslation(msg, new object[0]));
            pkg.WriteInt(Count);
            pkg.WriteString(PasswordQuestion);
            pkg.WriteString(PasswordQuestion2);
            player.Out.SendTCP(pkg);
            return(0);
        }
            /// <summary>
            /// Reads up ONE character iteration on the packet stream
            /// </summary>
            /// <param name="packet"></param>
            /// <param name="client"></param>
            public CreationCharacterData(GSPacketIn packet, GameClient client)
            {
                //unk - probably indicates customize or create (these are moved from 1.99 4 added bytes)
                if (client.Version >= GameClient.eClientVersion.Version1104)
                {
                    packet.ReadIntLowEndian();
                }

                CharName   = packet.ReadString(24);
                CustomMode = packet.ReadByte();
                EyeSize    = packet.ReadByte();
                LipSize    = packet.ReadByte();
                EyeColor   = packet.ReadByte();
                HairColor  = packet.ReadByte();
                FaceType   = packet.ReadByte();
                HairStyle  = packet.ReadByte();
                packet.Skip(3);
                MoodType = packet.ReadByte();
                packet.Skip(8);

                Operation = packet.ReadInt();
                var unk = packet.ReadByte();

                packet.Skip(24);                 //Location String
                packet.Skip(24);                 //Skip class name
                packet.Skip(24);                 //Skip race name

                var level = packet.ReadByte();   //not safe!

                Class = packet.ReadByte();
                Realm = packet.ReadByte();

                //The following byte contains
                //1bit=start location ... in ShroudedIsles you can choose ...
                //1bit=first race bit
                //1bit=unknown
                //1bit=gender (0=male, 1=female)
                //4bit=race
                byte startRaceGender = (byte)packet.ReadByte();

                Race            = (startRaceGender & 0x0F) + ((startRaceGender & 0x40) >> 2);
                Gender          = ((startRaceGender >> 4) & 0x01);
                SIStartLocation = ((startRaceGender >> 7) != 0);

                CreationModel = packet.ReadShortLowEndian();
                Region        = packet.ReadByte();
                packet.Skip(1);                 //TODO second byte of region unused currently
                packet.Skip(4);                 //TODO Unknown Int / last used?

                Strength     = packet.ReadByte();
                Dexterity    = packet.ReadByte();
                Constitution = packet.ReadByte();
                Quickness    = packet.ReadByte();
                Intelligence = packet.ReadByte();
                Piety        = packet.ReadByte();
                Empathy      = packet.ReadByte();
                Charisma     = packet.ReadByte();

                packet.Skip(40);                         //TODO equipment

                var activeRightSlot = packet.ReadByte(); // 0x9C
                var activeLeftSlot  = packet.ReadByte(); // 0x9D
                var siZone          = packet.ReadByte(); // 0x9E

                // skip 4 bytes added in 1.99
                if (client.Version >= GameClient.eClientVersion.Version199 && client.Version < GameClient.eClientVersion.Version1104)
                {
                    packet.Skip(4);
                }

                // New constitution must be read before skipping 4 bytes
                NewConstitution = packet.ReadByte();                 // 0x9F
            }
Beispiel #36
0
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			string ipAddress = client.TcpEndpointAddress;

			packet.Skip(2); //Skip the client_type byte
			var major = (byte)packet.ReadByte();
			var minor = (byte)packet.ReadByte();
			var build = (byte)packet.ReadByte();
			string password = packet.ReadString(20);

			bool v174;
			//the logger detection we had is no longer working
			//bool loggerUsing = false;
			switch (client.Version)
			{
				case GameClient.eClientVersion.Version168:
				case GameClient.eClientVersion.Version169:
				case GameClient.eClientVersion.Version170:
				case GameClient.eClientVersion.Version171:
				case GameClient.eClientVersion.Version172:
				case GameClient.eClientVersion.Version173:
					v174 = false;
					break;
				default:
					v174 = true;
					break;
			}

			if (v174)
			{
				packet.Skip(11);
			}
			else
			{
				packet.Skip(7);
			}

			uint c2 = packet.ReadInt();
			uint c3 = packet.ReadInt();
			uint c4 = packet.ReadInt();

			if (v174)
			{
				packet.Skip(27);
			}
			else
			{
				packet.Skip(31);
			}

			string userName = packet.ReadString(20);
			/*
			if (c2 == 0 && c3 == 0x05000000 && c4 == 0xF4000000)
			{
				loggerUsing = true;
				Log.Warn("logger detected (" + username + ")");
			}*/

			// check server status
			if (GameServer.Instance.ServerStatus == eGameServerStatus.GSS_Closed)
			{
				client.Out.SendLoginDenied(eLoginError.GameCurrentlyClosed);
				Log.Info(ipAddress + " disconnected because game is closed!");
				GameServer.Instance.Disconnect(client);

				return;
			}

			// check connection allowed with serverrules
			try
			{
				if (!GameServer.ServerRules.IsAllowedToConnect(client, userName))
				{
					if (Log.IsInfoEnabled)
						Log.Info(ipAddress + " disconnected because IsAllowedToConnect returned false!");

					GameServer.Instance.Disconnect(client);

					return;
				}
			}
			catch (Exception e)
			{
				if (Log.IsErrorEnabled)
					Log.Error("Error shutting down Client after IsAllowedToConnect failed!", e);
			}

			// Handle connection
			EnterLock(userName);

			try
			{
				Account playerAccount;
				// Make sure that client won't quit
				lock (client)
				{
					GameClient.eClientState state = client.ClientState;
					if (state != GameClient.eClientState.NotConnected)
					{
						Log.DebugFormat("wrong client state on connect {0} {1}", userName, state.ToString());
						return;
					}

					if (Log.IsInfoEnabled)
						Log.Info(string.Format("({0})User {1} logging on! ({2} type:{3} add:{4})", ipAddress, userName, client.Version,
											   (client.ClientType), client.ClientAddons.ToString("G")));
					// check client already connected
					GameClient findclient = WorldMgr.GetClientByAccountName(userName, true);
					if (findclient != null)
					{
						if (findclient.ClientState == GameClient.eClientState.Connecting)
						{
							if (Log.IsInfoEnabled)
								Log.Info("User is already connecting, ignored.");

							client.Out.SendLoginDenied(eLoginError.AccountAlreadyLoggedIn);

							return;
						} // in login

						if (findclient.ClientState == GameClient.eClientState.Linkdead)
						{
							if (Log.IsInfoEnabled)
								Log.Info("User is still being logged out from linkdeath!");

							client.Out.SendLoginDenied(eLoginError.AccountIsInLogoutProcedure);
						}
						else
						{
							if (Log.IsInfoEnabled)
								Log.Info("User already logged in!");

							client.Out.SendLoginDenied(eLoginError.AccountAlreadyLoggedIn);
						}

						GameServer.Instance.Disconnect(client);

						return;
					}

					bool goodname = true;
					foreach (char c in userName.ToLower())
					{
						if ((c < '0' || c > '9') && (c < 'a' || c > 'z') && client.Account.PrivLevel == (uint)ePrivLevel.Player)
						{
							goodname = false;
							break;
						}
					}

					// Yes! Stoping!
					if (!goodname)
					{
						if (Log.IsInfoEnabled)
							Log.Info("Invalid symbols in account name \"" + userName + "\" found!");

						client.Out.SendLoginDenied(eLoginError.AccountInvalid);
						GameServer.Instance.Disconnect(client);

						return;
					}
					else
					{
						playerAccount = GameServer.Database.FindObjectByKey<Account>(userName);

						client.PingTime = DateTime.Now.Ticks;

						if (playerAccount == null)
						{
							//check autocreate ...

							if (GameServer.Instance.Configuration.AutoAccountCreation && Properties.ALLOW_AUTO_ACCOUNT_CREATION)
							{
								// autocreate account
								if (string.IsNullOrEmpty(password))
								{
									client.Out.SendLoginDenied(eLoginError.AccountInvalid);
									GameServer.Instance.Disconnect(client);

									if (Log.IsInfoEnabled)
										Log.Info("Account creation failed, no password set for Account: " + userName);

									return;
								}

								// check for account bombing
								TimeSpan ts;
								IList<Account> allAccByIp = GameServer.Database.SelectObjects<Account>("LastLoginIP = '" + ipAddress + "'");
								int totalacc = 0;
								foreach (Account ac in allAccByIp)
								{
									ts = DateTime.Now - ac.CreationDate;
									if (ts.TotalMinutes < Properties.TIME_BETWEEN_ACCOUNT_CREATION_SAMEIP && totalacc > 1)
									{
										Log.Warn("Account creation: too many from same IP within set minutes - " + userName + " : " + ipAddress);

										client.Out.SendLoginDenied(eLoginError.PersonalAccountIsOutOfTime);
										GameServer.Instance.Disconnect(client);

										return;
									}

									totalacc++;
								}
								if (totalacc >= Properties.TOTAL_ACCOUNTS_ALLOWED_SAMEIP)
								{
									Log.Warn("Account creation: too many accounts created from same ip - " + userName + " : " + ipAddress);

									client.Out.SendLoginDenied(eLoginError.AccountNoAccessThisGame);
									GameServer.Instance.Disconnect(client);

									return;
								}

								// per timeslice - for preventing account bombing via different ip
								if (Properties.TIME_BETWEEN_ACCOUNT_CREATION > 0)
								{
									ts = DateTime.Now - m_lastAccountCreateTime;
									if (ts.TotalMinutes < Properties.TIME_BETWEEN_ACCOUNT_CREATION)
									{
										Log.Warn("Account creation: time between account creation too small - " + userName + " : " + ipAddress);

										client.Out.SendLoginDenied(eLoginError.PersonalAccountIsOutOfTime);
										GameServer.Instance.Disconnect(client);

										return;
									}
								}

								m_lastAccountCreateTime = DateTime.Now;

								playerAccount = new Account();
								playerAccount.Name = userName;
								playerAccount.Password = CryptPassword(password);
								playerAccount.Realm = 0;
								playerAccount.CreationDate = DateTime.Now;
								playerAccount.LastLogin = DateTime.Now;
								playerAccount.LastLoginIP = ipAddress;
								playerAccount.LastClientVersion = ((int)client.Version).ToString();
								playerAccount.Language = Properties.SERV_LANGUAGE;
								playerAccount.PrivLevel = 1;

								if (Log.IsInfoEnabled)
									Log.Info("New account created: " + userName);

								GameServer.Database.AddObject(playerAccount);

								// Log account creation
								AuditMgr.AddAuditEntry(client, AuditType.Account, AuditSubtype.AccountCreate, "", userName);
							}
							else
							{
								if (Log.IsInfoEnabled)
									Log.Info("No such account found and autocreation deactivated!");

								client.Out.SendLoginDenied(eLoginError.AccountNotFound);
								GameServer.Instance.Disconnect(client);

								return;
							}
						}
						else
						{
							// check password
							if (!playerAccount.Password.StartsWith("##"))
							{
								playerAccount.Password = CryptPassword(playerAccount.Password);
							}

							if (!CryptPassword(password).Equals(playerAccount.Password))
							{
								if (Log.IsInfoEnabled)
									Log.Info("(" + client.TcpEndpoint + ") Wrong password!");

								client.Out.SendLoginDenied(eLoginError.WrongPassword);

								// Log failure
								AuditMgr.AddAuditEntry(client, AuditType.Account, AuditSubtype.AccountFailedLogin, "", userName);

								GameServer.Instance.Disconnect(client);

								return;
							}

							// save player infos
							playerAccount.LastLogin = DateTime.Now;
							playerAccount.LastLoginIP = ipAddress;
							playerAccount.LastClientVersion = ((int)client.Version).ToString();
							if (string.IsNullOrEmpty(playerAccount.Language))
							{
								playerAccount.Language = Properties.SERV_LANGUAGE;
							}

							GameServer.Database.SaveObject(playerAccount);
						}
					}

					//Save the account table
					client.Account = playerAccount;

					// create session ID here to disable double login bug
					if (WorldMgr.CreateSessionID(client) < 0)
					{
						if (Log.IsInfoEnabled)
							Log.InfoFormat("Too many clients connected, denied login to " + playerAccount.Name);

						client.Out.SendLoginDenied(eLoginError.TooManyPlayersLoggedIn);
						client.Disconnect();

						return;
					}

					client.Out.SendLoginGranted();
					client.ClientState = GameClient.eClientState.Connecting;

					// Log entry
					AuditMgr.AddAuditEntry(client, AuditType.Account, AuditSubtype.AccountSuccessfulLogin, "", userName);
				}
			}
			catch (DatabaseException e)
			{
				if (Log.IsErrorEnabled)
					Log.Error("LoginRequestHandler", e);

				client.Out.SendLoginDenied(eLoginError.CannotAccessUserAccount);
				GameServer.Instance.Disconnect(client);
			}
			catch (Exception e)
			{
				if (Log.IsErrorEnabled)
					Log.Error("LoginRequestHandler", e);

				client.Out.SendLoginDenied(eLoginError.CannotAccessUserAccount);
				GameServer.Instance.Disconnect(client);
			}
			finally
			{
				ExitLock(userName);
			}
		}
Beispiel #37
0
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            GSPacketIn pkg = packet.Clone();

            pkg.ClearContext();
            //eBageType bagType = (eBageType)packet.ReadByte();
            int holeNum = packet.ReadInt();
            //int toplace = packet.ReadInt();
            int templateID = packet.ReadInt();
            int mustGold   = 500;

            if (client.Player.PlayerCharacter.HasBagPassword && client.Player.PlayerCharacter.IsLocked)
            {
                client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("Bag.Locked"));
                return(0);
            }
            if (client.Player.PlayerCharacter.Gold < mustGold)
            {
                client.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("ItemComposeHandler.NoMoney"));
                return(0);
            }

            PlayerInventory  storeBag = client.Player.GetInventory(eBageType.Store);
            ItemInfo         item     = storeBag.GetItemAt(0);
            ItemInfo         gem;
            ItemTemplateInfo goods = Bussiness.Managers.ItemMgr.FindItemTemplate(templateID);

            // storeBag.a
            if (goods == null)
            {
                return(11);
            }
            var result = false;

            switch (holeNum)
            {
            case 1:
                if (item.Hole1 > 0)
                {
                    item.Hole1 = 0;
                    result     = true;
                }
                break;

            case 2:
                if (item.Hole2 > 0)
                {
                    item.Hole2 = 0;
                    result     = true;
                }
                break;

            case 3:
                if (item.Hole3 > 0)
                {
                    item.Hole3 = 0;
                    result     = true;
                }
                break;

            case 4:
                if (item.Hole4 > 0)
                {
                    item.Hole4 = 0;
                    result     = true;
                }
                break;

            case 5:
                if (item.Hole5 > 0)
                {
                    item.Hole5 = 0;
                    result     = true;
                }
                break;

            case 6:
                if (item.Hole6 > 0)
                {
                    item.Hole6 = 0;
                    result     = true;
                }
                break;

            default:
                return(1);
            }
            if (result)
            {
                pkg.WriteInt(0);
                client.Player.BeginChanges();
                gem = ItemInfo.CreateFromTemplate(goods, 1, (int)ItemAddType.Buy);
                client.Player.AddItem(gem);
                client.Player.StoreBag2.UpdateItem(item);
                //client.Player.StoreBag2.MoveToStore(client.Player.StoreBag2, 0, client.Player.MainBag.FindFirstEmptySlot(31), client.Player.MainBag, 9);
                //client.Player.UpdateItem(item);
                client.Player.RemoveGold(mustGold);
                client.Player.CommitChanges();
                //client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("OK"));
            }
            else
            {
                pkg.WriteInt(1);
            }
            client.Player.SendTCP(pkg);

            client.Player.SaveIntoDatabase();//保存到数据库

            return(0);
        }
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            switch (packet.ReadInt())
            {
            case 0:
            {
                byte   roomType = packet.ReadByte();
                byte   timeType = packet.ReadByte();
                string name     = packet.ReadString();
                string password = packet.ReadString();
                RoomMgr.CreateRoom(client.Player, name, password, (eRoomType)roomType, timeType);
                break;
            }

            case 1:
            {
                packet.ReadBoolean();
                int    num    = packet.ReadInt();
                int    num2   = packet.ReadInt();
                int    roomId = -1;
                string pwd    = null;
                if (num2 == -1)
                {
                    roomId = packet.ReadInt();
                    pwd    = packet.ReadString();
                }
                if (num == 1)
                {
                    num = 0;
                }
                else
                {
                    if (num == 2)
                    {
                        num = 4;
                    }
                }
                RoomMgr.EnterRoom(client.Player, roomId, pwd, num);
                break;
            }

            case 2:
                if (client.Player.CurrentRoom != null && client.Player == client.Player.CurrentRoom.Host && !client.Player.CurrentRoom.IsPlaying)
                {
                    int       num3        = packet.ReadInt();
                    eRoomType roomType2   = (eRoomType)packet.ReadByte();
                    bool      isOpenBoss  = packet.ReadBoolean();
                    string    password2   = packet.ReadString();
                    string    roomname    = packet.ReadString();
                    byte      timeMode    = packet.ReadByte();
                    byte      hardLevel   = packet.ReadByte();
                    int       levelLimits = packet.ReadInt();
                    bool      isCrosszone = packet.ReadBoolean();
                    packet.ReadInt();
                    Console.WriteLine("=====>MapID: " + num3.ToString() + " |roomType: " + roomType2.ToString());
                    if (num3 == 0)
                    {
                        num3 = 401;                        //ME CUNG
                    }
                    RoomMgr.UpdateRoomGameType(client.Player.CurrentRoom, roomType2, timeMode, (eHardLevel)hardLevel, levelLimits, num3, password2, roomname, isCrosszone, isOpenBoss);
                    //log.Error("=====>1: " + client.Player.CurrentRoom + " |2: " + roomType2 + " |3: " + timeMode + " |4: " + (eHardLevel)hardLevel + " |5: " + levelLimits + " |6: " + num3 + " |7: " + password2 + " |8: " + roomname + " |9: " + isCrosszone + " |10: " + isOpenBoss);
                }
                break;

            case 3:
                if (client.Player.CurrentRoom != null && client.Player == client.Player.CurrentRoom.Host)
                {
                    RoomMgr.KickPlayer(client.Player.CurrentRoom, packet.ReadByte());
                }
                break;

            case 5:
                if (client.Player.CurrentRoom != null)
                {
                    RoomMgr.ExitRoom(client.Player.CurrentRoom, client.Player);
                }
                break;

            case 6:
                if (client.Player.CurrentRoom == null || client.Player.CurrentRoom.RoomType == eRoomType.Match)
                {
                    return(0);
                }
                RoomMgr.SwitchTeam(client.Player);
                break;

            case 7:
            {
                BaseRoom currentRoom = client.Player.CurrentRoom;
                if (currentRoom != null && currentRoom.Host == client.Player)
                {
                    if (client.Player.MainWeapon == null)
                    {
                        client.Player.SendMessage(LanguageMgr.GetTranslation("Game.Server.SceneGames.NoEquip", new object[0]));
                        return(0);
                    }
                    if (currentRoom.RoomType == eRoomType.Dungeon && !client.Player.IsPvePermission(currentRoom.MapId, currentRoom.HardLevel))
                    {
                        client.Player.SendMessage("Do not PvePermission enter this map!");
                        return(0);
                    }
                    RoomMgr.StartGame(client.Player.CurrentRoom);
                }
                break;
            }

            case 9:
            {
                packet.ReadInt();
                int num4 = packet.ReadInt();
                int num5 = 1011;
                if (num4 == -2)
                {
                    packet.ReadInt();
                    num5 = packet.ReadInt();
                }
                BaseRoom[]      rooms = RoomMgr.Rooms;
                List <BaseRoom> list  = new List <BaseRoom>();
                for (int i = 0; i < rooms.Length; i++)
                {
                    if (!rooms[i].IsEmpty)
                    {
                        switch (num4)
                        {
                        case 3:
                            if (rooms[i].RoomType == eRoomType.Match || rooms[i].RoomType == eRoomType.Freedom)
                            {
                                list.Add(rooms[i]);
                            }
                            break;

                        case 4:
                            if (rooms[i].RoomType == eRoomType.Match)
                            {
                                list.Add(rooms[i]);
                            }
                            break;

                        case 5:
                            if (rooms[i].RoomType == eRoomType.Freedom)
                            {
                                list.Add(rooms[i]);
                            }
                            break;

                        default:
                            if (rooms[i].RoomType == eRoomType.Dungeon)
                            {
                                switch (num5)
                                {
                                case 1007:
                                    if (rooms[i].HardLevel == eHardLevel.Simple)
                                    {
                                        list.Add(rooms[i]);
                                    }
                                    break;

                                case 1008:
                                    if (rooms[i].HardLevel == eHardLevel.Normal)
                                    {
                                        list.Add(rooms[i]);
                                    }
                                    break;

                                case 1009:
                                    if (rooms[i].HardLevel == eHardLevel.Hard)
                                    {
                                        list.Add(rooms[i]);
                                    }
                                    break;

                                case 1010:
                                    if (rooms[i].HardLevel == eHardLevel.Terror)
                                    {
                                        list.Add(rooms[i]);
                                    }
                                    break;

                                default:
                                    list.Add(rooms[i]);
                                    break;
                                }
                            }
                            break;
                        }
                    }
                }
                if (list.Count > 0)
                {
                    client.Out.SendUpdateRoomList(list);
                }
                break;
            }

            case 10:
                if (client.Player.CurrentRoom != null && client.Player == client.Player.CurrentRoom.Host)
                {
                    byte pos       = packet.ReadByte();
                    int  place     = packet.ReadInt();
                    bool isOpened  = packet.ReadBoolean();
                    int  placeView = packet.ReadInt();
                    RoomMgr.UpdateRoomPos(client.Player.CurrentRoom, (int)pos, isOpened, place, placeView);
                }
                break;

            case 11:
                if (client.Player.CurrentRoom != null && client.Player.CurrentRoom.BattleServer != null)
                {
                    client.Player.CurrentRoom.BattleServer.RemoveRoom(client.Player.CurrentRoom);
                    if (client.Player != client.Player.CurrentRoom.Host)
                    {
                        client.Player.CurrentRoom.Host.Out.SendMessage(eMessageType.ChatERROR, LanguageMgr.GetTranslation("Game.Server.SceneGames.PairUp.Failed", new object[0]));
                        RoomMgr.UpdatePlayerState(client.Player, 0);
                    }
                    else
                    {
                        RoomMgr.UpdatePlayerState(client.Player, 2);
                    }
                }
                break;

            case 12:
                packet.ReadInt();
                if (client.Player.CurrentRoom != null)
                {
                    int num6 = packet.ReadInt();
                    int num7 = num6;
                    if (num7 == 0)
                    {
                        client.Player.CurrentRoom.GameType = eGameType.Free;
                    }
                    else
                    {
                        client.Player.CurrentRoom.GameType = eGameType.Guild;
                    }
                    GSPacketIn pkg = client.Player.Out.SendRoomType(client.Player, client.Player.CurrentRoom);
                    client.Player.CurrentRoom.SendToAll(pkg, client.Player);
                }
                break;

            case 15:
                if (client.Player.MainWeapon == null)
                {
                    client.Player.SendMessage(LanguageMgr.GetTranslation("Game.Server.SceneGames.NoEquip", new object[0]));
                    return(0);
                }
                if (client.Player.CurrentRoom != null)
                {
                    RoomMgr.UpdatePlayerState(client.Player, packet.ReadByte());
                }
                break;
            }
            return(0);
        }
Beispiel #39
0
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            if (client.Player.CurrentRoom == null)
            {
                return(0);
            }


            int        id     = packet.ReadInt();
            GamePlayer player = Managers.WorldMgr.GetPlayerById(id);

            if (player == client.Player)
            {
                return(0);
            }

            List <GamePlayer> players = client.Player.CurrentRoom.GetPlayers();

            foreach (GamePlayer p in players)
            {
                if (p == player)
                {
                    client.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("friendnotinthesameserver.Sameroom"));
                    return(0);
                }
            }

            GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_INVITE);

            if (player != null && player.CurrentRoom == null)
            {
                pkg.WriteInt(client.Player.PlayerCharacter.ID);
                pkg.WriteInt(client.Player.CurrentRoom.RoomId);
                pkg.WriteInt(client.Player.CurrentRoom.MapId);
                pkg.WriteByte((byte)client.Player.CurrentRoom.TimeMode);
                pkg.WriteByte((byte)client.Player.CurrentRoom.RoomType);
                pkg.WriteByte((byte)client.Player.CurrentRoom.HardLevel);
                pkg.WriteByte((byte)client.Player.CurrentRoom.LevelLimits);
                pkg.WriteString(client.Player.PlayerCharacter.NickName);
                pkg.WriteBoolean(true);
                pkg.WriteInt(5);
                pkg.WriteString(client.Player.CurrentRoom.Name);
                pkg.WriteString(client.Player.CurrentRoom.Password);

                //TrieuLSL BN IMInvite barrierNum
                pkg.WriteInt(50);


                player.Out.SendTCP(pkg);
            }
            else
            {
                if (player != null && player.CurrentRoom != null && player.CurrentRoom != client.Player.CurrentRoom)
                {
                    client.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("friendnotinthesameserver.Room"));
                }
                else
                {
                    client.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("friendnotinthesameserver.Fail"));
                }
            }
            return(0);
        }
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            GameTrainer trainer = client.Player.TargetObject as DOL.GS.GameTrainer;
            if (trainer == null || (trainer.CanTrain(client.Player) == false && trainer.CanTrainChampionLevels(client.Player) == false))
            {
                client.Out.SendMessage("You must select a valid trainer for your class.", eChatType.CT_Important, eChatLoc.CL_ChatWindow);
                return;
            }

            uint x = packet.ReadInt();
            uint y = packet.ReadInt();
            int idLine = packet.ReadByte();
            int unk = packet.ReadByte();
            int row = packet.ReadByte();
            int skillIndex = packet.ReadByte();

            // idline not null so this is a Champion level training window
            if (idLine > 0)
            {
                if (row > 0 && skillIndex > 0)
                {
                    ChampSpec spec = ChampSpecMgr.GetAbilityFromIndex(idLine, row, skillIndex);
                    if (spec != null)
                    {
                        if (client.Player.HasChampionSpell(spec.SpellID))
                        {
                            client.Out.SendMessage("You already have that ability!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                            return;
                        }
                        if (!client.Player.CanTrainChampionSpell(idLine, row, skillIndex))
                        {
                            client.Out.SendMessage("You do not meet the requirements for that ability!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                            return;
                        }
                        if ((client.Player.ChampionSpecialtyPoints - spec.Cost) < 0)
                        {
                            client.Out.SendMessage("You do not have enough champion specialty points for that ability!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                            return;
                        }

                        client.Player.ChampionSpecialtyPoints -= spec.Cost;
                        SpellLine championPlayerSpellLine = client.Player.GetChampionSpellLine();

                        if (championPlayerSpellLine != null)
                        {
                            SkillBase.AddSpellToSpellLine(client.Player.ChampionSpellLineName, spec.SpellID);
                            client.Player.ChampionSpells += spec.SpellID.ToString() + "|1;";
                            client.Player.UpdateSpellLineLevels(false);
                            client.Player.RefreshSpecDependantSkills(true);
                            client.Out.SendMessage("You gain a Champion ability!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                            client.Out.SendChampionTrainerWindow(idLine);
                            client.Out.SendUpdatePlayerSkills();
                        }
                        else
                        {
                            client.Out.SendMessage("Could not find Champion Spell Line!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                            log.ErrorFormat("Could not find Champion Spell Line for player {0}", client.Player.Name);
                        }
                        return;
                    }
                    else
                    {
                        client.Out.SendMessage("Could not find Champion Spec!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                        log.ErrorFormat("Could not find Champion Spec idline {0}, row {1}, skillindex {2}", idLine, row, skillIndex);
                    }
                }
            }
            else
            {
                IList speclist = client.Player.GetSpecList();

                if (skillIndex < speclist.Count)
                {
                    Specialization spec = (Specialization)speclist[skillIndex];
                    if (spec.Level >= client.Player.BaseLevel)
                    {
                        client.Out.SendMessage("You can't train in this specialization again this level!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                        return;
                    }

                    // Graveen - autotrain 1.87 - allow players to train their AT specs even if no pts left
                    client.Player.SkillSpecialtyPoints += client.Player.GetAutoTrainPoints(spec, 2);

                    if (client.Player.SkillSpecialtyPoints >= spec.Level + 1)
                    {
                        client.Player.SkillSpecialtyPoints -= (ushort)(spec.Level + 1);
                        spec.Level++;
                        client.Player.OnSkillTrained(spec);

                        client.Out.SendUpdatePoints();
                        client.Out.SendTrainerWindow();
                        return;
                    }
                    else
                    {
                        client.Out.SendMessage("That specialization costs " + (spec.Level + 1) + " specialization points!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                        client.Out.SendMessage("You don't have that many specialization points left for this level.", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                        return;
                    }
                }
                else if (skillIndex >= 100)
                {
                    IList offeredRA = (IList)client.Player.TempProperties.getProperty<object>("OFFERED_RA", null);
                    if (offeredRA != null && skillIndex < offeredRA.Count + 100)
                    {
                        RealmAbility ra = (RealmAbility)offeredRA[skillIndex - 100];
                        int cost = ra.CostForUpgrade(ra.Level - 1);
                        if (client.Player.RealmSpecialtyPoints < cost)
                        {
                            client.Out.SendMessage(ra.Name + " costs " + (cost) + " realm ability points!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                            client.Out.SendMessage("You don't have that many realm ability points left to get this.", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                            return;
                        }
                        if (!ra.CheckRequirement(client.Player))
                        {
                            client.Out.SendMessage("You are not experienced enough to get " + ra.Name + " now. Come back later.", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                            return;
                        }
                        // get a copy of the ability since we use prototypes
                        RealmAbility ability = SkillBase.GetAbility(ra.KeyName, ra.Level) as RealmAbility;
                        if (ability != null)
                        {
                            client.Player.RealmSpecialtyPoints -= cost;
                            client.Player.AddAbility(ability);
                            client.Out.SendUpdatePoints();
                            client.Out.SendUpdatePlayer();
                            client.Out.SendUpdatePlayerSkills();
                            client.Out.SendTrainerWindow();
                        }
                        else
                        {
                            client.Out.SendMessage("Unfortunately your training failed. Please report that to admins or game master. Thank you.", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                            log.Error("Realm Ability " + ra.Name + "(" + ra.KeyName + ") unexpected not found");
                        }
                        return;
                    }
                }

                if (log.IsErrorEnabled)
                    log.Error("Player <" + client.Player.Name + "> requested to train incorrect skill index");
            }
        }
Beispiel #41
0
 public void HandlePing(GSPacketIn pkg)
 {
     //int playerid = pkg.ReadInt();
     Info.Online = pkg.ReadInt();
     Info.State  = ServerMgr.GetState(Info.Online, Info.Total);
 }
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			if (client == null || client.Player == null) 
				return;

			ushort objectType = packet.ReadShort();

			uint extraID = 0;
			if (client.Version >= GameClient.eClientVersion.Version186)
			{
				extraID = packet.ReadInt();
			}

			ushort objectID = packet.ReadShort();

			string caption = "";
			var objectInfo = new List<string>();

			/*
			Type    Description         Id
			1       Inventory item      Slot (ie. 0xC for 2 handed weapon)
			2       Spell               spell level + spell line ID * 100 (starting from 0)
			3       ???
			4       Merchant item       Slot (divide by 30 to get page)
			5       Buff/effect         The buff id (each buff has a unique id)
			6       Style               style list index = ID-100-abilities count
			7       Trade window        position in trade window (starting form 0)
			8       Ability             100+position in players abilities list (?)
			9       Trainers skill      position in trainers window list
			10		Market Search		slot?
			19		Reward Quest
			 */

			ChatUtil.SendDebugMessage(client, string.Format("Delve objectType={0}, objectID={1}, extraID={2}", objectType, objectID, extraID));

			ItemTemplate item = null;
			InventoryItem invItem = null;

			var snapSkills = client.Player.GetAllUsableSkills();
			var snapLists = client.Player.GetAllUsableListSpells();
			// find the first non-specialization index.
			int indexAtSpecOid = Math.Max(0, snapSkills.FindIndex(it => (it.Item1 is Specialization) == false)) + (objectID - 100);
			
			switch (objectType)
			{
					#region Inventory Item
				case 1: //Display Infos on inventory item
				case 10: // market search
					{
						if (objectType == 1)
						{
							IGameInventoryObject invObject = client.Player.TargetObject as IGameInventoryObject;

							// first try any active inventory object
							if (invItem == null)
							{
								if (client.Player.ActiveInventoryObject != null)
								{
									invObject = client.Player.ActiveInventoryObject;

									if (invObject != null && invObject.GetClientInventory(client.Player) != null)
									{
										invObject.GetClientInventory(client.Player).TryGetValue(objectID, out invItem);
									}
								}
							}

							// finally try direct inventory access
							if (invItem == null)
							{
								invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
							}

							// Failed to get any inventory
							if (invItem == null)
								return;

						}
						else if (objectType == 10)
						{
							List<InventoryItem> list = client.Player.TempProperties.getProperty<object>(MarketExplorer.EXPLORER_ITEM_LIST, null) as List<InventoryItem>;
							if (list == null)
							{
								list = client.Player.TempProperties.getProperty<object>("TempSearchKey", null) as List<InventoryItem>;
								if (list == null)
									return;
							}

							if (objectID >= list.Count)
								return;

							invItem = list[objectID];

							if (invItem == null)
								return;
						}

						// Aredhel: Start of a more sophisticated item delve system.
						// The idea is to have every item inherit from an item base class,
						// this base class will provide a method
						//
						// public virtual void Delve(List<String>, GamePlayer player)
						//
						// which can be overridden in derived classes to provide additional
						// information. Same goes for spells, just add the spell delve
						// in the Delve() hierarchy. This will on one hand make this class
						// much more concise (1800 lines at the time of this writing) and
						// on the other hand the whole delve system much more flexible, for
						// example when adding new item types (artifacts, for example) you
						// provide *only* an overridden Delve() method, use the base
						// Delve() and you're done, spells, charges and everything else.

						// Let the player class create the appropriate item to delve
						caption = invItem.Name;

						if (client.Player.DelveItem<InventoryItem>(invItem, objectInfo))
							break;

						#region Old Delve

						if (invItem is InventoryArtifact)
						{
							List<String> delve = new List<String>();
							(invItem as InventoryArtifact).Delve(delve, client.Player);

							foreach (string line in delve)
								objectInfo.Add(line);

							break;
						}

						//**********************************
						//show crafter name
						//**********************************
						if (invItem.IsCrafted)
						{
							objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.CrafterName", invItem.Creator));
							objectInfo.Add(" ");
						}
						else if (invItem.Description != null && invItem.Description != "")
						{
							objectInfo.Add(invItem.Description);
							objectInfo.Add(" ");
						}

						if ((invItem.Object_Type >= (int)eObjectType.GenericWeapon) && (invItem.Object_Type <= (int)eObjectType._LastWeapon) ||
						    invItem.Object_Type == (int)eObjectType.Instrument)
						{
							WriteUsableClasses(objectInfo, invItem, client);
							WriteMagicalBonuses(objectInfo, invItem, client, false);
							WriteClassicWeaponInfos(objectInfo, invItem, client);
						}

						if (invItem.Object_Type >= (int)eObjectType.Cloth && invItem.Object_Type <= (int)eObjectType.Scale)
						{
							WriteUsableClasses(objectInfo, invItem, client);
							WriteMagicalBonuses(objectInfo, invItem, client, false);
							WriteClassicArmorInfos(objectInfo, invItem, client);
						}

						if (invItem.Object_Type == (int)eObjectType.Shield)
						{
							WriteUsableClasses(objectInfo, invItem, client);
							WriteMagicalBonuses(objectInfo, invItem, client, false);
							WriteClassicShieldInfos(objectInfo, invItem, client);
						}

						if (invItem.Object_Type == (int)eObjectType.Magical || invItem.Object_Type == (int)eObjectType.AlchemyTincture || invItem.Object_Type == (int)eObjectType.SpellcraftGem)
						{
							WriteMagicalBonuses(objectInfo, invItem, client, false);
						}

						//***********************************
						//shows info for Poison Potions
						//***********************************
						if (invItem.Object_Type == (int)eObjectType.Poison)
						{
							WritePoisonInfo(objectInfo, invItem, client);
						}

						if (invItem.Object_Type == (int)eObjectType.Magical && invItem.Item_Type == (int)eInventorySlot.FirstBackpack) // potion
						{
							WritePotionInfo(objectInfo, invItem, client);
						}
						else if (invItem.CanUseEvery > 0)
						{
							// Items with a reuse timer (aka cooldown).
							objectInfo.Add(" ");

							int minutes = invItem.CanUseEvery / 60;
							int seconds = invItem.CanUseEvery % 60;

							if (minutes == 0)
							{
								objectInfo.Add(String.Format("Can use item every: {0} sec", seconds));
							}
							else
							{
								objectInfo.Add(String.Format("Can use item every: {0}:{1:00} min", minutes, seconds));
							}

							// objectInfo.Add(String.Format("Can use item every: {0:00}:{1:00}", minutes, seconds));

							int cooldown = invItem.CanUseAgainIn;

							if (cooldown > 0)
							{
								minutes = cooldown / 60;
								seconds = cooldown % 60;

								if (minutes == 0)
								{
									objectInfo.Add(String.Format("Can use again in: {0} sec", seconds));
								}
								else
								{
									objectInfo.Add(String.Format("Can use again in: {0}:{1:00} min", minutes, seconds));
								}

								// objectInfo.Add(String.Format("Can use again in: {0:00}:{1:00}", minutes, seconds));
							}
						}

						if (!invItem.IsDropable || !invItem.IsPickable || invItem.IsIndestructible)
							objectInfo.Add(" ");

						if (!invItem.IsPickable)
							objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.CannotTraded"));

						if (!invItem.IsDropable)
							objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.CannotSold"));

						if (invItem.IsIndestructible)
							objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.CannotDestroyed"));


						if (invItem.BonusLevel > 0)
						{
							objectInfo.Add(" ");
							objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.BonusLevel", invItem.BonusLevel));

						}

						//Add admin info
						if (client.Account.PrivLevel > 1)
						{
							WriteTechnicalInfo(objectInfo, client, invItem);
						}

						break;

						#endregion Old Delve
					}
					#endregion
					#region Spell
				case 2: //spell List
					{
						int lineID = objectID / 100;
						int spellID = objectID % 100;

						Skill sk = null;
						SpellLine sl = null;
						
						// is spelline in index ?
						if (lineID < snapLists.Count)
						{
							int index = snapLists[lineID].Item2.FindIndex(s => s is Spell ? 
							                                                   s.Level == spellID 
							                                                   : (s is Styles.Style ? ((Styles.Style)s).SpecLevelRequirement == spellID
							                                                      : (s is Ability ? ((Ability)s).SpecLevelRequirement == spellID : false)));
							
							if (index > -1)
							{
								sk = snapLists[lineID].Item2[index];
							}
							
							sl = snapLists[lineID].Item1;
						}
						
						if (sk is Spell && sl != null)
						{
							caption = sk.Name;
							WriteSpellInfo(objectInfo, (Spell)sk, sl, client);
						}
						else if (sk is Styles.Style)
						{
							caption = sk.Name;
							WriteStyleInfo(objectInfo, (Style)sk, client);
						}
						else if (sk is Ability)
						{
							caption = sk.Name;
							Ability abil = (Ability)sk;
							
							if (abil.DelveInfo.Count > 0)
								objectInfo.AddRange(abil.DelveInfo);
							else
								objectInfo.Add("There is no special information.");
						}
		
						break;
					}
				case 3: //spell Hybrid
					{	
						
	
						SpellLine spellLine = null;
						Spell spell = null;
	
						// are we in list ?
						if (indexAtSpecOid < snapSkills.Count)
						{
							spell = (Spell)snapSkills[indexAtSpecOid].Item1;
							spellLine = (SpellLine)snapSkills[indexAtSpecOid].Item2;
						}
						
						if (spell == null || spellLine == null)
							return;
	
						caption = spell.Name;
						WriteSpellInfo(objectInfo, spell, spellLine, client);	
						break;
					}
					#endregion
					#region Merchant / RewardQuest
				case 4: //Display Infos on Merchant objects
				case 19: //Display Info quest reward
					{
						if (objectType == 4)
						{
							GameMerchant merchant = null;
							if (client.Player.TargetObject != null && client.Player.TargetObject is GameMerchant)
								merchant = (GameMerchant)client.Player.TargetObject;
							if (merchant == null)
								return;

							byte pagenumber = (byte)(objectID / MerchantTradeItems.MAX_ITEM_IN_TRADEWINDOWS);
							short slotnumber = (short)(objectID % MerchantTradeItems.MAX_ITEM_IN_TRADEWINDOWS);

							item = merchant.TradeItems.GetItem(pagenumber, (eMerchantWindowSlot)slotnumber);
						}
						else if (objectType == 19)
						{
							ushort questID = (ushort)((extraID << 12) | (ushort)(objectID >> 4));
							int index = objectID & 0x0F;

							GameLiving questGiver = null;
							if (client.Player.TargetObject != null && client.Player.TargetObject is GameLiving)
								questGiver = (GameLiving)client.Player.TargetObject;

							ChatUtil.SendDebugMessage(client, "Quest ID: " + questID);

							if (questID == 0)
								return; // questID == 0, wrong ID ?
							
							if (questID <= DataQuest.DATAQUEST_CLIENTOFFSET)
							{
								AbstractQuest q = client.Player.IsDoingQuest(QuestMgr.GetQuestTypeForID(questID));

								if (q == null)
								{
									// player not doing quest, most likely on offer screen
									if (questGiver != null)
									{
										try
										{
											q = (AbstractQuest)Activator.CreateInstance(QuestMgr.GetQuestTypeForID(questID), new object[] { client.Player, 1 });
										}
										catch
										{
											// we tried!
										}
									}

									if (q == null)
									{
										ChatUtil.SendDebugMessage(client, "Can't find or create quest!");
										return;
									}
								}

								if (!(q is RewardQuest))
									return; // this is not new quest

								List<ItemTemplate> rewards = null;
								if (index < 8)
									rewards = (q as RewardQuest).Rewards.BasicItems;
								else
								{
									rewards = (q as RewardQuest).Rewards.OptionalItems;
									index -= 8;
								}
								if (rewards != null && index >= 0 && index < rewards.Count)
								{
									item = rewards[index];
								}
							}
							else // Data quest support, check for RewardQuest type
							{
								DataQuest dq = null;

								foreach (DBDataQuest d in GameObject.DataQuestCache)
								{
									if (d.ID == questID - DataQuest.DATAQUEST_CLIENTOFFSET)
									{
										dq = new DataQuest(d);
										break;
									}
								}

								if (dq != null && dq.StartType == DataQuest.eStartType.RewardQuest)
								{
									List<ItemTemplate> rewards = null;
									if (index < 8)
										rewards = dq.FinalRewards;
									else
									{
										rewards = dq.OptionalRewards;
										index -= 8;
									}
									if (rewards != null && index >= 0 && index < rewards.Count)
									{
										item = rewards[index];
									}
								}
							}

						}


						if (item == null)
							return;

						caption = item.Name;

						if (client.Player.DelveItem<ItemTemplate>(item, objectInfo))
							break;

						#region Old Delve

						// fallback to old delve

						if (item.Item_Type == (int)eInventorySlot.Horse)
						{
							WriteHorseInfo(objectInfo, item, client, "");
						}

						if ((item.Item_Type == (int)eInventorySlot.HorseBarding || item.Item_Type == (int)eInventorySlot.HorseArmor) && item.Level > 0)
						{
							objectInfo.Add(" ");//empty line
							objectInfo.Add(" ");//empty line
							objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.ChampionLevel", item.Level));
						}

						if ((item.Object_Type >= (int)eObjectType.GenericWeapon) && (item.Object_Type <= (int)eObjectType.MaulerStaff) ||
						    item.Object_Type == (int)eObjectType.Instrument)
						{
							WriteUsableClasses(objectInfo, item, client);
							WriteMagicalBonuses(objectInfo, item, client, false);
							WriteClassicWeaponInfos(objectInfo, GameInventoryItem.Create(item), client);
						}

						if (item.Object_Type >= (int)eObjectType.Cloth && item.Object_Type <= (int)eObjectType.Scale)
						{
							WriteUsableClasses(objectInfo, item, client);
							WriteMagicalBonuses(objectInfo, item, client, false);
							WriteClassicArmorInfos(objectInfo, GameInventoryItem.Create(item), client);
						}

						if (item.Object_Type == (int)eObjectType.Shield)
						{
							WriteUsableClasses(objectInfo, item, client);
							WriteMagicalBonuses(objectInfo, item, client, false);
							WriteClassicShieldInfos(objectInfo, item, client);
						}

						if ((item.Item_Type != (int)eInventorySlot.Horse && item.Object_Type == (int)eObjectType.Magical) || item.Object_Type == (int)eObjectType.AlchemyTincture || item.Object_Type == (int)eObjectType.SpellcraftGem)
						{
							WriteMagicalBonuses(objectInfo, item, client, false);
						}

						if (item.Object_Type == (int)eObjectType.Poison)
						{
							WritePoisonInfo(objectInfo, item, client);
						}

						if (item.Object_Type == (int)eObjectType.Magical && item.Item_Type == 40) // potion
							WritePotionInfo(objectInfo, item, client);

						//Add admin info
						if (client.Account.PrivLevel > 1)
						{
							WriteTechnicalInfo(objectInfo, client, GameInventoryItem.Create(item), item.MaxDurability, item.MaxCondition);
						}
						break;

						#endregion Old Delve
					}
					#endregion
					#region Effect
				case 5: //icons on top (buffs/dots)
					{
						IGameEffect foundEffect = null;
						lock (client.Player.EffectList)
						{
							foreach (IGameEffect effect in client.Player.EffectList)
							{
								if (effect.InternalID == objectID)
								{
									foundEffect = effect;
									break;
								}
							}
						}

						if (foundEffect == null) break;

						caption = foundEffect.Name;
						objectInfo.AddRange(foundEffect.DelveInfo);

						if (client.Account.PrivLevel > 1 && foundEffect is GameSpellEffect)
						{
							if ((foundEffect as GameSpellEffect).Spell != null)
							{
								if (client.Account.PrivLevel > 1)
								{
									objectInfo.Add(" ");
									objectInfo.Add("----------Technical informations----------");
									objectInfo.Add("Line: " + ((foundEffect as GameSpellEffect).SpellHandler == null ? "unknown" : (foundEffect as GameSpellEffect).SpellHandler.SpellLine.Name));
									objectInfo.Add("SpellID: " + (foundEffect as GameSpellEffect).Spell.ID);
									objectInfo.Add("Type: " + (foundEffect as GameSpellEffect).Spell.SpellType);
									objectInfo.Add("ClientEffect: " + (foundEffect as GameSpellEffect).Spell.ClientEffect);
									objectInfo.Add("Icon: " + (foundEffect as GameSpellEffect).Spell.Icon);
									if ((foundEffect as GameSpellEffect).SpellHandler != null)
										objectInfo.Add("HasPositiveEffect: " + (foundEffect as GameSpellEffect).SpellHandler.HasPositiveEffect);
									objectInfo.Add("Disabled: " + (foundEffect as GameSpellEffect).IsDisabled);
								}
							}
						}


						break;
					}
					#endregion
					#region Style
				case 6: //style
					{
						Style style = null;
						// are we in list ?
						if (indexAtSpecOid < snapSkills.Count)
						{
							style = (Style)snapSkills[indexAtSpecOid].Item1;
						}
						
						if (style == null)
							return;

						caption = style.Name;

						WriteStyleInfo(objectInfo, style, client);
						break;
					}
					#endregion
					#region Trade Window
				case 7: //trade windows
					{
						ITradeWindow playerTradeWindow = client.Player.TradeWindow;
						if (playerTradeWindow == null)
							return;

						if (playerTradeWindow.PartnerTradeItems != null && objectID < playerTradeWindow.PartnerItemsCount)
							invItem = (InventoryItem)playerTradeWindow.PartnerTradeItems[objectID];

						if (invItem == null)
							return;

						// Let the player class create the appropriate item to delve
						caption = invItem.Name;

						if (client.Player.DelveItem<InventoryItem>(invItem, objectInfo))
							break;

						#region Old Delve
						// fallback to old delve

						if (invItem.Item_Type == (int)eInventorySlot.Horse)
						{
							WriteHorseInfo(objectInfo, invItem, client, "");
						}

						if ((invItem.Item_Type == (int)eInventorySlot.HorseBarding || invItem.Item_Type == (int)eInventorySlot.HorseArmor) && invItem.Level > 0)
						{
							objectInfo.Add(" ");//empty line
							objectInfo.Add(" ");//empty line
							objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.ChampionLevel", invItem.Level));
						}
						if ((invItem.Object_Type >= (int)eObjectType.GenericWeapon) && (invItem.Object_Type <= (int)eObjectType.MaulerStaff) ||
						    invItem.Object_Type == (int)eObjectType.Instrument)
						{
							WriteUsableClasses(objectInfo, invItem, client);
							WriteMagicalBonuses(objectInfo, invItem, client, false);
							WriteClassicWeaponInfos(objectInfo, invItem, client);
						}

						if (invItem.Object_Type >= (int)eObjectType.Cloth && invItem.Object_Type <= (int)eObjectType.Scale)
						{
							WriteUsableClasses(objectInfo, invItem, client);
							WriteMagicalBonuses(objectInfo, invItem, client, false);
							WriteClassicArmorInfos(objectInfo, invItem, client);
						}

						if (invItem.Object_Type == (int)eObjectType.Shield)
						{
							WriteUsableClasses(objectInfo, invItem, client);
							WriteMagicalBonuses(objectInfo, invItem, client, false);
							WriteClassicShieldInfos(objectInfo, invItem, client);
						}

						if ((invItem.Item_Type != (int)eInventorySlot.Horse && invItem.Object_Type == (int)eObjectType.Magical) || invItem.Object_Type == (int)eObjectType.AlchemyTincture || invItem.Object_Type == (int)eObjectType.SpellcraftGem)
						{
							WriteMagicalBonuses(objectInfo, invItem, client, false);
						}

						if (invItem.Object_Type == (int)eObjectType.Poison)
						{
							WritePoisonInfo(objectInfo, invItem, client);
						}

						if (invItem.Object_Type == (int)eObjectType.Magical && invItem.Item_Type == 40) // potion
							WritePotionInfo(objectInfo, invItem, client);

						//Add admin info
						if (client.Account.PrivLevel > 1)
						{
							WriteTechnicalInfo(objectInfo, client, invItem);
						}

						break;

						#endregion Old Delve
					}
					#endregion
					#region Ability
				case 8://abilities
					{
						Ability abil = null;
						// are we in list ?
						if (indexAtSpecOid < snapSkills.Count)
						{
							abil = (Ability)snapSkills[indexAtSpecOid].Item1;
						}
						
						if (abil == null)
							return;
						
						caption = abil.Name;
						
						if (abil.DelveInfo.Count > 0)
							objectInfo.AddRange(abil.DelveInfo);
						else
							objectInfo.Add("There is no special information.");
						break;
					}
					#endregion
					#region Trainer
				case 9: //trainer window "info" button
					{
						Specialization spec = client.Player.GetSpecList().Where(e => e.Trainable).ElementAtOrDefault(objectID);
						
						if (spec != null)
							caption = spec.Name;
						
						if (client.TrainerSkillCache != null && objectID < client.TrainerSkillCache.Count)
						{
							objectInfo.Add(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.LevName"));
							foreach (Skill sk in client.TrainerSkillCache[objectID].Item2.Select(e => e.Item3))
							{
								if (sk is Ability)
									objectInfo.Add(string.Format("{0}: {1}", ((Ability)sk).SpecLevelRequirement, sk.Name));
								else if (sk is Style)
									objectInfo.Add(string.Format("{0}: {1}", ((Style)sk).SpecLevelRequirement, sk.Name));
								else
									objectInfo.Add(string.Format("{0}: {1}", sk.Level, sk.Name));
							}
						}
						else
						{
							//delve on realm abilities [by Suncheck]
							if (objectID >= 50)
							{
								int clientclassID = client.Player.CharacterClass.ID;
								int sub = 50;
								List<RealmAbility> ra_list = SkillBase.GetClassRealmAbilities(clientclassID);
								Ability ra5abil = SkillBase.GetClassRR5Ability(clientclassID);
								RealmAbility ab = ra_list[objectID - sub];
								if (ra5abil != null) //check if player have rr
								{
									if (client.Player.RealmPoints < 513500) //player have not rr5 abilty
										sub--;
								}
								for (int i = 0; i <= (objectID - sub); i++) //get all ra's at full level
								{
									RealmAbility raabil = ra_list[i];
									RealmAbility playerra = (RealmAbility)client.Player.GetAbility(raabil.KeyName);
									if (playerra != null)
										if (playerra.Level >= playerra.MaxLevel)
											sub--;
								}
								ab = ra_list[objectID - sub];
								if (ab != null)
								{
									caption = ab.Name;
									objectInfo.AddRange(ab.DelveInfo);
									break;
								}
							}
							caption = "Specialization not found";
							objectInfo.Add("that specialization is not found, id=" + objectID);
							break;
						}
						break;
					}
					#endregion
					#region Group
				case 12: // Item info to Group Chat
					{
						invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
						if (invItem == null) return;
						string str = LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.Item", client.Player.Name, GetShortItemInfo(invItem, client));
						if (client.Player.Group == null)
						{
							client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.NoGroup"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						client.Player.Group.SendMessageToGroupMembers(str, eChatType.CT_Group, eChatLoc.CL_ChatWindow);
						return;
					}
					#endregion
					#region Guild
				case 13: // Item info to Guild Chat
					{
						invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
						if (invItem == null) return;
						string str = LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.GuildItem", client.Player.Name, GetShortItemInfo(invItem, client));
						if (client.Player.Guild == null)
						{
							client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.DontBelongGuild"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						if (!client.Player.Guild.HasRank(client.Player, Guild.eRank.GcSpeak))
						{
							client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.NoPermissionToSpeak"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						foreach (GamePlayer ply in client.Player.Guild.GetListOfOnlineMembers())
						{
							if (!client.Player.Guild.HasRank(ply, Guild.eRank.GcHear)) continue;
							ply.Out.SendMessage(str, eChatType.CT_Guild, eChatLoc.CL_ChatWindow);
						}
						return;
					}
					#endregion
					#region ChatGroup
				case 15: // Item info to Chat group
					{
						invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
						if (invItem == null) return;

						ChatGroup mychatgroup = (ChatGroup)client.Player.TempProperties.getProperty<object>(ChatGroup.CHATGROUP_PROPERTY, null);
						if (mychatgroup == null)
						{
							client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.MustBeInChatGroup"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						if (mychatgroup.Listen == true && (((bool)mychatgroup.Members[client.Player]) == false))
						{
							client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.OnlyModerator"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						string str = LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.ChatItem", client.Player.Name, GetShortItemInfo(invItem, client));
						foreach (GamePlayer ply in mychatgroup.Members.Keys)
						{
							ply.Out.SendMessage(str, eChatType.CT_Chat, eChatLoc.CL_ChatWindow);
						}
						return;
					}
					#endregion
					#region Trainer Window
					//styles
				case 20:
					{
						Style style = null;
						if (client.TrainerSkillCache != null)
						{
							// Search Id
							Skill sk = client.TrainerSkillCache.SelectMany(el => el.Item2).Where(e => e.Item2 == objectID && e.Item3.SkillType == eSkillPage.Styles).FirstOrDefault().Item3;
							if (sk is Style)
								style = (Style)sk;
						}
						
						if (style == null) return;

						caption = style.Name;
						WriteStyleInfo(objectInfo, style, client);
						break;
					}
					//spells
				case 22:
					//songs
				case 21:
					// Ability
				case 23:
					{
						Skill sk = null;
						if (client.TrainerSkillCache != null)
						{
							// Search Id
							sk = client.TrainerSkillCache.SelectMany(el => el.Item2).Where(e => ((objectType == 23 && e.Item2 == objectID && e.Item1 == 5) || (e.Item2 == objectID && e.Item1 != 5))).OrderBy(e => e.Item1).FirstOrDefault().Item3;
						}
						
						if (sk == null) return;
						
						if (sk is Spell)
						{
							Spell spell = (Spell)sk;
							caption = spell.Name;

							WriteSpellInfo(objectInfo, spell, SkillBase.GetSpellLine(GlobalSpellsLines.Reserved_Spells), client);
						}
						else if (sk is Ability)
						{
							Ability abil = (Ability)sk;
							caption = abil.Name;
						
							if (abil.DelveInfo.Count > 0)
								objectInfo.AddRange(abil.DelveInfo);
							else
								objectInfo.Add("There is no special information.");
						}
						
						break;
					}
					#endregion
					#region Repair
				case 100://repair
					{
						invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
						if (invItem != null)
						{
							client.Player.RepairItem(invItem);
						}
						else
						{
							client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.VeryStrange"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
						}
						return;
					}
					#endregion
					#region Self Craft
				case 101://selfcraft
					{
						invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
						if (invItem != null)
						{
							client.Player.OpenSelfCraft(invItem);
						}
						else
						{
							client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.VeryStrange"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
						}
						return;
					}
					#endregion
					#region Salvage
				case 102://salvage
					{
						invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
						if (invItem != null)
						{
							client.Player.SalvageItem(invItem);
						}
						else
						{
							client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.VeryStrange"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
						}
						return;
					}
					#endregion
					#region BattleGroup
				case 103: // Item info to battle group
					{
						invItem = client.Player.Inventory.GetItem((eInventorySlot)objectID);
						if (invItem == null) return;

						BattleGroup mybattlegroup = (BattleGroup)client.Player.TempProperties.getProperty<object>(BattleGroup.BATTLEGROUP_PROPERTY, null);
						if (mybattlegroup == null)
						{
							client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.MustBeInBattleGroup"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						if (mybattlegroup.Listen == true && (((bool)mybattlegroup.Members[client.Player]) == false))
						{
							client.Player.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.OnlyModerator"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
							return;
						}
						string str = LanguageMgr.GetTranslation(client.Account.Language, "DetailDisplayHandler.HandlePacket.ChatItem", client.Player.Name, GetShortItemInfo(invItem, client));
						foreach (GamePlayer ply in mybattlegroup.Members.Keys)
						{
							ply.Out.SendMessage(str, eChatType.CT_Chat, eChatLoc.CL_ChatWindow);
						}
						return;
					}
					#endregion
				#region v1.110+
				case 24://SpellsNew
					if (client.CanSendTooltip(24, objectID))
				        client.Out.SendDelveInfo(DelveSpell(client, objectID));
			        			        
					break;
				case 25://StylesNew
					if (client.CanSendTooltip(25, objectID))
	                    client.Out.SendDelveInfo(DelveStyle(client, objectID));
                    break;
				case 26://SongsNew
                    if (client.CanSendTooltip(26, objectID))
						client.Out.SendDelveInfo(DelveSong(client, objectID));
						client.Out.SendDelveInfo(DelveSpell(client, objectID));
					break;
				case 27://RANew
					if (client.CanSendTooltip(27, objectID))
	                   client.Out.SendDelveInfo(DelveRealmAbility(client, objectID));
                    break;
				case 28://AbilityNew
                    if (client.CanSendTooltip(28, objectID))
				        client.Out.SendDelveInfo(DelveAbility(client, objectID));
			        break;
				#endregion
				#region ChampionAbilities delve from trainer window
				default:
					{
						// Try retieving champion lines
						int clSpecID = objectType - 150;
						int clLineIndex = objectID >> 8;
						int clSkillIndex = objectID & 0x00FF;

						// Get Player CL Spec
						var clspec = client.Player.GetSpecList().Where(sp => sp is LiveChampionsSpecialization).Cast<LiveChampionsSpecialization>().FirstOrDefault();
						
						// check if the tree can be used
						List<Tuple<MiniLineSpecialization, List<Tuple<Skill, byte>>>> tree = null;
						if (clspec != null)
						{
							tree = clspec.GetTrainerTreeDisplay(client.Player, clspec.RetrieveTypeForIndex(clSpecID));
						}
						
						// Try and handle all Champion lines, including custom lines
						if (tree != null)
						{
							try
							{
								Skill skill = tree[clLineIndex].Item2[clSkillIndex].Item1;
								if (skill != null)
								{
									if (skill is Spell)
									{
										SpellLine spellLine = clspec.GetSpellLinesForLiving(client.Player).FirstOrDefault();
										if (spellLine != null)
										{
											caption = skill.Name;
											WriteSpellInfo(objectInfo, (Spell)skill, spellLine, client);
										}
										else
										{
											objectInfo.Add("Champion spell line not found!");
										}
									}
									else if (skill is Style)
									{
										caption = skill.Name;
										WriteStyleInfo(objectInfo, (Style)skill, client);
									}
								}
							}
							catch
							{
							}
						}

						break;
					}
					#endregion
			}

			if (objectInfo.Count > 0)
			{
				client.Out.SendCustomTextWindow(caption, objectInfo);
			}
			else if ((objectType < 24 || objectType > 28) && objectType < 150) // only warn for non v1.110+ objects
			{
				log.WarnFormat("DetailDisplayHandler no info for objectID {0} of type {1}. Item: {2}, client: {3}", objectID, objectType, (item == null ? (invItem == null ? "null" : invItem.Id_nb) : item.Id_nb), client);
			}
		}
        public void HandleReload(GSPacketIn packet)
        {
            eReloadType eReloadType = (eReloadType)packet.ReadInt();
            bool        val         = false;

            switch (eReloadType)
            {
            case eReloadType.ball:
                val = BallMgr.ReLoad();
                break;

            case eReloadType.map:
                val = MapMgr.ReLoadMap();
                break;

            case eReloadType.mapserver:
                val = MapMgr.ReLoadMapServer();
                break;

            case eReloadType.item:
                val = ItemMgr.ReLoad();
                break;

            case eReloadType.quest:
                val = QuestMgr.ReLoad();
                break;

            case eReloadType.fusion:
                val = FusionMgr.ReLoad();
                break;

            case eReloadType.server:
                GameServer.Instance.Configuration.Refresh();
                break;

            case eReloadType.rate:
                val = RateMgr.ReLoad();
                break;

            case eReloadType.consortia:
                val = ConsortiaMgr.ReLoad();
                break;

            case eReloadType.shop:
                val = ShopMgr.ReLoad();
                break;

            case eReloadType.fight:
                val = FightRateMgr.ReLoad();
                break;

            case eReloadType.dailyaward:
                val = AwardMgr.ReLoad();
                break;

            case eReloadType.language:
                val = LanguageMgr.Reload("");
                break;
            }
            packet.WriteInt(GameServer.Instance.Configuration.ServerID);
            packet.WriteBoolean(val);
            this.SendTCP(packet);
        }
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			if (client == null || client.Player == null)
				return;

			if ((client.Player.TargetObject is IGameInventoryObject) == false)
				return;

			MarketSearch.SearchData search = new MarketSearch.SearchData();

			search.name = packet.ReadString(64);
			search.slot = (int)packet.ReadInt();
			search.skill = (int)packet.ReadInt();
			search.resist = (int)packet.ReadInt();
			search.bonus = (int)packet.ReadInt();
			search.hp = (int)packet.ReadInt();
			search.power = (int)packet.ReadInt();
			search.proc = (int)packet.ReadInt();
			search.qtyMin = (int)packet.ReadInt();
			search.qtyMax = (int)packet.ReadInt();
			search.levelMin = (int)packet.ReadInt();
			search.levelMax = (int)packet.ReadInt();
			search.priceMin = (int)packet.ReadInt();
			search.priceMax = (int)packet.ReadInt();
			search.visual = (int)packet.ReadInt();
			search.page = (byte)packet.ReadByte();
			byte unk1 = (byte)packet.ReadByte();
			short unk2 = (short)packet.ReadShort();
			byte unk3 = 0;
			byte unk4 = 0;
			byte unk5 = 0;
			byte unk6 = 0;
			byte unk7 = 0;
			byte unk8 = 0;

			if (client.Version >= GameClient.eClientVersion.Version198)
			{
				// Dunnerholl 2009-07-28 Version 1.98 introduced new options to Market search. 12 Bytes were added, but only 7 are in usage so far in my findings.
				// update this, when packets change and keep in mind, that this code reflects only the 1.98 changes
				search.armorType = search.page; // page is now used for the armorType (still has to be logged, i just checked that 2 means leather, 0 = standard
				search.damageType = (byte)packet.ReadByte(); // 1=crush, 2=slash, 3=thrust
				unk3 = (byte)packet.ReadByte();
				unk4 = (byte)packet.ReadByte();
				unk5 = (byte)packet.ReadByte();
				search.playerCrafted = (byte)packet.ReadByte(); // 1 = show only Player crafted, 0 = all
				// 3 bytes unused
				packet.Skip(3);
				search.page = (byte)packet.ReadByte(); // page is now sent here
				unk6 = (byte)packet.ReadByte();
				unk7 = (byte)packet.ReadByte();
				unk8 = (byte)packet.ReadByte();
			}

			search.clientVersion = client.Version.ToString();

			(client.Player.TargetObject as IGameInventoryObject).SearchInventory(client.Player, search);
		}
        public void HandleConsortiaUserPass(GSPacketIn packet)
        {
            packet.ReadInt();
            packet.ReadBoolean();
            int    num           = packet.ReadInt();
            string consortiaName = packet.ReadString();
            int    num2          = packet.ReadInt();

            packet.ReadString();
            packet.ReadInt();
            packet.ReadString();
            packet.ReadInt();
            string dutyName = packet.ReadString();

            packet.ReadInt();
            packet.ReadInt();
            packet.ReadInt();
            packet.ReadDateTime();
            packet.ReadInt();
            int dutyLevel = packet.ReadInt();

            packet.ReadInt();
            packet.ReadBoolean();
            int right = packet.ReadInt();

            packet.ReadInt();
            packet.ReadInt();
            packet.ReadInt();
            int consortiaRepute = packet.ReadInt();

            GamePlayer[] allPlayers = WorldMgr.GetAllPlayers();
            GamePlayer[] array      = allPlayers;
            for (int i = 0; i < array.Length; i++)
            {
                GamePlayer gamePlayer = array[i];
                if (gamePlayer.PlayerCharacter.ID == num2)
                {
                    gamePlayer.BeginChanges();
                    gamePlayer.PlayerCharacter.ConsortiaID     = num;
                    gamePlayer.PlayerCharacter.ConsortiaName   = consortiaName;
                    gamePlayer.PlayerCharacter.DutyName        = dutyName;
                    gamePlayer.PlayerCharacter.DutyLevel       = dutyLevel;
                    gamePlayer.PlayerCharacter.Right           = right;
                    gamePlayer.PlayerCharacter.ConsortiaRepute = consortiaRepute;
                    ConsortiaInfo consortiaInfo = ConsortiaMgr.FindConsortiaInfo(num);
                    if (consortiaInfo != null)
                    {
                        gamePlayer.PlayerCharacter.ConsortiaLevel = consortiaInfo.Level;
                    }
                    gamePlayer.CommitChanges();
                }
                if (gamePlayer.PlayerCharacter.ConsortiaID == num)
                {
                    gamePlayer.Out.SendTCP(packet);
                }
            }
        }
Beispiel #46
0
        public bool HandleCommand(TankMarryLogicProcessor process, GamePlayer player, GSPacketIn packet)
        {
            bool result2;

            if (player.CurrentMarryRoom == null || player.CurrentMarryRoom.RoomState != eRoomState.FREE)
            {
                result2 = false;
            }
            else
            {
                if (player.PlayerCharacter.ID != player.CurrentMarryRoom.Info.GroomID && player.PlayerCharacter.ID != player.CurrentMarryRoom.Info.BrideID)
                {
                    result2 = false;
                }
                else
                {
                    int needMoney = 500;
                    if (player.CurrentMarryRoom.Info.IsHymeneal)
                    {
                        if (player.PlayerCharacter.Money < needMoney)
                        {
                            player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("UserFirecrackersCommand.MoneyNotEnough", new object[0]));
                            result2 = false;
                            return(result2);
                        }
                    }
                    GamePlayer Groom = player.CurrentMarryRoom.GetPlayerByUserID(player.CurrentMarryRoom.Info.GroomID);
                    if (Groom == null)
                    {
                        player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("HymenealCommand.NoGroom", new object[0]));
                        result2 = false;
                    }
                    else
                    {
                        GamePlayer Bride = player.CurrentMarryRoom.GetPlayerByUserID(player.CurrentMarryRoom.Info.BrideID);
                        if (Bride == null)
                        {
                            player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("HymenealCommand.NoBride", new object[0]));
                            result2 = false;
                        }
                        else
                        {
                            bool       result        = false;
                            bool       isFirst       = false;
                            GSPacketIn pkg           = packet.Clone();
                            int        hymenealState = packet.ReadInt();
                            if (1 == hymenealState)
                            {
                                player.CurrentMarryRoom.RoomState = eRoomState.FREE;
                            }
                            else
                            {
                                player.CurrentMarryRoom.RoomState = eRoomState.Hymeneal;
                                player.CurrentMarryRoom.BeginTimerForHymeneal(170000);
                                if (!player.PlayerCharacter.IsGotRing)
                                {
                                    isFirst = true;
                                    ItemTemplateInfo ringTemplate = ItemMgr.FindItemTemplate(9022);
                                    ItemInfo         ring         = ItemInfo.CreateFromTemplate(ringTemplate, 1, 112);
                                    ring.IsBinds = true;
                                    using (PlayerBussiness pb = new PlayerBussiness())
                                    {
                                        ring.UserID = 0;
                                        pb.AddGoods(ring);
                                        string content = LanguageMgr.GetTranslation("HymenealCommand.Content", new object[]
                                        {
                                            Bride.PlayerCharacter.NickName
                                        });
                                        MailInfo mail = new MailInfo();
                                        mail.Annex1     = ring.ItemID.ToString();
                                        mail.Content    = content;
                                        mail.Gold       = 0;
                                        mail.IsExist    = true;
                                        mail.Money      = 0;
                                        mail.GiftToken  = 0;
                                        mail.Receiver   = Groom.PlayerCharacter.NickName;
                                        mail.ReceiverID = Groom.PlayerCharacter.ID;
                                        mail.Sender     = LanguageMgr.GetTranslation("HymenealCommand.Sender", new object[0]);
                                        mail.SenderID   = 0;
                                        mail.Title      = LanguageMgr.GetTranslation("HymenealCommand.Title", new object[0]);
                                        mail.Type       = 14;
                                        if (pb.SendMail(mail))
                                        {
                                            result = true;
                                        }
                                        player.Out.SendMailResponse(mail.ReceiverID, eMailRespose.Receiver);
                                    }
                                    ItemInfo ring2 = ItemInfo.CreateFromTemplate(ringTemplate, 1, 112);
                                    ring2.IsBinds = true;
                                    using (PlayerBussiness pb = new PlayerBussiness())
                                    {
                                        ring2.UserID = 0;
                                        pb.AddGoods(ring2);
                                        string content = LanguageMgr.GetTranslation("HymenealCommand.Content", new object[]
                                        {
                                            Groom.PlayerCharacter.NickName
                                        });
                                        MailInfo mail = new MailInfo();
                                        mail.Annex1     = ring2.ItemID.ToString();
                                        mail.Content    = content;
                                        mail.Gold       = 0;
                                        mail.IsExist    = true;
                                        mail.Money      = 0;
                                        mail.GiftToken  = 0;
                                        mail.Receiver   = Bride.PlayerCharacter.NickName;
                                        mail.ReceiverID = Bride.PlayerCharacter.ID;
                                        mail.Sender     = LanguageMgr.GetTranslation("HymenealCommand.Sender", new object[0]);
                                        mail.SenderID   = 0;
                                        mail.Title      = LanguageMgr.GetTranslation("HymenealCommand.Title", new object[0]);
                                        mail.Type       = 14;
                                        if (pb.SendMail(mail))
                                        {
                                            result = true;
                                        }
                                        player.Out.SendMailResponse(mail.ReceiverID, eMailRespose.Receiver);
                                    }
                                    player.CurrentMarryRoom.Info.IsHymeneal = true;
                                    using (PlayerBussiness db = new PlayerBussiness())
                                    {
                                        db.UpdateMarryRoomInfo(player.CurrentMarryRoom.Info);
                                        db.UpdatePlayerGotRingProp(Groom.PlayerCharacter.ID, Bride.PlayerCharacter.ID);
                                        Groom.LoadMarryProp();
                                        Bride.LoadMarryProp();
                                    }
                                }
                                else
                                {
                                    isFirst = false;
                                    result  = true;
                                }
                                if (!isFirst)
                                {
                                    player.RemoveMoney(needMoney, LogMoneyType.Marry, LogMoneyType.Marry_Hymeneal);
                                    CountBussiness.InsertSystemPayCount(player.PlayerCharacter.ID, needMoney, 0, 0, 1);
                                }
                                pkg.WriteInt(player.CurrentMarryRoom.Info.ID);
                                pkg.WriteBoolean(result);
                                player.CurrentMarryRoom.SendToAll(pkg);
                                if (result)
                                {
                                    string msg = LanguageMgr.GetTranslation("HymenealCommand.Succeed", new object[]
                                    {
                                        Groom.PlayerCharacter.NickName,
                                        Bride.PlayerCharacter.NickName
                                    });
                                    GSPacketIn message = player.Out.SendMessage(eMessageType.ChatNormal, msg);
                                    player.CurrentMarryRoom.SendToPlayerExceptSelfForScene(message, player);
                                }
                            }
                            result2 = true;
                        }
                    }
                }
            }
            return(result2);
        }
Beispiel #47
0
        public void HandleGameRoomCreate(GSPacketIn pkg)
        {
            int roomId   = pkg.ReadInt();
            int gameType = pkg.ReadInt();
            int guildId  = pkg.ReadInt();

            int count      = pkg.ReadInt();
            int totalLevel = 0;

            IGamePlayer[] players = new IGamePlayer[count];
            for (int i = 0; i < count; i++)
            {
                PlayerInfo info = new PlayerInfo();
                info.ID              = pkg.ReadInt();
                info.NickName        = pkg.ReadString();
                info.Sex             = pkg.ReadBoolean();
                info.Hide            = pkg.ReadInt();
                info.Style           = pkg.ReadString();
                info.Colors          = pkg.ReadString();
                info.Skin            = pkg.ReadString();
                info.Offer           = pkg.ReadInt();
                info.GP              = pkg.ReadInt();
                info.Grade           = pkg.ReadInt();
                info.Repute          = pkg.ReadInt();
                info.ConsortiaID     = pkg.ReadInt();
                info.ConsortiaName   = pkg.ReadString();
                info.ConsortiaLevel  = pkg.ReadInt();
                info.ConsortiaRepute = pkg.ReadInt();

                info.Attack  = pkg.ReadInt();
                info.Defence = pkg.ReadInt();
                info.Agility = pkg.ReadInt();
                info.Luck    = pkg.ReadInt();

                double baseAttack    = pkg.ReadDouble();
                double baseDefence   = pkg.ReadDouble();
                double baseAgility   = pkg.ReadDouble();
                double baseBlood     = pkg.ReadDouble();
                int    templateId    = pkg.ReadInt();
                bool   canUserProp   = pkg.ReadBoolean();
                int    secondWeapon  = pkg.ReadInt();
                int    strengthLevel = pkg.ReadInt();


                double gprate    = pkg.ReadDouble();
                double offerrate = pkg.ReadDouble();
                double rate      = pkg.ReadDouble();
                int    serverid  = pkg.ReadInt();

                ItemTemplateInfo itemTemplate = ItemMgr.FindItemTemplate(templateId);
                ItemInfo         item         = null;
                if (secondWeapon != 0)
                {
                    ItemTemplateInfo secondWeaponTemp = ItemMgr.FindItemTemplate(secondWeapon);
                    item = ItemInfo.CreateFromTemplate(secondWeaponTemp, 1, 1);
                    item.StrengthenLevel = strengthLevel;
                }

                List <BufferInfo> infos = new List <BufferInfo>();

                int buffercout = pkg.ReadInt();
                for (int j = 0; j < buffercout; j++)
                {
                    BufferInfo buffinfo = new BufferInfo();
                    buffinfo.Type      = pkg.ReadInt();
                    buffinfo.IsExist   = pkg.ReadBoolean();
                    buffinfo.BeginDate = pkg.ReadDateTime();
                    buffinfo.ValidDate = pkg.ReadInt();
                    buffinfo.Value     = pkg.ReadInt();
                    if (info != null)
                    {
                        infos.Add(buffinfo);
                    }
                }

                players[i]            = new ProxyPlayer(this, info, itemTemplate, item, baseAttack, baseDefence, baseAgility, baseBlood, gprate, offerrate, rate, infos, serverid);
                players[i].CanUseProp = canUserProp;

                int ec = pkg.ReadInt();
                for (int j = 0; j < ec; j++)
                {
                    players[i].EquipEffect.Add(pkg.ReadInt());
                }
                totalLevel += info.Grade;
            }

            ProxyRoom room = new ProxyRoom(ProxyRoomMgr.NextRoomId(), roomId, players, this);

            room.GuildId  = guildId;
            room.GameType = (eGameType)gameType;

            lock (m_rooms)
            {
                if (!m_rooms.ContainsKey(roomId))
                {
                    m_rooms.Add(roomId, room);
                }
                else
                {
                    room = null;
                }
            }

            if (room != null)
            {
                ProxyRoomMgr.AddRoom(room);
            }
            else
            {
                log.ErrorFormat("Room already exists:{0}", roomId);
            }
        }
 public void HandleFriendState(GSPacketIn pkg)
 {
     WorldMgr.ChangePlayerState(pkg.ClientID, pkg.ReadInt(), pkg.ReadInt());
 }
Beispiel #49
0
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            int    bagType = packet.ReadInt();
            int    place   = packet.ReadInt();
            string msg1    = null;

            ItemInfo            item     = null;
            List <ShopItemInfo> ShopItem = new List <ShopItemInfo>();

            if (client.Player.PlayerCharacter.HasBagPassword && client.Player.PlayerCharacter.IsLocked)
            {
                client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("Bag.Locked"));
                return(0);
            }
            if (place == -1)
            {
                int templateID = packet.ReadInt();
                int type       = packet.ReadInt();
                int gold       = 0;
                int money      = 0;



                ItemTemplateInfo template = Bussiness.Managers.ItemMgr.FindItemTemplate(templateID);
                item     = ItemInfo.CreateFromTemplate(template, 1, (int)ItemAddType.Buy);
                ShopItem = Bussiness.Managers.ShopMgr.FindShopbyTemplatID(templateID);
                for (int i = 0; i < ShopItem.Count; i++)
                {
                    if (ShopItem[i].APrice1 == -1 && ShopItem[i].AValue1 != 0)
                    {
                        money          = ShopItem[i].AValue1;
                        item.ValidDate = ShopItem[i].AUnit;
                    }
                }

                if (item != null)
                {
                    // item = ItemInfo.SetItemType(item, type, ref gold, ref money, ref offer);
                    if (gold <= client.Player.PlayerCharacter.Gold && money <= client.Player.PlayerCharacter.Money)
                    {
                        client.Player.RemoveMoney(money);
                        client.Player.RemoveGold(gold);
                        LogMgr.LogMoneyAdd(LogMoneyType.Shop, LogMoneyType.Shop_Card, client.Player.PlayerCharacter.ID, money, client.Player.PlayerCharacter.Money, gold, 0, 0, 0, "牌子编号", item.TemplateID.ToString(), type.ToString());
                        msg1 = "CardUseHandler.Success";
                    }
                    else
                    {
                        item = null;
                    }
                }
            }
            else
            {
                item = client.Player.PropBag.GetItemAt(place);
                msg1 = "CardUseHandler.Success";
            }

            if (item != null)
            {
                string msg = string.Empty;
                if (item.Template.Property1 != 21)
                {
                    AbstractBuffer buffer = BufferList.CreateBuffer(item.Template, item.ValidDate);
                    if (buffer != null)
                    {
                        buffer.Start(client.Player);
                        if (place != -1)
                        {
                            client.Player.PropBag.RemoveItem(item);
                        }
                    }
                    client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation(msg1));
                }
                else
                {
                    if (item.IsValidItem())
                    {
                        //client.Player.PlayerCharacter.GP += item.Template.Property1;
                        client.Player.AddGP(item.Template.Property2);

                        if (item.Template.CanDelete)
                        {
                            client.Player.RemoveItem(item);
                            msg = "GPDanUser.Success";
                        }
                    }
                    client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation(msg, item.Template.Property2));
                }
            }

            return(0);
        }