实例介绍
【实例简介】
【实例截图】
【核心代码】unit ObjAxeMon;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs,
ScktComp, syncobjs, MudUtil, HUtil32, Grobal2, Envir, EdCode, ObjBase,
M2Share, ObjMon;
type
TDualAxeMonster = class(TMonster)
private
protected
RunDone: Boolean;
ChainShot: integer;
ChainShotCount: integer;
procedure FlyAxeAttack (targ: TCreature);
function AttackTarget: Boolean; override;
public
constructor Create;
destructor Destroy; override;
procedure Run; override;
end;
TThornDarkMonster = class (TDualAxeMonster)
public
constructor Create;
end;
TArcherMonster = class (TDualAxeMonster)
public
constructor Create;
end;
implementation
constructor TDualAxeMonster.Create;
begin
inherited Create;
RunDone := FALSE;
ViewRange := 5;
RunNextTick := 250;
SearchRate := 3000;
ChainShot := 0;
ChainShotCount := 2;
SearchTime := GetTickCount;
RaceServer := RC_DUALAXESKELETON;
end;
destructor TDualAxeMonster.Destroy;
begin
inherited Destroy;
end;
procedure TDualAxeMonster.FlyAxeAttack (targ: TCreature); //반드시 target <> nil
var
dam, armor: integer;
begin
if PEnvir.CanFly (CX, CY, targ.CX, targ.CY) then begin //도끼가 날아갈수 있는지.
Dir := GetNextDirection (CX, CY, targ.CX, targ.CY);
with WAbil do
dam := Lobyte(DC) Random(ShortInt(Hibyte(DC)-Lobyte(DC)) 1);
if dam > 0 then begin
//armor := (Lobyte(targ.WAbil.AC) Random(ShortInt(Hibyte(targ.WAbil.AC)-Lobyte(targ.WAbil.AC)) 1));
//dam := dam - armor;
//if dam <= 0 then
// if dam > -10 then dam := 1;
dam := targ.GetHitStruckDamage (self, dam);
end;
if dam > 0 then begin
targ.StruckDamage (dam, self);
targ.SendDelayMsg (TCreature(RM_STRUCK), RM_REFMESSAGE, dam{wparam},
targ.WAbil.HP{lparam1}, targ.WAbil.MaxHP{lparam2}, Longint(self){hiter}, '', 600 _MAX(Abs(CX-targ.CX),Abs(CY-targ.CY)) * 50);
end;
SendRefMsg (RM_FLYAXE, Dir, CX, CY, Integer(targ), '');
end;
end;
function TDualAxeMonster.AttackTarget: Boolean;
var
targdir: byte;
begin
Result := FALSE;
if TargetCret <> nil then begin
if GetCurrentTime - HitTime > NextHitTime then begin
HitTime := GetCurrentTime;
if (abs(CX-TargetCret.CX) <= 7) and (abs(CY-TargetCret.CY) <= 7) then begin
if ChainShot < ChainShotCount-1 then begin
Inc (ChainShot);
TargetFocusTime := GetTickCount;
FlyAxeAttack (TargetCret);
end else begin
if Random(5) = 0 then
ChainShot := 0;
end;
Result := TRUE;
end else begin
if TargetCret.MapName = self.MapName then begin
if (abs(CX-TargetCret.CX) <= 11) and (abs(CY-TargetCret.CY) <= 11) then begin
//약간 떨어진 경우 따라간다.
SetTargetXY (TargetCret.CX, TargetCret.CY)
end;
end else
LoseTarget; //<!!주의> TargetCret := nil로 바뀜
end;
end;
end;
end;
procedure TDualAxeMonster.Run;
var
i, dis, d: integer;
cret, nearcret: TCreature;
begin
dis := 9999;
nearcret := nil;
if not Death and not RunDone and not BoGhost and (StatusArr[POISON_STONE] = 0) then begin
if GetTickCount - SearchEnemyTime > 5000 then begin
SearchEnemyTime := GetTickCount;
//상속받은 run 에서 HitTime 재설정함.
for i:=0 to VisibleActors.Count-1 do begin
cret := TCreature (PTVisibleActor(VisibleActors[i]).cret);
if (not cret.Death) and (IsProperTarget(cret)) and (not cret.BoHumHideMode or BoViewFixedHide) then begin
d := abs(CX-cret.CX) abs(CY-cret.CY);
if d < dis then begin
dis := d;
nearcret := cret;
end;
end;
end;
if nearcret <> nil then
SelectTarget (nearcret);
end;
if GetCurrentTime - WalkTime > NextWalkTime then begin
//상속받은 run에서 WalkTime 재설정함
if TargetCret <> nil then
if (abs(CX-TargetCret.CX) <= 4) and (abs(CY-TargetCret.CY) <= 4) then begin
if (abs(CX-TargetCret.CX) <= 2) and (abs(CY-TargetCret.CY) <= 2) then begin
//너무 가까우면, 잘 도망 안감.
if Random(5) = 0 then begin
//도망감.
GetBackPosition (self, TargetX, TargetY);
end;
end else begin
//도망감.
GetBackPosition (self, TargetX, TargetY);
end;
end;
end;
end;
inherited Run;
end;
{----------------------------------------------------}
// TThornDarkMonster
constructor TThornDarkMonster.Create;
begin
inherited Create;
ChainShotCount := 3;
RaceServer := RC_THORNDARK;
end;
{----------------------------------------------------}
// TArcherMonster
constructor TArcherMonster.Create;
begin
inherited Create;
ChainShotCount := 6;
RaceServer := RC_ARCHERMON;
end;
end.
【实例截图】
【核心代码】unit ObjAxeMon;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs,
ScktComp, syncobjs, MudUtil, HUtil32, Grobal2, Envir, EdCode, ObjBase,
M2Share, ObjMon;
type
TDualAxeMonster = class(TMonster)
private
protected
RunDone: Boolean;
ChainShot: integer;
ChainShotCount: integer;
procedure FlyAxeAttack (targ: TCreature);
function AttackTarget: Boolean; override;
public
constructor Create;
destructor Destroy; override;
procedure Run; override;
end;
TThornDarkMonster = class (TDualAxeMonster)
public
constructor Create;
end;
TArcherMonster = class (TDualAxeMonster)
public
constructor Create;
end;
implementation
constructor TDualAxeMonster.Create;
begin
inherited Create;
RunDone := FALSE;
ViewRange := 5;
RunNextTick := 250;
SearchRate := 3000;
ChainShot := 0;
ChainShotCount := 2;
SearchTime := GetTickCount;
RaceServer := RC_DUALAXESKELETON;
end;
destructor TDualAxeMonster.Destroy;
begin
inherited Destroy;
end;
procedure TDualAxeMonster.FlyAxeAttack (targ: TCreature); //반드시 target <> nil
var
dam, armor: integer;
begin
if PEnvir.CanFly (CX, CY, targ.CX, targ.CY) then begin //도끼가 날아갈수 있는지.
Dir := GetNextDirection (CX, CY, targ.CX, targ.CY);
with WAbil do
dam := Lobyte(DC) Random(ShortInt(Hibyte(DC)-Lobyte(DC)) 1);
if dam > 0 then begin
//armor := (Lobyte(targ.WAbil.AC) Random(ShortInt(Hibyte(targ.WAbil.AC)-Lobyte(targ.WAbil.AC)) 1));
//dam := dam - armor;
//if dam <= 0 then
// if dam > -10 then dam := 1;
dam := targ.GetHitStruckDamage (self, dam);
end;
if dam > 0 then begin
targ.StruckDamage (dam, self);
targ.SendDelayMsg (TCreature(RM_STRUCK), RM_REFMESSAGE, dam{wparam},
targ.WAbil.HP{lparam1}, targ.WAbil.MaxHP{lparam2}, Longint(self){hiter}, '', 600 _MAX(Abs(CX-targ.CX),Abs(CY-targ.CY)) * 50);
end;
SendRefMsg (RM_FLYAXE, Dir, CX, CY, Integer(targ), '');
end;
end;
function TDualAxeMonster.AttackTarget: Boolean;
var
targdir: byte;
begin
Result := FALSE;
if TargetCret <> nil then begin
if GetCurrentTime - HitTime > NextHitTime then begin
HitTime := GetCurrentTime;
if (abs(CX-TargetCret.CX) <= 7) and (abs(CY-TargetCret.CY) <= 7) then begin
if ChainShot < ChainShotCount-1 then begin
Inc (ChainShot);
TargetFocusTime := GetTickCount;
FlyAxeAttack (TargetCret);
end else begin
if Random(5) = 0 then
ChainShot := 0;
end;
Result := TRUE;
end else begin
if TargetCret.MapName = self.MapName then begin
if (abs(CX-TargetCret.CX) <= 11) and (abs(CY-TargetCret.CY) <= 11) then begin
//약간 떨어진 경우 따라간다.
SetTargetXY (TargetCret.CX, TargetCret.CY)
end;
end else
LoseTarget; //<!!주의> TargetCret := nil로 바뀜
end;
end;
end;
end;
procedure TDualAxeMonster.Run;
var
i, dis, d: integer;
cret, nearcret: TCreature;
begin
dis := 9999;
nearcret := nil;
if not Death and not RunDone and not BoGhost and (StatusArr[POISON_STONE] = 0) then begin
if GetTickCount - SearchEnemyTime > 5000 then begin
SearchEnemyTime := GetTickCount;
//상속받은 run 에서 HitTime 재설정함.
for i:=0 to VisibleActors.Count-1 do begin
cret := TCreature (PTVisibleActor(VisibleActors[i]).cret);
if (not cret.Death) and (IsProperTarget(cret)) and (not cret.BoHumHideMode or BoViewFixedHide) then begin
d := abs(CX-cret.CX) abs(CY-cret.CY);
if d < dis then begin
dis := d;
nearcret := cret;
end;
end;
end;
if nearcret <> nil then
SelectTarget (nearcret);
end;
if GetCurrentTime - WalkTime > NextWalkTime then begin
//상속받은 run에서 WalkTime 재설정함
if TargetCret <> nil then
if (abs(CX-TargetCret.CX) <= 4) and (abs(CY-TargetCret.CY) <= 4) then begin
if (abs(CX-TargetCret.CX) <= 2) and (abs(CY-TargetCret.CY) <= 2) then begin
//너무 가까우면, 잘 도망 안감.
if Random(5) = 0 then begin
//도망감.
GetBackPosition (self, TargetX, TargetY);
end;
end else begin
//도망감.
GetBackPosition (self, TargetX, TargetY);
end;
end;
end;
end;
inherited Run;
end;
{----------------------------------------------------}
// TThornDarkMonster
constructor TThornDarkMonster.Create;
begin
inherited Create;
ChainShotCount := 3;
RaceServer := RC_THORNDARK;
end;
{----------------------------------------------------}
// TArcherMonster
constructor TArcherMonster.Create;
begin
inherited Create;
ChainShotCount := 6;
RaceServer := RC_ARCHERMON;
end;
end.
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)