Исходник [RakSamp Lite] VehicleDamageStatus

Ulong

Диванный критик
Автор темы
Проверенный
64
366

X76snHI.gif


Модуль для удобной работы с повреждаемыми компонентами транспортных средств для RakSAMP Lite


Установка:
  • Закинуть damage_status.lua по пути /scripts/libs/


Функции:

module.getVehicleDoorState(vehicleId, door, state) module.setVehicleDoorState(door, state)
  • Функции для работы с дверьми.
    В get функции возвращает true когда определенный компонент авто соответствует проверяемому состоянию.
    В set функции устанавливает состояние определенному компоненту авто в котором сидит бот, возвращает true если состояние установлено.


module.getVehiclePanelState(vehicleId, panel, state) module.setVehiclePanelState(panel, state)
  • Функции для работы с панелями авто.
    В get функции возвращает true когда определенный компонент авто соответствует проверяемому состоянию.
    В set функции устанавливает состояние определенному компоненту авто в котором сидит бот, возвращает true если состояние установлено.


module.getVehicleTireState(vehicleId, tire) module.setVehicleTireState(tire, state)
  • Функции для работы с покрышками авто.
    В get функции возвращает true когда определенная покрышка не пробита, если пробита - false.
    В set функции устанавливает состояние определенной покрышке авто в котором сидит бот, возвращает true если состояние покрышки установлено.


module.getVehicleLightState(vehicleId, light) module.setVehicleLightState(light, state)
  • Функции для работы с фонарями авто.
    В get функции возвращает true когда определенный фонарь не разбит, разбит - false.
    В set функции устанавливает состояние определенному фонарю авто в котором сидит бот, возвращает true если состояние фонаря установлено.


module.onVehicleDamageStatusChanged(vehicleId, updatedComponents, streamed)
  • Событие когда у авто в зоне стрима изменяется статус компонентов.
    В updatedComponents хранится таблица в которой ключам door, panel, light, tire присваивается true/false в зависимости изменился компонент или нет.
    В streamed передаётся значение: true - машина уже была в зоне стрима, false - машина только появилась в зоне стрима и у всех её компонентов в updatedComponents значение true.


tSSnGK7.gif


Для работы у авто должны быть включены фары, иначе работать не будет

Lua:
local ds = require("damage_status")
require("addon")

local STROBE_ACTIVE, STROBE_TIME = false, 150

function onLoad()
	newTask(function()
		while true do 
			if STROBE_ACTIVE then
				local lights = {
					{component = LIGHTS.FRONT_LEFT, state = LIGHTS.STATES.NORMAL},
					{component = LIGHTS.BACK_LIGHT, state = LIGHTS.STATES.NORMAL},
					{component = LIGHTS.FRONT_LEFT, state = LIGHTS.STATES.BROKEN},
					{component = LIGHTS.BACK_LIGHT, state = LIGHTS.STATES.BROKEN},
					{component = LIGHTS.FRONT_RIGHT, state = LIGHTS.STATES.NORMAL},
					{component = LIGHTS.FRONT_RIGHT, state = LIGHTS.STATES.BROKEN},
				}
				for _, light in ipairs(lights) do
					local result = ds.setVehicleLightState(light.component, light.state)
					if result then
						wait(STROBE_TIME)
					else
						STROBE_ACTIVE = false
						break
					end
				end
			end
			wait(0)
		end
	end)
end

function onRunCommand(cmd)
	if cmd:match("^!?strobe$") then
		if getBotVehicle() ~= 0 then
			if getAllVehicles()[getBotVehicle()].lights == true then
				STROBE_ACTIVE = not STROBE_ACTIVE
			else
				print("Start vehicle lights first")
			end
		end
		return false
	end
end
onYzr3e.gif

Lua:
local ds = require("damage_status")
require("addon")

local FLOOD_ACTIVE, FLOOD_TIME = false, 50

function onLoad()
	newTask(function()
		while true do
			if FLOOD_ACTIVE then
				for door = 0, 3 do
					ds.setVehicleDoorState(door, DOORS.STATES.NORMAL)
				end
				ds.setVehiclePanelState(PANELS.FRONT_BUMPER, PANELS.STATES.NORMAL)
				ds.setVehiclePanelState(PANELS.BACK_BUMPER, PANELS.STATES.NORMAL)
				
				wait(FLOOD_TIME)
				
				for door = 0, 3 do
					ds.setVehicleDoorState(door, DOORS.STATES.REMOVED)
				end
				ds.setVehiclePanelState(PANELS.FRONT_BUMPER, PANELS.STATES.REMOVED)
				ds.setVehiclePanelState(PANELS.BACK_BUMPER, PANELS.STATES.REMOVED)
			end
			wait(0)
		end
	end)
end

function onRunCommand(cmd)
	if cmd:match("^!?flood$") then
		if getBotVehicle() ~= 0 then
			FLOOD_ACTIVE = not FLOOD_ACTIVE
		end
		return false
	end
end
Lua:
local ds = require("damage_status")

function onRunCommand(cmd)
	if cmd:match("^!?pop$") then
		for tire = 0, 3 do
			local result = ds.setVehicleTireState(tire, TIRES.STATES.POPPED)
			print(string.format("%s колесо %d", result and "прокололи" or "не смогли проколоть", tire))
		end
		return false
	end
end
Lua:
local ds = require("damage_status")

function ds.onVehicleDamageStatusChanged(vehicleId, updatedComponents, streamed)
	if streamed then -- проверка на то, что машина уже была до этого в зоне стрима
	
		if updatedComponents.light then
			print(string.format("У машины %d обновился статус фонарей", vehicleId))
			if not ds.getVehicleLightState(vehicleId, LIGHTS.FRONT_LEFT) then
				print(string.format("Левый фонарь разбит у машины %d", vehicleId))
			end
			if not ds.getVehicleLightState(vehicleId, LIGHTS.FRONT_RIGHT) then
				print(string.format("Правый фонарь разбит у машины %d", vehicleId))
			end
		end
		
		if updatedComponents.tire then
			print(string.format("У машины %d обновился статус шин", vehicleId))
			for tires = 0, 3 do
				if not ds.getVehicleTireState(vehicleId, tires) then
					print(string.format("У машины %d проколото колесо %d", vehicleId, tires))
				end
			end
		end
		
		if updatedComponents.door then
			print(string.format("У машины %d обновился статус дверей/капота/багажника", vehicleId))
			if ds.getVehicleDoorState(vehicleId, DOORS.DRIVER_DOOR, DOORS.STATES.DAMAGED) then
				print(string.format("У машины %d повреждена водительская дверь", vehicleId))
			end
		end
		
		if updatedComponents.panel then
			print(string.format("У машины %d обновился статус панелей", vehicleId))
			if ds.getVehiclePanelState(vehicleId, PANELS.FRONT_BUMPER, PANELS.STATES.HANGING_LOOSE) then
				print(string.format("У машины %d поврежден передний бампер и он качается", vehicleId))
			end
			if ds.getVehiclePanelState(vehicleId, PANELS.WINDSHIELD, PANELS.STATES.CRUSHED) then
				print(string.format("У машины %d повреждено лобовое стекло", vehicleId))
			end
		end
	else
		--[[
			транспортное средство только что появилось в зоне стрима бота
			по умолчанию все компоненты в updatedComponents будут true
			если вам без разницы появилось авто только что в зоне стрима или нет, то можно убрать проверку на streamed
		]]--
	end
end
Более подробную информацию по компонентам можно найти вот тут ну или тут
Код модуля писался за пивом, так что если найдете несоответствия или явные ошибки - пишите, исправлю.

Если надо проверить в getVehicleDoorState целый ли компонент, то надо проверять одновременно три состояния OPENED, DAMAGED и REMOVED. Если три возвращают false - компонент целый.
Тоже самое касается и getVehiclePanelState, там проверять нужно одновременно CRUSHED, HANGING_LOOSE, REMOVED.



  • DOORS
    • HOOD - капот
    • TRUNK - багажник
    • DRIVER_DOOR - водительская дверь
    • PASSENGER_DOOR - пассажирская дверь
      • STATES
        • NORMAL - используется только для set функций, чинит компонент
        • OPENED - открыт
        • DAMAGED - поврежден
        • REMOVED - удален
  • PANELS
    • FRONT_LEFT - передняя левая панель
    • FRONT_RIGHT - передняя правая панель
    • BACK_LEFT - задняя левая панель
    • BACK_RIGHT - задняя правая панель
    • WINDSHIELD - лобовое стекло
    • FRONT_BUMPER - передний бампер
    • BACK_BUMPER - задний бампер
      • STATES
        • NORMAL - используется только для set функций, чинит компонент
        • CRUSHED - поврежден
        • HANGING_LOOSE - качается, висит
        • REMOVED - удален
  • TIRES
    • BACK_RIGHT - правое заднее колесо
    • FRONT_RIGHT - правое переднее колесо
    • BACK_LEFT - левое заднее колесо
    • FRONT_LEFT - левое переднее колесо
      • STATES
        • NORMAL - используется только для set функций, чинит компонент
        • POPPED - колесо спущено
  • LIGHTS
    • FRONT_LEFT - передняя левая фара
    • FRONT_RIGHT - передняя правая фара
    • BACK_LIGHT - задние фары
      • STATES
        • NORMAL - используется только для set функций, чинит компонент
        • BROKEN - фара сломана
 

Вложения

  • damage_status.lua
    7.1 KB · Просмотры: 6