-- Улучшение №1: добавление случайного автомобиля для преследования
function getRandomCar()
  local carList = {"Ascot_BaileyS200_pha", "Berkley_Kingfisher_pha", "Delizia_Grandeamerica", "Hot_Rod_1", "Hot_Rod_2", "Hot_Rod_3", "Houston_Wasp_pha", "ISW_508", "Jeep", "Jeep_civil", "Jefferson_Futura_pha", "Jefferson_provincial", "Lassiter_69", "Lassiter_75_pha", "Milk_Truck", "Potomac_Indian", "Quicksilver_Windsor_pha", "Quicksilver_Windsor_Taxi_pha", "Shubert_34", "Shubert_38", "Shubert_Armoured", "Shubert_Beverly", "Shubert_Frigate_pha", "Shubert_Hearse", "Shubert_Panel", "Shubert_PickUp", "Shubert_Taxi", "Shubert_Truck_CT", "Shubert_Truck_SG", "Shubert_Truck_SP", "Smith_200_p_pha", "Smith_200_pha", "Smith_coupe", "Smith_Mainline_pha", "Smith_Stingray_pha", "Smith_Truck", "Smith_V8", "Smith_Wagon_pha", "Trautenberg_Grande", "Ulver_NewYorker",
  "Ulver_NewYorker_p", "Walker_Rocket", "Walter_Coupe", "Chaffeque", "Elysium", "Roller", "Waybar", "Moscardo_AS37_pha"}
  local randomIndex = math.random(1, #carList)
  return carList[randomIndex]
end

-- Функция для начала FreeRide
function FreeRideStart2(_ARG_0_)
  -- Устанавливаем отношения между игроком и группировкой Clemente
  ai.relationships:SetRelationship(enums.AI_SIDE.PLAYER, enums.AI_TYPE.FRIEND, enums.AI_SIDE.GANG, enums.AI_TYPE.CLEMENTE, 10)
  ai.relationships:SetRelationship(enums.AI_SIDE.GANG, enums.AI_TYPE.CLEMENTE, enums.AI_SIDE.PLAYER, enums.AI_TYPE.FRIEND, 10)

  -- Сбрасываем ссылки на персонажей
  joe = nil
  henry = nil
  hunter = nil
  escaper = nil

  -- Создаем буфер для команд
  id = CommandBuffer:Insert(_ARG_0_, {
    -- Функция для загрузки карты (лето/зима)
    function(_ARG_0_)
      if game.datastore:GetNumber("missionPart") < 4 then
        return game.sds:ActivateStreamMapLine("free_summer_load")
      else
        return game.sds:ActivateStreamMapLine("free_winter_load")
      end
    end,
    -- Функция для установки погоды
    function(_ARG_0_)
      if game.datastore:GetNumber("missionPart") == 1 then
        game.gfx:SetWeatherTemplate("DTFreeRideDay")
        season = "summer"
      elseif game.datastore:GetNumber("missionPart") == 2 then
        game.gfx:SetWeatherTemplate("DTFreeRideDayRain")
        season = "summer"
      elseif game.datastore:GetNumber("missionPart") == 3 then
        game.gfx:SetWeatherTemplate("DTFreerideNight")
        season = "summer"
      elseif game.datastore:GetNumber("missionPart") == 4 then
        game.gfx:SetWeatherTemplate("DTFreeRideDayWinter")
        season = "winter"
      elseif game.datastore:GetNumber("missionPart") == 5 then
        game.gfx:SetWeatherTemplate("DTFreeRideDaySnow")
        season = "winter"
      elseif game.datastore:GetNumber("missionPart") == 6 then
        game.gfx:SetWeatherTemplate("DTFreeRideNightSnow")
        season = "winter"
      end
    end,
    -- Функция для сохранения игры
    function(_ARG_0_)
      game.game:SaveGame(1)
      return game.game:GetSaveGameSyncObject()
    end,
    -- Функция для инициализации игрока и мира
    function(_ARG_0_)
      hunter = nil
      escaper = nil
      player = game.game:GetActivePlayer()
      player:RegisterToMessages(guid, enums.EventType.HUMAN, enums.HumanMessages.ENTER_VEHICLE)
      player:RegisterToMessages(guid, enums.EventType.HUMAN, enums.HumanMessages.ON_OWNER_CHANGE)
      startPos = Math:newVector()
      hunterPos = Math:newVector()
      escaperPos = Math:newVector()
      startPos:set(69.6347, 909.077, -19.6336)
      hunterPos:set(129.172, 910.934, -22.05)
      escaperPos:set(129.156, 923.584, -22.47)
      player:SetPos(startPos)

      -- Добавляем случайный автомобиль для преследования
      hunter = game.entitywrapper:CreateEntityByName(getRandomCar(), hunterPos)
      hunter:Activate()
      hunter:SetColor(21, 21)

      -- Добавляем случайный автомобиль для побега
      escaper = game.entitywrapper:CreateEntityByName(getRandomCar(), escaperPos)
      escaper:Activate()
      escaper:SetColor(34, 34)

      -- Делаем игрока владельцем автомобилей
      player:MakeCarOwnership(escaper)
      player:MakeCarOwnership(hunter)

      -- Отправляем сообщение о начале игры
      sendMessage(_ARG_0_, 2, 200)

      -- Регистрируем персонажей для получения сообщений
      joe:RegisterToMessages(guid, enums.EventType.ACTOR, enums.ActorMessages.ACTIVATE)
      henry:RegisterToMessages(guid, enums.EventType.ACTOR, enums.ActorMessages.ACTIVATE)

      -- Устанавливаем режим свободного перемещения
      player:SetControlStyle(enums.ControlStyle.FREE)

      -- Включаем звук и HUD
      game.game:SoundFadeIn(1000)
      return game.hud:FaderFadeIn(1000)
    end
  })
end

-- Функция для создания действия для Joe
function CreateActionJoe(_ARG_0_)
  joe:RegisterToMessages(guid)
  Math:newVector():set(0, 0, 0)
  action = game.game:CreateScriptActorAction(joe, Math:newVector(), 1.5, "StartMe", "0050000023")
end

-- Функция для создания действия для Henry
function CreateActionHenry(_ARG_0_)
  henry:RegisterToMessages(guid)
  Math:newVector():set(0, 0, 0)
  actionHenry = game.game:CreateScriptActorAction(henry, Math:newVector(), 1.5, "StartHenry", "0050000023")
end

-- Функция для запуска действия Henry
function StartHenry(_ARG_0_)
  id = CommandBuffer:Insert(_ARG_0_, {
    function(_ARG_0_)
      game.game:ChangePlayerModel("VITSUIT", -1)
    end,
    function(_ARG_0_)
      _ARG_0_.friendlyDoorCfg:AddWingman(henry:GetGuid())
      soHenry = henry:Follow(game.game:GetActivePlayer(), "RUN", 3.5, 5, true)
      game.game:GetActivePlayer():RegisterFollower(henry)
      return game.delayed:CreateDelayedSynchroObject(100)
    end,
    function(_ARG_0_)
      actionHenry:SetEventName("StopHenry")
      actionHenry:SetTextId("0050000024")
    end
  })
end

-- Функция для остановки действия Henry
function StopHenry(_ARG_0_)
  id = CommandBuffer:Insert(_ARG_0_, {
    function(_ARG_0_)
      game.game:ChangePlayerModel("VITPRA", -1)
    end,
    function(_ARG_0_)
      _ARG_0_.friendlyDoorCfg:RemoveWingman(henry:GetGuid())
      if soHenry ~= nil then
        soHenry:UserData():Terminate()
      end
      player:UnregisterFollower(henry)
      return game.delayed:CreateDelayedSynchroObject(100)
    end,
    function(_ARG_0_)
      actionHenry:SetEventName("StartHenry")
      actionHenry:SetTextId("0050000023")
    end
  })
end

-- Функция для запуска действия Joe
function StartMe(_ARG_0_)
  id = CommandBuffer:Insert(_ARG_0_, {
    function(_ARG_0_)
      game.game:ChangePlayerModel("VITTUX", -1)
    end,
    function(_ARG_0_)
      _ARG_0_.friendlyDoorCfg:AddWingman(joe:GetGuid())
      soJde = joe:Follow(game.game:GetActivePlayer(), "RUN", 2, 3.5, true)
      game.game:GetActivePlayer():RegisterFollower(joe)
      return game.delayed:CreateDelayedSynchroObject(100)
    end,
    function(_ARG_0_)
      action:SetEventName("StopMe")
      action:SetTextId("0050000024")
    end
  })
end

-- Функция для остановки действия Joe
function StopMe(_ARG_0_)
  id = CommandBuffer:Insert(_ARG_0_, {
    function(_ARG_0_)
      game.game:ChangePlayerModel("VITPRA", -1)
    end,
    function(_ARG_0_)
      _ARG_0_.friendlyDoorCfg:RemoveWingman(joe:GetGuid())
      if soJde ~= nil then
        soJde:UserData():Terminate()
      end
      player:UnregisterFollower(joe)
      return game.delayed:CreateDelayedSynchroObject(100)
    end,
    function(_ARG_0_)
      action:SetEventName("StartMe")
      action:SetTextId("0050000023")
    end
  })
end

-- Функция для инициализации скрипта
function onGameInit(_ARG_0_)
  _ARG_0_.friendlyDoorCfg = common.ShopScripts.FriendlyDoor.Cfg
  registerForMachineMessages(_ARG_0_)
  DelayBuffer:Insert(FreeRideStart2, {_ARG_0_}, 100, 1, false)
  game.datastore:SetString("DerekStatus", "Opened")
  game.datastore:SetString("CharlieStatus", "Opened")
  game.datastore:SetString("BruskyStatus", "Opened")
  guid = base.ScriptMachine:getScriptGuid(_ARG_0_.scriptId)
end

-- Функция для обработки событий
function onEvent(_ARG_0_, _ARG_1_)
  if _ARG_1_:GetType() == enums.EventType.HUMAN then
    if _ARG_1_:GetMessage() == enums.HumanMessages.ON_OWNER_CHANGE then
      if _ARG_1_:GetReceiverGUID() == player:GetGuid() then
        if player:GetOwner() == hunter then
          idStart = DelayBuffer:Insert(Escape, {_ARG_0_}, 4000, 1, false, "Escaper")
        end
        if player:GetOwner() == escaper then
          idStart = DelayBuffer:Insert(Hunt, {_ARG_0_}, 4000, 1, false, "Hunter")
        end
      end
    elseif _ARG_1_:GetMessage() == enums.ActorMessages.ACTIVATE and _ARG_1_:HasName("OnDeActivate") then
      if _ARG_1_:GetReceiverGUID() == joe:GetGuid() then
        player:UnregisterFollower(joe)
        joe:UnregisterFromMessages()
      end
      if _ARG_1_:GetReceiverGUID() == henry:GetGuid() then
        player:UnregisterFollower(henry)
        henry:UnregisterFromMessages()
      end
    end
  end
  if _ARG_1_:GetType() == enums.EventType.BASEMESSAGE then
    if _ARG_1_:GetMessage() == 1 then
      FreeRideStart2(_ARG_0_)
    elseif _ARG_1_:GetMessage() == 2 then
      CreateActionJoe(_ARG_0_)
      CreateActionHenry(_ARG_0_)
    end
  end
  if _ARG_1_:HasName("StartMe") then
    StartMe(_ARG_0_)
  end
  if _ARG_1_:HasName("StopMe") then
    StopMe(_ARG_0_)
  end
  if _ARG_1_:HasName("StartHenry") then
    StartHenry(_ARG_0_)
  end
  if _ARG_1_:HasName("StopHenry") then
    StopHenry(_ARG_0_)
  end
end

-- Функция для побега
function Escape(_ARG_0_)
  if soJde ~= nil then
    soJde:UserData():Terminate()
  end
  pozice = Math:newVector()
  pozice:set(-1526.62, 549.156, -20.6837)
  joe:GetInOutCar(escaper, 1, false, false)
  escaper:DestroyController()
  escaper:CreateController("car_escaper")
  escaper:EscapeMode()
  escaper:InitializeAIParams(enums.CarAIProfile.PIRATE, 1)
  escaper:MoveTo(pozice, STOP)
  game.navigation:RegisterIconEntity("Escaper", 4, 2, "0051010001", true)
end

-- Функция для преследования
function Hunt(_ARG_0_)
  if soJde ~= nil then
    soJde:UserData():Terminate()
  end
  joe:GetInOutCar(hunter, 1, false, false)
  hunter:DestroyController()
  hunter:CreateController("car_hunter")
  hunter:InitializeAIParams(enums.CarAIProfile.PIRATE, 1)
  hunter:HuntCar(escaper)
  hunter:HuntMode(enums.CarHuntMode.ALONG)
  game.navigation:RegisterIconEntity("Hunter", 7, 2, "0051010002", true)
end

Описание улучшений:

  1. Случайный выбор автомобиля для преследования:

    • Добавлена функция getRandomCar(), которая выбирает случайный автомобиль из списка доступных машин в игре.
    • В функции FreeRideStart2() вместо конкретной модели автомобиля (Berkley_Kingfisher_pha) теперь вызывается getRandomCar(), чтобы создать случайный автомобиль для преследования.
  2. Добавление комментариев:

    • Добавлены комментарии для объяснения логики работы скрипта и каждого его блока.
  3. Улучшение читаемости:

    • Исправлены некоторые стилистические ошибки и улучшена читаемость кода.

Как использовать скрипт:

  1. Сохраните скрипт как файл с расширением .lua.
  2. Поместите этот файл в папку scripts игры Mafia 2.
  3. Запустите игру и наслаждайтесь улучшенным FreeRide!

Дополнительные возможности:

  • Вы можете добавить в список carList другие модели автомобилей, которые хотите использовать для преследования.
  • Вы можете настроить параметры AI для автомобилей (например, скорость, агрессивность) в функции InitializeAIParams().
  • Вы можете добавить новые функции для других действий в FreeRide, например, для ограбления или гонок.
Улучшенный скрипт Lua для FreeRide в Mafia 2

原文地址: https://www.cveoy.top/t/topic/nKdG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录