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

📄 objmon2.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 3 页
字号:
unit ObjMon2;

interface
uses
  Windows, Classes, Grobal2, ObjBase, ObjMon ,mylist;
type
  TStickMonster = class(TAnimalObject)
    //n54C: Integer;
    bo550: Boolean;
    n554: Integer;
    n558: Integer;
  private

  public
    constructor Create(); override;
    destructor Destroy; override;
    function AttackTarget(): Boolean; virtual;
    procedure sub_FFEA; virtual;
    procedure sub_FFE9; virtual;
    procedure VisbleActors; virtual;                        //FFE8
    function Operate(ProcessMsg: pTProcessMessage): Boolean; override; //FFFC
    procedure Run; override;
  end;
  TBeeQueen = class(TAnimalObject)
    //n54C: Integer;
    BBList: TMyList;
  private
    procedure MakeChildBee;
  public
    constructor Create(); override;
    destructor Destroy; override;
    function Operate(ProcessMsg: pTProcessMessage): Boolean; override; //FFFC
    procedure Run; override;
  end;
  TCentipedeKingMonster = class(TStickMonster)
    m_dwAttickTick: LongWord;                               //0x560
  private
    function sub_4A5B0C: Boolean;
  public
    constructor Create(); override;
    destructor Destroy; override;
    function AttackTarget(): Boolean; override;
    procedure sub_FFE9; override;
    procedure Run; override;
  end;
  TBigHeartMonster = class(TAnimalObject)
  private

  public
    constructor Create(); override;
    destructor Destroy; override;

    function AttackTarget(): Boolean; virtual;
    procedure Run; override;
  end;
  TSpiderHouseMonster = class(TAnimalObject)
    //n54C: Integer;
    BBList: TMyList;
  private
    procedure GenBB;
  public
    constructor Create(); override;
    destructor Destroy; override;
    function Operate(ProcessMsg: pTProcessMessage): Boolean; override; //FFFC
    procedure Run; override;
  end;
  TExplosionSpider = class(TMonster)
    dw558: LongWord;
  private
    procedure sub_4A65C4;

  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
    function AttackTarget(): Boolean; override;             //FFEB
  end;
  TGuardUnit = class(TAnimalObject)
    dw54C: LongWord;                                        //0x54C
    m_nX550: Integer;                                       //0x550
    m_nY554: Integer;                                       //0x554
    m_nDirection: Integer;                                  //0x558
  public
    function IsProperTarget(BaseObject: TBaseObject): Boolean; override; //FFF4
    procedure Struck(hiter: TBaseObject); override;         //FFEC
  end;
  TArcherGuard = class(TGuardUnit)
  private
    procedure sub_4A6B30(TargeTBaseObject: TBaseObject);

  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Run; override;
  end;
  TArcherPolice = class(TArcherGuard)
  private
  public
    constructor Create(); override;
    destructor Destroy; override;
  end;
  TCastleDoor = class(TGuardUnit)
    dw55C: LongWord;                                        //0x55C
    dw560: LongWord;                                        //0x560
    m_boOpened: Boolean;                                    //0x564
    bo565n: Boolean;                                        //0x565
    bo566n: Boolean;                                        //0x566
    bo567n: Boolean;                                        //0x567
  private
    procedure SetMapXYFlag(nFlag: Integer);
  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Die; override;
    procedure Run; override;
    procedure Initialize(); override;
    procedure Close;
    procedure Open;
    procedure RefStatus;
  end;
  TWallStructure = class(TGuardUnit)
    n55C: Integer;
    dw560: LongWord;
    boSetMapFlaged: Boolean;
  private
  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Initialize; override;
    procedure Die; override;
    procedure Run; override;
    procedure RefStatus;
  end;
  TSoccerBall = class(TAnimalObject)
    n548: Integer;
    //n54C: Integer;
    n550: Integer;
  private

  public
    constructor Create(); override;
    destructor Destroy; override;
    procedure Struck(hiter: TBaseObject);override;         //FFEC
    procedure Run; override;
  end;
implementation

uses M2Share, HUtil32, Castle, Guild;


{ TStickMonster }

constructor TStickMonster.Create;                           //004A51C0
begin
  inherited;
  bo550 := False;
  m_nViewRange := 7;
  m_nRunTime := 250;
  m_dwSearchTime := Random(1500) + 2500;
  m_dwSearchTick := GetTickCount();
  m_btRaceServer := 85;
  n554 := 4;
  n558 := 4;
  m_boFixedHideMode := True;
  m_boStickMode := True;
  m_boAnimal := True;
end;

destructor TStickMonster.Destroy;                           //004A5290
begin

  inherited;
end;

function TStickMonster.AttackTarget: Boolean;
var
  btDir                                 : Byte;
begin
  Result := False;
  if m_TargetCret = nil then
    exit;
  if GetAttackDir(m_TargetCret, btDir) then
  begin
    if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then
    begin
      m_dwHitTick := GetTickCount();
      m_dwTargetFocusTick := GetTickCount();
      Attack(m_TargetCret, btDir);
    end;
    Result := True;
    exit;
  end;
  if m_TargetCret.m_PEnvir = m_PEnvir then
  begin
    SetTargetXY(m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY); {0FFF0h}
  end
  else
  begin
    DelTargetCreat();                                       {0FFF1h}
  end;
end;

procedure TStickMonster.sub_FFE9();
begin
  m_boFixedHideMode := False;
  SendRefMsg(RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
end;

procedure TStickMonster.VisbleActors();                     //004A53E4
var
  i                                     : Integer;
resourcestring
  sExceptionMsg                           =
    '[Exception] TStickMonster::VisbleActors Dispose';
begin
  SendRefMsg(RM_DIGDOWN, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
  try
    for i := 0 to m_VisibleActors.Count - 1 do
    begin
      DisPose(pTVisibleBaseObject(m_VisibleActors.Items[i]));
    end;
    m_VisibleActors.Clear;
  except
    MainOutMessage(sExceptionMsg);
  end;
  m_boFixedHideMode := True;
end;

procedure TStickMonster.sub_FFEA();                         //004A53E4
var
  i                                     : Integer;
  BaseObject                            : TBaseObject;
begin
  for i := 0 to m_VisibleActors.Count - 1 do
  begin
    BaseObject :=
      TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[i]).BaseObject);

    if(BaseObject=nil)or(BaseObject.m_boDeath) then
      Continue;
    if IsProperTarget(BaseObject) then
    begin
      if not BaseObject.m_boHideMode or m_boCoolEye then
      begin
        if (abs(m_nCurrX - BaseObject.m_nCurrX) < n554) and (abs(m_nCurrY -
          BaseObject.m_nCurrY) < n554) then
        begin
          sub_FFE9();
          break;
        end;
      end;
    end;
  end;                                                      // for
end;

function TStickMonster.Operate(ProcessMsg: pTProcessMessage): Boolean;
begin
  Result := inherited Operate(ProcessMsg);
end;

procedure TStickMonster.Run;                                //004A5614
var
  bo05                                  : Boolean;
begin
  if not m_boGhost and
    not m_boDeath and
    (m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then
  begin
    if Integer(GetTickCount - m_dwWalkTick) > m_nWalkSpeed then
    begin
      m_dwWalkTick := GetTickCount();
      if m_boFixedHideMode then
      begin
        sub_FFEA();
      end
      else
      begin
        if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then
        begin
          SearchTarget();
        end;
        bo05 := False;
        if m_TargetCret <> nil then
        begin
          if (abs(m_TargetCret.m_nCurrX - m_nCurrX) > n558) or
            (abs(m_TargetCret.m_nCurrY - m_nCurrY) > n558) then
          begin
            bo05 := True;
          end;
        end
        else
          bo05 := True;
        if bo05 then
        begin
          VisbleActors();
        end
        else
        begin
          if AttackTarget then
          begin
            inherited;
            exit;
          end;
        end;
      end;
    end;
  end;
  inherited;
end;



{ TSoccerBall }

constructor TSoccerBall.Create;                             //004A764C
begin
  inherited;
  m_boAnimal := False;
  m_boSuperMan := True;
  n550 := 0;
  m_nTargetX := -1;
end;

destructor TSoccerBall.Destroy;
begin

  inherited;
end;



procedure TSoccerBall.Run;
var
  n08, n0C                              : Integer;
  bo0D                                  : Boolean;
begin
  if n550 > 0 then
  begin
    if m_PEnvir.GetNextPosition(m_nCurrX, m_nCurrY, m_btDirection, 1, n08, n0C)
      then
    begin
      if m_PEnvir.CanWalk(n08, n0C, bo0D) then
      begin
        case m_btDirection of                               //
          0: m_btDirection := 4;
          1: m_btDirection := 7;
          2: m_btDirection := 6;
          3: m_btDirection := 5;
          4: m_btDirection := 0;
          5: m_btDirection := 3;
          6: m_btDirection := 2;
          7: m_btDirection := 1;
        end;                                                // case
        m_PEnvir.GetNextPosition(m_nCurrX, m_nCurrY, m_btDirection, n550,
          m_nTargetX, m_nTargetY)
      end;
    end;
  end
  else
  begin                                                     //004A78A1
    m_nTargetX := -1;
  end;
  if m_nTargetX <> -1 then
  begin
    GotoTargetXY();
    if (m_nTargetX = m_nCurrX) and (m_nTargetY = m_nCurrY) then
      n550 := 0;
  end;

  inherited;

end;

procedure TSoccerBall.Struck(hiter: TBaseObject);
begin
  if hiter = nil then
    exit;
  m_btDirection := hiter.m_btDirection;
  Randomize;
  n550 := Random(4) + (n550 + 4);
  n550 := _MIN(20, n550);
  m_PEnvir.GetNextPosition(m_nCurrX, m_nCurrY, m_btDirection, n550, m_nTargetX,
    m_nTargetY);
end;

{ TBeeQueen }

constructor TBeeQueen.Create;                               //004A5750
begin
  inherited;
  m_nViewRange := 9;
  m_nRunTime := 250;
  m_dwSearchTime := Random(1500) + 2500;
  m_dwSearchTick := GetTickCount();
  m_boStickMode := True;
  BBList := TMyList.create;
end;

destructor TBeeQueen.Destroy;                               //004A57F0
begin
  BBList.Free;
  inherited;
end;

procedure TBeeQueen.MakeChildBee;
begin
  if BBList.Count >= 15 then
    exit;
  SendRefMsg(RM_HIT, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
  SendDelayMsg(self, RM_ZEN_BEE, 0, 0, 0, 0, '', 500);
end;

function TBeeQueen.Operate(ProcessMsg: pTProcessMessage): Boolean;
var
  BB                                    : TBaseObject;
begin
  if ProcessMsg.wIdent = RM_ZEN_BEE then
  begin
    BB := UserEngine.RegenMonsterByName(m_PEnvir.sMapName, m_nCurrX, m_nCurrY,
      g_Config.sBee);
    if BB <> nil then
    begin
      BB.SetTargetCreat(m_TargetCret);
      BBList.Add(BB);
    end;
  end;
  Result := inherited Operate(ProcessMsg);
end;

procedure TBeeQueen.Run;
var
  i                                     : Integer;
  BB                                    : TBaseObject;
begin
  if not m_boGhost and
    not m_boDeath and

⌨️ 快捷键说明

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