Убийство АФК в 8.00

Тема в разделе "Программирование / Скриптинг", создана пользователем OFFSprings, 25 сен 2015.

  1. OFFSprings

    OFFSprings

    Сообщения:
    12
    Симпатии:
    0
    Ребят подскажите правильно ли я написал плагин,который убивает АФК в 8.00.
    Все таки я не уверен.Компилятор не скачивал,ибо хотел человеку просто помочь.

    PHP:
    #include <sourcemod>
    #include <sdktoos>
    #include <cstrike>


    public OnPluginStart();
    {
        
    HookEvent("round_start",OnRoundStart,EventHookMode_PostNoCopy);
    }

    public 
    Action:OnRoundStart(Handle:event,const String[],bool dontBroadcast);
    {
        
    PrintToChatAll("/x03 АФК /x01 будут /x03 убиты")
        
    CreateTimer(60.0,TimerKillAfk);
    }


    public 
    TimerKillAfk(Handle:timer);
        for (
    int i=1,i<=MaxClients,i++)
        {
            if(
    IsClientInGame(i) && IsPlayerAlive(i))
            {
                
    float EyePosition=GetClientEyePosition(i,float position[3]);
                
    float RespawnPosition=GetClientAbsAngles(i,float respawnposition[3]);
                if (
    positon[0]=&& position[1]=&& position[2]=&& respawnposition[0]=&& respawnposition[1]=&& respawnposition[2]=0)
                {
                    
    ForcePlayerSuicide(i);
                }
            
    KillTimer();
            }
        }
    PrintToChatAll("/x03 АФК /x04 Убиты");
    Мне просто кажется ,что начальная позиция игрока после возрождения не [0;0;0]
     
    Последнее редактирование: 25 сен 2015
  2. AlmazON

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

    Сообщения:
    4.505
    Симпатии:
    1.961
    Подумай логически: точек респавна несколько десятков с небольшим расстоянием друг от друга, следовательно, у всех уже разные координаты.
    0;0;0; - это начало карты, её "первый" угол из 4. GetClientAbsOrigin(client, Float:vec[3]); даст координаты, где сейчас на карте находится игрок.
     
  3. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.970
    Симпатии:
    2.977
    OFFSprings, как минимум при спавне нужно сохранить координаты игрока чтобы потом было с чем сравнивать.
     
  4. OFFSprings

    OFFSprings

    Сообщения:
    12
    Симпатии:
    0
    А позицию глаз правильно выбрал?
     
  5. AlmazON

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

    Сообщения:
    4.505
    Симпатии:
    1.961
    Каша у тебя.
    PHP:
    decl Float:EyePosition[3], Float:RespawnPosition[3];
    GetClientEyePosition(iEyePosition);
    GetClientAbsAngles(iRespawnPosition);
    Если у тебя DM, то новый респавн может совпасть с бывшим АФК положением игрока, что не есть хорошо.
     
  6. OFFSprings

    OFFSprings

    Сообщения:
    12
    Симпатии:
    0
    Вот так переделал чуть чуть.
    PHP:
    #include <sourcemod>
    #include <sdktoos>
    #include <cstrike>


    public OnPluginStart();
    {
        
    HookEvent("round_start",OnRoundStart,EventHookMode_PostNoCopy);
    }
    public 
    OnRoundStart(Handle:event,const String:name[],bool dontBroadcast);
    {
        
    HookEvent("player_spawn",OnPlayerSpawn,EventHookMode_PostNoCopy);
    }

    public 
    OnPlayerSpawn(Handle:event,const String:name[],bool dontBroadCast);
           
    int client=GetClientOfUserid(GetEventInt(event,"userid"));
           
    decl float EyePosition1=GetClientEyePosition(client,float vec1[3]);
           
    decl float RespawnPosition1=GetClientAbsAngles(client,float vec2[3]);
           
    CreateTimer(30.0,TimerCheckAngles);

    public 
    TimerCheckAngles(Handle:timer);
           
    decl float EyePosition2=GetClientEyePosition(client,float vec3[3]);
           
    decl float RespawnPosition2=GetClientAbsAngles(client,float vec[4]);
           
    CreateTimer(30.0,TimerAfkKillers);

    public 
    TimerAfkKillers(Handle:timer);
           If (
    EyePosition1=EyePosition2 && RespawnPosition1=RespawnPosition2)
           {
               
    ForcePlayerSuicide(client);
           }
    return 
    Plugin_Handled;
     
  7. AlmazON

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

    Сообщения:
    4.505
    Симпатии:
    1.961
    Ещё хуже. В первом коде хоть часть получения координат страдала, а тут почти всё с ошибками.
    Но событие Спавна упоминается верно. round_start не даст координат, если игрок вступил чуть позже в команду.
     
  8. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.970
    Симпатии:
    2.977
    OFFSprings,
    PHP:
    HookEvent("player_spawn",OnPlayerSpawn,EventHookMode_PostNoCopy);
    Если ты ставишь EventHookMode_PostNoCopy то Handle:event будет 0. И индекс игрока ты не получишь.
    И хукай спавн в OnPluginStart()

    Координаты не получай при спавне. а через таймер после спавна. Хотябы на 1 сек. Ибо игрок спавнится чуть выше и его углы и позиция поменяются.

    И ты определись на каком синтаксисе пишешь, а то глаза болят смотреть.

    И ф-и не верно написаны, убери ; и возьми всё в { }
     
  9. OFFSprings

    OFFSprings

    Сообщения:
    12
    Симпатии:
    0
    Подскажи плиз просто словами,не кодом,что не так.Я новичок просто.Спасибо за помощь :)

    Добавлено через 6 минут
    Просто я хотел чтобы афк умирали ровно в 8:00,Я поэтому сперва отлавливал событие начала раунда,а для этого события отлавливал возрождения игрока,и вот еще интерестно,если в одной функции объявил переменную,ее можно оъявлять в другой функции или все-таки static в начале скрипта писать?

    Добавлено через 54 минуты
    Или вот вопрос,вот такой вариант будет правильным
    PHP:
    public Action:TimerCheck(Handle:timer)
    {
         
    int client=GetClientOfUserId(GetEventInt(timer,"userid"));
    }
    Добавлено через 1 час 17 минут
    Вот переделал так .
    PHP:
    #include <sourcemod>
    #include <sdktoos>
    #include <cstrike>


    public OnPluginStart()
    {
        
    HookEvent("player_spawn",OnPlayerSpawn,EventHookMode_Pre);
    }

    public 
    Action:OnPlayerSpawn(Handle:event,const String:name[],bool dontBroadcast)
    {
           
    CreateTimer(3.0,TimerCheck);
    }

    public 
    Action:TimerCheck(Handle:timer)
    {
        
    int client=GetClientOfUserId(GetEventInt(timer,"userid"));
        
    decl float p_Eyes=GetClientEyePosition(client,vec1[3]);
        
    decl float p_Resp=GetClientAbsAngles(client,vec2[3]);
        
    CreateTimer(27.0,TimerCheckTwo);
    }

    public 
    Action:TimerCheckTwo(Handle:timer)
    {
        
    decl float g_Eyes=GetClientEyePosition(client,vec3[3]);
        
    decl float g_Resp=GetClientAbsAngles(client,vec4[3]);
        
    CreateTimer(30.0,TimerToDie);
    }

    public 
    Action:TimerToDie(Handle:timer)
    {
        If (
    p_Eyes=g_Eyes && p_Resp=g_Resp)
        {
            
    ForcePlayerSuicide(client);
        }
    }
    return 
    Plugin_Handled()
     
    Последнее редактирование: 25 сен 2015