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.