function searchOffset(content, field, filter, field2, filter2) local curClass = "" for line in content:gmatch("[^\r\n]+") do if line:find("Class:",1, true) then curClass = line:match("Class:%s*(.+)") or "" end if field and line:find(field, 1, true) and line:find("Offset:") then local offset = line:match("Offset:%s*(0x[%x]+)") if offset and (filter == "" or curClass:find(filter, 1, true)) then if field2 and field2 ~= "" then local offset2 = searchOffset(content, field2, filter2) return offset2 and ("0x" .. offset:gsub("^0x",""):upper()), offset2 end return "0x" .. offset:gsub("^0x",""):upper() end end end return nil end local cfgFile = "/sdcard/Android/SDKU过滤输出.txt" function readPaths() local f = io.open(cfgFile, "r") if not f then return nil, nil end local sdk, out = f:read("*line"), f:read("*line") f:close() return sdk, out end function savePaths(sdk, out) local f = io.open(cfgFile, "w") if f and out ~= "" then f:write(sdk .. "\n" .. out .. "\n") f:close() else f:write(sdk .. "\n") f:close() end end local filePath = gg.getFile() local dirPath = filePath:match(".*/") or "" local lastSdk, lastOut = readPaths() local inputs = gg.prompt({"SDKU文件路径", "输出文件路径"}, {lastSdk or dirPath, lastOut or dirPath}, {"file", "path"}) if not inputs then gg.alert("已取消操作") return end savePaths(inputs[1], inputs[2]) local f = io.open(inputs[1], "r") if not f then gg.alert("无法打开文件") return end local content = f:read("*a") f:close() local moveCompStr = "CharacterMovementComponent* CharacterMovement" local judgeOff = searchOffset(content,"PlayerController* PlayerController","Player.Object") local judgeBit = judgeOff and tonumber(judgeOff:gsub("^0x",""), 16) or 0 local playerCtrl = "ULocalPlayer," .. (judgeOff or "未找到") local selfAddr = playerCtrl .. "," .. (searchOffset(content,"Pawn* Pawn","") or "未找到") local moveCompAddr = selfAddr .. "," .. (searchOffset(content, moveCompStr,"") or "未找到") local boneAddr = selfAddr .. "," .. (searchOffset(content,"SkeletalMeshComponent* Mesh","") or "未找到") local weaponEntity = searchOffset(content,"WeaponEntity* WeaponEntityComp","") local crossHairComp = searchOffset(content,"CrossHairComponent* CachedCrossHairComponen","STExtraShootWeapon.STExtraWeapon.LuaActor.Actor.Object") local bulletTrackComp = searchOffset(content,"BulletTrackComponent* CachedBulletTrackComponent","") local noRecoil = searchOffset(content,"SRecoilInfo RecoilInfo_NoTss","WeaponLogicBaseComponent.ActorComponent.Object") local worldSet = searchOffset(content,"WorldSettings* WorldSettings","Level.Object") local fistHit = searchOffset(content,"UTSkillHitInfo SkillHitInfo","") local gunScale = searchOffset(content,"Transform FPPWeaponOffset;","") local horseRider = searchOffset(content,"STExtraBaseCharacter* CachedHorseRider","") local horsePassenger = searchOffset(content,"STExtraBaseCharacter* CachedHorsePassenger","") local vehMoveComp = searchOffset(content,"BioVehicleMovementComponent* VehicleMovement","") local vehCommon = searchOffset(content,"VehicleCommonComponent* VehicleCommon","") local currVehicle = searchOffset(content,"STExtraVehicleBase* CurrentVehicle","") local vehMove4W = searchOffset(content,"STExtraVehicleMovementComponent4W* VehicleMovement","") local gunScale1 = "0x1E8" local gunScale2 = "0x1F0" local gunScale3 = "0x1F4" if gunScale then local t = tonumber(gunScale,16) if t then gunScale1 = string.format("0x%X",t - 0x10) gunScale2 = string.format("0x%X",t - 0xC) gunScale3 = string.format("0x%X",t - 0x8) end end local pickUpID = searchOffset(content,"ItemDefineID DefineID","PickUpWrapperActor.UAENetActor.LuaActor.Actor.Object") local pickUpOff = "0x4F4C" if pickUpID then local pn = tonumber(pickUpID,16) if pn then pickUpOff = string.format("0x%X",pn + 0x4) end end local gameView = searchOffset(content,"GameViewportClient* ViewportClient","LocalPlayer.Player.Object") local gWorld = "未找到" if gameView then local woff = searchOffset(content,"World* World","GameViewportClient.ScriptViewportClient.Object") if woff then gWorld = gameView..","..woff end end local Actor1 = "Character.Pawn.Actor.Object" local Actor2 = "SceneComponent.ActorComponent.Object" local Actor3 = "WeaponLogicBaseComponent.ActorComponent.Object" local Actor4 = "PlayerController.Controller.Actor.Object" local Vehicle1 = "STExtraBaseCharacter.Pawn.Actor.Object" local Vehicle2 = "BioVehicleBase.STExtraVehicleBase.Pawn.Actor.Object" local Vehicle3 = "VehicleComponent.LuaActorComponent.ActorComponent.Object" local MovementBase = "MovementComponent.ActorComponent.Object" local VehicleMoveBase = "BioVehicleMovementComponent.PawnMovementComponent.NavMovementComponent.MovementComponent.ActorComponent.Object" local handKeyList = "AnimStatusKeyList CurUpdateStatusKeyList" local weaponList = { "武器ID","手持秒切枪","手持秒收枪","手持枪械瞬击","手持枪械射速", "手持枪械一枪秒","手持枪械配件无后","手持枪械聚点","手持喷子垂直聚点", "手持喷子水平聚点","手持手臂防抖","手持开镜防抖","手持腰射防抖", "手持秒开镜","手持打击特效" } local adj = { ["FOV水平角度"] = 0x4, ["快速趴下"] = 0x4, ["轮盘左右"] = 0x4, ["左右探头"] = -0x2, ["虚体左右"] = 0x4, ["虚体上下"] = 0x8, ["人物大小y"] = 0x4, ["人物大小z"] = 0x8, ["载具前后按键"] = 0x3, ["载具左右按键"] = 0x7, ["载具刹车按键"] = 0x13, ["载具喇叭按键"] = -0x1, ["载具判断[90000]"] = 0x8 } local rules = { {"静态广角","byte AspectRatioAxisConstraint","LocalPlayer.Player.Object"}, {"GWorld","",""}, {"ULevel","Level* PersistentLevel","World.Object"}, {"全局变速1","Level* PersistentLevel","World.Object","float TimeDilation","WorldSettings.Info.Actor.Object"}, {"全局变速2","Level* PersistentLevel","World.Object","float MatineeTimeDilation","WorldSettings.Info.Actor.Object"}, {"全局变速3","Level* PersistentLevel","World.Object","float DemoPlayTimeDilation","WorldSettings.Info.Actor.Object"}, {"0.4减速","Level* PersistentLevel","World.Object","float MaxUndilatedFrameTime","WorldSettings.Info.Actor.Object"}, {"1f落地后摇","float CustomTimeDilation","Actor.Object"}, {"FOV垂直角度","Rotator ControlRotation","Controller.Actor.Object"}, {"FOV水平角度","Rotator ControlRotation","Controller.Actor.Object"}, {"准心RGB颜色","LinearColor CrossHairColor",Actor4}, {"自动开火","bool bIsPressingFireBtn",Actor4}, {"HUD十字线","bool bDebugDrawHUDCrossLine",Actor4}, {"全局变速[自身地址]","float CustomTimeDilation","Actor.Object"}, {"人物灵魂[自身地址]","bool bHidden","Actor.Object"}, {"锁定地形","BasedMovementInfo BasedMovement","Actor.Object"}, {"人物踏空","int JumpMaxCount",Actor1}, {"玩家名称","FString PlayerName",Actor1}, {"玩家UID","FString PlayerUID",Actor1}, {"队伍ID","int TeamID",Actor1}, {"人机判断","bool bIsAI",Actor1}, {"当前血量","float Health;",Actor1}, {"最大血量","float HealthMax",Actor1}, {"8D判断","uint64 CurrentStates",Actor1}, {"开镜判断","bool bIsGunADS",Actor1}, {"微加速","float SpeedScale",Actor1}, {"479.5[自身地址]","float SpeedValue",Actor1}, {"无敌状态","bool IsInvincible",Actor1}, {"跳伞加速","CharacterParachuteComponent* ParachuteComponent",Actor1,"float CurrentFallSpeed",""}, {"开火判断","bool bIsWeaponFiring",Actor1}, {"动作姿势","byte PoseState",Actor1}, {"拾取范围","float PickUpRadius",Actor1}, {"人称判断","bool IsFPP",Actor1}, {"拾取动画","bool bEnablePlayerPickUpAnim",Actor1}, {"轮盘前后","Vector MoveInputState",Actor1}, {"轮盘左右","Vector MoveInputState",Actor1}, {"左右探头","bool IsPeekLeft",Actor1}, {"探头判断","bool IsClientPeeking",Actor1}, {"游泳加速","float MaxSwimSpeed",Actor1}, {"默认速度","float DefaultSpeedValue",Actor1}, {"全枪秒切","float SwitchWeaponSpeedScale",Actor1}, {"站立半高[88]","float StandHalfHeight",Actor1}, {"蹲伏半高[60]","float CrouchHalfHeight",Actor1}, {"俯卧半高[50]","float ProneHalfHeight",Actor1}, {"美化指针","CharacterAvatarComponent2* AvatarComponent2",Actor1,"NetAvatarSyncData NetAvatarData","SlotAvatarComponent.AvatarComponentBase.LuaActorComponent.ActorComponent.Object"}, {"标点美化","SearchedPickUpItemResult[] AvailablePickupPropsResult",Actor1,"PickUpWrapperActor* Wrapper","SearchedPickUpItemResult"}, {"挥拳判断","UTSkillManagerComponent* SkillManager",Actor1}, {"X轴坐标","SceneComponent* RootComponent","Actor.Object","Vector RelativeScale3D",Actor2}, {"虚体前后","Vector RelativeLocation",Actor2}, {"虚体左右","Vector RelativeLocation",Actor2}, {"虚体上下","Vector RelativeLocation",Actor2}, {"人物旋转","Rotator RelativeRotation",Actor2}, {"人物大小x","Vector RelativeScale3D",Actor2}, {"人物大小y","Vector RelativeScale3D",Actor2}, {"人物大小z","Vector RelativeScale3D",Actor2}, {"骨骼变速","float GlobalAnimRateScale",Actor2}, {"相机广角","CustomSpringArmComponent* SpringArmComp",Actor1,"float FieldOfView","CameraComponent.SceneComponent.ActorComponent.Object"}, {"三称广角","CameraComponent* ThirdPersonCameraComponent",Actor1,"float FieldOfView","CameraComponent.SceneComponent.ActorComponent.Object"}, {"一称广角","CameraComponent* FPPCameraComp",Actor1,"float FieldOfView","CameraComponent.SceneComponent.ActorComponent.Object"}, {"开镜广角","CameraComponent* ScopeCameraComp",Actor1,"float FieldOfView","CameraComponent.SceneComponent.ActorComponent.Object"}, {"拾取高度","PickupManagerComponent* PickupManagerComponent",Actor1,"float PickUpZLimit","PickupManagerComponent.ActorComponent.Object"}, {"隔墙拾取","PickupManagerComponent* PickupManagerComponent",Actor1,"bool bApplyVisibleTrace","PickupManagerComponent.ActorComponent.Object"}, {"人物灵魂[运动地址]",moveCompStr,Actor1,"bool bAutoActivate","ActorComponent.Object"}, {"X轴向量",moveCompStr,Actor1,"Vector Velocity",MovementBase}, {"重力",moveCompStr,Actor1,"float GravityScale",MovementBase}, {"上下坡",moveCompStr,Actor1,"float MaxStepHeight",MovementBase}, {"高跳",moveCompStr,Actor1,"float JumpZVelocity",MovementBase}, {"人物状态",moveCompStr,Actor1,"byte MovementMode",MovementBase}, {"479.5[运动地址]",moveCompStr,Actor1,"float MaxWalkSpeed",MovementBase}, {"60000",moveCompStr,Actor1,"float MaxFlySpeed",MovementBase}, {"8192空中惯性",moveCompStr,Actor1,"float MaxAcceleration",MovementBase}, {"2f落地后摇",moveCompStr,Actor1,"float BrakingFrictionFactor",MovementBase}, {"2048",moveCompStr,Actor1,"float BrakingDecelerationWalking",MovementBase}, {"0.05空中惯性",moveCompStr,Actor1,"float AirControl",MovementBase}, {"13680",moveCompStr,Actor1,"bool bUseControllerDesiredRotation",MovementBase}, {"7500",moveCompStr,Actor1,"float PushForceFactor",MovementBase}, {"0.1向量",moveCompStr,Actor1,"float MaxSimulationTimeStep",MovementBase}, {"8D坐标飞天",moveCompStr,Actor1,"int MaxSimulationIterations",MovementBase}, {"防卡脚",moveCompStr,Actor1,"bool bNetworkUpdateReceived",MovementBase}, {"240",moveCompStr,Actor1,"float MinTimeBetweenTimeStampResets",MovementBase}, {"670限制",moveCompStr,Actor1,"float WalkSpeedCurveScale",MovementBase}, {"手持美化指针",handKeyList,Actor1,"MeshSynData[] synData",""}, {"手持武器ID",handKeyList,Actor1,"int WeaponId",Actor3}, {"手持秒切枪",handKeyList,Actor1,"float SwitchFromIdleToBackpackTime",Actor3}, {"手持秒收枪",handKeyList,Actor1,"float SwitchFromBackpackToIdleTime",Actor3}, {"手持枪械瞬击",handKeyList,Actor1,"float BulletFireSpeed",Actor3}, {"手持枪械射速",handKeyList,Actor1,"float ShootInterval",Actor3}, {"手持枪械一枪秒",handKeyList,Actor1,"int BulletNumSingleShot",Actor3}, {"手持枪械配件无后",handKeyList,Actor1,"float AccessoriesVRecoilFactor",Actor3}, {"手持枪械聚点",handKeyList,Actor1,"float GameDeviationFactor",Actor3}, {"手持喷子垂直聚点",handKeyList,Actor1,"float ShotGunVerticalSpread",Actor3}, {"手持喷子水平聚点",handKeyList,Actor1,"float ShotGunHorizontalSpread",Actor3}, {"手持手臂防抖",handKeyList,Actor1,"float RecoilKick",Actor3}, {"手持开镜防抖",handKeyList,Actor1,"float RecoilKickADS",Actor3}, {"手持腰射防抖",handKeyList,Actor1,"float AnimationKick",Actor3}, {"手持秒开镜",handKeyList,Actor1,"float WeaponAimInTime",Actor3}, {"手持打击特效",handKeyList,Actor1,"float ExtraHitPerformScale",Actor3}, {"手持子弹数量",handKeyList,Actor1,"BulletInClip CurBulletInClip",""}, {"手持子弹大小",handKeyList,Actor1,"Vector BulletDecalScale",""}, {"手持枪械大小x",handKeyList,Actor1}, {"手持枪械大小y",handKeyList,Actor1}, {"手持枪械大小z",handKeyList,Actor1}, {"手持全枪无后",handKeyList,Actor1,"",Actor3}, {"准心旋转角度",handKeyList,Actor1,"float RotateAngle",Actor3}, {"骑马者","STExtraBaseCharacter* CachedHorseRider",""}, {"马乘客","STExtraBaseCharacter* CachedHorsePassenger",""}, {"马匹踏空","int JumpMaxCount",Vehicle2}, {"马匹跳跃判断","bool bCanVehicleJump",Vehicle2}, {"马匹重力","BioVehicleMovementComponent* VehicleMovement","","float GravityScale",VehicleMoveBase}, {"马匹状态","BioVehicleMovementComponent* VehicleMovement","","byte MovementMode",VehicleMoveBase}, {"马匹上下坡","BioVehicleMovementComponent* VehicleMovement","","float MaxStepHeight",VehicleMoveBase}, {"马匹最大步行速度","BioVehicleMovementComponent* VehicleMovement","","float MaxWalkSpeed",VehicleMoveBase}, {"马匹最大蹲下速度","BioVehicleMovementComponent* VehicleMovement","","float MaxWalkSpeedCrouched",VehicleMoveBase}, {"马匹最大游泳速度","BioVehicleMovementComponent* VehicleMovement","","float MaxSwimSpeed",VehicleMoveBase}, {"马匹最大飞行速度","BioVehicleMovementComponent* VehicleMovement","","float MaxFlySpeed",VehicleMoveBase}, {"马匹默认速度","BioVehicleMovementComponent* VehicleMovement","","float DefaultSpeed",VehicleMoveBase}, {"马匹加速①","BioVehicleMovementComponent* VehicleMovement","","float BioSpeedRate",VehicleMoveBase}, {"马匹加速②","BioVehicleMovementComponent* VehicleMovement","","float BioAccelerationRate",VehicleMoveBase}, {"当前载具指针[自身地址]","STExtraVehicleBase* CurrentVehicle",Actor1}, {"载具最大血量","VehicleCommonComponent* VehicleCommon","","float HPMax",Vehicle3}, {"载具当前血量","VehicleCommonComponent* VehicleCommon","","float HP;",Vehicle3}, {"载具最大油量","VehicleCommonComponent* VehicleCommon","","float FuelMax",Vehicle3}, {"载具当前油量","VehicleCommonComponent* VehicleCommon","","float Fuel;",Vehicle3}, {"载具类型","enum VehicleType",""}, {"载具判断[90000.0]","bool bUseControlRotVehicle",""}, {"载具固定视角","bool bEnableVehicleSteeringCamera",""}, {"载具前后按键","bool IsCanVehicleJump",""}, {"载具左右按键","bool IsCanVehicleJump",""}, {"载具刹车按键","bool IsCanVehicleJump",""}, {"载具喇叭按键","bool bIsUsingHorn",""}, {"载具坐标指针","STExtraVehicleMovementComponent4W* VehicleMovement",""}, {"打击特效1","HUD* MyHUD",Actor4,"HitPerformData HitPerform","SurviveHUD.HUD.Actor.Object"} } local results = {} local basePath = inputs[2]:gsub("%.txt$", "") local outPath = basePath .. "SDKU过滤.lua" if io.open(outPath, "r") then for i = 1, 500 do local newPath = basePath .. "SDKU过滤" .. i .. ".lua" if not io.open(newPath, "r") then outPath = newPath break end end end local outFile = io.open(outPath, "w") if not outFile then gg.alert("无法创建输出文件") return end function handleHitEffect(name, offset1, offset2) local baseStr = playerCtrl .. "," .. offset1 .. "," .. offset2 local resList = judgeBit == 0x20 and { name .. ":" .. baseStr .. ",0xC", "打击特效2:" .. baseStr .. ",0x48", "打击特效3:" .. baseStr .. ",0x84", "打击特效4:" .. baseStr .. ",0xD0" } or judgeBit == 0x30 and { name .. ":" .. baseStr .. ",0x10", "打击特效2:" .. baseStr .. ",0x50", "打击特效3:" .. baseStr .. ",0x90", "打击特效4:" .. baseStr .. ",0xD0" } or {} for _, line in ipairs(resList) do table.insert(results, line) outFile:write(line .. "\n") end end function handleXYZCoordinate(name, offset1, offset2) local Root = selfAddr .. "," .. offset1 .. "," local x1 = "0x210" local y1 = "0x214" local z1 = "0x218" local nv = tonumber(offset2,16) if nv then if judgeBit == 0x20 then x1 = string.format("0x%X",nv + 0x20) y1 = string.format("0x%X",nv + 0x24) z1 = string.format("0x%X",nv + 0x28) elseif judgeBit == 0x30 then x1 = string.format("0x%X",nv + 0x24) y1 = string.format("0x%X",nv + 0x28) z1 = string.format("0x%X",nv + 0x2C) end end local lineX = "X轴坐标:" .. Root .. x1 local lineY = "Y轴坐标:" .. Root .. y1 local lineZ = "Z轴坐标:" .. Root .. z1 table.insert(results, lineX) table.insert(results, lineY) table.insert(results, lineZ) outFile:write(lineX.."\n"..lineY.."\n"..lineZ.."\n") end function handleNormalRule(name, field1, offset1, offset2) local offsetNum = tonumber(offset1 and offset1:gsub("^0x","") or "", 16) if field1 == handKeyList then if offsetNum then offset1 = judgeBit == 0x20 and string.format("0x%X",offsetNum - 0x4) or judgeBit == 0x30 and string.format("0x%X",offsetNum - 0x8) or offset1 end for _, wName in ipairs(weaponList) do if name == wName then offset1 = offset1 .. (weaponEntity and "," .. weaponEntity or ",未找到") break end end if name == "准心旋转角度" then offset1 = offset1 .. (crossHairComp and "," .. crossHairComp or ",未找到") elseif name == "手持全枪无后" then local nrStr = "0xFC8" if noRecoil then local nn = tonumber(noRecoil,16) if nn then nrStr = string.format("0x%X",nn - 0x50) end end offset1 = offset1 .. (bulletTrackComp and "," .. bulletTrackComp or ",未找到") .. "," .. nrStr elseif name == "手持枪械大小x" then offset1 = offset1 .. "," .. gunScale1 elseif name == "手持枪械大小y" then offset1 = offset1 .. "," .. gunScale2 elseif name == "手持枪械大小z" then offset1 = offset1 .. "," .. gunScale3 end end if adj[name] and offsetNum then offset1 = string.format("0x%X",offsetNum + adj[name]) end local finalPath if name == "自动开火" or name == "HUD十字线" or name == "FOV垂直角度" or name == "FOV水平角度" or name == "1f落地后摇" or name == "准心RGB颜色" then finalPath = playerCtrl .. "," .. offset1 elseif name == "静态广角" then finalPath = "ULocalPlayer," .. offset1 elseif name == "GWorld" then finalPath = "ULocalPlayer," .. gWorld elseif name == "ULevel" then finalPath = "ULocalPlayer," .. gWorld .. "," .. offset1 elseif name == "全局变速1" or name == "全局变速2" or name == "全局变速3" or name == "0.4减速" then finalPath = "ULocalPlayer," .. gWorld .. "," .. offset1 .. "," .. (worldSet or "未找到") .. "," .. offset2 elseif name == "标点美化" then finalPath = selfAddr .. "," .. offset1 .. "," .. offset2 .. "," .. pickUpOff elseif name == "人物灵魂[运动地址]" then local fs = "0x516" if offset2 then local fn = tonumber(offset2,16) if fn then fs = string.format("0x%X",fn - 0x2) end end finalPath = selfAddr .. "," .. offset1 .. "," .. fs elseif name == "虚体前后" or name == "虚体左右" or name == "虚体上下" or name == "人物旋转" or name == "人物大小x" or name == "人物大小y" or name == "人物大小z" or name == "骨骼变速" then finalPath = boneAddr .. "," .. offset1 elseif name == "挥拳判断" then local fhStr = "0xF90" if fistHit then local fhn = tonumber(fistHit,16) if fhn then fhStr = string.format("0x%X",fhn - 0x18) end end finalPath = selfAddr .. "," .. offset1 .. "," .. fhStr elseif name == "骑马者" then finalPath = playerCtrl..","..(horseRider or "0x1E90") elseif name == "马乘客" then finalPath = playerCtrl..","..(horsePassenger or "0x1E98") elseif name == "马匹重力" or name == "马匹状态" or name == "马匹上下坡" or name == "马匹最大步行速度" or name == "马匹最大蹲下速度" or name == "马匹最大游泳速度" or name == "马匹最大飞行速度" or name == "马匹默认速度" or name == "马匹加速①" or name == "马匹加速②" then finalPath = playerCtrl..","..(vehMoveComp or "0x1F20")..","..offset1 elseif name == "当前载具指针[自身地址]" then finalPath = playerCtrl..","..(currVehicle or "0xEB0") elseif name == "载具最大血量" or name == "载具当前血量" or name == "载具最大油量" or name == "载具当前油量" then finalPath = playerCtrl..","..(vehCommon or "0x1F30")..","..offset1 elseif name == "载具类型" or name == "载具判断[90000.0]" or name == "载具固定视角" or name == "载具前后按键" or name == "载具左右按键" or name == "载具刹车按键" or name == "载具喇叭按键" then finalPath = playerCtrl..","..offset1 elseif name == "载具坐标指针" then finalPath = playerCtrl..","..(vehMove4W or "0x1F40") elseif field2 and field2:find("CharacterMovementComponent") then finalPath = selfAddr .. (offset2 and "," .. offset2 or "") .. "," .. offset1 else finalPath = selfAddr .. "," .. offset1 .. (offset2 and "," .. offset2 or "") end local resultLine = name .. ":" .. finalPath table.insert(results, resultLine) outFile:write(resultLine .. "\n") end for _, rule in ipairs(rules) do local name, field1, filter1, field2, filter2 = rule[1], rule[2], rule[3], rule[4], rule[5] local offset1, offset2 if field2 and field2 ~= "" then offset1, offset2 = searchOffset(content, field1, filter1, field2, filter2) else offset1 = searchOffset(content, field1, filter1) end if offset1 then if name == "打击特效1" then handleHitEffect(name, offset1, offset2) elseif name == "X轴坐标" then handleXYZCoordinate(name, offset1, offset2) else handleNormalRule(name, field1, offset1, offset2) end else local resultLine = name .. ":未找到偏移" table.insert(results, resultLine) outFile:write(resultLine .. "\n") end end outFile:close() gg.alert("搜索完成!文件已保存为: " .. outPath .. "\n\n" .. table.concat(results,"\n"))