Beispiel #1
0
 public static void BuyItem(ZoneClient client, Packet packet)
 {
     ZoneCharacter character = client.Character;
     ushort buyItemID;
     int amount;
     if (packet.TryReadUShort(out buyItemID) && packet.TryReadInt(out amount))
     {
         FiestaLib.Data.ItemInfo buyItem;
         Data.DataProvider.Instance.ItemsByID.TryGetValue(buyItemID, out buyItem);
         if (amount < 255)
         {
             if (character.GiveItem(buyItemID, (byte)amount) != InventoryStatus.Full)
             {
                 character.Inventory.Money -= amount * buyItem.BuyPrice;
                 character.ChangeMoney(character.Inventory.Money);
             }
         }
         else
         {
             while (amount > 0)
             {
                 if (character.GiveItem(buyItemID, 255) != InventoryStatus.Full)
                 {
                     character.Inventory.Money -= amount * buyItem.BuyPrice;
                     character.ChangeMoney(character.Inventory.Money);
                     character.CalculateMasterCopper(buyItem.BuyPrice);
                 }
                 if (amount < 255)
                 {
                     if (character.GiveItem(buyItemID, (byte)amount) != InventoryStatus.Full)
                     {
                         character.Inventory.Money -= amount * buyItem.BuyPrice;
                         character.ChangeMoney(character.Inventory.Money);
                         character.CalculateMasterCopper(buyItem.BuyPrice);
                     }
                     break;
                 }
                 amount -= 255;
             }
         }
     }
 }
Beispiel #2
0
        public static void On_GameClient_GuildNameRequest(WorldClient Client, Packet Packet)
        {
            int guildID;
            if (!Packet.TryReadInt(out guildID))
            {
                return;
            }

            Guild guild;
            if (GetGuildByID(guildID, out guild))
            {
                using (var packet = new Packet(SH29Type.GuildNameResult))
                {
                    packet.WriteInt(guildID);
                    packet.WriteString(guild.Name, 16);

                    Client.SendPacket(packet);
                }
            }
        }
Beispiel #3
0
        public static void SellItem(ZoneClient client, Packet packet)
        {
            byte slot;
            int sellcount;
            ZoneCharacter character = client.Character;
            if (packet.TryReadByte(out slot) && packet.TryReadInt(out sellcount))
            {

                Item item;
                character.Inventory.InventoryItems.TryGetValue(slot, out item);
                if (item != null)
                {

                    long fullSellPrice = sellcount * item.ItemInfo.SellPrice;
                    if (item.Ammount > 1)
                    {
                        item.Ammount -= (ushort)sellcount;
                        byte Slot = (byte)item.Slot;
                        Handler12.ModifyInventorySlot(character, 0x24, Slot, Slot, item);
                        character.Inventory.Money += fullSellPrice;
                        character.ChangeMoney(character.Inventory.Money);
                    }
                    else
                    {
                        character.Inventory.Money += fullSellPrice;
                        character.ChangeMoney(character.Inventory.Money);
                        character.Inventory.InventoryItems.Remove(slot);
                        ResetInventorySlot(character, slot);
                    }
                    System.Console.WriteLine(item.ItemInfo.Type);
                }
            }
        }
Beispiel #4
0
        private static void HandleMovement(ZoneCharacter character, Packet packet, bool run, bool stop = false)
        {
            if (character.State == PlayerState.Dead || character.State == PlayerState.Resting || character.State == PlayerState.Vendor)
            {
                character.CheatTracker.AddCheat(CheatTypes.InvalidMove, 50);
                return;
            }

            int newX, oldX, newY, oldY;
            if (!stop)
            {
                if (!packet.TryReadInt(out oldX) || !packet.TryReadInt(out oldY) ||
                    !packet.TryReadInt(out newX) || !packet.TryReadInt(out newY))
                {
                    Log.WriteLine(LogLevel.Warn, "Invalid movement packet detected.");
                    return;
                }
            }
            else
            {
                if (!packet.TryReadInt(out newX) || !packet.TryReadInt(out newY))
                {
                    Log.WriteLine(LogLevel.Warn, "Invalid stop packet detected.");
                    return;
                }
                oldX = character.Position.X;
                oldY = character.Position.Y;
            }

            if (character.Map.Block != null)
            {
                if (!character.Map.Block.CanWalk(newX, newY))
                {
                    Log.WriteLine(LogLevel.Debug, "Blocking walk at {0}:{1}.", newX, newY);
                    SendPositionBlock(character, newX, newY);
                    SendTeleportCharacter(character, oldX, oldY);
                    return;
                }

            }

            double distance = Vector2.Distance(newX, oldX, newY, oldY);
            if ((run && distance > 500d) || (!run && distance > 400d)) //TODO: mounts don't check with these speeds
            {
                character.CheatTracker.AddCheat(CheatTypes.Speedwalk, 50);
                return;
            }

            if (!stop)
            {
                int deltaY = newY - character.Position.Y;
                int deltaX = newX - character.Position.X;
                double radians = Math.Atan((double)deltaY / deltaX);
                double angle = radians * (180 / Math.PI);
                character.Rotation = (byte)(angle / 2);
            }
            foreach (var member in character.Party)
            {
                if (member.Key != character.Name)
                {
                    using (var ppacket = new Packet(SH14Type.UpdatePartyMemberLoc))
                    {
                        ppacket.WriteByte(1);//unk
                        ppacket.WriteString(character.Name, 16);
                        ppacket.WriteInt(character.Position.X);
                        ppacket.WriteInt(character.Position.Y);
                        member.Value.SendPacket(ppacket);
                    }
                }

            }
            character.Move(oldX, oldY, newX, newY, !run, stop); // hehe
        }