private void SendCompleted() { PacketOut Out = new PacketOut((byte)Opcodes.F_USE_ABILITY, 20); Out.WriteUInt16(0); Out.WriteUInt16(AbInfo.Entry); Out.WriteUInt16(_caster.Oid); Out.WriteUInt16(AbInfo.ConstantInfo.EffectID); if (AbInfo.Target != null) { Out.WriteUInt16(AbInfo.Target.Oid); } else if (AbInfo.Range == 0) { Out.WriteUInt16(_caster.Oid); } else { Out.WriteUInt16(0); } Out.WriteByte(2); Out.WriteByte((byte)AbInfo.ConstantInfo.Origin); Out.WriteByte(0); Out.WriteByte(0); //result Out.WriteInt16((short)-(TCPManager.GetTimeStampMS() - _castStartTime)); Out.WriteByte(_castSequence); Out.WriteUInt16(0); //time Out.WriteByte(0); _abInterface._Owner.DispatchPacket(Out, true); if (AbInfo.CastTime == 0) { //if (AbInfo.ConstantInfo.ChannelID == 0) _caster.SendUpdateState((byte)StateOpcode.CastCompletion, 0); } }