Удаление оружия

Dreizehnt

Доминик
Сообщения
1,160
Реакции
799
@Dreizehnt, mp_weaponstay - Оружие остаётся на карте после смерти игрока.

weapon_auto_cleanup_time — если установлена не на 0, оружие будет удаляться по прошествии определенного времени в секундах, если игроков рядом нет.

weapon_max_before_cleanup — Если установлена не на 0, будет удалять самое старое уроненное оружие, чтобы поддерживать определенное количество уроненного оружия в мире

mp_death_drop_c4 / mp_death_drop_defuser / mp_death_drop_grenade / mp_death_drop_gun = Разрешить / запретить выпадение оружия игрока после его смерти. [1/0]
[CS:GO]

P.S возможно стоит создать тред, по разным вопросам SOURCE и пилить туда часто задающиеся вопросы, aka faq.
xD спасибо, по идее с дропом должны помочь, забыл про них)
 

ThreshHNS

Участник
Сообщения
248
Реакции
87

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
гранаты при нажатии ЛКМ пропадают и не выкидываются
Я думал, у тебя какой-то MiniGames-сервер или вроде того, где игрокам одна пуля нужна только для проверки "ловушек".
Может, просто сделать, чтобы удалялся "скаут" (scout), где есть этот самый патрон, вот и всё?
 

ThreshHNS

Участник
Сообщения
248
Реакции
87
У меня стоит плагин, где рандомно выдается одно из списка оружий с одним патроном. Список оружий - Deagle, Glock, Sawed Off \ M3.
Оффтоп
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
PHP:
#include <sdktools>

#pragma newdecls required

static const char DeleteWeapons[][] =
{
	"deagle",
	"glock",
	"m3",
	"taser",
	"sawedoff",
	"weapon_usp_silencer"
};

int g_iOffsetActive;

public void OnPluginStart()
{
	if ((g_iOffsetActive = FindSendPropInfo("CBasePlayer", "m_hActiveWeapon")) < 1) SetFailState("Not supported!");
	HookEvent("weapon_fire", WeaponFire);
}

public void WeaponFire(Event event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(event.GetInt("userid")), weapon = GetEntDataEnt2(client, g_iOffsetActive);
	if (weapon != -1)
	{
		char classname[32];
		event.GetString("weapon", classname, sizeof(classname));
		for (int i; i < sizeof(DeleteWeapons); ++i)
		{
			if (strcmp(classname[7], DeleteWeapons[i]) == 0)
			{
				RemovePlayerItem(client, weapon);
				AcceptEntityInput(weapon, "Kill");
				FakeClientCommand(client, "use weapon_knife");
			}
		}
	}
}
 

ThreshHNS

Участник
Сообщения
248
Реакции
87
Баг - игрок выстреливает из оружия, анимация у него происходит, патрон вылетает, след от пули есть, но на самом деле, от лица окружающих, игрок не выстреливает, а оружие просто исчезает, дамаг не наносится, следа от пули нет.
 

ludanik

Участник
Сообщения
146
Реакции
20
@ThreshHNS, Потому что событие срабатывает сразу, а нужно после. EventHookMode_Post
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
на самом деле, от лица окружающих, игрок не выстреливает, а оружие просто исчезает
Как же ты раньше тестировал, что было "идеально"? Ничего же не изменилось, кроме цикла.
событие срабатывает сразу, а нужно после
Оффтоп Сразу - это EventHookMode_Pre, всё остальное - после.
Когда ничего не добавляешь, это он и есть (по умолчанию).
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #31
@AlmazON, в weapon_fire оружие без weapon_ идет, так что [7] не нужно
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,606
Реакции
5,096
@AlmazON, добавить вокруг !(%выражение%) в таком случае
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
Итого, выявленный действующий вариант:
PHP:
#include <sdktools>

#pragma newdecls required

static const char DeleteWeapons[][] =
{
    "deagle",
    "glock",
    "m3",
    "taser",
    "sawedoff",
    "usp_silencer"
};

int g_iOffsetActive;

public void OnPluginStart()
{
    if ((g_iOffsetActive = FindSendPropInfo("CBasePlayer", "m_hActiveWeapon")) < 1) SetFailState("Not supported!");
    HookEvent("bullet_impact", BulletImpact);
}

public void BulletImpact(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid")), weapon = GetEntDataEnt2(client, g_iOffsetActive);
    if (weapon != -1)
    {
        char classname[32];
        GetEdictClassname(weapon, classname, sizeof(classname));
        for (int i; i < sizeof(DeleteWeapons); ++i)
        {
            if (strcmp(classname[7], DeleteWeapons[i]) == 0)
            {
                RemovePlayerItem(client, weapon);
                AcceptEntityInput(weapon, "Kill");
                FakeClientCommand(client, "use weapon_knife");
            }
        }
    }
}
 
Сверху Снизу