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

📄 objmonty.pas

📁 传世源码可编译的,功能齐全.是学习的好模版,会DELPHI的朋友们也可以自己修改,弄个自己的引擎.
💻 PAS
字号:
unit Objmonty;

interface
uses
  Windows,Classes,Grobal2,ObjBase,sysutils,HUtil32 ,ObjMon;
type
   Ttymon = class(TAnimalObject)
    n54C           :Integer;     //0x54C
    m_dwThinkTick  :LongWord;    //0x550
    bo554          :Boolean;     //0x554
    m_boDupMode    :Boolean; //0x555


  private
    function Think: Boolean;
  public
    constructor Create();override;
    destructor Destroy; override;
    function  Operate(ProcessMsg:pTProcessMessage):Boolean; override;//FFFC

    procedure Run; override;
  end;

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

 Ttiaopi = class(TMonster)
   private

   public
    constructor Create();override;
    destructor Destroy; override;
    procedure Run; override;
    procedure Attack(TargeTBaseObject: TBaseObject; nDir: Integer);override;

  end;
implementation
   uses UsrEngn, M2Share, Event;
{ Ttymon }



constructor Ttymon.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:=17;  //公主类型

end;

destructor Ttymon.Destroy;
begin

  inherited;
end;


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

procedure Ttymon.Run;
var
  nX,nY,i,count:Integer;

begin
  if not m_boGhost and
     not m_boDeath and
     not m_boFixedHideMode and
     not m_boStoneMode and
     (m_wStatusTimeArr[POISON_STONE{5 0x6A}] = 0) then begin
    if Think then begin
      inherited;
      exit;
    end;
    if m_boWalkWaitLocked then begin
      if (GetTickCount - m_dwWalkWaitTick) > m_dwWalkWait then begin
        m_boWalkWaitLocked:=False;
      end;
    end;
    if not m_boWalkWaitLocked and (Integer(GetTickCount - m_dwWalkTick) > m_nWalkSpeed) then begin
      m_dwWalkTick:=GetTickCount();
      Inc(m_nWalkCount);
      if m_nWalkCount > m_nWalkStep then begin
        m_nWalkCount:=0;
        m_boWalkWaitLocked:=True;
        m_dwWalkWaitTick:=GetTickCount();
      end; //004A9151
      if not m_boRunAwayMode then begin

        if m_Master <> nil then begin
       //   if m_TargetCret = nil then begin
            m_Master.GetBackPosition(nX,nY);
            if (abs(m_nTargetX - nX) > 1) or (abs(m_nTargetY - nY{nX}) > 1) then begin //004A922D
              m_nTargetX:=nX;
              m_nTargetY:=nY;
              if (abs(m_nCurrX - nX) <= 2) and (abs(m_nCurrY - nY) <= 2) then begin
                if m_PEnvir.GetMovingObject(nX,nY,True) <> nil then begin
                  m_nTargetX:=m_nCurrX;
                  m_nTargetY:=m_nCurrY;
                end //004A92A5
              end;
            end; //004A92A5
        //  end; //004A92A5 if m_TargetCret = nil then begin
          if  m_Master.m_bodeath or (m_Master.m_PEnvir<> m_PEnvir) then begin
              m_WAbil.HP:=0;
          end; // 004A937E
        end;// 004A937E if m_Master <> nil then begin
      end else begin //004A9344
        if (m_dwRunAwayTime > 0) and ((GetTickCount - m_dwRunAwayStart) > m_dwRunAwayTime) then begin
          m_boRunAwayMode:=False;
          m_dwRunAwayTime:=0;
        end;
      end; //004A937E


     if m_nTargetX <> -1 then begin
        GotoTargetXY(); //004A93B5 0FFEF
      end else begin
        if m_TargetCret = nil then Wondering();// FFEE   //Jacky
      end; //004A93D8
    end; //004A93D8  if not bo510 and ((GetTickCount - m_dwWalkTick) > n4FC) then begin
  end; //004A93D8

  inherited;

end;

function Ttymon.Think: Boolean;
var
  nOldX,nOldY:integer;
begin
  Result:=False;
  if (GetTickCount - m_dwThinkTick) > 3 * 1000 then begin
    m_dwThinkTick:=GetTickCount();
    if m_PEnvir.GetXYObjCount(m_nCurrX,m_nCurrY) >= 2 then m_boDupMode:=True;
    if not IsProperTarget{FFFF4}(m_TargetCret) then m_TargetCret:=nil;
  end; //004A8ED2
  if m_boDupMode then begin     //人物重叠了
    nOldX:=m_nCurrX;
    nOldY:=m_nCurrY;
    WalkTo(Random(8),False);
    if (nOldX <> m_nCurrX) or (nOldY <> m_nCurrY) then begin
      m_boDupMode:=False;
      Result:=True;
    end;
  end;
end;




{ Tkilltymon }

constructor Tkilltymon.Create;
begin
  inherited;
  m_btRaceServer:=209;
end;

destructor Tkilltymon.Destroy;
begin

  inherited;
end;

procedure Tkilltymon.Run;
begin
  if not m_boDeath and
     not bo554 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();
      SearchTYTarget();
    end;
  end;
  inherited;
end;

procedure Tkilltymon.SearchTYTarget;
var
  BaseObject,BaseObject18,BaseObjectTy:TBaseObject;
  i,nC,n10:integer;
begin
  BaseObject18:=nil;
  n10:=999;
  for i:=0 to m_VisibleActors.Count -1 do begin
    BaseObject:=TBaseObject(pTVisibleBaseObject(m_VisibleActors.Items[i]).BaseObject);
    if not BaseObject.m_boDeath then begin
      if IsProperTarget(BaseObject) and
         (not BaseObject.m_boHideMode or m_boCoolEye) then begin
        nC:=abs(m_nCurrX - BaseObject.m_nCurrX) + abs(m_nCurrY - BaseObject.m_nCurrY);
        if  BaseObject.m_btRaceServer=17 then  begin
          BaseObject18:= BaseObject;
          break;
        end;
        if nC < n10 then begin
          n10:=nC;
          BaseObject18:=BaseObject;
        end;
      end;
    end;      
  end;
  if BaseObject18 <> nil then SetTargetCreat{FFF2}(BaseObject18);
end;

{ Ttiaopi }

procedure Ttiaopi.Attack(TargeTBaseObject: TBaseObject; nDir: Integer);
 var
 BaseObject:TBaseObject;
 i,nDamage,nPower:integer;
   WAbil:pTAbility;
  Range,
  nStartX,
  nEndX,
  nStartY ,
  nEndY,nx,ny,nHTime:  integer;
  FireBurnEvent:TFireBurnEvent;
  bohaspush:boolean;
begin
   inherited;
   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
         nDamage:=0;
         WAbil:=@m_WAbil;
         nPower:=GetAttackPower(LoWord(WAbil.DC),SmallInt(HiWord(WAbil.DC) - LoWord(WAbil.DC)));

         Inc(nDamage,BaseObject.GetHitStruckDamage(Self,nPower));
         Inc(nDamage,BaseObject.GetMagStruckDamage(Self,nPower));
         if nDamage > 0 then begin

          BaseObject.StruckDamage(nDamage);
          BaseObject.SendDelayMsg(TBaseObject(RM_STRUCK),RM_10101,nDamage,BaseObject.m_WAbil.HP,BaseObject.m_WAbil.MaxHP,Integer(Self),'',200);
          bohaspush:=false;
          if random(6) <4 then
          BaseObject.CharPushed(GetNextDirection(m_nCurrx,m_nCurrY,BaseObject.m_nCurrX,BaseObject.m_nCurrY),random(5)+3);
          bohaspush:=true;


          END;
        end;
      end;
    end;    // for
  if bohaspush then begin
     Range:=4;
     nStartX :=m_nCurrX -  Range;
     nEndX   :=m_nCurrX +  Range;
     nStartY :=m_nCurrY -  Range;
     nEndY   :=m_nCurrY +  Range;

     for nx:= nStartX to nEndX do begin
       for ny:= nStartY to nEndY  do begin
       nHTime:=20; //random(5)+5;
       if m_PEnvir.GetEvent(nx,ny) = nil then begin
        FireBurnEvent:=TFireBurnEvent.Create(self,nx,ny,ET_FIRE,nHTime * 1000 ,nPower div 2);
        g_EventManager.AddEvent(FireBurnEvent);
       end; //0492CFC   x
       end;    //for
     end; //for
   end;    // random(10)<2

end;


constructor Ttiaopi.Create;
begin
  inherited;
  m_btRaceServer:=210;
end;

destructor Ttiaopi.Destroy;
begin

  inherited;
end;

procedure Ttiaopi.Run;
begin
  if not m_boDeath and
     not bo554 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;
  end;

  inherited;
end;




end.

⌨️ 快捷键说明

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