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

📄 objplaymon.pas

📁 飞尔传奇世界的引擎代码可直接编译M2Engine 请使用Delphi编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
              if n07 >= 10 then begin
                nTargetX := m_nCurrX;
                nTargetY := m_nCurrY;
                Inc(nDir);
                Continue;
              end;
              Dec(nTargetX);
              Inc(n07);
              Continue;
            end;
          end;
        DR_UPLEFT: begin
            if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
              Dec(nTargetX, 10 - n08);
              Inc(nTargetY, 10 - n08);
              Result := True;
              Break;
            end else begin
              if n08 >= 10 then begin
                nTargetX := m_nCurrX;
                nTargetY := m_nCurrY;
                Inc(nDir);
                Continue;
              end;
              Dec(nTargetX);
              Inc(nTargetY);
              Inc(n08);
              Continue;
            end;
          end;
      end;
    end;
    if (not boGotoL2) and (not Result) then begin
      boGotoL2 := True;
      goto L002;
    end;
  end;
var
  n10: Integer;
  n14: Integer;
  n20: Integer;
  nOldX: Integer;
  nOldY: Integer;
  n16: Integer;
  nTargetX: Integer;
  nTargetY: Integer;
  nLoopCount: Integer;
begin
  if m_TargetCret <> nil then begin
    n10 := 0;
    if CheckTargetXYCount(m_nCurrX, m_nCurrY, 6) > 0 then begin
      while True do begin
        Inc(n10);
        nTargetX := m_nCurrX;
        nTargetY := m_nCurrY;
        if SearchNextDir(nTargetX, nTargetY) then
          GotoTargetXY(nTargetX, nTargetY);
        if CheckTargetXYCount(m_nCurrX, m_nCurrY, 6) = 0 then Break;
        if n10 >= 1 then Break;
      end;
    end;
    GotoTargetXYRange();
  end;
  {if m_TargetCret <> nil then begin
    nLoopCount := 1;
    if CheckTargetXYCount(m_nCurrX, m_nCurrY, 6) > 0 then begin
      nTargetX := m_nCurrX;
      nTargetY := m_nCurrY + 8;
      if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
        n20 := 0;
        while True do begin
          if n20 > nLoopCount then break;
          GotoTargetXY(nTargetX, nTargetY);
          Inc(nTargetY);
          Inc(n20);
        end;
        Exit;
      end;
      nTargetX := m_nCurrX + 10;
      nTargetY := m_nCurrY + 10;
      if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
        n20 := 0;
        while True do begin
          if n20 > nLoopCount then break;
          GotoTargetXY(nTargetX, nTargetY);
          Inc(nTargetX);
          Inc(nTargetY);
          Inc(n20);
        end;
        Exit;
      end;
      nTargetX := m_nCurrX + 8;
      nTargetY := m_nCurrY;
      if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
        n20 := 0;
        while True do begin
          if n20 > nLoopCount then break;
          GotoTargetXY(nTargetX, nTargetY);
          Inc(nTargetX);
          Inc(n20);
        end;
        Exit;
      end;
      nTargetX := m_nCurrX + 10;
      nTargetY := m_nCurrY + 10;
      if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
        n20 := 0;
        while True do begin
          if n20 > nLoopCount then break;
          GotoTargetXY(nTargetX, nTargetY);
          Inc(nTargetX);
          Inc(nTargetY);
          Inc(n20);
        end;
        Exit;
      end;
      nTargetX := m_nCurrX;
      nTargetY := m_nCurrY - 8;
      if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
        n20 := 0;
        while True do begin
          if n20 > nLoopCount then break;
          GotoTargetXY(nTargetX, nTargetY);
          Dec(nTargetY);
          Inc(n20);
        end;
        Exit;
      end;
      nTargetX := m_nCurrX - 10;
      nTargetY := m_nCurrY - 10;
      if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
        n20 := 0;
        while True do begin
          if n20 > nLoopCount then break;
          GotoTargetXY(nTargetX, nTargetY);
          Dec(nTargetX);
          Dec(nTargetY);
          Inc(n20);
        end;
        Exit;
      end;
      nTargetX := m_nCurrX - 8;
      nTargetY := m_nCurrY;
      if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
        n20 := 0;
        while True do begin
          if n20 > nLoopCount then break;
          GotoTargetXY(nTargetX, nTargetY);
          Dec(nTargetX);
          Inc(n20);
        end;
        Exit;
      end;
      nTargetX := m_nCurrX - 10;
      nTargetY := m_nCurrY + 10;
      if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
        n20 := 0;
        while True do begin
          if n20 > nLoopCount then break;
          GotoTargetXY(nTargetX, nTargetY);
          Dec(nTargetX);
          Inc(nTargetY);
          Inc(n20);
        end;
        Exit;
      end;
      if m_Master <> nil then begin
        nTargetX := m_Master.m_nCurrX;
        nTargetY := m_Master.m_nCurrY;
        GotoTargetXY(nTargetX, nTargetY);
      end else begin
        GetTargetCretXY(nTargetX, nTargetY);
        GotoTargetXY(nTargetX, nTargetY);
      end;
    end;
  end;}
end;

procedure TPlayMonster.SearchPickUpItem(dwSearchTime: LongWord);
  function PickUpItem(VisibleMapItem: pTVisibleMapItem): Boolean;
  var
    UserItem: pTUserItem;
    StdItem: pTStdItem;
    MapItem: PTMapItem;
    nDeleteCode: Integer;
  begin
    Result := False;
    MapItem := m_PEnvir.GetItem(VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY});
    if MapItem = nil then Exit;
    if CompareText(VisibleMapItem.sName, sSTRING_GOLDNAME) = 0 then begin
      if m_PEnvir.DeleteFromMap(VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, OS_ITEMOBJECT, TObject(MapItem)) = 1 then begin
        if (m_Master <> nil) and (not m_Master.m_boDeath) then begin //捡到的钱加给主人
          if TPlayObject(m_Master).IncGold(MapItem.Count) then begin
            SendRefMsg(RM_ITEMHIDE, 0, Integer(MapItem), VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, '');
            if g_boGameLogGold then
              AddGameDataLog('4' + #9 +
                m_sMapName + #9 +
                IntToStr(VisibleMapItem.nX {m_nCurrX}) + #9 +
                IntToStr(VisibleMapItem.nY {m_nCurrY}) + #9 +
                m_sCharName + #9 +
                sSTRING_GOLDNAME + #9 +
                IntToStr(MapItem.Count) + #9 +
                '1' + #9 +
                '0');
            Result := True;
            m_Master.GoldChanged;
            DisPoseAndNil(MapItem);
          end else begin
            m_PEnvir.AddToMap(VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, OS_ITEMOBJECT, TObject(MapItem));
          end;
        end;
      end;
      Exit;
    end else begin //捡物品
      if (m_Master <> nil) and (not m_Master.m_boDeath) then begin //捡到的物品加给主人
        if m_ItemList.Count < g_Config.nCopyHumanBagCount then begin //捡到药品先给自己
          StdItem := UserEngine.GetStdItem(MapItem.UserItem.wIndex);
          if (StdItem <> nil) and IsPickUpItem(StdItem) then begin
            if m_PEnvir.DeleteFromMap(VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, OS_ITEMOBJECT, TObject(MapItem)) = 1 then begin
              New(UserItem);
              UserItem^ := MapItem.UserItem;
              StdItem := UserEngine.GetStdItem(UserItem.wIndex);
              if (StdItem <> nil) and IsAddWeightAvailable(UserEngine.GetStdItemWeight(UserItem.wIndex)) then begin
                SendRefMsg(RM_ITEMHIDE, 0, Integer(MapItem), VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, '');
                m_ItemList.Add(UserItem);
                //m_WAbil.Weight := RecalcBagWeight();
                if not IsCheapStuff(StdItem.StdMode) then
                  if StdItem.NeedIdentify = 1 then
                    AddGameDataLog('4' + #9 +
                      m_sMapName + #9 +
                      IntToStr(VisibleMapItem.nX {m_nCurrX}) + #9 +
                      IntToStr(VisibleMapItem.nY {m_nCurrY}) + #9 +
                      m_sCharName + #9 +
                      //UserEngine.GetStdItemName(pu.wIndex) + #9 +
                      StdItem.Name + #9 +
                      IntToStr(UserItem.MakeIndex) + #9 +
                      '1' + #9 +
                      '0');
                Result := True;
                DisPoseAndNil(MapItem);
              end;
            end else begin
              DisPoseAndNil(UserItem);
              m_PEnvir.AddToMap(VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, OS_ITEMOBJECT, TObject(MapItem));
            end;
            Exit;
          end;
        end;
        if TPlayObject(m_Master).IsEnoughBag and m_boCanPickUpItem then begin
          if m_PEnvir.DeleteFromMap(VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, OS_ITEMOBJECT, TObject(MapItem)) = 1 then begin
            New(UserItem);
            UserItem^ := MapItem.UserItem;
            StdItem := UserEngine.GetStdItem(UserItem.wIndex);
            if (StdItem <> nil) and TPlayObject(m_Master).IsAddWeightAvailable(UserEngine.GetStdItemWeight(UserItem.wIndex)) then begin
              SendRefMsg(RM_ITEMHIDE, 0, Integer(MapItem), VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, '');
              TPlayObject(m_Master).AddItemToBag(UserItem);
              if not IsCheapStuff(StdItem.StdMode) then
                if StdItem.NeedIdentify = 1 then
                  AddGameDataLog('4' + #9 +
                    m_sMapName + #9 +
                    IntToStr(VisibleMapItem.nX {m_nCurrX}) + #9 +
                    IntToStr(VisibleMapItem.nY {m_nCurrY}) + #9 +
                    m_sCharName + ' - ' + m_Master.m_sCharName + #9 +
                    //UserEngine.GetStdItemName(pu.wIndex) + #9 +
                    StdItem.Name + #9 +
                    IntToStr(UserItem.MakeIndex) + #9 +
                    '1' + #9 +
                    '0');
              Result := True;
              DisPoseAndNil(MapItem);
              if not m_Master.m_boDeath then begin
                if TPlayObject(m_Master).m_btRaceServer = RC_PLAYOBJECT then begin
                  TPlayObject(m_Master).SendAddItem(UserItem);
                end;
              end;
            end else begin
              DisPoseAndNil(UserItem);
              m_PEnvir.AddToMap(VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, OS_ITEMOBJECT, TObject(MapItem));
            end;
          end;
        end;
      end;
    end;
  end;

  function IsOfGroup(BaseObject: TBaseObject): Boolean;
  var
    I: Integer;
    GroupMember: TBaseObject;
  begin
   { Result := False;
    if m_Master.m_GroupOwner = nil then Exit;
    for I := 0 to m_Master.m_GroupOwner.m_GroupMembers.Count - 1 do begin
      GroupMember := TBaseObject(m_Master.m_GroupOwner.m_GroupMembers.Objects[I]);
      if GroupMember = BaseObject then begin
        Result := True;
        Break;
      end;
    end; }
  end;
var
  MapItem: PTMapItem;
  VisibleMapItem: pTVisibleMapItem;
  I: Integer;
  nCheckCode: Integer;
  boFound: Boolean;
  sName: string;
resourcestring
  sExceptionMsg2 = '[Exception] TPlayMonster::SearchItemRange 1-%d %s %s %d %d %d';
begin
  {开始拣物品}
  //MainOutMessage('开始捡物品');
  if GetTickCount - m_dwPickUpItemTick > dwSearchTime then begin
    m_dwPickUpItemTick := GetTickCount;
    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) {or IsOfGroup(TBaseObject(MapItem.OfBaseObject))} then begin
              //GotoTargetXY(VisibleMapItem.nX, VisibleMapItem.nY);
              if PickUpItem(VisibleMapItem) then begin
                //MainOutMessage('捡到物品');
                Break;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
end;

function TPlayMonster.IsPickUpItem(StdItem: pTStdItem): Boolean;
begin
  Result := False;
  if StdItem.StdMode = 0 then begin
    if (StdItem.Shape in [0, 1, 2]) then Result := True;
  end else
    if StdItem.StdMode = 31 then begin
    if GetBindItemType(StdItem.Shape) >= 0 then Result := True;
  end else begin
    Result := False;
  end;
end;

function TPlayMonster.EatUseItems(btItemType: Byte): Boolean; {自动吃药}
  function EatItems(StdItem: pTStdItem): Boolean;
  var
    bo06: Boolean;
    nOldStatus: Integer;
  begin
    Result := False;
    if m_PEnvir.m_boNODRUG then begin
      Exit;
    end;
    case StdItem.StdMode of
      0: begin
          case StdItem.Shape of {红药}
            0: begin
                if (StdItem.AC > 0) then begin
                  Inc(m_nIncHealth, StdItem.AC);
                  Result := True;
                end;
                if (StdItem.MAC > 0) then begin {蓝药}
                  Inc(m_nIncSpell, StdItem.MAC);
                  Result := True;
                end;
              end;
            1: begin
                if (StdItem.AC > 0) and (StdItem.MAC > 0) then begin
                  IncHealthSpell(StdItem.AC, StdItem.MAC);

⌨️ 快捷键说明

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