public void Execute(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time, int Value1, int Value2, int Value3, int Value4) { if (caster is Character character) { character.DisabledSetPosition = true; character.SendPacket( new SCLoadInstancePacket( 1, character.WorldPosition.ZoneId, character.WorldPosition.X, character.WorldPosition.Y, character.WorldPosition.Z, 0, 0, 0 ) ); character.InstanceId = 1; // TODO .... character.Position = character.WorldPosition.Clone(); character.WorldPosition = null; } }
public void Execute(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time, int Value1, int Value2, int Value3, int Value4) { var owner = (Character)caster; var skillData = (SkillItem)casterObj; var itemInfo = owner.Inventory.GetItem(skillData.ItemId); if (itemInfo == null || itemInfo.Count <= 0) { return; } var tasks = new List <ItemTask> { InventoryHelper.GetTaskAndRemoveItem(owner, itemInfo, 1) }; owner.BmPoint += Value1; owner.SendPacket(new SCBmPointPacket(owner.BmPoint)); owner.SendPacket(new SCItemTaskSuccessPacket(ItemTaskType.SkillReagents, tasks, new List <ulong>())); // TODO - LOYALT IS ACCOUNT WIDE }
public bool Check(Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, SkillObject skillObject) { var res = true; switch (Kind) { case PlotConditionType.Distance: //var dist = MathUtil.CalculateDistance(caster.Position, target.Position); var dist = 10; res = dist >= Param1 && dist <= Param2; break; case PlotConditionType.BuffTag: res = target.Effects.CheckBuffs(SkillManager.Instance.GetBuffsByTagId((uint)Param1)); break; case PlotConditionType.Unk6: res = false; //TODO break; case PlotConditionType.Unk7: res = false; //TODO break; } return(NotCondition ? !res : res); }
public CastTask(Skill skill, Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, SkillObject skillObject) : base(skill) { _caster = caster; _casterCaster = casterCaster; _target = target; _targetCaster = targetCaster; _skillObject = skillObject; }
public void Execute(Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, uint skillId) { if (target is House house && caster is Character character) { HousingManager.Instance.Demolish(character.Connection, house); } }
public ApplySkillTask(Skill skill, Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, SkillObject skillObject) { _skill = skill; _caster = caster; _casterCaster = casterCaster; _target = target; _targetCaster = targetCaster; _skillObject = skillObject; }
public SCSkillFiredPacket(uint id, ushort tl, SkillCaster caster, SkillCastTarget target, Skill skill, SkillObject skillObject) : base(0x09b, 1) { _id = id; _tl = tl; _caster = caster; _target = target; _skill = skill; _skillObject = skillObject; }
public SCSkillStartedPacket(uint id, ushort tl, SkillCaster caster, SkillCastTarget target, Skill skill, SkillObject skillObject) : base(SCOffsets.SCSkillStartedPacket, 5) { _id = id; _tl = tl; _caster = caster; _target = target; _skill = skill; _skillObject = skillObject; }
public PlotTask(Skill skill, Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, SkillObject skillObject, PlotNextEvent nextEvent) : base(skill) { _caster = caster; _casterCaster = casterCaster; _target = target; _targetCaster = targetCaster; _skillObject = skillObject; _nextEvent = nextEvent; }
public PlotTask(Skill skill, Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, SkillObject skillObject, PlotNextEvent nextEvent, Dictionary <uint, int> counter) : base(skill) { _caster = caster; _casterCaster = casterCaster; _target = target; _targetCaster = targetCaster; _skillObject = skillObject; _nextEvent = nextEvent; _counter = counter; }
public void Execute(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time, int Value1, int Value2, int Value3, int Value4) { var owner = (Character)caster; var skillData = (SkillItem)casterObj; _log.Warn("SlaveCall"); SlaveManager.Instance.Create(owner, skillData); }
public void Execute(Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, uint skillId) { if (target is Doodad doodad) { var func = DoodadManager.Instance.GetFunc(doodad.FuncGroupId, skillId); if (func == null) { return; } func.Use(caster, doodad, skillId); } }
public override void Read(PacketStream stream) { var skillId = stream.ReadUInt32(); var skillCasterType = stream.ReadByte(); // кто применяет var skillCaster = SkillCaster.GetByType((SkillCasterType)skillCasterType); skillCaster.Read(stream); var skillCastTargetType = stream.ReadByte(); // на кого применяют var skillCastTarget = SkillCastTarget.GetByType((SkillCastTargetType)skillCastTargetType); skillCastTarget.Read(stream); var flag = stream.ReadByte(); var flagType = flag & 15; var skillObject = SkillObject.GetByType((SkillObjectType)flagType); if (flagType > 0) { skillObject.Read(stream); } _log.Debug("StartSkill: Id {0}, flag {1}", skillId, flag); if (SkillManager.Instance.IsDefaultSkill(skillId) || SkillManager.Instance.IsCommonSkill(skillId)) { var skill = new Skill(SkillManager.Instance.GetSkillTemplate(skillId)); // TODO переделать... skill.Use(Connection.ActiveChar, skillCaster, skillCastTarget, skillObject); } else if (skillCaster is SkillItem) { var item = Connection.ActiveChar.Inventory.GetItem(((SkillItem)skillCaster).ItemId); if (item == null || skillId != item.Template.UseSkillId) { return; } Connection.ActiveChar.Quests.OnItemUse(item); var skill = new Skill(SkillManager.Instance.GetSkillTemplate(skillId)); skill.Use(Connection.ActiveChar, skillCaster, skillCastTarget, skillObject); } else if (Connection.ActiveChar.Skills.Skills.ContainsKey(skillId)) { var skill = Connection.ActiveChar.Skills.Skills[skillId]; skill.Use(Connection.ActiveChar, skillCaster, skillCastTarget, skillObject); } else { _log.Warn("StartSkill: Id {0}, undefined use type", skillId); } }
public void Execute(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time, int Value1, int Value2, int Value3, int Value4) { var owner = (Character)caster; var skillData = (SkillItem)casterObj; switch (Value1) { // TODO - maybe not hardcoded case 4944: // land case 3466: // sea //owner.Mates.SpawnMount(skillData); break; } owner.Mates.SpawnMount(skillData); }
public override void Execute(Npc npc) { //先判断距离 / Judge the distance first bool move = false; float x = npc.Position.X - npc.CurrentTarget.Position.X; float y = npc.Position.Y - npc.CurrentTarget.Position.Y; float z = npc.Position.Z - npc.CurrentTarget.Position.Z; float MaxXYZ = Math.Max(Math.Max(Math.Abs(x), Math.Abs(y)), Math.Abs(z)); //如果最大值超过distance 则放弃攻击转而进行追踪 / If the maximum value exceeds distance, abandon the attack and track it if (MaxXYZ > distance) { var track = new Track(); track.Pause(npc); track.LastPatrol = LastPatrol; LastPatrol = track; Stop(npc); } else { LoopDelay = 3000; var skillId = 2u; var skillCasterType = SkillCasterType.Unit; // who applies / кто применяет var skillCaster = SkillCaster.GetByType(skillCasterType); skillCaster.ObjId = npc.ObjId; var skillCastTargetType = 0; // on whom apply / на кого применяют var skillCastTarget = SkillCastTarget.GetByType((SkillCastTargetType)skillCastTargetType); skillCastTarget.ObjId = npc.CurrentTarget.ObjId; var flag = 0; var flagType = flag & 15; var skillObject = SkillObject.GetByType((SkillObjectType)flagType); if (flagType > 0) { skillObject.Flag = SkillObjectType.None; } var skill = new Skill(SkillManager.Instance.GetSkillTemplate(skillId)); // TODO переделать... skill.Use(npc, skillCaster, skillCastTarget, skillObject); LoopAuto(npc); } }
public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time) { _log.Debug("ReportCrimeEffect"); }
public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time) { _log.Debug("AcceptQuestEffect"); if (target is Character character) { character.Quests.Add(QuestId); } }
public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time) { _log.Debug("CraftEffect, {0}", WorldInteraction); var wiGroup = WorldManager.Instance.GetWorldInteractionGroup((uint)WorldInteraction); if (caster is Character character) { switch (wiGroup) { case WorldInteractionGroup.Craft: character.Craft.EndCraft(); break; case WorldInteractionGroup.Collect: break; case WorldInteractionGroup.Building: // TODO not done, debug only if (target is House house) { // TODO remove resources... var nextStep = house.CurrentStep + 1; if (house.Template.BuildSteps.Count > nextStep) { house.CurrentStep = nextStep; } else { house.CurrentStep = -1; } // TODO to currStep +1 num action character.BroadcastPacket( new SCHouseBuildProgressPacket( house.TlId, house.ModelId, house.Template.BuildSteps.Count, nextStep ), true ); if (house.CurrentStep == -1) { var doodads = house.AttachedDoodads.ToArray(); foreach (var doodad in doodads) { doodad.Spawn(); } } } break; default: _log.Warn("CraftEffect, {0} not have wi group", WorldInteraction); break; } character.Quests.OnInteraction(WorldInteraction); } }
public void Execute(Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, uint skillId) { }
public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time) { _log.Debug("DamageEffect"); //if (!(target is Unit)) //{ // return; //} var trg = (Unit)target; var min = 0; var max = 0; if (UseFixedDamage) { min += FixedMin; max += FixedMax; } var unk = 0f; var unk2 = 1f; var skillLevel = 1; if (skill != null) { skillLevel = (skill.Level - 1) * skill.Template.LevelStep + skill.Template.AbilityLevel; if (skillLevel >= skill.Template.AbilityLevel) { unk = 0.015f * (skillLevel - skill.Template.AbilityLevel + 1); } unk2 = (1 + unk) * 1.3f; } if (UseLevelDamage) { var levelMd = (unk + 1) * LevelMd; min += (int)(caster.LevelDps * levelMd + 0.5f); max += (int)((((skillLevel - 1) * 0.020408163f * (LevelVaEnd - LevelVaStart) + LevelVaStart) * 0.0099999998f + 1f) * caster.LevelDps * levelMd + 0.5f); } var dpsInc = 0f; if (DamageType == DamageType.Melee) { dpsInc = caster.DpsInc; } else if (DamageType == DamageType.Magic) { dpsInc = caster.MDps + caster.MDpsInc; } else if (DamageType == DamageType.Ranged) { dpsInc = caster.RangedDpsInc; } var dps = 0f; if (UseMainhandWeapon) { dps += caster.Dps; } else if (UseOffhandWeapon) { dps += caster.OffhandDps; } else if (UseRangedWeapon) { dps += caster.RangedDps; } min += (int)((DpsMultiplier * dps * 0.001f + DpsIncMultiplier * dpsInc * 0.001f) * unk2 + 0.5f); max += (int)((DpsMultiplier * dps * 0.001f + DpsIncMultiplier * dpsInc * 0.001f) * unk2 + 0.5f); min = (int)(min * Multiplier); max = (int)(max * Multiplier); var value = Rand.Next(min, max); trg.ReduceCurrentHp(caster, value); trg.BroadcastPacket(new SCUnitDamagedPacket(castObj, casterObj, caster.ObjId, target.ObjId, value), true); if (trg is Npc npc && npc.CurrentTarget != caster) { npc.BroadcastPacket(new SCAiAggroPacket(npc.ObjId, 1, caster.ObjId), true); if (npc.Patrol == null || npc.Patrol.PauseAuto(npc)) { npc.CurrentTarget = caster; npc.BroadcastPacket(new SCCombatEngagedPacket(caster.ObjId), true); // caster npc.BroadcastPacket(new SCCombatEngagedPacket(npc.ObjId), true); // target npc.BroadcastPacket(new SCCombatFirstHitPacket(npc.ObjId, caster.ObjId, 0), true); npc.BroadcastPacket(new SCAggroTargetChangedPacket(npc.ObjId, caster.ObjId), true); npc.BroadcastPacket(new SCTargetChangedPacket(npc.ObjId, caster.ObjId), true); TaskManager.Instance.Schedule(new UnitMove(new Track(), npc), TimeSpan.FromMilliseconds(100)); } } }
public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time) { var portalInfo = (SkillObjectUnk1)skillObject; var portalOwner = (Character)caster; // Private - [DEBUG] EffectTemplate - OpenPortalEffect, Owner: Lemes, PortalId: 4097, Type: 2, X: 20928, Y: 13145,9, Z:114,1004 // District - [DEBUG] EffectTemplate - OpenPortalEffect, Owner: Lemes, PortalId: 3, Type: 1, X: 20921,96, Y: 13148,55, Z:114,2535 _log.Debug("OpenPortalEffect, Owner: {0}, PortalId: {1}, Type: {5}, X: {2}, Y: {3}, Z:{4}", portalOwner.Name, portalInfo.Id, portalInfo.X, portalInfo.Y, portalInfo.Z, portalInfo.Type); if (portalInfo.X > portalOwner.Position.X + Distance || portalInfo.Y > portalOwner.Position.Y + Distance) { return; } PortalManager.Instance.OpenPortal(portalOwner, portalInfo); // TODO - Use Distance }
public void Execute(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time, int Value1, int Value2, int Value3, int Value4) { Character character = (Character)caster; if (character == null) { return; } SkillItem scroll = (SkillItem)casterObj; if (scroll == null) { return; } SkillCastUnk3Target itemTarget = (SkillCastUnk3Target)targetObj; if (itemTarget == null) { return; } var useCharm = false; SkillObjectItemGradeEnchantingSupport charm = (SkillObjectItemGradeEnchantingSupport)skillObject; if (charm != null && charm.SupportItemId != 0) { useCharm = true; } bool isLucky = Value1 != 0; Item item = character.Inventory.GetItem(itemTarget.Id); var initialGrade = item.Grade; var gradeTemplate = ItemManager.Instance.GetGradeTemplate(item.Grade); var tasks = new List <ItemTask>(); int cost = GoldCost(gradeTemplate, item, Value3); if (cost == -1) { return; } if (character.Money < cost) { return; } character.Money -= cost; tasks.Add(new MoneyChange(-cost)); if (!character.Inventory.CheckItems(scroll.ItemTemplateId, 1)) { return; } Item scrollItem = character.Inventory.GetItem(scroll.ItemId); tasks.Add(InventoryHelper.GetTaskAndRemoveItem(character, scrollItem, 1)); ItemGradeEnchantingSupport charmInfo = null; if (useCharm) { Item charmItem = character.Inventory.GetItem(charm.SupportItemId); if (charmItem == null) { return; } charmInfo = ItemManager.Instance.GetItemGradEnchantingSupportByItemId(charmItem.TemplateId); if (charmInfo.RequireGradeMin != -1 && item.Grade < charmInfo.RequireGradeMin) { return; } if (charmInfo.RequireGradeMax != -1 && item.Grade > charmInfo.RequireGradeMax) { return; } tasks.Add(InventoryHelper.GetTaskAndRemoveItem(character, charmItem, 1)); } var result = RollRegrade(gradeTemplate, item, isLucky, useCharm, charmInfo); if (result == GradeEnchantResult.Break) { tasks.Add(InventoryHelper.GetTaskAndRemoveItem(character, item, 1)); } else { // TODO : make sure grade updates with itemupdate tasks.Add(new ItemGradeChange(item, item.Grade)); } character.SendPacket(new SCGradeEnchantResultPacket((byte)result, item, initialGrade, item.Grade)); character.SendPacket(new SCItemTaskSuccessPacket(ItemTaskType.GradeEnchant, tasks, new List <ulong>())); if (item.Grade >= 8 && (result == GradeEnchantResult.Success || result == GradeEnchantResult.GreatSuccess)) { WorldManager.Instance.BroadcastPacketToServer(new SCGradeEnchantBroadcastPacket(character.Name, (byte)result, item, initialGrade, item.Grade)); } }
public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time) { _log.Debug("SpecialEffect, Special: {0}, Value1: {1}, Value2: {2}, Value3: {3}, Value4: {4}", SpecialEffectTypeId, Value1, Value2, Value3, Value4); var classType = Type.GetType("AAEmu.Game.Models.Game.Skills.Effects.SpecialEffects." + SpecialEffectTypeId); if (classType == null) { _log.Error("Unknown special effect: {0}", SpecialEffectTypeId); return; } var action = (ISpecialEffect)Activator.CreateInstance(classType); action.Execute(caster, casterObj, target, targetObj, castObj, skill, skillObject, time, Value1, Value2, Value3, Value4); }
public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time) { if (RequireBuffId > 0 && !target.Effects.CheckBuff(RequireBuffId)) { return; //TODO send error? } if (target.Effects.CheckBuffImmune(Id)) { return; //TODO error of immune? } target.Effects.AddEffect(new Effect(target, caster, casterObj, this, skill, time)); }
public virtual bool СheckСonditions(Unit caster, SkillCaster casterCaster, BaseUnit target, SkillCastTarget targetCaster, SkillObject skillObject) { var result = true; foreach (var condition in Conditions) { if (condition.Condition.Check(caster, casterCaster, target, targetCaster, skillObject)) { continue; } result = false; break; } return(result); }
public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time) { _log.Debug("DispelEffect"); if (BuffTagId > 0 && !target.Effects.CheckBuffs(SkillManager.Instance.GetBuffsByTagId(BuffTagId))) { return; } if (DispelCount > 0) { target.Effects.RemoveBuffs(BuffKind.Good, DispelCount); //TODO .... } if (CureCount > 0) { target.Effects.RemoveBuffs(BuffKind.Bad, CureCount); } }
public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time) { var character = (Character)caster; if (character == null) { return; } var lootPack = (SkillItem)casterObj; if (lootPack == null) { return; } var lootPacks = ItemManager.Instance.GetLootPacks(LootPackId); var lootGroups = ItemManager.Instance.GetLootGroups(LootPackId); var lootPackItem = character.Inventory.GetItem(lootPack.ItemId); _log.Debug("LootGroups {0}", lootGroups); var rowG = lootGroups.Length; var rowP = lootPacks.Length; if (rowG >= 1) { const float maxDropRate = (float)10000000; for (var i = 0; i < rowG; i++) { var itemIdLoot = (uint)0; var minAmount = 0; var maxAmount = 0; var gradeId = (byte)0; var dropRateMax = (uint)0; var dropRate = Rand.Next(0, maxDropRate); var dropRateGroup = (uint)10000000; if (lootGroups[i].GroupNo > 1 && rowG >= 2) { dropRateGroup = 0; for (var di = 0; di < lootGroups[i].GroupNo; di++) { if (lootGroups[di].GroupNo > 1) { dropRateGroup += lootGroups[di].DropRate; } } } if (dropRateGroup >= dropRate) { for (var ui = 0; ui < rowP; ui++) { if (lootPacks[ui].Group == lootGroups[i].GroupNo) { dropRateMax += lootPacks[ui].DropRate; } } var dropRateItem = Rand.Next(0, dropRateMax); var dropRateItemId = (uint)0; for (var uii = 0; uii < rowP; uii++) { if (lootPacks[uii].Group == lootGroups[i].GroupNo) { if (lootPacks[uii].DropRate + dropRateItemId >= dropRateItem) { itemIdLoot = lootPacks[uii].ItemId; minAmount = lootPacks[uii].MinAmount; maxAmount = lootPacks[uii].MaxAmount; gradeId = lootPacks[uii].GradeId; uii = rowP; } else { dropRateItemId += lootPacks[uii].DropRate; } } } } if (minAmount > 1 || itemIdLoot == 500) { AddGold(caster, minAmount, maxAmount); } if (itemIdLoot > 0 && itemIdLoot != 500) { if (InheritGrade) { gradeId = lootPackItem.Grade; } if (lootGroups[i].ItemGradeDistributionId > 0) { gradeId = GetGradeDistributionId(lootGroups[i].ItemGradeDistributionId); } AddItem(caster, itemIdLoot, gradeId, minAmount, maxAmount); } } RemoveItem(caster, casterObj, 1); } else { if (rowP >= 1) { for (var i = 1; i <= 17; i++) ////////max group here ////// in sqlite max group = 17 ///// { var itemIdLoot = (uint)0; var minAmount = 0; var maxAmount = 0; var gradeId = (byte)0; var dropRateMax = (uint)0; for (var ui = 0; ui < rowP; ui++) { if (lootPacks[ui].Group == i) { dropRateMax += lootPacks[ui].DropRate; } } var dropRateItem = Rand.Next(0, dropRateMax); var dropRateItemId = (uint)0; for (var uii = 0; uii < rowP; uii++) { if (lootPacks[uii].Group == i) { if (lootPacks[uii].DropRate + dropRateItemId >= dropRateItem) { itemIdLoot = lootPacks[uii].ItemId; minAmount = lootPacks[uii].MinAmount; maxAmount = lootPacks[uii].MaxAmount; gradeId = lootPacks[uii].GradeId; uii = rowP; } else { dropRateItemId += lootPacks[uii].DropRate; } } } if (minAmount > 1 || itemIdLoot == 500) { AddGold(caster, minAmount, maxAmount); } if (itemIdLoot > 0 && itemIdLoot != 500) { if (InheritGrade) { gradeId = lootPackItem.Grade; } AddItem(caster, itemIdLoot, gradeId, minAmount, maxAmount); } } RemoveItem(caster, casterObj, 1); } } _log.Debug("GainLootPackItemEffect {0}", LootPackId); }
public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time) { _log.Debug("PutDownBackpackEffect"); Character character = (Character)caster; if (character == null) { return; } SkillItem packItem = (SkillItem)casterObj; if (packItem == null) { return; } Item item = character.Inventory.GetItem(packItem.ItemId); if (item == null) { return; } InventoryHelper.RemoveItemAndUpdateClient(character, item, 1); // Spawn doodad var doodadSpawner = new DoodadSpawner(); doodadSpawner.Id = 0; doodadSpawner.UnitId = BackpackDoodadId; doodadSpawner.Position = character.Position.Clone(); doodadSpawner.Spawn(0); }
public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time) { _log.Debug("HealEffect"); if (!(target is Unit)) { return; } var trg = (Unit)target; var min = 0; var max = 0; if (UseFixedHeal) { min += FixedMin; max += FixedMax; } var unk = 0f; var unk2 = 1f; var skillLevel = 1; if (skill != null) { skillLevel = (skill.Level - 1) * skill.Template.LevelStep + skill.Template.AbilityLevel; if (skillLevel >= skill.Template.AbilityLevel) { unk = 0.15f * (skillLevel - skill.Template.AbilityLevel + 1); } unk2 = (1 + unk) * 1.3f; } if (UseLevelHeal) { var levelMd = (unk + 1) * LevelMd; min += (int)(caster.LevelDps * levelMd + 0.5f); max += (int)((((skillLevel - 1) * 0.020408163f * (LevelVaEnd - LevelVaStart) + LevelVaStart) * 0.0099999998f + 1f) * caster.LevelDps * levelMd + 0.5f); } min += (int)((caster.MDps + caster.MDpsInc) * DpsMultiplier * 0.001f * unk2 + 0.5f); max += (int)((caster.MDps + caster.MDpsInc) * DpsMultiplier * 0.001f * unk2 + 0.5f); var value = Rand.Next(min, max); trg.BroadcastPacket(new SCUnitHealedPacket(castObj, casterObj, target.ObjId, 0, value), true); trg.Hp += value; trg.Hp = Math.Min(trg.Hp, trg.MaxHp); trg.BroadcastPacket(new SCUnitPointsPacket(trg.ObjId, trg.Hp, trg.Mp), true); }
public override void Apply(Unit caster, SkillCaster casterObj, BaseUnit target, SkillCastTarget targetObj, CastAction castObj, Skill skill, SkillObject skillObject, DateTime time) { var portalInfo = (SkillObjectUnk1)skillObject; var portalOwner = (Character)caster; _log.Debug("OpenPortalEffect, Owner: {0}, PortalId: {1}", portalOwner.Name, portalInfo.Id); PortalManager.Instance.OpenPortal(portalOwner, portalInfo); // TODO - Use Distance }