HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include < amxmodx >
  2. #include < engine >
  3.  
  4. #define VERSION "1.0"
  5.  
  6. #define DIRECTOR_HUD_MESSAGE 0
  7. #define NORMAL_HUD_MESSAGE 1
  8.  
  9.  
  10. new pCvar_VictimC, pCvar_OurselfC, pCvar_AttackerC, pCvar_BulletMode, pCvar_Bullet_Distance, pCvar_Bullet_Walls,
  11. pCvar_Bullet_ShowSpec, pCvar_Bullet_Hs_Mode, pCvar_Bullet_Text_Mode, pCvar_Bullet_Show_Mode, pCvar_Accumulated_Damage
  12.  
  13. new dhud_color, dhud_x, dhud_y, dhud_effect, dhud_fxtime, dhud_holdtime, dhud_fadeintime, dhud_fadeouttime, dhud_reliable
  14.  
  15. new Float: Yv[ 33 ], Float: Xv[ 33 ] /* Victim*/, Float: Ya[ 33 ], Float: Xa[ 33 ] // Attacker
  16.  
  17. new bool: ShowMeThisHud[ 33 ], MyCurrentDamages[ 33 ], iSyncObj
  18.  
  19. public plugin_init( )
  20. {
  21. register_plugin( "Bullet Damage", VERSION, "Bboy Grun" )
  22.  
  23. register_cvar( "Director_bullet_dmg", VERSION, FCVAR_SERVER | FCVAR_SPONLY )
  24. set_cvar_string( "Director_bullet_dmg", VERSION )
  25.  
  26. register_event( "Damage", "Event_Damage", "b", "2!0", "3=0", "4!0" )
  27.  
  28. register_clcmd( "say /showsebz", "Say_showbd" )
  29. register_clcmd( "say showsebz", "Say_showbd" )
  30.  
  31. iSyncObj = CreateHudSyncObj( )
  32.  
  33. pCvar_BulletMode = register_cvar( "Bullet_Damage_Mode", "0" )
  34. pCvar_Bullet_Distance = register_cvar( "Bullet_Damage_Distance", "600" )
  35. pCvar_Bullet_Walls = register_cvar( "Bullet_Damage_NoShowWalls", "0" )
  36. pCvar_Bullet_ShowSpec = register_cvar( "Bullet_Show_Spec", "1" )
  37. pCvar_Bullet_Hs_Mode = register_cvar( "Bullet_Hs_Mode", "2" )
  38. pCvar_Bullet_Text_Mode = register_cvar( "Bullet_Text_Mode", "0" )
  39. pCvar_Bullet_Show_Mode = register_cvar( "Bullet_Show_Mode", "3" )
  40. pCvar_Accumulated_Damage = register_cvar( "Show_Accumulated_Damage", "1" )
  41.  
  42. pCvar_VictimC = register_cvar( "Color_RGB_Victim", "255000000" )
  43. pCvar_AttackerC = register_cvar( "Color_RGB_Attacker", "000255000" )
  44. pCvar_OurselfC = register_cvar( "Color_RGB_Ourself_Teammate", "255102021" )
  45. }
  46.  
  47. public plugin_natives( )
  48. {
  49. register_native( "bd_show_damage", "native_bd_show_damage", 0 )
  50. register_native( "bd_show_text", "native_bd_show_text", 0 )
  51. }
  52.  
  53. // HELP : http://forums.alliedmods.net/showthread.php?p=1436434#post1436434 Thanks to schmurgel1983
  54. public native_bd_show_text( iPlugin, iParams )
  55. {
  56. new id = get_param( 1 )
  57.  
  58. if( !is_user_connected( id ) ) // user disconnected .. return 0
  59. {
  60. return 0
  61. }
  62.  
  63. new Text[ 128 ], Attacker, Size
  64.  
  65. Attacker = get_param( 2 )
  66. Size = get_param( 3 )
  67.  
  68. get_string( 3, Text, charsmax( Text ) )
  69. show_client_text( id, Text, Attacker, Size )
  70.  
  71. if( Attacker ) // Is the player attacker ? Yes = 1 -- No = 0
  72. {
  73. CheckPosition( id, Attacker )
  74. return 1
  75. }
  76.  
  77. CheckPosition( id, 0 )
  78. return 1
  79. }
  80.  
  81. public native_bd_show_damage( iPlugin, iParams )
  82. {
  83. new id = get_param( 1 )
  84.  
  85. if( !is_user_connected( id ) )
  86. {
  87. return 0
  88. }
  89.  
  90. new damage, style, Attacker
  91. damage = get_param( 2 ); style = get_param( 3 ); Attacker = get_param( 4 )
  92.  
  93. show_client_value( id, damage, Attacker, style )
  94.  
  95. if( Attacker ) // Is the player attacker ? Yes = 1 -- No = 0
  96. {
  97. CheckPosition( id, Attacker )
  98. return 1
  99. }
  100.  
  101. CheckPosition( id, 0 )
  102. return 1
  103. }
  104.  
  105. public Event_Damage( Victim )
  106. {
  107. static Attacker, AttackerWpn, VictimBodyPart
  108. Attacker = get_user_attacker( Victim, AttackerWpn, VictimBodyPart )
  109.  
  110. if( !is_user_alive( Attacker ) || ( get_pcvar_num( pCvar_Bullet_Walls ) && !is_visible( Attacker, Victim ) ) )
  111. {
  112. return;
  113. }
  114.  
  115. static damage, R, G, B, pCvar_H, pCvar_TMODE
  116. damage = read_data( 2 )
  117.  
  118. pCvar_H = get_pcvar_num( pCvar_Bullet_Hs_Mode )
  119. pCvar_TMODE = get_pcvar_num( pCvar_Bullet_Text_Mode )
  120.  
  121. static AttackerOrigin[ 3 ], VictimOrigin[ 3 ]
  122.  
  123. if( Attacker != Victim && get_user_team( Attacker ) != get_user_team( Victim ) )
  124. {
  125. if( pCvar_H > 0 && VictimBodyPart == HIT_HEAD )
  126. {
  127. if( pCvar_H == 1 )
  128. {
  129. show_client_value( Victim, damage, 0, DIRECTOR_HUD_MESSAGE )
  130. show_client_value( Attacker, damage, 1, DIRECTOR_HUD_MESSAGE )
  131. }
  132. else
  133. {
  134. show_client_text( Victim, "HEADSHOT", 0, pCvar_TMODE )
  135. show_client_text( Attacker, "HEADSHOT", 1, pCvar_TMODE )
  136. }
  137. }
  138. else
  139. {
  140. if( !get_pcvar_num( pCvar_BulletMode ) )
  141. {
  142. show_client_value( Victim, damage, 0, DIRECTOR_HUD_MESSAGE )
  143. show_client_value( Attacker, damage, 1, DIRECTOR_HUD_MESSAGE )
  144. }
  145.  
  146. else
  147. {
  148. get_user_origin( Attacker, AttackerOrigin )
  149. get_user_origin( Victim, VictimOrigin )
  150.  
  151. if( get_distance( AttackerOrigin, VictimOrigin ) > get_pcvar_num( pCvar_Bullet_Distance ) )
  152. {
  153. show_client_value( Victim, damage, 0, NORMAL_HUD_MESSAGE )
  154. show_client_value( Attacker, damage, 1, NORMAL_HUD_MESSAGE )
  155. }
  156. else
  157. {
  158. show_client_value( Victim, damage, 0, DIRECTOR_HUD_MESSAGE )
  159. show_client_value( Attacker, damage, 1, DIRECTOR_HUD_MESSAGE )
  160. }
  161. }
  162. }
  163.  
  164. CheckPosition( Victim, 0 )
  165. CheckPosition( Attacker, 1 )
  166.  
  167. if( MyCurrentDamages[ Attacker ] == -1 || !get_pcvar_num( pCvar_Accumulated_Damage ) )
  168. {
  169. // MyCurrentDamages[ Attacker ] == -1 : The player is a BOT
  170. return;
  171. }
  172.  
  173. MyCurrentDamages[ Attacker ] += damage
  174. UpdateDamages( Attacker )
  175. }
  176. else
  177. {
  178. // http://forums.alliedmods.net/showthread.php?t=62224
  179. static iColor; iColor = get_pcvar_num( pCvar_OurselfC )
  180. R = iColor / 1000000
  181. iColor %= 1000000
  182. G = iColor / 1000
  183. B = iColor % 1000
  184.  
  185. set_dhudmessage( R, G, B, -1.0, -1.0, 2, 0.0, 2.0, 0.1, 0.1 )
  186. show_dhudmessage( Victim, "%i", damage ) // Show the damages to the player
  187. }
  188. }
  189.  
  190. public Say_showbd( id )
  191. {
  192. if( ShowMeThisHud[ id ] )
  193. {
  194. ShowMeThisHud[ id ] = false
  195. client_print( id, print_chat, "[ Sebzes kijelzo %s ] STATUS : OFF", VERSION )
  196. return;
  197. }
  198.  
  199. client_print( id, print_chat, "[ Sebzes kijelzo %s ] STATUS : ON", VERSION )
  200. ShowMeThisHud[ id ] = true
  201. }
  202.  
  203. public client_putinserver( id )
  204. {
  205. iRefreshHudPosition( id )
  206.  
  207. ShowMeThisHud[ id ] = true
  208. MyCurrentDamages[ id ] = is_user_bot( id ) ? -1 : 0
  209.  
  210. }
  211.  
  212.  
  213. stock set_dhudmessage( red = 0, green = 160, blue = 0, Float:x = -1.0, Float:y = 0.65, effects = 2, Float:fxtime = 6.0, Float:holdtime = 3.0, Float:fadeintime = 0.1, Float:fadeouttime = 1.5, bool:reliable = false )
  214. {
  215. #define clamp_byte(%1) ( clamp( %1, 0, 255 ) )
  216. #define pack_color(%1,%2,%3) ( %3 + ( %2 << 8 ) + ( %1 << 16 ) )
  217.  
  218. dhud_color = pack_color( clamp_byte( red ), clamp_byte( green ), clamp_byte( blue ) )
  219. dhud_x = _: x
  220. dhud_y = _: y
  221. dhud_effect = effects
  222. dhud_fxtime = _: fxtime
  223. dhud_holdtime = _: holdtime
  224. dhud_fadeintime = _: fadeintime
  225. dhud_fadeouttime = _: fadeouttime
  226. dhud_reliable = _: reliable
  227.  
  228. return 1;
  229. }
  230.  
  231. stock show_dhudmessage( index, const message[ ], any:... )
  232. {
  233. new buffer[ 128 ]
  234. new numArguments = numargs( )
  235.  
  236. if( numArguments == 2 )
  237. {
  238. send_dhudMessage( index, message )
  239. }
  240. else if( index || numArguments == 3 )
  241. {
  242. vformat( buffer, charsmax( buffer ), message, 3 )
  243. send_dhudMessage( index, buffer )
  244. }
  245. else
  246. {
  247. new playersList[ 32 ], numPlayers;
  248. get_players( playersList, numPlayers, "ch" )
  249.  
  250. if( !numPlayers )
  251. {
  252. return 0;
  253. }
  254.  
  255. new Array:handleArrayML = ArrayCreate()
  256.  
  257. for( new i = 2, j; i < numArguments; i++ )
  258. {
  259. if( getarg( i ) == LANG_PLAYER )
  260. {
  261. while( ( buffer[ j ] = getarg( i + 1, j++ ) ) ) {}
  262. j = 0
  263.  
  264. if( GetLangTransKey( buffer ) != TransKey_Bad )
  265. {
  266. ArrayPushCell( handleArrayML, i++ )
  267. }
  268. }
  269. }
  270.  
  271. new size = ArraySize( handleArrayML )
  272.  
  273. if( !size )
  274. {
  275. vformat( buffer, charsmax( buffer ), message, 3 )
  276. send_dhudMessage( index, buffer )
  277. }
  278. else
  279. {
  280. for( new i = 0, j; i < numPlayers; i++ )
  281. {
  282. index = playersList[ i ]
  283.  
  284. for( j = 0; j < size; j++ )
  285. {
  286. setarg( ArrayGetCell( handleArrayML, j ), 0, index )
  287. }
  288.  
  289. vformat( buffer, charsmax( buffer ), message, 3 )
  290. send_dhudMessage( index, buffer )
  291. }
  292. }
  293.  
  294. ArrayDestroy( handleArrayML )
  295. }
  296. return 1;
  297. }
  298.  
  299. stock send_dhudMessage( const index, const message[ ] )
  300. {
  301. message_begin( dhud_reliable ? ( index ? MSG_ONE : MSG_ALL ) : ( index ? MSG_ONE_UNRELIABLE : MSG_BROADCAST ), SVC_DIRECTOR, _, index )
  302. {
  303. write_byte( strlen( message ) + 31 )
  304. write_byte( DRC_CMD_MESSAGE )
  305. write_byte( dhud_effect )
  306. write_long( dhud_color )
  307. write_long( dhud_x )
  308. write_long( dhud_y )
  309. write_long( dhud_fadeintime )
  310. write_long( dhud_fadeouttime )
  311. write_long( dhud_holdtime )
  312. write_long( dhud_fxtime )
  313. write_string( message )
  314. }
  315. message_end()
  316. }
  317.  
  318. UpdateDamages( id )
  319. {
  320. if( !ShowMeThisHud[ id ] )
  321. {
  322. return;
  323. }
  324.  
  325. set_hudmessage( 0, 255, 0, -1.0, -0.50, 0, 0.0, 4.0, 0.0, 1.0, -1 )
  326. ShowSyncHudMsg( id, iSyncObj, "%d", MyCurrentDamages[ id ] )
  327.  
  328. if( task_exists( 999_666_999 + id ) )
  329. {
  330. remove_task( 999_666_999 + id )
  331. }
  332.  
  333. set_task( 5.0, "ResetCurrentDamages", 999_666_999 + id )
  334. }
  335.  
  336. public ResetCurrentDamages( TaskID )
  337. {
  338. MyCurrentDamages[ TaskID - 999_666_999 ] = 0
  339. }
  340.  
  341. show_client_value( id, damage, Attacker, iSize )
  342. {
  343. if( !ShowMeThisHud[ id ] )
  344. {
  345. return;
  346. }
  347.  
  348. static iColor, R, G, B, Float: Y_Pos, Float: X_Pos
  349.  
  350. if( Attacker ) // The user is the Attacker ( Attacker value = 1 )
  351. {
  352. // Attacker
  353. iColor = get_pcvar_num( pCvar_AttackerC )
  354. Y_Pos = Ya[ id ]
  355. X_Pos = Xa[ id ]
  356. }
  357. else
  358. {
  359. // Victim
  360. iColor = get_pcvar_num( pCvar_VictimC )
  361. Y_Pos = Yv[ id ]
  362. X_Pos = Xv[ id ]
  363. }
  364.  
  365. R = iColor / 1000000
  366. iColor %= 1000000
  367. G = iColor / 1000
  368. B = iColor % 1000
  369.  
  370. if( iSize )
  371. {
  372. set_hudmessage( R, G, B, X_Pos, Y_Pos, 2, 0.0, 1.0, 0.02, 0.02 )
  373. show_hudmessage( id, "%i", damage )
  374. }
  375. else
  376. {
  377. set_dhudmessage( R, G, B, X_Pos, Y_Pos, 2, 0.0, 1.0, 0.02, 0.02 )
  378. show_dhudmessage( id, "%i", damage )
  379. }
  380.  
  381. if( !get_pcvar_num( pCvar_Bullet_ShowSpec ) )
  382. {
  383. return;
  384. }
  385.  
  386. SpectatorHud( id, damage, _, 0, iSize, Float: X_Pos, Float: Y_Pos, R, G, B )
  387. }
  388.  
  389. show_client_text( id, iText[ ], Attacker, iSize )
  390. {
  391. if( !ShowMeThisHud[ id ] )
  392. {
  393. return;
  394. }
  395.  
  396. static iColor, R, G, B, Float: Y_Pos, Float: X_Pos
  397.  
  398. if( Attacker ) // The user is the Attacker ( Attacker value = 1 )
  399. {
  400. // Attacker
  401. iColor = get_pcvar_num( pCvar_AttackerC )
  402. Y_Pos = Ya[ id ]
  403. X_Pos = Xa[ id ]
  404. }
  405. else
  406. {
  407. // Victim
  408. iColor = get_pcvar_num( pCvar_VictimC )
  409. Y_Pos = Yv[ id ]
  410. X_Pos = Xv[ id ]
  411. }
  412.  
  413. R = iColor / 1000000
  414. iColor %= 1000000
  415. G = iColor / 1000
  416. B = iColor % 1000
  417.  
  418. if( !iSize )
  419. {
  420. set_dhudmessage( R, G, B, X_Pos, Y_Pos, 2, 0.0, 1.0, 0.02, 0.02 )
  421. show_dhudmessage( id, "%s", iText )
  422. }
  423. else
  424. {
  425. set_hudmessage( R, G, B, X_Pos, Y_Pos, 2, 0.0, 1.0, 0.02, 0.02, -1 )
  426. show_hudmessage( id, "%s", iText )
  427. }
  428.  
  429. if( !get_pcvar_num( pCvar_Bullet_ShowSpec ) )
  430. {
  431. return;
  432. }
  433.  
  434. SpectatorHud( id, _, iText, 1, iSize, Float: X_Pos, Float: Y_Pos, R, G, B )
  435. }
  436.  
  437. SpectatorHud( id, iDamage = 0, iText[ ] = "", TextMode, Size, Float: X_Pos, Float: Y_Pos, R, G, B )
  438. {
  439. static iPlayers[ 32 ], iNum
  440. get_players( iPlayers, iNum, "bch" )
  441.  
  442. for( new i = 0, Spectator = iPlayers[ 0 ]; i < iNum; Spectator = iPlayers[ i++ ] )
  443. {
  444. if( ShowMeThisHud[ Spectator ] && entity_get_int( Spectator, EV_INT_iuser2 ) == id )
  445. {
  446. if( !Size )
  447. {
  448. set_dhudmessage( R, G, B, X_Pos, Y_Pos, 2, 0.0, 1.0, 0.02, 0.02 )
  449. TextMode ? show_dhudmessage( Spectator, "%s", iText ) : show_dhudmessage( Spectator, "%d", iDamage )
  450. }
  451. else
  452. {
  453. set_hudmessage( R, G, B, X_Pos, Y_Pos, 2, 0.0, 1.0, 0.02, 0.02, -1 )
  454. TextMode ? show_hudmessage( Spectator, "%s", iText ) : show_hudmessage( Spectator, "%d", iDamage )
  455. }
  456. }
  457. }
  458. }
  459.  
  460. iRefreshHudPosition( id )
  461. {
  462. switch( get_pcvar_num( pCvar_Bullet_Show_Mode ) )
  463. {
  464. case 0:
  465. {
  466. Ya[ id ] = -0.50
  467. Xa[ id ] = -0.70
  468.  
  469. Yv[ id ] = -0.45
  470. Xv[ id ] = -0.30
  471.  
  472. }
  473. case 1:
  474. {
  475. Ya[ id ] = 0.55
  476. Xa[ id ] = 0.53
  477.  
  478. Xv[ id ] = 0.45
  479. Yv[ id ] = 0.50
  480. }
  481. case 2:
  482. {
  483. Ya[ id ] = -0.35
  484. Xa[ id ] = -0.70
  485.  
  486. Yv[ id ] = -0.20
  487. Xv[ id ] = -0.70
  488. }
  489. case 3:
  490. {
  491. Xv[ id ] = -0.80
  492. Yv[ id ] = -0.90
  493.  
  494. Xa[ id ] = -0.20
  495. Ya[ id ] = -0.90
  496. }
  497. }
  498. }
  499.  
  500. CheckPosition( id, Attacker )
  501. {
  502. switch( get_pcvar_num( pCvar_Bullet_Show_Mode ) )
  503. // [ 0 = CIRCLE ] [ 1 = VERTICAL ] [ 2 = HORIZONTAL ] [ 3 = ARCH OF CIRCLE ]
  504. {
  505. case 0:
  506. {
  507. if( Attacker )
  508. {
  509. switch( Xa[ id ] )
  510. {
  511. case -0.70: // First attack
  512. {
  513. Xa[ id ] = -0.575
  514. Ya[ id ] = -0.60
  515. }
  516. case -0.575: // Second
  517. {
  518. Xa[ id ] = -0.50
  519. Ya[ id ] = -0.625
  520. }
  521. case -0.50: // Third
  522. {
  523. Xa[ id ] = -0.425
  524. Ya[ id ] = -0.60
  525. }
  526. case -0.425: // Fourth
  527. {
  528. Xa[ id ] = -0.30
  529. Ya[ id ] = -0.50
  530. }
  531. case -0.30: // Last
  532. {
  533. Xa[ id ] = -0.70
  534. }
  535. default: iRefreshHudPosition( id )
  536. }
  537. }
  538. else
  539. {
  540. switch( Xv[ id ] )
  541. {
  542. case -0.30: // First attack
  543. {
  544. Xv[ id ] = -0.425
  545. Yv[ id ] = -0.35
  546. }
  547. case -0.425: // Second
  548. {
  549. Xv[ id ] = -0.50
  550. Yv[ id ] = -0.30
  551. }
  552. case -0.50: // Third
  553. {
  554. Xv[ id ] = -0.575
  555. Yv[ id ] = -0.35
  556. }
  557. case -0.575: // fourth
  558. {
  559. Xv[ id ] = -0.70
  560. Yv[ id ] = -0.45
  561. }
  562. case -0.70: // Last
  563. {
  564. Xv[ id ] = -0.30
  565. }
  566. default: iRefreshHudPosition( id )
  567. }
  568. }
  569. }
  570. case 1:
  571. {
  572. if( Attacker )
  573. {
  574. Ya[ id ] += 0.05
  575. if( Ya[ id ] >= 0.90 )
  576. {
  577. Ya[ id ] = 0.55
  578. }
  579. }
  580. else
  581. {
  582. Yv[ id ] += 0.05
  583. if( Yv[ id ] >= 0.85 )
  584. {
  585. Yv[ id ] = 0.50
  586. }
  587. }
  588. }
  589. case 2:
  590. {
  591. if( Attacker )
  592. {
  593. Xa[ id ] += 0.05
  594. if( Xa[ id ] >= -0.35 )
  595. {
  596. Xa[ id ] = -0.70
  597. }
  598. }
  599. else
  600. {
  601. Xa[ id ] += 0.05
  602. if( Xv[ id ] >= -0.35 )
  603. {
  604. Xv[ id ] = -0.70
  605. }
  606. }
  607. }
  608. case 3:
  609. {
  610. if( Attacker )
  611. {
  612. switch( Xa[ id ] )
  613. {
  614. case -0.20: // First attack
  615. {
  616.  
  617. if( Ya[ id ] == -0.20 )
  618. {
  619. Xa[ id ] = -0.20
  620. Ya[ id ] = -0.90
  621. }
  622. else
  623. {
  624. Xa[ id ] = -0.15
  625. Ya[ id ] = -0.80
  626. }
  627. }
  628. case -0.15:
  629. {
  630. switch( Ya[ id ] )
  631. {
  632. case -0.80: Ya[ id ] = -0.70
  633. case -0.70: Ya[ id ] = -0.60
  634. case -0.60: Ya[ id ] = -0.50
  635. case -0.50: Ya[ id ] = -0.40
  636. case -0.40: Ya[ id ] = -0.30
  637. case -0.30:
  638. {
  639. Xa[ id ] = -0.20
  640. Ya[ id ] = -0.20
  641. }
  642. }
  643. }
  644. default: iRefreshHudPosition( id )
  645. }
  646. }
  647. else
  648. {
  649. switch( Xv[ id ] )
  650. {
  651. case -0.80: // First attack
  652. {
  653.  
  654. if( Yv[ id ] == -0.20 )
  655. {
  656. Xv[ id ] = -0.80
  657. Yv[ id ] = -0.90
  658. }
  659. else
  660. {
  661. Xv[ id ] = -0.85
  662. Yv[ id ] = -0.80
  663. }
  664. }
  665. case -0.85:
  666. {
  667. switch( Yv[ id ] )
  668. {
  669. case -0.80: Yv[ id ] = -0.70
  670. case -0.70: Yv[ id ] = -0.60
  671. case -0.60: Yv[ id ] = -0.50
  672. case -0.50: Yv[ id ] = -0.40
  673. case -0.40: Yv[ id ] = -0.30
  674. case -0.30:
  675. {
  676. Xv[ id ] = -0.80
  677. Yv[ id ] = -0.20
  678. }
  679. }
  680. }
  681. default: iRefreshHudPosition( id )
  682. }
  683. }
  684. }
  685. default: iRefreshHudPosition( id )
  686. }
  687. }
  688. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  689. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1036\\ f0\\ fs16 \n\\ par }
  690. */
  691.