饥荒绕本地实战

一.背景

最近在学习饥荒源码,发现饥荒客机的权限非常高,现有的禁止本地方法似乎非常的好破解,自己尝试了一下居然成功了,在此记录一下自己的思路。

二.引言

绕本地是基于修改服务器模组内容实现的,因为饥荒的服务器模组实际上是运行在客机的,修改即可实现夹带私货,服务器模组内容一般在C:\Program Files (x86)\Steam\steamapps\workshop\content\322330下

三.模组禁止本地

特点

服务器模组有禁止本地mod或禁止特定mod的模组

禁本地原理

定时检查玩家是打开了了鹰眼夜视开关,然后关闭

绕本地思路

比如禁本地mod id为xxx,则清空C:\Program Files (x86)\Steam\steamapps\workshop\content\322330\XXX\modmain.lua里的内容(清空内容,文件别删)

四.官方的禁本地

特点

进房间会提示

禁本地原理

在modoverrides.lua文件加client_mods_disabled=true或者用 游戏内主菜单 模组 去实现官方禁止本地

绕本地思路

在服务器上开任意的服务器模组(比如全球定位,showme,自动堆叠等)追加一些代码

比如全球定位模组id为xxx,打开C:\Program Files (x86)\Steam\steamapps\workshop\content\322330\XXX\modmain.lua

在尾部追加一些代码(见附录),最后三行代码,keysF[1]代表F1开启鹰眼,keysF[2]代表F1开启夜视,keysF[9]代表F9开启大视野,想改键自己改代码即可

五.注意事项

粘贴后出现橙色的框代表有问题,你要去掉这些橙色的框

删除从CSDN上粘贴自带的水印

六.附录

local obc_eagleMode = 0

-- 0 : 默认

-- 1 :高空

-- 2 :鹰眼



local nightsightMode = false

local lastFov = 35

local CIRCLE_STATE = nil

local G = GLOBAL



local showTip = false



local function TIP(stat, green, content)

  if showTip then

    if green then

      G.ThePlayer.HUD.controls.networkchatqueue:PushMessage(stat, content, {0.196, 0.804, 0.196, 1})

    else

      G.ThePlayer.HUD.controls.networkchatqueue:PushMessage(stat, content, {1, 0.388, 0.278, 1})

    end

  end

end



local function MakeCircle(inst, n, scale)

  local circle = G.CreateEntity()



  circle.entity:SetCanSleep(false)

  circle.persists = false



  circle.entity:AddTransform()

  circle.entity:AddAnimState()



  circle:AddTag("CLASSIFIED")

  circle:AddTag("NOCLICK")

  circle:AddTag("placer")



  circle.Transform:SetRotation(n)

  -- 大小

  circle.Transform:SetScale(scale, scale, scale)



  circle.AnimState:SetBank("firefighter_placement")

  circle.AnimState:SetBuild("firefighter_placement")

  circle.AnimState:PlayAnimation("idle")

  circle.AnimState:SetLightOverride(1)

  circle.AnimState:SetOrientation(G.ANIM_ORIENTATION.OnGround)

  circle.AnimState:SetLayer(G.LAYER_BACKGROUND)

  circle.AnimState:SetSortOrder(3.1)

  -- 颜色

  circle.AnimState:SetAddColour(0, 255, 0, 0)



  circle.entity:SetParent(inst.entity)

  return circle

end





local function IsDefaultScreen()

  local screen = GLOBAL.TheFrontEnd:GetActiveScreen()

  local screenName = screen and screen.name or ""

  return screenName:find("HUD") ~= nil and GLOBAL.ThePlayer ~= nil

end



local function SetCamera(zoomstep, mindist, maxdist, mindistpitch, maxdistpitch, distance, distancetarget)

  if GLOBAL.TheCamera ~= nil then

    local camera = GLOBAL.TheCamera

    camera.zoomstep = zoomstep or camera.zoomstep

    camera.mindist = mindist or camera.mindist

    camera.maxdist = maxdist or camera.maxdist

    camera.mindistpitch = mindistpitch or camera.mindistpitch

    camera.maxdistpitch = maxdistpitch or camera.maxdistpitch

    camera.distance = distance or camera.distance

    camera.distancetarget = distancetarget or camera.distancetarget

  end

end

local function SetDefaultView()

  if GLOBAL.TheWorld ~= nil then

    if GLOBAL.TheWorld:HasTag("cave") then

      SetCamera(4, 15, 35, 25, 40, 25, 25)

    else

      SetCamera(4, 15, 50, 30, 60, 30, 30)

    end

  end

end



local function SetAerialView()

  if GLOBAL.TheWorld ~= nil then

    if GLOBAL.TheWorld:HasTag("cave") then

      SetCamera(10, 10, 180, 25, 40, 80, 80)

    else

      SetCamera(10, 10, 180, 30, 60, 80, 80)

    end

  end

end



function SetVerticalView()

  if GLOBAL.TheWorld ~= nil then

    if GLOBAL.TheWorld:HasTag("cave") then

      SetCamera(10, 10, 180, 90, 90, 80, 80)

    else

      SetCamera(10, 10, 180, 90, 90, 80, 80)

    end

  end

end



-- 鹰眼

local function EagleViewMode()

  local player = G.ThePlayer

  if IsDefaultScreen() then

    if (obc_eagleMode == 0) then

      obc_eagleMode = 2

      lastFov = GLOBAL.TheCamera.fov

      SetVerticalView()

      GLOBAL.TheCamera.fov = 165

      -- 画圆

      CIRCLE_STATE = {}

      table.insert(CIRCLE_STATE, MakeCircle(player, 0, 2))

      table.insert(CIRCLE_STATE, MakeCircle(player, 2, 2))

      TIP("视角", false, "鹰眼")

    elseif (obc_eagleMode == 1) then

      obc_eagleMode = 2

      lastFov = GLOBAL.TheCamera.fov

      SetVerticalView()

      GLOBAL.TheCamera.fov = 165

      -- 画圆

      CIRCLE_STATE = {}

      table.insert(CIRCLE_STATE, MakeCircle(player, 0, 2))

      table.insert(CIRCLE_STATE, MakeCircle(player, 2, 2))

      TIP("视角", false, "鹰眼")

    else

      obc_eagleMode = 1

      SetAerialView()

      GLOBAL.TheCamera.fov = lastFov

      -- 画圆

      for _,circle in pairs(CIRCLE_STATE) do circle:Remove() end

      CIRCLE_STATE = nil

      TIP("视角", true, "大视野")

    end

  end

end

-- 大视野

local function BigViewMode()

  local player = G.ThePlayer

  if IsDefaultScreen() then

    if (obc_eagleMode == 0) then

      obc_eagleMode = 1

      SetAerialView()

      GLOBAL.TheCamera.fov = lastFov

      TIP("视角", true, "大视野")

    else

      obc_eagleMode = 0

      SetDefaultView()

      GLOBAL.TheCamera.fov = lastFov

      TIP("视角", true, "标准")

    end

  end

end



-- 智能夜视



local function TurnOnNightVision(player)

  player.light = player.entity:AddLight()

  player.light:SetFalloff(0.5)

  player.light:SetIntensity(player.lightx)

  player.light:SetRadius(10^4)

  player.light:SetColour(255/255, 225/255, 255/255)

  player.light:Enable(true)

  player:DoTaskInTime(1, function() TIP("提示", true, "夜晚到来, 请准备光源") end)

end





local function TurnOffNightVision(player)

  player.light = player.entity:AddLight()

  player.light:SetFalloff(0.5)

  player.light:SetIntensity(0)

  player.light:SetRadius(0)

  player.light:SetColour(255/255, 225/255, 255/255)

  player.light:Enable(false)

end



local function TurnOffDelay(player)

  player:DoTaskInTime(5, function() TurnOffNightVision(player) end)

end



local function NightSight()

  if GLOBAL.ThePlayer and not GLOBAL.ThePlayer.HUD:IsChatInputScreenOpen() and not GLOBAL.ThePlayer.HUD:IsConsoleScreenOpen() and not GLOBAL.ThePlayer.HUD.writeablescreen then

    local player = G.ThePlayer

    nightsightMode = not nightsightMode

    if nightsightMode then

      player.lightx = player.lightx or 1

      player:WatchWorldState("startday",TurnOffDelay)

      player:WatchWorldState("startnight",TurnOnNightVision)

      if G.TheWorld.state.isday or G.TheWorld.state.isdusk then

        TIP("开启", true, "智能夜视已开启, 夜晚将会自动启用")

      else

        TIP("开启", true, "智能夜视已开启")

        TurnOnNightVision(player)

      end

    else

      if G.TheWorld.state.isnight then

        TurnOffNightVision(player)

      end

      player:WatchWorldState("startnight",TurnOffNightVision)

      TIP("关闭", false, "智能夜视已关闭")

    end



  end

end



local keys2 = {

  "F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11",

}



local keysF = {}

local keyslist_F = {}



for i=1, #keys2 do

  keyslist_F[i] = {description = keys2[i], data = i + 281}

  keysF[i] = i+281

end

GLOBAL.TheInput:AddKeyDownHandler(keysF[1], EagleViewMode)

GLOBAL.TheInput:AddKeyDownHandler(keysF[2], NightSight)

GLOBAL.TheInput:AddKeyDownHandler(keysF[9], BigViewMode)

【A股温度计】www.agwdj.com 镜像版程序V1.0说明 •通过数据可视化技术,将复杂的A股市场数据转化为直观的图形界面,帮助投资者快速把握市场脉搏。 【核心功能】 •全景视角:突破信息碎片化局限,快速定位涨跌分布,一眼锁定今日热点板块 •板块排序:基于申万行业分类标准,对31个一级行业和131个二级行业实时动态排序 •硬件适配:智能适配不同分辨率屏幕,4K以上屏幕显示信息更多(视觉更佳) •智能缩放:A股全图让大A市场5000+个股同屏显示(支持鼠标滚轮及触摸设备5级缩放) 【三秒原则】 •三秒看懂:通过精心设计的视觉图形,让用户在三秒内看清市场整体状况 •三秒定位:智能算法让大成交额个股和热点板块自动靠前,快速定位机会 •三秒操作:极简的界面,让用户减少操作 【使用场景】 •盘前准备:快速了解隔夜市场变化,制定当日策略 •盘中监控:实时跟踪市场动向,及时把握当日机会 •盘后复盘:全面分析当日市场表现,总结经验教训 【适合人群】 •个人用户:快速了解市场整体趋势变化,辅助决策 •专业人员:获取每天市场的数据云图支持研究工作 •金融机构:作为投研系统的可视化补充组件 •财经媒体:制作专业市场分析图表和报道 【市场切换】 •默认加载"A股全图",可切换单独显示的类型如下: •上证A股/深证A股/北证A股/创业板/科创板/ST板块/可转债/ETF 【程序优势】 •运行环境:纯PHP运行(无需安装任何数据库) •数据更新:实时同步→A股温度计→www.agwdj.com •显示优化:自动适配8K/4K/2K/1080P等不同分辨率的屏幕 •设备兼容:对市面上主流的设备及浏览器做了适配(检测到手机/平板/电视等默认Chrome/Firefox/Edge内核过低的情况会自动提示) 【其他说明】 •A股温度计程序演示网址:https://www.agwdj.com
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值