⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objplaymon.pas

📁 飞尔传奇世界的引擎代码可直接编译M2Engine 请使用Delphi编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
begin
  Result := False;
  if m_Master <> nil then begin
    for I := 0 to m_Master.m_SlaveList.Count - 1 do begin
      if TPlayMonster(m_Master.m_SlaveList.Items[I]).m_boSlavePickUpItem then begin
        Result := True;
        Break;
      end;
    end;
  end;
end;

procedure TPlayMonster.SearchTarget;
var
  BaseObject, BaseObject18: TBaseObject;
  I, nC, n10: Integer;
begin
  BaseObject18 := nil;
  n10 := 999;
  for I := 0 to m_VisibleActors.Count - 1 do begin
    BaseObject := TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[I]).BaseObject);
    if BaseObject <> nil then begin
      if not BaseObject.m_boDeath then begin
        if IsProperTarget(BaseObject) and
          (not BaseObject.m_boHideMode or m_boCoolEye) then begin
          nC := abs(m_nCurrX - BaseObject.m_nCurrX) + abs(m_nCurrY - BaseObject.m_nCurrY);
          if nC < n10 then begin
            n10 := nC;
            BaseObject18 := BaseObject;
          end;
        end;
      end;
    end;
  end;
  if BaseObject18 <> nil then begin
    SetTargetCreat(BaseObject18);
  end;
end;

procedure TPlayMonster.SetTargetXY(nX, nY: Integer);
begin
  m_nTargetX := nX;
  m_nTargetY := nY;
end;

procedure TPlayMonster.Wondering;
begin
  if (Random(20) = 0) then
    if (Random(4) = 1) then TurnTo(Random(8))
    else WalkTo(m_btDirection, False);
end;

function TPlayMonster.CheckDoSpellMagic(): Boolean;
begin
  Result := True;
  if m_btJob > 0 then begin
    if m_btJob = 1 then begin
      if (wSkill_01 = 0) and (wSkill_02 = 0) and (wSkill_03 = 0) and (wSkill_04 = 0) then begin
        Result := False;
        Exit;
      end;
    end;
    if m_btJob = 2 then begin
      if (wSkill_06 = 0) and (wSkill_07 = 0) and (wSkill_10 = 0) then begin
        Result := False;
        Exit;
      end;
    end;
    if m_WAbil.MP = 0 then begin
      Result := False;
      Exit;
    end;
    if m_btJob = 2 then begin
      if (wSkill_06 > 0) or (wSkill_10 > 0) then begin
        Result := CheckUserItemType(2);
        if Result then Exit;
        if GetUserItemList(2) < 0 then Result := False else Result := True;
        if Result then Exit;
      end;
      if wSkill_07 > 0 then begin
        Result := CheckUserItemType(1);
        if Result then Exit;
        if GetUserItemList(1) < 0 then Result := False else Result := True;
        //MainoutMessage('Result '+BooleanToStr(Result));
      end;
    end;
  end;
end;

function TPlayMonster.Think(): Boolean;
var
  nOldX, nOldY: Integer;
  bt06: Byte;
  I: Integer;
begin
  Result := False;
  if (GetTickCount - m_dwThinkTick) > 3 * 1000 then begin
    m_dwThinkTick := GetTickCount();
    if m_PEnvir.GetXYObjCount(m_nCurrX, m_nCurrY) >= 2 then m_boDupMode := True;
    if not IsProperTarget(m_TargetCret) then m_TargetCret := nil;
  end;

  if SearchPickUpItemOK() then SearchPickUpItem(500); //捡药

  EatMedicine(); {吃药}

  if (GetTickCount - m_dwCheckDoSpellMagic) > 1000 then begin //检测是否可以使用魔法
    m_dwCheckDoSpellMagic := GetTickCount;
    m_boDoSpellMagic := CheckDoSpellMagic();
  end;
  if StartAutoAvoid and m_boDoSpellMagic then AutoAvoid(); {自动躲避}
  if m_boDupMode then begin
    nOldX := m_nCurrX;
    nOldY := m_nCurrY;
    WalkTo(Random(8), False);
    if (nOldX <> m_nCurrX) or (nOldY <> m_nCurrY) then begin
      m_boDupMode := False;
      Result := True;
    end;
  end;
end;

function TPlayMonster.SearchPickUpItemOK(): Boolean;
var
  VisibleMapItem: pTVisibleMapItem;
  MapItem: PTMapItem;
  I: Integer;
begin
  Result := False;
  if (m_VisibleItems.Count = 0) or (m_nCopyHumanLevel = 0) then Exit;
  if m_Master = nil then Exit;
  if (m_Master <> nil) and (m_Master.m_boDeath) then Exit;
  if m_TargetCret <> nil then begin
    if m_TargetCret.m_boDeath then begin
      m_TargetCret := nil;
      Result := True;
    end;
  end;
  //if (m_Master.m_WAbil.Weight >= m_Master.m_WAbil.MaxWeight) and (m_WAbil.Weight >= m_WAbil.MaxWeight) then Exit;
  if m_TargetCret = nil then begin
    for I := 0 to m_VisibleItems.Count - 1 do begin
      VisibleMapItem := pTVisibleMapItem(m_VisibleItems.Items[I]);
      if (VisibleMapItem <> nil) and (VisibleMapItem.nVisibleFlag > 0) then begin
        MapItem := VisibleMapItem.MapItem;
        if (MapItem <> nil) and (MapItem.DropBaseObject <> m_Master) then begin
          if IsAllowPickUpItem(VisibleMapItem.sName) then begin
            //if (MapItem.DropBaseObject <> nil) and (TBaseObject(MapItem.DropBaseObject).m_btRaceServer = RC_PLAYOBJECT) then Continue;
            if (MapItem.OfBaseObject = nil) or (MapItem.OfBaseObject = m_Master) or (MapItem.OfBaseObject = Self) then begin
              Result := True;
              Break;
            end;
          end;
        end;
      end;
    end;
  end;
  if Result then begin
    if (m_ItemList.Count >= g_Config.nCopyHumanBagCount) and (not m_boCanPickUpItem) then begin
      Result := False;
    end;
    if m_boCanPickUpItem and (not TPlayObject(m_Master).IsEnoughBag) and (m_ItemList.Count >= g_Config.nCopyHumanBagCount) then begin
      Result := True;
    end;
  end;
end;

procedure TPlayMonster.GotoTargetXYRange();
var
  n10: Integer;
  n14: Integer;
  nTargetX: Integer;
  nTargetY: Integer;
begin
  if CheckTargetXYCount(m_nCurrX, m_nCurrY, 10) < 1 then begin
    n10 := abs(m_TargetCret.m_nCurrX - m_nCurrX);
    n14 := abs(m_TargetCret.m_nCurrY - m_nCurrY);
    if n10 > 4 then Dec(n10, 5) else n10 := 0;
    if n14 > 4 then Dec(n14, 5) else n14 := 0;
    if m_TargetCret.m_nCurrX > m_nCurrX then nTargetX := m_nCurrX + n10;
    if m_TargetCret.m_nCurrX < m_nCurrX then nTargetX := m_nCurrX - n10;
    if m_TargetCret.m_nCurrY > m_nCurrY then nTargetY := m_nCurrY + n14;
    if m_TargetCret.m_nCurrY < m_nCurrY then nTargetY := m_nCurrY - n14;
    GotoTargetXY(nTargetX, nTargetY);
  end;
end;

function TPlayMonster.AutoAvoid(): Boolean; //自动躲避
  function GetAvoidDir(): Integer;
  var
    n10: Integer;
    n14: Integer;
  begin
    n10 := m_TargetCret.m_nCurrX;
    n14 := m_TargetCret.m_nCurrY;
    Result := DR_DOWN;
    if n10 > m_nCurrX then begin
      Result := DR_LEFT;
      if n14 > m_nCurrY then Result := DR_DOWNLEFT;
      if n14 < m_nCurrY then Result := DR_UPLEFT;
    end else begin
      if n10 < m_nCurrX then begin
        Result := DR_RIGHT;
        if n14 > m_nCurrY then Result := DR_DOWNRIGHT;
        if n14 < m_nCurrY then Result := DR_UPRIGHT;
      end else begin
        if n14 > m_nCurrY then Result := DR_UP
        else if n14 < m_nCurrY then Result := DR_DOWN;
      end;
    end;
  end;

  function SearchNextDir(var nTargetX, nTargetY: Integer): Boolean;
  var
    I: Integer;
    nDir: Integer;
    n01: Integer;
    n02: Integer;
    n03: Integer;
    n04: Integer;
    n05: Integer;
    n06: Integer;
    n07: Integer;
    n08: Integer;
    n10: Integer;
    boGotoL2: Boolean;
  label L001;
  label L002;
  label L003;
  begin
    Result := False;
    if not Result then begin
      nDir := GetAvoidDir;
      boGotoL2 := False;
      goto L001;
    end;

    L002:
    if not Result then begin
      n10 := 0;
      while True do begin
        Inc(n10);
        nDir := Random(8);
        if nDir in [0..7] then Break;
        if n10 > 8 then Break;
      end;
      goto L001;
    end;

    L001:
    n01 := 0;
    n02 := 0;
    n03 := 0;
    n04 := 0;
    n05 := 0;
    n06 := 0;
    n07 := 0;
    n08 := 0;
    while True do begin
      if nDir > DR_UPLEFT then Break;
      case nDir of
        DR_UP: begin
            if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
              Inc(nTargetY, 10 - n01);
              Result := True;
              Break;
            end else begin
              if n01 >= 10 then begin
                nTargetX := m_nCurrX;
                nTargetY := m_nCurrY;
                Inc(nDir);
                Continue;
              end;
              Inc(nTargetY);
              Inc(n01);
              Continue;
            end;
          end;
        DR_UPRIGHT: begin
            if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
              Inc(nTargetX, 10 - n02);
              Inc(nTargetY, 10 - n02);
              Result := True;
              Break;
            end else begin
              if n02 >= 10 then begin
                nTargetX := m_nCurrX;
                nTargetY := m_nCurrY;
                Inc(nDir);
                Continue;
              end;
              Inc(nTargetX);
              Inc(nTargetY);
              Inc(n02);
              Continue;
            end;
          end; //CheckTargetXYCountOfDirection(m_nCurrX, m_nCurrY, m_btDirection, 1)
        DR_RIGHT: begin
            if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
              Inc(nTargetX, 10 - n03);
              Result := True;
              Break;
            end else begin
              if n03 >= 10 then begin
                nTargetX := m_nCurrX;
                nTargetY := m_nCurrY;
                Inc(nDir);
                Continue;
              end;
              Inc(nTargetX);
              Inc(n03);
              Continue;
            end;
          end;
        DR_DOWNRIGHT: begin
            if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
              Inc(nTargetX, 10 - n04);
              Dec(nTargetY, 10 - n04);
              Result := True;
              Break;
            end else begin
              if n04 >= 10 then begin
                nTargetX := m_nCurrX;
                nTargetY := m_nCurrY;
                Inc(nDir);
                Continue;
              end;
              Inc(nTargetX);
              Dec(nTargetY);
              Inc(n04);
              Continue;
            end;
          end;
        DR_DOWN: begin
            if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
              Dec(nTargetY, 10 - n05);
              Result := True;
              Break;
            end else begin
              if n05 >= 10 then begin
                nTargetX := m_nCurrX;
                nTargetY := m_nCurrY;
                Inc(nDir);
                Continue;
              end;
              Dec(nTargetY);
              Inc(n05);
              Continue;
            end;
          end;
        DR_DOWNLEFT: begin
            if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
              Dec(nTargetX, 10 - n06);
              Dec(nTargetY, 10 - n06);
              Result := True;
              Break;
            end else begin
              if n06 >= 10 then begin
                nTargetX := m_nCurrX;
                nTargetY := m_nCurrY;
                Inc(nDir);
                Continue;
              end;
              Dec(nTargetX);
              Dec(nTargetY);
              Inc(n06);
              Continue;
            end;
          end;
        DR_LEFT: begin
            if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
              Dec(nTargetX, 10 - n07);
              Result := True;
              Break;
            end else begin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -