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

📄 objmon3.pas

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

interface

uses
  Windows,Classes,Grobal2,ObjBase,ObjMon,ObjMon2;

type

  TRonObject=class(TMonster)
  public
    constructor Create();override;
    destructor Destroy; override;
	  procedure AroundAttack;
	  procedure Run; override;
  end;

  TMinorNumaObject=class(TATMonster)
  public
    constructor Create();override;
    destructor Destroy; override;
	  procedure Run; override;
  end;

  TSandMobObject=class(TStickMonster)
  private
	  m_dwAppearStart:LongWord;

  public
	  constructor Create();override;
    destructor Destroy; override;
	  procedure Run; override;
  end;

  TRockManObject=class(TATMonster)
  public
	  constructor Create();override;
    destructor Destroy; override;
	  procedure Run; override;
  end;

  TMagicMonObject = class(TMonster)
  private
    m_boUseMagic:Boolean;

    procedure LightingAttack(nDir:Integer);

  public
    constructor Create();override;
    destructor Destroy; override;
    procedure Run;override;
  end;

  TBoneKingMonster = class(TMonster)
  private
    m_nDangerLevel       :Integer;
    m_SlaveObjectList  :TList;//0x55C
  
    procedure CallSlave;
  public
    constructor Create();override;
    destructor Destroy; override;
    procedure Attack(TargeTBaseObject: TBaseObject; nDir: Integer);override; //0FFED    
    procedure Run;override;
  end;



  TPercentMonster = class(TAnimalObject)
    n54C           :Integer;
    m_dwThinkTick  :LongWord;
    bo554          :Boolean;
    m_boDupMode    :Boolean;
  private
    function Think: Boolean;
    function MakeClone(sMonName:String;OldMon:TBaseObject):TBaseObject;
  public
    constructor Create();override;
    destructor Destroy; override;
    function  Operate(ProcessMsg:pTProcessMessage):Boolean; override;
    function AttackTarget():Boolean; virtual;
    procedure Run; override;
  end;

  TMagicMonster = class(TAnimalObject)
    n54C           :Integer;
    m_dwThinkTick  :LongWord;
    m_dwSpellTick  :LongWord;
    bo554          :Boolean;
    m_boDupMode    :Boolean;
  private
    function Think: Boolean;
    function MakeClone(sMonName:String;OldMon:TBaseObject):TBaseObject;
  public
    constructor Create();override;
    destructor Destroy; override;
    function  Operate(ProcessMsg:pTProcessMessage):Boolean; override;
    function AttackTarget():Boolean; virtual;
    procedure Run; override;
  end;

  TFireballMonster = class(TMagicMonster)
  private
  public
    constructor Create();override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TFireMonster = class(TMonster)
  private
  public
    constructor Create();override;
    destructor Destroy; override;
    procedure Run; override;
  end;

 TFrostTiger = class(TMonster)
  private
  public
    constructor Create();override;
    destructor Destroy; override;
    procedure Run; override;
  end;

 TGreenMonster = class(TMonster)
  private
  public
    constructor Create();override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TRedMonster = class(TMonster)
  private
  public
    constructor Create();override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TKhazard = class(TMonster)
  private
  public
    constructor Create();override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TRunAway = class(TMonster)
  private
  public
    constructor Create();override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TTeleMonster = class(TMonster)
  private
  public
    constructor Create();override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TDefendMonster = class(TMonster)
  private
    m_GuardObjects  :TList;

    procedure CallGuard(mapmap:string; xx,yy:integer);
  public
    callguardrun:boolean;
    constructor Create();override;
    destructor Destroy; override;
    procedure Run; override;
  end;

  TClone = class(TMonster)
  private
    procedure LightingAttack(nDir:Integer);

  public
    constructor Create();override;
    function  Operate(ProcessMsg:pTProcessMessage):boolean; override;
    procedure Struck(hiter: TBaseObject);virtual;
    destructor Destroy; override;
    procedure Run;override;
  end;

implementation

uses
  UsrEngn, M2Share, Event, SysUtils;




constructor TRonObject.Create;
begin
  inherited;
  m_dwSearchTime:=Random(1500) + 1500;
end;

destructor TRonObject.Destroy;
begin
  inherited;
end;

procedure TRonObject.AroundAttack;
var
  xTargetList:TList;
  BaseObject:TBaseObject;
  wHitMode:Word;
  i:Integer;
begin
  wHitMode:=0;
  GetAttackDir(m_TargetCret,m_btDirection);

  xTargetList := TList.Create;
  GetMapBaseObjects(m_PEnvir,m_nCurrX,m_nCurrY,1,xTargetList);

	if (xTargetList.Count>0) then begin
    for i:=xTargetList.Count-1 downto 0 do begin
      BaseObject := TBaseObject(xTargetList.Items[i]);

      if (BaseObject<>nil) then begin
        _Attack(wHitMode,BaseObject); //CM_HIT

        xTargetList.Delete(i);
		  end;
    end;
	end;
  xTargetList.Free;

  SendRefMsg(RM_HIT,m_btDirection,m_nCurrX,m_nCurrY,0,'');
end;

procedure TRonObject.Run;
begin
  if (not m_boDeath) and (not m_boGhost) and (m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) then begin
    if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
       (((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then begin
      m_dwSearchEnemyTick:=GetTickCount();
      SearchTarget();
    end;

    if (m_TargetCret <> nil) and
       (abs(m_nCurrX - m_TargetCret.m_nCurrX) < 6) and
       (abs(m_nCurrY - m_TargetCret.m_nCurrY) < 6) and
       (Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime) then begin

      m_dwHitTick:=GetTickCount();
      AroundAttack;
    end;
	end;

	inherited;
end;

constructor TMinorNumaObject.Create;
begin
  inherited;
end;

destructor TMinorNumaObject.Destroy;
begin
  inherited;
end;

procedure TMinorNumaObject.Run;
begin
  if (not m_boDeath) then begin
    if ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
       (((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then begin
      m_dwSearchEnemyTick:=GetTickCount();
      SearchTarget();
    end;
  end;

	inherited;
end;

constructor TSandMobObject.Create;
begin
  inherited;
  //m_boHideMode := TRUE;
  nComeOutValue := 8;
end;

destructor TSandMobObject.Destroy;
begin
  inherited;
end;

procedure TSandMobObject.Run;
begin
  if (not m_boDeath) and (not m_boGhost) then begin
		if (Integer(GetTickCount - m_dwWalkTick) > m_nWalkSpeed) then begin
			m_dwWalkTick := GetTickCount;

			if (m_boFixedHideMode) then begin
				if (((m_WAbil.HP > (m_WAbil.MaxHP / 20)) and CheckComeOut())) then
					m_dwAppearStart := GetTickCount;
			end else begin
				if ((m_WAbil.HP > 0) and (m_WAbil.HP < (m_WAbil.MaxHP / 20)) and (GetTickCount - m_dwAppearStart > 3000)) then
					ComeDown
				else if (m_TargetCret<>nil) then begin
					if (abs(m_nCurrX - m_TargetCret.m_nCurrX) > 15) and (abs(m_nCurrY - m_TargetCret.m_nCurrY) > 15) then begin
						ComeDown;
						exit;
					end;
				end;

				if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then
				  SearchTarget();
				
				if (not m_boFixedHideMode) then begin
					if (AttackTarget) then
						inherited;
				end;
			end;
		end;
	end;

	inherited;
end;

constructor TRockManObject.Create;
begin
  inherited;
  //m_dwSearchTick := 2500 + Random(1500);
  //m_dwSearchTime := GetTickCount();

  m_boHideMode := TRUE;
end;

destructor TRockManObject.Destroy;
begin
  inherited;
end;

procedure TRockManObject.Run;
begin
  {if (not m_fIsDead) and (not m_fIsGhost) then begin
		if (m_fHideMode) then begin
			if (CheckComeOut(8)) then
				ComeOut;

			m_dwWalkTime := GetTickCount + 1000;
		end else begin
			if ((GetTickCount - m_dwSearchEnemyTime > 8000) or ((GetTickCount - m_dwSearchEnemyTime > 1000) and (m_pTargetObject=nil))) then begin
				m_dwSearchEnemyTime := GetTickCount;
				MonsterNormalAttack;

				if (m_pTargetObject=nil) then
					ComeDown;
			end;
		end;
	end;}

	inherited;
end;


{ TMagicMonObject }

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

destructor TMagicMonObject.Destroy;
begin

  inherited;
end;

procedure TMagicMonObject.LightingAttack(nDir: Integer);
begin

end;

procedure TMagicMonObject.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_Master = nil then exit;

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

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


{ TBoneKingMonster }

constructor TBoneKingMonster.Create;
begin
  inherited;
  m_dwSearchTime:=Random(1500) + 1500;
  m_nViewRange:=8;
  m_btDirection:=5;
  m_nDangerLevel:=5;
  m_SlaveObjectList:=TList.Create;
end;

destructor TBoneKingMonster.Destroy;
begin
  m_SlaveObjectList.Free;
  inherited;
end;

procedure TBoneKingMonster.CallSlave;
const
  sMonName:array[0..2] of String = ('BoneCaptain', 'BoneArcher', 'BoneSpearman');
var
  I: Integer;
  nC:Integer;
  n10,n14:Integer;
  BaseObject:TBaseObject;
begin
  nC:=Random(6) + 6;
  GetFrontPosition(n10,n14);

  for I := 1 to nC do begin
    if m_SlaveObjectList.Count >= 30 then break;
    BaseObject:=UserEngine.RegenMonsterByName(m_sMapName,n10,n14,sMonName[Random(3)]);
    if BaseObject <> nil then begin
      m_SlaveObjectList.Add(BaseObject);
    end;
  end;    // for
end;
procedure TBoneKingMonster.Attack(TargeTBaseObject: TBaseObject;nDir: Integer);
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 TBoneKingMonster.Run;
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 ((GetTickCount - m_dwSearchEnemyTick) > 8000) or
       (((GetTickCount - m_dwSearchEnemyTick) > 1000) and (m_TargetCret = nil)) then begin
      m_dwSearchEnemyTick:=GetTickCount();
      SearchTarget();

      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;

    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;






constructor TPercentMonster.Create;
begin
  inherited;
  m_boDupMode:=False;
  bo554:=False;
  m_dwThinkTick:=GetTickCount();
  m_nViewRange:=5;
  m_nRunTime:=250;
  m_dwSearchTime:=3000 + Random(2000);
  m_dwSearchTick:=GetTickCount();
  m_btRaceServer:=80;
end;

⌨️ 快捷键说明

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