Mafia 2 FreeRide Lua 脚本优化及完整代码示例

本示例代码旨在增强 Mafia 2 FreeRide 模式的游戏体验。

代码优化

以下代码进行了优化,以提高其可读性和性能。

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

function FreeRideStart2(_ARG_0_)
  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)
      game.garage:CheatAddCar('Ascot_BaileyS200_pha', true)
      game.garage:CheatAddCar('Berkley_Kingfisher_pha', true)
      game.garage:CheatAddCar('Delizia_Grandeamerica', true)
      game.garage:CheatAddCar('Hot_Rod_1', true)
      game.garage:CheatAddCar('Hot_Rod_2', true)
      game.garage:CheatAddCar('Hot_Rod_3', true)
      game.garage:CheatAddCar('Houston_Wasp_pha', true)
      game.garage:CheatAddCar('ISW_508', true)
      game.garage:CheatAddCar('Jeep', true)
      game.garage:CheatAddCar('Jeep_civil', true)
      game.garage:CheatAddCar('Jefferson_Futura_pha', true)
      game.garage:CheatAddCar('Jefferson_provincial', true)
      game.garage:CheatAddCar('Lassiter_69', true)
      game.garage:CheatAddCar('Lassiter_75_pha', true)
      game.garage:CheatAddCar('Milk_Truck', true)
      game.garage:CheatAddCar('Potomac_Indian', true)
      game.garage:CheatAddCar('Quicksilver_Windsor_pha', true)
      game.garage:CheatAddCar('Quicksilver_Windsor_Taxi_pha', true)
      game.garage:CheatAddCar('Shubert_34', true)
      game.garage:CheatAddCar('Shubert_38', true)
      game.garage:CheatAddCar('Shubert_Armoured', true)
      game.garage:CheatAddCar('Shubert_Beverly', true)
      game.garage:CheatAddCar('Shubert_Frigate_pha', true)
      game.garage:CheatAddCar('Shubert_Hearse', true)
      game.garage:CheatAddCar('Shubert_Panel', true)
      game.garage:CheatAddCar('Shubert_PickUp', true)
      game.garage:CheatAddCar('Shubert_Taxi', true)
      game.garage:CheatAddCar('Shubert_Truck_CT', true)
      game.garage:CheatAddCar('Shubert_Truck_SG', true)
      game.garage:CheatAddCar('Shubert_Truck_SP', true)
      game.garage:CheatAddCar('Smith_200_p_pha', true)
      game.garage:CheatAddCar('Smith_200_pha', true)
      game.garage:CheatAddCar('Smith_coupe', true)
      game.garage:CheatAddCar('Smith_Mainline_pha', true)
      game.garage:CheatAddCar('Smith_Stingray_pha', true)
      game.garage:CheatAddCar('Smith_Truck', true)
      game.garage:CheatAddCar('Smith_V8', true)
      game.garage:CheatAddCar('Smith_Wagon_pha', true)
      game.garage:CheatAddCar('Trautenberg_Grande', true)
      game.garage:CheatAddCar('Ulver_NewYorker', true)
      game.garage:CheatAddCar('Ulver_NewYorker_p', true)
      game.garage:CheatAddCar('Walker_Rocket', true)
      game.garage:CheatAddCar('Walter_Coupe', true)
      game.garage:CheatAddCar('Chaffeque', true)
      game.garage:CheatAddCar('Elysium', true)
      game.garage:CheatAddCar('Roller', true)
      game.garage:CheatAddCar('Waybar', true)
      game.garage:CheatAddCar('Moscardo_AS37_pha', true)
      return game.sds:ActivateStreamMapLine('free_joe_load')
    end,
    function(_ARG_0_)
      return game.sds:GetSyncObjectForLoadSDS('italy')
    end,
    function(_ARG_0_)
      if season == 'summer' then
        game.traffic:OpenSeason(140)
        game.speech:LoadStage(140)
        game.radio:SetContent('Empire', 'all', 'Empire_07010')
        game.radio:SetContent('Classic', 'all', 'Classic_07010')
        game.radio:SetContent('Delta', 'all', 'Delta_07010')
      elseif season == 'winter' then
        game.traffic:OpenSeason(50)
        game.speech:LoadStage(50)
        game.radio:SetContent('Empire', 'all', 'Empire_02004')
        game.radio:SetContent('Classic', 'all', 'Classic_02004')
        game.radio:SetContent('Delta', 'all', 'Delta_02004')
      else
        game.traffic:OpenSeason(140)
        game.speech:LoadStage(140)
        game.radio:SetContent('Empire', 'all', 'Empire_07010')
        game.radio:SetContent('Classic', 'all', 'Classic_07010')
        game.radio:SetContent('Delta', 'all', 'Delta_07010')
      end
      joe = game.entitywrapper:GetEntityByName('Joe')
      henry = game.entitywrapper:GetEntityByName('Henry')
      hunter = game.entitywrapper:GetEntityByName('Hunter')
      escaper = game.entitywrapper:GetEntityByName('Escaper')
      startPos:set(66.8521, 905.596, -19.6336)
      joe:SetPos(startPos)
      joe:Activate()
      joe:InventoryAddWeapon(4, 21)
      startPos:set(66.8521, 906.596, -19.6336)
      henry:SetPos(startPos)
      henry:Activate()
      hunter:SetPos(hunterPos)
      escaper:SetPos(escaperPos)
      hunter:Activate()
      escaper:Activate()
      escaper:SetColor(34, 34)
      hunter:SetColor(21, 21)
      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)
      game.game:SoundFadeIn(1000)
      return game.hud:FaderFadeIn(1000)
    end
  })
end

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

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

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

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

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

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

代码说明

  • onGameInit 函数在游戏初始化时运行,主要负责设置游戏环境,并注册事件监听。
  • onEvent 函数用于处理游戏事件,比如玩家切换车辆、角色被激活等。
  • EscapeHunt 函数分别定义了逃逸和追捕模式的逻辑。
  • FreeRideStart2 函数用于启动 FreeRide 模式,包括设置天气、加载地图、添加车辆等。
  • CreateActionJoeCreateActionHenry 函数用于创建与 Joe 和 Henry 角色相关的动作。
  • StartMe, StopMe, StartHenryStopHenry 函数控制 Joe 和 Henry 角色的跟随和解除跟随。

使用方法

  1. 将代码保存为 Lua 文件,例如 freeride.lua
  2. 将 Lua 文件放置到游戏安装目录下的 scripts 文件夹中。
  3. 在游戏中启动 FreeRide 模式,即可体验该脚本带来的改进。

注意

  • 此脚本仅供参考,可能会与游戏版本不兼容。
  • 请谨慎使用脚本,避免造成游戏损坏或数据丢失。
  • 玩家可以使用 Lua 脚本来定制自己的游戏体验,但需遵循游戏规则和道德规范。

本脚本示例旨在帮助玩家更好地理解 Lua 脚本语言和游戏开发原理,并在游戏体验方面有所提升。

请注意: 本脚本示例仅供参考,不保证其能完美运行或符合所有游戏版本。建议在使用脚本前备份游戏存档,并仔细阅读游戏规则和使用说明。

Mafia 2 FreeRide Lua 脚本优化及完整代码示例

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

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