Написание плагинов

acik_traiks

Что нибудь напишем?)
Сообщения
770
Реакции
627
@FBI, тогда из угла поставь точку между подъемом и стеной и вторую возле подъема и подними ее на максимум, тоже нет пиши лично мне разберемся
можем что то подобие ворот поставить пропускаемых и невидимых, но когда игрок через них прошел ему бац и хп -99
 
Последнее редактирование:

Felton

Участник
Сообщения
799
Реакции
59
@Felton, такого параметра нету в исходники, его надо делать самому
HookEvent("player_spawn", player_spawn); - это событие спаун игрока
после как игрок появится, через 0,1 (ты поставил 2,0) секунду создается эта текстура вх и хокуеться на невидимость "SDKHook(ent,SDKHook_SetTransmit,Hook_SetTransmit);"

тебе нужно добавить:
1) Дополнительную глобальную массивную переменную bool
2) И когда игрок умирает создать таймер, чтоб видимость была доступна, скажем через 5 сек.

Создаем новую переменную g_IsVisib отвечающие за видимость вх-текстур
C-подобный:
public Plugin:myinfo =
{
    name    = "WallHack",
    author    = "wS (World-Source.Ru)",
    version = "1.1"
};

new g_MySprite[MAXPLAYERS + 1];
new g_MySpriteRef[MAXPLAYERS + 1];

new bool:g_IsVisib[MAXPLAYERS + 1]; // Вот она
Создаем таймер для включения видимости, через 5,0 сек после смерти
C-подобный:
public ClearEvent(Handle:event, const String:name[], bool:silent)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    wS_ClearSprite(client);
    // Узнаем название Hook-a
    decl String:sNameEvent[128];
    GetEventName(event, sNameEvent, sizeof(sNameEvent));
    // Сверяем название Hook-a
    if(StrEqual(sNameEvent, "player_death"))
    {
        //Если Hook это player_death создаем таймер
        CreateTimer(5.0, OnVisib, client);
    }
}
Ниже создаем событие OnVisib которое запускается через 5 сек после смерти включает видимость
C-подобный:
public Action:OnVisib(Handle:timer, any:client)
{
    // Если он в игре включаем видимость вх-текстур
    if(IsClientInGame(client))
        IsVisib[client] = true;
}
Выключаем видимость:
1) Когда игрок спамиться
C-подобный:
public player_spawn(Handle:event, const String:name[], bool:silent)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    g_IsVisib[client] = false;
    CreateTimer(0.1, player_spawn_Timer, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE);
}
2) Когда выходит с сервера
C-подобный:
public OnClientDisconnect(client)
{
    wS_ClearSprite(client);
    g_IsVisib[client] = false;
}
Здесь проверяем на видимость
C-подобный:
public Action:Hook_SetTransmit(entity, client)
{
    if(entity == g_MySprite[client])
    {
        return Plugin_Handled; //Скрываем
    }
    if(IsClientInGame(client) && GetAdmin(client))
    {
        // Игрок не живой и Видимость разрещена
        if(!IsPlayerAlive(client) && g_IsVisib[client])
        {
            return Plugin_Continue; //Показываем
        }
    }
    return Plugin_Handled; //Скрываем
}

Оффтоп

И покажи как ты сделал в этом событие "stock bool:GetAdmin(client)" флаги
--- Добавлено позже ---
@FBI, попробуй создай ее лесенкой

Всё это для меня сложно не мог бы ты это всё сделать мне сам.Мне надо что бы когда тебя убили плагин не показывал иконки кто где находиться(увеличить время на включения иконок после смерти а в спектрах что бы показывал сразу) т.к я уже говорил сервер DeathMat(убили -воскрес)
И если это всё добавить в код не увеличиться нагрузка от таких изменений в коде на сервер?
И кстати можно где то скачать другие иконки а то ввиде украинского и российского флага это как то не хорошо(какойто подтекст в этом есть-ненависть друг другу)
Вот код
C-подобный:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>

#pragma tabsize 0




public Plugin:myinfo =
{
    name    = "WallHack",
    author    = "wS (World-Source.Ru)",
    version = "1.1"
};

new g_MySprite[MAXPLAYERS + 1];
new g_MySpriteRef[MAXPLAYERS + 1];

public OnPluginStart()
{
 
    HookEvent("player_spawn",    player_spawn);
    HookEvent("player_death",    ClearEvent);
    HookEvent("player_team",    ClearEvent);
}

public OnMapStart()
{
    AddFileToDownloadsTable("materials/sprites/player_blue_small22.vmt");
    AddFileToDownloadsTable("materials/sprites/player_blue_small22.vtf");
    AddFileToDownloadsTable("materials/sprites/player_red_small22.vmt");
    AddFileToDownloadsTable("materials/sprites/player_red_small22.vtf");

    PrecacheDecal("sprites/player_blue_small22.vmt",    true);
    PrecacheDecal("sprites/player_red_small22.vmt",    true);
}

public ClearEvent(Handle:event, const String:name[], bool:silent)
{
    wS_ClearSprite(GetClientOfUserId(GetEventInt(event, "userid")));
}

public player_spawn(Handle:event, const String:name[], bool:silent)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    CreateTimer(0.1, player_spawn_Timer, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE);
}

public Action:player_spawn_Timer(Handle:timer, any:userid)
{
    new client = GetClientOfUserId(userid);
    if (client < 1) return Plugin_Stop;

    wS_ClearSprite(client);

    if (IsClientInGame(client) && !IsPlayerAlive(client)) return Plugin_Stop;

    new ent = CreateEntityByName("env_sprite");
    if (ent < 1)
    {
        LogError("env_sprite error");
        return Plugin_Stop;
    }

    g_MySprite[client] = ent;
    g_MySpriteRef[client] = EntIndexToEntRef(ent);

    decl Float:pos[3]; GetClientAbsOrigin(client, pos); pos[2] += 50.0;
    DispatchKeyValueVector(ent, "origin", pos);
    DispatchKeyValue(ent, "model", GetClientTeam(client) == 2 ? "sprites/player_red_small22.vmt" : "sprites/player_blue_small22.vmt");
    DispatchKeyValue(ent, "rendermode", "0");
    DispatchKeyValue(ent, "renderfx", "0");
    DispatchKeyValue(ent, "renderamt", "255");
    DispatchKeyValue(ent, "scale", "0.5");
    DispatchKeyValue(ent, "GlowProxySize", "61.0");
    DispatchSpawn(ent);

    SetVariantString("!activator");
    AcceptEntityInput(ent, "SetParent", client, ent);

    SDKHook(ent, SDKHook_SetTransmit, Hook_SetTransmit);

    return Plugin_Stop;
}

public Action:Hook_SetTransmit(entity, client)
{
    if(entity == g_MySprite[client])
    {
        return Plugin_Handled; //Скрываем
    }
    if(IsClientInGame(client) && GetAdmin(client))
    {
        if(!IsPlayerAlive(client))
        {
            return Plugin_Continue; //Показываем
        }
    }
    return Plugin_Handled; //Скрываем
}


stock bool:GetAdmin(client)
{
    new iFlags = GetUserFlagBits(client);
    if(iFlags & ADMFLAG_ROOT) return true;                      // Root
    if(iFlags & ADMFLAG_BAN) return true;     
           // d
    return false;
}

stock wS_ClearSprite(client)
{
    if (g_MySprite[client] > 0)
    {
        new ent = EntRefToEntIndex(g_MySpriteRef[client]);
        if (ent > 0) AcceptEntityInput(ent, "Kill");
        g_MySprite[client] = 0;
        g_MySpriteRef[client] = 0;
    }
}

public OnClientDisconnect(client)
{
    wS_ClearSprite(client);
}
 
Последнее редактирование:

acik_traiks

Что нибудь напишем?)
Сообщения
770
Реакции
627
@Felton, вот держи
Сделай сам
Нагрузка не измениться
Чтобы заменить модели тебе нужно тут
1)строчки 31-40
C-подобный:
public OnMapStart()
{
    AddFileToDownloadsTable("materials/sprites/player_blue_small22.vmt");
    AddFileToDownloadsTable("materials/sprites/player_blue_small22.vtf");
    AddFileToDownloadsTable("materials/sprites/player_red_small22.vmt");
    AddFileToDownloadsTable("materials/sprites/player_red_small22.vtf");

    PrecacheDecal("sprites/player_blue_small22.vmt",    true);
    PrecacheDecal("sprites/player_red_small22.vmt",    true);
}
2) строчка 97
C-подобный:
    DispatchKeyValue(ent, "model", GetClientTeam(client) == 2 ? "sprites/player_red_small22.vmt" : "sprites/player_blue_small22.vmt");
:ps_smile: № строчек, по моему изменению сделаны
 

Вложения

  • 1.sp
    4.4 КБ · Просмотры: 11
Последнее редактирование:

Felton

Участник
Сообщения
799
Реакции
59
@acik
Прверил на домашнем с ботами не работает а точнее не показывает вообще когда сидиш в спектрах(права root)Как будто и нет этого плагина.
 

acik_traiks

Что нибудь напишем?)
Сообщения
770
Реакции
627
@Felton, Сразу при заходе сидел в спеках?
122 строчку замени
C-подобный:
if(!IsPlayerAlive(client) && (g_IsVisib[client] || GetClientTeam(client) == 1))
72 тоже замени
C-подобный:
g_IsVisib[client] = true;
 

Felton

Участник
Сообщения
799
Реакции
59
@acik
Всё сделал как ты написал.Захожу на сервер в спектры и ни чего не показывает.Зашол в игру поиграл а потом опять в спектры зашол и ничего не показывает .Как будто и нет этого плагина.Короче не работает.
 
Последнее редактирование:

acik_traiks

Что нибудь напишем?)
Сообщения
770
Реакции
627
@Felton, а когда умер работает таймер?
строчки 122-125 замени на это
C-подобный:
        if(!IsPlayerAlive(client))
        {
            return (GetClientTeam(client) == 1 ? Plugin_Continue : (g_IsVisib[client] ? Plugin_Continue : Plugin_Handled)); //Показываем
        }
 

Felton

Участник
Сообщения
799
Реакции
59
@acik
Проверил как не работал так и не работает.Вообще никак не показывает в игре ты ли в спектрах.Как будто плагина вообще нет на сервере .Логи пустые.Наверно надо забить на это и использовать то что ты первоначально скинул с админскими правами и всё.Не охото напрягать тебя.
Спасибо что откликнулся!
 

acik_traiks

Что нибудь напишем?)
Сообщения
770
Реакции
627
@Felton, как хочешь наверно просто где то в коде напутал вот и не работает мог бы давно написать vk/skype так бы уже быстрее все прошло
 
F

FBI

Народ у кого есть эффекты для плагина VIP_Tracers_particles_effect
поделитесь, или подскажите где их можно взять....
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Народ у кого есть эффекты для плагина VIP_Tracers_particles_effect
поделитесь, или подскажите где их можно взять....
upload_2017-3-10_3-7-24.png
 

Rodion1488

Участник
Сообщения
151
Реакции
4
1. GiveWeapon
C-подобный:
#include <sourcemod>
#include <sdktools>

#pragma semicolon 1

public Plugin:myinfo = {
    name = "Give Weapon",
    author = "Kiske & AlmazON edition",
    description = "Give a weapon to a player from a command",
    version = "1.0myself",
    url = "http://www.sourcemod.net/"
};

new const String:g_weapons[][] = {
    "ak47", "aug", "bizon", "deagle", "decoy", "elite", "famas", "fiveseven", "flashbang", "g3sg1", "galilar", "glock", "hegrenade", "hkp2000", "incgrenade",
    "knife", "m249", "m4a1", "mac10", "mag7", "molotov", "mp7", "mp9", "negev", "nova", "p250", "p90", "sawedoff", "scar20", "sg556", "smokegrenade", "ssg08",
    "taser", "tec9", "ump45", "xm1014", "awp", "m4a1_silencer", "knifegg"
};

public OnPluginStart()
{
    RegAdminCmd("sm_weapon", smWeapon, ADMFLAG_CUSTOM3, "Specify the name of the weapon <weaponname>");
    RegAdminCmd("sm_weaponlist", smWeaponList, ADMFLAG_CUSTOM3, "List of the weapon names.");
}

public Action:smWeapon(id, args)
{
    if(id)
    {
        if(args == 1)
        {
            decl String:weapon[32];
            GetCmdArg(1, weapon, sizeof(weapon));
            for(new i; i < sizeof(g_weapons); ++i)
            {
                if(!strcmp(weapon, g_weapons[i]))
                {
                    FormatEx(weapon, sizeof(weapon), "weapon_%s", g_weapons[i]);
                    if(GivePlayerItem(id, weapon) == -1) PrintToChat(id, "Оружие %s не поддерживается текущей игрой.", weapon);
                    return Plugin_Handled;
                }
            }
            PrintToChat(id, "[SM] Необозначенное имя оружия (%s)", weapon);
        }
        else PrintToChat(id, "[SM] Используйте: sm_weapon <weaponname>");
    }

    return Plugin_Handled;
}

public Action:smWeaponList(id, args)
{
    for(new i; i < sizeof(g_weapons); ++i)
        ReplyToCommand(id, "%s", g_weapons[i]);

    return Plugin_Handled;
}

2. Всунуть это в меню,то есть игрок пишет команду !weapon и ему высвечивается меню с оружием,которые он может взять,достаточно 1 оружия для примера,я как то попробую сам сделать,или же сунуть это в VIP плагин,ибо Рико что-то молчит(думал хороший модуль для вип получится,а он в игнор)
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@Rodion1488,
PHP:
#include <sourcemod>
#include <sdktools>

#pragma semicolon 1
#pragma newdecls required

public Plugin myinfo = {
    url         = "http://www.sourcemod.net/",
    name        = "Give Weapon",
    author      = "Kiske & AlmazON edition",
    version     = "1.0myself",
    description = "Give a weapon to a player from a command"
};

static const char g_szClassWeapons[][] = {
    "ak47", "aug", "bizon", "deagle", "decoy", "elite", "famas", "fiveseven", "flashbang", "g3sg1", "galilar", "glock", "hegrenade", "hkp2000", "incgrenade",
    "knife", "m249", "m4a1", "mac10", "mag7", "molotov", "mp7", "mp9", "negev", "nova", "p250", "p90", "sawedoff", "scar20", "sg556", "smokegrenade", "ssg08",
    "taser", "tec9", "ump45", "xm1014", "awp", "m4a1_silencer", "knifegg"
};

static const char g_szDrawWeapons[][] = {
    "AK-47", "AUG", "Бизон", "Desert Eagle", "Decoy", "Elite", "Famas", "Five Seven", "Световая граната", "G3SG1", "Galil-AR", "Glock", "Граната", "HKP2000", "IncGrenade",
    "Нож", "M249", "M4A1", "Mac10", "Mag7", "Коктейль Молотова", "MP7", "MP9", "Negev", "Nova", "P250", "P90", "SawedOff", "Scar20", "SG556", "Дымовая граната", "SSG08",
    "Тазер", "Tec 9", "UMP-45", "XM1014", "AWP", "M4A1 с глушителем", "Нож (???)"
};

public void OnPluginStart() {
    RegAdminCmd("sm_weapon", smWeapon, ADMFLAG_CUSTOM3);
}

public Action smWeapon(int iClient, int iArgs) {
    if (iClient) {
        Menu hMenu = new Menu(MenuHndl);
        hMenu.SetTitle("Выберите оружие:\n ");

        for (int i = 0; i < sizeof(g_szDrawWeapons); i++)
            hMenu.AddItem(g_szClassWeapons[i], g_szDrawWeapons[i], ITEMDRAW_DEFAULT);

        hMenu.Display(iClient, 0);
    } else {
        ReplyToCommand(iClient, "[SM] Use this command in-game!");
    }
    return Plugin_Handled;
}

public int MenuHndl(Menu menu, MenuAction action, int iClient, int iSelectedItem) {
    if (action == MenuAction_Select) {
        char szClassName[32];
        char szDisplayName[48];
        menu.GetItem(iSelectedItem, szClassName, sizeof(szClassName), _, szDisplayName, sizeof(szDisplayName));
        Format(szClassName, sizeof(szClassName), "weapon_%s", szClassName);

        if (GivePlayerItem(iClient, szClassName) == -1) {
            PrintToChat(iClient, "[SM] Оружие %s не поддерживается текущей игрой.", szDisplayName);
        }
    } else if (action == MenuAction_End) {
        delete menu; 
    }
}
 
Последнее редактирование:

Rodion1488

Участник
Сообщения
151
Реакции
4
@Rodion1488,
PHP:
#include <sourcemod>
#include <sdktools>

#pragma semicolon 1
#pragma newdecls required

public Plugin myinfo = {
    url         = "http://www.sourcemod.net/",
    name        = "Give Weapon",
    author      = "Kiske & AlmazON edition",
    version     = "1.0myself",
    description = "Give a weapon to a player from a command"
};

static const char g_szClassWeapons[][] = {
    "ak47", "aug", "bizon", "deagle", "decoy", "elite", "famas", "fiveseven", "flashbang", "g3sg1", "galilar", "glock", "hegrenade", "hkp2000", "incgrenade",
    "knife", "m249", "m4a1", "mac10", "mag7", "molotov", "mp7", "mp9", "negev", "nova", "p250", "p90", "sawedoff", "scar20", "sg556", "smokegrenade", "ssg08",
    "taser", "tec9", "ump45", "xm1014", "awp", "m4a1_silencer", "knifegg"
};

static const char g_szDrawWeapons[][] = {
    "AK-47", "AUG", "Бизон", "Desert Eagle", "Decoy", "Elite", "Famas", "Five Seven", "Световая граната", "G3SG1", "Galil-AR", "Glock", "Граната", "HKP2000", "IncGrenade",
    "Нож", "M249", "M4A1", "Mac10", "Mag7", "Коктейль Молотова", "MP7", "MP9", "Negev", "Nova", "P250", "P90", "SawedOff", "Scar20", "SG556", "Дымовая граната", "SSG08",
    "Тазер", "Tec 9", "UMP-45", "XM1014", "AWP", "M4A1 с глушителем", "Нож (???)"
};

public void OnPluginStart() {
    RegAdminCmd("sm_weapon", smWeapon, ADMFLAG_CUSTOM3);
}

public Action smWeapon(int iClient, int iArgs) {
    if (iClient) {
        Menu hMenu = new Menu(MenuHndl);
        hMenu.SetTitle("Выберите оружие:\n ");

        for (int i = 0; i < sizeof(g_szDrawWeapons); i++)
            hMenu.AddItem(g_szClassWeapons[i], g_szDrawWeapons[i], ITEMDRAW_DEFAULT);

        hMenu.Display(iClient, 0);
    } else {
        ReplyToCommand(iClient, "[SM] Use this command in-game!");
    }
    return Plugin_Handled;
}

public int MenuHndl(Menu menu, MenuAction action, int iClient, int iSelectedItem) {
    if (action == MenuAction_Select) {
        char szClassName[32];
        char szDisplayName[48];
        menu.GetItem(iSelectedItem, szClassName, sizeof(szClassName), _, szDisplayName, sizeof(szDisplayName));
        Format(szClassName, sizeof(szClassName), "weapon_%s", szClassName);

        if (GivePlayerItem(iClient, szClassName) == -1) {
            PrintToChat(iClient, "[SM] Оружие %s не поддерживается текущей игрой.", szDisplayName);
        }
    }
}
Это на все пушки или как?
 

DIDORDID

Участник
Сообщения
104
Реакции
33
@Rodion1488,
static const char g_szClassWeapons[][] = {
"ak47", "aug", "bizon", "deagle", "decoy", "elite", "famas", "fiveseven", "flashbang", "g3sg1", "galilar", "glock", "hegrenade", "hkp2000", "incgrenade",
"knife", "m249", "m4a1", "mac10", "mag7", "molotov", "mp7", "mp9", "negev", "nova", "p250", "p90", "sawedoff", "scar20", "sg556", "smokegrenade", "ssg08",
"taser", "tec9", "ump45", "xm1014", "awp", "m4a1_silencer", "knifegg"
};
 
Сверху Снизу