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 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); } }