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

Тема в разделе "Counter-Strike: Global Offensive", создана пользователем "mikedmor", 29 сен 2016.

  1. "mikedmor"

    "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
     
  2. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.563
    Симпатии:
    1.988
    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 
    1<= MaxClients; ++i) {
            if (
    IsClientInGame(i)) {
                if (
    IsPlayerAlive(i)) {
                    
    GetClientAbsOrigin(ivCurPos[i]);
                    if (
    bNeedToInitialize[i]) {
                        
    vLastPos[i] = vCurPos[i];
                        
    bNeedToInitialize[i] = false;
                    }
                    else if (
    GetVectorDistance(vLastPos[i], vCurPos[i]) > TELEPORT_DETECT_THRESHOLD) {
                        
    TeleportEntity(ivLastPos[i], NULL_VECTORNULL_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_SpawnPostPlayerSpawn);
    }

    public 
    PlayerSpawn(client) {
        
    GetClientAbsOrigin(clientvLastPos[client]);
        
    SDKHook(clientSDKHook_PostThinkPostPostThinkPost);
    }

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

    public 
    PostThinkPost(client) {
        static 
    Float:vCurPos[MAXPLAYERS 1][3];
        
    GetClientAbsOrigin(clientvCurPos[client]);
        if (
    GetVectorDistance(vCurPos[client], vLastPos[client]) < TELEPORT_DETECT_THRESHOLD) {
            
    vLastPos[client] = vCurPos[client];
        }
        else {
            
    TeleportEntity(clientvLastPos[client], NULL_VECTORNULL_VECTOR);
        }
    }
     
    Последнее редактирование: 29 сен 2016
    "mikedmor" нравится это.
  3. Grey83

    Grey83

    Сообщения:
    351
    Симпатии:
    101
    Ошибка у тебя в ДНК том что 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 
    1<= MaxClientsi++) {
            if (
    IsClientInGame(i) && IsPlayerAlive(i)) {
                if (
    bNeedToInitialize[i]) {
                    
    GetClientAbsOrigin(ivLastPos[i]);
                    
    bNeedToInitialize[i] = false;
                }
                
    GetClientAbsOrigin(ivCurPos[i]);
                if (
    GetVectorDistance(vLastPos[i], vCurPos[i]) > TELEPORT_DETECT_THRESHOLD) {
                    
    TeleportEntity(ivLastPos[i], NULL_VECTORNULL_VECTOR);
                }
                else 
    vLastPos[i] = vCurPos[i];
            }
            else 
    bNeedToInitialize[i] = true;
        }
    }
    ЛОЛ, так у тебя игроки не смогут удалиться от точки возрождения на расстояние большее, чем на установленное в TELEPORT_DETECT_THRESHOLD
     
    Последнее редактирование: 29 сен 2016
  4. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.563
    Симпатии:
    1.988
    static можно - то же самое, только видимость переменной лишь в пределах функции.
    Что так и не сделано.
     
  5. Grey83

    Grey83

    Сообщения:
    351
    Симпатии:
    101
    почему же? там везде нули, где new перед названием переменной
    пойду справку почитаю, что ли
     
  6. Grey83

    Grey83

    Сообщения:
    351
    Симпатии:
    101
    это потому что я забыл в конце первой строки поставить знак ;
    только что поправил
     
  7. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.563
    Симпатии:
    1.988
    Фокус не удался:
    Код:
    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.
     
    CrazyHackGUT нравится это.
  8. Grey83

    Grey83

    Сообщения:
    351
    Симпатии:
    101
    @AlmazON, ёлки зеленые, там проблема не в инициализации, проблема в том что в проверках эта переменная не является элементом массива

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

    CrazyHackGUT Меня здесь нет

    Сообщения:
    876
    Симпатии:
    545
  10. Grey83

    Grey83

    Сообщения:
    351
    Симпатии:
    101
    CrazyHackGUT нравится это.
  11. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.563
    Симпатии:
    1.988
    Я и указал конкретно твою проблему.
    Код:
    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:
     
    CrazyHackGUT нравится это.
  12. Grey83

    Grey83

    Сообщения:
    351
    Симпатии:
    101
    и не будет, т.к. ТС не определил это значение
    Я вообще-то и предполагал свой текст как часть кода плагина, а не весь плагин.
    В виде готового плагина у меня пороговое значение бы высчитывалось из длительности промежутка м/у тиками и значения серверной переменной максимальной скорости передвижения
    плюс сделал бы проверку на падение, из-за которой игрок может зависнуть в воздухе, вместо того чтобы упасть, если пороговое значение будет меньше скорости падения игрока (а в игре ещё и ускорение падения есть, емнип).
     
  13. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.563
    Симпатии:
    1.988
    Там много, что не учтено. Стоит даже вспомнить те же плагины, в которых есть свой телепорт - точно баг будет.
     
  14. "mikedmor"

    "mikedmor"

    Сообщения:
    27
    Симпатии:
    1
    а можно в в наилучший вариант прикрутить запрет выбрасывания оружия в момент тп? Тогда этот плагин будет фиксить краш телепортом. Я в sp полный 0 поэтому прошу помочь мне :)
     
  15. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.563
    Симпатии:
    1.988
    Это как? Там же десятая доля секунды - успевают выкинуть оружие читеры или что? Оффтоп
     
    "mikedmor" нравится это.
  16. "mikedmor"

    "mikedmor"

    Сообщения:
    27
    Симпатии:
    1
    с читом на телепорт (aimware) начинаешь спамить кнопку G + кнопку телепорта = сервер в офе
    --- Добавлено позже ---
    из за бага когда выбрасываешь оружие во время телепорта оружие зависает в кординатах -x y и сервак крашит
     
  17. "mikedmor"

    "mikedmor"

    Сообщения:
    27
    Симпатии:
    1
    error 029: invalid expression, assumed zero не компилится
     
  18. "mikedmor"

    "mikedmor"

    Сообщения:
    27
    Симпатии:
    1
    крашит. Оружие застревает в воздухе и серв падает.[​IMG]
     
  19. "mikedmor"

    "mikedmor"

    Сообщения:
    27
    Симпатии:
    1
    сам телепорт не работает. Работает только краш сервера путём выбрасывания оружия в момент телепорта
     
  20. "mikedmor"

    "mikedmor"

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