Мои работы и публикации:
Могу сказать одно - система требует доработки, представим что админ находится на мероприятии, к примеру гонки, для гонок переменным админа присваиваются определенные данные, виртуальный мир, возможно интерьер, время отсчета и т.п., админ начинает участвовать в гонке, и тут внезапно ему потребовалось понаблюдать за каким либо игроком. что происходит:
админ пишет /spectate и уходит наблюдать за игроком, потом пишет /offspec и появляется на спавне, но данные которые были записаны в переменные админа не обнулились и получается он находится на спавне и одновременно участвует в гонке - как это называется ?
Заметил еще один момент:
public OnPlayerStateChange(playerid, newstate, oldstate) вызывается когда игрок нажимает на клавишу, пусть онлайн 100 человек и каждый игрок нажмет кнопку мыши, что вызовет данную функцию 100 раз, MAX_PLAYERS - имеет значение 1000, 100*1000 = 100 000 сто тысяч проверок - зачем ?PHP код:
public OnPlayerStateChange(playerid, newstate, oldstate)
{
//Если игрок за которым следим, меняет свой статус относительно нас (садится в машину)
for(new i = 0; i != MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
if(spectating[i] == playerid)//Проверяем действительно ли следит следящий игрок именно за этим игроком
{
//Колбэк указанный ниже, поможет нам быстро обновить режим слежки
UpdateSpectatingStatus(i, playerid);
}
}
}
return 1;
}
Последний раз редактировалось NewGreen; 09.03.2015 в 17:29.
Мануалом я хотел показать как сделать автоматическое обновление в режиме слежки, а не как тпшнуть администратора обратно на мп, это необязательное условие. Я понимаю, так удобнее, но полезность мануала отсутствие этого фактора не портит. Я обещаю подумать и может быть сделать дополнение в будущем.
OnPlayerState, кнопки, вызывается когда нажимает клавишу? Ничего не перепутали? А по поводу MAX_PLAYERS, да, действительно, в новой версии оно имеет значение 1000, но в текущей, можно переназначить MAX_PLAYERS под своё количество слотов, либо заменить циклом foreach. Это всё - возможные варианты, код в мануале сугубо примерный, как бы если он будет ничего серьезного не случится, но его можно с легкостью улучшить и ускорить его работу. В общем я надеюсь я донес мысль.
Последний раз редактировалось wAx; 09.03.2015 в 18:05.
Мои работы и публикации:
Все дело в функциональности, чем функциональность больше, тем приятнее использовать, вам ведь неудобно будет использовать телефон/смартфон в котором есть многое, но нет динамиков, т.е. пользоваться им можно, но не удобно, нужно постоянно подключать гарнитуру.
Признаю, действительно я перепутал OnPlayerStateChange с OnPlayerKeyStateChange, по поводу MAX_PLAYERS, лучше не изобретать велосипед, а просто поставить дополнительную проверку впереди цикла:
PHP код:
public OnPlayerStateChange(playerid, newstate, oldstate)
{
//Если игрок за которым следим, меняет свой статус относительно нас (садится в машину)
if(spectating[playerid] != -1) {
for(new i = 0; i != MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
if(spectating[i] == playerid)//Проверяем действительно ли следит следящий игрок именно за этим игроком
{
//Колбэк указанный ниже, поможет нам быстро обновить режим слежки
UpdateSpectatingStatus(i, playerid);
}
}
}
}
return 1;
}
Последний раз редактировалось NewGreen; 09.03.2015 в 18:24.
Что ты хочешь проверить? Сейчас ты проверяешь следит ли игрок за кем нибудь. Еще раз: ты проверяешь, следит ли за кем нибудь, игрок за которым возможно мы следим. Зачем? Код не будет работать, ты можешь в этом убедится.
- - - Добавлено - - -
P.S. Код не вызовется, пока игрок который у нас является playerid в этом паблике не перейдет в режим слежки за кем нибудь. Не нужно изобретать велосипед? foreach, GetMaxPlayers и новые функции 0.3.7 RC2, это не велосипед, отнюдь не велосипед.
- - - Добавлено - - -
По поводу функциональности. Суть мануала в том, чтобы показать как удобнее и практичнее обновлять режим слежки в необходимых случаях (смена интерьера, виртуального мира). Вскоре я добавлю сохранение последней позиции.
Последний раз редактировалось wAx; 09.03.2015 в 18:34.
Мои работы и публикации:
Я поторопился с выводами в данной функции, точнее, я не просматривал ваш мануал полностью, а лишь глянул частично, в связи с чем критично отнесся к логики этой конструкции, думаю лучше оставить как есть, или добавить GetMaxPlayers, но не foreach, априори мануал должен быть универсальным.
Всё хорошо, но в дополнении с NUM4 и NUM6 есть недочёт: нет проверки на то, что следующий айди вообще имеется на сервере (подключен) и не находится в режиме слежки. Я предлагаю свой вариант. Возможно, вы придумаете что-либо лучше, главное - уловите мысль:
PHP код:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys & KEY_ANALOG_LEFT) // проверяем нажатие клавиши NUM 4
{
if(spectating[playerid] != -1) // проверяем наблюдает ли за кем-либо игрок
{
if(spectating[playerid] <= 0) spectating[playerid] = GetMaxPlayers(); // если игрок наблюдает за минимальным ID, то перекидываем его на максимальный
else
{
for(new i = spectating[playerid]; i >= 0; i--) // поиск игрока с меньшим ID от того, за которым наблюдали ранее.
{
if(!IsPlayerConnected(i)) continue;
if(GetPlayerState(i) == PLAYER_STATE_SPECTATE) continue;
spectating[playerid] = i;
break;
}
}
UpdateSpectatingStatus(playerid, spectating[playerid]); // обновляем режим слежки
}
}
if(newkeys & KEY_ANALOG_RIGHT) // проверяем нажатие клавиши NUM 6
{
if(spectating[playerid] != -1) // проверяем наблюдает ли за кем-либо игрок
{
if(spectating[playerid] >= GetMaxPlayers()) spectating[playerid] = 0; // если игрок наблюдает за максимальным ID, перекидываем его на минимальный
else
{
for(new i = spectating[playerid]; i <= GetMaxPlayers(); i++) // поиск игрока с большим ID от того, за которым наблюдали ранее.
{
if(!IsPlayerConnected(i)) continue;
if(GetPlayerState(i) == PLAYER_STATE_SPECTATE) continue;
spectating[playerid] = i;
break;
}
}
UpdateSpectatingStatus(playerid, spectating[playerid]); // обновляем режим слежки
}
}
return 1;
// Не спорю, удобнее будет из цикла вытаскивать ID самого большого подключившегося игрока
// Но, я не думаю что это будет мелочью в плане быстродействия кода.
// Можно также завести переменную и записывать в нёё самый последний ID подключившегося игрока (см. примечание 2)
}
Последний раз редактировалось Mazzilla; 11.03.2015 в 14:23.
Делал как то подобное, с помощью контролированного goto, код в разы меньше был...
ну поделись.
- - - Добавлено - - -
Циклы циклы циклы, ну я же оставил, похоже специально для тебя, подсчет максимального ID. Смотри примечание 2
И как мне кажется, переключение под ID, используют админы не имеющие конкретной цели для мониторинга. Выгоднее начинать с 0 ID и щелкать, а как они увидят что ID "закончились", перейдут снова в слежку за 0. Цикл конечно неплохо, твой вариант рабочий и весьма пригодный.
Последний раз редактировалось wAx; 11.03.2015 в 19:54.
Мои работы и публикации:
К сожалению код был утерен, и сейчас восстановить не смогу, т.к не смогу провести тесты с нубо-компом (32 мб видеокарта :D)
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)