📄 objplaymon.pas
字号:
begin
Result := False;
if m_Master <> nil then begin
for I := 0 to m_Master.m_SlaveList.Count - 1 do begin
if TPlayMonster(m_Master.m_SlaveList.Items[I]).m_boSlavePickUpItem then begin
Result := True;
Break;
end;
end;
end;
end;
procedure TPlayMonster.SearchTarget;
var
BaseObject, BaseObject18: 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 BaseObject <> nil then begin
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 nC < n10 then begin
n10 := nC;
BaseObject18 := BaseObject;
end;
end;
end;
end;
end;
if BaseObject18 <> nil then begin
SetTargetCreat(BaseObject18);
end;
end;
procedure TPlayMonster.SetTargetXY(nX, nY: Integer);
begin
m_nTargetX := nX;
m_nTargetY := nY;
end;
procedure TPlayMonster.Wondering;
begin
if (Random(20) = 0) then
if (Random(4) = 1) then TurnTo(Random(8))
else WalkTo(m_btDirection, False);
end;
function TPlayMonster.CheckDoSpellMagic(): Boolean;
begin
Result := True;
if m_btJob > 0 then begin
if m_btJob = 1 then begin
if (wSkill_01 = 0) and (wSkill_02 = 0) and (wSkill_03 = 0) and (wSkill_04 = 0) then begin
Result := False;
Exit;
end;
end;
if m_btJob = 2 then begin
if (wSkill_06 = 0) and (wSkill_07 = 0) and (wSkill_10 = 0) then begin
Result := False;
Exit;
end;
end;
if m_WAbil.MP = 0 then begin
Result := False;
Exit;
end;
if m_btJob = 2 then begin
if (wSkill_06 > 0) or (wSkill_10 > 0) then begin
Result := CheckUserItemType(2);
if Result then Exit;
if GetUserItemList(2) < 0 then Result := False else Result := True;
if Result then Exit;
end;
if wSkill_07 > 0 then begin
Result := CheckUserItemType(1);
if Result then Exit;
if GetUserItemList(1) < 0 then Result := False else Result := True;
//MainoutMessage('Result '+BooleanToStr(Result));
end;
end;
end;
end;
function TPlayMonster.Think(): Boolean;
var
nOldX, nOldY: Integer;
bt06: Byte;
I: 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(m_TargetCret) then m_TargetCret := nil;
end;
if SearchPickUpItemOK() then SearchPickUpItem(500); //捡药
EatMedicine(); {吃药}
if (GetTickCount - m_dwCheckDoSpellMagic) > 1000 then begin //检测是否可以使用魔法
m_dwCheckDoSpellMagic := GetTickCount;
m_boDoSpellMagic := CheckDoSpellMagic();
end;
if StartAutoAvoid and m_boDoSpellMagic then AutoAvoid(); {自动躲避}
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 TPlayMonster.SearchPickUpItemOK(): Boolean;
var
VisibleMapItem: pTVisibleMapItem;
MapItem: PTMapItem;
I: Integer;
begin
Result := False;
if (m_VisibleItems.Count = 0) or (m_nCopyHumanLevel = 0) then Exit;
if m_Master = nil then Exit;
if (m_Master <> nil) and (m_Master.m_boDeath) then Exit;
if m_TargetCret <> nil then begin
if m_TargetCret.m_boDeath then begin
m_TargetCret := nil;
Result := True;
end;
end;
//if (m_Master.m_WAbil.Weight >= m_Master.m_WAbil.MaxWeight) and (m_WAbil.Weight >= m_WAbil.MaxWeight) then Exit;
if m_TargetCret = nil then begin
for I := 0 to m_VisibleItems.Count - 1 do begin
VisibleMapItem := pTVisibleMapItem(m_VisibleItems.Items[I]);
if (VisibleMapItem <> nil) and (VisibleMapItem.nVisibleFlag > 0) then begin
MapItem := VisibleMapItem.MapItem;
if (MapItem <> nil) and (MapItem.DropBaseObject <> m_Master) then begin
if IsAllowPickUpItem(VisibleMapItem.sName) then begin
//if (MapItem.DropBaseObject <> nil) and (TBaseObject(MapItem.DropBaseObject).m_btRaceServer = RC_PLAYOBJECT) then Continue;
if (MapItem.OfBaseObject = nil) or (MapItem.OfBaseObject = m_Master) or (MapItem.OfBaseObject = Self) then begin
Result := True;
Break;
end;
end;
end;
end;
end;
end;
if Result then begin
if (m_ItemList.Count >= g_Config.nCopyHumanBagCount) and (not m_boCanPickUpItem) then begin
Result := False;
end;
if m_boCanPickUpItem and (not TPlayObject(m_Master).IsEnoughBag) and (m_ItemList.Count >= g_Config.nCopyHumanBagCount) then begin
Result := True;
end;
end;
end;
procedure TPlayMonster.GotoTargetXYRange();
var
n10: Integer;
n14: Integer;
nTargetX: Integer;
nTargetY: Integer;
begin
if CheckTargetXYCount(m_nCurrX, m_nCurrY, 10) < 1 then begin
n10 := abs(m_TargetCret.m_nCurrX - m_nCurrX);
n14 := abs(m_TargetCret.m_nCurrY - m_nCurrY);
if n10 > 4 then Dec(n10, 5) else n10 := 0;
if n14 > 4 then Dec(n14, 5) else n14 := 0;
if m_TargetCret.m_nCurrX > m_nCurrX then nTargetX := m_nCurrX + n10;
if m_TargetCret.m_nCurrX < m_nCurrX then nTargetX := m_nCurrX - n10;
if m_TargetCret.m_nCurrY > m_nCurrY then nTargetY := m_nCurrY + n14;
if m_TargetCret.m_nCurrY < m_nCurrY then nTargetY := m_nCurrY - n14;
GotoTargetXY(nTargetX, nTargetY);
end;
end;
function TPlayMonster.AutoAvoid(): Boolean; //自动躲避
function GetAvoidDir(): Integer;
var
n10: Integer;
n14: Integer;
begin
n10 := m_TargetCret.m_nCurrX;
n14 := m_TargetCret.m_nCurrY;
Result := DR_DOWN;
if n10 > m_nCurrX then begin
Result := DR_LEFT;
if n14 > m_nCurrY then Result := DR_DOWNLEFT;
if n14 < m_nCurrY then Result := DR_UPLEFT;
end else begin
if n10 < m_nCurrX then begin
Result := DR_RIGHT;
if n14 > m_nCurrY then Result := DR_DOWNRIGHT;
if n14 < m_nCurrY then Result := DR_UPRIGHT;
end else begin
if n14 > m_nCurrY then Result := DR_UP
else if n14 < m_nCurrY then Result := DR_DOWN;
end;
end;
end;
function SearchNextDir(var nTargetX, nTargetY: Integer): Boolean;
var
I: Integer;
nDir: Integer;
n01: Integer;
n02: Integer;
n03: Integer;
n04: Integer;
n05: Integer;
n06: Integer;
n07: Integer;
n08: Integer;
n10: Integer;
boGotoL2: Boolean;
label L001;
label L002;
label L003;
begin
Result := False;
if not Result then begin
nDir := GetAvoidDir;
boGotoL2 := False;
goto L001;
end;
L002:
if not Result then begin
n10 := 0;
while True do begin
Inc(n10);
nDir := Random(8);
if nDir in [0..7] then Break;
if n10 > 8 then Break;
end;
goto L001;
end;
L001:
n01 := 0;
n02 := 0;
n03 := 0;
n04 := 0;
n05 := 0;
n06 := 0;
n07 := 0;
n08 := 0;
while True do begin
if nDir > DR_UPLEFT then Break;
case nDir of
DR_UP: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
Inc(nTargetY, 10 - n01);
Result := True;
Break;
end else begin
if n01 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Inc(nTargetY);
Inc(n01);
Continue;
end;
end;
DR_UPRIGHT: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
Inc(nTargetX, 10 - n02);
Inc(nTargetY, 10 - n02);
Result := True;
Break;
end else begin
if n02 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Inc(nTargetX);
Inc(nTargetY);
Inc(n02);
Continue;
end;
end; //CheckTargetXYCountOfDirection(m_nCurrX, m_nCurrY, m_btDirection, 1)
DR_RIGHT: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
Inc(nTargetX, 10 - n03);
Result := True;
Break;
end else begin
if n03 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Inc(nTargetX);
Inc(n03);
Continue;
end;
end;
DR_DOWNRIGHT: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
Inc(nTargetX, 10 - n04);
Dec(nTargetY, 10 - n04);
Result := True;
Break;
end else begin
if n04 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Inc(nTargetX);
Dec(nTargetY);
Inc(n04);
Continue;
end;
end;
DR_DOWN: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
Dec(nTargetY, 10 - n05);
Result := True;
Break;
end else begin
if n05 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Dec(nTargetY);
Inc(n05);
Continue;
end;
end;
DR_DOWNLEFT: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
Dec(nTargetX, 10 - n06);
Dec(nTargetY, 10 - n06);
Result := True;
Break;
end else begin
if n06 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Dec(nTargetX);
Dec(nTargetY);
Inc(n06);
Continue;
end;
end;
DR_LEFT: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
Dec(nTargetX, 10 - n07);
Result := True;
Break;
end else begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -