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

📄 objmon2.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    (m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then
  begin
    if Integer(GetTickCount - m_dwWalkTick) >= m_nWalkSpeed then
    begin
      m_dwWalkTick := GetTickCount();
      if Integer(GetTickCount - m_dwHitTick) >= m_nNextHitTime then
      begin
        m_dwHitTick := GetTickCount();
        SearchTarget();
        if m_TargetCret <> nil then
          MakeChildBee();
      end;
      for i := BBList.Count - 1 downto 0 do
      begin
        BB := TBaseObject(BBList.Items[i]);
        if BB.m_boDeath or (BB.m_boGhost) then
          BBList.Delete(i);
      end;
    end;
  end;
  inherited;
end;

{ TCentipedeKingMonster }



constructor TCentipedeKingMonster.Create;                   //004A5A8C
begin
  inherited;
  m_nViewRange := 6;
  n554 := 4;
  n558 := 6;
  m_boAnimal := False;
  m_dwAttickTick := GetTickCount();
end;

destructor TCentipedeKingMonster.Destroy;
begin

  inherited;
end;

function TCentipedeKingMonster.sub_4A5B0C: Boolean;
var
  i                                     : Integer;
  BaseObject                            : TBaseObject;
begin
  Result := False;
  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 (abs(m_nCurrX - BaseObject.m_nCurrX) <= m_nViewRange) and (abs(m_nCurrY
        - BaseObject.m_nCurrY) <= m_nViewRange) then
      begin
        Result := True;
        break;
      end;
    end;
  end;
end;

function TCentipedeKingMonster.AttackTarget: Boolean;       //004A5BC0
var
  WAbil                                 : pTAbility;
  nPower, i                             : Integer;
  BaseObject                            : TBaseObject;
begin
  Result := False;
  if not sub_4A5B0C then
  begin
    exit;
  end;
  if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then
  begin
    m_dwHitTick := GetTickCount();
    SendAttackMsg(RM_HIT, m_btDirection, m_nCurrX, m_nCurrY);
    WAbil := @m_WAbil;
    nPower := (Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) + 1) +
      LoWord(WAbil.DC));
    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 (abs(m_nCurrX - BaseObject.m_nCurrX) < m_nViewRange) and (abs(m_nCurrY
          - BaseObject.m_nCurrY) < m_nViewRange) then
        begin
          m_dwTargetFocusTick := GetTickCount();
          SendDelayMsg(self, RM_DELAYMAGIC, nPower,
            MakeLong(BaseObject.m_nCurrX, BaseObject.m_nCurrY), 2,
            Integer(BaseObject), '', 600);
          if Random(4) = 0 then
          begin
            if Random(3) <> 0 then
            begin
              BaseObject.MakePosion(POISON_DECHEALTH, 60, 3);
            end
            else
            begin
              BaseObject.MakePosion(POISON_STONE, 5, 0);
            end;
            m_TargetCret := BaseObject;
          end;
        end;
      end;
    end;                                                    // for
  end;
  Result := True;
end;

procedure TCentipedeKingMonster.sub_FFE9;
begin
  inherited;
  m_WAbil.HP := m_WAbil.MaxHP;
end;

procedure TCentipedeKingMonster.Run;
var
  i                                     : Integer;
  BaseObject                            : TBaseObject;
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
        if (GetTickCount - m_dwAttickTick) > 10000 then
        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();
                  m_dwAttickTick := GetTickCount();
                  break;
                end;
              end;
            end;
          end;
        end;                                                //004A5F86
      end
      else
      begin
        if (GetTickCount - m_dwAttickTick) > 3000 then
        begin
          if AttackTarget() then
          begin
            inherited;
            exit;
          end;
          if (GetTickCount - m_dwAttickTick) > 10000 then
          begin
            VisbleActors();
            m_dwAttickTick := GetTickCount();
          end;
        end;
      end;
    end;
  end;
  inherited;
end;


{ TBigHeartMonster }


constructor TBigHeartMonster.Create;                        //004A5F94
begin
  inherited;
  m_nViewRange := 16;
  m_boAnimal := False;
end;

destructor TBigHeartMonster.Destroy;
begin

  inherited;
end;

function TBigHeartMonster.AttackTarget(): Boolean;          //004A5FEC
var
  i                                     : Integer;
  BaseObject                            : TBaseObject;
  nPower                                : Integer;
  WAbil                                 : pTAbility;
begin
  Result := False;
  if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then
  begin
    m_dwHitTick := GetTickCount();
    SendRefMsg(RM_HIT, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
    WAbil := @m_WAbil;
    nPower := (Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) + 1) +
      LoWord(WAbil.DC));
    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 (abs(m_nCurrX - BaseObject.m_nCurrX) <= m_nViewRange) and
          (abs(m_nCurrY - BaseObject.m_nCurrY) <= m_nViewRange) then
        begin
          SendDelayMsg(self, RM_DELAYMAGIC, nPower,
            MakeLong(BaseObject.m_nCurrX, BaseObject.m_nCurrY), 1,
            Integer(BaseObject), '', 200);
          SendRefMsg(RM_10205, 0, BaseObject.m_nCurrX, BaseObject.m_nCurrY, 1
            {type}, '');
        end;
      end;
    end;                                                    // for
    Result := True;
  end;
  //  inherited;

end;

procedure TBigHeartMonster.Run;                             //004A617C
begin
  if not m_boGhost and
    not m_boDeath and
    (m_wStatusTimeArr[POISON_STONE {5 0x6A}] = 0) then
  begin
    if m_VisibleActors.Count > 0 then
      AttackTarget();
  end;
  inherited;
end;

{ TSpiderHouseMonster }

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

destructor TSpiderHouseMonster.Destroy;
//004A6270
begin
  BBList.Free;
  inherited;
end;

procedure TSpiderHouseMonster.GenBB;                        //004A62B0
begin
  if BBList.Count < 15 then
  begin
    SendRefMsg(RM_HIT, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
    SendDelayMsg(self, RM_ZEN_BEE, 0, 0, 0, 0, '', 500);
  end;

end;

function TSpiderHouseMonster.Operate(ProcessMsg: pTProcessMessage): Boolean;
var
  BB                                    : TBaseObject;
  n08, n0C                              : Integer;
begin
  if ProcessMsg.wIdent = RM_ZEN_BEE then
  begin
    n08 := m_nCurrX;
    n0C := m_nCurrY + 1;
    if m_PEnvir.CanWalk(n08, n0C, True) then
    begin
      BB := UserEngine.RegenMonsterByName(m_PEnvir.sMapName, n08, n0C,
        g_Config.sSpider);
      if BB <> nil then
      begin
        BB.SetTargetCreat(m_TargetCret);
        BBList.Add(BB);
      end;
    end;
  end;
  Result := inherited Operate(ProcessMsg);
end;

procedure TSpiderHouseMonster.Run;
var
  i                                     : Integer;
  BB                                    : TBaseObject;
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 Integer(GetTickCount - m_dwHitTick) >= m_nNextHitTime then
      begin
        m_dwHitTick := GetTickCount();
        SearchTarget();
        if m_TargetCret <> nil then
          GenBB();
      end;
      for i := BBList.Count - 1 downto 0 do
      begin
        BB := TBaseObject(BBList.Items[i]);
        if BB.m_boDeath or (BB.m_boGhost) then
          BBList.Delete(i);

      end;                                                  // for
    end;


  end;
  inherited;
end;

{ TExplosionSpider }

constructor TExplosionSpider.Create;
//004A6538
begin
  inherited;
  m_nViewRange := 5;
  m_nRunTime := 250;
  m_dwSearchTime := Random(1500) + 2500;
  m_dwSearchTick := 0;
  dw558 := GetTickCount();
end;

destructor TExplosionSpider.Destroy;
begin

  inherited;
end;

procedure TExplosionSpider.sub_4A65C4;
var
  WAbil                                 : pTAbility;
  i, nPower, n10                        : Integer;
  BaseObject                            : TBaseObject;
begin
  m_WAbil.HP := 0;
  WAbil := @m_WAbil;
  nPower := (Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) + 1) +
    LoWord(WAbil.DC));
  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 (abs(m_nCurrX - BaseObject.m_nCurrX) <= 1) and (abs(m_nCurrY -
        BaseObject.m_nCurrY) <= 1) then
      begin
        n10 := 0;
        Inc(n10, BaseObject.GetHitStruckDamage(self, nPower div 2));
        Inc(n10, BaseObject.GetMagStruckDamage(self, nPower div 2));
        if n10 > 0 then
        begin
          BaseObject.StruckDamage(n10);
          BaseObject.SendDelayMsg(TBaseObject(RM_STRUCK), RM_10101, n10,
            BaseObject.m_WAbil.HP, BaseObject.m_WAbil.MaxHP, Integer(self), '',
            700);
        end;
      end;
    end;
  end;                                                      // for
end;

function TExplosionSpider.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();
      sub_4A65C4();
    end;
    Result := True;
  end
  else
  begin
    if m_TargetCret.m_PEnvir = m_PEnvir then
    begin
      SetTargetXY(m_TargetCret.m_nCurrX, m_TargetCret.m_nCurrY); {0FFF0h}
      //004A8FE3
    end
    else
    begin
      DelTargetCreat();                                     {0FFF1h}
      //004A9009
    end;
  end;

end;

procedure TExplosionSpider.Run;
begin
  if not m_boDeath and not m_boGhost then
    if (GetTickCount - dw558) > 60 * 1000 then
    begin
      dw558 := GetTickCount();
      sub_4A65C4();
    end;

⌨️ 快捷键说明

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