[SourcePawn] Урок 1 - Основы языка (Часть 2)

alexmy

Участник
Сообщения
284
Реакции
13
@сапсан, сомневаюсь, что AlmazON прочитает твой коммент и тем более ответит на него: он давно не заходил на форум из-под своей учётки
--- Добавлено позже ---
А вот декомпилер знает :mocking:
Он превращает это:
PHP:
    for(int i = 1; i <= MaxClients; i++)
    {
        ...
    }
в это:
PHP:
    int i = 1;
    while (i <= MaxClients)
    {
        ...
        i++;
    }
--- Добавлено позже ---
@alexmy, а тебе кого к кому нужно телепортировать?
Что рандомно телепортировался или игроку или боту.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #22
@alexmy, так ты объясни нормально кого и куда тебе нужно телепортировать
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@alexmy, примерно вот так:
PHP:
public Action TankCheckStuck(Handle timer, any client)
{
    if(0 < client <= MaxClients && IsClientInGame(client) && GetEntProp(client, Prop_Data, "m_StuckLast") >= 1)
    {
        PrintToChatAll("\x05%N \x04Застрял!!!", client);
        static int clients[MAXPLAYERS+1], num, target;
        for(int i = 1; i <= MaxClients; i++)
            if(i != client && IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i)) clients[num++] = i;
        if(num)
        {
            num--;
            target = GetRandomInt(0, num);
            num = 0;
            static float pos[3];
            GetClientAbsOrigin(target, pos);
            TeleportEntity(client, pos, NULL_VECTOR, NULL_VECTOR);
            PrintToChatAll("\x05%N \x04телепортирован к \x05%N", client, i);
        }
    }
    return !iDTank ? Plugin_Stop : Plugin_Continue;
}
 

alexmy

Участник
Сообщения
284
Реакции
13
@alexmy, так ты объясни нормально кого и куда тебе нужно телепортировать
Ну если на сервере один игрок, чтоб не к игроку реальному телепортировать а хотя бы рандомная телепортация шла.
--- Добавлено позже ---
@alexmy, примерно вот так:
PHP:
public Action TankCheckStuck(Handle timer, any client)
{
    if(0 < client <= MaxClients && IsClientInGame(client) && GetEntProp(client, Prop_Data, "m_StuckLast") >= 1)
    {
        PrintToChatAll("\x05%N \x04Застрял!!!", client);
        static int clients[MAXPLAYERS+1], num, target;
        for(int i = 1; i <= MaxClients; i++)
            if(i != client && IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i)) clients[num++] = i;
        if(num)
        {
            num--;
            target = GetRandomInt(0, num);
            num = 0;
            static float pos[3];
            GetClientAbsOrigin(target, pos);
            TeleportEntity(client, pos, NULL_VECTOR, NULL_VECTOR);
            PrintToChatAll("\x05%N \x04телепортирован к \x05%N", client, i);
        }
    }
    return !iDTank ? Plugin_Stop : Plugin_Continue;
}
Спасибо=)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@alexmy, для рандомной нужно хоть примерно знать куда можно телепортировать
Напомни: команда 2 - это инфицированные же?
Если да, то можно к любому зомби, если такие имеются на карте (хотя как без них в L4D2?).
 

alexmy

Участник
Сообщения
284
Реакции
13
@alexmy, для рандомной нужно хоть примерно знать куда можно телепортировать
Напомни: команда 2 - это инфицированные же?
Если да, то можно к любому зомби, если такие имеются на карте (хотя как без них в L4D2?).
Нет команда 2 выжившие. Что ты написал вроде не плохо работает.
Я имел виду рандомно к выжившим=). Про зараженных я и не думал даже. Если даже к зараженным, опять может где нибудь застрять в текстурах.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
Если даже к зараженным, опять может где нибудь застрять в текстурах.
Можно на позиции сначала попробовать проверить наличие свободного места через TR_TraceHull · sdktools_trace · SourceMod Scripting API Reference
Плюс можно добавить поиск ближайшего юнита для телепортации к нему (чтобы через всю карту не закинуло).
 

Dragokas

Добрая душа
Сообщения
229
Реакции
213
Где-то была возможность указывать опциональный аргумент по имени, что-то вроде:
C-подобный:
void Foo(int a1 = 0, int a2 = 0) { }
//... вызов:
Foo(a2 = 1);
Напомните, пожалуйста, синтаксис вызова.
 

RudikS

Участник
Сообщения
130
Реакции
61
Где-то была возможность указывать опциональный аргумент по имени, что-то вроде:
C-подобный:
void Foo(int a1 = 0, int a2 = 0) { }
//... вызов:
Foo(a2 = 1);
Напомните, пожалуйста, синтаксис вызова
C-подобный:
void Foo(int a, int b) {}

Foo(b: 5, a:6);
 

Dragokas

Добрая душа
Сообщения
229
Реакции
213
Так работает и компилится хорошо. Спасибо.
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
966
#pragma dynamic количество_байт - Устанавливает динамичную память плагина
При #pragma dynamic 8192 выделяется 32768 байт. Скорее всего, это не количество байт, а количество слов (ячеек)
 
  • Мне нравится
Реакции: R1KO

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
Не "скорей всего", а так и есть
изображение_2022-10-28_150808.png
 

DeathScore13

пирожок. пирожочек.
Сообщения
734
Реакции
403
#pragma deprecated - Устанавливает для переменной/функции статус устаревшей
для переменных не работает как минимум с 1.7, эта директива реагирует только на константы препроцессора (#define), функции (методы), форварды и нативы. НЕ реагирует на переменные, константы в виде переменных, перечисления, проперти (предупреждение "скушается" функциями get()/set(), но компилятор не умеет реагировать на это, проперти из enum struct - просто игнор) и структуры. вопщем используется только для #define и чего-нибудь что по объявлению напоминает функцию
Сообщения автоматически склеены:

При #pragma dynamic 8192 выделяется 32768 байт. Скорее всего, это не количество байт, а количество слов (ячеек)
скажу больше: эта фигня не только для динамической памяти. компилятор абсолютно не считает стек, поэтому на всё про всё у тебя есть 16кб (4096*4)
 
Последнее редактирование:
Сверху Снизу