Русское сообщество по скриптингу

подсвечивание игроков во время просмотра HLTV демки

Все, что касается игр на движке GoldSrc (Half-Life, Counter-Strike 1.6 и т.д.).
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

подсвечивание игроков во время просмотра HLTV демки

Сообщение mcrc » 14 ноя 2014, 18:59

Привет!
На сервере стоит HLTV, который пишет демки.
Хочу, чтобы при просмотре демки на локальном компе местонахождение игроков подсвечивалось лучами, как в плагине admin_esp_mini:


Как это можно сделать?

P.S.: я знаю, что смотреть демки можно с включенным вх, но хочется именно как в плагине, т.к. вх не всегда срабатывает.
Аватара пользователя
mcrc
 
Сообщения: 9
Зарегистрирован: 12 ноя 2013, 18:50
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6

Re: подсвечивание игроков во время просмотра HLTV демки

Сообщение BROWN » 14 ноя 2014, 19:02

Рисовать траекторию и для показа HLTV, но от позиции администраторов.
Brown_dev
Аватара пользователя
BROWN
 
Сообщения: 986
Зарегистрирован: 25 фев 2012, 23:19
Забанен
Благодарил (а): 39 раз.
Поблагодарили: 411 раз.

Re: подсвечивание игроков во время просмотра HLTV демки

Сообщение mcrc » 14 ноя 2014, 19:28

Не очень вас понял.
Я на комп установил metamod, amxmod и плагин admin_esp_mini.
Запустил демку, но плагин не сработал (хотя на сервере все показывает).
Получается, надо как-то модифицировать исходник плагина?
Если так, то сможете помочь?

[spoiler][pawn]
  1. AMX Mod X - Script

  2. *

  3. *    Admin Spectator ESP v1.4_beta

  4. *    Copyright (C) 2006 by KoST

  5. *

  6. *    this plugin along with its compiled version can de downloaded here:

  7. *    http://forums.alliedmods.net/showthread.php?t=23691

  8. *    

  9. *

  10. *  This program is free software; you can redistribute it and/or

  11. *  modify it under the terms of the GNU General Public License

  12. *  as published by the Free Software Foundation; either version 2

  13. *  of the License, or (at your option) any later version.

  14. *

  15. *  This program is distributed in the hope that it will be useful,

  16. *  but WITHOUT ANY WARRANTY; without even the implied warranty of

  17. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

  18. *  GNU General Public License for more details.

  19. *

  20. *  You should have received a copy of the GNU General Public License

  21. *  along with this program; if not, write to the Free Software

  22. *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

  23. *  or download here: http://www.gnu.org/licenses/gpl.txt

  24. *

  25. *  In addition, as a special exception, the author gives permission to

  26. *  link the code of this program with the Half-Life Game Engine ("HL

  27. *  Engine") and Modified Game Libraries ("MODs") developed by Valve,

  28. *  L.L.C ("Valve"). You must obey the GNU General Public License in all

  29. *  respects for all of the code used other than the HL Engine and MODs

  30. *  from Valve. If you modify this file, you may extend this exception

  31. *  to your version of the file, but you are not obligated to do so. If

  32. *  you do not wish to do so, delete this exception statement from your

  33. *  version.

  34. */

  35. //--------------------------------------------------------------------------------------------------

  36.  

  37. #include <amxmodx>

  38. #include <fakemeta>

  39.  

  40. // Here you can adjust the required admin level if needed


  41.  

  42. #define REQUIRED_ADMIN_LEVEL ADMIN_BAN

  43.  

  44. //--------------------------------------------------------------------------------------------------

  45.  

  46. #define PLUGIN "Admin ESP"

  47. #define VERSION "1.5b_mini"

  48. #define AUTHOR "KoST"

  49.  

  50. #define OFFSET_TEAM            114

  51.  

  52. new const g_szPlugin[] = PLUGIN; // Global this since it is used throughout

  53. new pcvar_esp, pcvar_esp_timer, pcvar_esp_allow_all, pcvar_esp_disable_default_keys;

  54. new team_colors[4][3] = {{0,0,0}, {150,0,0}, {0,0,150}, {0,150,0}};

  55. new esp_colors[5][3] = {{0,255,0}, {100,60,60}, {60,60,100}, {255,0,255}, {128,128,128}};

  56. new bool:admin[33];        // is/is not admin

  57. new bool:first_person[33];    // is/is not in first person view

  58. new bool:ducking[33];        // is/is not player ducked

  59. new bool:mode[33];        // 0 = line, 1 = box

  60. new bool:enabled[33];        // has esp on

  61. new spec[33];            // spec[player_id]=the players id if

  62. new laser;            // precached model

  63. new max_players;        // if you start hlds with +maxplayers 20 for example this would be 20

  64. new damage_done_to[33];        // damage_done_to[p1]=p2 // p1 has hit p2

  65. new view_target[33];        // attackers victim

  66.  

  67. public plugin_precache() {

  68.     laser = precache_model("sprites/laserbeam.spr");

  69. }

  70.  

  71. public plugin_init() {

  72.     register_plugin(g_szPlugin, VERSION, AUTHOR);

  73.     server_print("^n^t%s v%s, Copyright (C) 2006 by %s^n", g_szPlugin, VERSION, AUTHOR);

  74.  

  75.     // cvars

  76.     pcvar_esp = register_cvar("esp", "1");

  77.     pcvar_esp_timer = register_cvar("esp_timer", "0.4");

  78.     pcvar_esp_allow_all = register_cvar("esp_allow_all", "0");

  79.     pcvar_esp_disable_default_keys = register_cvar("esp_disable_default_keys", "0");

  80.     register_cvar("aesp_version", VERSION, FCVAR_SERVER|FCVAR_UNLOGGED|FCVAR_SPONLY);

  81.  

  82.     // client commands

  83.     register_clcmd("esp_mode", "cmd_esp_mode", REQUIRED_ADMIN_LEVEL, "Toggle ESP type: line/box");    

  84.     register_clcmd("say /esp_mode", "cmd_esp_mode", REQUIRED_ADMIN_LEVEL, "Toggle ESP type: line/box");

  85.     register_clcmd("esp_toggle", "cmd_esp_toggle", REQUIRED_ADMIN_LEVEL, "Toggle ESP on/off");

  86.     register_clcmd("say /esp_toggle", "cmd_esp_toggle", REQUIRED_ADMIN_LEVEL, "Toggle ESP on/off");

  87.  

  88.     // events

  89.     register_event("StatusValue", "spec_target", "bd", "1=2");

  90.     register_event("SpecHealth2", "spec_target", "bd");

  91.     register_event("TextMsg", "spec_mode", "b", "2&#Spec_Mode");

  92.     register_event("Damage", "event_Damage", "b", "2!0", "3=0", "4!0");

  93.     register_event("ResetHUD", "reset_hud_alive", "be");

  94.  

  95.     register_forward(FM_PlayerPreThink, "fwdPlayerPreThink");

  96.     max_players = get_maxplayers();

  97.     // start esp_timer for the first time

  98.     set_task(1.0, "esp_timer");

  99. }

  100.  

  101. public client_putinserver(id) {

  102.     first_person[id] = false;

  103.     new args[1];

  104.     args[0] = id;

  105.     set_task(4.0, "delayed_putinserver", id + 100, args, 1);

  106. }

  107.  

  108. public delayed_putinserver(args[0])

  109. {

  110.     new id = args[0];

  111.     if (!is_user_connected(id))

  112.     {

  113.         return PLUGIN_HANDLED;

  114.     }

  115.     if ((get_user_flags(id) & REQUIRED_ADMIN_LEVEL) || get_pcvar_num(pcvar_esp_allow_all) == 1) {

  116.         admin[id] = true;

  117.         init_admin_options(id);

  118.     } else {

  119.         admin[id] = false;

  120.     }

  121.     return PLUGIN_CONTINUE;

  122. }

  123.  

  124. public client_disconnect(id) {

  125.     save2vault(id);

  126.     admin[id] = false;

  127.     spec[id] = 0;

  128.     remove_task(id + 100);

  129. }

  130.  

  131. public reset_hud_alive(id) {

  132.     spec[id] = 0;

  133. }

  134.  

  135. public cmd_esp_toggle(id) {

  136.     if (admin[id] && get_pcvar_num(pcvar_esp) == 1) {

  137.         change_esp_status(id, !enabled[id]);

  138.     }

  139. }

  140.  

  141. public cmd_esp_mode(id) {

  142.     if (admin[id] && get_pcvar_num(pcvar_esp) == 1) {

  143.         change_esp_mode(id, !mode[id]);

  144.     }

  145. }

  146.  

  147. public event_Damage(id) {

  148.     if (id>0) {

  149.         new attacker = get_user_attacker(id)

  150.         if (attacker > 0 && attacker <= max_players) {

  151.             if (view_target[attacker] == id) {

  152.                 damage_done_to[attacker] = id;

  153.             }

  154.         }

  155.     }

  156.     return PLUGIN_CONTINUE;

  157. }

  158.  

  159. public spec_mode(id) {

  160.     // discover if in first_person_view

  161.     new specMode[12]

  162.     read_data(2, specMode, 11);

  163.    

  164.     if(equal(specMode, "#Spec_Mode4")) {

  165.         first_person[id] = true;

  166.     } else {

  167.         first_person[id] = false;

  168.     }

  169.     return PLUGIN_CONTINUE;

  170. }

  171.  

  172. public spec_target(id) {

  173.     if (id > 0) {

  174.         new target = read_data(2);

  175.         if (target != 0) {

  176.             spec[id] = target;

  177.         }

  178.     }

  179.     return PLUGIN_CONTINUE;

  180. }

  181.  

  182. init_admin_options(id) {

  183.     mode[id] = false;

  184.     enabled[id] = true;

  185.     load_vault_data(id);

  186. }

  187.  

  188. save2vault(id) {

  189.     if (admin[id]) {

  190.         new authid[35];

  191.         get_user_authid (id,authid,34);

  192.         new tmp[3];

  193.         tmp[0] = (mode[id]) ? '1' : '0';

  194.         tmp[1] = (enabled[id])  ? '1' : '0';

  195.        

  196.         //server_print("STEAMID: %s OPTIONS: %s", authid, tmp);

  197.         new key[41];

  198.         formatex(key, 40, "AESPmini_%s", authid);

  199.         set_vaultdata(key, tmp);

  200.     }

  201. }

  202.  

  203. load_vault_data(id) {

  204.     if (admin[id]) {

  205.         new data[3];

  206.         new authid[35];

  207.         get_user_authid (id,authid,34);

  208.         new key[41];

  209.         formatex(key,40, "AESPmini_%s", authid);

  210.         get_vaultdata(key,data,2);

  211.         if (strlen(data) > 0) {

  212.             mode[id] = (data[0]=='1');

  213.             enabled[id] = (data[1]=='1');

  214.         }

  215.     }

  216. }

  217.  

  218. change_esp_status(id, bool:on) {

  219.     if (on) {

  220.         enabled[id] = true;

  221.         client_print(id, print_chat, "[%s] ON", g_szPlugin);

  222.     } else {

  223.         enabled[id] = false;

  224.         client_print(id, print_chat, "[%s] OFF", g_szPlugin);

  225.     }

  226. }

  227.  

  228. change_esp_mode(id, bool:on) {

  229.     if (on) {

  230.         mode[id] = true;

  231.         client_print(id, print_chat, "[%s] Mode: Box", g_szPlugin);

  232.     } else {

  233.         mode[id] = false;

  234.         client_print(id, print_chat, "[%s] Mode: Line", g_szPlugin);

  235.     }

  236. }

  237.  

  238.  

  239. public fwdPlayerPreThink(id) {

  240.     if (!is_user_connected(id)) return FMRES_IGNORED;

  241.    

  242.     static button;

  243.     button = pev(id, pev_button);

  244.     if (button==0) return FMRES_IGNORED; // saves a lot of cpu

  245.    

  246.     static oldbutton;

  247.     oldbutton = pev(id, pev_oldbuttons);

  248.    

  249.     if (button & IN_DUCK) {

  250.         ducking[id] = true;

  251.     } else {

  252.         ducking[id] = false;

  253.     }

  254.    

  255.     if ((get_pcvar_num(pcvar_esp) == 1) && (get_pcvar_num(pcvar_esp_disable_default_keys) != 1)) {

  256.         if (admin[id]) {

  257.             if (first_person[id] && !is_user_alive(id)) {

  258.                 if ((button & IN_RELOAD) && !(oldbutton & IN_RELOAD)) {

  259.                     cmd_esp_mode(id);

  260.                 }

  261.                 if ((button & IN_FORWARD)  && !(oldbutton & IN_FORWARD) && !enabled[id]) {

  262.                     change_esp_status(id, true);

  263.                 }

  264.                 if ((button & IN_BACK)  && !(oldbutton & IN_BACK) && enabled[id]) {

  265.                     change_esp_status(id, false);

  266.                 }

  267.             }

  268.         }

  269.     }

  270.     return FMRES_HANDLED;

  271. }

  272.  

  273. public esp_timer() {

  274.    

  275.     if (get_pcvar_num(pcvar_esp) != 1) { // if esp is not 1, it is off

  276.         set_task(1.0, "esp_timer"); // check for reactivation in 1 sec intervals

  277.         return PLUGIN_CONTINUE;

  278.     }

  279.  

  280.     static spec_id, Float:my_origin[3], my_team, s,

  281.     target_team, Float:target_origin[3], Float:distance, width, Float:v_middle[3], Float:v_hitpoint[3],

  282.     Float:distance_to_hitpoint, Float:scaled_bone_len, Float:scaled_bone_width, Float:v_bone_start[3],

  283.     Float:v_bone_end[3], Float:offset_vector[3], Float:eye_level[3], Float:distance_target_hitpoint,

  284.     actual_bright, color

  285.  

  286.     for (new i = 1; i <= max_players; i++) { // loop through players

  287.        

  288.         if (enabled[i] && first_person[i] && is_user_connected(i) && admin[i] && (!is_user_alive(i)) && (spec[i] > 0) && is_user_alive(spec[i])) { // :)

  289.            

  290.             spec_id = spec[i];

  291.             pev(i, pev_origin, my_origin); // get origin of spectating admin

  292.             // get team of spectated :)

  293.             my_team = get_pdata_int(spec_id, OFFSET_TEAM);

  294.            

  295.             for (s = 1; s <= max_players; s++) { // loop through the targets

  296.                 if (is_user_alive(s)) { // target must be alive

  297.                     // get team of target

  298.                     target_team = get_pdata_int(s, OFFSET_TEAM);

  299.                     if (!(target_team == 3)) { //if not spectator

  300.                         if (spec_id != s) { // do not target myself

  301.                             // if the target is in the other team and not spectator

  302.                            

  303.                             if (((my_team != target_team && (target_team == 1 || target_team == 2)) )) {

  304.                                 // get origin of target

  305.                                 pev(s, pev_origin, target_origin);

  306.                                

  307.                                

  308.                                 // get distance from me to target

  309.                                 distance = vector_distance(my_origin, target_origin);

  310.                                

  311.                                 if (!mode[i]) { // Draw LINE?

  312.                                     // calculate width according to distance

  313.                                     width = (distance < 2040.0) ? ( (255 - floatround(distance / 8.0) ) / 3 ) : 1;

  314.  

  315.                                     // create temp_ent

  316.                                     make_TE_BEAMENTPOINT(i, target_origin, width, target_team);

  317.                                 }

  318.  

  319.                                 // get vector from me to target

  320.                                 subVec(target_origin, my_origin, v_middle);

  321.  

  322.                                 // trace from me to target, getting hitpoint

  323.                                 engfunc(EngFunc_TraceLine, my_origin, target_origin, 1, -1, 0);

  324.                                 get_tr2(0, TR_vecEndPos, v_hitpoint);

  325.  

  326.                                 // get distance from me to hitpoint (nearest wall)

  327.                                 distance_to_hitpoint = vector_distance(my_origin, v_hitpoint);

  328.  

  329.                                 // scale

  330.                                 if (ducking[spec_id]) {

  331.                                     scaled_bone_len = distance_to_hitpoint / distance * (50.0-18.0);

  332.                                 } else {

  333.                                     scaled_bone_len = distance_to_hitpoint / distance * 50.0;

  334.                                 }

  335.                                 scaled_bone_len = distance_to_hitpoint / distance * 50.0;

  336.                                 scaled_bone_width = distance_to_hitpoint / distance * 150.0;

  337.  

  338.                                 // get the point 10.0 units away from wall

  339.                                 normalize(v_middle, offset_vector, distance_to_hitpoint - 10.0); // offset from wall

  340.  

  341.                                 // set to eye level

  342.                                 copyVec(my_origin, eye_level);

  343.                                

  344.                                 if (ducking[spec_id]) {

  345.                                     eye_level[2] += 12.3

  346.                                 } else {

  347.                                     eye_level[2] += 17.5

  348.                                 }

  349.  

  350.                                 addVec(offset_vector, eye_level);

  351.  

  352.                                 // start and end of green box

  353.                                 copyVec(offset_vector, v_bone_start);

  354.                                 copyVec(offset_vector, v_bone_end);

  355.                                 v_bone_end[2] -= scaled_bone_len;

  356.  

  357.                                 distance_target_hitpoint = distance - distance_to_hitpoint;

  358.                                 actual_bright = 255;

  359.  

  360.                                 if (mode[i]) { // Draw BOX?

  361.                                     // this is to make green box darker if distance is larger

  362.                                     if (distance_target_hitpoint < 2040.0) {

  363.                                         actual_bright = (255 - floatround(distance_target_hitpoint / 12.0));

  364.                                     } else {

  365.                                         actual_bright = 85;

  366.                                     }    

  367.                                     if (distance_to_hitpoint != distance) { // if no line of sight

  368.                                         color = 0;

  369.                                     } else { // if line of sight

  370.                                         color = target_team;

  371.                                     }

  372.                                     if (damage_done_to[spec_id] == s) {

  373.                                         color = 3;

  374.                                         damage_done_to[spec_id] = 0;

  375.                                     }

  376.                                     make_TE_BEAMPOINTS(i, color, v_bone_start, v_bone_end, floatround(scaled_bone_width), actual_bright);

  377.                                 }

  378.                             }

  379.                         }

  380.                     }

  381.                 }

  382.             } // inner player loop end

  383.         }

  384.     }

  385.     set_task(get_pcvar_float(pcvar_esp_timer), "esp_timer"); // keep it going

  386.     return PLUGIN_CONTINUE;

  387. }

  388.  

  389. // Vector Operations -------------------------------------------------------------------------------

  390.  

  391. Float:getVecLen(Float:Vec[3]) {

  392.     new Float:VecNull[3] = {0.0,0.0,0.0};

  393.     new Float:len = vector_distance(Vec, VecNull);

  394.     return len;

  395. }

  396.  

  397. normalize(Float:Vec[3], Float:Ret[3], Float:multiplier) {

  398.     new Float:len = getVecLen(Vec);

  399.     copyVec(Vec, Ret);

  400.     Ret[0] /= len;

  401.     Ret[1] /= len;

  402.     Ret[2] /= len;

  403.     Ret[0] *= multiplier;

  404.     Ret[1] *= multiplier;

  405.     Ret[2] *= multiplier;

  406. }

  407.  

  408. copyVec(Float:Vec[3], Float:Ret[3]) {

  409.     Ret[0] = Vec[0];

  410.     Ret[1] = Vec[1];

  411.     Ret[2] = Vec[2];

  412. }

  413.  

  414. subVec(Float:Vec1[3], Float:Vec2[3], Float:Ret[3]) {

  415.     Ret[0] = Vec1[0] - Vec2[0];

  416.     Ret[1] = Vec1[1] - Vec2[1];

  417.     Ret[2] = Vec1[2] - Vec2[2];

  418. }

  419.  

  420. addVec(Float:Vec1[3], Float:Vec2[3]) {

  421.     Vec1[0] += Vec2[0];

  422.     Vec1[1] += Vec2[1];

  423.     Vec1[2] += Vec2[2];

  424. }

  425.  

  426. // Temporary Entities ------------------------------------------------------------------------------

  427. // there is a list of much more temp entities at: Вы должны зарегистрироваться, чтобы видеть ссылки. ... &id=290870

  428. // all messages are sent with MSG_ONE_UNRELIABLE flag to avoid overflow in case of very low esp_timer setting and much targets

  429.  

  430. make_TE_BEAMPOINTS(id,color, Float:Vec1[3], Float:Vec2[3], width, brightness) {

  431.     message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, {0,0,0}, id); //message begin

  432.     write_byte(0);

  433.     write_coord(floatround(Vec1[0])); // start position

  434.     write_coord(floatround(Vec1[1]));

  435.     write_coord(floatround(Vec1[2]));

  436.     write_coord(floatround(Vec2[0])); // end position

  437.     write_coord(floatround(Vec2[1]));

  438.     write_coord(floatround(Vec2[2]));

  439.     write_short(laser); // sprite index

  440.     write_byte(3); // starting frame

  441.     write_byte(0); // frame rate in 0.1's

  442.     write_byte(floatround(get_pcvar_float(pcvar_esp_timer) * 10)); // life in 0.1's

  443.     write_byte(width); // line width in 0.1's

  444.     write_byte(0); // noise amplitude in 0.01's

  445.     write_byte(esp_colors[color][0]);

  446.     write_byte(esp_colors[color][1]);

  447.     write_byte(esp_colors[color][2]);

  448.     write_byte(brightness); // brightness)

  449.     write_byte(0); // scroll speed in 0.1's

  450.     message_end();

  451. }

  452.  

  453. make_TE_BEAMENTPOINT(id, Float:target_origin[3], width, target_team) {

  454.     message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, {0,0,0}, id);

  455.     write_byte(1);

  456.     write_short(id);

  457.     write_coord(floatround(target_origin[0]));

  458.     write_coord(floatround(target_origin[1]));

  459.     write_coord(floatround(target_origin[2]));

  460.     write_short(laser);

  461.     write_byte(1);        

  462.     write_byte(1);

  463.     write_byte(floatround(get_pcvar_float(pcvar_esp_timer) * 10));

  464.     write_byte(width);

  465.     write_byte(0);

  466.     write_byte(team_colors[target_team][0]);

  467.     write_byte(team_colors[target_team][1]);

  468.     write_byte(team_colors[target_team][2]);

  469.     write_byte(255);

  470.     write_byte(0);

  471.     message_end();

  472. }

  473. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE

  474. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }

  475. */
[/pawn][/spoiler]
Аватара пользователя
mcrc
 
Сообщения: 9
Зарегистрирован: 12 ноя 2013, 18:50
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6

Re: подсвечивание игроков во время просмотра HLTV демки

Сообщение BROWN » 14 ноя 2014, 19:59

mcrc, к сожалению, сейчас нет на это времени, может быть завтра, если никто не поможет.
Brown_dev
Аватара пользователя
BROWN
 
Сообщения: 986
Зарегистрирован: 25 фев 2012, 23:19
Забанен
Благодарил (а): 39 раз.
Поблагодарили: 411 раз.

Re: подсвечивание игроков во время просмотра HLTV демки

Сообщение 9iky6 » 15 ноя 2014, 07:28

mcrc, гуглите клиентское ESP. HLTV смотрится не на сервере, а на клиенте, так что куда Вы собрались ставить плагин я не понимаю. Если только в самой игре смотреть за игрой через HLTV?
Аватара пользователя
9iky6
 
Сообщения: 2174
Зарегистрирован: 30 янв 2012, 19:07
Откуда: Россия
Благодарил (а): 375 раз.
Поблагодарили: 707 раз.


Вернуться в Вопросы по играм на движке GoldSrc

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4