Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 7 ПерваяПервая 1 2 3 4 ... ПоследняяПоследняя
Показано с 11 по 20 из 62
  1. #11
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    Цитата Сообщение от Pe4en9 Посмотреть сообщение
    косяк ищи, боты следят друг за другом и ресуются по коордам других ботов, потом резко к себе и так по циклу.
    ищи дырку.
    Что? Респавн "ботов" должен быть через OnPlayerSpawn, ты код то тестил? Если да, то предоставь более понятное описание, без использования жаргонизмов, а лучше всего видео.

  2. #12
    Аватар для NewGreen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от wAx Посмотреть сообщение
    Не нужно ничего доделывать. Игрок после выхода из слежки, отправляется на spawn.
    Могу сказать одно - система требует доработки, представим что админ находится на мероприятии, к примеру гонки, для гонок переменным админа присваиваются определенные данные, виртуальный мир, возможно интерьер, время отсчета и т.п., админ начинает участвовать в гонке, и тут внезапно ему потребовалось понаблюдать за каким либо игроком. что происходит:
    админ пишет /spectate и уходит наблюдать за игроком, потом пишет /offspec и появляется на спавне, но данные которые были записаны в переменные админа не обнулились и получается он находится на спавне и одновременно участвует в гонке - как это называется ?

    Заметил еще один момент:
    PHP код:
    public OnPlayerStateChange(playeridnewstateoldstate

        
    //Если игрок за которым следим, меняет свой статус относительно нас (садится в машину) 
        
    for(new 0!= MAX_PLAYERSi++) 
        { 
            if(
    IsPlayerConnected(i)) 
            { 
                if(
    spectating[i] == playerid)//Проверяем действительно ли следит следящий игрок именно за этим игроком 
                

                    
    //Колбэк указанный ниже, поможет нам быстро обновить режим слежки 
                    
    UpdateSpectatingStatus(iplayerid); 
                } 
            } 
        } 
        return 
    1

    public OnPlayerStateChange(playerid, newstate, oldstate) вызывается когда игрок нажимает на клавишу, пусть онлайн 100 человек и каждый игрок нажмет кнопку мыши, что вызовет данную функцию 100 раз, MAX_PLAYERS - имеет значение 1000, 100*1000 = 100 000 сто тысяч проверок - зачем ?
    Последний раз редактировалось NewGreen; 09.03.2015 в 17:29.

  3. #13
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    Цитата Сообщение от NewGreen Посмотреть сообщение
    Могу сказать одно - система требует доработки, представим что админ находится на мероприятии, к примеру гонки, для гонок переменным админа присваиваются определенные данные, виртуальный мир, возможно интерьер, время отсчета и т.п., админ начинает участвовать в гонке, и тут внезапно ему потребовалось понаблюдать за каким либо игроком. что происходит:
    админ пишет /spectate и уходит наблюдать за игроком, потом пишет /offspec и появляется на спавне, но данные которые были записаны в переменные админа не обнулились и получается он находится на спавне и одновременно участвует в гонке - как это называется ?

    Заметил еще один момент:
    PHP код:
    public OnPlayerStateChange(playeridnewstateoldstate

        
    //Если игрок за которым следим, меняет свой статус относительно нас (садится в машину) 
        
    for(new 0!= MAX_PLAYERSi++) 
        { 
            if(
    IsPlayerConnected(i)) 
            { 
                if(
    spectating[i] == playerid)//Проверяем действительно ли следит следящий игрок именно за этим игроком 
                

                    
    //Колбэк указанный ниже, поможет нам быстро обновить режим слежки 
                    
    UpdateSpectatingStatus(iplayerid); 
                } 
            } 
        } 
        return 
    1

    public OnPlayerStateChange(playerid, newstate, oldstate) вызывается когда игрок нажимает на клавишу, пусть онлайн 100 человек и каждый игрок нажмет кнопку мыши, что вызовет данную функцию 100 раз, MAX_PLAYERS - имеет значение 1000, 100*1000 = 100 000 сто тысяч проверок - зачем ?
    Мануалом я хотел показать как сделать автоматическое обновление в режиме слежки, а не как тпшнуть администратора обратно на мп, это необязательное условие. Я понимаю, так удобнее, но полезность мануала отсутствие этого фактора не портит. Я обещаю подумать и может быть сделать дополнение в будущем.

    OnPlayerState, кнопки, вызывается когда нажимает клавишу? Ничего не перепутали? А по поводу MAX_PLAYERS, да, действительно, в новой версии оно имеет значение 1000, но в текущей, можно переназначить MAX_PLAYERS под своё количество слотов, либо заменить циклом foreach. Это всё - возможные варианты, код в мануале сугубо примерный, как бы если он будет ничего серьезного не случится, но его можно с легкостью улучшить и ускорить его работу. В общем я надеюсь я донес мысль.
    Последний раз редактировалось wAx; 09.03.2015 в 18:05.

  4. #14
    Аватар для NewGreen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от wAx Посмотреть сообщение
    Мануалом я хотел показать как сделать автоматическое обновление в режиме слежки, а не как тпшнуть администратора обратно на мп, это необязательное условие. Я понимаю, так удобнее, но полезность мануала отсутствие этого фактора не портит. Я обещаю подумать и может быть сделать дополнение в будущем.
    Все дело в функциональности, чем функциональность больше, тем приятнее использовать, вам ведь неудобно будет использовать телефон/смартфон в котором есть многое, но нет динамиков, т.е. пользоваться им можно, но не удобно, нужно постоянно подключать гарнитуру.

    Цитата Сообщение от wAx Посмотреть сообщение
    OnPlayerState, кнопки, вызывается когда нажимает клавишу? Ничего не перепутали? А по поводу MAX_PLAYERS, да, действительно, в новой версии оно имеет значение 1000, но в текущей, можно переназначить MAX_PLAYERS под своё количество слотов, либо заменить цикл foreach. Это всё - возможные варианты, код в мануале сугубо примерный, как бы если он будет ничего серьезного не случится, но его можно с легкостью улучшить и ускорить его работу. В общем я надеюсь я донес мысль.
    Признаю, действительно я перепутал OnPlayerStateChange с OnPlayerKeyStateChange, по поводу MAX_PLAYERS, лучше не изобретать велосипед, а просто поставить дополнительную проверку впереди цикла:

    PHP код:
    public OnPlayerStateChange(playeridnewstateoldstate

        
    //Если игрок за которым следим, меняет свой статус относительно нас (садится в машину)
        
    if(spectating[playerid] != -1) {
            for(new 
    0!= MAX_PLAYERSi++) 
            { 
                if(
    IsPlayerConnected(i)) 
                { 
                    if(
    spectating[i] == playerid)//Проверяем действительно ли следит следящий игрок именно за этим игроком 
                    

                        
    //Колбэк указанный ниже, поможет нам быстро обновить режим слежки 
                        
    UpdateSpectatingStatus(iplayerid); 
                    } 
                } 
            } 
        }
        return 
    1

    Последний раз редактировалось NewGreen; 09.03.2015 в 18:24.

  5. #15
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    Цитата Сообщение от NewGreen Посмотреть сообщение
    Все дело в функциональности, чем функциональность больше, тем приятнее использовать, вам ведь неудобно будет использовать телефон/смартфон в котором есть многое, но нет динамиков, т.е. пользоваться им можно, но не удобно, нужно постоянно подключать гарнитуру.



    Признаю, действительно я перепутал OnPlayerStateChange с OnPlayerKeyStateChange, по поводу MAX_PLAYERS, лучше не изобретать велосипед, а просто поставить дополнительную проверку впереди цикла:

    PHP код:
    public OnPlayerStateChange(playeridnewstateoldstate

        
    //Если игрок за которым следим, меняет свой статус относительно нас (садится в машину)
        
    if(spectating[playerid] != -1) {
            for(new 
    0!= MAX_PLAYERSi++) 
            { 
                if(
    IsPlayerConnected(i)) 
                { 
                    if(
    spectating[i] == playerid)//Проверяем действительно ли следит следящий игрок именно за этим игроком 
                    

                        
    //Колбэк указанный ниже, поможет нам быстро обновить режим слежки 
                        
    UpdateSpectatingStatus(iplayerid); 
                    } 
                } 
            } 
        }
        return 
    1

    Что ты хочешь проверить? Сейчас ты проверяешь следит ли игрок за кем нибудь. Еще раз: ты проверяешь, следит ли за кем нибудь, игрок за которым возможно мы следим. Зачем? Код не будет работать, ты можешь в этом убедится.

    - - - Добавлено - - -

    P.S. Код не вызовется, пока игрок который у нас является playerid в этом паблике не перейдет в режим слежки за кем нибудь. Не нужно изобретать велосипед? foreach, GetMaxPlayers и новые функции 0.3.7 RC2, это не велосипед, отнюдь не велосипед.

    - - - Добавлено - - -

    По поводу функциональности. Суть мануала в том, чтобы показать как удобнее и практичнее обновлять режим слежки в необходимых случаях (смена интерьера, виртуального мира). Вскоре я добавлю сохранение последней позиции.
    Последний раз редактировалось wAx; 09.03.2015 в 18:34.

  6. #16
    Аватар для NewGreen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от wAx Посмотреть сообщение
    Что ты хочешь проверить? Сейчас ты проверяешь следит ли игрок за кем нибудь. Еще раз: ты проверяешь, следит ли за кем нибудь, игрок за которым возможно мы следим. Зачем? Код не будет работать, ты можешь в этом убедится.

    - - - Добавлено - - -

    P.S. Код не вызовется, пока игрок который у нас является playerid в этом паблике не перейдет в режим слежки за кем нибудь. Не нужно изобретать велосипед? foreach, GetMaxPlayers и новые функции 0.3.7 RC2, это не велосипед, отнюдь не велосипед.

    - - - Добавлено - - -

    По поводу функциональности. Суть мануала в том, чтобы показать как удобнее и практичнее обновлять режим слежки в необходимых случаях (смена интерьера, виртуального мира). Вскоре я добавлю сохранение последней позиции.
    Я поторопился с выводами в данной функции, точнее, я не просматривал ваш мануал полностью, а лишь глянул частично, в связи с чем критично отнесся к логики этой конструкции, думаю лучше оставить как есть, или добавить GetMaxPlayers, но не foreach, априори мануал должен быть универсальным.

  7. #17
    Аватар для Mazzilla
    Пользователь

    Статус
    Оффлайн
    Регистрация
    27.11.2013
    Адрес
    Нижневартовск
    Сообщений
    256
    Репутация:
    63 ±
    Всё хорошо, но в дополнении с NUM4 и NUM6 есть недочёт: нет проверки на то, что следующий айди вообще имеется на сервере (подключен) и не находится в режиме слежки. Я предлагаю свой вариант. Возможно, вы придумаете что-либо лучше, главное - уловите мысль:
    PHP код:
    public OnPlayerKeyStateChange(playeridnewkeysoldkeys

        if(
    newkeys KEY_ANALOG_LEFT// проверяем нажатие клавиши NUM 4 
        

            if(
    spectating[playerid] != -1// проверяем наблюдает ли за кем-либо игрок 
            
    {                          
                if(
    spectating[playerid] <= 0spectating[playerid] = GetMaxPlayers(); // если игрок наблюдает за минимальным ID, то перекидываем его на максимальный
                
    else 
                {
                    for(new 
    spectating[playerid]; >= 0i--) // поиск игрока с меньшим ID от того, за которым наблюдали ранее.
                    
    {
                        if(!
    IsPlayerConnected(i)) continue;
                        if(
    GetPlayerState(i) == PLAYER_STATE_SPECTATE) continue; 
                        
    spectating[playerid] = i;
                        break;
                    }
                } 
                
    UpdateSpectatingStatus(playeridspectating[playerid]); // обновляем режим слежки 
            

        } 
         
        if(
    newkeys KEY_ANALOG_RIGHT// проверяем нажатие клавиши NUM 6 
        

            if(
    spectating[playerid] != -1// проверяем наблюдает ли за кем-либо игрок 
            
    {            
                if(
    spectating[playerid] >= GetMaxPlayers()) spectating[playerid] = 0// если игрок наблюдает за максимальным ID, перекидываем его на минимальный 
                
    else
                {
                    for(new 
    spectating[playerid]; <= GetMaxPlayers(); i++) // поиск игрока с большим ID от того, за которым наблюдали ранее.
                    
    {
                        if(!
    IsPlayerConnected(i)) continue;
                        if(
    GetPlayerState(i) == PLAYER_STATE_SPECTATE) continue; 
                        
    spectating[playerid] = i;
                        break;
                    }
                }
                
    UpdateSpectatingStatus(playeridspectating[playerid]); // обновляем режим слежки 
            

        } 
        return 
    1
        
    // Не спорю, удобнее будет из цикла вытаскивать ID самого большого подключившегося игрока 
        // Но, я не думаю что это будет мелочью в плане быстродействия кода. 
        // Можно также завести переменную и записывать в нёё самый последний ID подключившегося игрока (см. примечание 2) 

    Последний раз редактировалось Mazzilla; 11.03.2015 в 14:23.

  8. #18
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Делал как то подобное, с помощью контролированного goto, код в разы меньше был...

  9. #19
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    Цитата Сообщение от Bublik_Public Посмотреть сообщение
    Делал как то подобное, с помощью контролированного goto, код в разы меньше был...
    ну поделись.

    - - - Добавлено - - -

    Цитата Сообщение от Mazzilla Посмотреть сообщение
    Всё хорошо, но в дополнении с NUM4 и NUM6 есть недочёт: нет проверки на то, что следующий айди вообще имеется на сервере (подключен) и не находится в режиме слежки. Я предлагаю свой вариант. Возможно, вы придумаете что-либо лучше, главное - уловите мысль:
    PHP код:
    public OnPlayerKeyStateChange(playeridnewkeysoldkeys

        if(
    newkeys KEY_ANALOG_LEFT// проверяем нажатие клавиши NUM 4 
        

            if(
    spectating[playerid] != -1// проверяем наблюдает ли за кем-либо игрок 
            
    {                          
                if(
    spectating[playerid] <= 0spectating[playerid] = GetMaxPlayers(); // если игрок наблюдает за минимальным ID, то перекидываем его на максимальный
                
    else 
                {
                    for(new 
    spectating[playerid]; >= 0i--) // поиск игрока с меньшим ID от того, за которым наблюдали ранее.
                    
    {
                        if(!
    IsPlayerConnected(i)) continue;
                        if(
    GetPlayerState(i) == PLAYER_STATE_SPECTATE) continue; 
                        
    spectating[playerid] = i;
                        break;
                    }
                } 
                
    UpdateSpectatingStatus(playeridspectating[playerid]); // обновляем режим слежки 
            

        } 
         
        if(
    newkeys KEY_ANALOG_RIGHT// проверяем нажатие клавиши NUM 6 
        

            if(
    spectating[playerid] != -1// проверяем наблюдает ли за кем-либо игрок 
            
    {            
                if(
    spectating[playerid] >= GetMaxPlayers()) spectating[playerid] = 0// если игрок наблюдает за максимальным ID, перекидываем его на минимальный 
                
    else
                {
                    for(new 
    spectating[playerid]; <= GetMaxPlayers(); i++) // поиск игрока с большим ID от того, за которым наблюдали ранее.
                    
    {
                        if(!
    IsPlayerConnected(i)) continue;
                        if(
    GetPlayerState(i) == PLAYER_STATE_SPECTATE) continue; 
                        
    spectating[playerid] = i;
                        break;
                    }
                }
                
    UpdateSpectatingStatus(playeridspectating[playerid]); // обновляем режим слежки 
            

        } 
        return 
    1
        
    // Не спорю, удобнее будет из цикла вытаскивать ID самого большого подключившегося игрока 
        // Но, я не думаю что это будет мелочью в плане быстродействия кода. 
        // Можно также завести переменную и записывать в нёё самый последний ID подключившегося игрока (см. примечание 2) 

    Циклы циклы циклы, ну я же оставил, похоже специально для тебя, подсчет максимального ID. Смотри примечание 2
    И как мне кажется, переключение под ID, используют админы не имеющие конкретной цели для мониторинга. Выгоднее начинать с 0 ID и щелкать, а как они увидят что ID "закончились", перейдут снова в слежку за 0. Цикл конечно неплохо, твой вариант рабочий и весьма пригодный.
    Последний раз редактировалось wAx; 11.03.2015 в 19:54.

  10. #20
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    К сожалению код был утерен, и сейчас восстановить не смогу, т.к не смогу провести тесты с нубо-компом (32 мб видеокарта :D)

 

 
Страница 2 из 7 ПерваяПервая 1 2 3 4 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •