public SpellInfo(SpellBaseInfo spellBaseBaseInfo, Spell4Entry spell4Entry) { Entry = spell4Entry; BaseInfo = spellBaseBaseInfo; AoeTargetConstraints = GameTableManager.Spell4AoeTargetConstraints.GetEntry(spell4Entry.Spell4AoeTargetConstraintsId); CasterConditions = GameTableManager.Spell4Conditions.GetEntry(spell4Entry.Spell4ConditionsIdCaster); TargetConditions = GameTableManager.Spell4Conditions.GetEntry(spell4Entry.Spell4ConditionsIdTarget); CasterCCConditions = GameTableManager.Spell4CCConditions.GetEntry(spell4Entry.Spell4CCConditionsIdCaster); TargetCCConditions = GameTableManager.Spell4CCConditions.GetEntry(spell4Entry.Spell4CCConditionsIdTarget); GlobalCooldown = GameTableManager.SpellCoolDown.GetEntry(spell4Entry.SpellCoolDownIdGlobal); StackGroup = GameTableManager.Spell4StackGroup.GetEntry(spell4Entry.Spell4StackGroupId); CasterCastPrerequisites = GameTableManager.Prerequisite.GetEntry(spell4Entry.PrerequisiteIdCasterCast); TargetCastPrerequisites = GameTableManager.Prerequisite.GetEntry(spell4Entry.PrerequisiteIdTargetCast); CasterPersistencePrerequisites = GameTableManager.Prerequisite.GetEntry(spell4Entry.PrerequisiteIdCasterPersistence); TargetPersistencePrerequisites = GameTableManager.Prerequisite.GetEntry(spell4Entry.PrerequisiteIdTargetPersistence); Telegraphs = GameTableManager.Spell4Telegraph.Entries .Where(e => e.Spell4Id == Entry.Id) .Select(e => GameTableManager.TelegraphDamage.GetEntry(e.TelegraphDamageId)) .ToList(); Effects = GameTableManager.Spell4Effects.Entries .Where(e => e.SpellId == spell4Entry.Id) .OrderBy(e => e.OrderIndex) .ToList(); }
protected Vehicle(EntityType type, uint creatureId, uint vehicleId, uint spell4Id) : base(type) { CreatureEntry = GameTableManager.Creature2.GetEntry(creatureId); VehicleEntry = GameTableManager.UnitVehicle.GetEntry(vehicleId != 0u ? vehicleId : CreatureEntry.UnitVehicleId); SpellEntry = GameTableManager.Spell4.GetEntry(spell4Id); // temp SetProperty(Property.BaseHealth, 800.0f, 800.0f); Stats.Add(Stat.Health, new StatValue(Stat.Health, 800)); Stats.Add(Stat.Level, new StatValue(Stat.Level, 3)); Stats.Add((Stat)15, new StatValue((Stat)15, 0)); }
protected Vehicle(EntityType type, uint creatureId, uint vehicleId, uint spell4Id) : base(type) { CreatureEntry = GameTableManager.Instance.Creature2.GetEntry(creatureId); VehicleEntry = GameTableManager.Instance.UnitVehicle.GetEntry(vehicleId != 0u ? vehicleId : CreatureEntry.UnitVehicleId); SpellEntry = GameTableManager.Instance.Spell4.GetEntry(spell4Id); // temp SetProperty(Property.BaseHealth, 800.0f, 800.0f); SetStat(Stat.Health, 800u); SetStat(Stat.Level, 3u); SetStat(Stat.Sheathed, 800u); }
private void HandleEffectUnlockVanityPet(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { if (!(target is Player player)) { return; } Spell4Entry spell4Entry = GameTableManager.Instance.Spell4.GetEntry(info.Entry.DataBits00); player.SpellManager.AddSpell(spell4Entry.Spell4BaseIdBaseSpell); player.Session.EnqueueMessageEncrypted(new ServerUnlockMount { Spell4Id = info.Entry.DataBits00 }); }
/// <summary> /// Cast a <see cref="Spell"/> with the supplied spell id and <see cref="SpellParameters"/>. /// </summary> public void CastSpell(uint spell4Id, SpellParameters parameters) { if (parameters == null) { throw new ArgumentNullException(); } Spell4Entry spell4Entry = GameTableManager.Instance.Spell4.GetEntry(spell4Id); if (spell4Entry == null) { throw new ArgumentOutOfRangeException(); } CastSpell(spell4Entry.Spell4BaseIdBaseSpell, (byte)spell4Entry.TierIndex, parameters); }
public SpellInfo(SpellBaseInfo spellBaseBaseInfo, Spell4Entry spell4Entry) { Entry = spell4Entry; BaseInfo = spellBaseBaseInfo; AoeTargetConstraints = GameTableManager.Instance.Spell4AoeTargetConstraints.GetEntry(spell4Entry.Spell4AoeTargetConstraintsId); CasterConditions = GameTableManager.Instance.Spell4Conditions.GetEntry(spell4Entry.Spell4ConditionsIdCaster); TargetConditions = GameTableManager.Instance.Spell4Conditions.GetEntry(spell4Entry.Spell4ConditionsIdTarget); CasterCCConditions = GameTableManager.Instance.Spell4CCConditions.GetEntry(spell4Entry.Spell4CCConditionsIdCaster); TargetCCConditions = GameTableManager.Instance.Spell4CCConditions.GetEntry(spell4Entry.Spell4CCConditionsIdTarget); GlobalCooldown = GameTableManager.Instance.SpellCoolDown.GetEntry(spell4Entry.SpellCoolDownIdGlobal); StackGroup = GameTableManager.Instance.Spell4StackGroup.GetEntry(spell4Entry.Spell4StackGroupId); CasterCastPrerequisites = GameTableManager.Instance.Prerequisite.GetEntry(spell4Entry.PrerequisiteIdCasterCast); TargetCastPrerequisites = GameTableManager.Instance.Prerequisite.GetEntry(spell4Entry.PrerequisiteIdTargetCast); CasterPersistencePrerequisites = GameTableManager.Instance.Prerequisite.GetEntry(spell4Entry.PrerequisiteIdCasterPersistence); TargetPersistencePrerequisites = GameTableManager.Instance.Prerequisite.GetEntry(spell4Entry.PrerequisiteIdTargetPersistence); Telegraphs = GlobalSpellManager.Instance.GetTelegraphDamageEntries(spell4Entry.Id).ToList(); Effects = GlobalSpellManager.Instance.GetSpell4EffectEntries(spell4Entry.Id).ToList(); }
/// <summary> /// Grant the <see cref="Player"/> rewards from the <see cref="PathRewardEntry"/> /// </summary> /// <param name="pathRewardEntry">The entry containing items, spells, or titles, to be rewarded"/></param> private void GrantPathReward(PathRewardEntry pathRewardEntry) { if (pathRewardEntry == null) { throw new ArgumentNullException(); } // TODO: Check if there's bag space. Otherwise queue? Or is there an overflow inventory? if (pathRewardEntry.Item2Id > 0) { player.Inventory.ItemCreate(pathRewardEntry.Item2Id, 1, ItemUpdateReason.PathReward); } if (pathRewardEntry.Spell4Id > 0) { Spell4Entry spell4Entry = GameTableManager.Spell4.GetEntry(pathRewardEntry.Spell4Id); player.SpellManager.AddSpell(spell4Entry.Spell4BaseIdBaseSpell); } if (pathRewardEntry.CharacterTitleId > 0) { player.TitleManager.AddTitle((ushort)pathRewardEntry.CharacterTitleId); } }
public static void HandleCharacterCreate(WorldSession session, ClientCharacterCreate characterCreate) { try { // TODO: validate name and path if (DatabaseManager.Instance.CharacterDatabase.CharacterNameExists(characterCreate.Name)) { session.EnqueueMessageEncrypted(new ServerCharacterCreate { Result = CharacterModifyResult.CreateFailed_UniqueName }); return; } CharacterCreationEntry creationEntry = GameTableManager.Instance.CharacterCreation.GetEntry(characterCreate.CharacterCreationId); if (creationEntry == null) { throw new InvalidPacketValueException(); } if (creationEntry.EntitlementIdRequired != 0u) { // TODO: Aurin engineer has this } var character = new CharacterModel { AccountId = session.Account.Id, Id = AssetManager.Instance.NextCharacterId, Name = characterCreate.Name, Race = (byte)creationEntry.RaceId, Sex = (byte)creationEntry.Sex, Class = (byte)creationEntry.ClassId, FactionId = (ushort)creationEntry.FactionId, ActivePath = characterCreate.Path }; for (Path path = Path.Soldier; path <= Path.Explorer; path++) { character.Path.Add(new CharacterPathModel { Path = (byte)path, Unlocked = Convert.ToByte(characterCreate.Path == (byte)path) }); } // merge seperate label and value lists into a single dictonary Dictionary <uint, uint> customisations = characterCreate.Labels .Zip(characterCreate.Values, (l, v) => new { l, v }) .ToDictionary(p => p.l, p => p.v); foreach ((uint label, uint value) in customisations) { character.Customisation.Add(new CharacterCustomisationModel { Label = label, Value = value }); CharacterCustomizationEntry entry = GetCharacterCustomisation(customisations, creationEntry.RaceId, creationEntry.Sex, label, value); if (entry == null) { continue; } character.Appearance.Add(new CharacterAppearanceModel { Slot = (byte)entry.ItemSlotId, DisplayId = (ushort)entry.ItemDisplayId }); } for (int i = 0; i < characterCreate.Bones.Count; ++i) { character.Bone.Add(new CharacterBoneModel { BoneIndex = (byte)(i), Bone = characterCreate.Bones[i] }); } //TODO: handle starting locations per race character.LocationX = -7683.809f; character.LocationY = -942.5914f; character.LocationZ = -666.6343f; character.WorldId = 870; character.ActiveSpec = 0; // create initial LAS abilities UILocation location = 0; foreach (SpellLevelEntry spellLevelEntry in GameTableManager.Instance.SpellLevel.Entries .Where(s => s.ClassId == character.Class && s.CharacterLevel == 1)) { Spell4Entry spell4Entry = GameTableManager.Instance.Spell4.GetEntry(spellLevelEntry.Spell4Id); if (spell4Entry == null) { continue; } character.Spell.Add(new CharacterSpellModel { Id = character.Id, Spell4BaseId = spell4Entry.Spell4BaseIdBaseSpell, Tier = 1 }); character.ActionSetShortcut.Add(new CharacterActionSetShortcutModel { Id = character.Id, SpecIndex = 0, Location = (ushort)location, ShortcutType = (byte)ShortcutType.Spell, ObjectId = spell4Entry.Spell4BaseIdBaseSpell, Tier = 1 }); location++; } // create a temporary inventory to create starting gear var inventory = new Inventory(character.Id, creationEntry); IEnumerable <Item> items = inventory .SelectMany(b => b) .Select(i => i); //TODO: handle starting stats per class/race character.Stat.Add(new CharacterStatModel { Id = character.Id, Stat = (byte)Stat.Health, Value = 800 }); character.Stat.Add(new CharacterStatModel { Id = character.Id, Stat = (byte)Stat.Shield, Value = 450 }); character.Stat.Add(new CharacterStatModel { Id = character.Id, Stat = (byte)Stat.Dash, Value = 200 }); character.Stat.Add(new CharacterStatModel { Id = character.Id, Stat = (byte)Stat.Level, Value = 1 }); character.Stat.Add(new CharacterStatModel { Id = character.Id, Stat = (byte)Stat.StandState, Value = 3 }); // TODO: actually error check this session.EnqueueEvent(new TaskEvent(DatabaseManager.Instance.CharacterDatabase.Save(c => { c.Character.Add(character); foreach (Item item in items) { item.Save(c); } }), () => { session.Characters.Add(character); session.EnqueueMessageEncrypted(new ServerCharacterCreate { CharacterId = character.Id, WorldId = character.WorldId, Result = CharacterModifyResult.CreateOk }); })); } catch { session.EnqueueMessageEncrypted(new ServerCharacterCreate { Result = CharacterModifyResult.CreateFailed }); throw; } CharacterCustomizationEntry GetCharacterCustomisation(Dictionary <uint, uint> customisations, uint race, uint sex, uint primaryLabel, uint primaryValue) { ImmutableList <CharacterCustomizationEntry> entries = AssetManager.Instance.GetPrimaryCharacterCustomisation(race, sex, primaryLabel, primaryValue); if (entries == null) { return(null); } if (entries.Count == 1) { return(entries[0]); } // customisation has multiple results, filter with secondary label and value uint secondaryLabel = entries.First(e => e.CharacterCustomizationLabelId01 != 0).CharacterCustomizationLabelId01; uint secondaryValue = customisations[secondaryLabel]; CharacterCustomizationEntry entry = entries.SingleOrDefault(e => e.CharacterCustomizationLabelId01 == secondaryLabel && e.Value01 == secondaryValue); return(entry ?? entries.Single(e => e.CharacterCustomizationLabelId01 == 0 && e.Value01 == 0)); } }
public static void HandlePlayerCastSpell(WorldSession session, ClientCastSpell castSpell) { // the code in the function is temporary and just for a bit of fun, it will be replaced when the underlying spell system is implemented Item item = session.Player.Inventory.GetItem(InventoryLocation.Ability, castSpell.BagIndex); if (item == null) { throw new InvalidPacketValueException(); } UnlockedSpell spell = session.Player.SpellManager.GetSpell(item.Id); if (spell == null) { throw new InvalidPacketValueException(); } // true is probably "begin casting" if (!castSpell.Unknown48) { return; } uint castingId = GlobalSpellManager.NextCastingId; Spell4Entry spell4Entry = GameTableManager.Spell4.Entries .SingleOrDefault(x => x.Spell4BaseIdBaseSpell == spell.Entry.Id && x.TierIndex == spell.Tier); session.Player.EnqueueToVisible(new ServerSpellStart { CastingId = castingId, CasterId = session.Player.Guid, PrimaryTargetId = session.Player.Guid, Spell4Id = spell4Entry.Id, RootSpell4Id = spell4Entry.Id, ParentSpell4Id = 0, FieldPosition = new Position(session.Player.Position), UserInitiatedSpellCast = true }, true); var targetInfo = new ServerSpellGo.TargetInfo { UnitId = session.Player.Guid, // FIXME: insert target TargetFlags = 1, InstanceCount = 1, CombatResult = 2 }; foreach (Spell4EffectsEntry spell4EffectEntry in GameTableManager.Spell4Effects.Entries .Where(x => x.SpellId == spell4Entry.Id)) { targetInfo.EffectInfoData.Add(new ServerSpellGo.TargetInfo.EffectInfo { Spell4EffectId = spell4EffectEntry.Id, EffectUniqueId = 4722, TimeRemaining = -1 }); } session.Player.EnqueueToVisible(new ServerSpellGo { ServerUniqueId = castingId, PrimaryDestination = new Position(session.Player.Position), Phase = 255, TargetInfoData = new List <ServerSpellGo.TargetInfo> { targetInfo } }, true); }