Example #1
0
        public override void SendSetControlledHorse(GamePlayer player)
        {
            if (player == null || player.ObjectState != GameObject.eObjectState.Active)
                return;

            GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.ControlledHorse));

            if (player.HasHorse)
            {
                pak.WriteShort(0); // for set self horse OID must be zero
                pak.WriteByte(player.ActiveHorse.ID);
                if (player.ActiveHorse.BardingColor == 0 && player.ActiveHorse.Barding != 0 && player.Guild != null)
                {
                    int newGuildBitMask = (player.Guild.Emblem & 0x010000) >> 9;
                    pak.WriteByte((byte)(player.ActiveHorse.Barding | newGuildBitMask));
                    pak.WriteShort((ushort)player.Guild.Emblem);
                }
                else
                {
                    pak.WriteByte(player.ActiveHorse.Barding);
                    pak.WriteShort(player.ActiveHorse.BardingColor);
                }
                pak.WriteByte(player.ActiveHorse.Saddle);
                pak.WriteByte(player.ActiveHorse.SaddleColor);
                pak.WriteByte(player.ActiveHorse.Slots);
                pak.WriteByte(player.ActiveHorse.Armor);
                pak.WritePascalString(player.ActiveHorse.Name == null ? "" : player.ActiveHorse.Name);
            }
            else
            {
                pak.Fill(0x00, 8);
            }
            SendTCP(pak);
        }
Example #2
0
 public override void SendKeepComponentInfo(IGameKeepComponent keepComponent)
 {
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.KeepComponentInfo)))
     {
         pak.WriteShort((ushort)keepComponent.Keep.KeepID);
         pak.WriteShort((ushort)keepComponent.ID);
         pak.WriteInt((uint)keepComponent.ObjectID);
         pak.WriteByte((byte)keepComponent.Skin);
         pak.WriteByte((byte)(keepComponent.ComponentX));                //relative to keep
         pak.WriteByte((byte)(keepComponent.ComponentY));                //relative to keep
         pak.WriteByte((byte)keepComponent.ComponentHeading);
         pak.WriteByte((byte)keepComponent.Height);
         pak.WriteByte(keepComponent.HealthPercent);
         byte flag = keepComponent.Status;
         if (keepComponent.IsRaized)                 // Only for towers
         {
             flag |= 0x04;
         }
         if (flag == 0x00 && keepComponent.Climbing)
         {
             flag = 0x02;
         }
         pak.WriteByte(flag);
         pak.WriteByte(0x00);                 //unk
         SendTCP(pak);
     }
 }
Example #3
0
 /// <summary>
 /// new siege weapon animation packet 1.110
 /// </summary>
 public override void SendSiegeWeaponAnimation(GameSiegeWeapon siegeWeapon)
 {
     if (siegeWeapon == null)
     {
         return;
     }
     using (var pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.SiegeWeaponAnimation)))
     {
         pak.WriteInt((uint)siegeWeapon.ObjectID);
         pak.WriteInt(
             (uint)
             (siegeWeapon.TargetObject == null
              ? (siegeWeapon.GroundTarget == null ? 0 : siegeWeapon.GroundTarget.X)
              : siegeWeapon.TargetObject.X));
         pak.WriteInt(
             (uint)
             (siegeWeapon.TargetObject == null
              ? (siegeWeapon.GroundTarget == null ? 0 : siegeWeapon.GroundTarget.Y)
              : siegeWeapon.TargetObject.Y));
         pak.WriteInt(
             (uint)
             (siegeWeapon.TargetObject == null
              ? (siegeWeapon.GroundTarget == null ? 0 : siegeWeapon.GroundTarget.Z)
              : siegeWeapon.TargetObject.Z));
         pak.WriteInt((uint)(siegeWeapon.TargetObject == null ? 0 : siegeWeapon.TargetObject.ObjectID));
         pak.WriteShort(siegeWeapon.Effect);
         pak.WriteShort((ushort)(siegeWeapon.SiegeWeaponTimer.TimeUntilElapsed)); // timer is no longer ( value / 100 )
         pak.WriteByte((byte)siegeWeapon.SiegeWeaponTimer.CurrentAction);
         pak.Fill(0, 3);                                                          // TODO : these bytes change depending on siege weapon action, to implement when different ammo types available.
         SendTCP(pak);
     }
 }
Example #4
0
        public override void SendEnterHouse(House house)
        {
            using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.HouseEnter)))
            {
                pak.WriteShort((ushort)house.HouseNumber);
                pak.WriteShort((ushort)25000);                         //constant!
                pak.WriteInt((uint)house.X);
                pak.WriteInt((uint)house.Y);
                pak.WriteShort((ushort)house.Heading);                                                //useless/ignored by client.
                pak.WriteByte(0x00);
                pak.WriteByte((byte)(house.GetGuildEmblemFlags() | (house.Emblem & 0x010000) >> 14)); //new Guild Emblem
                pak.WriteShort((ushort)house.Emblem);                                                 //emblem
                pak.WriteByte(0x00);
                pak.WriteByte(0x00);
                pak.WriteByte((byte)house.Model);
                pak.WriteByte(0x00);
                pak.WriteByte(0x00);
                pak.WriteByte(0x00);
                pak.WriteByte((byte)house.Rug1Color);
                pak.WriteByte((byte)house.Rug2Color);
                pak.WriteByte((byte)house.Rug3Color);
                pak.WriteByte((byte)house.Rug4Color);
                pak.WriteByte(0x00);
                pak.WriteByte(0x00);               // houses codemned ?
                pak.WriteShort(0);                 // 0xFFBF = condemned door model
                pak.WriteByte(0x00);

                SendTCP(pak);
            }
        }
Example #5
0
        public override void SendControlledHorse(GamePlayer player, bool flag)
        {
            if (player == null || player.ObjectState != GameObject.eObjectState.Active)
            {
                return;
            }
            using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.ControlledHorse)))
            {
                if (!flag || !player.HasHorse)
                {
                    pak.WriteShort((ushort)player.ObjectID);
                    pak.Fill(0x00, 6);
                }
                else
                {
                    pak.WriteShort((ushort)player.ObjectID);
                    pak.WriteByte(player.ActiveHorse.ID);
                    if (player.ActiveHorse.BardingColor == 0 && player.ActiveHorse.Barding != 0 && player.Guild != null)
                    {
                        int newGuildBitMask = (player.Guild.Emblem & 0x010000) >> 9;
                        pak.WriteByte((byte)(player.ActiveHorse.Barding | newGuildBitMask));
                        pak.WriteShort((ushort)player.Guild.Emblem);
                    }
                    else
                    {
                        pak.WriteByte(player.ActiveHorse.Barding);
                        pak.WriteShort(player.ActiveHorse.BardingColor);
                    }

                    pak.WriteByte(player.ActiveHorse.Saddle);
                    pak.WriteByte(player.ActiveHorse.SaddleColor);
                }
                SendTCP(pak);
            }
        }
Example #6
0
        public override void SendKeepComponentDetailUpdate(IGameKeepComponent keepComponent)
        {
            using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.KeepComponentDetailUpdate)))
            {
                pak.WriteShort((ushort)keepComponent.Keep.KeepID);
                pak.WriteShort((ushort)keepComponent.ID);
                pak.WriteByte((byte)keepComponent.Height);
                pak.WriteByte(keepComponent.HealthPercent);
                byte flag = keepComponent.Status;

                if (keepComponent.IsRaized)                 // Only for towers
                {
                    flag |= 0x04;
                }

                if (flag == 0x00 && keepComponent.Climbing)
                {
                    flag = 0x02;
                }

                pak.WriteByte(flag);
                pak.WriteByte(0x00);                //unk
                SendTCP(pak);
            }
        }
Example #7
0
		public override void SendCombatAnimation(GameObject attacker, GameObject defender, ushort weaponID, ushort shieldID, int style, byte stance, byte result, byte targetHealthPercent)
		{
			using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.CombatAnimation)))
			{
				if (attacker != null)
					pak.WriteShort((ushort)attacker.ObjectID);
				else
					pak.WriteShort(0x00);
				
				if (defender != null)
					pak.WriteShort((ushort)defender.ObjectID);
				else
					pak.WriteShort(0x00);
				
				pak.WriteShort(weaponID);
				pak.WriteShort(shieldID);
				pak.WriteShortLowEndian((ushort)style);
				pak.WriteByte(stance);
				pak.WriteByte(result);
				
				// If Health Percent is invalid get the living Health.
				if (defender is GameLiving && targetHealthPercent > 100)
				{
					targetHealthPercent = (defender as GameLiving).HealthPercent;
				}
				
				pak.WriteByte(targetHealthPercent);
				pak.WriteByte(0);//unk
				SendTCP(pak);
			}
		}
Example #8
0
        public override void SendMessage(string msg, eChatType type, eChatLoc loc)
        {
            if (m_gameClient.ClientState == GameClient.eClientState.CharScreen)
            {
                return;
            }

            using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.Message)))
            {
                pak.WriteShort(0xFFFF);
                pak.WriteShort((ushort)m_gameClient.SessionID);
                pak.WriteByte((byte)type);
                pak.Fill(0x0, 3);

                string str;
                if (loc == eChatLoc.CL_ChatWindow)
                {
                    str = "@@";
                }
                else if (loc == eChatLoc.CL_PopupWindow)
                {
                    str = "##";
                }
                else
                {
                    str = "";
                }

                pak.WriteString(str + msg);
                SendTCP(pak);
            }
        }
Example #9
0
 public override void SendKeepComponentRemove(IGameKeepComponent keepComponent)
 {
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.KeepComponentRemove)))
     {
         pak.WriteShort((ushort)keepComponent.Keep.KeepID);
         pak.WriteShort((ushort)keepComponent.ID);
         SendTCP(pak);
     }
 }
Example #10
0
 public override void SendHookPointStore(GameKeepHookPoint hookPoint)
 {
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.KeepComponentHookpointStore)))
     {
         pak.WriteShort((ushort)hookPoint.Component.AbstractKeep.KeepID);
         pak.WriteShort((ushort)hookPoint.Component.ID);
         pak.WriteShort((ushort)hookPoint.ID);
         pak.Fill(0x01, 3);
         HookPointInventory inventory;
         if (hookPoint.ID > 0x80)
         {
             inventory = HookPointInventory.YellowHPInventory;                                      //oil
         }
         else if (hookPoint.ID > 0x60)
         {
             inventory = HookPointInventory.GreenHPInventory;                                          //big siege
         }
         else if (hookPoint.ID > 0x40)
         {
             inventory = HookPointInventory.LightGreenHPInventory;                                           //small siege
         }
         else if (hookPoint.ID > 0x20)
         {
             inventory = HookPointInventory.BlueHPInventory;                                          //npc
         }
         else
         {
             inventory = HookPointInventory.RedHPInventory;                 //guard
         }
         pak.WriteByte((byte)inventory.GetAllItems().Count);                //count
         pak.WriteShort(0);
         int i = 0;
         foreach (HookPointItem item in inventory.GetAllItems())
         {
             //TODO : must be quite like the merchant item.
             //the problem is to change how it is done maybe make the hookpoint item inherit from an interface in common with itemtemplate. have to think to that.
             pak.WriteByte((byte)i);
             i++;
             if (item.GameObjectType == "GameKeepGuard")                    //TODO: hack wrong must think how design thing to have merchante of gameobject(living or item)
             {
                 pak.WriteShort(0);
             }
             else
             {
                 pak.WriteShort(item.Flag);
             }
             pak.WriteShort(0);
             pak.WriteShort(0);
             pak.WriteShort(0);
             pak.WriteInt((uint)item.Gold);
             pak.WriteShort(item.Icon);
             pak.WritePascalString(item.Name);                    //item sell
         }
         SendTCP(pak);
     }
 }
		public override void SendLivingEquipmentUpdate(GameLiving living)
		{
			using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.EquipmentUpdate)))
			{

				ICollection<InventoryItem> items = null;
				if (living.Inventory != null)
					items = living.Inventory.VisibleItems;
	
				pak.WriteShort((ushort)living.ObjectID);
				pak.WriteByte((byte)living.VisibleActiveWeaponSlots);
				pak.WriteByte((byte)living.CurrentSpeed); // new in 189b+, speed
				pak.WriteByte((byte)((living.IsCloakInvisible ? 0x01 : 0x00) | (living.IsHelmInvisible ? 0x02 : 0x00))); // new in 189b+, cloack/helm visibility
				pak.WriteByte((byte)((living.IsCloakHoodUp ? 0x01 : 0x00) | (int)living.ActiveQuiverSlot)); //bit0 is hood up bit4 to 7 is active quiver
	
				if (items != null)
				{
					pak.WriteByte((byte)items.Count);
					foreach (InventoryItem item in items)
					{
						ushort model = (ushort)(item.Model & 0x1FFF);
						int slot = item.SlotPosition;
						//model = GetModifiedModel(model);
						int texture = item.Emblem != 0 ? item.Emblem : item.Color;
						if (item.SlotPosition == Slot.LEFTHAND || item.SlotPosition == Slot.CLOAK) // for test only cloack and shield
							slot = slot | ((texture & 0x010000) >> 9); // slot & 0x80 if new emblem
						pak.WriteByte((byte)slot);
						if ((texture & ~0xFF) != 0)
							model |= 0x8000;
						else if ((texture & 0xFF) != 0)
							model |= 0x4000;
						if (item.Effect != 0)
							model |= 0x2000;
	
						pak.WriteShort(model);
	
						if (item.SlotPosition > Slot.RANGED || item.SlotPosition < Slot.RIGHTHAND)
							pak.WriteByte((byte)item.Extension);
	
						if ((texture & ~0xFF) != 0)
							pak.WriteShort((ushort)texture);
						else if ((texture & 0xFF) != 0)
							pak.WriteByte((byte)texture);
						if (item.Effect != 0)
							pak.WriteByte((byte)item.Effect);
					}
				}
				else
				{
					pak.WriteByte(0x00);
				}
				SendTCP(pak);
			}
		}
Example #12
0
 public override void SendClearKeepComponentHookPoint(IGameKeepComponent component, int selectedHookPointIndex)
 {
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.KeepComponentHookpointUpdate)))
     {
         pak.WriteShort((ushort)component.Keep.KeepID);
         pak.WriteShort((ushort)component.ID);
         pak.WriteByte((byte)0);
         pak.WriteByte((byte)selectedHookPointIndex);
         SendTCP(pak);
     }
 }
Example #13
0
        public override void SendHouseOccupied(House house, bool flagHouseOccuped)
        {
            using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.HouseChangeGarden)))
            {
                pak.WriteShort((ushort)house.HouseNumber);
                pak.WriteShort(0);                 // sheduled for repossession (in hours) new in 1.89b+
                pak.WriteByte(0x00);
                pak.WriteByte((byte)(flagHouseOccuped ? 1 : 0));

                SendTCP(pak);
            }
        }
Example #14
0
        public override void SendFindGroupWindowUpdate(GamePlayer[] list)
        {
            if (m_gameClient.Player == null)
            {
                return;
            }

            using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.FindGroupUpdate)))
            {
                if (list != null)
                {
                    pak.WriteByte((byte)list.Length);
                    byte nbleader = 0;
                    byte nbsolo   = 0x1E;
                    foreach (GamePlayer player in list)
                    {
                        if (player.Group != null)
                        {
                            pak.WriteByte(nbleader++);
                        }
                        else
                        {
                            pak.WriteByte(nbsolo++);
                        }
                        pak.WriteByte(player.Level);
                        pak.WritePascalString(player.Name);
                        pak.WriteString(player.CharacterClass.Name, 4);
                        //Dinberg:Instances - We use ZoneSkinID to bluff our way to victory and
                        //trick the client for positioning objects (as IDs are hard coded).
                        if (player.CurrentZone != null)
                        {
                            pak.WriteShort(player.CurrentZone.ZoneSkinID);
                        }
                        else
                        {
                            pak.WriteShort(0);                    // ?
                        }
                        pak.WriteByte(0);                         // duration
                        pak.WriteByte(0);                         // objective
                        pak.WriteByte(0);
                        pak.WriteByte(0);
                        pak.WriteByte((byte)(player.Group != null ? 1 : 0));
                        pak.WriteByte(0);
                    }
                }
                else
                {
                    pak.WriteByte(0);
                }
                SendTCP(pak);
            }
        }
Example #15
0
        public override void SendMasterLevelWindow(byte ml)
        {
            if (m_gameClient == null || m_gameClient.Player == null)
            {
                return;
            }

            // If required ML=0 then send current player ML data
            byte mlToSend = (byte)(ml == 0 ? (m_gameClient.Player.MLLevel == 0 ? 1 : m_gameClient.Player.MLLevel) : ml);

            if (mlToSend > GamePlayer.ML_MAX_LEVEL)
            {
                mlToSend = GamePlayer.ML_MAX_LEVEL;
            }

            double mlXPPercent   = 0;
            double mlStepPercent = 0;

            if (m_gameClient.Player.MLLevel < 10)
            {
                mlXPPercent = 100.0 * (double)m_gameClient.Player.MLExperience / (double)m_gameClient.Player.GetMLExperienceForLevel((int)(m_gameClient.Player.MLLevel + 1));
                if (m_gameClient.Player.GetStepCountForML((byte)(m_gameClient.Player.MLLevel + 1)) > 0)
                {
                    mlStepPercent = 100.0 * (double)m_gameClient.Player.GetCountMLStepsCompleted((byte)(m_gameClient.Player.MLLevel + 1)) / (double)m_gameClient.Player.GetStepCountForML((byte)(m_gameClient.Player.MLLevel + 1));
                }
            }
            else
            {
                mlXPPercent = 100.0;                 // ML10 has no MLXP, so always 100%
            }

            using (GSTCPPacketOut pak = new GSTCPPacketOut((byte)eServerPackets.MasterLevelWindow))
            {
                pak.WriteByte((byte)mlXPPercent);                       // MLXP (blue bar)
                pak.WriteByte((byte)Math.Min(mlStepPercent, 100));      // Step percent (red bar)
                pak.WriteByte((byte)(m_gameClient.Player.MLLevel + 1)); // ML level + 1
                pak.WriteByte(0);
                pak.WriteShort((ushort)0);                              // exp1 ? new in 1.90
                pak.WriteShort((ushort)0);                              // exp2 ? new in 1.90
                pak.WriteByte(ml);

                // ML level completion is displayed client side for Step 11
                for (int i = 1; i < 11; i++)
                {
                    string description = m_gameClient.Player.GetMLStepDescription(mlToSend, i);
                    pak.WritePascalString(description);
                }

                pak.WriteByte(0);
                SendTCP(pak);
            }
        }
Example #16
0
 public override void SendSpellEffectAnimation(GameObject spellCaster, GameObject spellTarget, ushort spellid, ushort boltTime, bool noSound, byte success)
 {
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.SpellEffectAnimation)))
     {
         pak.WriteShort((ushort)spellCaster.ObjectID);
         pak.WriteShort(spellid);
         pak.WriteShort((ushort)(spellTarget == null ? 0 : spellTarget.ObjectID));
         pak.WriteShort(boltTime);
         pak.WriteByte((byte)(noSound ? 1 : 0));
         pak.WriteByte(success);
         SendTCP(pak);
     }
 }
Example #17
0
 public override void SendStatusUpdate(byte sittingFlag)
 {
     if (m_gameClient.Player == null)
     {
         return;
     }
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.CharacterStatusUpdate)))
     {
         pak.WriteByte(m_gameClient.Player.HealthPercent);
         pak.WriteByte(m_gameClient.Player.ManaPercent);
         pak.WriteByte(sittingFlag);
         pak.WriteByte(m_gameClient.Player.EndurancePercent);
         pak.WriteByte(m_gameClient.Player.ConcentrationPercent);
         //			pak.WriteShort((byte) (m_gameClient.Player.IsAlive ? 0x00 : 0x0f)); // 0x0F if dead ??? where it now ?
         pak.WriteByte(0);                // unk
         pak.WriteShort((ushort)m_gameClient.Player.MaxMana);
         pak.WriteShort((ushort)m_gameClient.Player.MaxEndurance);
         pak.WriteShort((ushort)m_gameClient.Player.MaxConcentration);
         pak.WriteShort((ushort)m_gameClient.Player.MaxHealth);
         pak.WriteShort((ushort)m_gameClient.Player.Health);
         pak.WriteShort((ushort)m_gameClient.Player.Endurance);
         pak.WriteShort((ushort)m_gameClient.Player.Mana);
         pak.WriteShort((ushort)m_gameClient.Player.Concentration);
         SendTCP(pak);
     }
 }
Example #18
0
		public override void SendPlayerCreate(GamePlayer playerToCreate)
		{
			Region playerRegion = playerToCreate.CurrentRegion;
			if (playerRegion == null)
			{
				if (log.IsWarnEnabled)
					log.Warn("SendPlayerCreate: playerRegion == null");
				return;
			}

			Zone playerZone = playerToCreate.CurrentZone;
			if (playerZone == null)
			{
				if (log.IsWarnEnabled)
					log.Warn("SendPlayerCreate: playerZone == null");
				return;
			}

			if (m_gameClient.Player == null || playerToCreate.IsVisibleTo(m_gameClient.Player) == false)
				return;

			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.PlayerCreate172));
			pak.WriteShort((ushort)playerToCreate.Client.SessionID);
			pak.WriteShort((ushort)playerToCreate.ObjectID);
			pak.WriteShort(playerToCreate.Model);
			pak.WriteShort((ushort)playerToCreate.Z);
            //Dinberg:Instances - Zoneskin ID for clientside positioning 'bluff'.
			pak.WriteShort(playerZone.ZoneSkinID);
			pak.WriteShort((ushort)playerRegion.GetXOffInZone(playerToCreate.X, playerToCreate.Y));
			pak.WriteShort((ushort)playerRegion.GetYOffInZone(playerToCreate.X, playerToCreate.Y));
			pak.WriteShort(playerToCreate.Heading);

			pak.WriteByte(playerToCreate.GetFaceAttribute(eCharFacePart.EyeSize)); //1-4 = Eye Size / 5-8 = Nose Size
			pak.WriteByte(playerToCreate.GetFaceAttribute(eCharFacePart.LipSize)); //1-4 = Ear size / 5-8 = Kin size
			pak.WriteByte(playerToCreate.GetFaceAttribute(eCharFacePart.EyeColor)); //1-4 = Skin Color / 5-8 = Eye Color
			pak.WriteByte(playerToCreate.GetDisplayLevel(m_gameClient.Player));
			pak.WriteByte(playerToCreate.GetFaceAttribute(eCharFacePart.HairColor)); //Hair: 1-4 = Color / 5-8 = unknown
			pak.WriteByte(playerToCreate.GetFaceAttribute(eCharFacePart.FaceType)); //1-4 = Unknown / 5-8 = Face type
			pak.WriteByte(playerToCreate.GetFaceAttribute(eCharFacePart.HairStyle)); //1-4 = Unknown / 5-8 = Hair Style

			int flags = (GameServer.ServerRules.GetLivingRealm(m_gameClient.Player, playerToCreate) & 0x03) << 2;
			if (playerToCreate.IsAlive == false)
				flags |= 0x01;
			if (playerToCreate.IsUnderwater)
				flags |= 0x02; //swimming
			if (playerToCreate.IsStealthed)
				flags |= 0x10;
			if (playerToCreate.IsWireframe)
				flags |= 0x20;
			pak.WriteByte((byte)flags);

			pak.WritePascalString(GameServer.ServerRules.GetPlayerName(m_gameClient.Player, playerToCreate));
			pak.WritePascalString(GameServer.ServerRules.GetPlayerGuildName(m_gameClient.Player, playerToCreate));
			pak.WritePascalString(GameServer.ServerRules.GetPlayerLastName(m_gameClient.Player, playerToCreate));
			pak.WriteByte(0x00); //Trialing 0 ... needed!
			SendTCP(pak);

			//if (GameServer.ServerRules.GetColorHandling(m_gameClient) == 1) // PvP
			SendObjectGuildID(playerToCreate, playerToCreate.Guild); //used for nearest friendly/enemy object buttons and name colors on PvP server
		}
Example #19
0
        public override void SendHouseOccupied(House house, bool flagHouseOccuped)
        {
            using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.HouseChangeGarden)))
            {
                pak.WriteShort((ushort)house.HouseNumber);
                pak.WriteShort(0);                 // sheduled for repossession (in hours) new in 1.89b+
                pak.WriteByte(0x00);
                pak.WriteByte((byte)(flagHouseOccuped ? 1 : 0));

                SendTCP(pak);
            }

            // Update cache
            m_gameClient.HouseUpdateArray.UpdateIfExists(new Tuple <ushort, ushort>(house.RegionID, (ushort)house.HouseNumber), GameTimer.GetTickCount());
        }
Example #20
0
 public override void SendGarden(House house, int i)
 {
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.HouseChangeGarden)))
     {
         pak.WriteShort((ushort)house.HouseNumber);
         pak.WriteShort(0);                 // sheduled for repossession (in hours) new in 1.89b+
         pak.WriteByte(0x01);
         pak.WriteByte(0x00);               // update
         OutdoorItem item = (OutdoorItem)house.OutdoorItems[i];
         pak.WriteByte((byte)i);
         pak.WriteShort((ushort)item.Model);
         pak.WriteByte((byte)item.Position);
         pak.WriteByte((byte)item.Rotation);
         SendTCP(pak);
     }
 }
Example #21
0
 public override void SendKeepComponentUpdate(IGameKeep keep, bool LevelUp)
 {
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.KeepComponentUpdate)))
     {
         pak.WriteShort((ushort)keep.KeepID);
         pak.WriteByte((byte)keep.Realm);
         pak.WriteByte((byte)keep.Level);
         pak.WriteByte((byte)keep.SentKeepComponents.Count);
         foreach (IGameKeepComponent component in keep.SentKeepComponents)
         {
             byte m_flag = (byte)component.Height;
             if (component.Status == 0 && component.Climbing)
             {
                 m_flag |= 0x80;
             }
             if (component.IsRaized)                     // Only for towers
             {
                 m_flag |= 0x10;
             }
             if (LevelUp)
             {
                 m_flag |= 0x20;
             }
             if (!component.IsAlive)
             {
                 m_flag |= 0x40;
             }
             pak.WriteByte(m_flag);
         }
         pak.WriteByte((byte)0);                //unk
         SendTCP(pak);
     }
 }
Example #22
0
        public override void SendGroupWindowUpdate()
        {
            if (m_gameClient.Player == null)
            {
                return;
            }

            using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.VariousUpdate)))
            {
                pak.WriteByte(0x06);                 // subcode - player group window
                // a 06 00 packet is sent when logging in.
                var group = m_gameClient.Player.Group;
                if (group == null)
                {
                    pak.WriteByte(0x00);                     // a 06 00 packet is sent when logging in.
                }
                else
                {
                    pak.WriteByte(group.MemberCount);
                    foreach (GameLiving living in group.GetMembersInTheGroup())
                    {
                        pak.WritePascalString(living.Name);
                        pak.WritePascalString(living is GamePlayer ? ((GamePlayer)living).CharacterClass.Name : "NPC");
                        pak.WriteShort((ushort)living.ObjectID);                         //or session id?
                        pak.WriteByte(living.Level);
                    }
                }

                SendTCP(pak);
            }
        }
Example #23
0
		public override void SendKeepRemove(AbstractGameKeep keep)
		{
			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.KeepRemove));

			pak.WriteShort((ushort)keep.KeepID);
			SendTCP(pak);
		}
Example #24
0
		public override void SendKeepInfo(AbstractGameKeep keep)
		{
			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.KeepInfo));

			pak.WriteShort((ushort)keep.KeepID);
			pak.WriteShort(0);//zone id not sure
			pak.WriteInt((uint)keep.X);
			pak.WriteInt((uint)keep.Y);
			pak.WriteShort((ushort)keep.Heading);
			pak.WriteByte((byte)keep.Realm);
			pak.WriteByte((byte)keep.Level);//level(not sure)
			pak.WriteShort(0);//unk
			pak.WriteByte(0x57);//model= 5-8Bit =lvl 1-4bit = Keep Type //uncertain
			pak.WriteByte(0xB7);//unk
			SendTCP(pak);
		}
 public override void SendLivingDataUpdate(GameLiving living, bool updateStrings)
 {
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.ObjectDataUpdate)))
     {
         pak.WriteShort((ushort)living.ObjectID);
         pak.WriteByte(0);
         pak.WriteByte(living.Level);
         GamePlayer player = living as GamePlayer;
         if (player != null)
         {
             pak.WritePascalString(GameServer.ServerRules.GetPlayerGuildName(m_gameClient.Player, player));
             pak.WritePascalString(GameServer.ServerRules.GetPlayerLastName(m_gameClient.Player, player));
         }
         else if (!updateStrings)
         {
             pak.WriteByte(0xFF);
         }
         else
         {
             pak.WritePascalString(living.GuildName);
             pak.WritePascalString(living.Name);
         }
         SendTCP(pak);
     }
 }
Example #26
0
 public override void SendUpdatePoints()
 {
     if (m_gameClient.Player == null)
     {
         return;
     }
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.CharacterPointsUpdate)))
     {
         pak.WriteInt((uint)m_gameClient.Player.RealmPoints);
         pak.WriteShort(m_gameClient.Player.LevelPermill);
         pak.WriteShort((ushort)m_gameClient.Player.SkillSpecialtyPoints);
         pak.WriteInt((uint)m_gameClient.Player.BountyPoints);
         pak.WriteShort((ushort)m_gameClient.Player.RealmSpecialtyPoints);
         pak.WriteShort(m_gameClient.Player.ChampionLevelPermill);
         SendTCP(pak);
     }
 }
Example #27
0
		public override void SendFindGroupWindowUpdate(GamePlayer[] list)
		{
			if (m_gameClient.Player==null)
				return;
			
			using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.FindGroupUpdate)))
			{
				if (list!=null)
				{
					pak.WriteByte((byte)list.Length);
					byte nbleader=0;
					byte nbsolo=0x1E;
					foreach(GamePlayer player in list)
					{
						if (player.Group!=null)
						{
							pak.WriteByte(nbleader++);
						}
						else
						{
							pak.WriteByte(nbsolo++);
						}
						pak.WriteByte(player.Level);
						pak.WritePascalString(player.Name);
						pak.WriteString(player.CharacterClass.Name, 4);
	                    //Dinberg:Instances - We use ZoneSkinID to bluff our way to victory and
	                    //trick the client for positioning objects (as IDs are hard coded).
						if(player.CurrentZone != null)
							pak.WriteShort(player.CurrentZone.ZoneSkinID);
						else
							pak.WriteShort(0); // ?
						pak.WriteByte(0); // duration
						pak.WriteByte(0); // objective
						pak.WriteByte(0);
						pak.WriteByte(0);
						pak.WriteByte((byte) (player.Group!=null ? 1 : 0));
						pak.WriteByte(0);
					}
				}
				else
				{
					pak.WriteByte(0);
				}
				SendTCP(pak);
			}
		}
Example #28
0
 public override void SendKeepInfo(IGameKeep keep)
 {
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.KeepInfo)))
     {
         pak.WriteShort((ushort)keep.KeepID);
         pak.WriteShort(0);                //zone id not sure
         pak.WriteInt((uint)keep.X);
         pak.WriteInt((uint)keep.Y);
         pak.WriteShort((ushort)keep.Heading);
         pak.WriteByte((byte)keep.Realm);
         pak.WriteByte((byte)keep.Level);  //level(not sure)
         pak.WriteShort(0);                //unk
         pak.WriteByte(0x57);              //model= 5-8Bit =lvl 1-4bit = Keep Type //uncertain
         pak.WriteByte(0xB7);              //unk
         SendTCP(pak);
     }
 }
Example #29
0
		public override void SendUpdatePoints()
		{
			if (m_gameClient.Player == null)
				return;
			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.CharacterPointsUpdate));
			pak.WriteInt((uint)m_gameClient.Player.RealmPoints);
			pak.WriteShort(m_gameClient.Player.LevelPermill);
			pak.WriteShort((ushort)m_gameClient.Player.SkillSpecialtyPoints);
			pak.WriteInt((uint)m_gameClient.Player.BountyPoints);
			pak.WriteShort((ushort)m_gameClient.Player.RealmSpecialtyPoints);
			pak.WriteShort(m_gameClient.Player.ChampionLevelPermill);
			pak.WriteLongLowEndian((ulong)m_gameClient.Player.Experience);
			pak.WriteLongLowEndian((ulong)m_gameClient.Player.ExperienceForNextLevel);
			pak.WriteLongLowEndian(0);//champExp
			pak.WriteLongLowEndian(0);//champExpNextLevel
			SendTCP(pak);
		}
Example #30
0
 public override void SendRegionChanged()
 {
     if (m_gameClient.Player == null)
     {
         return;
     }
     SendRegions();
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.RegionChanged)))
     {
         //Dinberg - Changing to allow instances...
         pak.WriteShort(m_gameClient.Player.CurrentRegion.Skin);
         pak.WriteShort(0x00);                 // Zone ID?
         pak.WriteShort(0x00);                 // ?
         pak.WriteShort(0x01);                 // cause region change ?
         SendTCP(pak);
     }
 }
		public override void SendPlayerPositionAndObjectID()
		{
			if (m_gameClient.Player == null) return;

			using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.PositionAndObjectID)))
			{
				pak.WriteShort((ushort)m_gameClient.Player.ObjectID); //This is the player's objectid not Sessionid!!!
				pak.WriteShort((ushort)m_gameClient.Player.Z);
				pak.WriteInt((uint)m_gameClient.Player.X);
				pak.WriteInt((uint)m_gameClient.Player.Y);
				pak.WriteShort(m_gameClient.Player.Heading);
	
				int flags = 0;
				if (m_gameClient.Player.CurrentZone.IsDivingEnabled)
					flags = 0x80 | (m_gameClient.Player.IsUnderwater ? 0x01 : 0x00);
				pak.WriteByte((byte)(flags));
	
				pak.WriteByte(0x00);	//TODO Unknown
				Zone zone = m_gameClient.Player.CurrentZone;
				if (zone == null) return;
				pak.WriteShort((ushort)(zone.XOffset / 0x2000));
				pak.WriteShort((ushort)(zone.YOffset / 0x2000));
				//Dinberg - Changing to allow instances...
				pak.WriteShort(m_gameClient.Player.CurrentRegion.Skin);
				pak.WriteShort(0x00); //TODO: unknown, new in 1.71
				SendTCP(pak);
			}
		}
Example #32
0
		public override void SendKeepRealmUpdate(AbstractGameKeep keep)
		{
			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.KeepRealmUpdate));

			pak.WriteShort((ushort)keep.KeepID);
			pak.WriteByte((byte)keep.Realm);
			pak.WriteByte((byte)keep.Level);
			SendTCP(pak);
		}
Example #33
0
        protected virtual void WriteGroupMemberMapUpdate(GSTCPPacketOut pak, GameLiving living)
        {
            bool sameRegion = living.CurrentRegion == m_gameClient.Player.CurrentRegion;

            if (sameRegion && living.CurrentSpeed != 0)            //todo : find a better way to detect when player change coord
            {
                Zone zone = living.CurrentZone;
                if (zone == null)
                {
                    return;
                }
                pak.WriteByte((byte)(0x40 | living.GroupIndex));
                //Dinberg - ZoneSkinID for group members aswell.
                pak.WriteShort(zone.ZoneSkinID);
                pak.WriteShort((ushort)(living.X - zone.XOffset));
                pak.WriteShort((ushort)(living.Y - zone.YOffset));
            }
        }
Example #34
0
        public override void SendGarden(House house, int i)
        {
            using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.HouseChangeGarden)))
            {
                pak.WriteShort((ushort)house.HouseNumber);
                pak.WriteShort(0);                 // sheduled for repossession (in hours) new in 1.89b+
                pak.WriteByte(0x01);
                pak.WriteByte(0x00);               // update
                OutdoorItem item = (OutdoorItem)house.OutdoorItems[i];
                pak.WriteByte((byte)i);
                pak.WriteShort((ushort)item.Model);
                pak.WriteByte((byte)item.Position);
                pak.WriteByte((byte)item.Rotation);
                SendTCP(pak);
            }

            // Update cache
            m_gameClient.HouseUpdateArray.UpdateIfExists(new Tuple <ushort, ushort>(house.RegionID, (ushort)house.HouseNumber), GameTimer.GetTickCount());
        }
Example #35
0
 public override void SendKeepRealmUpdate(IGameKeep keep)
 {
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.KeepRealmUpdate)))
     {
         pak.WriteShort((ushort)keep.KeepID);
         pak.WriteByte((byte)keep.Realm);
         pak.WriteByte((byte)keep.Level);
         SendTCP(pak);
     }
 }
Example #36
0
 /// <summary>
 /// 1125 cryptkey response
 /// </summary>
 public override void SendVersionAndCryptKey()
 {
     //Construct the new packet
     using (var pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.CryptKey)))
     {
         pak.WritePascalStringIntLowEndian((((int)GameClient.Version) / 1000) + "." + (((int)GameClient.Version) - 1000) + GameClient.MinorRev);
         pak.WriteShort(GameClient.ClientId);
         SendTCP(pak);
     }
 }
Example #37
0
 public override void SendXFireInfo(byte flag)
 {
     if (m_gameClient == null || m_gameClient.Player == null)
         return;
     GSTCPPacketOut pak = new GSTCPPacketOut((byte)eServerPackets.XFire);
     pak.WriteShort((ushort)m_gameClient.Player.ObjectID);
     pak.WriteByte(flag);
     pak.WriteByte(0x00);
     SendTCP(pak);
 }
 public override void SendRegionColorScheme(byte color)
 {
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.VisualEffect)))
     {
         pak.WriteShort(0);               // not used
         pak.WriteByte(0x05);             // subcode
         pak.WriteByte(color);
         pak.WriteInt(0);                 // not used
         SendTCP(pak);
     }
 }
Example #39
0
        /// <summary>
        /// Gutted this packet to get 1126 connections to work. Definitely needs more research
        /// </summary>
        public override void SendRegions()
        {
            if (!GameClient.Socket.Connected)
            {
                return;
            }

            using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.StartArena)))
            {
                string ip = ip = ((IPEndPoint)GameClient.Socket.LocalEndPoint).Address.ToString();

                pak.WritePascalStringLowEndian(ip);
                pak.WriteShort(10400); // from port?
                pak.WriteByte(0);      // ??
                pak.WriteByte(0);      // ??
                pak.WriteShort(10400); // ?? to port?
                pak.WriteByte(0);      // ??
                pak.WriteByte(0);      // ??
                SendTCP(pak);
            }
        }
Example #40
0
 public override void SendUpdatePoints()
 {
     if (m_gameClient.Player == null)
     {
         return;
     }
     using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.CharacterPointsUpdate)))
     {
         pak.WriteInt((uint)m_gameClient.Player.RealmPoints);
         pak.WriteShort(m_gameClient.Player.LevelPermill);
         pak.WriteShort((ushort)m_gameClient.Player.SkillSpecialtyPoints);
         pak.WriteInt((uint)m_gameClient.Player.BountyPoints);
         pak.WriteShort((ushort)m_gameClient.Player.RealmSpecialtyPoints);
         pak.WriteShort(m_gameClient.Player.ChampionLevelPermill);
         pak.WriteLongLowEndian((ulong)m_gameClient.Player.Experience);
         pak.WriteLongLowEndian((ulong)m_gameClient.Player.ExperienceForNextLevel);
         pak.WriteLongLowEndian(0);                //champExp
         pak.WriteLongLowEndian(0);                //champExpNextLevel
         SendTCP(pak);
     }
 }
Example #41
0
 /// <summary>
 /// new siege weapon fireanimation 1.110 // patch 0021
 /// </summary>
 /// <param name="siegeWeapon">The siege weapon</param>
 /// <param name="timer">How long the animation lasts for</param>
 public override void SendSiegeWeaponFireAnimation(GameSiegeWeapon siegeWeapon, int timer)
 {
     if (siegeWeapon == null)
     {
         return;
     }
     using (var pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.SiegeWeaponAnimation)))
     {
         pak.WriteInt((uint)siegeWeapon.ObjectID);
         pak.WriteInt((uint)(siegeWeapon.TargetObject == null ? siegeWeapon.GroundTarget.X : siegeWeapon.TargetObject.X));
         pak.WriteInt((uint)(siegeWeapon.TargetObject == null ? siegeWeapon.GroundTarget.Y : siegeWeapon.TargetObject.Y));
         pak.WriteInt((uint)(siegeWeapon.TargetObject == null ? siegeWeapon.GroundTarget.Z + 50 : siegeWeapon.TargetObject.Z + 50));
         pak.WriteInt((uint)(siegeWeapon.TargetObject == null ? 0 : siegeWeapon.TargetObject.ObjectID));
         pak.WriteShort(siegeWeapon.Effect);
         pak.WriteShort((ushort)(timer));     // timer is no longer ( value / 100 )
         pak.WriteByte((byte)SiegeTimer.eAction.Fire);
         pak.WriteShort(0xE134);              // default ammo type, the only type currently supported on DOL
         pak.WriteByte(0x08);                 // always this flag when firing
         SendTCP(pak);
     }
 }
Example #42
0
        public override void SendBlinkPanel(byte flag)
        {
            GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.VisualEffect));
            GamePlayer player = base.m_gameClient.Player;

            pak.WriteShort((ushort)player.ObjectID);
            pak.WriteByte((byte)8);
            pak.WriteByte((byte)flag);
            pak.WriteByte((byte)0);

            SendTCP(pak);
        }
Example #43
0
		protected override void SendQuestWindow(GameNPC questNPC, GamePlayer player, DataQuest quest, bool offer)
		{
			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.Dialog));
			ushort QuestID = quest.ClientQuestID;
			pak.WriteShort((offer) ? (byte)0x22 : (byte)0x21); // Dialog
			pak.WriteShort(QuestID);
			pak.WriteShort((ushort)questNPC.ObjectID);
			pak.WriteByte(0x00); // unknown
			pak.WriteByte(0x00); // unknown
			pak.WriteByte(0x00); // unknown
			pak.WriteByte(0x00); // unknown
			pak.WriteByte((offer) ? (byte)0x02 : (byte)0x01); // Accept/Decline or Finish/Not Yet
			pak.WriteByte(0x01); // Wrap
			pak.WritePascalString(quest.Name);

			String personalizedSummary = BehaviourUtils.GetPersonalizedMessage(quest.Description, player);
			if (personalizedSummary.Length > 255)
			{
				pak.WritePascalString(personalizedSummary.Substring(0, 255)); // Summary is max 255 bytes !
			}
			else
			{
				pak.WritePascalString(personalizedSummary);
			}

			if (offer)
			{
				//String personalizedStory = BehaviourUtils.GetPersonalizedMessage(quest.Story, player);
				pak.WriteShort((ushort)quest.Story.Length);
				pak.WriteStringBytes(quest.Story);
			}
			else
			{
				pak.WriteShort((ushort)quest.FinishText.Length);
				pak.WriteStringBytes(quest.FinishText);
			}
			pak.WriteShort(QuestID);
			pak.WriteByte((byte)quest.StepTexts.Count); // #goals count
			foreach (string text in quest.StepTexts)
			{
				pak.WritePascalString(String.Format("{0}\r", text));
			}
			pak.WriteInt((uint)(0));
			pak.WriteByte((byte)0);
			pak.WriteByte((byte)quest.FinalRewards.Count);
			foreach (ItemTemplate reward in quest.FinalRewards)
			{
				WriteItemData(pak, GameInventoryItem.Create<ItemTemplate>(reward));
			}
			pak.WriteByte((byte)quest.NumOptionalRewardsChoice);
			pak.WriteByte((byte)quest.OptionalRewards.Count);
			foreach (ItemTemplate reward in quest.OptionalRewards)
			{
				WriteItemData(pak, GameInventoryItem.Create<ItemTemplate>(reward));
			}
			SendTCP(pak);
		}
Example #44
0
		public override void SendObjectCreate(GameObject obj)
		{
			if (obj == null || m_gameClient.Player == null)
				return;

			if (obj.IsVisibleTo(m_gameClient.Player) == false)
				return;

			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.ObjectCreate));
			pak.WriteShort((ushort)obj.ObjectID);
			if (obj is GameStaticItem)
				pak.WriteShort((ushort)(obj as GameStaticItem).Emblem);
			else pak.WriteShort(0);
			pak.WriteShort(obj.Heading);
			pak.WriteShort((ushort)obj.Z);
			pak.WriteInt((uint)obj.X);
			pak.WriteInt((uint)obj.Y);
			int flag = ((byte)obj.Realm & 3) << 4;
			ushort model = obj.Model;
			if (obj.IsUnderwater)
			{
				if (obj is GameNPC)
					model |= 0x8000;
				else
					flag |= 0x01; // Underwater
			}
			pak.WriteShort(model);
			if (obj is GameKeepBanner)
				flag |= 0x08;
			if (obj is GameStaticItemTimed && m_gameClient.Player != null && ((GameStaticItemTimed)obj).IsOwner(m_gameClient.Player))
				flag |= 0x04;
			pak.WriteShort((ushort)flag);
			pak.WriteInt(0x0); //TODO: unknown, new in 1.71
			pak.WritePascalString(obj.Name);
			if (obj is IDoor)
			{
				pak.WriteByte(4);
				pak.WriteInt((uint)(obj as IDoor).DoorID);
			}
			else pak.WriteByte(0x00);
			SendTCP(pak);
		}
Example #45
0
		public override void SendStatusUpdate(byte sittingFlag)
		{
			if (m_gameClient.Player == null)
				return;
			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.CharacterStatusUpdate));
			pak.WriteByte(m_gameClient.Player.HealthPercent);
			pak.WriteByte(m_gameClient.Player.ManaPercent);
			pak.WriteByte(sittingFlag);
			pak.WriteByte(m_gameClient.Player.EndurancePercent);
			pak.WriteByte(m_gameClient.Player.ConcentrationPercent);
			//			pak.WriteShort((byte) (m_gameClient.Player.IsAlive ? 0x00 : 0x0f)); // 0x0F if dead ??? where it now ?
			pak.WriteByte(0);// unk
			pak.WriteShort((ushort)m_gameClient.Player.MaxMana);
			pak.WriteShort((ushort)m_gameClient.Player.MaxEndurance);
			pak.WriteShort((ushort)m_gameClient.Player.MaxConcentration);
			pak.WriteShort((ushort)m_gameClient.Player.MaxHealth);
			pak.WriteShort((ushort)m_gameClient.Player.Health);
			pak.WriteShort((ushort)m_gameClient.Player.Endurance);
			pak.WriteShort((ushort)m_gameClient.Player.Mana);
			pak.WriteShort((ushort)m_gameClient.Player.Concentration);
			SendTCP(pak);
		}
Example #46
0
		protected override void SendQuestWindow(GameNPC questNPC, GamePlayer player, RewardQuest quest,	bool offer)
		{
			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.Dialog));
			ushort QuestID = QuestMgr.GetIDForQuestType(quest.GetType());
			pak.WriteShort((offer) ? (byte)0x22 : (byte)0x21); // Dialog
			pak.WriteShort(QuestID);
			pak.WriteShort((ushort)questNPC.ObjectID);
			pak.WriteByte(0x00); // unknown
			pak.WriteByte(0x00); // unknown
			pak.WriteByte(0x00); // unknown
			pak.WriteByte(0x00); // unknown
			pak.WriteByte((offer) ? (byte)0x02 : (byte)0x01); // Accept/Decline or Finish/Not Yet
			pak.WriteByte(0x01); // Wrap
			pak.WritePascalString(quest.Name);
			if (quest.Summary.Length > 255)
				pak.WritePascalString(quest.Summary.Substring(0,255));
			else
				pak.WritePascalString(quest.Summary);
			if (offer)
			{
				pak.WriteShort((ushort)quest.Story.Length);
				pak.WriteStringBytes(quest.Story);
			}
			else
			{
				pak.WriteShort((ushort)quest.Conclusion.Length);
				pak.WriteStringBytes(quest.Conclusion);
			}
			pak.WriteShort(QuestID);
			pak.WriteByte((byte)quest.Goals.Count); // #goals count
			foreach (RewardQuest.QuestGoal goal in quest.Goals)
			{
				pak.WritePascalString(String.Format("{0}\r", goal.Description));
			}
			pak.WriteByte((byte)quest.Level);
			pak.WriteByte((byte)quest.Rewards.MoneyPercent);
			pak.WriteByte((byte)quest.Rewards.ExperiencePercent(player));
			pak.WriteByte((byte)quest.Rewards.BasicItems.Count);
			foreach (ItemTemplate reward in quest.Rewards.BasicItems)
				WriteTemplateData(pak, reward, 1);
			pak.WriteByte((byte)quest.Rewards.ChoiceOf);
			pak.WriteByte((byte)quest.Rewards.OptionalItems.Count);
			foreach (ItemTemplate reward in quest.Rewards.OptionalItems)
				WriteTemplateData(pak, reward, 1);
			SendTCP(pak);
		}
Example #47
0
		public override void SendObjectCreate(GameObject obj)
		{
			if (obj == null)
				return;

			if (obj.IsVisibleTo(m_gameClient.Player) == false)
				return;

			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.ObjectCreate));
			pak.WriteShort((ushort)obj.ObjectID);
			if (obj is GameStaticItem)
				pak.WriteShort((ushort)(obj as GameStaticItem).Emblem);
			else pak.WriteShort(0);
			pak.WriteShort(obj.Heading);
			pak.WriteShort((ushort)obj.Z);
			pak.WriteInt((uint)obj.X);
			pak.WriteInt((uint)obj.Y);
			int flag = ((byte)obj.Realm & 3) << 4;
			ushort model = obj.Model;
			if (obj.IsUnderwater)
			{
				if (obj is GameNPC)
					model |= 0x8000;
				else
					flag |= 0x01; // Underwater
			}
			pak.WriteShort(model);
			if (obj is Keeps.GameKeepBanner)
				flag |= 0x08;
			if (obj is GameStaticItemTimed && m_gameClient.Player != null && ((GameStaticItemTimed)obj).IsOwner(m_gameClient.Player))
				flag |= 0x04;
			pak.WriteShort((ushort)flag);
			if (obj is GameStaticItem)
			{
				int newEmblemBitMask = ((obj as GameStaticItem).Emblem & 0x010000) << 9;
				pak.WriteInt((uint)newEmblemBitMask);//TODO other bits
			}
			else pak.WriteInt(0);

            string name = obj.Name;
            LanguageDataObject translation = null;
            if (obj is GameStaticItem)
            {
                translation = LanguageMgr.GetTranslation(m_gameClient, (GameStaticItem)obj);
                if (translation != null)
                {
                    if (obj is WorldInventoryItem)
                    {
                        //if (!Util.IsEmpty(((DBLanguageItem)translation).Name))
                        //    name = ((DBLanguageItem)translation).Name;
                    }
                    else
                    {
                        if (!Util.IsEmpty(((DBLanguageGameObject)translation).Name))
                            name = ((DBLanguageGameObject)translation).Name;
                    }
                }
            }
            pak.WritePascalString(name.Length > 48 ? name.Substring(0, 48) : name);

			if (obj is IDoor)
			{
				pak.WriteByte(4);
				pak.WriteInt((uint)(obj as IDoor).DoorID);
			}
			else pak.WriteByte(0x00);
			SendTCP(pak);
		}
Example #48
0
		protected override void WriteHouseFurniture(GSTCPPacketOut pak, IndoorItem item, int index)
		{
			pak.WriteByte((byte)index);
			byte type = 0;
            if (item.Emblem > 0)
                item.Color = item.Emblem;
			if (item.Color > 0)
			{
				if (item.Color <= 0xFF)
					type |= 1; // colored
				else if (item.Color <= 0xFFFF)
					type |= 2; // old emblem
				else
					type |= 6; // new emblem
			}
			if (item.Size != 0)
				type |= 8; // have size
			pak.WriteByte(type);
			pak.WriteShort((ushort)item.Model);
			if ((type & 1) == 1)
				pak.WriteByte((byte)item.Color);
			else if ((type & 6) == 2)
				pak.WriteShort((ushort)item.Color);
			else if ((type & 6) == 6)
				pak.WriteShort((ushort)(item.Color & 0xFFFF));
			pak.WriteShort((ushort)item.X);
			pak.WriteShort((ushort)item.Y);
			pak.WriteShort((ushort)item.Rotation);
			if ((type & 8) == 8)
				pak.WriteByte((byte)item.Size);
			pak.WriteByte((byte)item.Position);
			pak.WriteByte((byte)(item.PlacementMode - 2));
		}
Example #49
0
		public override void SendRvRGuildBanner(GamePlayer player, bool show)
		{
			if (player == null) return;

			//cannot show banners for players that have no guild.
			if (show && player.Guild == null)
				return;
			GSTCPPacketOut pak = new GSTCPPacketOut((byte)eServerPackets.VisualEffect);
			pak.WriteShort((ushort)player.ObjectID);
			pak.WriteByte(0xC); // show Banner
			pak.WriteByte((byte)((show) ? 0 : 1)); // 0-enable, 1-disable
			int newEmblemBitMask = ((player.Guild.Emblem & 0x010000) << 8) | (player.Guild.Emblem & 0xFFFF);
			pak.WriteInt((uint)newEmblemBitMask);
			SendTCP(pak);
		}
Example #50
0
		/*
		 * public override void SendPlayerBanner(GamePlayer player, int GuildEmblem)
		{
			if (player == null) return;
			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.VisualEffect));
			pak.WriteShort((ushort) player.ObjectID);
			pak.WriteByte(12);
			if (GuildEmblem == 0)
			{
				pak.WriteByte(1);
			}
			else
			{
				pak.WriteByte(0);
			}
			int newEmblemBitMask = ((GuildEmblem & 0x010000) << 8) | (GuildEmblem & 0xFFFF);
			pak.WriteInt((uint)newEmblemBitMask);
			SendTCP(pak);
		}

		 */

		public override void SendHouse(House house)
		{
			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.HouseCreate));
			pak.WriteShort((ushort)house.HouseNumber);
			pak.WriteShort((ushort)house.Z);
			pak.WriteInt((uint)house.X);
			pak.WriteInt((uint)house.Y);
			pak.WriteShort((ushort)house.Heading);
			pak.WriteShort((ushort)house.PorchRoofColor);
			pak.WriteShort((ushort)(house.GetPorchAndGuildEmblemFlags() | (house.Emblem & 0x010000) >> 13));//new Guild Emblem
			pak.WriteShort((ushort)house.Emblem);
			pak.WriteByte((byte)house.Model);
			pak.WriteByte((byte)house.RoofMaterial);
			pak.WriteByte((byte)house.WallMaterial);
			pak.WriteByte((byte)house.DoorMaterial);
			pak.WriteByte((byte)house.TrussMaterial);
			pak.WriteByte((byte)house.PorchMaterial);
			pak.WriteByte((byte)house.WindowMaterial);
			pak.WriteByte(0x03);
			pak.WritePascalString(house.Name);

			SendTCP(pak);
		}
Example #51
0
		public override void SendEnterHouse(House house)
		{
			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.HouseEnter));

			pak.WriteShort((ushort)house.HouseNumber);
			pak.WriteShort((ushort)25000);         //constant!
			pak.WriteInt((uint)house.X);
			pak.WriteInt((uint)house.Y);
			pak.WriteShort((ushort)house.Heading); //useless/ignored by client.
			pak.WriteByte(0x00);
			pak.WriteByte((byte)(house.GetGuildEmblemFlags() | (house.Emblem & 0x010000) >> 14));//new Guild Emblem
			pak.WriteShort((ushort)house.Emblem);	//emblem
			pak.WriteByte(0x00);
			pak.WriteByte(0x00);
			pak.WriteByte((byte)house.Model);
			pak.WriteByte(0x00);
			pak.WriteByte(0x00);
			pak.WriteByte(0x00);
			pak.WriteByte((byte)house.Rug1Color);
			pak.WriteByte((byte)house.Rug2Color);
			pak.WriteByte((byte)house.Rug3Color);
			pak.WriteByte((byte)house.Rug4Color);
			pak.WriteByte(0x00);

			SendTCP(pak);
		}
Example #52
0
		protected override void SendInventorySlotsUpdateRange(ICollection<int> slots, eInventoryWindowType windowType)
		{
			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.InventoryUpdate));
			pak.WriteByte((byte)(slots == null ? 0 : slots.Count));
			pak.WriteByte((byte)((m_gameClient.Player.IsCloakHoodUp ? 0x01 : 0x00) | (int)m_gameClient.Player.ActiveQuiverSlot)); //bit0 is hood up bit4 to 7 is active quiver
			pak.WriteByte((byte)m_gameClient.Player.VisibleActiveWeaponSlots);
			pak.WriteByte((byte)windowType); //preAction (0x00 - Do nothing)
			if (slots != null)
			{
				foreach (int updatedSlot in slots)
				{
					if (updatedSlot >= (int)eInventorySlot.Consignment_First && updatedSlot <= (int)eInventorySlot.Consignment_Last)
						pak.WriteByte((byte)(updatedSlot - (int)eInventorySlot.Consignment_First + (int)eInventorySlot.HousingInventory_First));
					else
						pak.WriteByte((byte)(updatedSlot));
					InventoryItem item = null;
					item = m_gameClient.Player.Inventory.GetItem((eInventorySlot)updatedSlot);

					if (item == null)
					{
						pak.Fill(0x00, 19);
						continue;
					}

					pak.WriteByte((byte)item.Level);

					int value1; // some object types use this field to display count
					int value2; // some object types use this field to display count
					switch (item.Object_Type)
					{
						case (int)eObjectType.GenericItem:
							value1 = item.Count & 0xFF;
							value2 = (item.Count >> 8) & 0xFF;
							break;
						case (int)eObjectType.Arrow:
						case (int)eObjectType.Bolt:
						case (int)eObjectType.Poison:
							value1 = item.Count;
							value2 = item.SPD_ABS;
							break;
						case (int)eObjectType.Thrown:
							value1 = item.DPS_AF;
							value2 = item.Count;
							break;
						case (int)eObjectType.Instrument:
							value1 = (item.DPS_AF == 2 ? 0 : item.DPS_AF);
							value2 = 0;
							break; // unused
						case (int)eObjectType.Shield:
							value1 = item.Type_Damage;
							value2 = item.DPS_AF;
							break;
						case (int)eObjectType.AlchemyTincture:
						case (int)eObjectType.SpellcraftGem:
							value1 = 0;
							value2 = 0;
							/*
							must contain the quality of gem for spell craft and think same for tincture
							*/
							break;
						case (int)eObjectType.HouseWallObject:
						case (int)eObjectType.HouseFloorObject:
						case (int)eObjectType.GardenObject:
							value1 = 0;
							value2 = item.SPD_ABS;
							/*
							Value2 byte sets the width, only lower 4 bits 'seem' to be used (so 1-15 only)

							The byte used for "Hand" (IE: Mini-delve showing a weapon as Left-Hand
							usabe/TwoHanded), the lower 4 bits store the height (1-15 only)
							*/
							break;

						default:
							value1 = item.DPS_AF;
							value2 = item.SPD_ABS;
							break;
					}
					pak.WriteByte((byte)value1);
					pak.WriteByte((byte)value2);

					if (item.Object_Type == (int)eObjectType.GardenObject)
						pak.WriteByte((byte)(item.DPS_AF));
					else
						pak.WriteByte((byte)(item.Hand << 6));
					pak.WriteByte((byte)((item.Type_Damage > 3 ? 0 : item.Type_Damage << 6) | item.Object_Type));
					pak.WriteShort((ushort)item.Weight);
					pak.WriteByte(item.ConditionPercent); // % of con
					pak.WriteByte(item.DurabilityPercent); // % of dur
					pak.WriteByte((byte)item.Quality); // % of qua
					pak.WriteByte((byte)item.Bonus); // % bonus
					pak.WriteShort((ushort)item.Model);
					pak.WriteByte((byte)item.Extension);
					int effect = item.Effect;
					if (item.Emblem != 0)
					{
						pak.WriteShort((ushort)item.Emblem);
						effect |= (item.Emblem & 0x010000) >> 8; // = 1 for newGuildEmblem
					}
					else
						pak.WriteShort((ushort)item.Color);
					pak.WriteShort((ushort)effect);
					string name = item.Name;
					if (item.Count > 1)
						name = item.Count + " " + name;
                    if (item.SellPrice > 0)
                    {
						if (ServerProperties.Properties.CONSIGNMENT_USE_BP)
                            name += "[" + item.SellPrice.ToString() + " BP]";
                        else
                            name += "[" + Money.GetString(item.SellPrice) + "]";
                    }
					pak.WritePascalString(name);
				}
			}
			SendTCP(pak);
		}
Example #53
0
		public override void SendLivingEquipmentUpdate(GameLiving living)
		{
			if (m_gameClient.Player == null || living.IsVisibleTo(m_gameClient.Player) == false)
				return;

			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.EquipmentUpdate));

			ICollection<InventoryItem> items = null;
			if (living.Inventory != null)
				items = living.Inventory.VisibleItems;

			pak.WriteShort((ushort)living.ObjectID);
			pak.WriteByte((byte)((living.IsCloakHoodUp ? 0x01 : 0x00) | (int)living.ActiveQuiverSlot)); //bit0 is hood up bit4 to 7 is active quiver

			pak.WriteByte((byte)living.VisibleActiveWeaponSlots);
			if (items != null)
			{
				pak.WriteByte((byte)items.Count);
				foreach (InventoryItem item in items)
				{
					ushort model = (ushort)(item.Model & 0x1FFF);
					int slot = item.SlotPosition;
					int texture = (item.Emblem != 0) ? item.Emblem : item.Color;
					if (item.SlotPosition == Slot.LEFTHAND || item.SlotPosition == Slot.CLOAK) // for test only cloack and shield
						slot = slot | ((texture & 0x010000) >> 9); // slot & 0x80 if new emblem
					pak.WriteByte((byte)slot);
					if ((texture & ~0xFF) != 0)
						model |= 0x8000;
					else if ((texture & 0xFF) != 0)
						model |= 0x4000;
					if (item.Effect != 0)
						model |= 0x2000;

					pak.WriteShort(model);

					if (item.SlotPosition > Slot.RANGED || item.SlotPosition < Slot.RIGHTHAND)
						pak.WriteByte((byte)item.Extension);

					if ((texture & ~0xFF) != 0)
						pak.WriteShort((ushort)texture);
					else if ((texture & 0xFF) != 0)
						pak.WriteByte((byte)texture);
					if (item.Effect != 0)
						pak.WriteByte((byte)item.Effect);
				}
			}
			else
			{
				pak.WriteByte(0x00);
			}
			SendTCP(pak);
		}
Example #54
0
		public override void SendUpdateIcons(IList changedEffects, ref int lastUpdateEffectsCount)
		{
			if (m_gameClient.Player == null)
			{
				return;
			}
			
			IList<int> tooltipids = new List<int>();
			
			using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.UpdateIcons)))
			{
				long initPos = pak.Position;
	
				int fxcount = 0;
				int entriesCount = 0;
	
				pak.WriteByte(0); // effects count set in the end
				pak.WriteByte(0); // unknown
				pak.WriteByte(Icons); // unknown
				pak.WriteByte(0); // unknown
	
				foreach (IGameEffect effect in m_gameClient.Player.EffectList)
				{
					if (effect.Icon != 0)
					{
						fxcount++;
						if (changedEffects != null && !changedEffects.Contains(effect))
						{
							continue;
						}
						
						// store tooltip update for gamespelleffect.
						if (ForceTooltipUpdate && (effect is GameSpellEffect))
						{
							Spell spell = ((GameSpellEffect)effect).Spell;
							tooltipids.Add(spell.InternalID);
						}
	
						//						log.DebugFormat("adding [{0}] '{1}'", fxcount-1, effect.Name);
						pak.WriteByte((byte)(fxcount - 1)); // icon index
						pak.WriteByte((effect is GameSpellEffect || effect.Icon > 5000) ? (byte)(fxcount - 1) : (byte)0xff);
						byte ImmunByte = 0;
						if (effect is GameSpellEffect)
						{
							//if (((GameSpellEffect)effect).ImmunityState)
							if (effect is GameSpellAndImmunityEffect && ((GameSpellAndImmunityEffect)effect).ImmunityState)
							{
								ImmunByte = 1;
							}
						}
						pak.WriteByte(ImmunByte);
						// bit 0x08 adds "more..." to right click info
						pak.WriteShort(effect.Icon);
						//pak.WriteShort(effect.IsFading ? (ushort)1 : (ushort)(effect.RemainingTime / 1000));
						pak.WriteShort((ushort)(effect.RemainingTime / 1000));
						if (effect is GameSpellEffect)
							pak.WriteShort((ushort)((GameSpellEffect)effect).Spell.InternalID); //v1.110+ send the spell ID for delve info in active icon
						else
							pak.WriteShort(0);//don't override existing tooltip ids
	
						byte flagNegativeEffect = 0;
						if (effect is StaticEffect)
						{
							if (((StaticEffect)effect).HasNegativeEffect)
							{
								flagNegativeEffect = 1;
							}
						}
						else if (effect is GameSpellEffect)
						{
							if (!((GameSpellEffect)effect).SpellHandler.HasPositiveEffect)
							{
								flagNegativeEffect = 1;
							}
						}
						pak.WriteByte(flagNegativeEffect);
	
						pak.WritePascalString(effect.Name);
						entriesCount++;
					}
				}
	
				int oldCount = lastUpdateEffectsCount;
				lastUpdateEffectsCount = fxcount;
	
				while (oldCount > fxcount)
				{
					pak.WriteByte((byte)(fxcount++));
					pak.Fill(0, 10);
					entriesCount++;
					//					log.DebugFormat("adding [{0}] (empty)", fxcount-1);
				}
	
				if (changedEffects != null)
				{
					changedEffects.Clear();
				}
	
				if (entriesCount == 0)
				{
					return; // nothing changed - no update is needed
				}
	
				pak.Position = initPos;
				pak.WriteByte((byte)entriesCount);
				pak.Seek(0, SeekOrigin.End);
	
				SendTCP(pak);
			}
			
			// force tooltips update
			foreach (int entry in tooltipids)
			{
				if (m_gameClient.CanSendTooltip(24, entry))
					SendDelveInfo(DOL.GS.PacketHandler.Client.v168.DetailDisplayHandler.DelveSpell(m_gameClient, entry));
			}
		}
Example #55
0
		public override void SendPlayerTitleUpdate(GamePlayer player)
		{
			using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.VisualEffect)))
			{
				pak.WriteShort((ushort)player.ObjectID);
				pak.WriteByte(0x0B); // subcode
				IPlayerTitle title = player.CurrentTitle;
				if (title == PlayerTitleMgr.ClearTitle)
				{
					pak.WriteByte(0); // flag
					pak.WriteInt(0); // unk1 + str len
				}
				else
				{
					pak.WriteByte(1); // flag
					string val = GameServer.ServerRules.GetPlayerTitle(m_gameClient.Player, player);
					pak.WriteShort((ushort) val.Length);
					pak.WriteShort(0); // unk1
					pak.WriteStringBytes(val);
				}
				SendTCP(pak);
			}
		}
Example #56
0
		protected override void SendQuestPacket(AbstractQuest q, int index)
		{
			if (q == null || !(q is RewardQuest))
			{
				base.SendQuestPacket(q, index);
				return;
			}

			RewardQuest quest = q as RewardQuest;
			GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.QuestEntry));
			pak.WriteByte((byte)index);
			pak.WriteByte((byte)quest.Name.Length);
			pak.WriteShort(0x00); // unknown
			pak.WriteByte((byte)quest.Goals.Count);
			pak.WriteByte((byte)quest.Level);
			pak.WriteStringBytes(quest.Name);
			pak.WritePascalString(quest.Description);
			foreach (RewardQuest.QuestGoal goal in quest.Goals)
			{
				String goalDesc = String.Format("{0}\r", goal.Description);
				pak.WriteShortLowEndian((ushort)goalDesc.Length);
				pak.WriteStringBytes(goalDesc);
				pak.WriteShortLowEndian((ushort)goal.ZoneID2);
				pak.WriteShortLowEndian((ushort)goal.XOffset2);
				pak.WriteShortLowEndian((ushort)goal.YOffset2);
				pak.WriteShortLowEndian(0x00);	// unknown
				pak.WriteShortLowEndian((ushort)goal.Type);
				pak.WriteShortLowEndian(0x00);	// unknown
				pak.WriteShortLowEndian((ushort)goal.ZoneID1);
				pak.WriteShortLowEndian((ushort)goal.XOffset1);
				pak.WriteShortLowEndian((ushort)goal.YOffset1);
				pak.WriteByte((byte)((goal.IsAchieved) ? 0x01 : 0x00));
				if (goal.QuestItem == null)
					pak.WriteByte(0x00);
				else
				{
					pak.WriteByte(0x01);
					WriteTemplateData(pak, goal.QuestItem, 1);
				}
			}
			SendTCP(pak);
		}
Example #57
0
		protected virtual void WriteTemplateData(GSTCPPacketOut pak, ItemTemplate template, int count)
		{
			pak.WriteByte((byte)template.Level);

			int value1;
			int value2;

			switch (template.Object_Type)
			{
				case (int)eObjectType.Arrow:
				case (int)eObjectType.Bolt:
				case (int)eObjectType.Poison:
				case (int)eObjectType.GenericItem:
					value1 = count; // Count
					value2 = template.SPD_ABS;
					break;
				case (int)eObjectType.Thrown:
					value1 = template.DPS_AF;
					value2 = count; // Count
					break;
				case (int)eObjectType.Instrument:
					value1 = (template.DPS_AF == 2 ? 0 : template.DPS_AF);
					value2 = 0;
					break;
				case (int)eObjectType.Shield:
					value1 = template.Type_Damage;
					value2 = template.DPS_AF;
					break;
				case (int)eObjectType.AlchemyTincture:
				case (int)eObjectType.SpellcraftGem:
					value1 = 0;
					value2 = 0;
					/*
					must contain the quality of gem for spell craft and think same for tincture
					*/
					break;
				case (int)eObjectType.GardenObject:
					value1 = 0;
					value2 = template.SPD_ABS;
					/*
					Value2 byte sets the width, only lower 4 bits 'seem' to be used (so 1-15 only)

					The byte used for "Hand" (IE: Mini-delve showing a weapon as Left-Hand
					usabe/TwoHanded), the lower 4 bits store the height (1-15 only)
					*/
					break;

				default:
					value1 = template.DPS_AF;
					value2 = template.SPD_ABS;
					break;
			}
			pak.WriteByte((byte)value1);
			pak.WriteByte((byte)value2);

			if (template.Object_Type == (int)eObjectType.GardenObject)
				pak.WriteByte((byte)(template.DPS_AF));
			else
				pak.WriteByte((byte)(template.Hand << 6));
			pak.WriteByte((byte)((template.Type_Damage > 3
				? 0
				: template.Type_Damage << 6) | template.Object_Type));
			pak.WriteShort((ushort)template.Weight);
			pak.WriteByte(template.BaseConditionPercent);
			pak.WriteByte(template.BaseDurabilityPercent);
			pak.WriteByte((byte)template.Quality);
			pak.WriteByte((byte)template.Bonus);
			pak.WriteShort((ushort)template.Model);
			pak.WriteByte((byte)template.Extension);
			if (template.Emblem != 0)
				pak.WriteShort((ushort)template.Emblem);
			else
				pak.WriteShort((ushort)template.Color);
			pak.WriteShort((ushort)template.Effect);
			if (count > 1)
				pak.WritePascalString(String.Format("{0} {1}", count, template.Name));
			else
				pak.WritePascalString(template.Name);
		}
Example #58
0
		public override void SendPlayerCreate(GamePlayer playerToCreate)
		{
			Region playerRegion = playerToCreate.CurrentRegion;
			if (playerRegion == null)
			{
				if (log.IsWarnEnabled)
					log.Warn("SendPlayerCreate: playerRegion == null");
				return;
			}

			Zone playerZone = playerToCreate.CurrentZone;
			if (playerZone == null)
			{
				if (log.IsWarnEnabled)
					log.Warn("SendPlayerCreate: playerZone == null");
				return;
			}

			if (m_gameClient.Player == null || playerToCreate.IsVisibleTo(m_gameClient.Player) == false)
				return;

			using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.PlayerCreate172)))
			{
				pak.WriteShort((ushort)playerToCreate.Client.SessionID);
				pak.WriteShort((ushort)playerToCreate.ObjectID);
				pak.WriteShort(playerToCreate.Model);
				pak.WriteShort((ushort)playerToCreate.Z);
	            //Dinberg:Instances - as with all objects, we need to use a zoneSkinID for clientside positioning.
				pak.WriteShort(playerZone.ZoneSkinID);
				pak.WriteShort((ushort)playerRegion.GetXOffInZone(playerToCreate.X, playerToCreate.Y));
				pak.WriteShort((ushort)playerRegion.GetYOffInZone(playerToCreate.X, playerToCreate.Y));
				pak.WriteShort(playerToCreate.Heading);
	
				pak.WriteByte(playerToCreate.GetFaceAttribute(eCharFacePart.EyeSize)); //1-4 = Eye Size / 5-8 = Nose Size
				pak.WriteByte(playerToCreate.GetFaceAttribute(eCharFacePart.LipSize)); //1-4 = Ear size / 5-8 = Kin size
				pak.WriteByte(playerToCreate.GetFaceAttribute(eCharFacePart.MoodType)); //1-4 = Ear size / 5-8 = Kin size
				pak.WriteByte(playerToCreate.GetFaceAttribute(eCharFacePart.EyeColor)); //1-4 = Skin Color / 5-8 = Eye Color
				pak.WriteByte(playerToCreate.GetDisplayLevel(m_gameClient.Player));
				pak.WriteByte(playerToCreate.GetFaceAttribute(eCharFacePart.HairColor)); //Hair: 1-4 = Color / 5-8 = unknown
				pak.WriteByte(playerToCreate.GetFaceAttribute(eCharFacePart.FaceType)); //1-4 = Unknown / 5-8 = Face type
				pak.WriteByte(playerToCreate.GetFaceAttribute(eCharFacePart.HairStyle)); //1-4 = Unknown / 5-8 = Hair Style
	
				int flags = (GameServer.ServerRules.GetLivingRealm(m_gameClient.Player, playerToCreate) & 0x03) << 2;
				if (playerToCreate.IsAlive == false) flags |= 0x01;
				if (playerToCreate.IsUnderwater) flags |= 0x02; //swimming
				if (playerToCreate.IsStealthed)  flags |= 0x10;
				if (playerToCreate.IsWireframe) flags |= 0x20;
				if (playerToCreate.CharacterClass.ID == (int)eCharacterClass.Vampiir) flags |= 0x40; //Vamp fly
				pak.WriteByte((byte)flags);
				pak.WriteByte(0x00); // new in 1.74
	
				pak.WritePascalString(GameServer.ServerRules.GetPlayerName(m_gameClient.Player, playerToCreate));
				pak.WritePascalString(GameServer.ServerRules.GetPlayerGuildName(m_gameClient.Player, playerToCreate));
				pak.WritePascalString(GameServer.ServerRules.GetPlayerLastName(m_gameClient.Player, playerToCreate));
	            //RR 12 / 13
	            pak.WritePascalString(GameServer.ServerRules.GetPlayerPrefixName(m_gameClient.Player, playerToCreate));
	            pak.WritePascalString(GameServer.ServerRules.GetPlayerTitle(m_gameClient.Player, playerToCreate)); // new in 1.74, NewTitle
				pak.WriteByte(0x00); // new in 1.75
				SendTCP(pak);
			}
			
			// Update Cache
			m_gameClient.GameObjectUpdateArray[new Tuple<ushort, ushort>(playerToCreate.CurrentRegionID, (ushort)playerToCreate.ObjectID)] = GameTimer.GetTickCount();
			
			SendObjectGuildID(playerToCreate, playerToCreate.Guild); //used for nearest friendly/enemy object buttons and name colors on PvP server
		}
Example #59
0
		public override void SendCharResistsUpdate()
		{
			if (m_gameClient.Player == null)
				return;

			eResist[] updateResists =
			{
				eResist.Crush,
				eResist.Slash,
				eResist.Thrust,
				eResist.Heat,
				eResist.Cold,
				eResist.Matter,
				eResist.Body,
				eResist.Spirit,
				eResist.Energy,
			};

			int[] racial = new int[updateResists.Length];
			int[] caps = new int[updateResists.Length];

			int cap = (m_gameClient.Player.Level>>1) + 1;
			for (int i = 0; i < updateResists.Length; i++)
			{
				caps[i] = cap;
			}


			using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.StatsUpdate)))
			{

				// racial resists
				for (int i = 0; i < updateResists.Length; i++)
				{
					racial[i] = SkillBase.GetRaceResist(m_gameClient.Player.Race, updateResists[i]);
					pak.WriteShort((ushort)racial[i]);
				}
	
				// buffs/debuffs only; remove base, item bonus, RA bonus, race bonus
				for (int i = 0; i < updateResists.Length; i++)
				{
					int mod = m_gameClient.Player.GetModified((eProperty)updateResists[i]);
					int buff = mod - racial[i] - m_gameClient.Player.AbilityBonus[(int)updateResists[i]] - Math.Min(caps[i], m_gameClient.Player.ItemBonus[(int)updateResists[i]]);
					pak.WriteShort((ushort)buff);
				}
	
				// item bonuses
				for (int i = 0; i < updateResists.Length; i++)
				{
					pak.WriteShort((ushort)(m_gameClient.Player.ItemBonus[(int)updateResists[i]]));
				}
	
				// item caps
				for (int i = 0; i < updateResists.Length; i++)
				{
					pak.WriteByte((byte)caps[i]);
				}
	
				// RA bonuses
				for (int i = 0; i < updateResists.Length; i++)
				{
					pak.WriteByte((byte)(m_gameClient.Player.AbilityBonus[(int)updateResists[i]]));
				}
	
				pak.WriteByte(0xFF); // FF if resists packet
				pak.WriteByte(0);
				pak.WriteShort(0);
				pak.WriteShort(0);
	
				SendTCP(pak);
			}
		}
Example #60
0
		public override void SendCharStatsUpdate()
		{
			if (m_gameClient.Player == null)
				return;

			eStat[] updateStats =
			{
				eStat.STR,
				eStat.DEX,
				eStat.CON,
				eStat.QUI,
				eStat.INT,
				eStat.PIE,
				eStat.EMP,
				eStat.CHR,
			};

			int[] baseStats = new int[updateStats.Length];
			int[] modStats = new int[updateStats.Length];
			int[] itemCaps = new int[updateStats.Length];

			int itemCap = (int)(m_gameClient.Player.Level * 1.5);
			int bonusCap = (int)(m_gameClient.Player.Level/2 + 1);
			for (int i = 0; i < updateStats.Length; i++)
			{
				int cap = itemCap;
				switch ((eProperty)updateStats[i])
				{
					case eProperty.Strength:
						cap += m_gameClient.Player.ItemBonus[(int)eProperty.StrCapBonus];
						break;
					case eProperty.Dexterity:
						cap += m_gameClient.Player.ItemBonus[(int)eProperty.DexCapBonus];
						break;
					case eProperty.Constitution:
						cap += m_gameClient.Player.ItemBonus[(int)eProperty.ConCapBonus];
						break;
					case eProperty.Quickness:
						cap += m_gameClient.Player.ItemBonus[(int)eProperty.QuiCapBonus];
						break;
					case eProperty.Intelligence:
						cap += m_gameClient.Player.ItemBonus[(int)eProperty.IntCapBonus];
						break;
					case eProperty.Piety:
						cap += m_gameClient.Player.ItemBonus[(int)eProperty.PieCapBonus];
						break;
					case eProperty.Charisma:
						cap += m_gameClient.Player.ItemBonus[(int)eProperty.ChaCapBonus];
						break;
					case eProperty.Empathy:
						cap += m_gameClient.Player.ItemBonus[(int)eProperty.EmpCapBonus];
						break;
					default: break;
				}

				if( updateStats[i] == m_gameClient.Player.CharacterClass.ManaStat )
					cap += m_gameClient.Player.ItemBonus[(int)eProperty.AcuCapBonus];

    			itemCaps[i] = Math.Min(cap, itemCap + bonusCap);
			}


			using (GSTCPPacketOut pak = new GSTCPPacketOut(GetPacketCode(eServerPackets.StatsUpdate)))
			{
	
				// base
				for (int i = 0; i < updateStats.Length; i++)
				{
					baseStats[i] = m_gameClient.Player.GetBaseStat(updateStats[i]);
					
					if (updateStats[i] == eStat.CON)
						baseStats[i] -= m_gameClient.Player.TotalConstitutionLostAtDeath;
					
					pak.WriteShort((ushort)baseStats[i]);
				}
	
				pak.WriteShort(0);
	
				// buffs/debuffs only; remove base, item bonus, RA bonus, class bonus
				for (int i = 0; i < updateStats.Length; i++)
				{
					modStats[i] = m_gameClient.Player.GetModified((eProperty)updateStats[i]);
	
					int abilityBonus = m_gameClient.Player.AbilityBonus[(int)updateStats[i]];
	
					int acuityItemBonus = 0;
					if ( updateStats[i] ==  m_gameClient.Player.CharacterClass.ManaStat )
					{
						if (m_gameClient.Player.CharacterClass.ID != (int)eCharacterClass.Scout && m_gameClient.Player.CharacterClass.ID != (int)eCharacterClass.Hunter && m_gameClient.Player.CharacterClass.ID != (int)eCharacterClass.Ranger)
						{
							abilityBonus += m_gameClient.Player.AbilityBonus[(int)eProperty.Acuity];
	
							if (m_gameClient.Player.CharacterClass.ClassType != eClassType.PureTank)
								acuityItemBonus = m_gameClient.Player.ItemBonus[(int)eProperty.Acuity];
						}
					}
	
					int buff = modStats[i] - baseStats[i];
					buff -= abilityBonus;
					buff -= Math.Min( itemCaps[i], m_gameClient.Player.ItemBonus[(int)updateStats[i]] + acuityItemBonus );
	
					pak.WriteShort((ushort)buff);
				}
	
				pak.WriteShort(0);
	
				// item bonuses
				for (int i = 0; i < updateStats.Length; i++)
				{
					int acuityItemBonus = 0;
	
					if( updateStats[i] == m_gameClient.Player.CharacterClass.ManaStat )
					{
						if (m_gameClient.Player.CharacterClass.ID != (int)eCharacterClass.Scout && m_gameClient.Player.CharacterClass.ID != (int)eCharacterClass.Hunter && m_gameClient.Player.CharacterClass.ID != (int)eCharacterClass.Ranger)
						{
	
							if (m_gameClient.Player.CharacterClass.ClassType != eClassType.PureTank)
								acuityItemBonus = m_gameClient.Player.ItemBonus[(int)eProperty.Acuity];
						}
					}
	
					pak.WriteShort( (ushort)(m_gameClient.Player.ItemBonus[(int)updateStats[i]] + acuityItemBonus) );
				}
	
				pak.WriteShort(0);
	
				// item caps
				for (int i = 0; i < updateStats.Length; i++)
				{
					pak.WriteByte((byte)itemCaps[i]);
				}
	
				pak.WriteByte(0);
	
				// RA bonuses
				for (int i = 0; i < updateStats.Length; i++)
				{
					int acuityItemBonus = 0;
					if (m_gameClient.Player.CharacterClass.ClassType != eClassType.PureTank && (int)updateStats[i] == (int)m_gameClient.Player.CharacterClass.ManaStat)
					{
						if (m_gameClient.Player.CharacterClass.ID != (int)eCharacterClass.Scout && m_gameClient.Player.CharacterClass.ID != (int)eCharacterClass.Hunter && m_gameClient.Player.CharacterClass.ID != (int)eCharacterClass.Ranger)
						{
							acuityItemBonus = m_gameClient.Player.AbilityBonus[(int)eProperty.Acuity];
						}
					}
					pak.WriteByte((byte)(m_gameClient.Player.AbilityBonus[(int)updateStats[i]] + acuityItemBonus));
				}
	
				pak.WriteByte(0);
	
				//Why don't we and mythic use this class bonus byte?
				//pak.Fill(0, 9);
				//if (m_gameClient.Player.CharacterClass.ID == (int)eCharacterClass.Vampiir)
				//	pak.WriteByte((byte)(m_gameClient.Player.Level - 5)); // Vampire bonuses
				//else
				pak.WriteByte(0x00); // FF if resists packet
				pak.WriteByte((byte) m_gameClient.Player.TotalConstitutionLostAtDeath);
				pak.WriteShort((ushort) m_gameClient.Player.MaxHealth);
				pak.WriteShort(0);
	
				SendTCP(pak);
			}
		}