/// <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); }
public static void HandleCostumeSave(WorldSession session, ClientCostumeSave costumeSave) { session.Player.CostumeManager.SaveCostume(costumeSave); }