[SourcePawn] Уроки (Содержание)

DenisPukin

Капитан Костыль
Сообщения
185
Реакции
34
А как создавать создавать entity(weapon)? Подскажите пожалуйста.
 

DenisPukin

Капитан Костыль
Сообщения
185
Реакции
34
Хм, у меня крашит сервер
PHP:
public OnPluginStart() 
{ 
    HookEvent("round_start", round_start);
} 

public round_start(Handle:event, const String:name[], bool:dontBroadcast) 
{ 
    for (new i = 1; i <= MaxClients; i++) 
    {
        CreateTimer(3.0, CreateEnt_Timer, i);
    }
}

public Action:CreateEnt_Timer(Handle Time, any i) 
{    
    new Float:origin[3];
    if(IsClientInGame(i))
    {
        GetClientAbsOrigin(i, origin);
    }
   
    new iEnt = CreateEntityByName("weapon_ak47");
   
    if (IsValidEntity(iEnt))
    {
        DispatchSpawn(iEnt);
        origin[0] += 20.0;
        TeleportEntity(iEnt, origin, NULL_VECTOR, NULL_VECTOR);
    }
}
 

8Ahnenerbe8

Участник
Сообщения
113
Реакции
30
@DenisPukin, зачем цикл для таймера, когда можно цикл внутри самого таймера сделать.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
@DenisPukin,
  1. перед созданием таймера проверяй IsClientInGame(i)
  2. if (IsValidEntity(iEnt)) вместо этого проверяй if (iEnt != -1)
  3. По идее еще нужно сделать SetEntProp(iEnt, Prop_Send, "m_iItemDefinitionIndex", 7); (онли для ксго)
  4. + пост выше

За пример можешь взять это Headline/WeaponSpawner
 

DenisPukin

Капитан Костыль
Сообщения
185
Реакции
34
Пробовал 2 варианта:
1)
Но оружия нету и сервер не крашит
PHP:
public OnPluginStart()
{
    HookEvent("round_start", round_start);
}

public round_start(Handle:event, const String:name[], bool:dontBroadcast)
{
    CreateTimer(3.0, CreateEnt_Timer);
}

public Action:CreateEnt_Timer(Handle Time)
{
    new Float:vec[3];
    vec[0] = 25.473587;
    vec[1] = -1535.107666;
    vec[2] = 3000.837158;
    int entity;
    for (new i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i))
        {
            entity = CreateEntityByName("weapon_ak47");
            if (entity != -1)
            {
                TeleportEntity(entity, vec, NULL_VECTOR, NULL_VECTOR);
                SetEntProp(entity, Prop_Send, "m_iItemDefinitionIndex", 7);
                DispatchSpawn(entity);
                CGOPrintToChat(i, "{GREEN}Дроп заспавнен!")
            }
        }
    }
}
2) тут тоже краша нету и оружия нету
PHP:
public OnPluginStart()
{
    HookEvent("round_start", round_start);
}

public round_start(Handle:event, const String:name[], bool:dontBroadcast)
{
    CreateTimer(3.0, CreateEnt_Timer);
}

public Action:CreateEnt_Timer(Handle Time)
{
    new Float:vec[3];
    new index;
    for (new i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i))
        {
            GetClientAbsOrigin(i, vec);
           
            index=CreateEntityByName("weapon_ak47");
            if (index < 1)
            {
            LogError("Error during creating");
            return;
            }
   
        SetEntProp(index, Prop_Send, "m_iItemDefinitionIndex", 7);
        DispatchKeyValueVector(index, "origin", vec);
        DispatchKeyValue(index, "spawnflags", "1");
        DispatchSpawn(index);
        }
    }
}
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@valerun, это самая сложная тема. Сложно писать уроки по оптимизации, не видя код, который надо оптимизировать.
 

echocage

Участник
Сообщения
81
Реакции
11
А каким компилятором пользоваться?
Сообщения автоматически склеены:

Ну именно средой разработки
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@echocage, самый простой вариант:
  1. качаешь SM той версии, что у тебя на сервере;
  2. распаковываешь в удобное тебе место папку scripting
    *я ещё создаю в ней папку и стоковые плагины и папки от них перекидываю в неё, так что бы остались кроме неё только папки include и compiled, а также файлы compile.exe и spcomp.exe
  3. закидываешь исходник плагина, который нужно скомпилить в папку scripting и, если необходимо, инклюды в папку include;
  4. перетаскиваешь исходник на файл compile.exe;
  5. в появившемся окне читаешь о результатах компиляции;
  6. если ошибок при компиляции не было, то закидываем полученный файл *.smx в папку .../addons/sourcemod/plugins на сервере, иначе исправляем их и повторяем с п.4.
    *если есть сообщение со словом "error", то обязательно исправляем, если встречается только "warning", то это обычно можно проигнорировать, если плагин работает
 

DENFER

Пишу плагины за два биг тести и картошку фри..
Сообщения
260
Реакции
289
Какие-же это уроки от рико, когда это просто перевод документации =_= (частично да)
Не все владеют английским языком и к тому же перевод в "тупую" документации не даст дословно донести нужной информации. Нужно аплодировать стоя, что нашелся человек, который помимо перевода смог доходчивым языком объяснить детали.
 

Deraxus

Участник
Сообщения
190
Реакции
24
Не уверен, что пишу туда, но может кто скинуть где взять функции по типу PrintToChatAll? (например, функция которая убивает игрока, или делает еще что-то, где их вообще искать?)
 

Muinez

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

crux

Участник
Сообщения
49
Реакции
4
@valerun, это самая сложная тема. Сложно писать уроки по оптимизации, не видя код, который надо оптимизировать.
Здравствуйте, подскажите, пожалуйста, как можно проверить что HookEvent уже был вызван ранее и вызвать для него UnHook? Если конечно такое вообще можно сделать, проверить на наличие HookEvent-а.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@crux, завести какую-нибудь переменную с булевым значением (true/false), и обновлять её, когда выполняется подписка или отписка от события.

@Grey83, это немного не то ведь.
 
Сверху Снизу