Esempio n. 1
0
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			string name=packet.ReadString(30);
			//TODO do bad name checks here from some database with
			//bad names, this is just a temp testthing here
			bool bad = false;

			ArrayList names = GameServer.Instance.InvalidNames;

			foreach(string s in names)
			{
				if(name.ToLower().IndexOf(s) != -1)
				{
					bad = true;
					break;
				}
			}

			//if(bad)
			//DOLConsole.WriteLine(String.Format("Name {0} is bad!",name));
			//else
			//DOLConsole.WriteLine(String.Format("Name {0} seems to be a good name!",name));

			client.Out.SendBadNameCheckReply(name,bad);
		}
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			ushort id = packet.ReadShort();
//			GameNPC npc = (GameNPC)WorldMgr.GetObjectTypeByIDFromRegion(client.Player.CurrentRegionID, id, typeof(GameNPC));
			if(client.Player==null) return;
			Region region = client.Player.CurrentRegion;
			if (region == null) return;
			GameNPC npc = region.GetObject(id) as GameNPC;

			if(npc != null)
			{
				Tuple<ushort, ushort> key = new Tuple<ushort, ushort>(npc.CurrentRegionID, (ushort)npc.ObjectID);
				
				long updatetime;
				if (!client.GameObjectUpdateArray.TryGetValue(key, out updatetime))
				{
					updatetime = 0;
				}
				
				client.Out.SendNPCCreate(npc);
				// override update from npc create as this is a client request !
				if (updatetime > 0)
					client.GameObjectUpdateArray[key] = updatetime;
				
				if(npc.Inventory != null)
					client.Out.SendLivingEquipmentUpdate(npc);
				
				//DO NOT SEND A NPC UPDATE, it is done in Create anyway
				//Sending a Update causes a UDP packet to be sent and
				//the client will get the UDP packet before the TCP Create packet
				//Causing the client to issue another NPC CREATION REQUEST!
				//client.Out.SendNPCUpdate(npc); <-- BIG NO NO
			}
		}
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			string localIP = packet.ReadString(22);
			ushort localPort = packet.ReadShort();
			client.LocalIP = localIP;
			client.Out.SendUDPInitReply();
		}
Esempio n. 5
0
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			int flagSpeedData = packet.ReadShort();
			int heading = packet.ReadShort();

			if (client.Version > GameClient.eClientVersion.Version171)
			{
				int xOffsetInZone = packet.ReadShort();
				int yOffsetInZone = packet.ReadShort();
				int currentZoneID = packet.ReadShort();
				int realZ = packet.ReadShort();

				Zone newZone = WorldMgr.GetZone((ushort) currentZoneID);
				if (newZone == null)
				{
					if (Log.IsWarnEnabled)
						Log.Warn("Unknown zone in UseSpellHandler: " + currentZoneID + " player: " + client.Player.Name);
				}
				else
				{
					client.Player.X = newZone.XOffset + xOffsetInZone;
					client.Player.Y = newZone.YOffset + yOffsetInZone;
					client.Player.Z = realZ;
					client.Player.MovementStartTick = Environment.TickCount;
				}
			}

			int spellLevel = packet.ReadByte();
			int spellLineIndex = packet.ReadByte();

			client.Player.Heading = (ushort) (heading & 0xfff);

			new UseSpellAction(client.Player, flagSpeedData, spellLevel, spellLineIndex).Start(1);
		}
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            packet.Skip(4);
            int slot = packet.ReadShort();
            InventoryItem item = client.Player.Inventory.GetItem((eInventorySlot)slot);
            if (item != null)
            {
                if (item.IsIndestructible)
                {
                    client.Out.SendMessage(String.Format("You can't destroy {0}!",
                        item.GetName(0, false)), eChatType.CT_System, eChatLoc.CL_SystemWindow);
                    return;
                }

                if (item.Id_nb == "ARelic")
                {
                    client.Out.SendMessage("You cannot destroy a relic!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                    return;
                }

                if (client.Player.Inventory.EquippedItems.Contains(item))
                {
                    client.Out.SendMessage("You cannot destroy an equipped item!", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                    return;
                }

                if (client.Player.Inventory.RemoveItem(item))
                {
                    client.Out.SendMessage("You destroy the " + item.Name + ".", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                    InventoryLogging.LogInventoryAction(client.Player, "(destroy)", eInventoryActionType.Other, item.Template, item.Count);
                }
            }
        }
Esempio n. 7
0
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			int rc4 = packet.ReadByte();
			byte clientType = (byte)packet.ReadByte();
			client.ClientType = (GameClient.eClientType)(clientType & 0x0F);
			client.ClientAddons = (GameClient.eClientAddons)(clientType & 0xF0);
			byte major = (byte)packet.ReadByte();
			byte minor = (byte)packet.ReadByte();
			byte build = (byte)packet.ReadByte();
			if(rc4==1)
			{
				//DOLConsole.Log("SBox=\n");
				//DOLConsole.LogDump(client.PacketProcessor.Encoding.SBox);
				packet.Read(((PacketEncoding168)client.PacketProcessor.Encoding).SBox,0,256);
				((PacketEncoding168)client.PacketProcessor.Encoding).EncryptionState=PacketEncoding168.eEncryptionState.PseudoRC4Encrypted;
				//DOLConsole.WriteLine(client.Socket.RemoteEndPoint.ToString()+": SBox set!");
				//DOLConsole.Log("SBox=\n");
				//DOLConsole.LogDump(((PacketEncoding168)client.PacketProcessor.Encoding).SBox);
			}
			else
			{
			  //Send the crypt key to the client
				client.Out.SendVersionAndCryptKey();
			}
		}
Esempio n. 8
0
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			ushort playerID = packet.ReadShort(); // no use for that.

			// house is null, return
			var house = client.Player.CurrentHouse;
			if(house == null)
				return;

			// grab all valid changes
			var changes = new List<int>();
			for (int i = 0; i < 10; i++)
			{
				int swtch = packet.ReadByte();
				int change = packet.ReadByte();

				if (swtch != 255)
				{
					changes.Add(change);
				}
			}

			// apply changes
			if (changes.Count > 0)
			{
				house.Edit(client.Player, changes);
			}
		}
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            ushort keepId = packet.ReadShort();
            ushort wallId = packet.ReadShort();
            ushort responce = packet.ReadShort();
            int HPindex = packet.ReadShort();

            AbstractGameKeep keep = GameServer.KeepManager.GetKeepByID(keepId);

            if (keep == null || !(GameServer.ServerRules.IsSameRealm(client.Player, (GameKeepComponent)keep.KeepComponents[wallId], true) || client.Account.PrivLevel > 1))
                return;

            if (responce == 0x00)//show info
                client.Out.SendKeepComponentInteract(((GameKeepComponent)keep.KeepComponents[wallId]));
            else if (responce == 0x01)// click on hookpoint button
                client.Out.SendKeepComponentHookPoint(((GameKeepComponent)keep.KeepComponents[wallId]), HPindex);
            else if (responce == 0x02)//select an hookpoint
            {
                if (client.Account.PrivLevel > 1)
                    client.Out.SendMessage("DEBUG : selected hookpoint id " + HPindex, eChatType.CT_Say, eChatLoc.CL_SystemWindow);

                GameKeepComponent hp = keep.KeepComponents[wallId] as GameKeepComponent;
                client.Out.SendClearKeepComponentHookPoint(hp, HPindex);
                client.Out.SendHookPointStore(hp.HookPoints[HPindex] as GameKeepHookPoint);
            }
        }
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			ushort housenumber = packet.ReadShort();
			var index = (byte) packet.ReadByte();
			var unk1 = (byte) packet.ReadByte();

			// house is null, return
			var house = HouseMgr.GetHouse(housenumber);
			if (house == null)
				return;

			// player is null, return
			if (client.Player == null)
				return;

			// rotation only works for inside items
			if (!client.Player.InHouse)
				return;

			// no permission to change the interior, return
			if (!house.CanChangeInterior(client.Player, DecorationPermissions.Add))
				return;

			var pak = new GSTCPPacketOut(client.Out.GetPacketCode(eServerPackets.HouseDecorationRotate));
			pak.WriteShort(housenumber);
			pak.WriteByte(index);
			pak.WriteByte(0x01);
			client.Out.SendTCP(pak);
		}
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			int permissionSlot = packet.ReadByte();
			int newPermissionLevel = packet.ReadByte();
			ushort houseNumber = packet.ReadShort();

			// house is null, return
			var house = HouseMgr.GetHouse(houseNumber);
			if (house == null)
				return;

			// player is null, return
			if (client.Player == null)
				return;

			// can't set permissions unless you're the owner.
			if (!house.HasOwnerPermissions(client.Player) && client.Account.PrivLevel <= 1)
				return;

			// check if we're setting or removing permissions
			if (newPermissionLevel == 100)
			{
				house.RemovePermission(permissionSlot);
			}
			else
			{
				house.AdjustPermissionSlot(permissionSlot, newPermissionLevel);
			}
		}
Esempio n. 12
0
		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();
				}
			}
		}
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            ushort unk1 = packet.ReadShort();
            ushort questIndex = packet.ReadShort();
            ushort unk2 = packet.ReadShort();
            ushort unk3 = packet.ReadShort();

            AbstractQuest quest = null;

            int index = 0;
            lock (client.Player.QuestList)
            {
                foreach (AbstractQuest q in client.Player.QuestList)
                {
                    // ignore completed quests
                    if (q.Step == -1)
                        continue;

                    if (index == questIndex)
                    {
                        quest = q;
                        break;
                    }

                    index++;
                }
            }

            if (quest != null)
                quest.AbortQuest();
        }
Esempio n. 14
0
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			var aggroState = (byte) packet.ReadByte(); // 1-Aggressive, 2-Deffensive, 3-Passive
			var walkState = (byte) packet.ReadByte(); // 1-Follow, 2-Stay, 3-GoTarg, 4-Here
			var command = (byte) packet.ReadByte(); // 1-Attack, 2-Release

			//[Ganrod] Nidel: Animist can removed his TurretFnF without MainPet.
			if (client.Player.TargetObject != null && command == 2 && client.Player.ControlledBrain == null &&
			    client.Player.CharacterClass.ID == (int) eCharacterClass.Animist)
			{
				var turret = client.Player.TargetObject as TurretPet;
				if (turret != null && turret.Brain is TurretFNFBrain && client.Player.IsControlledNPC(turret))
				{
					//release
					new HandlePetCommandAction(client.Player, 0, 0, 2).Start(1);
					return;
				}
			}

			//[Ganrod] Nidel: Call only if player has controllednpc
			if (client.Player.ControlledBrain != null)
			{
				new HandlePetCommandAction(client.Player, aggroState, walkState, command).Start(1);
				return;
			}
		}
        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);
                }
            }
        }
Esempio n. 16
0
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			ushort keepId = packet.ReadShort();
			ushort wallId = packet.ReadShort();
			int hookpointID = packet.ReadShort();
            ushort itemslot = packet.ReadShort();
			int payType = packet.ReadByte();//gold RP BP contrat???
			int unk2 = packet.ReadByte();
			int unk3 = packet.ReadByte();
			int unk4 = packet.ReadByte();
//			client.Player.Out.SendMessage("x="+unk2+"y="+unk3+"z="+unk4,eChatType.CT_Say,eChatLoc.CL_SystemWindow);
			AbstractGameKeep keep = GameServer.KeepManager.GetKeepByID(keepId);
			if (keep == null) return;
			GameKeepComponent component = keep.KeepComponents[wallId] as GameKeepComponent;
			if (component == null) return;
			/*GameKeepHookPoint hookpoint = component.HookPoints[hookpointID] as GameKeepHookPoint;
			if (hookpoint == null) return 1;
			*/
			HookPointInventory inventory = null;
			if(hookpointID > 0x80) inventory = HookPointInventory.YellowHPInventory; //oil
			else if(hookpointID > 0x60) inventory = HookPointInventory.GreenHPInventory;//big siege
			else if(hookpointID > 0x40) inventory = HookPointInventory.LightGreenHPInventory; //small siege
			else if (hookpointID > 0x20) inventory = HookPointInventory.BlueHPInventory;//npc
			else inventory = HookPointInventory.RedHPInventory;//guard

			if (inventory != null)
			{
				HookPointItem item = inventory.GetItem(itemslot);
				if (item != null)
					item.Invoke(client.Player, payType, component.HookPoints[hookpointID] as GameKeepHookPoint, component);
			}
		}
Esempio n. 17
0
		//rewritten by Corillian so if it doesn't work you know who to yell at ;)
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			byte grouped = (byte)packet.ReadByte();
			ArrayList list = new ArrayList();
			if (grouped != 0x00)
			{
				ArrayList groups = GroupMgr.ListGroupByStatus(0x00);
				if (groups != null)
				{
					foreach (Group group in groups)
						if (GameServer.ServerRules.IsAllowedToGroup(group.Leader, client.Player, true))
						{
							list.Add(group.Leader);
						}
				}
			}

			ArrayList Lfg = GroupMgr.LookingForGroupPlayers();

			if (Lfg != null)
			{
				foreach (GamePlayer player in Lfg)
				{
					if (player != client.Player && GameServer.ServerRules.IsAllowedToGroup(client.Player, player, true))
					{
						list.Add(player);
					}
				}
			}

			client.Out.SendFindGroupWindowUpdate((GamePlayer[])list.ToArray(typeof(GamePlayer)));
		}
Esempio n. 18
0
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			int unk1 = packet.ReadByte();
			int position = packet.ReadByte();
			ushort housenumber = packet.ReadShort();
			ushort angle = packet.ReadShort();
			ushort unk2 = packet.ReadShort();

			// rotation only works for inside items
			if (!client.Player.InHouse)
				return;

			// house is null, return
			var house = HouseMgr.GetHouse(housenumber);
			if (house == null)
				return;

			// player is null, return
			if (client.Player == null)
				return;

			// no permission to change the interior, return
			if (!house.CanChangeInterior(client.Player, DecorationPermissions.Add))
				return;

			if (house.IndoorItems.ContainsKey(position) == false)
				return;

			// grab the item in question
			IndoorItem iitem = house.IndoorItems[position];
			if (iitem == null)
			{
				client.Player.Out.SendMessage("error: id was null", eChatType.CT_Help, eChatLoc.CL_SystemWindow);
				return;
			} //should this ever happen?

			// adjust the item's roation
			int old = iitem.Rotation;
			iitem.Rotation = (iitem.Rotation + angle)%360;

			if (iitem.Rotation < 0)
			{
				iitem.Rotation = 360 + iitem.Rotation;
			}

			iitem.DatabaseItem.Rotation = iitem.Rotation;

			// save item
			GameServer.Database.SaveObject(iitem.DatabaseItem);

			ChatUtil.SendSystemMessage(client,
			                           string.Format("Interior decoration rotated from {0} degrees to {1}", old, iitem.Rotation));

			// update all players in the house.
			foreach (GamePlayer plr in house.GetAllPlayersInHouse())
			{
				plr.Client.Out.SendFurniture(house, position);
			}
		}
Esempio n. 19
0
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			var mode = (byte) packet.ReadByte();
			bool userAction = packet.ReadByte() == 0;
				// set to 0 if user pressed the button, set to 1 if client decided to stop attack

			new AttackRequestHandler(client.Player, mode != 0, userAction).Start(1);
		}
Esempio n. 20
0
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			int flagSpeedData = packet.ReadShort();
			int index = packet.ReadByte();
			int type = packet.ReadByte();

			new UseSkillAction(client.Player, flagSpeedData, index, type).Start(1);
		}
 /// <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)
 {
     string localIP = packet.ReadString(22);
     ushort localPort = packet.ReadShort();
     // TODO check changed localIP
     client.LocalIP = localIP;
     client.UdpPingTime = DateTime.Now.Ticks;
 }
		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);
		}
Esempio n. 23
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);
		}
Esempio n. 24
0
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			if (client == null || client.Player == null)
				return;

			client.UdpConfirm = false;

			new WorldInitAction(client.Player).Start(1);
		}
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			string name = packet.ReadString(30);
			string select = string.Format("Name = '{0}'", GameServer.Database.Escape(name));
			DOLCharacters character = GameServer.Database.SelectObject<DOLCharacters>(select);
			bool nameExists = (character != null);

			client.Out.SendDupNameCheckReply(name, nameExists);
		}
		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);
		}
Esempio n. 27
0
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			string localIP = packet.ReadString(22);
			ushort localPort = packet.ReadShort();
			client.LocalIP = localIP;
			client.Out.SendUDPInitReply();
		    if (client.Account.PrivLevel > 1 && ServerProperties.Properties.ENABLE_DEBUG)
		        client.Out.SendDebugMessage("local IP:{0} port:{1}", localIP, localPort);
		}
Esempio n. 28
0
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			ushort checkerOID = packet.ReadShort();
			ushort targetOID = packet.ReadShort();
			ushort response = packet.ReadShort();
			ushort unknow = packet.ReadShort();

			new HandleCheckAction(client.Player, checkerOID, targetOID, response).Start(1);
		}
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			ushort data1 = packet.ReadShort();
			ushort data2 = packet.ReadShort();
			ushort data3 = packet.ReadShort();
			var messageType = (byte) packet.ReadByte();
			var response = (byte) packet.ReadByte();

			new DialogBoxResponseAction(client.Player, data1, data2, data3, messageType, response).Start(1);
		}
		public void HandlePacket(GameClient client, GSPacketIn packet)
		{
			string name = packet.ReadString(30);

			//TODO do bad name checks here from some database with
			//bad names, this is just a temp testthing here
			var bad = GameServer.Instance.PlayerManager.InvalidNames[name];

			client.Out.SendBadNameCheckReply(name,bad);
		}
Esempio n. 31
0
 public bool HandleCommand(TankMarryLogicProcessor process, GamePlayer player, GSPacketIn packet)
 {
     if (player.CurrentMarryRoom != null && player.CurrentMarryRoom.RoomState == eRoomState.FREE)
     {
         if (player.PlayerCharacter.ID == player.CurrentMarryRoom.Info.GroomID || player.PlayerCharacter.ID == player.CurrentMarryRoom.Info.BrideID)
         {
             int userID = packet.ReadInt();
             player.CurrentMarryRoom.KickPlayerByUserID(player, userID);
             return(true);
         }
     }
     return(false);
 }
Esempio n. 32
0
        public void SendPlayerState()
        {
            GSPacketIn pkg = this.m_host.Out.SendRoomUpdatePlayerStates(this.m_playerState);

            this.SendToAll(pkg, this.m_host);
        }
Esempio n. 33
0
        public bool AddPlayerUnsafe(GamePlayer player)
        {
            int index = -1;

            GamePlayer[] places;
            Monitor.Enter(places = this.m_places);
            try
            {
                for (int i = 0; i < 8; i++)
                {
                    if (this.m_places[i] == null && this.m_placesState[i] == -1)
                    {
                        this.m_places[i]      = player;
                        this.m_placesState[i] = player.PlayerId;
                        this.m_playerCount++;
                        index = i;
                        break;
                    }
                }
            }
            finally
            {
                Monitor.Exit(places);
            }
            if (index != -1)
            {
                player.CurrentRoom      = this;
                player.CurrentRoomIndex = index;
                if (this.RoomType == eRoomType.Freedom)
                {
                    player.CurrentRoomTeam = index % 2 + 1;
                }
                else
                {
                    player.CurrentRoomTeam = 1;
                }
                GSPacketIn pkg = player.Out.SendRoomPlayerAdd(player);
                this.SendToAll(pkg, player);
                GSPacketIn bufferPkg = player.Out.SendBufferList(player, player.BufferList.GetAllBuffer());
                this.SendToAll(bufferPkg, player);
                List <GamePlayer> list = this.GetPlayers();
                foreach (GamePlayer p in list)
                {
                    if (p != player)
                    {
                        player.Out.SendRoomPlayerAdd(p);
                        player.Out.SendBufferList(p, p.BufferList.GetAllBuffer());
                    }
                }
                if (this.m_host == null)
                {
                    this.m_host = player;
                    this.UpdatePlayerState(player, 2, true);
                }
                else
                {
                    this.UpdatePlayerState(player, 0, true);
                }
                this.SendPlaceState();
                this.UpdateGameStyle();
            }
            return(index != -1);
        }
Esempio n. 34
0
        public bool HandleCommand(TankMarryLogicProcessor process, GamePlayer player, GSPacketIn packet)
        {
            if (player.CurrentMarryRoom == null || player.CurrentMarryRoom.RoomState != eRoomState.FREE)
            {
                return(false);
            }

            if (player.PlayerCharacter.ID != player.CurrentMarryRoom.Info.GroomID && player.PlayerCharacter.ID != player.CurrentMarryRoom.Info.BrideID)
            {
                return(false);
            }

            int needMoney = GameProperties.PRICE_PROPOSE;

            if (player.CurrentMarryRoom.Info.IsHymeneal)
            {
                if (player.PlayerCharacter.Money < needMoney)
                {
                    player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("UserFirecrackersCommand.MoneyNotEnough"));
                    return(false);
                }
            }

            GamePlayer Groom = player.CurrentMarryRoom.GetPlayerByUserID(player.CurrentMarryRoom.Info.GroomID);

            if (Groom == null)
            {
                player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("HymenealCommand.NoGroom"));
                return(false);
            }

            GamePlayer Bride = player.CurrentMarryRoom.GetPlayerByUserID(player.CurrentMarryRoom.Info.BrideID);

            if (Bride == null)
            {
                player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("HymenealCommand.NoBride"));
                return(false);
            }

            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(170 * 1000);

                if (!player.PlayerCharacter.IsGotRing)
                {
                    isFirst = true;
                    ItemTemplateInfo ringTemplate = ItemMgr.FindItemTemplate(9022);
                    ItemInfo         ring1        = ItemInfo.CreateFromTemplate(ringTemplate, 1, (int)ItemAddType.webing);
                    ring1.IsBinds = true;
                    //Groom.CurrentInventory.AddItem(ring1, 11);
                    using (PlayerBussiness pb = new PlayerBussiness())
                    {
                        ring1.UserID = 0;
                        pb.AddGoods(ring1);

                        string content = LanguageMgr.GetTranslation("HymenealCommand.Content", Bride.PlayerCharacter.NickName);

                        MailInfo mail = new MailInfo();
                        mail.Annex1     = ring1.ItemID.ToString();
                        mail.Content    = content;
                        mail.Gold       = 0;
                        mail.IsExist    = true;
                        mail.Money      = 0;
                        mail.Receiver   = Groom.PlayerCharacter.NickName;
                        mail.ReceiverID = Groom.PlayerCharacter.ID;
                        mail.Sender     = LanguageMgr.GetTranslation("HymenealCommand.Sender");
                        mail.SenderID   = 0;
                        mail.Title      = LanguageMgr.GetTranslation("HymenealCommand.Title");
                        mail.Type       = (int)eMailType.Marry;
                        if (pb.SendMail(mail))
                        {
                            result = true;
                        }
                        player.Out.SendMailResponse(mail.ReceiverID, eMailRespose.Receiver);
                    }


                    ItemInfo ring2 = ItemInfo.CreateFromTemplate(ringTemplate, 1, (int)ItemAddType.webing);
                    ring2.IsBinds = true;
                    //Bride.CurrentInventory.AddItem(ring2, 11);
                    using (PlayerBussiness pb = new PlayerBussiness())
                    {
                        ring2.UserID = 0;
                        pb.AddGoods(ring2);

                        string content = LanguageMgr.GetTranslation("HymenealCommand.Content", 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.Receiver   = Bride.PlayerCharacter.NickName;
                        mail.ReceiverID = Bride.PlayerCharacter.ID;
                        mail.Sender     = LanguageMgr.GetTranslation("HymenealCommand.Sender");
                        mail.SenderID   = 0;
                        mail.Title      = LanguageMgr.GetTranslation("HymenealCommand.Title");
                        mail.Type       = (int)eMailType.Marry;
                        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);

                        //更新IsGotRing的数据库
                        db.UpdatePlayerGotRingProp(Groom.PlayerCharacter.ID, Bride.PlayerCharacter.ID);

                        //通过数据库读入PlayerCharacter内存
                        Groom.LoadMarryProp();
                        Bride.LoadMarryProp();
                    }

                    //Groom.PlayerCharacter.IsGotRing = true;
                    //Bride.PlayerCharacter.IsGotRing = true;
                }
                else
                {
                    isFirst = false;
                    result  = true;
                }

                if (!isFirst)
                {
                    //player.SetMoney(-needMoney, MoneyRemoveType.Marry);
                    player.RemoveMoney(needMoney);
                    LogMgr.LogMoneyAdd(LogMoneyType.Marry, LogMoneyType.Marry_Hymeneal, player.PlayerCharacter.ID, needMoney, player.PlayerCharacter.Money, 0, 0, 0, "", "", "");
                    CountBussiness.InsertSystemPayCount(player.PlayerCharacter.ID, needMoney, 0, (int)eConsumerType.Marry, (int)eSubConsumerType.Marry_Hymeneal);
                }

                pkg.WriteInt(player.CurrentMarryRoom.Info.ID);
                pkg.WriteBoolean(result);
                //0 player.CurrentMarryRoom.SendToAll(pkg);
                //0 player.CurrentMarryRoom.SendToAllForScene(pkg,1);
                player.CurrentMarryRoom.SendToAll(pkg);

                if (result)
                {
                    string     msg     = LanguageMgr.GetTranslation("HymenealCommand.Succeed", Groom.PlayerCharacter.NickName, Bride.PlayerCharacter.NickName);
                    GSPacketIn message = player.Out.SendMessage(eMessageType.ChatNormal, msg);
                    player.CurrentMarryRoom.SendToPlayerExceptSelfForScene(message, player);
                }
            }

            return(true);
        }
Esempio n. 35
0
        public override int HandlePacket(GamePlayer player, GSPacketIn packet)
        {
            GSPacketIn pkg = packet.Clone();

            pkg.ClearContext();
            string nickName = packet.ReadString();
            int    relation = packet.ReadInt();
            int    result;

            if (relation < 0 || relation > 1)
            {
                result = 1;
            }
            else
            {
                using (PlayerBussiness db = new PlayerBussiness())
                {
                    GamePlayer other = WorldMgr.GetClientByPlayerNickName(nickName);
                    PlayerInfo user;
                    if (other != null)
                    {
                        user = other.PlayerCharacter;
                    }
                    else
                    {
                        user = db.GetUserSingleByNickName(nickName);
                    }
                    if (!string.IsNullOrEmpty(nickName) && user != null)
                    {
                        if (!player.Friends.ContainsKey(user.ID) || player.Friends[user.ID] != relation)
                        {
                            if (db.AddFriends(new FriendInfo
                            {
                                FriendID = user.ID,
                                IsExist = true,
                                Remark = "",
                                UserID = player.PlayerCharacter.ID,
                                Relation = relation
                            }))
                            {
                                player.FriendsAdd(user.ID, relation);
                                pkg.WriteInt(user.ID);
                                pkg.WriteString(user.NickName);
                                pkg.WriteBoolean(user.Sex);
                                pkg.WriteString(user.Style);
                                pkg.WriteString(user.Colors);
                                pkg.WriteString(user.Skin);
                                pkg.WriteInt((user.State == 1) ? 1 : 0);
                                pkg.WriteInt(user.Grade);
                                pkg.WriteInt(user.Hide);
                                pkg.WriteString(user.ConsortiaName);
                                pkg.WriteInt(user.Total);
                                pkg.WriteInt(user.Escape);
                                pkg.WriteInt(user.Win);
                                pkg.WriteInt(user.Offer);
                                pkg.WriteInt(user.Repute);
                                pkg.WriteInt(relation);
                                pkg.WriteString(user.UserName);
                                pkg.WriteInt(user.Nimbus);
                                pkg.WriteInt(user.FightPower);
                                pkg.WriteInt(user.AchievementPoint);
                                pkg.WriteString(user.Honor);
                                if (relation != 1 && user.State != 0)
                                {
                                    GSPacketIn response = new GSPacketIn(166, player.PlayerCharacter.ID);
                                    response.WriteInt(user.ID);
                                    response.WriteString(player.PlayerCharacter.NickName);
                                    if (other != null)
                                    {
                                        other.Out.SendTCP(response);
                                    }
                                    else
                                    {
                                        GameServer.Instance.LoginServer.SendPacket(response);
                                    }
                                }
                                player.Out.SendTCP(pkg);
                            }
                        }
                        else
                        {
                            player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("FriendAddHandler.Falied", new object[0]));
                        }
                    }
                    else
                    {
                        player.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("FriendAddHandler.Success", new object[0]));
                    }
                }
                result = 0;
            }
            return(result);
        }
        /// <summary>
        /// Handle the packet
        /// </summary>
        /// <param name="client"></param>
        /// <param name="packet"></param>
        /// <returns></returns>
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            int unknown     = packet.ReadByte();
            int position    = packet.ReadByte();
            int housenumber = packet.ReadShort();
            int method      = packet.ReadByte();

            House house = HouseMgr.GetHouse(client.Player.CurrentRegionID, housenumber);

            if (house == null)
            {
                return;
            }
            if (client.Player == null)
            {
                return;
            }

            //log.DebugFormat("House PickupItem - Method: {0}, Position: {0}", method, position);

            switch (method)
            {
            case 1:                     //garden item
                                        // no permission to remove items from the garden, return
                if (!house.CanChangeGarden(client.Player, DecorationPermissions.Remove))
                {
                    return;
                }

                foreach (var entry in house.OutdoorItems)
                {
                    // continue if this is not the item in question
                    OutdoorItem oitem = entry.Value;
                    if (oitem.Position != position)
                    {
                        continue;
                    }

                    int i = entry.Key;
                    GameServer.Database.DeleteObject(oitem.DatabaseItem);                             //delete the database instance

                    // return indoor item into inventory item, add to player inventory
                    var invitem = GameInventoryItem.Create((house.OutdoorItems[i]).BaseItem);
                    if (client.Player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, invitem))
                    {
                        InventoryLogging.LogInventoryAction("(HOUSE;" + house.HouseNumber + ")", client.Player, eInventoryActionType.Other, invitem.Template, invitem.Count);
                    }
                    house.OutdoorItems.Remove(i);

                    // update garden
                    client.Out.SendGarden(house);

                    ChatUtil.SendSystemMessage(client, "Garden object removed.");
                    ChatUtil.SendSystemMessage(client, string.Format("You get {0} and put it in your backpack.", invitem.Name));
                    return;
                }

                //no object @ position
                ChatUtil.SendSystemMessage(client, "There is no Garden Tile at slot " + position + "!");
                break;

            case 2:
            case 3:                     //wall/floor mode
                                        // no permission to remove items from the interior, return
                if (!house.CanChangeInterior(client.Player, DecorationPermissions.Remove))
                {
                    return;
                }

                if (house.IndoorItems.ContainsKey(position) == false)
                {
                    return;
                }

                IndoorItem iitem = house.IndoorItems[position];
                if (iitem == null)
                {
                    client.Player.Out.SendMessage("error: id was null", eChatType.CT_Help, eChatLoc.CL_SystemWindow);
                    return;
                }

                if (iitem.BaseItem != null)
                {
                    var item = GameInventoryItem.Create((house.IndoorItems[(position)]).BaseItem);
                    if (GetItemBack(item))
                    {
                        if (client.Player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, item))
                        {
                            string removalMsg = string.Format("The {0} is cleared from the {1}.", item.Name,
                                                              (method == 2 ? "wall surface" : "floor"));

                            ChatUtil.SendSystemMessage(client, removalMsg);
                            InventoryLogging.LogInventoryAction("(HOUSE;" + house.HouseNumber + ")", client.Player, eInventoryActionType.Other, item.Template, item.Count);
                        }
                        else
                        {
                            ChatUtil.SendSystemMessage(client, "You need place in your inventory !");
                            return;
                        }
                    }
                    else
                    {
                        ChatUtil.SendSystemMessage(client, "The " + item.Name + " is cleared from the wall surface.");
                    }
                }
                else if (iitem.DatabaseItem.BaseItemID.Contains("GuildBanner"))
                {
                    var it = new ItemTemplate
                    {
                        Id_nb         = iitem.DatabaseItem.BaseItemID,
                        CanDropAsLoot = false,
                        IsDropable    = true,
                        IsPickable    = true,
                        IsTradable    = true,
                        Item_Type     = 41,
                        Level         = 1,
                        MaxCharges    = 1,
                        MaxCount      = 1,
                        Model         = iitem.DatabaseItem.Model,
                        Emblem        = iitem.DatabaseItem.Emblem,
                        Object_Type   = (int)eObjectType.HouseWallObject,
                        Realm         = 0,
                        Quality       = 100
                    };

                    string[] idnb = iitem.DatabaseItem.BaseItemID.Split('_');
                    it.Name = idnb[1] + "'s Banner";

                    // TODO: Once again with guild banners, templates are memory only and will not load correctly once player logs out - tolakram
                    var inv = GameInventoryItem.Create(it);
                    if (client.Player.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, inv))
                    {
                        string invMsg = string.Format("The {0} is cleared from the {1}.", inv.Name,
                                                      (method == 2 ? "wall surface" : "floor"));

                        ChatUtil.SendSystemMessage(client, invMsg);
                        InventoryLogging.LogInventoryAction("(HOUSE;" + house.HouseNumber + ")", client.Player, eInventoryActionType.Other, inv.Template, inv.Count);
                    }
                    else
                    {
                        ChatUtil.SendSystemMessage(client, "You need place in your inventory !");
                        return;
                    }
                }
                else if (method == 2)
                {
                    ChatUtil.SendSystemMessage(client, "The decoration item is cleared from the wall surface.");
                }
                else
                {
                    ChatUtil.SendSystemMessage(client, "The decoration item is cleared from the floor.");
                }

                GameServer.Database.DeleteObject((house.IndoorItems[(position)]).DatabaseItem);
                house.IndoorItems.Remove(position);

                var pak = new GSTCPPacketOut(client.Out.GetPacketCode(eServerPackets.HousingItem));
                pak.WriteShort((ushort)housenumber);
                pak.WriteByte(0x01);
                pak.WriteByte(0x00);
                pak.WriteByte((byte)position);
                pak.WriteByte(0x00);

                foreach (GamePlayer plr in house.GetAllPlayersInHouse())
                {
                    plr.Out.SendTCP(pak);
                }

                break;
            }
        }
Esempio n. 37
0
        public bool RemovePlayerUnsafe(GamePlayer player, bool isKick)
        {
            int index = -1;

            GamePlayer[] places;
            Monitor.Enter(places = this.m_places);
            try
            {
                for (int i = 0; i < 8; i++)
                {
                    if (this.m_places[i] == player)
                    {
                        this.m_places[i]      = null;
                        this.m_playerState[i] = 0;
                        this.m_placesState[i] = -1;
                        this.m_playerCount--;
                        index = i;
                        break;
                    }
                }
            }
            finally
            {
                Monitor.Exit(places);
            }
            if (index != -1)
            {
                this.UpdatePosUnsafe(index, true);
                player.CurrentRoom = null;
                GSPacketIn pkg = player.Out.SendRoomPlayerRemove(player);
                this.SendToAll(pkg);
                if (isKick)
                {
                    player.Out.SendMessage(eMessageType.ChatERROR, LanguageMgr.GetTranslation("Game.Server.SceneGames.KickRoom", new object[0]));
                }
                bool isChangeHost = false;
                if (this.m_host == player)
                {
                    if (this.m_playerCount > 0)
                    {
                        for (int i = 0; i < 8; i++)
                        {
                            if (this.m_places[i] != null)
                            {
                                this.SetHost(this.m_places[i]);
                                isChangeHost = true;
                                break;
                            }
                        }
                    }
                    else
                    {
                        this.m_host = null;
                    }
                }
                if (this.IsPlaying)
                {
                    if (this.m_game != null)
                    {
                        if (isChangeHost && this.m_game is PVEGame)
                        {
                            PVEGame pveGame = this.m_game as PVEGame;
                            foreach (Player p in pveGame.Players.Values)
                            {
                                if (p.PlayerDetail == this.m_host)
                                {
                                    p.Ready = false;
                                }
                            }
                        }
                        this.m_game.RemovePlayer(player, isKick);
                    }
                    if (this.BattleServer != null)
                    {
                        if (this.m_game != null)
                        {
                            this.BattleServer.Server.SendPlayerDisconnet(this.Game.Id, player.GamePlayerId, this.RoomId);
                            if (this.PlayerCount == 0)
                            {
                                this.BattleServer.RemoveRoom(this);
                            }
                            player.RemoveGP(player.PlayerCharacter.Grade * 12);
                            if (this.GameType == eGameType.Guild)
                            {
                                player.RemoveOffer(15);
                            }
                            else
                            {
                                if (this.GameType == eGameType.Free)
                                {
                                    player.RemoveOffer(5);
                                }
                            }
                        }
                        else
                        {
                            this.SendMessage(eMessageType.ChatERROR, LanguageMgr.GetTranslation("Game.Server.SceneGames.PairUp.Failed", new object[0]));
                            RoomMgr.AddAction(new CancelPickupAction(this.BattleServer, this));
                            this.BattleServer.RemoveRoom(this);
                            this.IsPlaying = false;
                        }
                    }
                }
                this.UpdateGameStyle();
                if (isChangeHost)
                {
                    if (!(this.m_game is PVEGame) || !this.IsPlaying)
                    {
                        this.ResetRoomSetting();
                    }
                }
            }
            return(index != -1);
        }
Esempio n. 38
0
 public int HandlePacket(GameClient client, GSPacketIn packet)
 {
     ClientErrorLog.log.Error("client log: " + packet.ReadString());
     return(0);
 }
Esempio n. 39
0
 public void SendToTeam(GSPacketIn pkg, int team)
 {
     this.SendToTeam(pkg, team, null);
 }
Esempio n. 40
0
 public bool HandleCommand(TankHotSpringLogicProcessor process, GamePlayer player, GSPacketIn packet)
 {
     if ((player.CurrentHotSpringRoom != null) && (player.CurrentHotSpringRoom.RoomState == eRoomState.FREE))
     {
         string str = packet.ReadString();
         int    num = packet.ReadInt();
         player.X = packet.ReadInt();
         player.Y = packet.ReadInt();
         player.CurrentHotSpringRoom.ReturnPacketForScene(player, packet);
         return(true);
     }
     return(false);
 }
Esempio n. 41
0
        /// <summary>
        /// Called when the client receives bytes
        /// </summary>
        /// <param name="numBytes">The number of bytes received</param>
        public void ReceiveBytes(int numBytes)
        {
            lock (m_SyncLock)
            {
                byte[] buffer = m_client.ReceiveBuffer;

                //End Offset of buffer
                int bufferSize = m_client.ReceiveBufferOffset + numBytes;

                //Size < minimum
                if (bufferSize < GSPacketIn.HDR_SIZE)
                {
                    m_client.ReceiveBufferOffset = bufferSize;                     // undo buffer read
                    return;
                }

                //Reset the offset
                m_client.ReceiveBufferOffset = 0;

                //Current offset into the buffer
                int curOffset = 0;

                do
                {
                    int packetLength = (buffer[curOffset] << 8) + buffer[curOffset + 1] + GSPacketIn.HDR_SIZE;
                    int dataLeft     = bufferSize - curOffset;

                    if (dataLeft < packetLength)
                    {
                        Buffer.BlockCopy(buffer, curOffset, buffer, 0, dataLeft);
                        m_client.ReceiveBufferOffset = dataLeft;
                        break;
                    }

                    // ** commented out because this hasn't been used in forever and crutching
                    // ** to it only hurts performance in a design that needs to be reworked
                    // ** anyways.
                    // **                                                               - tobz
                    //var curPacket = new byte[packetLength];
                    //Buffer.BlockCopy(buffer, curOffset, curPacket, 0, packetLength);
                    //curPacket = m_encoding.DecryptPacket(buffer, false);

                    int packetEnd = curOffset + packetLength;

                    int calcCheck = CalculateChecksum(buffer, curOffset, packetLength - 2);
                    int pakCheck  = (buffer[packetEnd - 2] << 8) | (buffer[packetEnd - 1]);

                    if (pakCheck != calcCheck)
                    {
                        if (log.IsWarnEnabled)
                        {
                            log.WarnFormat(
                                "Bad TCP packet checksum (packet:0x{0:X4} calculated:0x{1:X4}) -> disconnecting\nclient: {2}\ncurOffset={3}; packetLength={4}",
                                pakCheck, calcCheck, m_client.ToString(), curOffset, packetLength);
                        }

                        if (log.IsInfoEnabled)
                        {
                            log.Info("Last client sent/received packets (from older to newer):");

                            foreach (IPacket prevPak in GetLastPackets())
                            {
                                log.Info(prevPak.ToHumanReadable());
                            }

                            log.Info(Marshal.ToHexDump("Last Received Bytes : ", buffer));
                        }

                        m_client.Disconnect();
                        return;
                    }

                    var pak = new GSPacketIn(packetLength - GSPacketIn.HDR_SIZE);
                    pak.Load(buffer, curOffset, packetLength);

                    try
                    {
                        HandlePacket(pak);
                    }
                    catch (Exception e)
                    {
                        if (log.IsErrorEnabled)
                        {
                            log.Error("HandlePacket(pak)", e);
                        }
                    }

                    curOffset += packetLength;
                } while (bufferSize - 1 > curOffset);

                if (bufferSize - 1 == curOffset)
                {
                    buffer[0] = buffer[curOffset];
                    m_client.ReceiveBufferOffset = 1;
                }
            }
        }
Esempio n. 42
0
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            int    unk1        = packet.ReadByte();
            int    position    = packet.ReadByte();
            ushort housenumber = packet.ReadShort();
            ushort angle       = packet.ReadShort();
            ushort unk2        = packet.ReadShort();

            // rotation only works for inside items
            if (!client.Player.InHouse)
            {
                return;
            }

            // house is null, return
            var house = HouseMgr.GetHouse(housenumber);

            if (house == null)
            {
                return;
            }

            // player is null, return
            if (client.Player == null)
            {
                return;
            }

            // no permission to change the interior, return
            if (!house.CanChangeInterior(client.Player, DecorationPermissions.Add))
            {
                return;
            }

            if (house.IndoorItems.ContainsKey(position) == false)
            {
                return;
            }

            // grab the item in question
            IndoorItem iitem = house.IndoorItems[position];

            if (iitem == null)
            {
                client.Player.Out.SendMessage("error: id was null", eChatType.CT_Help, eChatLoc.CL_SystemWindow);
                return;
            }             //should this ever happen?

            // adjust the item's roation
            int old = iitem.Rotation;

            iitem.Rotation = (iitem.Rotation + angle) % 360;

            if (iitem.Rotation < 0)
            {
                iitem.Rotation = 360 + iitem.Rotation;
            }

            iitem.DatabaseItem.Rotation = iitem.Rotation;

            // save item
            GameServer.Database.SaveObject(iitem.DatabaseItem);

            ChatUtil.SendSystemMessage(client,
                                       string.Format("Interior decoration rotated from {0} degrees to {1}", old, iitem.Rotation));

            // update all players in the house.
            foreach (GamePlayer plr in house.GetAllPlayersInHouse())
            {
                plr.Client.Out.SendFurniture(house, position);
            }
        }
Esempio n. 43
0
        public void HandlePacket(GSPacketIn packet)
        {
            if (packet == null || m_client == null)
            {
                return;
            }

            int code = packet.ID;

            Statistics.BytesIn += packet.PacketSize;
            Statistics.PacketsIn++;

            SavePacket(packet);

            IPacketHandler packetHandler = null;

            if (code < m_packetHandlers.Length)
            {
                packetHandler = m_packetHandlers[code];
            }

            else if (log.IsErrorEnabled)
            {
                log.ErrorFormat("Received packet code is outside of m_packetHandlers array bounds! " + m_client);
                log.Error(Marshal.ToHexDump(
                              String.Format("===> <{2}> Packet 0x{0:X2} (0x{1:X2}) length: {3} (ThreadId={4})", code, code ^ 168,
                                            (m_client.Account != null) ? m_client.Account.Name : m_client.TcpEndpoint,
                                            packet.PacketSize, Thread.CurrentThread.ManagedThreadId),
                              packet.ToArray()));
            }

            // make sure we can handle this packet at this stage
            var preprocess = m_packetPreprocessor.CanProcessPacket(m_client, packet);

            if (!preprocess)
            {
                // this packet can't be processed by this client right now, for whatever reason
                log.Info("PacketPreprocessor: Preprocessor prevents handling of a packet with packet.ID=" + packet.ID);
                return;
            }

            if (packetHandler != null)
            {
                Timer monitorTimer = null;
                if (log.IsDebugEnabled)
                {
                    try
                    {
                        monitorTimer          = new Timer(10000);
                        m_activePacketHandler = packetHandler;
                        m_handlerThreadID     = Thread.CurrentThread.ManagedThreadId;
                        monitorTimer.Elapsed += HandlePacketTimeout;
                        monitorTimer.Start();
                    }
                    catch (Exception e)
                    {
                        if (log.IsErrorEnabled)
                        {
                            log.Error("Starting packet monitor timer", e);
                        }

                        if (monitorTimer != null)
                        {
                            monitorTimer.Stop();
                            monitorTimer.Close();
                            monitorTimer = null;
                        }
                    }
                }

#if LOGACTIVESTACKS
                //Put the current thread into the active thread list!
                //No need to lock the hashtable since we created it
                //synchronized! One reader, multiple writers supported!
                m_activePacketThreads.Add(Thread.CurrentThread, m_client);
#endif
                long start = Environment.TickCount;
                try
                {
                    packetHandler.HandlePacket(m_client, packet);
                }
                catch (Exception e)
                {
                    if (log.IsErrorEnabled)
                    {
                        string client = (m_client == null ? "null" : m_client.ToString());
                        log.Error(
                            "Error while processing packet (handler=" + packetHandler.GetType().FullName + "  client: " + client + ")", e);
                    }
                }
#if LOGACTIVESTACKS
                finally
                {
                    //Remove the thread from the active list after execution
                    //No need to lock the hashtable since we created it
                    //synchronized! One reader, multiple writers supported!
                    m_activePacketThreads.Remove(Thread.CurrentThread);
                }
#endif
                long timeUsed = Environment.TickCount - start;
                if (monitorTimer != null)
                {
                    monitorTimer.Stop();
                    monitorTimer.Close();
                }
                m_activePacketHandler = null;
                if (timeUsed > 1000)
                {
                    string source = ((m_client.Account != null) ? m_client.Account.Name : m_client.TcpEndpoint);
                    if (log.IsWarnEnabled)
                    {
                        log.Warn("(" + source + ") Handle packet Thread " + Thread.CurrentThread.ManagedThreadId + " " + packetHandler +
                                 " took " + timeUsed + "ms!");
                    }
                }
            }
        }
Esempio n. 44
0
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            var LittleGame_cmd = packet.ReadByte();

            return(0);
        }
Esempio n. 45
0
 public void HandlePacket(GameClient client, GSPacketIn packet)
 {
     new PlayerInitRequestAction(client.Player).Start(1);
 }
Esempio n. 46
0
 public void SendToAll(GSPacketIn pkg)
 {
     this.SendToAll(pkg, null);
 }
Esempio n. 47
0
 public void Execute()
 {
     if (this.m_room.CanStart())
     {
         List <GamePlayer> players = this.m_room.GetPlayers();
         if (this.m_room.RoomType == eRoomType.Freedom)
         {
             List <IGamePlayer> list  = new List <IGamePlayer>();
             List <IGamePlayer> list2 = new List <IGamePlayer>();
             foreach (GamePlayer current in players)
             {
                 if (current != null)
                 {
                     if (current.CurrentRoomTeam == 1)
                     {
                         list.Add(current);
                     }
                     else
                     {
                         list2.Add(current);
                     }
                 }
             }
             BaseGame game = GameMgr.StartPVPGame(this.m_room.RoomId, list, list2, this.m_room.MapId, this.m_room.RoomType, this.m_room.GameType, (int)this.m_room.TimeMode);
             this.StartGame(game);
         }
         else
         {
             if (this.m_room.RoomType == eRoomType.Dungeon || this.m_room.RoomType == eRoomType.Freshman || this.m_room.RoomType == eRoomType.Lanbyrinth || this.m_room.RoomType == eRoomType.ConsortiaBoss || this.m_room.RoomType == eRoomType.AcademyDungeon || this.m_room.RoomType == eRoomType.FightLib || this.m_room.RoomType == eRoomType.WordBoss)
             {
                 List <IGamePlayer> list3 = new List <IGamePlayer>();
                 foreach (GamePlayer current2 in players)
                 {
                     if (current2 != null)
                     {
                         list3.Add(current2);
                     }
                 }
                 this.UpdatePveRoomTimeMode();
                 BaseGame game2 = GameMgr.StartPVEGame(this.m_room.RoomId, list3, this.m_room.MapId, this.m_room.RoomType, this.m_room.GameType, (int)this.m_room.TimeMode, this.m_room.HardLevel, this.m_room.LevelLimits);
                 this.StartGame(game2);
             }
             else
             {
                 if (this.m_room.RoomType == eRoomType.Match)
                 {
                     this.m_room.UpdateAvgLevel();
                     BattleServer battleServer = BattleMgr.AddRoom(this.m_room);
                     if (battleServer != null)
                     {
                         this.m_room.BattleServer = battleServer;
                         this.m_room.IsPlaying    = true;
                         this.m_room.SendStartPickUp();
                     }
                     else
                     {
                         GSPacketIn pkg = this.m_room.Host.Out.SendMessage(eMessageType.ChatERROR, "Game đã bắt đầu!");
                         this.m_room.SendToAll(pkg, this.m_room.Host);
                         this.m_room.SendCancelPickUp();
                     }
                 }
             }
         }
         RoomMgr.WaitingRoom.SendUpdateRoom(this.m_room);
     }
 }
Esempio n. 48
0
 public void HandlePacket(GameClient client, GSPacketIn packet)
 {
     new HandleGroupInviteAction(client.Player).Start(1);
 }
Esempio n. 49
0
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            AASInfo aASInfo = new AASInfo();

            aASInfo.UserID = client.Player.PlayerCharacter.ID;
            bool flag  = false;
            bool flag2 = packet.ReadBoolean();
            bool flag3;

            if (flag2)
            {
                aASInfo.Name     = "";
                aASInfo.IDNumber = "";
                aASInfo.State    = 0;
                flag3            = true;
            }
            else
            {
                aASInfo.Name     = packet.ReadString();
                aASInfo.IDNumber = packet.ReadString();
                flag3            = this.CheckIDNumber(aASInfo.IDNumber);
                if (aASInfo.IDNumber != "")
                {
                    client.Player.IsAASInfo = true;
                    int num   = Convert.ToInt32(aASInfo.IDNumber.Substring(6, 4));
                    int value = Convert.ToInt32(aASInfo.IDNumber.Substring(10, 2));
                    if (DateTime.Now.Year.CompareTo(num + 18) > 0 || (DateTime.Now.Year.CompareTo(num + 18) == 0 && DateTime.Now.Month.CompareTo(value) >= 0))
                    {
                        client.Player.IsMinor = false;
                    }
                }
                if (aASInfo.Name != "" && flag3)
                {
                    aASInfo.State = 1;
                }
                else
                {
                    aASInfo.State = 0;
                }
            }
            if (flag3)
            {
                client.Out.SendAASState(false);
                using (ProduceBussiness produceBussiness = new ProduceBussiness())
                {
                    flag = produceBussiness.AddAASInfo(aASInfo);
                    client.Out.SendAASInfoSet(flag);
                }
            }
            if (flag && aASInfo.State == 1)
            {
                ItemTemplateInfo itemTemplateInfo = ItemMgr.FindItemTemplate(11019);
                if (itemTemplateInfo != null)
                {
                    ItemInfo itemInfo = ItemInfo.CreateFromTemplate(itemTemplateInfo, 1, 107);
                    if (itemInfo != null)
                    {
                        itemInfo.IsBinds = true;
                        AbstractInventory itemInventory = client.Player.GetItemInventory(itemInfo.Template);
                        if (itemInventory.AddItem(itemInfo, itemInventory.BeginSlot))
                        {
                            client.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("ASSInfoSetHandle.Success", new object[]
                            {
                                itemInfo.Template.Name
                            }));
                        }
                        else
                        {
                            client.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("ASSInfoSetHandle.NoPlace", new object[0]));
                        }
                    }
                }
            }
            return(0);
        }
Esempio n. 50
0
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            byte type = packet.ReadByte();

            return(0);
        }
Esempio n. 51
0
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            if (client.Player.PlayerCharacter.ConsortiaID == 0)
            {
                return(0);
            }


            bool   result = false;
            string msg    = "ConsortiaSmithUpGradeHandler.Failed";

            //using (ConsortiaBussiness db = new ConsortiaBussiness())
            //{
            //    ConsortiaInfo info = db.GetConsortiaSingle(client.Player.PlayerCharacter.ConsortiaID);
            ConsortiaInfo info = Managers.ConsortiaMgr.FindConsortiaInfo(client.Player.PlayerCharacter.ConsortiaID);

            if (info == null)
            {
                msg = "ConsortiaSmithUpGradeHandler.NoConsortia";
            }
            else
            {
                using (ConsortiaBussiness cb = new ConsortiaBussiness())
                {
                    if (cb.UpGradeSmithConsortia(client.Player.PlayerCharacter.ConsortiaID, client.Player.PlayerCharacter.ID, ref msg))
                    {
                        info.SmithLevel++;
                        GameServer.Instance.LoginServer.SendConsortiaSmithUpGrade(info);
                        msg    = "ConsortiaSmithUpGradeHandler.Success";
                        result = true;
                    }
                }
            }
            if (info.SmithLevel >= 3)
            {
                string msg1 = LanguageMgr.GetTranslation("ConsortiaSmithUpGradeHandler.Notice", client.Player.PlayerCharacter.ConsortiaName, info.SmithLevel);

                GSPacketIn pkg = new GSPacketIn((byte)ePackageType.SYS_NOTICE);
                pkg.WriteInt(2);
                pkg.WriteString(msg1);

                GameServer.Instance.LoginServer.SendPacket(pkg);

                GamePlayer[] players = Game.Server.Managers.WorldMgr.GetAllPlayers();

                foreach (GamePlayer p in players)
                {
                    if (p != client.Player)
                    {
                        p.Out.SendTCP(pkg);
                    }
                }
            }
            //}


            packet.WriteBoolean(result);
            packet.WriteString(LanguageMgr.GetTranslation(msg));
            client.Out.SendTCP(packet);


            return(1);
        }
Esempio n. 52
0
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            int    bagType           = packet.ReadInt();
            int    num               = packet.ReadInt();
            string translateId       = null;
            List <ShopItemInfo> list = new List <ShopItemInfo>();

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

            if (num == -1)
            {
                int num2 = packet.ReadInt();
                int num3 = packet.ReadInt();
                int num4 = 0;
                int num5 = 0;
                ItemTemplateInfo goods = ItemMgr.FindItemTemplate(num2);
                itemInfo = ItemInfo.CreateFromTemplate(goods, 1, 102);
                list     = ShopMgr.FindShopbyTemplatID(num2);
                for (int i = 0; i < list.Count; i++)
                {
                    if (list[i].APrice1 == -1 && list[i].AValue1 != 0)
                    {
                        num5 = list[i].AValue1;
                        itemInfo.ValidDate = list[i].AUnit;
                    }
                }
                if (itemInfo != null)
                {
                    if (num4 <= client.Player.PlayerCharacter.Gold && num5 <= client.Player.PlayerCharacter.Money)
                    {
                        client.Player.RemoveMoney(num5);
                        client.Player.RemoveGold(num4);
                        LogMgr.LogMoneyAdd(LogMoneyType.Shop, LogMoneyType.Shop_Card, client.Player.PlayerCharacter.ID, num5, client.Player.PlayerCharacter.Money, num4, 0, 0, 0, "牌子编号", itemInfo.TemplateID.ToString(), num3.ToString());
                        translateId = "CardUseHandler.Success";
                    }
                    else
                    {
                        itemInfo = null;
                    }
                }
            }
            else
            {
                itemInfo    = client.Player.PropBag.GetItemAt(num);
                translateId = "CardUseHandler.Success";
            }
            if (itemInfo != null)
            {
                string translateId2 = string.Empty;
                if (itemInfo.Template.Property1 != 21)
                {
                    AbstractBuffer abstractBuffer = BufferList.CreateBuffer(itemInfo.Template, itemInfo.ValidDate);
                    if (abstractBuffer != null)
                    {
                        abstractBuffer.Start(client.Player);
                        if (num != -1)
                        {
                            client.Player.PropBag.RemoveCountFromStack(itemInfo, 1);
                        }
                    }
                    client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation(translateId, new object[0]));
                }
                else
                {
                    if (itemInfo.IsValidItem())
                    {
                        client.Player.PlayerCharacter.GP += client.Player.AddGP(itemInfo.Template.Property2 * itemInfo.Count);//fix add nuoc kinh nghiem
                        if (itemInfo.Template.CanDelete)
                        {
                            client.Player.RemoveAt((eBageType)bagType, num);
                            translateId2 = "GPDanUser.Success";
                        }
                    }
                    client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation(translateId2, new object[]
                    {
                        itemInfo.Template.Property2 *itemInfo.Count
                    }));
                }
            }
            return(0);
        }
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            try
            {
                int    unknow1     = packet.ReadByte();       // 1=Money 0=Item (?)
                int    slot        = packet.ReadByte();       // Item/money slot
                ushort housenumber = packet.ReadShort();      // N° of house
                int    unknow2     = (byte)packet.ReadByte();
                _position = (byte)packet.ReadByte();
                int method   = packet.ReadByte();               // 2=Wall 3=Floor
                int rotation = packet.ReadByte();               // garden items only
                var xpos     = (short)packet.ReadShort();       // x for inside objs
                var ypos     = (short)packet.ReadShort();       // y for inside objs.
                //Log.Info("U1: " + unknow1 + " - U2: " + unknow2);

                ChatUtil.SendDebugMessage(client, string.Format("HousingPlaceItem: slot: {0}, position: {1}, method: {2}, xpos: {3}, ypos: {4}", slot, _position, method, xpos, ypos));

                if (client.Player == null)
                {
                    return;
                }

                // house must exist
                House house = HouseMgr.GetHouse(client.Player.CurrentRegionID, housenumber);
                if (house == null)
                {
                    client.Player.Out.SendInventorySlotsUpdate(null);
                    return;
                }


                if ((slot >= 244) && (slot <= 248))                 // money
                {
                    // check that player has permission to pay rent
                    if (!house.CanPayRent(client.Player))
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }

                    long moneyToAdd = _position;
                    switch (slot)
                    {
                    case 248:
                        moneyToAdd *= 1;
                        break;

                    case 247:
                        moneyToAdd *= 100;
                        break;

                    case 246:
                        moneyToAdd *= 10000;
                        break;

                    case 245:
                        moneyToAdd *= 10000000;
                        break;

                    case 244:
                        moneyToAdd *= 10000000000;
                        break;
                    }

                    client.Player.TempProperties.setProperty(HousingConstants.MoneyForHouseRent, moneyToAdd);
                    client.Player.TempProperties.setProperty(HousingConstants.HouseForHouseRent, house);
                    client.Player.Out.SendInventorySlotsUpdate(null);
                    client.Player.Out.SendHousePayRentDialog("Housing07");

                    return;
                }

                // make sure the item dropped still exists
                InventoryItem orgitem = client.Player.Inventory.GetItem((eInventorySlot)slot);
                if (orgitem == null)
                {
                    client.Player.Out.SendInventorySlotsUpdate(null);
                    return;
                }

                if (orgitem.Id_nb == "house_removal_deed")
                {
                    client.Out.SendInventorySlotsUpdate(null);

                    // make sure player has owner permissions
                    if (!house.HasOwnerPermissions(client.Player))
                    {
                        ChatUtil.SendSystemMessage(client.Player, "You don't own this house!");
                        return;
                    }

                    client.Player.TempProperties.setProperty(DeedWeak, new WeakRef(orgitem));
                    client.Player.TempProperties.setProperty(TargetHouse, house);
                    client.Player.Out.SendCustomDialog(LanguageMgr.GetTranslation(client.Account.Language, "WARNING: You are about to delete this house and all indoor and outdoor items attached to it!"), HouseRemovalDialog);

                    return;
                }

                if (orgitem.Id_nb.Contains("cottage_deed") || orgitem.Id_nb.Contains("house_deed") ||
                    orgitem.Id_nb.Contains("villa_deed") || orgitem.Id_nb.Contains("mansion_deed"))
                {
                    client.Out.SendInventorySlotsUpdate(null);

                    // make sure player has owner permissions
                    if (!house.HasOwnerPermissions(client.Player))
                    {
                        ChatUtil.SendSystemMessage(client, "You may not change other peoples houses");

                        return;
                    }

                    client.Player.TempProperties.setProperty(DeedWeak, new WeakRef(orgitem));
                    client.Player.TempProperties.setProperty(TargetHouse, house);
                    client.Player.Out.SendMessage("Warning:\n This will remove *all* items from your current house!", eChatType.CT_System, eChatLoc.CL_PopupWindow);
                    client.Player.Out.SendCustomDialog("Are you sure you want to upgrade your House?", HouseUpgradeDialog);

                    return;
                }

                if (orgitem.Name == "deed of guild transfer")
                {
                    // player needs to be in a guild to xfer a house to a guild
                    if (client.Player.Guild == null)
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        ChatUtil.SendSystemMessage(client, "You must be a member of a guild to do that");
                        return;
                    }

                    // player needs to own the house to be able to xfer it
                    if (!house.HasOwnerPermissions(client.Player))
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        ChatUtil.SendSystemMessage(client, "You do not own this house.");
                        return;
                    }

                    // guild can't already have a house
                    if (client.Player.Guild.GuildOwnsHouse)
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        ChatUtil.SendSystemMessage(client, "Your Guild already owns a house.");
                        return;
                    }

                    // player needs to be a GM in the guild to xfer his personal house to the guild
                    if (!client.Player.Guild.HasRank(client.Player, Guild.eRank.Leader))
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        ChatUtil.SendSystemMessage(client, "You are not the leader of a guild.");
                        return;
                    }

                    if (HouseMgr.HouseTransferToGuild(client.Player, house))
                    {
                        // This will still take the item even if player answers NO to confirmation.
                        // I'm fixing consignment, not housing, and frankly I'm sick of fixing stuff!  :)  - tolakram
                        client.Player.Inventory.RemoveItem(orgitem);
                        InventoryLogging.LogInventoryAction(client.Player, "(HOUSE;" + housenumber + ")", eInventoryActionType.Other, orgitem.Template, orgitem.Count);
                        client.Player.Guild.UpdateGuildWindow();
                    }
                    return;
                }

                if (house.CanChangeInterior(client.Player, DecorationPermissions.Remove))
                {
                    if (orgitem.Name == "interior banner removal")
                    {
                        house.IndoorGuildBanner = false;
                        ChatUtil.SendSystemMessage(client.Player, "Scripts.Player.Housing.InteriorBannersRemoved", null);
                        return;
                    }

                    if (orgitem.Name == "interior shield removal")
                    {
                        house.IndoorGuildShield = false;
                        ChatUtil.SendSystemMessage(client.Player, "Scripts.Player.Housing.InteriorShieldsRemoved", null);
                        return;
                    }

                    if (orgitem.Name == "carpet removal")
                    {
                        house.Rug1Color = 0;
                        house.Rug2Color = 0;
                        house.Rug3Color = 0;
                        house.Rug4Color = 0;
                        ChatUtil.SendSystemMessage(client.Player, "Scripts.Player.Housing.CarpetsRemoved", null);
                        return;
                    }
                }

                if (house.CanChangeExternalAppearance(client.Player))
                {
                    if (orgitem.Name == "exterior banner removal")
                    {
                        house.OutdoorGuildBanner = false;
                        ChatUtil.SendSystemMessage(client.Player, "Scripts.Player.Housing.OutdoorBannersRemoved", null);
                        return;
                    }

                    if (orgitem.Name == "exterior shield removal")
                    {
                        house.OutdoorGuildShield = false;
                        ChatUtil.SendSystemMessage(client.Player, "Scripts.Player.Housing.OutdoorShieldsRemoved", null);
                        return;
                    }
                }

                int objType = orgitem.Object_Type;
                if (objType == 49)                 // Garden items
                {
                    method = 1;
                }
                else if (orgitem.Id_nb == "housing_porch_deed" || orgitem.Id_nb == "housing_porch_remove_deed" || orgitem.Id_nb == "housing_consignment_deed")
                {
                    method = 4;
                }
                else if (objType >= 59 && objType <= 64)                 // Outdoor Roof/Wall/Door/Porch/Wood/Shutter/awning Material item type
                {
                    ChatUtil.SendSystemMessage(client.Player, "Scripts.Player.Housing.HouseUseMaterials", null);
                    return;
                }
                else if (objType == 56 || objType == 52 || (objType >= 69 && objType <= 71))                 // Indoor carpets 1-4
                {
                    ChatUtil.SendSystemMessage(client.Player, "Scripts.Player.Housing.HouseUseCarpets", null);
                    return;
                }
                else if (objType == 57 || objType == 58 ||              // Exterior banner/shield
                         objType == 66 || objType == 67)                            // Interior banner/shield
                {
                    method = 6;
                }
                else if (objType == 53 || objType == 55 || objType == 68)
                {
                    method = 5;
                }
                else if (objType == (int)eObjectType.HouseVault)
                {
                    method = 7;
                }

                ChatUtil.SendDebugMessage(client, string.Format("Place Item: method: {0}", method));

                int pos;
                switch (method)
                {
                case 1:                         // GARDEN OBJECT
                {
                    if (client.Player.InHouse)
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }

                    // no permissions to add to the garden, return
                    if (!house.CanChangeGarden(client.Player, DecorationPermissions.Add))
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }


                    // garden is already full, return
                    if (house.OutdoorItems.Count >= Properties.MAX_OUTDOOR_HOUSE_ITEMS)
                    {
                        ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.GardenMaxObjects", null);
                        client.Out.SendInventorySlotsUpdate(new[] { slot });

                        return;
                    }

                    // create an outdoor item to represent the item being placed
                    var oitem = new OutdoorItem
                    {
                        BaseItem = GameServer.Database.FindObjectByKey <ItemTemplate>(orgitem.Id_nb),
                        Model    = orgitem.Model,
                        Position = (byte)_position,
                        Rotation = (byte)rotation
                    };

                    //add item in db
                    pos = GetFirstFreeSlot(house.OutdoorItems.Keys);
                    DBHouseOutdoorItem odbitem = oitem.CreateDBOutdoorItem(housenumber);
                    oitem.DatabaseItem = odbitem;

                    GameServer.Database.AddObject(odbitem);

                    // remove the item from the player's inventory
                    client.Player.Inventory.RemoveItem(orgitem);
                    InventoryLogging.LogInventoryAction(client.Player, "(HOUSE;" + housenumber + ")", eInventoryActionType.Other, orgitem.Template, orgitem.Count);

                    //add item to outdooritems
                    house.OutdoorItems.Add(pos, oitem);

                    ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.GardenItemPlaced",
                                               Properties.MAX_OUTDOOR_HOUSE_ITEMS - house.OutdoorItems.Count);
                    ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.GardenItemPlacedName", orgitem.Name);

                    // update all nearby players
                    foreach (GamePlayer player in WorldMgr.GetPlayersCloseToSpot(house.RegionID, house, WorldMgr.OBJ_UPDATE_DISTANCE))
                    {
                        player.Out.SendGarden(house);
                    }

                    // save the house
                    house.SaveIntoDatabase();
                    break;
                }

                case 2:                         // WALL OBJECT
                case 3:                         // FLOOR OBJECT
                {
                    if (client.Player.InHouse == false)
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }

                    // no permission to add to the interior, return
                    if (!house.CanChangeInterior(client.Player, DecorationPermissions.Add))
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }

                    // not a wall object, return
                    if (!IsSuitableForWall(orgitem) && method == 2)
                    {
                        ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.NotWallObject", null);
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }

                    // not a floor object, return
                    if (objType != 51 && method == 3)
                    {
                        ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.NotFloorObject", null);
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }

                    // interior already has max items, return
                    if (house.IndoorItems.Count >= GetMaxIndoorItemsForHouse(house.Model))
                    {
                        ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.IndoorMaxItems", GetMaxIndoorItemsForHouse(house.Model));
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }

                    // create an indoor item to represent the item being placed
                    var iitem = new IndoorItem
                    {
                        Model         = orgitem.Model,
                        Color         = orgitem.Color,
                        X             = xpos,
                        Y             = ypos,
                        Size          = orgitem.DPS_AF > 3 ? orgitem.DPS_AF : 100,                                                                // max size is 255
                        Position      = _position,
                        PlacementMode = method,
                        BaseItem      = null
                    };

                    // figure out proper rotation for item
                    int properRotation = client.Player.Heading / 10;
                    properRotation = properRotation.Clamp(0, 360);

                    if (method == 2 && IsSuitableForWall(orgitem))
                    {
                        properRotation = 360;
                        if (objType != 50)
                        {
                            client.Out.SendInventorySlotsUpdate(new[] { slot });
                        }
                    }

                    iitem.Rotation = properRotation;

                    pos = GetFirstFreeSlot(house.IndoorItems.Keys);
                    if (objType == 50 || objType == 51)
                    {
                        //its a housing item, so lets take it!
                        client.Player.Inventory.RemoveItem(orgitem);
                        InventoryLogging.LogInventoryAction(client.Player, "(HOUSE;" + housenumber + ")", eInventoryActionType.Other, orgitem.Template, orgitem.Count);

                        //set right base item, so we can recreate it on take.
                        if (orgitem.Id_nb.Contains("GuildBanner"))
                        {
                            iitem.BaseItem = orgitem.Template;
                            iitem.Size     = 50;                                         // Banners have to be reduced in size
                        }
                        else
                        {
                            iitem.BaseItem = GameServer.Database.FindObjectByKey <ItemTemplate>(orgitem.Id_nb);
                        }
                    }

                    DBHouseIndoorItem idbitem = iitem.CreateDBIndoorItem(housenumber);
                    iitem.DatabaseItem = idbitem;
                    GameServer.Database.AddObject(idbitem);

                    house.IndoorItems.Add(pos, iitem);

                    // let player know the item has been placed
                    ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.IndoorItemPlaced", (GetMaxIndoorItemsForHouse(house.Model) - house.IndoorItems.Count));

                    switch (method)
                    {
                    case 2:
                        ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.IndoorWallPlaced", orgitem.Name);
                        break;

                    case 3:
                        ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.IndoorFloorPlaced", orgitem.Name);
                        break;
                    }

                    // update furniture for all players in the house
                    foreach (GamePlayer plr in house.GetAllPlayersInHouse())
                    {
                        plr.Out.SendFurniture(house, pos);
                    }

                    break;
                }

                case 4:                         // PORCH
                {
                    // no permission to add to the garden, return
                    if (!house.CanChangeGarden(client.Player, DecorationPermissions.Add))
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }

                    switch (orgitem.Id_nb)
                    {
                    case "housing_porch_deed":
                        // try and add the porch
                        if (house.AddPorch())
                        {
                            // remove the original item from the player's inventory
                            client.Player.Inventory.RemoveItem(orgitem);
                            InventoryLogging.LogInventoryAction(client.Player, "(HOUSE;" + housenumber + ")", eInventoryActionType.Other, orgitem.Template, orgitem.Count);
                        }
                        else
                        {
                            ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.PorchAlready", null);
                            client.Out.SendInventorySlotsUpdate(new[] { slot });
                        }
                        return;

                    case "housing_porch_remove_deed":

                        var consignmentMerchant = house.ConsignmentMerchant;
                        if (consignmentMerchant != null && (consignmentMerchant.DBItems(client.Player).Count > 0 || consignmentMerchant.TotalMoney > 0))
                        {
                            ChatUtil.SendSystemMessage(client, "All items and money must be removed from your consigmment merchant in order to remove the porch!");
                            client.Out.SendInventorySlotsUpdate(new[] { slot });
                            return;
                        }

                        // try and remove the porch
                        if (house.RemovePorch())
                        {
                            // remove the original item from the player's inventory
                            client.Player.Inventory.RemoveItem(orgitem);
                            InventoryLogging.LogInventoryAction(client.Player, "(HOUSE;" + housenumber + ")", eInventoryActionType.Other, orgitem.Template, orgitem.Count);
                        }
                        else
                        {
                            ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.PorchNone", null);
                            client.Out.SendInventorySlotsUpdate(new[] { slot });
                        }
                        return;

                    case "housing_consignment_deed":
                    {
                        // make sure there is a porch for this consignment merchant!
                        if (!house.Porch)
                        {
                            ChatUtil.SendSystemMessage(client, "Your House needs a Porch first.");
                            client.Out.SendInventorySlotsUpdate(new[] { slot });
                            return;
                        }

                        // try and add a new consignment merchant
                        if (house.AddConsignment(0))
                        {
                            // remove the original item from the player's inventory
                            client.Player.Inventory.RemoveItem(orgitem);
                            InventoryLogging.LogInventoryAction(client.Player, "(HOUSE;" + housenumber + ")", eInventoryActionType.Other, orgitem.Template, orgitem.Count);
                        }
                        else
                        {
                            ChatUtil.SendSystemMessage(client, "You can not add a Consignment Merchant here.");
                            client.Out.SendInventorySlotsUpdate(new[] { slot });
                        }
                        return;
                    }

                    default:
                        ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.PorchNotItem", null);
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }
                }

                case 5:                         // HOOKPOINT
                {
                    if (client.Player.InHouse == false)
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }

                    // no permission to add to the interior, return
                    if (!house.CanChangeInterior(client.Player, DecorationPermissions.Add))
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }

                    // don't allow non-hookpoint items to be dropped on hookpoints
                    if (IsSuitableForHookpoint(orgitem) == false)
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }

                    // if the hookpoint doesn't exist, prompt player to Log it in the database for us
                    if (house.GetHookpointLocation((uint)_position) == null)
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });

                        if (client.Account.PrivLevel == (int)ePrivLevel.Admin)
                        {
                            if (client.Player.TempProperties.getProperty <bool>(HousingConstants.AllowAddHouseHookpoint, false))
                            {
                                ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.HookPointID", +_position);
                                ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.HookPointCloser", null);

                                client.Player.Out.SendCustomDialog(LanguageMgr.GetTranslation(client.Account.Language, "Scripts.Player.Housing.HookPointLogLoc"), LogLocation);
                            }
                            else
                            {
                                ChatUtil.SendDebugMessage(client, "use '/house addhookpoints' to allow addition of new housing hookpoints.");
                            }
                        }
                    }
                    else if (house.GetHookpointLocation((uint)_position) != null)
                    {
                        var point = new DBHouseHookpointItem
                        {
                            HouseNumber    = house.HouseNumber,
                            ItemTemplateID = orgitem.Id_nb,
                            HookpointID    = (uint)_position
                        };

                        // If we already have soemthing here, do not place more
                        foreach (var hpitem in GameServer.Database.SelectObjects <DBHouseHookpointItem>("`HouseNumber` = @HouseNumber", new QueryParameter("@HouseNumber", house.HouseNumber)))
                        {
                            if (hpitem.HookpointID == point.HookpointID)
                            {
                                ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.HookPointAlready", null);
                                client.Out.SendInventorySlotsUpdate(new[] { slot });
                                return;
                            }
                        }

                        if (house.HousepointItems.ContainsKey(point.HookpointID) == false)
                        {
                            house.HousepointItems.Add(point.HookpointID, point);
                            house.FillHookpoint((uint)_position, orgitem.Id_nb, client.Player.Heading, 0);
                        }
                        else
                        {
                            string error = string.Format("Hookpoint already has item on attempt to attach {0} to hookpoint {1} for house {2}!", orgitem.Id_nb, _position, house.HouseNumber);
                            log.ErrorFormat(error);
                            client.Out.SendInventorySlotsUpdate(new[] { slot });
                            throw new Exception(error);
                        }

                        // add the item to the database
                        GameServer.Database.AddObject(point);

                        // remove the original item from the player's inventory
                        client.Player.Inventory.RemoveItem(orgitem);
                        InventoryLogging.LogInventoryAction(client.Player, "(HOUSE;" + housenumber + ")", eInventoryActionType.Other, orgitem.Template, orgitem.Count);

                        ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.HookPointAdded", null);

                        // save the house
                        house.SaveIntoDatabase();
                    }
                    else
                    {
                        ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.HookPointNot", null);
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                    }

                    // broadcast updates
                    house.SendUpdate();
                    break;
                }

                case 6:
                {
                    // no permission to change external appearance, return
                    if (!house.CanChangeExternalAppearance(client.Player))
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }

                    if (objType == 57)                                     // We have outdoor banner
                    {
                        house.OutdoorGuildBanner = true;
                        ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.OutdoorBannersAdded", null);
                        client.Player.Inventory.RemoveItem(orgitem);
                        InventoryLogging.LogInventoryAction(client.Player, "(HOUSE;" + housenumber + ")", eInventoryActionType.Other, orgitem.Template, orgitem.Count);
                    }
                    else if (objType == 58)                                     // We have outdoor shield
                    {
                        house.OutdoorGuildShield = true;
                        ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.OutdoorShieldsAdded", null);
                        client.Player.Inventory.RemoveItem(orgitem);
                        InventoryLogging.LogInventoryAction(client.Player, "(HOUSE;" + housenumber + ")", eInventoryActionType.Other, orgitem.Template, orgitem.Count);
                    }
                    else if (objType == 66)                                     // We have indoor banner
                    {
                        house.IndoorGuildBanner = true;
                        ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.InteriorBannersAdded", null);
                        client.Player.Inventory.RemoveItem(orgitem);
                        InventoryLogging.LogInventoryAction(client.Player, "(HOUSE;" + housenumber + ")", eInventoryActionType.Other, orgitem.Template, orgitem.Count);
                    }
                    else if (objType == 67)                                     // We have indoor shield
                    {
                        house.IndoorGuildShield = true;
                        ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.InteriorShieldsAdded", null);
                        client.Player.Inventory.RemoveItem(orgitem);
                        InventoryLogging.LogInventoryAction(client.Player, "(HOUSE;" + housenumber + ")", eInventoryActionType.Other, orgitem.Template, orgitem.Count);
                    }
                    else
                    {
                        ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.BadShieldBanner", null);
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                    }

                    // save the house and broadcast updates
                    house.SaveIntoDatabase();
                    house.SendUpdate();
                    break;
                }

                case 7:                         // House vault.
                {
                    if (client.Player.InHouse == false)
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }

                    // make sure the hookpoint position is valid
                    if (_position > HousingConstants.MaxHookpointLocations)
                    {
                        ChatUtil.SendSystemMessage(client, "This hookpoint position is unknown, error logged.");
                        log.Error("HOUSING: " + client.Player.Name + " working with invalid position " + _position + " in house " +
                                  house.HouseNumber + " model " + house.Model);

                        client.Out.SendInventorySlotsUpdate(new[] { slot });
                        return;
                    }

                    // if hookpoint doesn't exist, prompt player to Log it in the database for us
                    if (house.GetHookpointLocation((uint)_position) == null)
                    {
                        client.Out.SendInventorySlotsUpdate(new[] { slot });

                        if (client.Account.PrivLevel == (int)ePrivLevel.Admin)
                        {
                            if (client.Player.TempProperties.getProperty <bool>(HousingConstants.AllowAddHouseHookpoint, false))
                            {
                                ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.HookPointID", +_position);
                                ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.HookPointCloser", null);

                                client.Player.Out.SendCustomDialog(LanguageMgr.GetTranslation(client.Account.Language, "Scripts.Player.Housing.HookPointLogLoc"), LogLocation);
                            }
                            else
                            {
                                ChatUtil.SendDebugMessage(client, "use '/house addhookpoints' to allow addition of new housing hookpoints.");
                            }
                        }

                        return;
                    }

                    // make sure we have space to add another vult
                    int vaultIndex = house.GetFreeVaultNumber();
                    if (vaultIndex < 0)
                    {
                        client.Player.Out.SendMessage("You can't add any more vaults to this house!", eChatType.CT_System,
                                                      eChatLoc.CL_SystemWindow);
                        client.Out.SendInventorySlotsUpdate(new[] { slot });

                        return;
                    }

                    // If we already have soemthing here, do not place more
                    foreach (var hpitem in GameServer.Database.SelectObjects <DBHouseHookpointItem>("`HouseNumber` = @HouseNumber", new QueryParameter("@HouseNumber", house.HouseNumber)))
                    {
                        if (hpitem.HookpointID == _position)
                        {
                            ChatUtil.SendSystemMessage(client, "Scripts.Player.Housing.HookPointAlready", null);
                            client.Out.SendInventorySlotsUpdate(new[] { slot });
                            return;
                        }
                    }

                    // create the new vault and attach it to the house
                    var houseVault = new GameHouseVault(orgitem.Template, vaultIndex);
                    houseVault.Attach(house, (uint)_position, (ushort)((client.Player.Heading + 2048) % 4096));

                    // remove the original item from the player's inventory
                    client.Player.Inventory.RemoveItem(orgitem);
                    InventoryLogging.LogInventoryAction(client.Player, "(HOUSE;" + housenumber + ")", eInventoryActionType.Other, orgitem.Template, orgitem.Count);

                    // save the house and broadcast uodates
                    house.SaveIntoDatabase();
                    house.SendUpdate();
                    return;
                }

                default:
                {
                    ChatUtil.SendDebugMessage(client, "Place Item: Unknown method, do nothing.");
                    client.Out.SendInventorySlotsUpdate(null);
                    break;
                }
                }
            }
            catch (Exception ex)
            {
                log.Error("HousingPlaceItemHandler", ex);
                client.Out.SendMessage("Error processing housing action; the error has been logged!", eChatType.CT_Staff, eChatLoc.CL_SystemWindow);
                client.Out.SendInventorySlotsUpdate(null);
            }
        }
Esempio n. 54
0
        public override int HandlePacket(GamePlayer player, GSPacketIn packet)
        {
            int     operate = packet.ReadInt();
            BoxInfo box     = null;
            int     result2;

            if (operate == 0)
            {
                int time       = packet.ReadInt();
                int onlineTime = (int)DateTime.Now.Subtract(player.BoxBeginTime).TotalMinutes;
                box = BoxMgr.FindTemplateByCondition(0, player.PlayerCharacter.Grade, player.PlayerCharacter.BoxProgression);
                if (box != null && onlineTime >= time && box.Condition == time)
                {
                    using (ProduceBussiness db = new ProduceBussiness())
                    {
                        db.UpdateBoxProgression(player.PlayerCharacter.ID, player.PlayerCharacter.BoxProgression, player.PlayerCharacter.GetBoxLevel, player.PlayerCharacter.AddGPLastDate, DateTime.Now, time);
                        player.PlayerCharacter.AlreadyGetBox = time;
                        player.PlayerCharacter.BoxGetDate    = DateTime.Now;
                    }
                }
                result2 = 0;
            }
            else
            {
                int        type = packet.ReadInt();
                GSPacketIn pkg  = packet.Clone();
                pkg.ClearContext();
                bool updatedb = false;
                bool result   = true;
                if (type == 0)
                {
                    int onlineTime = (int)DateTime.Now.Subtract(player.BoxBeginTime).TotalMinutes;
                    box = BoxMgr.FindTemplateByCondition(0, player.PlayerCharacter.Grade, player.PlayerCharacter.BoxProgression);
                    if (box != null && (onlineTime >= box.Condition || player.PlayerCharacter.AlreadyGetBox == box.Condition))
                    {
                        using (ProduceBussiness db = new ProduceBussiness())
                        {
                            if (db.UpdateBoxProgression(player.PlayerCharacter.ID, box.Condition, player.PlayerCharacter.GetBoxLevel, player.PlayerCharacter.AddGPLastDate, DateTime.Now.Date, 0))
                            {
                                player.PlayerCharacter.BoxProgression = box.Condition;
                                player.PlayerCharacter.BoxGetDate     = DateTime.Now.Date;
                                player.PlayerCharacter.AlreadyGetBox  = 0;
                                updatedb = true;
                            }
                        }
                    }
                }
                else
                {
                    box = BoxMgr.FindTemplateByCondition(1, player.PlayerCharacter.GetBoxLevel, Convert.ToInt32(player.PlayerCharacter.Sex));
                    if (box != null && player.PlayerCharacter.Grade >= box.Level)
                    {
                        using (ProduceBussiness db = new ProduceBussiness())
                        {
                            if (db.UpdateBoxProgression(player.PlayerCharacter.ID, player.PlayerCharacter.BoxProgression, box.Level, player.PlayerCharacter.AddGPLastDate, player.PlayerCharacter.BoxGetDate, 0))
                            {
                                player.PlayerCharacter.GetBoxLevel = box.Level;
                                updatedb = true;
                            }
                        }
                    }
                }
                if (updatedb)
                {
                    if (box != null)
                    {
                        List <ItemInfo> mailList  = new List <ItemInfo>();
                        List <ItemInfo> items     = new List <ItemInfo>();
                        int             gold      = 0;
                        int             money     = 0;
                        int             giftToken = 0;
                        int             gp        = 0;
                        ItemBoxMgr.CreateItemBox(Convert.ToInt32(box.Template), items, ref gold, ref money, ref giftToken, ref gp);
                        if (gold > 0)
                        {
                            player.AddGold(gold);
                        }
                        if (money > 0)
                        {
                            player.AddMoney(money, LogMoneyType.Award, LogMoneyType.Award);
                        }
                        if (giftToken > 0)
                        {
                            player.AddGiftToken(giftToken);
                        }
                        if (gp > 0)
                        {
                            player.AddGP(gp);
                        }
                        foreach (ItemInfo item in items)
                        {
                            item.RemoveType = 120;
                            if (!player.AddItem(item))
                            {
                                mailList.Add(item);
                            }
                        }
                        if (type == 0)
                        {
                            player.BoxBeginTime = DateTime.Now;
                            box = BoxMgr.FindTemplateByCondition(0, player.PlayerCharacter.Grade, player.PlayerCharacter.BoxProgression);
                            if (box != null)
                            {
                                player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("UserGetTimeBoxHandler.success", new object[]
                                {
                                    box.Condition
                                }));
                            }
                            else
                            {
                                player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("UserGetTimeBoxHandler.todayOver", new object[0]));
                            }
                        }
                        else
                        {
                            box = BoxMgr.FindTemplateByCondition(1, player.PlayerCharacter.GetBoxLevel, Convert.ToInt32(player.PlayerCharacter.Sex));
                            if (box != null)
                            {
                                player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("UserGetTimeBoxHandler.level", new object[]
                                {
                                    box.Level
                                }));
                            }
                            else
                            {
                                player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("UserGetTimeBoxHandler.over", new object[0]));
                            }
                        }
                        if (mailList.Count > 0)
                        {
                            if (player.SendItemsToMail(mailList, LanguageMgr.GetTranslation("UserGetTimeBoxHandler.mail", new object[0]), LanguageMgr.GetTranslation("UserGetTimeBoxHandler.title", new object[0]), eMailType.OpenUpArk))
                            {
                                player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("UserGetTimeBixHandler..full", new object[0]));
                                result = true;
                                player.Out.SendMailResponse(player.PlayerCharacter.ID, eMailRespose.Receiver);
                            }
                        }
                    }
                    else
                    {
                        result = false;
                    }
                }
                else
                {
                    player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("UserGetTimeBoxHandler.fail", new object[0]));
                }
                if (type == 0)
                {
                    pkg.WriteBoolean(result);
                    pkg.WriteInt(player.PlayerCharacter.BoxProgression);
                    player.SendTCP(pkg);
                }
                result2 = 0;
            }
            return(result2);
        }
Esempio n. 55
0
        public bool ShootImp(int bombId, int x, int y, int force, int angle, int bombCount, int shootCount)
        {
            BallInfo ballInfo = BallMgr.FindBall(bombId);
            Tile     shape    = BallMgr.FindTile(bombId);
            BombType ballType = BallMgr.GetBallType(bombId);
            int      num      = (int)(this.m_map.wind * 10f);

            if (ballInfo != null)
            {
                GSPacketIn gSPacketIn = new GSPacketIn(91, base.Id);
                gSPacketIn.Parameter1 = base.Id;
                gSPacketIn.WriteByte(2);
                gSPacketIn.WriteInt(num);
                gSPacketIn.WriteBoolean(num > 0);
                gSPacketIn.WriteByte(this.m_game.GetVane(num, 1));
                gSPacketIn.WriteByte(this.m_game.GetVane(num, 2));
                gSPacketIn.WriteByte(this.m_game.GetVane(num, 3));
                gSPacketIn.WriteInt(bombCount);
                float      num2       = 0f;
                SimpleBomb simpleBomb = null;
                for (int i = 0; i < bombCount; i++)
                {
                    double num3 = 1.0;
                    int    num4 = 0;
                    if (i == 1)
                    {
                        num3 = 0.9;
                        num4 = -5;
                    }
                    else
                    {
                        if (i == 2)
                        {
                            num3 = 1.1;
                            num4 = 5;
                        }
                    }
                    int num5 = (int)((double)force * num3 * Math.Cos((double)(angle + num4) / 180.0 * 3.1415926535897931));
                    int num6 = (int)((double)force * num3 * Math.Sin((double)(angle + num4) / 180.0 * 3.1415926535897931));
                    simpleBomb = new SimpleBomb(this.m_game.PhysicalId++, ballType, this, this.m_game, ballInfo, shape, this.ControlBall);
                    simpleBomb.SetXY(x, y);
                    simpleBomb.setSpeedXY(num5, num6);
                    this.m_map.AddPhysical(simpleBomb);
                    simpleBomb.StartMoving();
                    gSPacketIn.WriteInt(0);
                    gSPacketIn.WriteInt(0);
                    gSPacketIn.WriteBoolean(simpleBomb.DigMap);
                    gSPacketIn.WriteInt(simpleBomb.Id);
                    gSPacketIn.WriteInt(x);
                    gSPacketIn.WriteInt(y);
                    gSPacketIn.WriteInt(num5);
                    gSPacketIn.WriteInt(num6);
                    gSPacketIn.WriteInt(simpleBomb.BallInfo.ID);
                    gSPacketIn.WriteString(simpleBomb.BallInfo.FlyingPartical);
                    gSPacketIn.WriteInt(simpleBomb.BallInfo.Radii * 1000 / 4);
                    gSPacketIn.WriteInt((int)simpleBomb.BallInfo.Power * 1000);
                    gSPacketIn.WriteInt(simpleBomb.Actions.Count);
                    foreach (BombAction current in simpleBomb.Actions)
                    {
                        gSPacketIn.WriteInt(current.TimeInt);
                        gSPacketIn.WriteInt(current.Type);
                        gSPacketIn.WriteInt(current.Param1);
                        gSPacketIn.WriteInt(current.Param2);
                        gSPacketIn.WriteInt(current.Param3);
                        gSPacketIn.WriteInt(current.Param4);
                    }
                    num2 = Math.Max(num2, simpleBomb.LifeTime);
                }
                int num7  = 0;
                int count = simpleBomb.PetActions.Count;
                if (count > 0 && this.PetBaseAtt > 0)
                {
                    gSPacketIn.WriteInt(count);
                    foreach (BombAction current2 in simpleBomb.PetActions)
                    {
                        gSPacketIn.WriteInt(current2.Param1);
                        gSPacketIn.WriteInt(current2.Param2);
                        gSPacketIn.WriteInt(current2.Param4);
                        gSPacketIn.WriteInt(current2.Param3);
                    }
                    gSPacketIn.WriteInt(1);
                    num7 = 2;
                }
                else
                {
                    gSPacketIn.WriteInt(0);
                    gSPacketIn.WriteInt(0);
                }
                this.m_game.SendToAll(gSPacketIn);
                this.m_game.WaitTime((int)((num2 + 2f + (float)num7 + (float)(bombCount / 3)) * 1000f));
                return(true);
            }
            return(false);
        }
Esempio n. 56
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.WriteByte(client.Player.PlayerCharacter.typeVIP);
                pkg.WriteInt(client.Player.PlayerCharacter.VIPLevel);
                pkg.WriteString(client.Player.CurrentRoom.Name);
                pkg.WriteString(client.Player.CurrentRoom.Password);
                pkg.WriteInt(0);                                        //_loc_3.barrierNum = _loc_2.readInt();
                pkg.WriteBoolean(client.Player.CurrentRoom.isOpenBoss); //_loc_3.isOpenBoss = _loc_2.readBoolean();

                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);
        }
Esempio n. 57
0
 public void SendToScenePlayer(GSPacketIn packet, GamePlayer player)
 {
     WorldMgr.SpaScene.SendToALL(packet, player);
 }
Esempio n. 58
0
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            int housenumber = packet.ReadShort();
            int menuid      = packet.ReadByte();
            int flag        = packet.ReadByte();

            var house = HouseMgr.GetHouse(client.Player.CurrentRegionID, housenumber);

            if (house == null)
            {
                return;
            }

            if (client.Player == null)
            {
                return;
            }

            client.Player.CurrentHouse = house;

            switch (menuid)
            {
            case 0:                     // Exterior decoration (Garden)
            {
                if (!house.CanChangeGarden(client.Player, DecorationPermissions.Add))
                {
                    return;
                }

                HouseMgr.SendHousingMerchantWindow(client.Player, eMerchantWindowType.HousingOutsideShop);
                break;
            }

            case 1:                     // Interior decoration
            {
                if (!house.CanChangeInterior(client.Player, DecorationPermissions.Add))
                {
                    return;
                }

                HouseMgr.SendHousingMerchantWindow(client.Player, eMerchantWindowType.HousingInsideShop);
                break;
            }

            case 2:                     // Exterior menu
            {
                if (!house.CanChangeGarden(client.Player, DecorationPermissions.Add))
                {
                    return;
                }

                client.Player.Out.SendMerchantWindow(HouseTemplateMgr.OutdoorMenuItems, eMerchantWindowType.HousingOutsideMenu);
                break;
            }

            case 3:                     // interior npc
            {
                if (!house.CanChangeInterior(client.Player, DecorationPermissions.Add))
                {
                    return;
                }

                HouseMgr.SendHousingMerchantWindow(client.Player, eMerchantWindowType.HousingNPCHookpoint);
                break;
            }

            case 4:                     // vault shop
            {
                if (!house.CanChangeInterior(client.Player, DecorationPermissions.Add))
                {
                    return;
                }

                HouseMgr.SendHousingMerchantWindow(client.Player, eMerchantWindowType.HousingVaultHookpoint);
                break;
            }

            case 5:                     // craft shop
            {
                if (!house.CanChangeInterior(client.Player, DecorationPermissions.Add))
                {
                    return;
                }

                HouseMgr.SendHousingMerchantWindow(client.Player, eMerchantWindowType.HousingCraftingHookpoint);
                break;
            }

            case 6:                     // bindstone shop
            {
                if (!house.CanChangeInterior(client.Player, DecorationPermissions.Add))
                {
                    return;
                }

                HouseMgr.SendHousingMerchantWindow(client.Player, eMerchantWindowType.HousingBindstoneHookpoint);
                break;
            }

            case 7:
                house.SendHouseInfo(client.Player);
                break;

            case 8:                     // Interior menu (flag = 0x00 - roof, 0xFF - floor or wall)
                if (!house.CanChangeInterior(client.Player, DecorationPermissions.Add))
                {
                    return;
                }

                client.Player.Out.SendMerchantWindow(HouseTemplateMgr.IndoorMenuItems, eMerchantWindowType.HousingInsideMenu);
                break;

            default:
                client.Out.SendMessage("Invalid menu id " + menuid + " (hookpoint?).", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                break;
            }
        }
Esempio n. 59
0
        public void HandlePacket(GameClient client, GSPacketIn packet)
        {
            int index = packet.ReadByte();

            new CancelEffectHandler(client.Player, index).Start(1);
        }
Esempio n. 60
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.BrideID)
            {
                return(false);
            }

            int hour = packet.ReadInt();

            string[] money = GameProperties.PRICE_MARRY_ROOM.Split(',');
            if (money.Length < 3)
            {
                if (log.IsErrorEnabled)
                {
                    log.Error("HotSpringRoomCreateMoney node in configuration file is wrong");
                }

                return(false);
            }

            int needMoney = 0;

            switch (hour)
            {
            case 2:
                needMoney = int.Parse(money[0]);
                break;

            case 3:
                needMoney = int.Parse(money[1]);
                break;

            case 4:
                needMoney = int.Parse(money[2]);
                break;

            default:
                needMoney = int.Parse(money[2]);
                hour      = 4;
                break;
            }

            if (player.PlayerCharacter.Money < needMoney)
            {
                player.Out.SendMessage(eMessageType.ChatNormal, LanguageMgr.GetTranslation("MarryApplyHandler.Msg1"));
                return(false);
            }

            //player.SetMoney(-needMoney, MoneyRemoveType.Marry);
            player.RemoveMoney(needMoney);
            LogMgr.LogMoneyAdd(LogMoneyType.Marry, LogMoneyType.Marry_RoomAdd, player.PlayerCharacter.ID, needMoney, player.PlayerCharacter.Money, 0, 0, 0, "", "", "");

            CountBussiness.InsertSystemPayCount(player.PlayerCharacter.ID, needMoney, 0, (int)eConsumerType.Marry, (int)eSubConsumerType.Marry_HotSpringRoom);

            player.CurrentHotSpringRoom.RoomContinuation(hour);

            GSPacketIn pkg = player.Out.SendContinuation(player, player.CurrentHotSpringRoom.Info);

            int spouseID = 0;

            if (player.PlayerCharacter.ID == player.CurrentHotSpringRoom.Info.GroomID)
            {
                spouseID = player.CurrentHotSpringRoom.Info.BrideID;
            }
            else
            {
                spouseID = player.CurrentHotSpringRoom.Info.GroomID;
            }

            GamePlayer spouse = WorldMgr.GetPlayerById(spouseID);

            if (spouse != null)
            {
                spouse.Out.SendTCP(pkg);
            }

            player.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("ContinuationCommand.Successed"));

            return(true);
        }