Untitled

 avatar
unknown
plain_text
10 months ago
7.0 kB
6
Indexable
local attackDelay=GetModConfigData("Default_attackdelay")
local moveDelay=GetModConfigData("Default_movedelay") 
--local ping=0
local function IsDefaultScreen()
  local screen = GLOBAL.TheFrontEnd:GetActiveScreen()
  local screenName = screen and screen.name or ""
  return screenName:find("HUD") ~= nil
end
local function GetTarget(targettype)
  local player = GLOBAL.ThePlayer
  local playercontroller = player.components.playercontroller
  local x, y, z = playercontroller.inst.Transform:GetWorldPosition()
  local combat = playercontroller.inst.replica.combat
  local attackRange = combat:GetAttackRangeWithWeapon()
  local entities=GLOBAL.TheSim:FindEntities(x, y, z, attackRange + 10, {targettype})
  GLOBAL.table.sort(entities, function(a, b)
      local qeueu={}
      local A = qeueu[a.GUID]
      local B = qeueu[b.GUID]
      return (A and not B) or ((A or not B) and player:GetDistanceSqToInst(a) < player:GetDistanceSqToInst(b))
    end)
  for _, entity in ipairs(entities) do
    if entity and entity:IsValid() and entity.replica.health ~= nil and not entity.replica.health:IsDead() and GLOBAL.ThePlayer.replica.combat:CanTarget(entity) then
      return entity
    end
  end
  return nil
end
local function Attack(target)
  local playeractionpicker = GLOBAL.ThePlayer.components.playeractionpicker
  local playercontroller = GLOBAL.ThePlayer.components.playercontroller
  if target == nil or not target:IsValid() or target.replica.health == nil or target.replica.health:IsDead() or not GLOBAL.ThePlayer.replica.combat:CanTarget(target) then
    return false
  end
  local tx,ty,tz = target:GetPosition():Get()
  local px,py,pz = GLOBAL.ThePlayer:GetPosition():Get()
  if tx==px and tz==pz then
    tx=tx+0.1 tz=tz+0.1
  end
  local distance = GLOBAL.math.sqrt((px-tx)*(px-tx)+(pz-tz)*(pz-tz))
  local range = GLOBAL.ThePlayer.components.playercontroller.inst.replica.combat:GetAttackRangeWithWeapon()+target:GetPhysicsRadius(0)
  if GLOBAL.ThePlayer.components.playercontroller:CanLocomote() then
    if distance > range-0.2 or target:HasTag("butterfly") and distance > 0.5 then
      local playercontroller = GLOBAL.ThePlayer.components.playercontroller
      local action = GLOBAL.BufferedAction(playercontroller.inst,nil,GLOBAL.ACTIONS.WALKTO,nil,GLOBAL.Vector3(tx,0,tz))
      playercontroller:DoAction(action)
      GLOBAL.Sleep((20) * 0.001)
      return false
    end
  else
    if distance > range or target:HasTag("butterfly") and distance > 1.5 then
      GLOBAL.SendRPCToServer(GLOBAL.RPC.LeftClick, GLOBAL.ACTIONS.WALKTO.code, tx,tz, nil, true, nil, nil, nil)
      GLOBAL.Sleep((20) * 0.001)
      return false
    end
  end
  if GLOBAL.ThePlayer.components.playercontroller:CanLocomote() then
    local act = playeractionpicker:GetLeftClickActions(target:GetPosition(), target)[1]
    if act == nil then
      return false
    end
    act.preview_cb = function()
      GLOBAL.SendRPCToServer(GLOBAL.RPC.PredictWalking, px, pz, true)
      GLOBAL.SendRPCToServer(GLOBAL.RPC.LeftClick,GLOBAL.ACTIONS.ATTACK.code,px,pz,target,true,10,nil,nil)
    end
    playercontroller:DoAction(act)
  else
    GLOBAL.SendRPCToServer(GLOBAL.RPC.PredictWalking, px, pz, true)
    GLOBAL.SendRPCToServer(GLOBAL.RPC.LeftClick,GLOBAL.ACTIONS.ATTACK.code,px,pz,target,true,10,nil,nil)
  end
  GLOBAL.Sleep((attackDelay) * 0.001)
  return true
end
local function Move(target)
  local tx,ty,tz = target:GetPosition():Get()
  local px,py,pz = GLOBAL.ThePlayer:GetPosition():Get()
  if tx==px and tz==pz then
    tx=tx+0.1 tz=tz+0.1
  end
  local distance = GLOBAL.math.sqrt((px-tx)*(px-tx)+(pz-tz)*(pz-tz))
  if distance ==0 then distance =0.1 tx= tx+0.1 end
  if GLOBAL.ThePlayer.components.playercontroller:CanLocomote() then
    local playercontroller = GLOBAL.ThePlayer.components.playercontroller
    local action = GLOBAL.BufferedAction(playercontroller.inst,nil,GLOBAL.ACTIONS.WALKTO,nil,GLOBAL.Vector3(px+(px-tx)/distance,0,pz+(pz-tz)/distance))
    playercontroller:DoAction(action)
  else
    GLOBAL.SendRPCToServer(GLOBAL.RPC.PredictWalking, px+(px-tx)/distance, pz+(pz-tz)/distance, true)
    GLOBAL.SendRPCToServer(GLOBAL.RPC.LeftClick, GLOBAL.ACTIONS.WALKTO.code, px+(px-tx)/distance,pz+(pz-tz)/distance, nil, true, nil, nil, nil)
  end
  GLOBAL.Sleep(0.001*moveDelay)
end
local function Start()
  if IsDefaultScreen() and GLOBAL.ThePlayer ~= nil and GLOBAL.ThePlayer.Cheatthread == nil then
    if GLOBAL.ThePlayer.components.playercontroller.inst.replica.combat:GetWeapon() == nil then
      GLOBAL.ThePlayer.components.playercontroller:DoAttackButton()
      return
    end
    GLOBAL.ThePlayer.Cheatthread = GLOBAL.ThePlayer:StartThread(function()
        --ping = GLOBAL.TheNet:GetAveragePing()
        while true do
          GLOBAL.Sleep(0.01)
          local target = GetTarget("monster")
          if target == nil then
            target = GetTarget("_combat")
          end
          if target == nil then
            target = GLOBAL.ThePlayer.components.playercontroller:GetAttackTarget(true,nil,nil)
          end
          if target ~= nil then
            while Attack(target) do
              Move(target)
            end
          end
        end
      end)
  end
end
local function Stop()
  if IsDefaultScreen() and GLOBAL.ThePlayer ~= nil and GLOBAL.ThePlayer.Cheatthread ~= nil then
    GLOBAL.ThePlayer.Cheatthread:SetList(nil)
    GLOBAL.ThePlayer.Cheatthread = nil
  end
end
local function GetKeyFromConfig(config)
  local key = GetModConfigData(config, true)
  if type(key) == "string" and GLOBAL:rawget(key) then
    key = GLOBAL[key]
  end
  return type(key) == "number" and key or -1
end
if GetKeyFromConfig("Addattackdelay_key") then
  GLOBAL.TheInput:AddKeyUpHandler(GetKeyFromConfig("Addattackdelay_key"), function() 
      if IsDefaultScreen() then
        attackDelay = attackDelay + 2
        GLOBAL.print("attackdelay="..GLOBAL.tostring(attackDelay))
      end
    end)
end
if GetKeyFromConfig("Reduceattackdelay_key") then
  GLOBAL.TheInput:AddKeyUpHandler(GetKeyFromConfig("Reduceattackdelay_key"), function() 
      if IsDefaultScreen() then
        attackDelay = attackDelay - 2 
        GLOBAL.print("attackdelay="..GLOBAL.tostring(attackDelay)) 
      end
    end)
end
if GetKeyFromConfig("Addmovedelay_key") then
  GLOBAL.TheInput:AddKeyUpHandler(GetKeyFromConfig("Addmovedelay_key"), function() 
      if IsDefaultScreen() then
        moveDelay = moveDelay + 2 
        GLOBAL.print("movedelay="..GLOBAL.tostring(moveDelay))
      end
    end)
end 
if GetKeyFromConfig("Reducemovedelay_key") then
  GLOBAL.TheInput:AddKeyUpHandler(GetKeyFromConfig("Reducemovedelay_key"), function() 
      if IsDefaultScreen() then
        moveDelay = moveDelay - 2 
        GLOBAL.print("movedelay="..GLOBAL.tostring(moveDelay)) 
      end
    end)
end
if GetKeyFromConfig("Attack_key") then
  GLOBAL.TheInput:AddKeyUpHandler(GetKeyFromConfig("Attack_key"), Stop)
  GLOBAL.TheInput:AddKeyDownHandler(GetKeyFromConfig("Attack_key"), Start)
end
Editor is loading...
Leave a Comment