📄 objmon.pas
字号:
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 not m_boNoAttackMode then begin
if m_TargetCret <> nil then begin
if AttackTarget{FFEB} then begin
inherited;
exit;
end;
end else begin
m_nTargetX:=-1;
if m_boMission then begin
m_nTargetX:=m_nMissionX;
m_nTargetY:=m_nMissionY;
end; //004A91D3
end;
end; //004A91D3 if not bo2C0 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 (not m_Master.m_boSlaveRelax) and
((m_PEnvir <> m_Master.m_PEnvir) or
(abs(m_nCurrX-m_Master.m_nCurrX) > 20) or
(abs(m_nCurrY-m_Master.m_nCurrY) > 20)) and (not m_bohorserelax) then begin
SpaceMove(m_Master.m_PEnvir.sMapName, m_nTargetX, m_nTargetY, 1);
end; // 004A937E
if bo_oldrelax<> m_Master.m_boSlaveRelax then begin
bo_oldrelax:=m_Master.m_boSlaveRelax;
if m_Master.m_boSlaveRelax then begin //属下休息
m_nBaoziStatus:=1;
SendRefMsg(RM_TURN,m_btDirection,m_nCurrX,m_nCurrY,0,'');
end else begin
m_nBaoziStatus:=0;
SendRefMsg(RM_TURN,m_btDirection,m_nCurrX,m_nCurrY,0,'');
end;
end;
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_Master <> nil) and m_Master.m_boSlaveRelax) or m_bohorserelax then begin
inherited ;
exit;
end; //004A93A6
///如果会检物品的怪物
{ if m_canpickup then begin
if m_Master<> nil then begin
if m_Master.m_VisibleItems.Count=0 then curpos:=0;
if m_Master.m_VisibleItems.Count >0 then begin
if curpos<= m_Master.m_VisibleItems.Count-1 then begin
VisibleMapItem:=m_Master.m_VisibleItems[curpos];
m_nTargetX:= VisibleMapItem.nX;
m_nTargetY:= VisibleMapItem.nY;
if ( m_nCurrX= VisibleMapItem.nX ) and ( m_nCurrY= VisibleMapItem.nY ) THEN begin
if Tplayobject(m_Master).ClientPickUpItemxy(m_nCurrX,m_nCurrY) then Tplayobject(m_Master).SearchViewRange
else begin //如果检起失败
inc(curpos); //检下一个 如果超过 就不再检了。
// if curpos> m_Master.m_VisibleItems.Count-1 then
end;
end; // m_nCurrX= VisibleMapItem.nX
end; // curpos<= m_Master.m_VisibleItems.Count-1
end;
end;
end;
}
if m_canpickup then begin
if m_Master<> nil then begin
if (abs(m_nCurrX-m_Master.m_nCurrX) > 10) or (abs(m_nCurrY-m_Master.m_nCurrY) > 10) then
begin
curpos:=0;
setpcount:=0;
count:=m_Master.m_mobpicupItems.Count ;
if count>0 then begin
m_Master.m_bocanaddpickupitem:=false;
for i:=0 to Count -1 do begin
VisibleMapItem:=m_Master.m_mobpicupItems.Items[i];
// m_Master.m_mobpicupItems.Delete(0);
Dispose(VisibleMapItem);
end;//004B82E3
m_Master.m_mobpicupItems.Clear;
m_Master.m_bocanaddpickupitem:=true;
end;
// MainOutMessage('清除检物品列表');
end;
if m_Master.m_mobpicupItems.Count >0 then begin
if curpos<= m_Master.m_mobpicupItems.Count-1 then begin
VisibleMapItem:=m_Master.m_mobpicupItems[curpos];
if m_PEnvir.CanWalk (VisibleMapItem.nX,VisibleMapItem.nY,False) then begin //如果这个物品可以走上去
m_nTargetX:= VisibleMapItem.nX;
m_nTargetY:= VisibleMapItem.nY;
// MainOutMessage(format('当前处理目标 %d/%d 为(%d/%d)',[curpos,m_Master.m_mobpicupItems.Count-1,m_nTargetX,m_nTargetY]));
end else begin
if ( m_nCurrX<>VisibleMapItem.nX ) and ( m_nCurrY<>VisibleMapItem.nY ) then begin
inc(curpos); //如果不能走,且不是自己在物品上 就检下一个。
// MainOutMessage(format('如果不能走到有人在上面,检取下一个%d 为(%d/%d)',[curpos,VisibleMapItem.nX,VisibleMapItem.nY]));
end;
setpcount:=0;
end;
if ( m_nCurrX= VisibleMapItem.nX ) and ( m_nCurrY= VisibleMapItem.nY ) THEN begin
if Tplayobject(m_Master).ClientPickUpItemxy(m_nCurrX,m_nCurrY) then begin
if curpos<= m_Master.m_mobpicupItems.Count-1 then begin
VisibleMapItem:=m_Master.m_mobpicupItems.Items[curpos];
m_Master.m_mobpicupItems.Delete(curpos);
Dispose(VisibleMapItem);
end;
setpcount:=0;
end
else begin //如果检起失败
inc(curpos); //检下一个 如果超过 就不再检了。
setpcount:=0;
// if curpos> m_Master.m_VisibleItems.Count-1 then
end;
end // m_nCurrX= VisibleMapItem.nX
else begin //如果走了10步还不能检取就检下一个
inc(setpcount);
if setpcount>10 then begin
if curpos< m_Master.m_mobpicupItems.Count then begin
inc(curpos);
// MainOutMessage(format('如果走了10步不能检取就检下一个%d 为(%d/%d)',[curpos,VisibleMapItem.nX,VisibleMapItem.nY]));
end;
setpcount:=0;
end;
end;
end; // curpos<= m_Master.m_VisibleItems.Count-1
end;
end;
end;
////
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;
///////////aiman
constructor TAIMAN.Create; //004A8B74
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;
curpos:=0;
setpcount:=0;
end;
destructor TAIMAN.Destroy; //004A8C24
begin
inherited;
end;
function TAIMAN.MakeClone(sMonName: String;OldMon:TBaseObject): TBaseObject; //004A8C58
var
ElfMon:TBaseObject;
begin
Result:=nil;
ElfMon:=UserEngine.RegenMonsterByName(m_PEnvir.sMapName,m_nCurrX,m_nCurrY,sMonName);
if ElfMon <> nil then begin
ElfMon.m_Master:=OldMon.m_Master;
ElfMon.m_dwMasterRoyaltyTick:=OldMon.m_dwMasterRoyaltyTick;
ElfMon.m_btSlaveMakeLevel:=OldMon.m_btSlaveMakeLevel;
ElfMon.m_btSlaveExpLevel:=OldMon.m_btSlaveExpLevel;
ElfMon.RecalcAbilitys;
ElfMon.RefNameColor;
if OldMon.m_Master <> nil then
OldMon.m_Master.m_SlaveList.Add(ElfMon);
ElfMon.m_WAbil:=OldMon.m_WAbil;
ElfMon.m_wStatusTimeArr:=OldMon.m_wStatusTimeArr;
ElfMon.m_TargetCret:=OldMon.m_TargetCret;
ElfMon.m_dwTargetFocusTick:=OldMon.m_dwTargetFocusTick;
ElfMon.m_LastHiter:=OldMon.m_LastHiter;
ElfMon.m_LastHiterTick:=OldMon.m_LastHiterTick;
ElfMon.m_btDirection:=OldMon.m_btDirection;
Result:=ElfMon;
end;
end;
function TAIMAN.Operate(ProcessMsg: pTProcessMessage):Boolean;
begin
Result:=inherited Operate(ProcessMsg);
end;
function TAIMAN.Think():Boolean; //004A8E54
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;
function TAIMAN.AttackTarget():Boolean; //004A8F34
var
bt06:Byte;
begin
Result:=False;
if m_TargetCret <> nil then begin
if GetAttackDir(m_TargetCret,bt06) then begin
if Integer(GetTickCount - m_dwHitTick) > m_nNextHitTime then begin
m_dwHitTick:=GetTickCount();
m_dwTargetFocusTick:=GetTickCount();
Attack(m_TargetCret,bt06); //FFED
BreakHolySeizeMode();
end;
Result:=True;
end else begin
if m_TargetCret.m_PEnvir = m_PEnvir then begin
SetTargetXY(m_TargetCret.m_nCurrX,m_TargetCret.m_nCurrY); {0FFF0h}
//004A8FE3
end else begin
DelTargetCreat();{0FFF1h}
//004A9009
end;
end;
end;
end;
procedure TAIMAN.SearchViewRange;
//begin
// inherited;
//end;
var
I :Integer;
nStartX :Integer;
nEndX :Integer;
nStartY :Integer;
nEndY :Integer;
n18 :Integer;
n1C :Integer;
nIdx :Integer;
n24 :Integer;
MapCellInfo :pTMapCellinfo;
OSObject :pTOSObject;
BaseObject :TBaseObject;
MapItem :PTMapItem;
MapEvent :TEvent;
VisibleBaseObject:pTVisibleBaseObject;
nCheckCode :Integer;
ResourceString
sExceptionMsg1 = '[Exception] TBaseObject::SearchViewRange Code:%d';
sExceptionMsg2 = '[Exception] TBaseObject::SearchViewRange 1-%d %s %s %d %d %d';
begin
nCheckCode:=0;
if m_PEnvir = nil then begin
MainOutMessage('SearchViewRange nil PEnvir');
exit;
end;
nCheckCode:=1;
n24:=0;
m_boIsVisibleActive:=False;//先置为FALSE
try
nCheckCode:=4;
for I := 0 to m_VisibleActors.Count - 1 do begin
pTVisibleBaseObject(m_VisibleActors.Items[I]).nVisibleFlag:=0;
end;
nCheckCode:=5;
except
MainOutMessage(format(sExceptionMsg1,[nCheckCode]));
KickException();
end;
nCheckCode:=6;
nStartX :=m_nCurrX - m_nViewRange;
nEndX :=m_nCurrX + m_nViewRange;
nStartY :=m_nCurrY - m_nViewRange;
nEndY :=m_nCurrY + m_nViewRange;
try
nCheckCode:=7;
for n18:= nStartX to nEndX do begin
nCheckCode:=8;
for n1C:= nStartY to nEndY do begin
nCheckCode:=9;
if m_PEnvir.GetMapCellInfo(n18,n1C,MapCellInfo) and (MapCellInfo.ObjList <> nil) then begin
nCheckCode:=10;
n24:=1;
nIdx:=0;
while (True) do begin
nCheckCode:=11;
if MapCellInfo.ObjList.Count <= nIdx then break; //004B9858
OSObject:=MapCellInfo.ObjList.Items[nIdx];
nCheckCode:=12;
////////// 2006,8,3 处理抱错
if OSObject = nil then begin
MapCellInfo.ObjList.Delete(nIdx);
if MapCellInfo.ObjList.Count > 0 then Continue;
MapCellInfo.ObjList.Free;
MapCellInfo.ObjList:=nil;
break;
end;
///////////
if OSObject <> nil then begin
nCheckCode:=13;
if OSObject.btType = OS_MOVINGOBJECT then begin
nCheckCode:=14;
if (GetTickCount - OSObject.dwAddTime) >= 60 * 1000 then begin
Dispose(OSObject);
MapCellInfo.ObjList.Delete(nIdx);
if MapCellInfo.ObjList.Count > 0 then Continue;
MapCellInfo.ObjList.Free;
MapCellInfo.ObjList:=nil;
break;
end; //004B9907
nCheckCode:=15;
BaseObject:=TBaseObject(OSObject.CellObj);
if BaseObject <> nil then begin
nCheckCode:=16;
if not BaseObject.m_boGhost and not BaseObject.m_boFixedHideMode and not BaseObject.m_boObMode then begin
nCheckCode:=17;
if (m_btRaceServer < RC_ANIMAL) or
(m_Master <> nil) or
m_boCrazyMode or
m_boWantRefMsg or
((BaseObject.m_Master <> nil) and (abs(BaseObject.m_nCurrX - m_nCurrX) <= 3) and (abs(BaseObject.m_nCurrY - m_nCurrY) <= 3)) or
(BaseObject.m_btRaceServer = RC_PLAYOBJECT) then begin
nCheckCode:=18;
UpdateVisibleGay(BaseObject);
nCheckCode:=19;
end;
end;
end;
end;
end; // if OSObject.btType = OS_MOVINGOBJECT
///
// if m_btRaceServer=16 then begin //如果是垃圾收集员
if OSObject.btType = OS_ITEMOBJECT then begin
nCheckCode:=21;
if (GetTickCount - OSObject.dwAddTime) > g_Config.dwClearDropOnFloorItemTime{60 * 60 * 1000} then begin
Dispose(pTMapItem(OSObject.CellObj));//Jacky 10/22 防止占用内存不释放现象
Dispose(OSObject);
MapCellInfo.ObjList.Delete(nIdx);
if MapCellInfo.ObjList.Count > 0 then Continue;
MapCellInfo.ObjList.Free;
MapCellInfo.ObjList:=nil;
break;
end; //004B9A8E
MapItem:=pTMapItem(OSObject.CellObj);
nCheckCode:=28;
UpdateVisibleItem(n18,n1C,MapItem);
if (MapItem.OfBaseObject <> nil) or (MapItem.DropBaseObject <> nil) then begin
nCheckCode:=29;
if (GetTickCount - MapItem.dwCanPickUpTick) > g_Config.dwFloorItemCanPickUpTime {2 * 60 * 1000} then begin
nCheckCode:=30;
MapItem.OfBaseObject:=nil;
MapItem.DropBaseObject:=nil;
end else begin //004B9AF6
nCheckCode:=31;
if TBaseObject(MapItem.OfBaseObject) <> nil then begin
nCheckCode:=32;
if TBaseObject(MapItem.OfBaseObject).m_boGhost then MapItem.OfBaseObject:=nil;
end;
nCheckCode:=33;
if TBaseObject(MapItem.DropBaseObject) <> nil then begin
nCheckCode:=34;
if TBaseObject(MapItem.DropBaseObject).m_boGhost then MapItem.DropBaseObject:=nil;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -