Block Weapon Drop

Monomizer

Держу JDW в бане.
Сообщения
1,947
  • Команда форума
  • #22
Подниму, ибо запутался
csdm, стандартное удаление оружия после смерти вырубил
Есть плагин, который позволяет выкидывать гранаты на кнпоку G
PHP:
#include <sourcemod>
#include <sdktools>
#include <cstrike>

#define HEGRENADE_AMMO 11
#define FLASH_AMMO 12
#define SMOKE_AMMO 13

new Handle:cknife;

public Plugin:myinfo =
{
    name = "Grenade Drop (he, flash, smoke)",
    author = "rodipm",
    description = "Allows you to drop your grenades like dropping normal weapons (by default pressing 'G')",
    version = "1.3",
    url = "http://forums.alliedmods.net/showthread.php?t=172315"
}

public OnPluginStart()
{
    AddCommandListener(Drop, "drop");
    cknife = CreateConVar("gd_dropknife", "0", "allows you to drop the knife too");
}

public Action:Drop(client, const String:command[], argc)
{
    decl String:name[80];
    new count;
    new index;
    new wpindex = GetEntPropEnt(client, Prop_Data, "m_hActiveWeapon");

    if(!IsValidEntity(wpindex))
        return Plugin_Handled;

    GetEntityClassname(wpindex, name, sizeof(name));

    //if(IsClientConnected(client) && IsClientInGame(client) && IsPlayerAlive(client))
    if(IsClientConnected(client) && IsClientInGame(client))
    {
        if(StrEqual(name, "weapon_flashbang", false))
        {
            count = GetEntProp(client, Prop_Send, "m_iAmmo", _, FLASH_AMMO);
            CS_DropWeapon(client, wpindex, true, true);
            if(count > 1)
            {
                index = GivePlayerItem(client, "weapon_flashbang");
                SetEntProp(client, Prop_Send, "m_iAmmo", count-1, _, FLASH_AMMO);
                SetEntPropEnt(client, Prop_Send, "m_hActiveWeapon", index);
            }
            return Plugin_Handled;
        }
        else if(StrEqual(name, "weapon_hegrenade", false))
        {
            count = GetEntProp(client, Prop_Send, "m_iAmmo", _, HEGRENADE_AMMO);
            CS_DropWeapon(client, wpindex, true, true);
            if(count > 1)
            {
                index = GivePlayerItem(client, "weapon_hegrenade");
                SetEntProp(client, Prop_Send, "m_iAmmo", count-1, _, HEGRENADE_AMMO);
                SetEntPropEnt(client, Prop_Send, "m_hActiveWeapon", index);
            }
            return Plugin_Handled;
        }
        else if(StrEqual(name, "weapon_smokegrenade", false))
        {
            count = GetEntProp(client, Prop_Send, "m_iAmmo", _, SMOKE_AMMO);
            CS_DropWeapon(client, wpindex, true, true);
            if(count > 1)
            {
                index = GivePlayerItem(client, "weapon_smokegrenade");
                SetEntProp(client, Prop_Send, "m_iAmmo", count-1, _, SMOKE_AMMO);
                SetEntPropEnt(client, Prop_Send, "m_hActiveWeapon", index);
            }
            return Plugin_Handled;
        }
        else if(StrEqual(name, "weapon_knife", false) && GetConVarInt(cknife) == 1)
        {
            CS_DropWeapon(client, wpindex, true, true);
            return Plugin_Handled;
        }
    }

    return Plugin_Continue;
}

Цель - запретить выброс оружия, кроме гранаты
Код ниже работает, но
Как сделать то, чтобы после смерти игрока граната всё таки вываливалась из него, сейчас не вываливается
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <cstrike>

public Action:CS_OnCSWeaponDrop(client, index)
{
    if (IsClientInGame(client))
    {
        decl String:weapon[25];
        GetEntityClassname(index, weapon, sizeof(weapon));
        if(StrEqual(weapon[7], "grenade")) return Plugin_Continue;
        else return Plugin_Handled;
    }
    return Plugin_Continue;
}
+ к этому пистолет естественно не меняется на выбранный из меню
Код с выдачей из dm

PHP:
GiveWeapon(client, index)
{
    if (!IsPlayerAlive(client))
    {
        return;
    }

    new DmWeaponType:type = DM_GetWeaponType(index);

    new entity = DM_GetClientWeapon(client, type);
    if (entity != -1)
    {
        DM_DropWeapon(client, entity);
    }

    new String:cls[64];
    DM_GetWeaponClassname(index, cls, sizeof(cls));

    GivePlayerItem(client, cls);
}

В первом коде с выбросом гранат пробовал
PHP:
    //if(IsClientConnected(client) && IsClientInGame(client) && IsPlayerAlive(client))
    if(IsClientConnected(client) && IsClientInGame(client))
Но эффекта 0
Как быть? Спасибо
Тестировал на себе и на ботах - сам пишу килл - не вываливается, с ботов тоже
--- Добавлено позже ---
По поводу выдачи оружия хотел сделать так(Пистолет то не меняется при выборе его в меню)
Стандартный DM_DropWeapon(client, entity);
Меняем на DelWeaponOfIndex(client, entity);
где

PHP:
DelWeaponOfIndex(client, index_weapon)
{
    if(IsClientInGame(client))
    {
        RemovePlayerItem(client, index_weapon);
        AcceptEntityInput(index_weapon, "Kill");
    }
}
Но всё равно получаю ошибку [SM] Native "RemovePlayerItem" reported: Client 2 is not in game
Только лишь при самом первом спавне игрока, даже когда есть у него пистолет, то пистолет заменяется из меню, в последующие разы как умер - нет

Попробовал ещё так

PHP:
DropPlayerWeaponOnSlot(client,slot)
{
    new weapon_index=-1;
    new String:weapon_string[20];
    // if client has a weapon on slot and string is available
    if(((weapon_index = GetPlayerWeaponSlot(client, slot)) != -1)
            && GetEdictClassname(weapon_index, weapon_string, 20))
    {
        // give the same weapon to client (gets dropped)
        GivePlayerItem(client,weapon_string);
        // remove weapon from client
        RemovePlayerItem(client, weapon_index);
    }
}
Нет результата
Т.е. 2 проблемы, граната не вываливается после смерти игрока и из меню оружие не заменяется, тупо выпадает
--- Добавлено позже ---
По поводу невыдачи оружия решил костылём:

PHP:
public itemplayer(client)
{
    new playeritem;

    for (new i = 0; i < 6; i++)
    {
        if (i < 6 && (playeritem = GetPlayerWeaponSlot(client, i)) != -1)
        {
            RemovePlayerItem(client, playeritem);
        }
    }
}
Но чем то чувствую что лучше так не делать
Остался вопрос, как всё атки дропнуть гранату с игрока, естественно если она у него есть
Единственная мысля проверять на наличие гранаты перед смертью и дропать её в месте смерти игрока, но это ведь тоже костыль...
 
Последнее редактирование:

Felton

Участник
Сообщения
799
Реакции
59
Доброго времени суток!Прошу написать простенький плагин.Сервер Counter-Strike Source DeathMatch.Мне нужно чтобы любое оружие не выкидовалось точнее сказать не пропадало когда случайно нажымаеш на клавишу " G ".Подобный плагин есть у меня на бомбу т.е её скинуть неньзя и пишет в чате "Бомбу выбрасывать запрещено!"Можно и тут что то подобное придумать на оружие.Прошу помоч.Заранее спасибо!
 

Monomizer

Держу JDW в бане.
Сообщения
1,947
  • Команда форума
  • #25
PHP:
if (IsClientInGame(client) && IsPlayerAlive(client))
Пробовал?
Попробовал, безрезультатно
Мне больше всего не нравится в CS_OnCSWeaponDrop то, что с ДМ тут же начинает конфликтовать - с выдачей оружия при выборе и при рандомном выдаче оружия(Да в любом плагине с дропом), оно ведь там через тот же дроп идёт, который мы блокируем, да не беда, костыль есть, правда с рандомом ещё не разобрался, дело времени
Ещё такой код попробовал
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <cstrike>

public Action:CS_OnCSWeaponDrop(client, index)
{
    if(IsAcitveWeaponGrenade(client,index)) return Plugin_Continue;
    else return Plugin_Handled;
}

bool:IsAcitveWeaponGrenade(client,index) {
    if(index > MaxClients)
        if(index == GetPlayerWeaponSlot(client, 4))
            return true;
    return false;
}
Да не выкидывается оружие, да выкидывается только граната, но после смерти граната естественно не дропается
И что вообще печально - в коде ксдм найти не могу кусок кода за дроп оружия и его удаление - видать в сошку вшито(я про то, чтобы от ксдм включить обратно автоудаление дропа при смерте с игнорированием гранаты)
И к клавише никакой функции не привязано
Мож тогда через AddCommandListener как то, просто я не знаю CS_OnCSWeaponDrop эквивалентно drop в консоли или всё таки немного разное (скорее всего туплю и одно и тоже)
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
безрезультатно
По-моему, про это уже и была речь. Нужно хукать урон и, когда игрока ранят "последний раз" (до смерти), то менять там переменную на выполнение return Plugin_Continue;, когда это граната. Так вот сделали.
чтобы любое оружие не выкидовалось точнее сказать не пропадало когда случайно нажымаеш на клавишу " G "
PHP:
public OnPluginStart() AddCommandListener(DropWeapon, "drop");

public Action:DropWeapon(client, String:command[], args) return Plugin_Handled;
 

Felton

Участник
Сообщения
799
Реакции
59
AlmazON
Спасибо всё ок!
--- Добавлено позже ---
AlmazON
Что то я сразу не проверил а оказывается что у теров бомбу нельзя скинуть когда нажымаеш на клавишу " G "
Я просил чтобы любое оружие не выкидовалось точнее сказать не пропадало когда случайно нажымаеш на клавишу " G "
Но бомбу можно выкидывать когда нажымаеш на клавишу " G "
Можно этот код подправить?

public OnPluginStart() AddCommandListener(DropWeapon, "drop");

public Action:DropWeapon(client, String:command[], args) return Plugin_Handled;

Заранее спасибо!
 
Последнее редактирование:

September

Участник
Сообщения
5,238
Реакции
2,742
  • Команда форума
  • #28
Пока гуглил, нашел эту тему. Создам сообщение здесь, чтобы если кто-то искал, то мог найти этот тред.
Мне нужно удалять гранаты из игроков которые погибли (убили, суицид, etc), чтобы гранаты на карте не оставались.
Может кто подкинуть код? 😇
 

Innomeni

Участник
Сообщения
320
Реакции
42
Пока гуглил, нашел эту тему. Создам сообщение здесь, чтобы если кто-то искал, то мог найти этот тред.
Мне нужно удалять гранаты из игроков которые погибли (убили, суицид, etc), чтобы гранаты на карте не оставались.
Может кто подкинуть код? 😇
mp_death_drop_grenade 0 не подходит?
 

StrAnn1k

Участник
Сообщения
237
Реакции
23
Кто знает как сделать что при открытом выборе оружия ( меню ) нельзя было выкинуть эмку - и т.д
 

Вложения

  • BuyCTWeaponm.sp
    2.7 КБ · Просмотры: 1

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Кто знает как сделать что при открытом выборе оружия ( меню ) нельзя было выкинуть эмку - и т.д

code:
#include <sourcemod>
#include <sdktools>

#define PLUGIN_NAME "Расширенный выбор оружия"
#define PLUGIN_AUTHOR "StrAnn1k"
#define PLUGIN_VERSION "1.0"
#define PLUGIN_DESCRIPTION ""

int MENU_TIME[MAXPLAYERS+1];

public void OnPluginStart(){
    HookEvent("item_purchase", Event_ItemPurchase, EventHookMode_Post);
    RegConsoleCmd("drop", cmd_drop);
}
public Action cmd_drop(int client, int args){
    return (MENU_TIME[client] - GetTime() > 0) ? Plugin_Handled : Plugin_Continue;
}
public Action Event_ItemPurchase(Event event, const char[] name, bool dontBroadcast){
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(client < 1 || !IsClientInGame(client) || IsFakeClient(client))
        return Plugin_Continue;

    char weapon[64];
    event.GetString("weapon", weapon, sizeof(weapon));

    if(StrEqual(weapon, "weapon_hkp2000") || StrEqual(weapon, "weapon_usp_silencer"))        // Покупка пистолетов
        ShowChooseMenu(client, 1);
    else if(StrEqual(weapon, "weapon_m4a1_silencer") || StrEqual(weapon, "weapon_m4a1"))     // Покупка винтовок
        ShowChooseMenu(client, 2);

    return Plugin_Continue;
}

void ShowChooseMenu(int client, int type){
    Menu hMenu = new Menu(MenuWeaponHandler);
  
    if(type == 1){ // Пистолеты
        hMenu.SetTitle("Выберите пистолет:");
        hMenu.AddItem("weapon_usp_silencer", "USP-S");
        hMenu.AddItem("weapon_hkp2000", "P2000");
    }
    else if(type == 2){ // Винтовки
        hMenu.SetTitle("Выберите винтовку:");
        hMenu.AddItem("weapon_m4a1_silencer", "M4A1-S");
        hMenu.AddItem("weapon_m4a1", "M4A1");
    }

    hMenu.Display(client, 3);
    MENU_TIME[client] = GetTime() + 3;
}



public int MenuWeaponHandler(Menu hMenu, MenuAction action, int client, int iItem){
    if(action == MenuAction_Select){
        if(client > 0 && IsClientInGame(client) && !IsFakeClient(client)){
            char weapon[64];
            hMenu.GetItem(iItem, weapon, sizeof(weapon));

            ReplaceWeapon(client, weapon); // Replace the weapon with the selected one
        }
    }
    MENU_TIME[client] = 0;

    // Remove or comment out the following line
    // hMenu.Close();  // Do not manually close the menu here

    return 0; // Return int, not Handle
}



void ReplaceWeapon(int client, const char[] weapon){
    int slot = (StrEqual(weapon, "weapon_usp_silencer") || StrEqual(weapon, "weapon_hkp2000")) ? 1 : 0; // 1 for pistols, 0 for primary weapons

    // Remove the current weapon in the selected slot
    int currentWeapon = GetPlayerWeaponSlot(client, slot);
    if (currentWeapon != -1) // Compare to -1 for invalid entity index
        RemovePlayerItem(client, currentWeapon); // Remove the current weapon

    GivePlayerItem(client, weapon); // Give the new weapon
}
 

StrAnn1k

Участник
Сообщения
237
Реакции
23
code:
#include <sourcemod>
#include <sdktools>

#define PLUGIN_NAME "Расширенный выбор оружия"
#define PLUGIN_AUTHOR "StrAnn1k"
#define PLUGIN_VERSION "1.0"
#define PLUGIN_DESCRIPTION ""

int MENU_TIME[MAXPLAYERS+1];

public void OnPluginStart(){
    HookEvent("item_purchase", Event_ItemPurchase, EventHookMode_Post);
    RegConsoleCmd("drop", cmd_drop);
}
public Action cmd_drop(int client, int args){
    return (MENU_TIME[client] - GetTime() > 0) ? Plugin_Handled : Plugin_Continue;
}
public Action Event_ItemPurchase(Event event, const char[] name, bool dontBroadcast){
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(client < 1 || !IsClientInGame(client) || IsFakeClient(client))
        return Plugin_Continue;

    char weapon[64];
    event.GetString("weapon", weapon, sizeof(weapon));

    if(StrEqual(weapon, "weapon_hkp2000") || StrEqual(weapon, "weapon_usp_silencer"))        // Покупка пистолетов
        ShowChooseMenu(client, 1);
    else if(StrEqual(weapon, "weapon_m4a1_silencer") || StrEqual(weapon, "weapon_m4a1"))     // Покупка винтовок
        ShowChooseMenu(client, 2);

    return Plugin_Continue;
}

void ShowChooseMenu(int client, int type){
    Menu hMenu = new Menu(MenuWeaponHandler);
 
    if(type == 1){ // Пистолеты
        hMenu.SetTitle("Выберите пистолет:");
        hMenu.AddItem("weapon_usp_silencer", "USP-S");
        hMenu.AddItem("weapon_hkp2000", "P2000");
    }
    else if(type == 2){ // Винтовки
        hMenu.SetTitle("Выберите винтовку:");
        hMenu.AddItem("weapon_m4a1_silencer", "M4A1-S");
        hMenu.AddItem("weapon_m4a1", "M4A1");
    }

    hMenu.Display(client, 3);
    MENU_TIME[client] = GetTime() + 3;
}



public int MenuWeaponHandler(Menu hMenu, MenuAction action, int client, int iItem){
    if(action == MenuAction_Select){
        if(client > 0 && IsClientInGame(client) && !IsFakeClient(client)){
            char weapon[64];
            hMenu.GetItem(iItem, weapon, sizeof(weapon));

            ReplaceWeapon(client, weapon); // Replace the weapon with the selected one
        }
    }
    MENU_TIME[client] = 0;

    // Remove or comment out the following line
    // hMenu.Close();  // Do not manually close the menu here

    return 0; // Return int, not Handle
}



void ReplaceWeapon(int client, const char[] weapon){
    int slot = (StrEqual(weapon, "weapon_usp_silencer") || StrEqual(weapon, "weapon_hkp2000")) ? 1 : 0; // 1 for pistols, 0 for primary weapons

    // Remove the current weapon in the selected slot
    int currentWeapon = GetPlayerWeaponSlot(client, slot);
    if (currentWeapon != -1) // Compare to -1 for invalid entity index
        RemovePlayerItem(client, currentWeapon); // Remove the current weapon

    GivePlayerItem(client, weapon); // Give the new weapon
}
Можно еще как то офнуть меню покупки пока он не выберет оружие
Сообщения автоматически склеены:

ну или сделать так например я купил эмку мне её не выдали пока не выбрал какую надо
 
Последнее редактирование:
Сверху Снизу