107 lines
3.2 KiB
Lua
107 lines
3.2 KiB
Lua
if isClient() then return end
|
|
|
|
local TowingCommands = {}
|
|
local Commands = {}
|
|
local TowBarItemType = "TowBar.TowBar"
|
|
|
|
TowingCommands.wantNoise = getDebug() or false
|
|
|
|
local noise = function(msg)
|
|
if TowingCommands.wantNoise then
|
|
print("TowBarCommands: " .. msg)
|
|
end
|
|
end
|
|
|
|
function Commands.attachTowBar(player, args)
|
|
local vehicleA = getVehicleById(args.vehicleA)
|
|
local vehicleB = getVehicleById(args.vehicleB)
|
|
if not vehicleA then
|
|
noise("no such vehicle (A) id=" .. tostring(args.vehicleA))
|
|
return
|
|
end
|
|
if not vehicleB then
|
|
noise("no such vehicle (B) id=" .. tostring(args.vehicleB))
|
|
return
|
|
end
|
|
|
|
vehicleA:addPointConstraint(player, vehicleB, args.attachmentA, args.attachmentB)
|
|
end
|
|
|
|
function Commands.detachTowBar(player, args)
|
|
local towingVehicle = args.towingVehicle and getVehicleById(args.towingVehicle) or nil
|
|
local towedVehicle = args.vehicle and getVehicleById(args.vehicle) or nil
|
|
|
|
if not towingVehicle and towedVehicle then
|
|
towingVehicle = towedVehicle:getVehicleTowedBy()
|
|
end
|
|
if not towedVehicle and towingVehicle then
|
|
towedVehicle = towingVehicle:getVehicleTowing()
|
|
end
|
|
|
|
if towedVehicle then
|
|
towedVehicle:breakConstraint(true, false)
|
|
end
|
|
if towingVehicle and towingVehicle ~= towedVehicle then
|
|
towingVehicle:breakConstraint(true, false)
|
|
end
|
|
end
|
|
|
|
function Commands.consumeTowBar(player, args)
|
|
if not player then return end
|
|
local inventory = player:getInventory()
|
|
if not inventory then return end
|
|
|
|
local towBarItem = nil
|
|
local itemId = args and args.itemId
|
|
if itemId then
|
|
towBarItem = inventory:getItemWithID(itemId)
|
|
end
|
|
if not towBarItem then
|
|
towBarItem = inventory:getFirstTypeRecurse(TowBarItemType)
|
|
end
|
|
if not towBarItem then return end
|
|
|
|
local wasPrimary = player:isPrimaryHandItem(towBarItem)
|
|
local wasSecondary = player:isSecondaryHandItem(towBarItem)
|
|
player:removeFromHands(towBarItem)
|
|
inventory:Remove(towBarItem)
|
|
sendRemoveItemFromContainer(inventory, towBarItem)
|
|
|
|
if wasPrimary or wasSecondary then
|
|
sendEquip(player)
|
|
end
|
|
end
|
|
|
|
function Commands.giveTowBar(player, args)
|
|
if not player then return end
|
|
local inventory = player:getInventory()
|
|
if not inventory then return end
|
|
|
|
local towBarItem = inventory:AddItem(TowBarItemType)
|
|
if not towBarItem then return end
|
|
sendAddItemToContainer(inventory, towBarItem)
|
|
|
|
if args and args.equipPrimary then
|
|
player:setPrimaryHandItem(towBarItem)
|
|
sendEquip(player)
|
|
end
|
|
end
|
|
|
|
-- Compatibility aliases for older command names.
|
|
Commands.attachConstraint = Commands.attachTowBar
|
|
Commands.detachConstraint = Commands.detachTowBar
|
|
|
|
TowingCommands.OnClientCommand = function(module, command, player, args)
|
|
if module == "towbar" and Commands[command] then
|
|
local argStr = ""
|
|
args = args or {}
|
|
for k, v in pairs(args) do
|
|
argStr = argStr .. " " .. tostring(k) .. "=" .. tostring(v)
|
|
end
|
|
noise("received " .. module .. " " .. command .. " " .. tostring(player) .. argStr)
|
|
Commands[command](player, args)
|
|
end
|
|
end
|
|
|
|
Events.OnClientCommand.Add(TowingCommands.OnClientCommand)
|