Как сделать точку закупки на всей карте?

kaifodrom1337

Участник
Сообщения
72
Реакции
7
Как сделать точку закупки на всей карте? Знаю о плагине Buyzone range, но он не работает.

Игра: CSS v34
 

DarkerZ

Участник
Сообщения
395
Реакции
175
через logic_auto менять размер func_buyzone при помощи оутпутов AddOutput,mins -32000 -32000 -32000; AddOutput,maxs 32000 32000 32000
Сообщения автоматически склеены:

возможно отлавливать событие выхода из байзоны и блокировать его
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Вот это должно сделать все зоны закупки размером с карту:
C-подобный:
#include <sdktools_functions>

public void OnMapStart()
{
    float wmin[3], wmax[3], pos[3], vec[3];
    GetEntPropVector(0, Prop_Data, "m_WorldMins", wmin);
    GetEntPropVector(0, Prop_Data, "m_WorldMaxs", wmax);

    int ent = MaxClients+1;
    while((ent = FindEntityByClassname(ent, "func_buyzone")) != -1)
    {
        GetEntPropVector(ent, Prop_Send, "m_vecOrigin", pos);
        NegateVector(pos);

        AddVectors(pos, wmin, vec);
        SetEntPropVector(ent, Prop_Data, "m_vecMins", vec);
        AddVectors(pos, wmax, vec);
        SetEntPropVector(ent, Prop_Data, "m_vecMaxs", vec);
    }
}
Я не помню равны ли координаты зон покупки нулю, как у некоторых других зон, потому сделал поправку.

Если зоны всегда располагаются в центре карты, то код будет ещё проще:
C-подобный:
#include <sdktools_functions>

public void OnMapStart()
{
    float wmin[3], wmax[3];
    GetEntPropVector(0, Prop_Data, "m_WorldMins", wmin);
    GetEntPropVector(0, Prop_Data, "m_WorldMaxs", wmax);

    int ent = MaxClients+1;
    while((ent = FindEntityByClassname(ent, "func_buyzone")) != -1)
    {
        SetEntPropVector(ent, Prop_Data, "m_vecMins", wmin);
        SetEntPropVector(ent, Prop_Data, "m_vecMaxs", wmax);
    }
}
 

kaifodrom1337

Участник
Сообщения
72
Реакции
7
Вот это должно сделать все зоны закупки размером с карту:
C-подобный:
#include <sdktools_functions>

public void OnMapStart()
{
    float wmin[3], wmax[3], pos[3], vec[3];
    GetEntPropVector(0, Prop_Data, "m_WorldMins", wmin);
    GetEntPropVector(0, Prop_Data, "m_WorldMaxs", wmax);

    int ent = MaxClients+1;
    while((ent = FindEntityByClassname(ent, "func_buyzone")) != -1)
    {
        GetEntPropVector(ent, Prop_Send, "m_vecOrigin", pos);
        NegateVector(pos);

        AddVectors(pos, wmin, vec);
        SetEntPropVector(ent, Prop_Data, "m_vecMins", vec);
        AddVectors(pos, wmax, vec);
        SetEntPropVector(ent, Prop_Data, "m_vecMaxs", vec);
    }
}
Я не помню равны ли координаты зон покупки нулю, как у некоторых других зон, потому сделал поправку.

Если зоны всегда располагаются в центре карты, то код будет ещё проще:
C-подобный:
#include <sdktools_functions>

public void OnMapStart()
{
    float wmin[3], wmax[3];
    GetEntPropVector(0, Prop_Data, "m_WorldMins", wmin);
    GetEntPropVector(0, Prop_Data, "m_WorldMaxs", wmax);

    int ent = MaxClients+1;
    while((ent = FindEntityByClassname(ent, "func_buyzone")) != -1)
    {
        SetEntPropVector(ent, Prop_Data, "m_vecMins", wmin);
        SetEntPropVector(ent, Prop_Data, "m_vecMaxs", wmax);
    }
}
можешь пожалуйста отправить это уже готовым файлом?
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
можешь пожалуйста отправить это уже готовым файлом?
Лучше тебе конечно потратить 10-15 минут, чтоб разобраться, если ты не планируешь закрывать сервер через неделю. Но дело твое конечно.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
можешь пожалуйста отправить это уже готовым файлом?
Лучше компилить той версией, что стоит на сервере (потому что под v34 идёт свой SM и скомпиленное в обычном может фигово работать), а файл *.sp нужно сохранять в UTF-8 без BOM (это даже стоковый блокнот винды умеет, емнип).
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Как вариант можно так сделать


C-подобный:
public void OnClientPostAdminCheck(int iClient)
{
    SDKHook(iClient, SDKHook_SetTransmit, Hook_SetTransmit);
}

Action Hook_SetTransmit(int entity, int iClient)
{
    SetEntProp(iClient, Prop_Send, "m_bInBuyZone", 1);
    return Plugin_Continue;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@KiKiEEKi, можно, но это будет срабатывать каждый тик для каждого игрока и бота, а мой код всего раз при запуске карты.
При этом результат будет одинаковый (ну может в твоём варианте меню покупки сможет отрыть наблюдатель, кроме того сработает и вне границ карты).
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
@KiKiEEKi, можно, но это будет срабатывать каждый тик для каждого игрока и бота, а мой код всего раз при запуске карты.
При этом результат будет одинаковый (ну может в твоём варианте меню покупки сможет отрыть наблюдатель, кроме того сработает и вне границ карты).
Да, проверку на живой или нет надо было сделать конечно же, а то спамять будут мертвые.

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


C-подобный:
public void OnClientPostAdminCheck(int iClient)
{
    SDKHook(iClient, SDKHook_SetTransmit, Hook_SetTransmit);
}

Action Hook_SetTransmit(int entity, int iClient)
{
    if(IsPlayerAlive(iClient)) SetEntProp(iClient, Prop_Send, "m_bInBuyZone", 1);
    return Plugin_Continue;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@KiKiEEKi, если зоны закупки нет, то её можно тупо заспавнить. это ещё пяток строк кода.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@DarkerZ, можно, никто не запрещает.
Только для каждой карты придётся ручками высчитывать какие значения подставлять.
 

DarkerZ

Участник
Сообщения
395
Реакции
175
@DarkerZ, можно, никто не запрещает.
Только для каждой карты придётся ручками высчитывать какие значения подставлять.
достаточно в global_filters прописать

C-подобный:
;удаляем все байзоны на карте
filter:
{
    "classname" "func_buyzone"
}
;добавляем байзоны для каждой из команд
add:
{
    "classname" "func_buyzone"
    "targetname" "newbuyzone1"
    "TeamNum" "2"
    "OnUser1" "!self,AddOutput,solid 2,0,1"
    "OnUser1" "!self,AddOutput,mins -32000 -32000 -32000,0.2,1"
    "OnUser1" "!self,AddOutput,maxs 32000 32000 32000,0.2,1"
}
add:
{
    "classname" "func_buyzone"
    "targetname" "newbuyzone2"
    "TeamNum" "3"
    "OnUser1" "!self,AddOutput,solid 2,0,1"
    "OnUser1" "!self,AddOutput,mins -32000 -32000 -32000,0.2,1"
    "OnUser1" "!self,AddOutput,maxs 32000 32000 32000,0.2,1"
}
;растягиваем на всю карту
add:
{
    "classname" "logic_auto"
    "OnNewGame" "newbuyzone1,FireUser1,,0.5,-1"
    "OnNewGame" "newbuyzone2,FireUser1,,0.5,-1"
}
Сообщения автоматически склеены:

а может даже такое сработает
C-подобный:
modify:
{
    match:
    {
        "classname" "func_buyzone"
    }
    replace:
    {
        "mins" "-32000 -32000 -32000"
        "maxs" "32000 32000 32000"
    }
}
 
Последнее редактирование:

kaifodrom1337

Участник
Сообщения
72
Реакции
7
достаточно в global_filters прописать

C-подобный:
;удаляем все байзоны на карте
filter:
{
    "classname" "func_buyzone"
}
;добавляем байзоны для каждой из команд
add:
{
    "classname" "func_buyzone"
    "targetname" "newbuyzone1"
    "TeamNum" "2"
    "OnUser1" "!self,AddOutput,solid 2,0,1"
    "OnUser1" "!self,AddOutput,mins -32000 -32000 -32000,0.2,1"
    "OnUser1" "!self,AddOutput,maxs 32000 32000 32000,0.2,1"
}
add:
{
    "classname" "func_buyzone"
    "targetname" "newbuyzone2"
    "TeamNum" "3"
    "OnUser1" "!self,AddOutput,solid 2,0,1"
    "OnUser1" "!self,AddOutput,mins -32000 -32000 -32000,0.2,1"
    "OnUser1" "!self,AddOutput,maxs 32000 32000 32000,0.2,1"
}
;растягиваем на всю карту
add:
{
    "classname" "logic_auto"
    "OnNewGame" "newbuyzone1,FireUser1,,0.5,-1"
    "OnNewGame" "newbuyzone2,FireUser1,,0.5,-1"
}
Сообщения автоматически склеены:

а может даже такое сработает
C-подобный:
modify:
{
    match:
    {
        "classname" "func_buyzone"
    }
    replace:
    {
        "mins" "-32000 -32000 -32000"
        "maxs" "32000 32000 32000"
    }
}
сервер падает после добавление в стрипер) Второй способ вообще не работает)
Сообщения автоматически склеены:

Вот это должно сделать все зоны закупки размером с карту:
C-подобный:
#include <sdktools_functions>

public void OnMapStart()
{
    float wmin[3], wmax[3], pos[3], vec[3];
    GetEntPropVector(0, Prop_Data, "m_WorldMins", wmin);
    GetEntPropVector(0, Prop_Data, "m_WorldMaxs", wmax);

    int ent = MaxClients+1;
    while((ent = FindEntityByClassname(ent, "func_buyzone")) != -1)
    {
        GetEntPropVector(ent, Prop_Send, "m_vecOrigin", pos);
        NegateVector(pos);

        AddVectors(pos, wmin, vec);
        SetEntPropVector(ent, Prop_Data, "m_vecMins", vec);
        AddVectors(pos, wmax, vec);
        SetEntPropVector(ent, Prop_Data, "m_vecMaxs", vec);
    }
}
Я не помню равны ли координаты зон покупки нулю, как у некоторых других зон, потому сделал поправку.

Если зоны всегда располагаются в центре карты, то код будет ещё проще:
C-подобный:
#include <sdktools_functions>

public void OnMapStart()
{
    float wmin[3], wmax[3];
    GetEntPropVector(0, Prop_Data, "m_WorldMins", wmin);
    GetEntPropVector(0, Prop_Data, "m_WorldMaxs", wmax);

    int ent = MaxClients+1;
    while((ent = FindEntityByClassname(ent, "func_buyzone")) != -1)
    {
        SetEntPropVector(ent, Prop_Data, "m_vecMins", wmin);
        SetEntPropVector(ent, Prop_Data, "m_vecMaxs", wmax);
    }
}
увы не работает(
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@kaifodrom1337, возможно требуется использовать Prop_Send вместо Prop_Data, но это опытным путём можно только определить точно.
А тестить мне некак благодаря вентилям, которые забили на пользователей семёрки (игры запустились бы, а лаунчер - нет).
Ну а ставить второй системой линух мне некуда (слишком мало свободного места на винтах).
 

DarkerZ

Участник
Сообщения
395
Реакции
175
вот это попробуй
C-подобный:
#include <sdkhooks>

public OnClientPutInServer(client)
{
    if(IsClientInGame(client))
    {
        SDKHook(client, SDKHook_PostThinkPost, Hook_PostThinkPost);
    }
}
public Hook_PostThinkPost(entity)
{
    SetEntProp(entity, Prop_Send, "m_bInBuyZone", 1);
}
 
Сверху Снизу