Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

game_player_equip

Статус пользователя wypukt
сообщение 3.2.2017, 19:45
Сообщение #1
Стаж: 13 лет

Сообщений: 268
Благодарностей: 6
Полезность: < 0

Создаю game_player_equip, как кодом сделать так что бы эта ентити выдавала только ножи или вообще ничего ? Что хочу сделать, на картах нету этой ентити, мне нужно избавиться от стандартных пистолетов, которые выдает сама игра, для этого хочу создать свою ентити и установить значения. НЕ предлагайте использовать стрипвипонс и т.д. мне интересно узнать как сделать это используя game_player_equip
Игрался так:
set_pev(ent_t, pev_weapons, num & ~(1<<WEAPON_SUIT))

не помогло...

Отредактировал: wypukt, - 3.2.2017, 19:46
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя ssx
сообщение 3.2.2017, 19:55
Сообщение #2


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

а ты гуглил вообще ?

http://cs-mapper.com/entities/game_player_equip32.shtml


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя SISA
сообщение 3.2.2017, 20:03
Сообщение #3
Стаж: 15 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

wypukt,

В аналогичной теме по блоку дефолтных пистолетов, уже разбирали этот вопрос, ещё пол года назад. Я даже код давал. Короч game_player_equip использовать нельзя. Есть большой риск завалить сервер и вообще, нельзя блокировать выдачу пистолетов дефолтных. Их надо выдавать и на стадии тача удалять.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя kritic
сообщение 3.2.2017, 20:13
Сообщение #4


Стаж: 11 лет

Сообщений: 1128
Благодарностей: 832
Полезность: 1488

wypukt,
попробуй:
Код
{
"origin" "x y z"
"targetname" "game_playerspawn"
"weapon_knife" "1"
"classname" "game_player_equip"
}

но как было верно выше отмечено это не есть хорошо
ps.gif ну и покупку, разумеется, тоже придётся ограничить - иначе какой смысл

Отредактировал: kritic, - 3.2.2017, 20:19
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя wypukt
сообщение 3.2.2017, 23:10
Сообщение #5
Стаж: 13 лет

Сообщений: 268
Благодарностей: 6
Полезность: < 0

Цитата(kritic @ 3.2.2017, 21:13) *
wypukt,
попробуй:
Код
{
"origin" "x y z"
"targetname" "game_playerspawn"
"weapon_knife" "1"
"classname" "game_player_equip"
}

но как было верно выше отмечено это не есть хорошо
ps.gif ну и покупку, разумеется, тоже придётся ограничить - иначе какой смысл

и как мне это в код влепить ? я даже не представляю что с этим сделать, это код из *.bsp, насколько мне известно в код его так не вставишь в плагине... Либо я не знаю как...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя energydance
сообщение 3.2.2017, 23:11
Сообщение #6


Стаж: 10 лет

Сообщений: 2809
Благодарностей: 740
Полезность: 213

wypukt, так код покажите полностью )


Press enter to exit ...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя wypukt
сообщение 3.2.2017, 23:18
Сообщение #7
Стаж: 13 лет

Сообщений: 268
Благодарностей: 6
Полезность: < 0

Цитата(energydance @ 4.2.2017, 0:11) *
wypukt, так код покажите полностью )

а что там показывать то ))
Код:
ent_t = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "game_player_equip"));
dllfunc(DLLFunc_Spawn, ent_t)


Мне надо установить этой ентити выдача, скажем, только ножей, дабы эта ентити перебила выдачу пистолетов, вот вообще хз как, думал set_pev(ent_t, pev_weapons... поможет, но что то нифига или не понимаю что именно выставлять...

Ну пробывал так издеваться чатовской командой
Код:
public t4(id){
static num

if(!ent_t){
ent_t = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "game_player_equip"));
dllfunc(DLLFunc_Spawn, ent_t)
}
num++
set_pev(ent_t, pev_weapons, num & ~(1<<WEAPON_SUIT))
new nt = pev(ent_t, pev_weapons)
client_print(id, print_chat, "nt = %d", nt)
}


Отредактировал: wypukt, - 3.2.2017, 23:22
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя wypukt
сообщение 4.2.2017, 0:05
Сообщение #8
Стаж: 13 лет

Сообщений: 268
Благодарностей: 6
Полезность: < 0

Цитата(SISA @ 3.2.2017, 21:03) *
wypukt,

В аналогичной теме по блоку дефолтных пистолетов, уже разбирали этот вопрос, ещё пол года назад. Я даже код давал. Короч game_player_equip использовать нельзя. Есть большой риск завалить сервер и вообще, нельзя блокировать выдачу пистолетов дефолтных. Их надо выдавать и на стадии тача удалять.

блокировать нет, но можно создать game_player_equip и заставить ее выдавать только ножи, и получится пистолетов уже не будет. Разве не так? Как я понял оно работает примерно так, нету на карте game_player_equip выдаем то что прописано самой игрой, есть - выдаем то что гласит нам game_player_equip...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя SISA
сообщение 4.2.2017, 0:38
Сообщение #9
Стаж: 15 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

https://c-s.net.ua/forum/topic81789.html?vi...st&p=923447

Нельзя просто так спавнить стандартные и картовые энтити где попало, в надежде, что они подхватятся движком. Для спавна есть прекеш и сервер именно в прекеше читает свойства.

Но сразу говорю, чревато.

Отредактировал: SISA, - 4.2.2017, 0:42
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя wypukt
сообщение 4.2.2017, 12:03
Сообщение #10
Стаж: 13 лет

Сообщений: 268
Благодарностей: 6
Полезность: < 0

Цитата(SISA @ 4.2.2017, 1:38) *
https://c-s.net.ua/forum/topic81789.html?vi...st&p=923447

Нельзя просто так спавнить стандартные и картовые энтити где попало, в надежде, что они подхватятся движком. Для спавна есть прекеш и сервер именно в прекеше читает свойства.

Но сразу говорю, чревато.

Я так понял в плагине свойства этого объекта не поменять ? Я имею ввиду что бы установить выдачу другого стандартного оружия, через эту ентити.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя SISA
сообщение 4.2.2017, 13:53
Сообщение #11
Стаж: 15 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

wypukt,

Скорее всего можно.

Вот код этой функции из каэсочки:

Код
void CGamePlayerEquip::KeyValue(KeyValueData *pkvd)
{
    CRulePointEntity::KeyValue(pkvd);

    if (!pkvd->fHandled)
    {
        for (int i = 0; i < MAX_EQUIP; i++)
        {
            if (!m_weaponNames[i])
            {
                char tmp[128];
                UTIL_StripToken(pkvd->szKeyName, tmp);

                m_weaponNames[i] = ALLOC_STRING(tmp);
                m_weaponCount[i] = atoi(pkvd->szValue);
                m_weaponCount[i] = max(1, m_weaponCount[i]);
                pkvd->fHandled = TRUE;
                break;
            }
        }
    }
}

void CGamePlayerEquip::Touch(CBaseEntity *pOther)
{
    if (!CanFireForActivator(pOther))
        return;

    if (UseOnly())
        return;

    EquipPlayer(pOther);
}

void CGamePlayerEquip::EquipPlayer(CBaseEntity *pEntity)
{
    CBasePlayer *pPlayer = NULL;

    if (pEntity->IsPlayer())
        pPlayer = (CBasePlayer *)pEntity;

    if (!pPlayer)
        return;

    for (int i = 0; i < MAX_EQUIP; i++)
    {
        if (!m_weaponNames[i])
            break;

        for (int j = 0; j < m_weaponCount[i]; j++)
            pPlayer->GiveNamedItem(STRING(m_weaponNames[i]));
    }
}

void CGamePlayerEquip::Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value)
{
    EquipPlayer(pActivator);
}



Сами оффсеты:

Код
            "CGamePlayerEquip"
            {
                "Offsets"
                {
                    "m_weaponNames"  // unsigned int[32]
                    {
                        "type"      "integer"
                        "size"      "32"
                        "unsigned"  "1"

                        "windows"   "140"
                        "linux"     "156"
                        "mac"       "156"
                    }

                    "m_weaponCount"  // int[32]
                    {
                        "type"      "integer"
                        "size"      "32"

                        "windows"   "268"
                        "linux"     "284"
                        "mac"       "284"
                    }
                }
            }



stock const m_weaponNames[MAX_EQUIP] = {35,36,...};
stock const m_weaponCount[MAX_EQUIP] = {67,68,...};


Использовать как-то так:

public plugin_precache()
{
new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "game_player_equip"))

set_pdata_int(id, 35, тут_номер, 4);
set_pdata_int(id, 36, тут_номер, 4);
...

set_pdata_int(id, 67, тут_номер, 4);
set_pdata_int(id, 68, тут_номер, 4);
...

if (pev_valid(ent))
dllfunc(DLLFunc_Spawn, ent)
}

Какие значения и под выдачу какого оружия надо ставить, я не в курсе. До или после спавна, тоже хз.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя SISA
сообщение 4.2.2017, 15:25
Сообщение #12
Стаж: 15 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

Короч, даже самому стало интересно.

Собственно, вся фишка здесь:

for (int i = 0; i < MAX_EQUIP; i++)
{
if (!m_weaponNames[i])
{
char tmp[128];
UTIL_StripToken(pkvd->szKeyName, tmp);

m_weaponNames[i] = ALLOC_STRING(tmp);
m_weaponCount[i] = atoi(pkvd->szValue);
m_weaponCount[i] = max(1, m_weaponCount[i]);
pkvd->fHandled = TRUE;
break;
}
}

Всего в game_player_equip доступно 32 слота:

#define MAX_EQUIP 32

Тут, как я понял, подчищаются лишние символы

Код
                char tmp[128];
                UTIL_StripToken(pkvd->szKeyName, tmp);


Если портировать на pawn, то будет как-то так:

Код
stock UTIL_StripToken(const pKey[], pDest[])
{
    new i = 0;

    while (pKey[i] && pKey[i] != '#')
    {
        pDest[i] = pKey[i];
        i++;
    }

    pDest[i] = 0;
}


Но нам это не надо crazy.gif


Дальше имя назначается оружия:

m_weaponNames[i] = ALLOC_STRING(tmp);

Соответственно на амх это EngFunc_AllocString


Итого у нас получается, чтобы выдать AWP на первый номер в game_player_equip, надо:
Код
    new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "game_player_equip"))
    
    if (pev_valid(ent))
    {
        set_pdata_int(ent, 35, engfunc(EngFunc_AllocString, "weapon_awp"), 4);

        set_pdata_int(ent, 67, 1, 4);

        dllfunc(DLLFunc_Spawn, ent)
    }



Полный код для выдачи всякого добра:

Код
#define m_weaponNames        35
#define m_weaponCount        67
#define XO_CRULEENTITY        4


public plugin_precache()
{
    new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "game_player_equip"))
    
    if (pev_valid(ent))
    {
        set_pdata_int(ent, m_weaponNames, engfunc(EngFunc_AllocString, "weapon_knife"), XO_CRULEENTITY);
        set_pdata_int(ent, m_weaponNames+1, engfunc(EngFunc_AllocString, "weapon_awp"), XO_CRULEENTITY);
        set_pdata_int(ent, m_weaponNames+2, engfunc(EngFunc_AllocString, "ammo_338magnum"), XO_CRULEENTITY);
        set_pdata_int(ent, m_weaponNames+3, engfunc(EngFunc_AllocString, "weapon_deagle"), XO_CRULEENTITY);
        set_pdata_int(ent, m_weaponNames+4, engfunc(EngFunc_AllocString, "ammo_50ae"), XO_CRULEENTITY);

        set_pdata_int(ent, m_weaponCount, 1, XO_CRULEENTITY);        // нож
        set_pdata_int(ent, m_weaponCount+1, 1, XO_CRULEENTITY);    // Awp
        set_pdata_int(ent, m_weaponCount+2, 3, XO_CRULEENTITY);    // +30 патрон для Awp
        set_pdata_int(ent, m_weaponCount+3, 1, XO_CRULEENTITY);    // Дигл
        set_pdata_int(ent, m_weaponCount+4, 5, XO_CRULEENTITY);    // +35 патрон для дигла

        dllfunc(DLLFunc_Spawn, ent);
    }
}


на Awp индии, добавлено ещё:

"targetname" "equipment"
"item_assaultsuit" "1"
"spawnflags" "1"

хз, нужно ли это.

Отредактировал: SISA, - 4.2.2017, 15:34
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 4 раз
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: