public Mount(Player owner, uint spell4Id, uint creatureId, uint vehicleId, uint itemDisplayId) : base(EntityType.Mount, creatureId, vehicleId, spell4Id) { OwnerGuid = owner.Guid; MountType = vehicleId == 411 ? PetType.HoverBoard : PetType.GroundMount; PilotDisplayInfo = GameTableManager.Instance.ItemDisplay.GetEntry(itemDisplayId); Rotation = owner.Rotation; Position = owner.Position; Creature2DisplayGroupEntryEntry displayGroupEntry = GameTableManager.Instance.Creature2DisplayGroupEntry.Entries .SingleOrDefault(x => x.Creature2DisplayGroupId == CreatureEntry.Creature2DisplayGroupId); DisplayInfo = displayGroupEntry?.Creature2DisplayInfoId ?? 0u; CreateFlags |= EntityCreateFlag.SpawnAnimation; }
/// <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); }