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

📄 objmon.pas

📁 翎风世界..传奇服务端..DELPHI源代码 包括DBServer,LogDataServer,LoginGate,LoginSrv,M2Server等..内容齐全.
💻 PAS
📖 第 1 页 / 共 3 页
字号:


{ TZilKinZombi }

constructor TZilKinZombi.Create;
begin
  inherited;
  m_nViewRange:=6;
  m_dwSearchTime:=Random(1500) + 2500;
  m_dwSearchTick:=GetTickCount();
  nZilKillCount:=0;
  if Random(3) = 0 then begin
    nZilKillCount:=Random(3) + 1;
  end;
end;

destructor TZilKinZombi.Destroy;
begin
  inherited;


end;

procedure TZilKinZombi.Die;
begin
  inherited;
  if nZilKillCount > 0 then begin
    dw558:=GetTickCount();
    dw560:=(Random(20) + 4) * 1000;
  end;
  Dec(nZilKillCount);
end;

procedure TZilKinZombi.Run;//004AABE4
begin
  if m_boDeath and
    (not m_boGhost) and
    (nZilKillCount >= 0) and
    (m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) and
    (m_VisibleActors.Count > 0) and
    ((GetTickCount - dw558) >= dw560) then begin
    m_Abil.MaxHP:=m_Abil.MaxHP shr 1;
    m_dwFightExp:=m_dwFightExp div 2;
    m_Abil.HP:=m_Abil.MaxHP;
    m_WAbil.HP:=m_Abil.MaxHP;
    ReAlive();
    m_dwWalkTick:=GetTickCount + 1000
  end;
  inherited;
end;

{ TWhiteSkeleton }

constructor TWhiteSkeleton.Create;//00004AACCC
begin
  inherited;
  m_boIsFirst:=True;
  m_boFixedHideMode:=True;
  m_nViewRange:=6;
end;

destructor TWhiteSkeleton.Destroy;
begin

  inherited;
end;

procedure TWhiteSkeleton.RecalcAbilitys;//004AAD38
begin
  inherited;
  sub_4AAD54();
end;
procedure TWhiteSkeleton.Run;
begin
  if m_boIsFirst then begin
    m_boIsFirst:=False;
    m_btDirection:=5;
    m_boFixedHideMode:=False;
    SendRefMsg(RM_DIGUP,m_btDirection,m_nCurrX,m_nCurrY,0,'');
  end;
  inherited;
end;

procedure TWhiteSkeleton.sub_4AAD54; //004AAD54
begin
  m_nNextHitTime:=3000 - m_btSlaveMakeLevel * 600;
  m_nWalkSpeed:=1200 - m_btSlaveMakeLevel * 250;
  m_dwWalkTick:=GetTickCount + 2000;
end;

{ TScultureMonster }

constructor TScultureMonster.Create;//004AAE20
begin
  inherited;
  m_dwSearchTime:=Random(1500) + 1500;
  m_nViewRange:=7;
  m_boStoneMode:=True;
  m_nCharStatusEx:=STATE_STONE_MODE;
end;

destructor TScultureMonster.Destroy;
begin

  inherited;
end;
procedure TScultureMonster.MeltStone;
begin
  m_nCharStatusEx:=0;
  m_nCharStatus:=GetCharStatus();
  SendRefMsg(RM_DIGUP,m_btDirection,m_nCurrX,m_nCurrY,0,'');
  m_boStoneMode:=False;
end;
procedure TScultureMonster.MeltStoneAll;
var
  I: Integer;
  List10:TList;
  BaseObject:TBaseObject;
begin
  MeltStone();
  List10:=TList.Create;
  GetMapBaseObjects(m_PEnvir,m_nCurrX,m_nCurrY,7,List10);
  for I := 0 to List10.Count - 1 do begin
    BaseObject:=TBaseObject(List10.Items[I]);
    if BaseObject.m_boStoneMode then begin
      if BaseObject is TScultureMonster then begin
        TScultureMonster(BaseObject).MeltStone
      end;
    end;
  end;    // for
  List10.Free;
end;

procedure TScultureMonster.Run;//004AAF98
var
  I: Integer;
  n10:Integer;
  BaseObject:TBaseObject;
begin
  if (not m_boGhost) and
     (not m_boDeath) and
     (m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) and
     (Integer(GetTickCount - m_dwWalkTick) >= m_nWalkSpeed) then begin
    n10:=0;
    if m_boStoneMode then begin
      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 not BaseObject.m_boHideMode or m_boCoolEye then begin
            if (abs(m_nCurrX - BaseObject.m_nCurrX) <= 2) and (abs(m_nCurrY - BaseObject.m_nCurrY) <= 2) then begin
              MeltStoneAll();
              break;
            end;
          end;
        end;
      end;    // for
    end else begin //004AB0C7
      if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
         (((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then begin
        m_dwSearchEnemyTick:=GetTickCount();
        SearchTarget();
      end;
    end;
  end;
  inherited;
end;

{ TScultureKingMonster }

constructor TScultureKingMonster.Create;//004AB120
begin
  inherited;
  m_dwSearchTime:=Random(1500) + 1500;
  m_nViewRange:=8;
  m_boStoneMode:=True;
  m_nCharStatusEx:=STATE_STONE_MODE;
  m_btDirection:=5;
  m_nDangerLevel:=5;
  m_SlaveObjectList:=TList.Create;
end;

destructor TScultureKingMonster.Destroy;//004AB1C8
begin
  m_SlaveObjectList.Free;
  inherited;
end;
procedure TScultureKingMonster.MeltStone; //004AB208
var
  Event:TEvent;
begin
  m_nCharStatusEx:=0;
  m_nCharStatus:=GetCharStatus();
  SendRefMsg(RM_DIGUP,m_btDirection,m_nCurrX,m_nCurrY,0,'');
  m_boStoneMode:=False;
  Event:=TEvent.Create(m_PEnvir,m_nCurrX,m_nCurrY,6,5 * 60 * 1000,True);
  g_EventManager.AddEvent(Event);
end;
procedure TScultureKingMonster.CallSlave; //004AB29C
var
  I: Integer;
  nCount:Integer;
  nX,nY:Integer;
  //sMonName:array[0..3] of String;
  BaseObject:TBaseObject;
begin
  nCount:=Random(6) + 6;
  GetFrontPosition(nX,nY);
  {
  sMonName[0]:=sZuma1;
  sMonName[1]:=sZuma2;
  sMonName[2]:=sZuma3;
  sMonName[3]:=sZuma4;
  }
  for I := 1 to nCount do begin
    if m_SlaveObjectList.Count >= 30 then break;
    BaseObject:=UserEngine.RegenMonsterByName(m_sMapName,nX,nY,g_Config.sZuma[Random(4)]);
    if BaseObject <> nil then begin
      //BaseObject.m_Master:=Self;
      //BaseObject.m_dwMasterRoyaltyTick:=GetTickCount + 24 * 60 * 60 * 1000;
      m_SlaveObjectList.Add(BaseObject);
    end;
  end;    // for
end;
procedure TScultureKingMonster.Attack(TargeTBaseObject: TBaseObject;nDir: Integer);//004AB3E8
var
  WAbil:pTAbility;
  nPower:Integer;
begin
  WAbil:=@m_WAbil;
  nPower:=GetAttackPower(LoWord(WAbil.DC),SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)));
  HitMagAttackTarget(TargeTBaseObject,0,nPower,True);
end;
procedure TScultureKingMonster.Run;//004AB444
var
  I: Integer;
  BaseObject:TBaseObject;
begin
  if (not m_boGhost) and
     (not m_boDeath) and
     (m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) and
     (Integer(GetTickCount - m_dwWalkTick) >= m_nWalkSpeed) then begin

    if m_boStoneMode then begin
      //MeltStone();//测试用
      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 not BaseObject.m_boHideMode or m_boCoolEye then begin
            if (abs(m_nCurrX - BaseObject.m_nCurrX) <= 2) and (abs(m_nCurrY - BaseObject.m_nCurrY) <= 2) then begin
              MeltStone();
              break;
            end;
          end;
        end;
      end;    // for
    end else begin
      if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
         (((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then begin
        m_dwSearchEnemyTick:=GetTickCount();
        SearchTarget();
        //CallSlave(); //测试用
        if (m_nDangerLevel > m_WAbil.HP / m_WAbil.MaxHP * 5) and (m_nDangerLevel > 0) then begin
          Dec(m_nDangerLevel);
          CallSlave();
        end;
        if m_WAbil.HP = m_WAbil.MaxHP then
          m_nDangerLevel:=5;
      end;
    end;
    for I := m_SlaveObjectList.Count - 1 downto 0 do begin
      BaseObject:=TBaseObject(m_SlaveObjectList.Items[I]);
      if BaseObject.m_boDeath or BaseObject.m_boGhost then
        m_SlaveObjectList.Delete(I);
    end;    // for
  end;
  inherited;
end;
{ TGasMothMonster }

constructor TGasMothMonster.Create;//004AB6B8
begin
  inherited;
  m_nViewRange:=7;
end;

destructor TGasMothMonster.Destroy;
begin

  inherited;
end;

function TGasMothMonster.sub_4A9C78(bt05: Byte): TBaseObject;//004AB708
var
  BaseObject:TBaseObject;
begin
  BaseObject:=inherited sub_4A9C78(bt05);
  if (BaseObject <> nil) and (Random(3) = 0) and (BaseObject.m_boHideMode) then begin
    BaseObject.m_wStatusTimeArr[STATE_TRANSPARENT{8 0x70}]:=1;
  end;
  Result:=BaseObject;
end;
procedure TGasMothMonster.Run;//004AB758
begin
  if (not m_boDeath) and
     (not bo554) and
     (not m_boGhost) and
     (m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) and
     (Integer(GetTickCount - m_dwWalkTick) >= m_nWalkSpeed) then begin

    if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
       (((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then begin
      m_dwSearchEnemyTick:=GetTickCount();
      sub_4C959C();
    end;
  end;
  inherited;
end;
{ TGasDungMonster }

constructor TGasDungMonster.Create;//004AB7F4
begin
  inherited;
  m_nViewRange:=7;
end;

destructor TGasDungMonster.Destroy;
begin

  inherited;
end;





{ TElfMonster }

procedure TElfMonster.AppearNow;//004AB908 神兽
begin
   boIsFirst := FALSE;
   m_boFixedHideMode := FALSE;
   //SendRefMsg (RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
//   Appear;
//   ResetElfMon;
   RecalcAbilitys;
   m_dwWalkTick := m_dwWalkTick + 800; //
end;

constructor TElfMonster.Create;
//004AB844
begin
  inherited;
  m_nViewRange:=6;
  m_boFixedHideMode:=True;
  m_boNoAttackMode:=True;
  boIsFirst:=True;
end;

destructor TElfMonster.Destroy;
begin

  inherited;
end;

procedure TElfMonster.RecalcAbilitys; //004AB8B0
begin
  inherited;
  ResetElfMon();
end;

procedure TElfMonster.ResetElfMon(); //004AB8CC
begin
  m_nWalkSpeed:=500 - m_btSlaveMakeLevel * 50;
  m_dwWalkTick:=GetTickCount + 2000;
end;

procedure TElfMonster.Run; //4AB944
var
  boChangeFace:Boolean;
  ElfMon:TBaseObject;
begin
  if boIsFirst then begin
    boIsFirst:=False;
    m_boFixedHideMode:=False;
    SendRefMsg(RM_DIGUP,m_btDirection,m_nCurrX,m_nCurrY,0,'');
    ResetElfMon();
  end;
  if m_boDeath then begin
    if (GetTickCount - m_dwDeathTick > 2 * 1000) then begin
       MakeGhost();
    end;
  end else begin
    boChangeFace:=False;
    if m_TargetCret <> nil then boChangeFace:=True;
    if (m_Master <> nil) and ((m_Master.m_TargetCret <> nil) or (m_Master.m_LastHiter <> nil)) then
      boChangeFace:=True;
    if boChangeFace then begin
      ElfMon:=MakeClone(g_Config.sDragon1,Self);
      if ElfMon <> nil then begin
        ElfMon.m_boAutoChangeColor:=m_boAutoChangeColor;
        if ElfMon is TElfWarriorMonster then TElfWarriorMonster(ElfMon).AppearNow;
        m_Master:=nil;
        KickException();
      end;
    end;
  end;
  inherited;
end;
{ TElfWarriorMonster }
procedure TElfWarriorMonster.AppearNow; //004ABB60
begin
   boIsFirst := FALSE;
   m_boFixedHideMode := FALSE;
   SendRefMsg (RM_DIGUP, m_btDirection, m_nCurrX, m_nCurrY, 0, '');
   RecalcAbilitys;
   m_dwWalkTick := m_dwWalkTick + 800; //函脚饶 距埃 掉饭捞 乐澜
   dwDigDownTick:=GetTickCount();
end;

constructor TElfWarriorMonster.Create;
begin
  inherited;
  m_nViewRange:=6;
  m_boFixedHideMode:=True;
  boIsFirst:=True;
  m_boUsePoison:=False;
end;

destructor TElfWarriorMonster.Destroy;
begin

  inherited;
end;
//004ABB08
procedure TElfWarriorMonster.RecalcAbilitys; //004ABAEC
begin
  inherited;
  ResetElfMon();
end;

procedure TElfWarriorMonster.ResetElfMon();
begin
  m_nNextHitTime:=1500 - m_btSlaveMakeLevel * 100;
  m_nWalkSpeed:=500 - m_btSlaveMakeLevel * 50;
  m_dwWalkTick:=GetTickCount + 2000;
end;

procedure TElfWarriorMonster.Run; //004ABBD0
var
  boChangeFace:Boolean;
  ElfMon:TBaseObject;
  ElfName:String;
begin
  ElfMon:=nil;
  if boIsFirst then begin
    boIsFirst:=False;
    m_boFixedHideMode:=False;
    SendRefMsg(RM_DIGUP,m_btDirection,m_nCurrX,m_nCurrY,0,'');
    ResetElfMon();
  end;//004ABC27
  if m_boDeath then begin
    if (GetTickCount - m_dwDeathTick > 2 * 1000) then begin
       MakeGhost();
    end;
  end else begin
    boChangeFace:=True;
    if m_TargetCret <> nil then boChangeFace:=False;
    if (m_Master <> nil) and ((m_Master.m_TargetCret <> nil) or (m_Master.m_LastHiter <> nil)) then
      boChangeFace:=False;
    if boChangeFace then begin
      if (GetTickCount - dwDigDownTick) > 6 * 10 * 1000 then begin
      //if (GetTickCount - dwDigDownTick) > 10 * 1000 then begin
        //ElfMon:=MakeClone(sDogz,Self);

        ElfName:=m_sCharName;
        if ElfName[length(ElfName)] = '1' then begin
          ElfName:=Copy(ElfName,1,length(ElfName) -1);
          ElfMon:=MakeClone(ElfName,Self);
        end;
        if ElfMon <> nil then begin
          SendRefMsg(RM_DIGDOWN, m_btDirection,m_nCurrX,m_nCurrY,0,'');
          SendRefMsg(RM_CHANGEFACE,0,Integer(Self),Integer(ElfMon),0,'');
          ElfMon.m_boAutoChangeColor:=m_boAutoChangeColor;
          if ElfMon is TElfMonster then
            TElfMonster(ElfMon).AppearNow;
          m_Master:=nil;
          KickException();
        end;
      end;
    end else begin
      dwDigDownTick:=GetTickCount();
    end;
  end;
  inherited;
end;


{ TElectronicScolpionMon }

constructor TElectronicScolpionMon.Create;
begin
  inherited;
  m_dwSearchTime:=Random(1500) + 1500;
  m_boUseMagic:=False;
end;

destructor TElectronicScolpionMon.Destroy;
begin

  inherited;
end;

procedure TElectronicScolpionMon.LightingAttack(nDir: Integer);
var
  WAbil:pTAbility;
  nPower,nDamage:integer;
  btGetBackHP:Integer;
begin
  m_btDirection:=nDir;
  WAbil:=@m_WAbil;

  nPower:=GetAttackPower(LoWord(WAbil.MC),SmallInt(HiWord(WAbil.MC) - LoWord(WAbil.MC)));
  nDamage:=m_TargetCret.GetMagStruckDamage(Self,nPower);
  if nDamage > 0 then begin
    btGetBackHP:=LoByte(m_WAbil.MP);
    if btGetBackHP <> 0 then Inc(m_WAbil.HP,nDamage div btGetBackHP);
      
    m_TargetCret.StruckDamage(nDamage);
    m_TargetCret.SendDelayMsg(TBaseObject(RM_STRUCK),RM_10101,nDamage,m_TargetCret.m_WAbil.HP,m_TargetCret.m_WAbil.MaxHP,Integer(Self),'',200);
  end;
  SendRefMsg(RM_LIGHTING,1,m_nCurrX,m_nCurrY,Integer(m_TargetCret),'');
end;

procedure TElectronicScolpionMon.Run;
var
  nAttackDir:Integer;
  nX,nY:Integer;
begin
  if (not m_boDeath) and
     (not bo554) and
     (not m_boGhost) and
     (m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) then begin

     //血量低于一半时开始用魔法攻击
    if m_WAbil.HP < m_WAbil.MaxHP div 2 then m_boUseMagic:=True
    else m_boUseMagic:=False;

    if ((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil) then begin
      m_dwSearchEnemyTick:=GetTickCount();
      SearchTarget();
    end;
    if m_TargetCret = nil then exit;

    nX:=abs(m_nCurrX - m_TargetCret.m_nCurrX);
    nY:=abs(m_nCurrY - m_TargetCret.m_nCurrY);

    if (nX <= 2) and (nY <= 2) then begin
      if m_boUseMagic or ((nX = 2) or (nY = 2)) then begin
        if (Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime) then begin
          m_dwHitTick:=GetTickCount();
          nAttackDir:=GetNextDirection(m_nCurrX,m_nCurrY,m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY);
          LightingAttack(nAttackDir);
        end;
      end;
    end;
  end;
  inherited Run;
end;

end.

⌨️ 快捷键说明

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