private void HandleEffectRapidTransport(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { TaxiNodeEntry taxiNode = GameTableManager.Instance.TaxiNode.GetEntry(parameters.TaxiNode); if (taxiNode == null) { return; } WorldLocation2Entry worldLocation = GameTableManager.Instance.WorldLocation2.GetEntry(taxiNode.WorldLocation2Id); if (worldLocation == null) { return; } if (!(target is Player player)) { return; } var rotation = new Quaternion(worldLocation.Facing0, worldLocation.Facing0, worldLocation.Facing2, worldLocation.Facing3); player.Rotation = rotation.ToEulerDegrees(); player.TeleportTo((ushort)worldLocation.WorldId, worldLocation.Position0, worldLocation.Position1, worldLocation.Position2); }
private void HandleEffectSummonVanityPet(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { if (!(target is Player player)) { return; } // enqueue removal of existing vanity pet if summoned if (player.VanityPetGuid != null) { VanityPet oldVanityPet = player.GetVisible <VanityPet>(player.VanityPetGuid.Value); oldVanityPet?.RemoveFromMap(); player.VanityPetGuid = 0u; } var vanityPet = new VanityPet(player, info.Entry.DataBits00); var position = new MapPosition { Position = player.Position }; if (player.Map.CanEnter(vanityPet, position)) { player.Map.EnqueueAdd(vanityPet, position); } }
private void HandleEffectSummonMount(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { // TODO: handle NPC mounting? if (!(target is Player player)) { return; } if (player.VehicleGuid != 0u) { return; } var mount = new Mount(player, parameters.SpellInfo.Entry.Id, info.Entry.DataBits00, info.Entry.DataBits01, info.Entry.DataBits04); mount.EnqueuePassengerAdd(player, VehicleSeatType.Pilot, 0); // usually for hover boards /*if (info.Entry.DataBits04 > 0u) * { * mount.SetAppearance(new ItemVisual * { * Slot = ItemSlot.Mount, * DisplayId = (ushort)info.Entry.DataBits04 * }); * }*/ player.Map.EnqueueAdd(mount, player.Position); // FIXME: also cast 52539,Riding License - Riding Skill 1 - SWC - Tier 1,34464 // FIXME: also cast 80530,Mount Sprint - Tier 2,36122 }
private void ExecuteEffects() { foreach (Spell4EffectsEntry spell4EffectsEntry in parameters.SpellInfo.Effects) { // select targets for effect List <SpellTargetInfo> effectTargets = targets .Where(t => (t.Flags & (SpellEffectTargetFlags)spell4EffectsEntry.TargetFlags) != 0) .ToList(); SpellEffectDelegate handler = GlobalSpellManager.Instance.GetEffectHandler((SpellEffectType)spell4EffectsEntry.EffectType); if (handler == null) { log.Warn($"Unhandled spell effect {(SpellEffectType)spell4EffectsEntry.EffectType}"); } else { uint effectId = GlobalSpellManager.Instance.NextEffectId; foreach (SpellTargetInfo effectTarget in effectTargets) { var info = new SpellTargetInfo.SpellTargetEffectInfo(effectId, spell4EffectsEntry); effectTarget.Effects.Add(info); // TODO: if there is an unhandled exception in the handler, there will be an infinite loop on Execute() handler.Invoke(this, effectTarget.Entity, info); } } } }
private void HandleEffectProxy(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { target.CastSpell(info.Entry.DataBits00, new SpellParameters { ParentSpellInfo = parameters.SpellInfo, RootSpellInfo = parameters.RootSpellInfo, UserInitiatedSpellCast = false }); }
private void HandleEffectUnlockPetFlair(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { if (!(target is Player player)) { return; } player.PetCustomisationManager.UnlockFlair((ushort)info.Entry.DataBits00); }
private void HandleEffectLearnDyeColor(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { if (!(target is Player player)) { return; } player.Session.GenericUnlockManager.Unlock((ushort)info.Entry.DataBits00); }
private void HandleEffectTitleGrant(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { if (!(target is Player player)) { return; } player.TitleManager.AddTitle((ushort)info.Entry.DataBits00); }
private void HandleEffectSummonVanityPet(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { if (!(target is Player player)) { return; } var vanityPet = new VanityPet(player, info.Entry.DataBits00); player.Map.EnqueueAdd(vanityPet, player.Position); }
private void HandleEffectTeleport(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { WorldLocation2Entry locationEntry = GameTableManager.Instance.WorldLocation2.GetEntry(info.Entry.DataBits00); if (locationEntry == null) { return; } if (target is Player player) { player.TeleportTo((ushort)locationEntry.WorldId, locationEntry.Position0, locationEntry.Position1, locationEntry.Position2); } }
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 }); }
private void HandleEffectDisguise(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { if (!(target is Player player)) { return; } Creature2Entry creature2 = GameTableManager.Instance.Creature2.GetEntry(info.Entry.DataBits02); if (creature2 == null) { return; } Creature2DisplayGroupEntryEntry displayGroupEntry = GameTableManager.Instance.Creature2DisplayGroupEntry.Entries.FirstOrDefault(d => d.Creature2DisplayGroupId == creature2.Creature2DisplayGroupId); if (displayGroupEntry == null) { return; } player.SetDisplayInfo(displayGroupEntry.Creature2DisplayInfoId); }
private void HandleEffectDamage(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { // TODO: calculate damage info.AddDamage((DamageType)info.Entry.DamageType, 1337); }
private void HandleEffectFluff(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { }
private void HandleFullScreenEffect(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { }
private void HandleFullScreenEffect(UnitEntity target, SpellTargetInfo.SpellTargetEffectInfo info) { // TODO/FIXME: Add duration into the queue so that the spell will automatically finish at the correct time. This is a workaround for Full Screen Effects. events.EnqueueEvent(new Event.SpellEvent(info.Entry.DurationTime / 1000d, () => { status = SpellStatus.Finished; SendSpellFinish(); })); }
private void HandleEffectSummonMount(UnitEntity tartet, SpellTargetInfo.SpellTargetEffectInfo info) { }