www.pudn.com > M2Server.rar > ObjectEvent.pas


//////////////////////////////////////////////////////////////////////////////// 
//                                                                            // 
//                       工程:  M2Server                                     // 
//                       版本:   1.0                                          // 
//                       公司:  乐都在线                                     // 
//                       网址:  http://www.hh8.net                           // 
//                       日期:  2005-05-28                                   // 
//                                                                            // 
//////////////////////////////////////////////////////////////////////////////// 
 
unit ObjectEvent; 
 
interface 
 
uses 
  Windows, Classes, SysUtils, ClassDeclaration; 
 
type 
  TEvent = class 
 
  public 
    m_fVisible: Boolean; 
    m_fActive: Boolean; 
 
    m_nCheck: Integer; 
    m_pMap: TObject; 
    m_nX: Integer; 
    m_nY: Integer; 
    m_nEventType: Integer; 
    m_nEventParam: Integer; 
 
    m_dwOpenStartTime: LongWord; 
    m_dwContinueTime: LongWord; 
    m_dwCloseTime: LongWord; 
 
    m_fClosed: Boolean; 
 
    m_nDamage: Integer; 
 
    m_pOwnObject: TObject; 
 
    m_dwRunStart: LongWord; 
    m_dwRunTick: LongWord; 
 
    procedure CreateEvent(var pMap: TObject; nX, nY: Integer; dwETime: LongWord; 
      nType: Integer; fVisible: Boolean); overload; 
    procedure Close; 
 
    procedure Run; virtual; 
  end; 
 
type 
  TFireBurnEvent = class(TEvent) 
 
  protected 
    m_dwTickTime: LongWord; 
 
  public 
    constructor Create(nX, nY: Integer; dwETime: LongWord; var pCharObject: 
      TObject; nDamage: Integer); 
 
    procedure CreateEvent(nX, nY: Integer; dwETime: LongWord; var pCharObject: 
      TObject; nDamage: Integer); overload; 
    procedure Run; override; 
  end; 
 
type 
  THolyCurtainEvent = class(TEvent) 
 
  public 
    constructor Create(nX, nY: Integer; dwETime: LongWord; pCharObject: 
      TObject); 
 
  end; 
 
implementation 
 
uses DataHandler, ObjectEngine, PredefinedData; 
 
//  class function and procedure and property defination 
 
{创建事件} 
procedure TEvent.CreateEvent(var pMap: TObject; nX, nY: Integer; dwETime: 
  LongWord; nType: Integer; fVisible: Boolean); 
begin 
  m_dwOpenStartTime := GetTickCount; 
  m_nEventType := nType; 
  m_nEventParam := 0; 
  m_dwContinueTime := dwETime; 
  m_fVisible := fVisible; 
  m_fClosed := False; 
  m_pMap := pMap; 
  m_nX := nX; 
  m_nY := nY; 
  m_fActive := True; 
  m_nDamage := 0; 
  m_pOwnObject := nil; 
 
  m_dwRunStart := GetTickCount; 
  m_dwRunTick := 500; 
 
  if (m_pMap <> nil) and (m_fVisible) then 
  begin 
    TMirMap(m_pMap).AddNewObject(m_nX, m_nY, OS_EVENTOBJECT, self); 
  end 
  else 
  begin 
    m_fVisible := False; 
  end; 
end; 
 
{安装事件} 
procedure TEvent.Close; 
begin 
  m_dwCloseTime := GetTickCount; 
 
  if m_fVisible then 
  begin 
    m_fVisible := False; 
 
    if m_pMap <> nil then 
    begin 
      TMirMap(m_pMap).RemoveObject(m_nX, m_nY, OS_EVENTOBJECT, self); 
    end; 
 
    m_pMap := nil; 
  end; 
end; 
 
{事件运行} 
procedure TEvent.Run; 
begin 
  if GetTickCount - m_dwOpenStartTime > m_dwContinueTime then 
  begin 
    m_fClosed := True; 
    Close; 
  end; 
end; 
 
constructor TFireBurnEvent.Create(nX, nY: Integer; dwETime: LongWord; var 
  pCharObject: TObject; nDamage: Integer); 
begin 
  CreateEvent(nX, nY, dwETime, pCharObject, nDamage); 
end; 
 
procedure TFireBurnEvent.CreateEvent(nX, nY: Integer; dwETime: LongWord; var 
  pCharObject: TObject; nDamage: Integer); 
begin 
  CreateEvent(TCharObject(pCharObject).m_pMap, nX, nY, dwETime, ET_FIRE, True); 
 
  m_pOwnObject := pCharObject; 
  m_nDamage := nDamage; 
end; 
 
procedure TFireBurnEvent.Run; 
var 
  ObjectList: TThreadList; 
  pTargetObject: TCharObject; 
  iCount: Integer; 
  szMsg: string; 
begin 
  if GetTickCount - m_dwTickTime > 3000 then 
  begin 
    m_dwTickTime := GetTickCount; 
 
    ObjectList := TThreadList.Create; 
    TMirMap(m_pMap).GetAllObject(m_nX, m_nY, ObjectList); 
 
    with ObjectList.LockList do 
    begin 
      for iCount := 0 to COunt - 1 do // Iterate 
      begin 
        pTargetObject := TCharObject(items[iCount]); 
        if pTargetObject <> nil then 
        begin 
          if TCharObject(m_pOwnObject).IsProperTarget(pTargetObject) then 
          begin 
            pTargetObject.AddProcess(TCharObject(m_pOwnObject), 
              RM_MAGSTRUCK_MINE, 0, m_nDamage, 0, 0, ''); 
            szMsg := Format('%s Unkonwn Word - PW:%d HP:%d', 
              [pTargetObject.m_szName, m_nDamage, pTargetObject.m_WAbility.HP]); 
            TCharObject(m_pOwnObject).SysMsg(szMsg, 0); 
          end; 
        end; 
      end; // for 
    end; // with 
    ObjectList.Free; 
  end; 
  inherited Run; 
end; 
 
constructor THolyCurtainEvent.Create(nX, nY: Integer; dwETime: LongWord; 
  pCharObject: TObject); 
begin 
  CreateEvent(TCharObject(pCharObject).m_pMap, nX, nY, dwETime, ET_HOLYCURTAIN, 
    True); 
end; 
 
end.