Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Задний салон для фургонов - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ FS ][ All ]
Задний салон для фургонов Copy Evolve RP
Оценка: ***** 1 Голосов

#1
Пользователь офлайн   Mavi 

  • Местный
  • Вставить ник
  • Раскрыть информацию
Давненько увидел на Evolve такую систему, что при посадке в задние сиденья в грузовиках, игрока телепортирует в интерьер, похожее на кузов грузовика и тем самым на таких грузовиках можно было возить неограниченное количество людей, прям как на автобусе.
И вот, наконец-то руки дошли, написал такую же систему и выкладываю сюда.

Осторожно!

  • Вы можете использовать этот скрипт как FilterScript, если вы уверены, что эти грузовики гарантированно никогда не попадут в интерьеры. А если нет, то вам придется скопировать систему и вставить в мод. А в моде уже реализовать свою GetVehicleInterior(vehicleid), так как в SA-MP его нет (можете посмотреть здесь, как это сделать).
  • Если будете вводить изменения в коде или тем более вставить его в gamemode, внимательно следите за подсказками, которых я оставил в разных частях кода в виде комментариев.


Зависимости

  • streamer
  • sscanf2
  • Pawn.CMD
  • map-zones


Обзор и скрины

Видео-обзор [Показать]

Скрины интерьеров [Показать]


Скачать



* при обнаружении багов, недочетов, или по предложениям улучшения кода прошу отписаться ниже.

* при копировании на другие источники указывайте ссылку на данную тему! =)

Сообщение отредактировал Mavi: 08 ноября 2020 - 15:08

4

#2
Пользователь офлайн   Romzes 

  • © Pawn-Wiki.Ru
  • Вставить ник
  • Раскрыть информацию
А зачем команда при использовании чата? Это можно легко сделать через OnPlayerText, мы ведь всегда знаем в каком интерьере или в какой машине сидит игрок.
0

#3
Пользователь офлайн   Mavi 

  • Местный
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияRomzes (08 ноября 2020 - 15:13) писал:

А зачем команда при использовании чата? Это можно легко сделать через OnPlayerText, мы ведь всегда знаем в каком интерьере или в какой машине сидит игрок.


Ну я сделал копию той системы, которую видел. Но идея неплохая кстати, может переделаю, спасибо.
0

#4
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
Странную реализацию на том сервере придумали. Можно ведь просто позволить игроку проигрывать анимацию посадки в транспортное средство и после того, как он сел сзади - переместить его в режим слежки за транспортом. А когда он решит выйти - переместить его обратно в транспорт и выгнать, чтоб проиграть анимацию выхода из авто. Это будет более приближено к реализации автобусов. :unsure:
0

#5
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
Ну и да:

Цитата

public OnPlayerStateChange(playerid, newstate, oldstate)
{
	new vehicleid = GetPlayerVehicleID(playerid);

	if(vehicleid != 0 && vehicleid != INVALID_VEHICLE_ID)
	{


GetPlayerVehicleID никогда не вернёт INVALID_VEHICLE_ID. Только 0 или ID транспорта.

Цитата

public OnFilterScriptExit()
{
	for(new v = 0; v < MAX_VEHICLES; v++)
	{
		if(!IsModelTruck(GetVehicleModel(v))) continue;

		Iter_Clear(TruckPassengers[v]);
	}

	foreach(new i : Player)
	{
		PlayerVehicleID{i} = 0;
	}

	print("Rear passenger compartment v0.1 by Mavi unloaded");
	return 1;
}


Зачем всем этим заниматься, если при перезагрузке или при выгрузке скрипта данные и так все будут удалены?


Цитата

PlayerVehicleID{playerid} = vehicleid;


Что будешь делать, если ID транспорта будет больше 255? :)
0

#6
Пользователь офлайн   Mavi 

  • Местный
  • Вставить ник
  • Раскрыть информацию
^ исправил, спасибо.
0

#7
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
В OnPlayerStateChange код можно убрать в проверку на то, является ли newstate PLAYER_STATE_PASSENGER

Ну и лучше проверки, в стиле:
if(PlayerVehicleID[playerid] != 0)

писать так:
if(PlayerVehicleID[playerid] > 0)


Правка минимальная, но уже и по коду понятно, что значение должно быть именно больше 0, и это станет своеобразной защитой от дурака на случай, если кто-то в будущем решит какие-то правки сделать и, например, решит "обнулять" переменную не через присвоение 0, а через присвоение "-1" - как это бывает во многих системах. В общем, устойчивость к ошибкам за счёт этой мелочи может возрасти.

В OnPlayerKeyStateChange можно избавиться от массива zoneName и записывать название зоны в массив body, который, в любом случае, сейчас создаётся гораздо раньше его фактического использования и, по сути, простаивает.
0

#8
Пользователь офлайн   Mavi 

  • Местный
  • Вставить ник
  • Раскрыть информацию
Залил изменения, спасибо.

Просмотр сообщенияDeimoS (08 ноября 2020 - 22:41) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


О какой проверке newstate идет речь, если его нет? Если речь об этом...

if(GetPlayerVehicleSeat(playerid) >= REAR_SEAT_ID)


то а как без этого ? Ведь надо телепортировать только тех игроков, которые сядут именно в последние две сидения.
1

#9
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияMavi (09 ноября 2020 - 18:40) писал:

О какой проверке newstate идет речь, если его нет?


Я наоборот говорю, что её нужно добавить. Как я понял, у тебя код в OnPlayerStateChange должен срабатывать только в случае, если игрок сел на пассажирское сидение. Соответственно, чтоб лишний раз не записывать ID машины и не проверять модель авто, можно добавить в начало проверку

if(newstate == PLAYER_STATE_PASSENGER)
{
    // Тут весь текущий код из OnPlayerStateChange
}

И тогда твой код не будет срабатывать при каждом вызове OnPlayerStateChange
0

#10
Пользователь офлайн   Mavi 

  • Местный
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (10 ноября 2020 - 21:57) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


На пассажирское сиденье, да, но только если сел именно в задние сиденья. Чувак, который сядет рядом с шофером, его не трогаю.

А второе условие...

else if(PlayerVehicleID[playerid] > 0 && GetPlayerInterior(playerid) != COMPARTMENT_INT_ID)


Это для водителя и пассажира с переднего салона, которые если вдруг выйдут из машины (ведь их надо будет удалить из итератора). newstate == PLAYER_STATE_ONFOOT && oldstate == PLAYER_STATE_PASSENGER не катит, потому что если делать так, то такое условие так же сработает, когда я тпну игрока из задних сидений в инту, а мне нужно затронуть только водителя и переднего пассажира.

Сообщение отредактировал Mavi: 10 ноября 2020 - 22:38

1

Поделиться темой:


  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика