Пример #1
0
        /// <summary>
        /// Validate then save or update <see cref="Costume"/> from <see cref="ClientCostumeSave"/> packet.
        /// </summary>
        public void SaveCostume(ClientCostumeSave costumeSave)
        {
            // TODO: used for housing mannequins
            if (costumeSave.MannequinIndex != 0)
            {
                throw new NotImplementedException();
            }

            if (costumeSave.Index < 0 || costumeSave.Index >= MaxCostumes)
            {
                SendCostumeSaveResult(CostumeSaveResult.InvalidCostumeIndex);
                return;
            }

            if (costumeSave.Index >= CostumeCap)
            {
                SendCostumeSaveResult(CostumeSaveResult.CostumeIndexNotUnlocked);
                return;
            }

            foreach (ClientCostumeSave.CostumeItem costumeItem in costumeSave.Items)
            {
                if (costumeItem.ItemId == 0)
                {
                    continue;
                }

                Item2Entry itemEntry = GameTableManager.Item.GetEntry(costumeItem.ItemId);
                if (itemEntry == null)
                {
                    SendCostumeSaveResult(CostumeSaveResult.InvalidItem);
                    return;
                }

                // TODO: check item family

                /*if ()
                 * {
                 *  SendCostumeSaveResult(CostumeSaveResult.UnusableItem);
                 *  return;
                 * }*/

                if (!costumeUnlocks.ContainsKey(costumeItem.ItemId))
                {
                    SendCostumeSaveResult(CostumeSaveResult.ItemNotUnlocked);
                    return;
                }

                ItemDisplayEntry itemDisplayEntry = GameTableManager.ItemDisplay.GetEntry(Item.GetDisplayId(itemEntry));
                for (int i = 0; i < costumeItem.Dyes.Length; i++)
                {
                    if (costumeItem.Dyes[i] == 0u)
                    {
                        continue;
                    }

                    if (itemDisplayEntry == null)
                    {
                        SendCostumeSaveResult(CostumeSaveResult.InvalidDye);
                        return;
                    }

                    uint dyeChannelFlag = 1u << i;
                    if ((itemDisplayEntry.DyeChannelFlags & dyeChannelFlag) == 0)
                    {
                        SendCostumeSaveResult(CostumeSaveResult.InvalidDye);
                        return;
                    }

                    if (!player.Session.GenericUnlockManager.IsDyeUnlocked(costumeItem.Dyes[i]))
                    {
                        SendCostumeSaveResult(CostumeSaveResult.DyeNotUnlocked);
                        return;
                    }
                }
            }

            // TODO: charge player

            if (costumes.TryGetValue((byte)costumeSave.Index, out Costume costume))
            {
                costume.Update(costumeSave);
            }
            else
            {
                costume = new Costume(player, costumeSave);
                costumes.Add(costume.Index, costume);
            }

            SetCostume((sbyte)costumeSave.Index, costume);

            SendCostume(costume);
            SendCostumeSaveResult(CostumeSaveResult.Saved, costumeSave.Index, costumeSave.MannequinIndex);
        }
Пример #2
0
 public static void HandleCostumeSave(WorldSession session, ClientCostumeSave costumeSave)
 {
     session.Player.CostumeManager.SaveCostume(costumeSave);
 }