Показаны результаты для тегов 'sourcemod'. - Моддинг Игр и Серверов Перейти к содержанию
Гость

Поиск сообщества

Показаны результаты для тегов 'sourcemod'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип контента


Форумы

  • Общее
    • Новости Сайта
    • Общение
    • Помощь по игровым серверам
    • Поиск плагинов/файлов
  • По играм
    • Counter-Strike 2
    • Counter-Strike: Global Offensive
    • Team Fortress 2
    • Left 4 Dead (1/2)
    • Grand Theft Auto V
    • Minecraft
    • S&box
    • Dota 2
    • Terraria
    • Half-Life 2:Deathmatch
    • GTA: SAMP
    • Counter-Strike: Source
    • Counter-Strike
    • Rust
    • PLAYERUNKNOWN'S BATTLEGROUNDS
    • Warface
    • Half-Life: Alyx
    • World Of Tanks
  • Архив/Корзина
    • Устаревшие Статьи
    • Steam
    • Новости из мира игровой индустрии
    • Халява

Категории

  • Counter-Strike 2
    • Плагины/моды
    • Карты
    • Скины / Модели
  • Team Fortress 2
    • Скины / Модели
    • Карты
  • Left 4 Dead (1/2)
    • Скины / Модели
  • Sourcemod плагины
    • CS:GO
    • Left 4 Dead
    • Team Fortress 2
    • Half-Life 2: Deathmatch
    • Counter-Strike 2
  • Counter-Strike: Global Offensive
    • Скины / Модели
    • Сборки / Готовые Сервера CS:GO
    • Карты
    • Разное
  • Half-Life 2:Deathmatch
    • Скины / Модели
    • Карты
  • Counter-Strike
    • Готовые сервера
  • Rust
    • Плагины Umod (Oxide)
  • World Of Tanks
    • Моды для World Of Tanks
    • Прицелы
    • Шкурки / Зоны пробития
    • Ангары
  • Dota 2
    • Скины/Модели
    • Разное
  • Minecraft
    • Плагины
    • Скины
    • Карты

Поиск результатов в...

Поиск контента, содержащего...


Дата создания

  • Начало

    Конец


Дата обновления

  • Начало

    Конец


Фильтр по количеству...

Регистрация

  • Начало

    Конец


Группа


О себе

  1. Версия 1.4

    81 раз скачали

    Плагин - ядро, основа без которого не будут работать некоторые плагины использующие нестандартные скины (модели) игроков. Например, как этот плагин: Данное ядро помогает корректно связать нестандартную модельку со "скелетом" игрока. Информация для разработчиков, из файла CustomPlayersSkins.inc: //Custom Player Skins include file #if defined _CustomPlayerSkins_included #endinput #endif #define _CustomPlayerSkins_included #define CPS_NOFLAGS 0 #define CPS_RENDER (1 << 0) //Does not make the model invisible. (useful for glows) (used on RemoveSkin it will not force the player's render back to Normal.) #define CPS_NOATTACHMENT (1 << 1) //Does not 'SetParentAttachment' variant. (Useful for non-bone merging) #define CPS_IGNOREDEATH (1 << 2) //This will prevent the removal of the skin on death. #define CPS_TRANSMIT (1 << 3) //This will ignore the hook for Transmit /** * Sets the client's skin from the given path. * * @param client Client index * @param model User input for model path * @param flags flags are used to determine what this function does and does not do. * @return The skin entity index * @error Invalid client. */ native int CPS_SetSkin(int client, char[] model, int flags = CPS_NOFLAGS); /** * Gets the client's skin entity reference. * * @param client Client index * @return Returns the entity reference of the player's skin, INVALID_ENT_REFERENCE if there is no skin. * @error Invalid client. */ native int CPS_GetSkin(int client); /** * Simple check if the client already has a skin. * * @param client Client index * @return Returns if the client has a skin currently. (will not check if the player is alive, etc.) * @error Invalid client. */ native bool CPS_HasSkin(int client); /** * Removes and resets the player and their skin. * * @param client Client index * @noreturn * @error Invalid client. */ native void CPS_RemoveSkin(int client, int flags = CPS_NOFLAGS); /** * Sets the client's transmit variable (see below) * NOTE: Check if the player is between 0 and MAXPLAYERS. * * @param owner Client index of the skin's owner * @param client Client index of the player that will see the skin. * @param transmit 0 - Do not transmit at all. 1 - Transmit only if other cases pass. 2 - Override other checks. * @noreturn * @error Invalid client. */ native void CPS_SetTransmit(int owner, int client, int transmit); /** * Simple native to return the skin's flags * NOTE: Check if the player is between 0 and MAXPLAYERS. * * @param client Client index * @return Returns the client index's skin flags. */ native CPS_GetFlags(client); public SharedPlugin:__pl_CustomPlayerSkins = { name = "CustomPlayerSkins", file = "CustomPlayerSkins.smx", #if defined REQUIRE_PLUGIN required = 1, #else required = 0, #endif }; #if !defined REQUIRE_PLUGIN public __pl_CustomPlayerSkins_SetNTVOptional() { MarkNativeAsOptional("CPS_SetSkin"); MarkNativeAsOptional("CPS_GetSkin"); MarkNativeAsOptional("CPS_HasSkin"); MarkNativeAsOptional("CPS_RemoveSkin"); MarkNativeAsOptional("CPS_SetTransmit"); MarkNativeAsOptional("CPS_GetFlags"); } #endif
    Бесплатный
  2. Версия 1.0.0

    59 раз скачали

    Sourcemod плагин для сервера cs:go. Автоматический каждые 5 секунд удаляет куриц с карты (т.к они имеют свойство возрождаться).
    Бесплатный
  3. Версия 1.0.0

    67 раз скачали

    На некоторых картах (например deathrun или surf) бывает не выдается нож. Плагин исправляет это и всегда выдает всем игрокам ножи при возрождении.
    Бесплатный
  4. Версия 1.0.0

    39 раз скачали

    Часто из за конфликтов плагинов и тд бывает ситуация когда в конфиге (том же server.cfg ) вы прописываете настройки, но в итоге они слетают на стандартные значения. Данный плагин исправляет этот баг. Значения прописывать в конфиг файле по пути: sourcemod/configs/cvarenf.cfg
    Бесплатный
  5. Версия 0.1.0

    59 раз скачали

    Плагин позволяет организовать детматч режим с одним оружием для всех.Оружие можно настроить. Функции: Автоматическое возрождение Автовыдача оружия Бронь и ХП при спауне Отключение урона от падения Режим ноузум (NoScope) Бесконечные патроны Автоудаление оружия Настройки: sm_deathmatch_primary - Основное оружие (Default: weapon_awp) sm_deathmatch_secondary - Второстепенное оружие (Default: weapon_revolver) sm_deathmatch_blockdrop -Запретить ли выбрасывать оружие ? (1 = да, 0 = нет)(Default: 1) sm_deathmatch_noscope - Режим NoScope (ноузум) включен? (1 = да, 0 = нет)(Default: 0) sm_deathmatch_health - ХП игрока при возрождении (Default: 100) sm_deathmatch_armor - Бронь игрока при возрождении (Default: 0) sm_deathmatch_respawn_time - Время между смертью игрока и его возрождением (Default: 3.0)
    Бесплатный
  6. Версия 1.2

    38 раз скачали

    Плагин позволяет админам создавать на сервере футбольный мяч со своей физикой,которую можно настроить. Это актуально для многих серверов.В частности для таких как Jailbreak, MiniGame, CS:GO Football - там где физика вшитого в карту мяча оставляет желать лучшего. Нажав клавишу E (действие) мяч можно тащить.Если атаковать (ударить,выстрелить) в игрока который несет мяч - он его уронит. Админ меню управления мячем вызывается командой !ball Видео демонстрация: Настройки: Настройки мяча вшиты в сам плагин.Для их изменения потребуется отредактировать и скомпилировать плагин. Сами настройки в плагине выглядят следующим образом: // *** // only modify if you know what you're doing #define BALL_ENTITY_NAME "simpleball" #define BALL_CFG_FILE "configs/ballspawns.cfg" #define BALL_PLAYER_DISTANCE 55.0 #define BALL_KICK_DISTANCE 55.0 #define BALL_KICK_POWER 600.0 #define BALL_HOLD_HEIGHT 15 #define BALL_KICK_HEIGHT_ADDITION 25 #define BALL_RADIUS 16.0 #define BALL_AUTO_RESPAWN 35.0 #define BALL_ADMIN_MENU_FLAG ADMFLAG_BAN // thanks. // *** Модель мяча и звуки вы найдете в архиве с плагином.
    Бесплатный
  7. Версия 1.0.0

    70 раз скачали

    После смерти игрока, если у него были гранаты - они взрываются. Но так же можно настроить что если даже у игрока не было гранат - после смерти они все ровно могут выпадать и взрываться у всех игроков. Настройки: sm_martyrdom_enabled (default: 1) [bool] (0/1) - включает и отключает плагин sm_martyrdom_always (default: 0) [bool] (0/1) - гранаты появляются и взрываются у всех игроков? sm_martyrdom_consume_grenade (default: 1) [bool] (0/1) - превращать любые гранаты во взрывные?
    Бесплатный
  8. Версия 1.0.1

    66 раз скачали

    Плагин позволяет рандомно создавать вещи на карте (оружие,пропы и тд). Хорошо подойдет для Zombie или TTT сервера в CS:GO Для работы этого плагина потребуется основа: Команды: sm_esspawn - Создает предметы на карте sm_esclear - Удаляет все предметы на карте,которые были созданы этим плагином sm_esreload - Перезагружает entities.cfg Настройки: entityspawner_nav_areas_required - сколько должно быть NavArea на карте, чтобы создавать предметы entityspawner_spawn_limit - лимит ентитей, после которого плагин прекращает создавать новые Видео: Пример конфига предметов для создания: ///////////////////////////////////////////////////////////////////////////////////////////////////////// // INFO // // The config is read from top to bottom, so maps put further up // the config will be prioritized // // Example: // - de_dust2 // - de_ // // If the map is dust2, the spawns for that section will be read. // If the map is nuke, the spawns for "de_" section will be read. // // MAP KEYS: // "spawnroundstart" "<number>" - 0 will disable entity spawning on round start // - 1 will enable entity spawning on round start // // "maxroundspawns" "<number>" - Amount of rounds entities will spawn // - 0 will spawn entities every round // // "spawninterval" "<number>" - Amount of seconds until entities should spawn again // - 0 will disable // // "resettimer" "<0/1>" - Should the spawn timer be reset on round start or transfer over rounds // // // ENTITY KEYS: // "classname" "<string>" - The classname of the entity you want to spawn // - List of CSGO specific entities can be found here: [url]https://developer.valvesoftware.com/wiki/List_of_Counter-Strike:_Global_Offensive_Entities[/url] // // "keyvalue<number>" "<key> <value>" - Enter a keyvalue for a entity, this is optional // - If you need to set multiple keyvalues, just increment the number after the key // Example: // - "keyvalue0" "model modelpath/modelname.mdl" // - "keyvalue1" "modelscale 5.0" // // "prop<number>" "<prop> <value>" - Enter a value for an entity property, this is optional // - If you need to set multiple props, just increment the number after the key // Example: // - "prop0" "m_iHealth 2" // - "prop1" "m_vecOrigin 50.0 24.5 36.0" // - "prop2" "m_iszName hehehehe" // // "maxspawns" "<number"> - Max amount of times this entity could be spawned per round. // However, it does not guarantee that it will spawn this amount of times. // // "zoffset" "<decimal>" - If the terrain is very uneven like dust2, increase this value a bit (5.0 - 10.0) // and you might see an increase of spawns. // - The reason for this key is because everytime a prop is spawned, it makes sure // that the prop fits around the area its spawned. // - Increasing this value will make the prop spawn higher above the ground // // "slopes" "<0/1>" - Can this entity spawn on slopes or only flat surfaces // //////////////////////////////////////////////////////////////////////////////////////////////////////////// // This stock config will spawn AWPS/Breakable crates/Chickens on maps that start with "de_" or "cs_" "entities" { "de_" { "spawnroundstart" "1" "maxroundspawns" "0" "spawninterval" "0" "resettimer" "1" "AWP" { "classname" "weapon_awp" "maxspawns" "20" "zoffset" "10.0" "slopes" "1" } "Breakable Crate" { "classname" "prop_physics_override" "keyvalue0" "model models/props_junk/wood_crate001a.mdl" "prop0" "m_takedamage 2" "maxspawns" "50" "zoffset" "10.0" "slopes" "1" } "Chicken Medium" { "classname" "chicken" "maxspawns" "20" "zoffset" "5.0" "slopes" "1" } } "cs_" { "spawnroundstart" "1" "maxroundspawns" "0" "spawninterval" "0" "resettimer" "1" "AWP" { "classname" "weapon_awp" "maxspawns" "20" "zoffset" "10.0" "slopes" "1" } "Breakable Crate" { "classname" "prop_physics_override" "keyvalue0" "model models/props_junk/wood_crate001a.mdl" "prop0" "m_takedamage 2" "maxspawns" "50" "zoffset" "10.0" "slopes" "1" } "Chicken Medium" { "classname" "chicken" "maxspawns" "20" "zoffset" "5.0" "slopes" "1" } } } Разработчикам: #if defined _entityspawner_included #endinput #endif #define _entityspawner_included #define ES_PREFIX " \x09[\x04ES\x09]" #define ES_MAX_ENTITIES 256 #define ES_INVALID_MAX_SPAWNS 0 #define ES_INVALID_SPAWN_INTERVAL 0 #define ES_INVALID_PROP_SEND_OFFSET -1 #define ES_INVALID_PROP_DATA_OFFSET -1 /** * Spawns random entities on the map (Set in entityspawner.cfg) * @return int amount of entities spawned */ native int ES_SpawnEntities(); /** * Clears all randomly spawned entities * @return int amount of entities removed */ native int ES_ClearEntities(); /** * Returns true if spawning is enabled on round start * @return bool are entities spawning on round start */ native bool ES_IsSpawningOnRoundStart(); /** * Returns true if theres enough nav areas (Set by convar) and if config is setup for current map * @return bool enough nav areas/config setup */ native bool ES_IsRandomSpawnsEnabled(); /** * Called when entities are randomly spawned across the map * @param entities that spawned (Entity references) * @param amount of entities spawned * @noreturn */ forward void ES_OnEntitiesSpawned(int entities[ES_MAX_ENTITIES], int entCount); /** * Called when all randomly spawned entities are removed * @param amount of entities removed * @noreturn */ forward void ES_OnEntitiesCleared(int entCount); public SharedPlugin __pl_entityspawner = { name = "entityspawner", file = "entityspawner.smx", #if defined REQUIRE_PLUGIN required = 1 #else required = 0 #endif }; #if !defined REQUIRE_PLUGIN public __pl_entityspawner_SetNTVOptional() { MarkNativeAsOptional("ES_SpawnEntities"); MarkNativeAsOptional("ES_ClearEntities"); MarkNativeAsOptional("ES_IsSpawningOnRoundStart"); MarkNativeAsOptional("ES_IsRandomSpawnsEnabled"); } #endif
    Бесплатный
  9. Версия 1.02

    36 раз скачали

    Плагин, в основном, для разработчиков работающих над созданием карт для CS:GO. Помогает определять NavArea на карте и визуализировать их. Команды: sm_naucount - Показывает количество nav area на карте sm_nauarea - Визуализирует NavArea (sm_nauarea <navareaindex(optional)> <showneighbours(0-1)> Для разработчиков: #if defined _navareautilities_included #endinput #endif #define _navareautilities_included #define NAU_PREFIX " \x09[\x04Nav UTIL\x09]" #define NAU_GAMEDATA "navareautilities.gamedata" #define NAU_VERSION "1.02" #define NAU_NAVAREA_PARENT 0x7C #define NAU_NAVAREA_SOUTH_NAV_CONNECT_VECTOR 0x5C #define NAU_NAVAREA_LADDER_INDICATOR 0x34 #define NAU_NAVAREA_LADDER_HEIGHT 0x18 #define NAU_NAVAREA_LADDER_WIDTH 0x1C #define NAU_NAVAREA_LADDER_NAVAREAS 0x20 enum NavDirType { NAVDIR_SOUTH = 0, NAVDIR_EAST = 1, NAVDIR_NORTH = 2, NAVDIR_WEST = 3, NAVDIR_UP = 4, NAVDIR_DOWN = 5, NAVDIR_MAX } enum NavLadderDestination { NAVLADDER_TOP_FORWARD = 0, NAVLADDER_TOP_LEFT = 1, NAVLADDER_TOP_RIGHT = 2, NAVLADDER_TOP_BEHIND = 3, NAVLADDER_BOTTOM = 4, NAVLADDER_MAX } /** * Returns amount of nav areas * @return int amount of nav areas */ native int NAU_GetNavAreaCount(); /** * Returns an address of a navareaindex * @return address address of nav area */ native CNavArea NAU_GetNavAreaAddressByIndex(int navAreaIndex); /** * Called when nav areas are loaded by plugin (OnMapStart) * @param amount of nav areas found * @noreturn */ forward void NAU_OnNavAreasLoaded(); methodmap CNavArea { /** * Returns the north west corner of the nav area * @param buffer to store the position * @return void */ public void GetNorthWestCorner(float result[3]) { result[0] = view_as<float>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(4), NumberType_Int32)); result[1] = view_as<float>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(8), NumberType_Int32)); result[2] = view_as<float>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(12), NumberType_Int32)); } /** * Returns the south east corner of the nav area * @param buffer to store the position * @return void */ public void GetSouthEastCorner(float result[3]) { result[0] = view_as<float>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(16), NumberType_Int32)); result[1] = view_as<float>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(20), NumberType_Int32)); result[2] = view_as<float>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(24), NumberType_Int32)); } /** * Get the parent nav area * @return address address of the parent nav area */ public CNavArea GetParent() { Address navParent = view_as<Address>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(NAU_NAVAREA_PARENT), NumberType_Int32)); return view_as<CNavArea>(LoadFromAddress(navParent, NumberType_Int32)); } /** * Get the amount of nav areas in direction * @param direction * @return int Amount of neighbours in direction */ public int GetNeighbourCount(NavDirType direction) { Address navConnectVector = view_as<Address>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(NAU_NAVAREA_SOUTH_NAV_CONNECT_VECTOR + (0x4 * view_as<int>(direction))), NumberType_Int32)); return LoadFromAddress(navConnectVector, NumberType_Int32); } /** * Get address of a neighbour nav area * @param direction * @param neighbour index * @return address address of the neighbour nav area */ public CNavArea GetNeighbour(NavDirType direction, int directionListIndex) { Address navConnectVector = view_as<Address>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(NAU_NAVAREA_SOUTH_NAV_CONNECT_VECTOR + (0x4 * view_as<int>(direction))), NumberType_Int32)); return view_as<CNavArea>(LoadFromAddress(navConnectVector + view_as<Address>(0x4 + (0x8 * view_as<int>(directionListIndex))), NumberType_Int32)); } /** * Hacky way to find out if the nav area a CNavLadder or CNavArea * @return bool if ladder area or not */ public bool IsNavLadder() { int hack = view_as<int>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(NAU_NAVAREA_LADDER_INDICATOR), NumberType_Int32)); return hack == -1; } public bool IsNullPointer() { return view_as<Address>(this) <= Address_Null; } /** * Returns the center position of the nav area * @param buffer to store the position * @return void */ public void GetCenter(float result[3]) { float nwCorner[3], seCorner[3]; this.GetNorthWestCorner(nwCorner); this.GetSouthEastCorner(seCorner); NAU_GetMiddleOfABox(nwCorner, seCorner, result); } /** * Returns wether or not the entity has larger X/Y values than the nav area * @param entity index * @return bool can entity fit in nav area */ public bool CanEntityFit(int entity) { float mid[3], vMins[3], vMaxs[3]; GetEntPropVector(entity, Prop_Data, "m_vecMins", vMins); GetEntPropVector(entity, Prop_Data, "m_vecMaxs", vMaxs); mid[0] /= 2.0; mid[1] /= 2.0; mid[2] /= 2.0; if(mid[0] < 0.0) mid[0] *= -1; if(mid[1] < 0.0) mid[1] *= -1; if(mid[2] < 0.0) mid[2] *= -1; float nwCorner[3], seCorner[3], navAreaMid[3]; this.GetNorthWestCorner(nwCorner); this.GetSouthEastCorner(seCorner); MakeVectorFromPoints(seCorner, nwCorner, navAreaMid); navAreaMid[0] /= 2.0; navAreaMid[1] /= 2.0; navAreaMid[2] /= 2.0; if(navAreaMid[0] < 0.0) navAreaMid[0] *= -1; if(navAreaMid[1] < 0.0) navAreaMid[1] *= -1; if(navAreaMid[2] < 0.0) navAreaMid[2] *= -1; return (mid[0] <= navAreaMid[0] && mid[1] <= navAreaMid[1]); } /** * Returns wether or not the entity has larger X/Y values than the nav area * @param Mins of box * @param Maxs of box * @return bool can entity fit in nav area */ public bool CanFit(float vMins[3], float vMaxs[3]) { float mid[3]; MakeVectorFromPoints(vMins, vMaxs, mid); mid[0] /= 2.0; mid[1] /= 2.0; if(mid[0] < 0.0) mid[0] *= -1; if(mid[1] < 0.0) mid[1] *= -1; float nwCorner[3], seCorner[3], navAreaMid[3]; this.GetNorthWestCorner(nwCorner); this.GetSouthEastCorner(seCorner); MakeVectorFromPoints(seCorner, nwCorner, navAreaMid); navAreaMid[0] /= 2.0; navAreaMid[1] /= 2.0; if(navAreaMid[0] < 0.0) navAreaMid[0] *= -1; if(navAreaMid[1] < 0.0) navAreaMid[1] *= -1; return (mid[0] <= navAreaMid[0] && mid[1] <= navAreaMid[1]); } /** * Get a random position within a nav area, returns false if the mins/maxs are bigger than the area * @param Mins of entity you want to fit in the area * @param Maxs of entity you want to fit in the area * @param buffer to store the position * @return bool can entity fit in nav area */ public bool GetRandomPos(float vMins[3], float vMaxs[3], float result[3]) { // To stop random crashes if someone were to do stuff on a navladder if(this.IsNavLadder()) return false; bool returnVal = true; float mid[3]; MakeVectorFromPoints(vMins, vMaxs, mid); mid[0] /= 2.0; mid[1] /= 2.0; if(mid[0] < 0.0) mid[0] *= -1; if(mid[1] < 0.0) mid[1] *= -1; float nwCorner[3], seCorner[3], navAreaMid[3]; this.GetNorthWestCorner(nwCorner); this.GetSouthEastCorner(seCorner); MakeVectorFromPoints(seCorner, nwCorner, navAreaMid); navAreaMid[0] /= 2.0; navAreaMid[1] /= 2.0; if(navAreaMid[0] < 0.0) navAreaMid[0] *= -1; if(navAreaMid[1] < 0.0) navAreaMid[1] *= -1; if(mid[0] > navAreaMid[0] || mid[1] > navAreaMid[1]) returnVal = false; // Add/Subtract half of the size to the random pos (To make the entity fit properly) result[0] = GetRandomFloat(nwCorner[0] + mid[0], seCorner[0] - mid[0]); result[1] = GetRandomFloat(nwCorner[1] + mid[1], seCorner[1] - mid[1]); // Set the position to the highest point (TODO: Add function to calculate the height of the slope at a certain point of the plane) result[2] = seCorner[2]; return returnVal; } /** * Get the difference in Z positions of the nav area (Used to check if its a slope or not, returns 0 if plane surface) * @return float Z position difference */ public float GetZDifference() { float nwCorner[3], seCorner[3]; this.GetNorthWestCorner(nwCorner); this.GetSouthEastCorner(seCorner); return seCorner[2] - nwCorner[2]; } } methodmap CNavLadder < CNavArea { /** * Get the top left position of the nav ladder area * @param buffer to store the position * @return void */ public void GetTop(float result[3]) { result[0] = view_as<float>(LoadFromAddress(view_as<Address>(this), NumberType_Int32)); result[1] = view_as<float>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(4), NumberType_Int32)); result[2] = view_as<float>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(8), NumberType_Int32)); } /** * Get the bottom right position of the nav ladder area * @param buffer to store the position * @return void */ public void GetBottom(float result[3]) { result[0] = view_as<float>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(12), NumberType_Int32)); result[1] = view_as<float>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(16), NumberType_Int32)); result[2] = view_as<float>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(20), NumberType_Int32)); } /** * Get the height of the ladder * @return float height of ladder */ public float GetHeight() { return view_as<float>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(NAU_NAVAREA_LADDER_HEIGHT), NumberType_Int32)); } /** * Get the width of the ladder * @return float width of ladder */ public float GetWidth() { return view_as<float>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(NAU_NAVAREA_LADDER_WIDTH), NumberType_Int32)); } /** * Get address of a destination nav area from a ladder (check NavLadderDestination) * @param ladder destination * @return address address of the destination nav area (Address_Null if invalid navarea) */ public CNavArea GetDestinationNavArea(NavLadderDestination destination) { return view_as<CNavArea>(LoadFromAddress(view_as<Address>(this) + view_as<Address>(NAU_NAVAREA_LADDER_NAVAREAS + (0x4 * view_as<int>(destination))), NumberType_Int32)); } /** * Get the center position of the nav ladder area * @param buffer to store the position * @return void */ public void GetCenter(float result[3]) { float nwCorner[3], seCorner[3]; this.GetTop(nwCorner); this.GetBottom(seCorner); NAU_GetMiddleOfABox(nwCorner, seCorner, result); } } /** * Get closes neighbour nav area (By checking their center positions) * @param address of the nav area to check * @param a position to check which nav area is closest * @return address address of the closest neighbour area */ public CNavArea NAU_GetClosestNavAreaNeighbour(CNavArea navArea, float pos[3]) { CNavArea closestNavArea = navArea; float startPos[3]; //GetNavAreaCenter(navAreaAddress, startPos); if(!closestNavArea.IsNavLadder()) closestNavArea.GetCenter(startPos); else { CNavLadder ladder = view_as<CNavLadder>(closestNavArea); ladder.GetCenter(startPos); } float closestDistance = GetVectorDistance(pos, startPos, true); bool gotfirst = false; if(navArea.IsNavLadder()) { ArrayList ladderDestinations = new ArrayList(); for (int i = 0; i < view_as<int>(NAVLADDER_MAX); i++) { CNavLadder ladder = view_as<CNavLadder>(navArea); CNavArea destination = ladder.GetDestinationNavArea(view_as<NavLadderDestination>(i)); if(!destination.IsNullPointer()) ladderDestinations.Push(destination); } CNavArea destination = ladderDestinations.Get(GetRandomInt(0, ladderDestinations.Length - 1)); float navPos[3]; if(!destination.IsNavLadder()) destination.GetCenter(navPos); else { CNavLadder ladder = view_as<CNavLadder>(destination); ladder.GetCenter(navPos); } closestNavArea = destination; delete ladderDestinations; } else { for (int i = 0; i < view_as<int>(NAVDIR_MAX); i++) { int neighbourCount = navArea.GetNeighbourCount(view_as<NavDirType>(i)); for (int j = 0; j < neighbourCount; j++) { CNavArea neighbour = navArea.GetNeighbour(view_as<NavDirType>(i), j); float navPos[3]; //GetNavAreaCenter(neighbour, navPos); if(!closestNavArea.IsNavLadder()) neighbour.GetCenter(navPos); else { CNavLadder ladder = view_as<CNavLadder>(neighbour); ladder.GetCenter(navPos); } float dist = 0.0; if((dist = GetVectorDistance(navPos, pos, true)) < closestDistance || !gotfirst) { closestNavArea = neighbour; closestDistance = dist; gotfirst = true; } } } } return closestNavArea; } public void NAU_DebugNavArea(int client, CNavArea navArea, int laserModelIndex) { float navAreaNW[3], navAreaSE[3], center[3]; if(!navArea.IsNavLadder()) { navArea.GetNorthWestCorner(navAreaNW); navArea.GetSouthEastCorner(navAreaSE); navArea.GetCenter(center); } else { CNavLadder ladder = view_as<CNavLadder>(navArea); ladder.GetTop(navAreaNW); ladder.GetBottom(navAreaSE); ladder.GetCenter(center); } if(client > 0 && client <= MaxClients && IsClientInGame(client)) { NAU_PrintVector(client, "North West: ", navAreaNW); NAU_PrintVector(client, "South East: ", navAreaSE); NAU_PrintVector(client, "Center: ", center); } NAU_SendBox(navAreaSE, navAreaNW, laserModelIndex, { 255, 0, 0, 255 }, 5.0); } public void NAU_DebugNavAreaNeighbours(int client, CNavArea navArea, int laserModelIndex) { if(navArea.IsNavLadder()) { for (int i = 0; i < view_as<int>(NAVLADDER_MAX); i++) { CNavLadder ladder = view_as<CNavLadder>(navArea); CNavArea destination = ladder.GetDestinationNavArea(view_as<NavLadderDestination>(i)); NAU_DebugNavArea(client, destination, laserModelIndex); } } else { for (int i = 0; i < view_as<int>(NAVDIR_MAX); i++) { int neighbourCount = navArea.GetNeighbourCount(view_as<NavDirType>(i)); for (int j = 0; j < neighbourCount; j++) { CNavArea neighbour = navArea.GetNeighbour(view_as<NavDirType>(i), j); NAU_DebugNavArea(client, neighbour, laserModelIndex); } } } } /** * Get the address of the clients last known nav area (Private hidden variable: offset 0x8D8 as of 7/31/2018) * @param client index * @return address address of the last known nav area (Address_Null if player has no last known nav area) */ public CNavArea NAU_GetClientLastKnownNavArea(int client) { // Make shit break less return view_as<CNavArea>(GetEntData(client, FindSendPropInfo("CBaseCombatCharacter", "m_nRelativeDirectionOfLastInjury") + 0x8)); } public void NAU_Initialize(Address& navCount, Address& navAreas) { Handle hConf = LoadGameConfigFile(NAU_GAMEDATA); navCount = GameConfGetAddress(hConf, "navarea_count"); #if defined DEBUG PrintToServer("Found \"navarea_count\" @ 0x%X", navCount); #endif navAreas = view_as<Address>(LoadFromAddress(navCount + view_as<Address>(0x4), NumberType_Int32)); #if defined DEBUG PrintToServer("Found \"TheNavAreas\" @ 0x%X", navAreas); #endif delete hConf; #if defined DEBUG int navAreaCount = NAU_GetNavAreaCount(); PrintToServer("Nav area count: %d", navAreaCount); #endif } public void NAU_GetMiddleOfABox(const float vec1[3], const float vec2[3], float result[3]) { float mid[3]; MakeVectorFromPoints(vec1, vec2, mid); mid[0] /= 2.0; mid[1] /= 2.0; mid[2] /= 2.0; AddVectors(vec1, mid, result); } public bool NAU_IsPositionBlocked(float pos[3], float vMins[3], float vMaxs[3]) { Handle ray = TR_TraceHullFilterEx(pos, pos, vMins, vMaxs, MASK_PLAYERSOLID, NAU_TraceFilterNothing); return TR_DidHit(ray); } public bool NAU_TraceFilterNothing(int entityhit, int mask, any entity) { if(entityhit == 0) return true; return false; } public bool NAU_IsPositionBlockedIgnoreSelf(float pos[3], float vMins[3], float vMaxs[3], int entity) { Handle ray = TR_TraceHullFilterEx(pos, pos, vMins, vMaxs, MASK_PLAYERSOLID, NAU_TraceFilterIgnoreSelf, entity); return TR_DidHit(ray); } public bool NAU_TraceFilterIgnoreSelf(int entityhit, int mask, any entity) { if(entityhit > -1 && entityhit != entity) return true; return false; } public void NAU_PrintVector(int client, char[] prefix, float pos[3]) { PrintToChat(client, "%s %s\x02%.2f \x04%.2f \x0C%.2f", NAU_PREFIX, prefix, pos[0], pos[1], pos[2]); } public void NAU_SendBox(float vMins[3], float vMaxs[3], int modelIndex, int color[4], float lifetime) { float vPos1[3], vPos2[3], vPos3[3], vPos4[3], vPos5[3], vPos6[3]; vPos1 = vMaxs; vPos1[0] = vMins[0]; vPos2 = vMaxs; vPos2[1] = vMins[1]; vPos3 = vMaxs; vPos3[2] = vMins[2]; vPos4 = vMins; vPos4[0] = vMaxs[0]; vPos5 = vMins; vPos5[1] = vMaxs[1]; vPos6 = vMins; vPos6[2] = vMaxs[2]; NAU_SendBeam(vMaxs, vPos1, modelIndex, color, lifetime); NAU_SendBeam(vMaxs, vPos2, modelIndex, color, lifetime); NAU_SendBeam(vMaxs, vPos3, modelIndex, color, lifetime); //Vertical NAU_SendBeam(vPos6, vPos1, modelIndex, color, lifetime); NAU_SendBeam(vPos6, vPos2, modelIndex, color, lifetime); NAU_SendBeam(vPos6, vMins, modelIndex, color, lifetime); //Vertical NAU_SendBeam(vPos4, vMins, modelIndex, color, lifetime); NAU_SendBeam(vPos5, vMins, modelIndex, color, lifetime); NAU_SendBeam(vPos5, vPos1, modelIndex, color, lifetime); //Vertical NAU_SendBeam(vPos5, vPos3, modelIndex, color, lifetime); NAU_SendBeam(vPos4, vPos3, modelIndex, color, lifetime); NAU_SendBeam(vPos4, vPos2, modelIndex, color, lifetime); //Vertical } public void NAU_SendBeam(const float vMins[3], const float vMaxs[3], int modelIndex, const int color[4], float lifetime) { TE_SetupBeamPoints(vMins, vMaxs, modelIndex, modelIndex, 0, 0, lifetime, 1.0, 1.0, 1, 0.0, color, 0); TE_SendToAll(); } public SharedPlugin __pl_navareautilities = { name = "navareautilities", file = "navareautilities.smx", #if defined REQUIRE_PLUGIN required = 1 #else required = 0 #endif }; #if !defined REQUIRE_PLUGIN public __pl_navareautilities_SetNTVOptional() { MarkNativeAsOptional("NAU_GetNavAreaCount"); MarkNativeAsOptional("NAU_GetNavAreaAddressByIndex"); } #endif Видео:
    Бесплатный
  10. Версия 1.4.5

    48 раз скачали

    Плагин добавляет возможность использовать спреи (граффити) на вашем сервере Counter-Strike: Global Offensive. Игроки смогут рисовать спреи/граффити, из тех что вы сами добавите на сервер. Пример видно на скриншоте. Команды !sprays - открывает меню выбора спреев (граффити) !spray или sm_spray - рисует граффити Установка Распакуйте архив в папку сервера. Не забудьте добавить materials (файлы спреев) в ваш FastDL (если используете) Пути до спреев найдете в конфиге: addons/sourcemod/configs/csgo-sprays/sprays.cfg Там же сможете добавить и новые граффити, делается это легко по примеру других граффити.
    Бесплатный
  11. Версия 1.1

    1 052 раза скачали

    Плагин добавляет тег в таб (таблицу игроков) для ваших VIPов. Модуль для VIP Core. Установка: В файл перевода addons/sourcemod/translations/vip_modules.phrases.txt добавить: "Tag" { "ru" "Тег" "en" "Tag" "fi" "Tag" } "Tag_Menu" { "ru" "Настройки тега" "en" "Tag settings" "fi" "Tag asetukset" } В groups.ini прописать: "Tag" "сам тег" В графе вместо "сам тег" вписывать сам тег, например [VIP]. Игрок не сможет его изменить Или: Ключевое слово custom, что позволит игроку установить тег самому введя значение чат или выключить Ключевое слово list, что позволит игроку выбрать тег самому из списка default или выключить Ключевое слово list:имя_списка, что позволит игроку выбрать тег самому из указанного списка или выключить
    10 руб.
  12. 37 раз скачали

    Sourcemod плагин для игровых серверов: показывает где находится ближайший враг. Боты игнорируются. Настройки: place_where_enemy_timer "1" - Как часто сообщать о ближайшем противнике ( в секундах) Установка: Закинуть файл .sp в addons/sourcemod/scripting Закинуть файл .smx в addons/sourcemod/plugins
    Бесплатный
  13. 58 раз скачали

    Позволяет игрокам обмениваться своими ножами (естественно не в инвентарь, а просто скинами в игре) Команды: sm_switchknife <ник игрока> - отправить запрос игроку на обмен sm_disablesk - автоматический отклонять все предложения обмена
    Бесплатный
  14. Версия 1.0.0

    43 раза скачали

    Плагин позволяет настроить стандартные голосования: кому их можно создавать кому нет или вообще заблокировать создание, в голосовании за кик игрока по умолчание включается иммунитет у админов как в голосовании sourcemod. Настройки: sm_standart_vote_change_places "z" - возможность запускать голосование за смену команды местами: 0 = отключено, 1 = включено без ограничений по доступу, "z" = или любой другой флаг - тот флаг с которого будет доступ sm_standart_vote_kick "1" - возможность запускать голосование за кикать игроков: 0 = отключено, 1 = включено без ограничений по доступу, "z" = или любой другой флаг - тот флаг с которого будет доступ sm_standart_vote_map "b" - возможность запускать голосование за смену карты: 0 = отключено, 1 = включено без ограничений по доступу, "z" = или любой другой флаг - тот флаг с которого будет доступ sm_standart_vote_mix_team "1" - возможность голосовать за то чтобы перемешать команды: 0 = отключено, 1 = включено без ограничений по доступу, "z" = или любой другой флаг - тот флаг с которого будет доступ sm_standart_vote_nextmap "1" - возможность голосовать за выбор следующей карты: 0 = отключено, 1 = включено без ограничений по доступу, "z" = или любой другой флаг - тот флаг с которого будет доступ sm_standart_vote_restart_game "1" - возможность голосовать за рестарт игры: 0 = отключено, 1 = включено без ограничений по доступу, "z" = или любой другой флаг - тот флаг с которого будет доступ
    Бесплатный
  15. Версия 1.0.0

    40 раз скачали

    Плагин дополнение к RankMe которое показывает ранк и очки игрока который присоединился или отключился от сервера Плагин не работает без RankMe Версия RankMe не ниже 2.5.8 Настройки: rankme_announcer_player_connect "1" //Показывать, когда игрок соединиться с сервером (его ранг и очки)? //По умолчанию 1. rankme_announcer_player_connect_center "0" //Показывать, когда игрок подключить в центре? //По умолчанию 0. rankme_announcer_player_connect_chat "1" //Показывать, когда игрок подключения в чате? //По умолчанию 1. rankme_announcer_player_connect_hint "0" //Показывать, когда игрок подключения в HINT-окне? //По умолчанию 0. rankme_announcer_player_disconnect "1" //Показывать, когда игрок отсоедините от сервера? //По умолчанию 1. rankme_announcer_top_player_connect "1" //Показывать, когда Топ-игрок подключится? //По умолчанию 1. rankme_announcer_top_pos_player_connect "10" //Максимальное место которое показывает Топ-игрока? //По умолчанию 10. rankme_announcer_top_player_connect_center "0" //Показывать подключенного Топ-игрока в центре? //По умолчанию 1. rankme_announcer_top_player_connect_chat "1" //Показывать подключенного Топ-игрока в чате? //По умолчанию 1. rankme_announcer_top_player_connect_hint "0" //Показывать подключенного Топ-игрока в HINT-окне? //По умолчанию 0.
    Бесплатный
  16. Версия 1.0.0

    59 раз скачали

    После закладки бомба будет прыгать по карте (не сильно, её можно поймать чтобы раздефузить)
    Бесплатный
  17. Версия 1.0.0

    67 раз скачали

    Простой плагин для контроля баланса на серверах cs:s и cs:go Настройки: grtb_admin_immun 1/0 - вкл/выкл иммунитет для админов
    Бесплатный
  18. Версия 1.0.0

    37 раз скачали

    Плагин для sourcemod, дает возможность выбрать монеты и ранк Команды: !mm - Открыть Ранк меню. !coin - Открыть меню Монет. !elorank <#userid|name> <0-18> - Админ команда для добавления Ранка определенному игроку, 0 = Нету ранка ... - 18 = Global elite !emblem <#userid|name> <874-6011> - Админ команда для добавления Монеты определенному игроку. Монеты и их ID: "874", "Five Year Service Coin" "875", "DreamHack SteelSeries 2013 CS:GO Champion" "876", "DreamHack SteelSeries 2013 CS:GO Finalist" "877", "DreamHack SteelSeries 2013 CS:GO Semifinalist" "878", "DreamHack SteelSeries 2013 CS:GO Quarterfinalist" "879", "EMS One Katowice 2014 CS:GO Champion" "880", "EMS One Katowice 2014 CS:GO Finalist" "881", "EMS One Katowice 2014 CS:GO Semifinalist" "882", "EMS One Katowice 2014 CS:GO Quarterfinalist" "883", "ESL One Cologne 2014 CS:GO Champion" "884", "ESL One Cologne 2014 CS:GO Finalist" "885", "ESL One Cologne 2014 CS:GO Semifinalist" "886", "ESL One Cologne 2014 CS:GO Quarterfinalist" "887", "ESL One Cologne 2014 Pick 'Em Challenge Bronze" "888", "ESL One Cologne 2014 Pick 'Em Challenge Silver" "889", "ESL One Cologne 2014 Pick 'Em Challenge Gold" "890", "DreamHack Winter 2014 CS:GO Champion" "891", "DreamHack Winter 2014 CS:GO Finalist" "892", "DreamHack Winter 2014 CS:GO Semifinalist" "893", "DreamHack Winter 2014 CS:GO Quarterfinalist" "894", "DreamHack Winter 2014 Pick 'Em Challenge Bronze" "895", "DreamHack Winter 2014 Pick 'Em Challenge Silver" "896", "DreamHack Winter 2014 Pick 'Em Challenge Gold" "897", "ESL One Katowice 2015 CS:GO Champion" "898", "ESL One Katowice 2015 CS:GO Finalist" "899", "ESL One Katowice 2015 CS:GO Semifinalist" "900", "ESL One Katowice 2015 CS:GO Quarterfinalist" "901", "ESL One Katowice 2015 Pick 'Em Challenge Bronze" "902", "ESL One Katowice 2015 Pick 'Em Challenge Silver" "903", "ESL One Katowice 2015 Pick 'Em Challenge Gold" "1001", "Community Season One Spring 2013 Coin 1" "1002", "Community Season One Spring 2013 Coin 2" "1003", "Community Season One Spring 2013 Coin 3" "1013", "Community Season Two Autumn 2013 Coin 1" "1014", "Community Season Two Autumn 2013 Coin 2" "1015", "Community Season Two Autumn 2013 Coin 3" "1024", "Community Season Three Spring 2014 Coin 1" "1025", "Community Season Three Spring 2014 Coin 2" "1026", "Community Season Three Spring 2014 Coin 3" "1028", "Community Season Four Summer 2014 Coin 1" "1029", "Community Season Four Summer 2014 Coin 2" "1030", "Community Season Four Summer 2014 Coin 3" "1316", "Community Season Five Summer 2014 Coin 1" "1317", "Community Season Five Summer 2014 Coin 2" "1318", "Community Season Five Summer 2014 Coin 3" "6001", "Collectible Pin - Dust II" "6002", "Collectible Pin - Guardian Elite" "6003", "Collectible Pin - Mirage" "6004", "Collectible Pin - Inferno" "6005", "Collectible Pin - Italy" "6006", "Collectible Pin - Victory" "6007", "Collectible Pin - Militia" "6008", "Collectible Pin - Nuke" "6009", "Collectible Pin - Train" "6010", "Collectible Pin - Guardian" "6011", "Collectible Pin - Tactics"
    Бесплатный
  19. Версия 1.0.0

    35 раз скачали

    Простой VIP плагин для CS:GO и CS:S. Дает: дает ХП дает броню дает деньги дает возможность смены команды
    Бесплатный
  20. Версия 1.0.0

    65 раз скачали

    Простой sourcemod плагин позволяющий легко самоубиться прописав !kill или /kill в чате Установка: Раскидать файлы плагина sourcemod по папкам
    Бесплатный
  21. Версия 1.0.0

    61 раз скачали

    Плагин для CS:GO, позволяет настроить с каким оружием игроки будут играть в разминочный раунд. Удаляет все оружие и выдает то которое вы укажите в настройках. Настройки: sm_warmupex = "1" - включает/отключает плагин sm_warmupex_givect = "weapon_knife,item_kevlar" - через запятую указывается оружие/вещи которые вы выдаете команде Контр Террористов sm_warmupex_givet = "weapon_knife,item_kevlar" - через запятую указывается оружие/вещи которые вы выдаете команде Террористов sm_warmupex_infinite_he = "1" - бесконечные взрывные гранаты (Хаешки) (0 = обычные 1 = бесконечные, 2 = бесконечные,выдаются моментально сразу в руки) sm_warmupex_infinite_flash = "1" - бесконечные флешки (0 = обычные 1 = бесконечные, 2 = бесконечные,выдаются моментально сразу в руки) sm_warmupex_infinite_smoke = "1" - бесконечные дымовые (смоки) (0 = обычные 1 = бесконечные, 2 = бесконечные,выдаются моментально сразу в руки) sm_warmupex_infinite_decoy = "1" - бесконечные декои (фейк гранаты) (0 = обычные 1 = бесконечные, 2 = бесконечные,выдаются моментально сразу в руки) sm_warmupex_infinite_molotov = "1" - бесконечные коктейли молотова (0 = обычные 1 = бесконечные, 2 = бесконечные,выдаются моментально сразу в руки) sm_warmupex_infinite_incendiary = "1" - бесконечные зажигательные гранаты (0 = обычные 1 = бесконечные, 2 = бесконечные,выдаются моментально сразу в руки) sm_warmupex_infinite_taser = "1" - бесконечные шокеры (тайзеры) (0 = disabled, 1 = unlimited, 2 = unlimited and switch to taser, 3 = unlimited insta mode) sm_restricted_sound = "sound/buttons/weapon_cant_buy.wav" - звук которы проигрывается при попытке купить оружие которое запрещено (оставьте пустым и звука не будет)
    Бесплатный
  22. Версия 0.9

    60 раз скачали

    Легкий и простой плагин забирающий все оружие у игроков.Так же удаляет и прицел. Для отключения плагина команда: sm_weapon_remover_lite_enabled 1/0
    Бесплатный
  23. Версия 1.0beta

    66 раз скачали

    Простой мини плагин без каких либо настроек и команд. Моментально меняет оружие игрока на другое если в первом закончились патроны. Возможно будет полезно для каких то игровых режимов.
    Бесплатный
  24. Версия 1.0.0

    42 раза скачали

    Плагин позволяет создавать различные партикли (частицы) на сервере. Позволяет сохранять проделанные изменения. Видео демонстрация: Команды: sm_getposition - показывает позицию админа sm_getaimposition - координаты того места куда смотрит прицел sm_getpos - показывает позицию админа sm_getaimpos - координаты того места куда смотрит прицел sm_getaimentity - показывает информацию о предмете на который направлен прицел sm_editparticles - меню редактирования sm_particleeditor - меню редактирования sm_saveparticles - сохранить все изменения sm_revertparticles - Отменяет все последние изменения sm_revertchanges - Отменяет все последние изменения sm_changename - изменяет название партикля sm_changeeffect - изменяет эффект партикля sm_changeffect - изменяет эффект партикля
    Бесплатный
  25. Версия 1.0.0

    49 раз скачали

    Плагин разработан конкретно для карты mg_100traps_v4_1 в CS:GO. Он позволяет сохранять в базу данных на каком уровне игрок закончил прохождение, и позволяет телепортироваться на последнюю сохраненную точку. Для телепорта нужно прописать !goto и на какой уровень телепортироваться. Например: !goto 25 В вашей базе данных SQL нужно выполнить следующее: CREATE TABLE `traps` ( `steamid` varchar(20) NOT NULL, `currentLevel` tinyint(4) NOT NULL, `highestLevel` tinyint(4) NOT NULL, UNIQUE KEY `steamid` (`steamid`) ) ENGINE
    Бесплатный

Подписывайтесь на нас во Вконтакте!

×
×
  • Создать...
Искать в
  • Ещё...
Поиск контента, содержащего...
Поиск результатов в...

Напишите свой запрос, а Мы попробуем найти ответ!