Ошибка в SM плагине

"mikedmor"

Участник
Сообщения
27
Реакции
1
Есть плагин для фикса тп в теории. Вот его код
public OnGameFrame() {
decl float:vCurPos[MAXPLAYERS + 1][3]
static Float:vLastPos[MAXPLAYERS + 1][3];
static bool:bNeedToInitialize[MAXPLAYERS + 1] = true;
for (new i = 1; i <= MaxClients; i++) {
if (IsClientInGame(i)) {
if (IsPlayerAlive(i)) {
if (bNeedToInitialize) {
GetClientAbsOrigin(i, vLastPos);
bNeedToInitialize = false;
}
GetClientAbsOrigin(i, vCurPos);
if (GetVectorDistance(vLastPos, vCurPos) > TELEPORT_DETECT_THRESHOLD) {
TeleportEntity(i, vLastPos, NULL_VECTOR, NULL_VECTOR);
}
GetClientAbsOrigin(i, vLastPos);
}
else {
bNeedToInitialize = true;
}
}
else {
bNeedToInitialize = true;
}
}
}
Помогите с фиксом ошибок.
P.S я в SM полный 0
 

AlmazON

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

#define TELEPORT_DETECT_THRESHOLD 100.0

new bool:bNeedToInitialize[MAXPLAYERS + 1] = true;

public OnGameFrame()
{
    static Float:vCurPos[MAXPLAYERS + 1][3];
    static Float:vLastPos[MAXPLAYERS + 1][3];
    for (new i = 1; i <= MaxClients; ++i) {
        if (IsClientInGame(i)) {
            if (IsPlayerAlive(i)) {
                GetClientAbsOrigin(i, vCurPos[i]);
                if (bNeedToInitialize[i]) {
                    vLastPos[i] = vCurPos[i];
                    bNeedToInitialize[i] = false;
                }
                else if (GetVectorDistance(vLastPos[i], vCurPos[i]) > TELEPORT_DETECT_THRESHOLD) {
                    TeleportEntity(i, vLastPos[i], NULL_VECTOR, NULL_VECTOR);
                }
            }
            else {
                bNeedToInitialize[i] = true;
            }
        }
    }
}

public OnClientPostAdminCheck(client) {
    bNeedToInitialize[client] = true;
}
Лучше бы ещё через событие смерти и спавна оптимизировать. Или, даже так:
PHP:
#include <sdkhooks>
#include <sdktools>

#define TELEPORT_DETECT_THRESHOLD 100.0

new Float:vLastPos[MAXPLAYERS + 1][3];

public OnPluginStart() {
    HookEvent("player_activate", Event_PlayerActivate);
    HookEvent("player_death", Event_PlayerDeath);
}

public Event_PlayerActivate(Handle:event, const String:name[], bool:dontBroadcast) {
    SDKHook(GetClientOfUserId(GetEventInt(event, "userid")), SDKHook_SpawnPost, PlayerSpawn);
}

public PlayerSpawn(client) {
    GetClientAbsOrigin(client, vLastPos[client]);
    SDKHook(client, SDKHook_PostThinkPost, PostThinkPost);
}

public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) {
    SDKUnhook(GetClientOfUserId(GetEventInt(event, "userid")), SDKHook_PostThinkPost, PostThinkPost);
}

public PostThinkPost(client) {
    static Float:vCurPos[MAXPLAYERS + 1][3];
    GetClientAbsOrigin(client, vCurPos[client]);
    if (GetVectorDistance(vCurPos[client], vLastPos[client]) < TELEPORT_DETECT_THRESHOLD) {
        vLastPos[client] = vCurPos[client];
    }
    else {
        TeleportEntity(client, vLastPos[client], NULL_VECTOR, NULL_VECTOR);
    }
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,558
Реакции
5,060
Ошибка у тебя в ДНК том что bNeedToInitialize - это массив и нужно устанавливать значение для каждого из элементов массива.
И объявлять переменные нужно было как глобальные (какой смысл создавать переменную каждый тик? её значение будет каждый тик обнуляться).
Попробуй так:
PHP:
#include <sourcemod>
#include <sdktools>

new Float:vCurPos[MAXPLAYERS + 1][3];
new Float:vLastPos[MAXPLAYERS + 1][3];
new bool:bNeedToInitialize[MAXPLAYERS + 1] = {true, ...};

public OnGameFrame() {
    for (new i = 1; i <= MaxClients; i++) {
        if (IsClientInGame(i) && IsPlayerAlive(i)) {
            if (bNeedToInitialize[i]) {
                GetClientAbsOrigin(i, vLastPos[i]);
                bNeedToInitialize[i] = false;
            }
            GetClientAbsOrigin(i, vCurPos[i]);
            if (GetVectorDistance(vLastPos[i], vCurPos[i]) > TELEPORT_DETECT_THRESHOLD) {
                TeleportEntity(i, vLastPos[i], NULL_VECTOR, NULL_VECTOR);
            }
            else vLastPos[i] = vCurPos[i];
        }
        else bNeedToInitialize[i] = true;
    }
}

ЛОЛ, так у тебя игроки не смогут удалиться от точки возрождения на расстояние большее, чем на установленное в TELEPORT_DETECT_THRESHOLD
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
какой смысл создавать переменную каждый тик?
static можно - то же самое, только видимость переменной лишь в пределах функции.
нужно устанавливать значение для каждого из элементов массива
vLastPos
bNeedToInitialize

vCurPos
Что так и не сделано.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,558
Реакции
5,060

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
только что поправил
Фокус не удался:
C-подобный:
SourcePawn Compiler 1.7.1
Copyright (c) 1997-2006 ITB CompuPhase
Copyright (c) 2004-2014 AlliedModders LLC

/groups/sourcemod/upload_tmp/textEq6um7.sp(8) : error 033: array must be indexed (variable "bNeedToInitialize")
/groups/sourcemod/upload_tmp/textEq6um7.sp(9) : error 048: array (s do not match
/groups/sourcemod/upload_tmp/textEq6um7.sp(10) : error 033: array must be indexed (variable "bNeedToInitialize")
/groups/sourcemod/upload_tmp/textEq6um7.sp(12) : error 048: array (s do not match
/groups/sourcemod/upload_tmp/textEq6um7.sp(13) : error 048: array (s do not match
/groups/sourcemod/upload_tmp/textEq6um7.sp(14) : error 017: undefined symbol "TeleportEntity"
/groups/sourcemod/upload_tmp/textEq6um7.sp(16) : error 023: array assignment must be simple assignment

7 Errors.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,558
Реакции
5,060
@AlmazON, ёлки зеленые, там проблема не в инициализации, проблема в том что в проверках эта переменная не является элементом массива

исправил ещё раз
заодно инклюды добавил
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
эта переменная не является элементом массива
Я и указал конкретно твою проблему.
заодно инклюды добавил
C-подобный:
SourcePawn Compiler 1.7.1
Copyright (c) 1997-2006 ITB CompuPhase
Copyright (c) 2004-2014 AlliedModders LLC

/groups/sourcemod/upload_tmp/text3dlRIK.sp(16) : error 017: undefined symbol "TELEPORT_DETECT_THRESHOLD"

1 Error.
:biggrin:
Забавно, но мой код даже легче, хоть и "длиннее". :grin:
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,558
Реакции
5,060
и не будет, т.к. ТС не определил это значение
Я вообще-то и предполагал свой текст как часть кода плагина, а не весь плагин.
В виде готового плагина у меня пороговое значение бы высчитывалось из длительности промежутка м/у тиками и значения серверной переменной максимальной скорости передвижения
плюс сделал бы проверку на падение, из-за которой игрок может зависнуть в воздухе, вместо того чтобы упасть, если пороговое значение будет меньше скорости падения игрока (а в игре ещё и ускорение падения есть, емнип).
 

"mikedmor"

Участник
Сообщения
27
Реакции
1
PHP:
#include <sdktools>

#define TELEPORT_DETECT_THRESHOLD 100.0

new bool:bNeedToInitialize[MAXPLAYERS + 1] = true;

public OnGameFrame()
{
    static Float:vCurPos[MAXPLAYERS + 1][3];
    static Float:vLastPos[MAXPLAYERS + 1][3];
    for (new i = 1; i <= MaxClients; ++i) {
        if (IsClientInGame(i)) {
            if (IsPlayerAlive(i)) {
                GetClientAbsOrigin(i, vCurPos[i]);
                if (bNeedToInitialize[i]) {
                    vLastPos[i] = vCurPos[i];
                    bNeedToInitialize[i] = false;
                }
                else if (GetVectorDistance(vLastPos[i], vCurPos[i]) > TELEPORT_DETECT_THRESHOLD) {
                    TeleportEntity(i, vLastPos[i], NULL_VECTOR, NULL_VECTOR);
                }
            }
            else {
                bNeedToInitialize[i] = true;
            }
        }
    }
}

public OnClientPostAdminCheck(client) {
    bNeedToInitialize[client] = true;
}
Лучше бы ещё через событие смерти и спавна оптимизировать. Или, даже так:
PHP:
#include <sdkhooks>
#include <sdktools>

#define TELEPORT_DETECT_THRESHOLD 100.0

new Float:vLastPos[MAXPLAYERS + 1][3];

public OnPluginStart() {
    HookEvent("player_activate", Event_PlayerActivate);
    HookEvent("player_death", Event_PlayerDeath);
}

public Event_PlayerActivate(Handle:event, const String:name[], bool:dontBroadcast) {
    SDKHook(GetClientOfUserId(GetEventInt(event, "userid")), SDKHook_SpawnPost, PlayerSpawn);
}

public PlayerSpawn(client) {
    GetClientAbsOrigin(client, vLastPos[client]);
    SDKHook(client, SDKHook_PostThinkPost, PostThinkPost);
}

public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) {
    SDKUnhook(GetClientOfUserId(GetEventInt(event, "userid")), SDKHook_PostThinkPost, PostThinkPost);
}

public PostThinkPost(client) {
    static Float:vCurPos[MAXPLAYERS + 1][3];
    GetClientAbsOrigin(client, vCurPos[client]);
    if (GetVectorDistance(vCurPos[client], vLastPos[client]) < TELEPORT_DETECT_THRESHOLD) {
        vLastPos[client] = vCurPos[client];
    }
    else {
        TeleportEntity(client, vLastPos[client], NULL_VECTOR, NULL_VECTOR);
    }
}
а можно в в наилучший вариант прикрутить запрет выбрасывания оружия в момент тп? Тогда этот плагин будет фиксить краш телепортом. Я в sp полный 0 поэтому прошу помочь мне :)
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755

"mikedmor"

Участник
Сообщения
27
Реакции
1
Это как? Там же десятая доля секунды - успевают выкинуть оружие читеры или что? Оффтоп
с читом на телепорт (aimware) начинаешь спамить кнопку G + кнопку телепорта = сервер в офе
--- Добавлено позже ---
Это как? Там же десятая доля секунды - успевают выкинуть оружие читеры или что? Оффтоп
из за бага когда выбрасываешь оружие во время телепорта оружие зависает в кординатах -x y и сервак крашит
 

"mikedmor"

Участник
Сообщения
27
Реакции
1
Пробуй, я сомневаюсь, что особо поможет:
PHP:
#include <sdkhooks>
#include <sdktools>

#define TELEPORT_DETECT_THRESHOLD 100.0

new Float:vLastPos[MAXPLAYERS + 1][3],
    bool:StickWeapon[MAXPLAYERS + 1];

public OnPluginStart() {
    HookEvent("player_activate", Event_PlayerActivate);
    HookEvent("player_death", Event_PlayerDeath);
    AddCommandListener(DropWeapon, "drop");
}

public Event_PlayerActivate(Handle:event, const String:name[], bool:dontBroadcast) {
    SDKHook(GetClientOfUserId(GetEventInt(event, "userid")), SDKHook_SpawnPost, PlayerSpawn);
}

public PlayerSpawn(client) {
    GetClientAbsOrigin(client, vLastPos[client]);
    SDKHook(client, SDKHook_PostThinkPost, PostThinkPost);
}

public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) {
    SDKUnhook(GetClientOfUserId(GetEventInt(event, "userid")), SDKHook_PostThinkPost, PostThinkPost);
}

public PostThinkPost(client) {
    static Float:vCurPos[MAXPLAYERS + 1][3];
    GetClientAbsOrigin(client, vCurPos[client]);
    if (GetVectorDistance(vCurPos[client], vLastPos[client]) < TELEPORT_DETECT_THRESHOLD) {
        vLastPos[client] = vCurPos[client];
        StickWeapon[client] = false;
    }
    else {
        StickWeapon[client] = true;
        TeleportEntity(client, vLastPos[client], NULL_VECTOR, NULL_VECTOR);
    }
}

public Action:DropWeapon(client, const String:name[], args) return ? StickWeapon[client] ? Plugin_Handled:Plugin_Continue;
error 029: invalid expression, assumed zero не компилится
 

"mikedmor"

Участник
Сообщения
27
Реакции
1
@"mikedmor", сильно спешишь копировать, скопируй заново.
крашит. Оружие застревает в воздухе и серв падает.
010557bf4339434fad7a7db14d6d66c4.png
 

"mikedmor"

Участник
Сообщения
27
Реакции
1
Я же предупреждал, что не сработает.
PHP:
#include <sdkhooks>
#include <sdktools>

#define TELEPORT_DETECT_THRESHOLD 100.0

new Float:vLastPos[MAXPLAYERS + 1][3],
    bool:StickWeapon[MAXPLAYERS + 1];

public OnPluginStart() {
    HookEvent("player_activate", Event_PlayerActivate);
    HookEvent("player_death", Event_PlayerDeath);
    AddCommandListener(DropWeapon, "drop");
}

public Event_PlayerActivate(Handle:event, const String:name[], bool:dontBroadcast) {
    SDKHook(GetClientOfUserId(GetEventInt(event, "userid")), SDKHook_SpawnPost, PlayerSpawn);
}

public PlayerSpawn(client) {
    GetClientAbsOrigin(client, vLastPos[client]);
    SDKHook(client, SDKHook_PostThinkPost, PostThinkPost);
    StickWeapon[client] = false;
}

public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) {
    SDKUnhook(GetClientOfUserId(GetEventInt(event, "userid")), SDKHook_PostThinkPost, PostThinkPost);
}

public PostThinkPost(client) {
    static Float:vCurPos[MAXPLAYERS + 1][3];
    GetClientAbsOrigin(client, vCurPos[client]);
    if (GetVectorDistance(vCurPos[client], vLastPos[client]) < TELEPORT_DETECT_THRESHOLD) {
        vLastPos[client] = vCurPos[client];
    }
    else {
        StickWeapon[client] = true;
        TeleportEntity(client, vLastPos[client], NULL_VECTOR, NULL_VECTOR);
    }
}

public Action:DropWeapon(client, const String:name[], args) return StickWeapon[client] ? Plugin_Handled:Plugin_Continue;
Попробуй "телепортнуться" сначала без выбрасывания оружия, просто.
сам телепорт не работает. Работает только краш сервера путём выбрасывания оружия в момент телепорта
 

"mikedmor"

Участник
Сообщения
27
Реакции
1
Без выбрасывания оружия чит не работает или плагин не телепортирует таких на место?
Твой плагин фиксит сам телепорт. Телепорт происходит ,но типа возвращает обратно за доли секунды. Крашит из за того что во время начала телепорта когда кориднаты прицела перса -x y он выбрасывает оружие по эти кординатам и сервак падает из за ошибки. А так твой плагин телепорт полностью фискит. Сам телепорт без выбрасывания оружия сервер не крашит :)
 
Сверху Снизу