[Отслеживание] Убийство 5 врагов за 15 секунд

Тема в разделе "Программирование / Скриптинг", создана пользователем adacer, 5 май 2013.

  1. adacer

    adacer

    Сообщения:
    144
    Симпатии:
    16
    Как реализовать?(в идейном смысле, так сказать)
    Как я себе это представляю:

    Код:
    ивент_килл
       if(таймер_не_запущен)
          таймер(15.0, таймерЗакрыть, клиент)
           килл[клиент]++
    Но тут как бы проблема в том что:
    -- если не сделать проверку на запуск таймера
    А) для каждого килла будет отдельный таймер
    -- если сделать проверку на запуск таймера
    Б) для каждого нового убийства не будет запущен таймер(а это как бы по идее необходимо, так как ивент может выполнится, с 2 по 6-е убийство, а не с 1 по 5)

    P.S. Хук внутриигровой статы не пойдет
    PSS За нестандартный код и прочие неточности сорри, думаю так будет легче воспринимать

    идеи, мм?
     
  2. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    --- не раб
     
    Последнее редактирование: 6 май 2013
  3. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    The End Is Near..., вот он и говорит, что тогда будет 1-5, 6-10, а если 2-6, то не получится, то есть например первый враг был убит в 0:01, потом подряд пять врагов каждую секунду, наичная с 0:13, но таймер вырубится в 0:16 и в 0:17 запустится новый... Вот в чем путанница собственно...
    Может быть лучше не по таймеру, а записывать в массив время убийства.. Например

    killtimes[MAXPLAYERS+1][5];
    killnum[MAXPLAYERS+1];

    в killnum циклично записываем номер от 0 до 4, скажем так:
    PHP:
    public Event_OnPlayerDeath(Handle:event, const String:name[], bool:silent)
    {
        new 
    client=GetClientOfUserId(GetEventInt(event"attacker"));
        
    killtimes[client][killnum[client]]=GetTime();
        new 
    t=killnum[client]+1;
        if (
    t==5t=0;
        
        if(
    killtimes[client][killnum[client]] <= killtimes[client][t] + 15)
        {
            
    //что надо делать..
        
    }
        
    kilnum[client]++;
        if (
    killnum[client]==5killnum[client]=0;
    }
    Где-то так.. Может в чем-то ошибся, но думаю идея ясна
     
    adacer нравится это.
  4. V-Rico

    V-Rico SM Скриптер (Skype: v-rico.95)

    Сообщения:
    22
    Симпатии:
    9
    Вот еще, как вариант. Через массив.
    PHP:
    new killtime[MAXPLAYERS+1][6] = { 0, ... };

    public 
    OnPluginStart()
    {
        
    HookEvent("player_death"OnPlayerDeath);
    }

    public 
    OnPlayerDeath(Handle:event, const String:name[], bool:silent)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"attacker"));
        
        
    // Записываем в наш массив время каждого убийства: имеющиеся элементы сдвигаем (2->1, 3->2 и т.д.)
        
    for (i=1i<5i++)
            
    killtime[client][i]=killtime[client][i+1];

        
    // Добавляем на место 5 текущее время
        
    killtime[client][5]=GetTime();
        
        
    // Если разница во времени между пятым и первым фрагом <= 15 секундам
        
    if (killtime[client][5] - killtimes[client][1] <= 15)
        {
            
    PrintToChatAll("Combo!");
            
    // Тут выполняем то, что нужно
        
    }
    }
     
    Последнее редактирование: 6 май 2013
  5. schmidt

    schmidt wS (skype: ws.css)

    Сообщения:
    188
    Симпатии:
    347
    Оффтоп
     
    KorDen и V-Rico нравится это.
  6. V-Rico

    V-Rico SM Скриптер (Skype: v-rico.95)

    Сообщения:
    22
    Симпатии:
    9
    Опечатка, конечно же там 6.
     
  7. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    V-Rico, про индексы тебе уже schmidt сказал, и тем более сдвиг массива совершенно бессмысленен, только трата ресурсов (на DM x64 это может быть заметно). так как тебе не нужна сортировка для чего-то, оптимальнее будет все же заносить текущий элемент, не связываясь с тасканием туда-сюда.
    Оффтоп

    ШО? Откуда 6????????? АУ! Сходи поучи Си хотя бы базово...

    --------
    А, понял какие "6", но тогда 0 ячейка не используется, лишние растраты, раз уж сдвиг юзать...
     
  8. V-Rico

    V-Rico SM Скриптер (Skype: v-rico.95)

    Сообщения:
    22
    Симпатии:
    9
    KorDen, это ты говоришь про трату ресурсов? У тебя 2 массива: один одномерный, другой - двумерный. У меня один двумерный. Безусловно, можно было и оставить массив с 5 ячейками, но для понимания так лучше. Хочется экономии? Держи:
    PHP:
    new killtime[MAXPLAYERS+1][5] = { 0, ... };

    public 
    OnPluginStart()
    {
        
    HookEvent("player_death"OnPlayerDeath);
    }

    public 
    OnPlayerDeath(Handle:event, const String:name[], bool:silent)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"attacker"));
        
        
    // Записываем в наш массив время каждого убийства: имеющиеся элементы сдвигаем (2->1, 3->2 и т.д.)
        
    for (new i=0i<4i++)
            
    killtime[client][i]=killtime[client][i+1];

        
    // Добавляем на место 5 текущее время
        
    killtime[client][4]=GetTime();
        
        
    // Если разница во времени между пятым и первым фрагом <= 15 секундам
        
    if (killtime[client][4] - killtimes[client][0] <= 15)
        {
            
    PrintToChatAll("Combo!");
            
    // Тут выполняем то, что нужно
        
    }
    }
    Так больше нравится?

    P.S. Сейчас просматривал, заметил: забыл объявить переменную i. Исправил.
     
  9. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    V-Rico, трата ресурсов бывает разная. Когда какое-то событие вызывается редко, то да, лучше меньше памяти использовать, а побольше выполнить в событии (как у тебя сдвиг массива). А когда событие вызывается относиельно часто (у меня на DM это "81,885 last 24h", а в сутках 86400 секунд...), тут лучше будет пожертвовать памятью в пользу оптимизации кода и избавления от выполнения сдвига массива. А в твоем первоначальном варианте лишняя ячейка как раз занимала место, равное моему второму массиву, выходило что по памяти одно и то же, а обработка события у тебя больше.
     
  10. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    V-Rico
    0, 1, 2, 3 - 4 цифры, а нужно пять
     
  11. V-Rico

    V-Rico SM Скриптер (Skype: v-rico.95)

    Сообщения:
    22
    Симпатии:
    9
    PHP:
        // Добавляем на место 5 текущее время
        
    killtime[client][4]=GetTime();
     
  12. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    V-Rico
    i<4 - Эврика
     
  13. V-Rico

    V-Rico SM Скриптер (Skype: v-rico.95)

    Сообщения:
    22
    Симпатии:
    9
    The End Is Near..., если ты внимательно посмотришь на цикл, то увидишь, что идёт присвоение i-ому значения i+1. Самый конец - число 3. В 3 ячейку массива будет записано число из 4ой. Если мы прокрутим цикл еще раз, то выйдем за пределы массива (5ого элемента у нас нет), поэтому просто необходимо присвоить 4ому элементу значение отдельно от цикла.
     
  14. FUKSA

    FUKSA

    Сообщения:
    2
    Симпатии:
    0
    Код:
    #define SLOTCOUNT 10
    
    new killLogRate[SLOTCOUNT], killLogTime[SLOTCOUNT];
    public EvtPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
    {
    	new killer = GetClientOfUserId(GetEventInt(event, "attacker")), victim = GetClientOfUserId(GetEventInt(event, "userid"));
    	if(killer != 0 && killer != victim && GetClientTeam(killer) != GetClientTeam(victim)) {
    		killLogRate[killer]++;
    		switch(killLogRate[killer]) {
    			case 1: {
    				killLogTime[killer] = GetTime() + 15;
    			}
    			case 5: {
    				if(killLogTime[killer] >= GetTime()) {
    					// 5 килов за 15 сек
    				}
    			}
    		}
    	}
    }
    
    public EvtRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
    {
    	for(new i = 0; i < sizeof(killLogRate); i++) {
    		killLogRate[i] = 0;
    		killLogTime[i] = 0;
    	}
    }
    захукать и указать свое количество слотов
     
  15. KorDen

    KorDen Atra esterní ono thelduin!

    Сообщения:
    2.194
    Симпатии:
    1.398
    FUKSA, для DeathMatch не подойдет, да и уже решили...
     
  16. FUKSA

    FUKSA

    Сообщения:
    2
    Симпатии:
    0
    KorDen, почему же? убрать проверку на команду (если это FFA) а так нацелено на TDM или MIX.
    А то получится, забиндить kill и использовать 5 раз