local old_ISVehicleMechanics_doPartContextMenu = ISVehicleMechanics.doPartContextMenu

function ISVehicleMechanics:doPartContextMenu(part, x, y)
	if UIManager.getSpeedControls():getCurrentGameSpeed() == 0 then
		return ;
	end

	local playerObj = getSpecificPlayer(self.playerNum);
	local inv = playerObj:getInventory()

	old_ISVehicleMechanics_doPartContextMenu(self, part, x, y);
	
	--если деталь не баттарея, то прекращаем выполнение скрипта
	if part:getId() ~= "Battery" then
		return
	end
	
	--если батарея не установлена, то прекращаем выполнение
	if not part:getInventoryItem() then return end
	
	--заряд аккумулятора машины.
	local batteryAmount = part:getInventoryItem():getUsedDelta()

	--инвентарь игрока
	local playerInv = playerObj:getInventory()
	local args = {}
	--если нет предмета в инвентаре, то прекращаем
	for i=1, playerInv:getItems():size() do
		local item = playerInv:getItems():get(i-1)
		
		if item:getFullType() == "T15K_VehicleParts.BusterT15K" then
			args.BusterT15K = item
			args.BusterT15KID = item:getID()
		end
		
		if item:getFullType() == "T15K_VehicleParts.DisposableBusterT15K" then
			args.DisposableBusterT15K = item
			args.DisposableBusterT15KID = item:getID()
		end
		
		if item:getFullType() == "T15K_VehicleParts.HomemadeBusterT15K" then
			args.HomemadeBusterT15K = item
			args.HomemadeBusterT15KID = item:getID()
		end
	end
	
	local option = self.context:addOption(getText("IGUI_DIYVehPaerts_Buster_ChargeBeatteryNotAvailable"), playerObj, nil);


	local description = getText("IGUI_DIYVehPaerts_Buster_Message1") .. "\n"
	
	--если заряд батареи полный
	if batteryAmount==1 then
		
		--зелёная надпись что заряд полный
		description = description .. "\n <RGB:0,1,0> " .. getText("IGUI_Battery_already_charged")
		
		local tooltip = ISToolTip:new();
		tooltip:initialise();
		tooltip:setVisible(false);
		tooltip:setName(getText("IGUI_Charge_battery_from_booster_T15K"))
		tooltip.description = description
		option.toolTip = tooltip
		option.notAvailable = true
		return
	end
	
	--если заряд батареи меньше 100, и нет ни одного бустера
	if not args.BusterT15KID and not args.DisposableBusterT15KID and not args.HomemadeBusterT15KID then
		
		--создаём предметы чтобы с них снять актуальное название
		local item1 = InventoryItemFactory.CreateItem("T15K_VehicleParts.BusterT15K");
		local item2 = InventoryItemFactory.CreateItem("T15K_VehicleParts.DisposableBusterT15K");
		local item3 = InventoryItemFactory.CreateItem("T15K_VehicleParts.HomemadeBusterT15K");
		
		description = description .. "\n" .. getText("IGUI_DIYVehPaerts_Buster_Message2") .. "\n"
		.. "<RED>" .. item1:getName() .. " <RGB:1,1,1> \n " .. getText("IGUI_DIYVehPaerts_Buster_Message3") .. "\n"
		
		.. "<RED>" .. item2:getName() .. " <RGB:1,1,1> \n " .. getText("IGUI_DIYVehPaerts_Buster_Message3") .. "\n"
		.. "<RED>" .. item3:getName() .. " <RGB:1,1,1>" .. "\n"
		
		local tooltip = ISToolTip:new();
		tooltip:initialise();
		tooltip:setVisible(false);
		tooltip:setName(getText("IGUI_DIYVehPaerts_Buster_ChargeBeatteryNotAvailable"))
		tooltip.description = description
		option.toolTip = tooltip
		option.notAvailable = true
		return
	end
	
	--если есть один из трех бустеров, создаём подменю
	if args.BusterT15K or args.DisposableBusterT15K or args.HomemadeBusterT15K then
		
		--option.text = getText("IGUI_DIYVehPaerts_Buster_ChargeBeatteryAvailable")
		--print (option.name)
		
		--меняем названние контекстного меню option
		option.name = getText("IGUI_DIYVehPaerts_Buster_ChargeBeatteryAvailable")
	
		--создаём сабменю
		local subMenu = ISContextMenu:getNew(self.context)
		self.context:addSubMenu(option, subMenu)
		
		
		--обычный бустер
		if args.BusterT15K then
			local option1 = subMenu:addOption(args.BusterT15K:getName(), playerObj, ISVehicleMechanics.onUseBusterT15K, part, args.BusterT15K, args.BusterT15KID)
			
			--переменнпя доступности контекстного меню
			local notAvailable
			local batteryChar = 40
			local batteryCharDelta = math.floor((args.BusterT15K:getUsedDelta()/2.5)*100)
			local intbatteryAmount = math.floor(batteryAmount*100)
			local intbatteryAmountAfter = intbatteryAmount+batteryCharDelta

			--переменная надписи тултипа
			local description = getText("IGUI_DIYVehPaerts_Buster_SubMenuMessage1",batteryChar)

			--если бустер не разряжен
			if args.BusterT15K:getUsedDelta()>0 then
				--не блокируем Контекстное меню
				notAvailable = false
				description = description .. "\n\n" .. getText("IGUI_DIYVehPaerts_Buster_SubMenuMessage4",intbatteryAmount,intbatteryAmountAfter) .. "\n\n"
				.. getText("IGUI_DIYVehPaerts_Buster_SubMenuMessage7")
			--иначе
			else
				--блокируем контекстное меню
				notAvailable = true
				description = description .. " <RED> \n\n" .. getText("IGUI_DIYVehPaerts_Buster_SubMenuMessage2")
			end

			local nameItem = args.BusterT15K:getName()

			local tooltip = ISToolTip:new();
			tooltip:initialise();
			tooltip:setVisible(false);
			tooltip:setName(getText(nameItem))
			tooltip.description = description
			option1.toolTip = tooltip

			option1.notAvailable = notAvailable

		end
		
		--одноразовый бустер
		if args.DisposableBusterT15K then
			local option1 = subMenu:addOption(args.DisposableBusterT15K:getName(), playerObj, ISVehicleMechanics.onUseBusterT15K, part, args.DisposableBusterT15K, args.DisposableBusterT15KID)
		
			--на сколько % заряжает бустер
			local batteryChar = 25
			--текущий заряд аккумулятора
			local intbatteryAmount = math.floor(batteryAmount*100)
			--заряд аккумулятора после зарядки бустера
			local intbatteryAmountAfter = intbatteryAmount+batteryChar

			--переменная надписи тултипа
			local description = getText("IGUI_DIYVehPaerts_Buster_SubMenuMessage1",batteryChar)
			.. "\n\n" .. getText("IGUI_DIYVehPaerts_Buster_SubMenuMessage4",intbatteryAmount,intbatteryAmountAfter) .. "\n\n"
			.. getText("IGUI_DIYVehPaerts_Buster_SubMenuMessage6")


			--название предмета
			local nameItem = args.DisposableBusterT15K:getName()

			local tooltip = ISToolTip:new();
			tooltip:initialise();
			tooltip:setVisible(false);
			tooltip:setName(getText(nameItem))
			tooltip.description = description
			option1.toolTip = tooltip
			
		
		end
		
		--самодельный бустер
		if args.HomemadeBusterT15K then
			local option1 = subMenu:addOption(args.HomemadeBusterT15K:getName(), playerObj, ISVehicleMechanics.onUseBusterT15K, part, args.HomemadeBusterT15K, args.HomemadeBusterT15KID)
		
			--на сколько % заряжает бустер
			local batteryChar = 20
			--текущий заряд аккумулятора
			local intbatteryAmount = math.floor(batteryAmount*100)
			--заряд аккумулятора после зарядки бустера
			local intbatteryAmountAfter = intbatteryAmount+batteryChar

			--переменная надписи тултипа
			local description = getText("IGUI_DIYVehPaerts_Buster_SubMenuMessage1",batteryChar)
			.. "\n\n" .. getText("IGUI_DIYVehPaerts_Buster_SubMenuMessage4",intbatteryAmount,intbatteryAmountAfter) .. "\n\n"
			.. getText("IGUI_DIYVehPaerts_Buster_SubMenuMessage6")


			--название предмета
			local nameItem = args.HomemadeBusterT15K:getName()

			local tooltip = ISToolTip:new();
			tooltip:initialise();
			tooltip:setVisible(false);
			tooltip:setName(getText(nameItem))
			tooltip.description = description
			option1.toolTip = tooltip
		end
	
	end
end


--функция которая выполняется перед началом восстановления качества движка
function ISVehicleMechanics.onUseBusterT15K(playerObj, part, item, itemID)
	
	--если не передалось ID то завершить
	if not part or not item or not itemID then return end
	
	--если нет предмета-прекращаем
	local itemValid = playerObj:getInventory():getItemWithIDRecursiv(itemID)
	if not itemValid then return end

	--если игрок в машине, то выодим из её
	if playerObj:getVehicle() then
		ISVehicleMenu.onExit(playerObj)
	end
	
	--подходим к зоне ремонта
	ISTimedActionQueue.add(ISPathFindAction:pathToVehicleArea(playerObj, part:getVehicle(), part:getArea()))
	
	--находим "капот" если он есть
	local engineCover = nil
	local doorPart = part:getVehicle():getPartById("EngineDoor")
	if doorPart and doorPart:getDoor() and doorPart:getInventoryItem() and not doorPart:getDoor():isOpen() then
		engineCover = doorPart
	end
	
	--время выполнения Тайм экшенов
	local time = 300;
	--если есть капот
	if engineCover then
		-- Капот магически отпирается, если сломана/открыта/неоткрыта любая дверь/окно.
		-- Если игрок может сесть в автомобиль, он может открыть капот, ключ не требуется.
		if engineCover:getDoor():isLocked() and VehicleUtils.RequiredKeyNotFound(engineCover, playerObj) then
			ISTimedActionQueue.add(ISUnlockVehicleDoor:new(playerObj, engineCover))
		end
		--открываем капот
		ISTimedActionQueue.add(ISOpenVehicleDoor:new(playerObj, part:getVehicle(), engineCover))
		--берём в руки предмет
		ISTimedActionQueue.add(ISEquipWeaponAction:new(playerObj, item, 100, primary))
		--Выполняем экшен по зарядке аккума
		ISTimedActionQueue.add(DIY_UseBooster_TimeAction:new(playerObj, part, item, itemID))
		--закрываем капот
		ISTimedActionQueue.add(ISCloseVehicleDoor:new(playerObj, part:getVehicle(), engineCover))
	else
		--берём в руки предмет
		ISTimedActionQueue.add(ISEquipWeaponAction:new(playerObj, item, 100, primary))
		--Выполняем экшен по зарядке аккума
		ISTimedActionQueue.add(DIY_UseBooster_TimeAction:new(playerObj, part, item, itemID))
	end

end


--ТаймЭкшн по зарядке аккума
require "TimedActions/ISBaseTimedAction"

DIY_UseBooster_TimeAction = ISBaseTimedAction:derive("DIY_UseBooster_TimeAction");

function DIY_UseBooster_TimeAction:isValid()
    return true;
end

--выполняется перед началом действия
function DIY_UseBooster_TimeAction:waitToStart()
	self.character:faceThisObject(self.vehicle)
    return self.character:shouldBeTurning()
end

function DIY_UseBooster_TimeAction:update()
	self.character:faceThisObject(self.vehicle)
	self.character:setMetabolicTarget(Metabolics.UsingTools);
end
	
--выполняется анимации и время
function DIY_UseBooster_TimeAction:start()
	--если это самодельный бустер
	if self.item:getFullType() == "T15K_VehicleParts.HomemadeBusterT15K" then
		--воспроизводим звук
		self.sound = self.character:getEmitter():playSound("ChargingHomemadeBoosterT15K")
	--иначе
	else
		self.sound = self.character:getEmitter():playSound("ChargingBoosterT15K")
	end
	--устанавливаем анимацию
	self:setActionAnim("VehicleWorkOnMid")
end

--действие выполняется при обрывании тайм экшона
function DIY_UseBooster_TimeAction:stop()
	--удаляем звук
	if self.sound then
		self.character:getEmitter():stopSound(self.sound)
		self.sound = nil
	end
	ISBaseTimedAction.stop(self);
end

--действие выполнится при удаче
function DIY_UseBooster_TimeAction:perform()
   --удаляем звук
	if self.sound then
		self.character:getEmitter():stopSound(self.sound)
		self.sound = nil
	end


	local amount
	local vehicle = self.part:getVehicle()
	local part = self.part

	local itemFullType = self.item:getFullType()
	local isBusterT15K = itemFullType == "T15K_VehicleParts.BusterT15K" or false
	local isHomemadeBusterT15K = itemFullType == "T15K_VehicleParts.HomemadeBusterT15K" or false
	local isDisposableBusterT15K = itemFullType == "T15K_VehicleParts.DisposableBusterT15K" or false

	--если это стандартный бустер Володя
	if isBusterT15K then

		--Коэфициент зарядки бустера.
		--При коэфициенте в 2.5, максимальный заряд бустером будет 40%
		local coefficient = 2.5
		local deltaBuster = self.item:getUsedDelta()/coefficient
		local deltaBattery = self.part:getInventoryItem():getUsedDelta()
		print (deltaBuster)
		print (deltaBattery)

		--зарядка батареи. Если дельта больше 1, то новая дельта будет 1
		local newDeltaBattery = deltaBattery + deltaBuster
		if newDeltaBattery > 1 then
			newDeltaBattery = 1
		end

		--Новая дельта для бустера чтобы он не уходил в 0
		--чтобы всегда был остаток если это возможно
		local newDeltaBuster = deltaBuster + deltaBattery - 1
		if newDeltaBuster<0 then
			newDeltaBuster = 0
		end

		--устанавливаем дельту для бустера
		self.item:setUsedDelta(newDeltaBuster*coefficient)

		--уситанавливаем дельту для детали
		self.part:getInventoryItem():setUsedDelta(newDeltaBattery)
		sendClientCommand("DIY_Booster", "UseBooster", { vehicle = vehicle:getId(), part = part:getId(), amount = newDeltaBattery });

		--уменьшаем состояние аккумулятора
		local condition = part:getCondition() - 1
		sendClientCommand(self.character, "vehicle", "setPartCondition", { vehicle = vehicle:getId(), part = part:getId(), condition = condition })
	end
	
	--если это самодельный бустер или одноразовый
	if isHomemadeBusterT15K or isDisposableBusterT15K then
		--Процент на который бустер буддет заряжать
		local deltaBuster
		if isHomemadeBusterT15K then
			deltaBuster = 0.2
		elseif isDisposableBusterT15K then
			deltaBuster = 0.25
		end

		--Заряд баттареи
		local deltaBattery = self.part:getInventoryItem():getUsedDelta()
		--зарядка батареи. Если дельта больше 1, то новая дельта будет 1
		local newDeltaBattery = deltaBattery + deltaBuster
		if newDeltaBattery > 1 then
			newDeltaBattery = 1
		end

		--устанавливаем дельту на деталь Баттарея у клиента
		--Отправляем на сервер команду
		self.part:getInventoryItem():setUsedDelta(newDeltaBattery)
		sendClientCommand("DIY_Booster", "UseBooster", { vehicle = vehicle:getId(), part = part:getId(), amount = newDeltaBattery });
		
		--удаляем бустер т.к. он одноразовый
		self.character:getInventory():removeItemWithIDRecurse(self.itemID)

		--шанс получения ожога от самодельного бустера 10%
		local chance = ZombRand(0, 100)
		if chance < 15 and isHomemadeBusterT15K then	
			local bodyPart = self.character:getBodyDamage():getBodyPart(BodyPartType.Hand_L)
			--local action = "burned"
			local player = self.character
			--ISHealthPanel.onCheatCurrentPlayer(bodyPart, action, player)
			bodyPart:setBurnTime(50)
			player:playSound("ChargingHomemadeBoosterElectricShockT15K")

			--уменьшаем состояние аккумулятора
			local condition = part:getCondition() - 20
			sendClientCommand(self.character, "vehicle", "setPartCondition", { vehicle = vehicle:getId(), part = part:getId(), condition = condition })
			--если шанс не прокнул
		else
			--уменьшаем состояние аккумулятора
			local condition = self.part:getCondition() - ZombRand(1, 3)
			sendClientCommand(self.character, "vehicle", "setPartCondition", { vehicle = vehicle:getId(), part = part:getId(), condition = condition })
		end
	end
	
	ISBaseTimedAction.perform(self);
end

function DIY_UseBooster_TimeAction:new(character, part, item, itemID)--(character, item, time)

	local o = {}
	setmetatable(o, self)
	self.__index = self
	o.character = character;
	o.item = item;
	o.itemID = itemID;
	o.vehicle = part:getVehicle();
	o.part = part
	o.stopOnWalk = true;
	o.stopOnRun = true;
	o.maxTime = 300;
	o.jobType = getText("IGUI_DIYVehPaerts_Buster_Message4")
	return o;
end