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

📄 objmon2.pas

📁 继续更新AFT源代码 现在解决了无法登陆游戏的问题 用0504的dbserver就可以登陆了 去掉了绿字广告 降低内存占用HOO 去掉了大量的验证问题
💻 PAS
📖 第 1 页 / 共 4 页
字号:
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.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;


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

destructor Tbigheatmovemonster.Destroy;
begin

  inherited;
end;

function Tbigheatmovemonster.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.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 Tbigheatmovemonster.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;

//Tbigheatmonsteraxe

procedure Tbigheatmonsteraxe.FlyAxeAttack(Target:TBaseObject);
var
  WAbil:pTAbility;
  nDamage:Integer;
begin
  if  m_PEnvir.CanFly(m_nCurrX,m_nCurrY,Target.m_nCurrX,Target.m_nCurrY)  then begin //   true
    m_btDirection:=GetNextDirection(m_nCurrX,m_nCurrY,Target.m_nCurrX,Target.m_nCurrY);
    WAbil:=@m_WAbil;
    nDamage:=(Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) +1) + LoWord(WAbil.DC));
    if nDamage > 0 then begin
      nDamage:=Target.GetHitStruckDamage(Self,nDamage);
    end;
    if nDamage > 0 then begin
        Target.StruckDamage(nDamage);
        Target.SendDelayMsg(TBaseObject(RM_STRUCK),RM_10101,nDamage,Target.m_WAbil.HP,Target.m_WAbil.MaxHP,Integer(Self),'',
                                _MAX(abs(m_nCurrX - Target.m_nCurrX),abs(m_nCurrY - Target.m_nCurrY)) * 50 + 600);
    end;
    SendRefMsg(RM_FLYAXE,m_btDirection,m_nCurrX,m_nCurrY,Integer(Target),'');
  end;
    
end;


constructor Tbigheatmonsteraxe.Create;//004A5F94
begin
  inherited;
  m_nViewRange:=16;
  m_boAnimal:=False;
  m_boBOSS:=true;
  //  m_nNextHitTime:=1500;
end;

destructor Tbigheatmonsteraxe.Destroy;
begin

  inherited;
end;

function Tbigheatmonsteraxe.AttackTarget():Boolean; //004A5FEC
var
  I: Integer;
  BaseObject:TBaseObject;
  nPower:Integer;
  WAbil:pTAbility;
begin
  Result:=False;
  if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime*2  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.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},'');
          FlyAxeAttack(BaseObject);
           if Random(15) = 1 then  BaseObject.MakePosion(POISON_STONE,5,1);
        end;
      end;
    end;    // for
    Result:=True;
  end;
//  inherited;

end;

procedure Tbigheatmonsteraxe.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;
////


procedure Tbigearmonsteraxe.FlyAxeAttack(Target:TBaseObject);
var
  WAbil:pTAbility;
  nDamage:Integer;
begin
  if  m_PEnvir.CanFly(m_nCurrX,m_nCurrY,Target.m_nCurrX,Target.m_nCurrY)  then begin //   true
    m_btDirection:=GetNextDirection(m_nCurrX,m_nCurrY,Target.m_nCurrX,Target.m_nCurrY);
    WAbil:=@m_WAbil;
    nDamage:=(Random(SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)) +1) + LoWord(WAbil.DC));
    if nDamage > 0 then begin
      nDamage:=Target.GetHitStruckDamage(Self,nDamage);
    end;
    if nDamage > 0 then begin
        Target.StruckDamage(nDamage);
        Target.SendDelayMsg(TBaseObject(RM_STRUCK),RM_10101,nDamage,Target.m_WAbil.HP,Target.m_WAbil.MaxHP,Integer(Self),'',
                                _MAX(abs(m_nCurrX - Target.m_nCurrX),abs(m_nCurrY - Target.m_nCurrY)) * 50 + 600);
    end;
    SendRefMsg(RM_FLYAXE,m_btDirection,m_nCurrX,m_nCurrY,Integer(Target),'ear');

  end;
    
end;


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

destructor Tbigearmonsteraxe.Destroy;
begin

  inherited;
end;

function Tbigearmonsteraxe.AttackTarget():Boolean; //004A5FEC
var
  I: Integer;
  BaseObject:TBaseObject;
  nPower:Integer;
  WAbil:pTAbility;
begin
  Result:=False;
  if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime*2  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.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},'');
          FlyAxeAttack(BaseObject);
        //   if Random(10) = 0 then  BaseObject.MakePosion(POISON_STONE,5,1);
        end;
      end;
    end;    // for
    Result:=True;
  end;
//  inherited;

end;

procedure Tbigearmonsteraxe.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:=TList.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.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;
      
  inherited;
end;

{ TGuardUnit }
procedure TGuardUnit.Struck(hiter: TBaseObject);
begin
  inherited;
  if m_Castle <> nil then begin
    bo2B0:=True;
    m_dw2B4Tick:=GetTickCount();
  end;

⌨️ 快捷键说明

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