📄 objplaymon.pas
字号:
if n07 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Dec(nTargetX);
Inc(n07);
Continue;
end;
end;
DR_UPLEFT: begin
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCountOfDirection(nTargetX, nTargetY, nDir, 6) = 0) then begin
Dec(nTargetX, 10 - n08);
Inc(nTargetY, 10 - n08);
Result := True;
Break;
end else begin
if n08 >= 10 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
Inc(nDir);
Continue;
end;
Dec(nTargetX);
Inc(nTargetY);
Inc(n08);
Continue;
end;
end;
end;
end;
if (not boGotoL2) and (not Result) then begin
boGotoL2 := True;
goto L002;
end;
end;
var
n10: Integer;
n14: Integer;
n20: Integer;
nOldX: Integer;
nOldY: Integer;
n16: Integer;
nTargetX: Integer;
nTargetY: Integer;
nLoopCount: Integer;
begin
if m_TargetCret <> nil then begin
n10 := 0;
if CheckTargetXYCount(m_nCurrX, m_nCurrY, 6) > 0 then begin
while True do begin
Inc(n10);
nTargetX := m_nCurrX;
nTargetY := m_nCurrY;
if SearchNextDir(nTargetX, nTargetY) then
GotoTargetXY(nTargetX, nTargetY);
if CheckTargetXYCount(m_nCurrX, m_nCurrY, 6) = 0 then Break;
if n10 >= 1 then Break;
end;
end;
GotoTargetXYRange();
end;
{if m_TargetCret <> nil then begin
nLoopCount := 1;
if CheckTargetXYCount(m_nCurrX, m_nCurrY, 6) > 0 then begin
nTargetX := m_nCurrX;
nTargetY := m_nCurrY + 8;
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
n20 := 0;
while True do begin
if n20 > nLoopCount then break;
GotoTargetXY(nTargetX, nTargetY);
Inc(nTargetY);
Inc(n20);
end;
Exit;
end;
nTargetX := m_nCurrX + 10;
nTargetY := m_nCurrY + 10;
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
n20 := 0;
while True do begin
if n20 > nLoopCount then break;
GotoTargetXY(nTargetX, nTargetY);
Inc(nTargetX);
Inc(nTargetY);
Inc(n20);
end;
Exit;
end;
nTargetX := m_nCurrX + 8;
nTargetY := m_nCurrY;
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
n20 := 0;
while True do begin
if n20 > nLoopCount then break;
GotoTargetXY(nTargetX, nTargetY);
Inc(nTargetX);
Inc(n20);
end;
Exit;
end;
nTargetX := m_nCurrX + 10;
nTargetY := m_nCurrY + 10;
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
n20 := 0;
while True do begin
if n20 > nLoopCount then break;
GotoTargetXY(nTargetX, nTargetY);
Inc(nTargetX);
Inc(nTargetY);
Inc(n20);
end;
Exit;
end;
nTargetX := m_nCurrX;
nTargetY := m_nCurrY - 8;
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
n20 := 0;
while True do begin
if n20 > nLoopCount then break;
GotoTargetXY(nTargetX, nTargetY);
Dec(nTargetY);
Inc(n20);
end;
Exit;
end;
nTargetX := m_nCurrX - 10;
nTargetY := m_nCurrY - 10;
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
n20 := 0;
while True do begin
if n20 > nLoopCount then break;
GotoTargetXY(nTargetX, nTargetY);
Dec(nTargetX);
Dec(nTargetY);
Inc(n20);
end;
Exit;
end;
nTargetX := m_nCurrX - 8;
nTargetY := m_nCurrY;
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
n20 := 0;
while True do begin
if n20 > nLoopCount then break;
GotoTargetXY(nTargetX, nTargetY);
Dec(nTargetX);
Inc(n20);
end;
Exit;
end;
nTargetX := m_nCurrX - 10;
nTargetY := m_nCurrY + 10;
if m_PEnvir.CanWalkEx(nTargetX, nTargetY, True) and (CheckTargetXYCount(nTargetX, nTargetY, 6) = 0) then begin
n20 := 0;
while True do begin
if n20 > nLoopCount then break;
GotoTargetXY(nTargetX, nTargetY);
Dec(nTargetX);
Inc(nTargetY);
Inc(n20);
end;
Exit;
end;
if m_Master <> nil then begin
nTargetX := m_Master.m_nCurrX;
nTargetY := m_Master.m_nCurrY;
GotoTargetXY(nTargetX, nTargetY);
end else begin
GetTargetCretXY(nTargetX, nTargetY);
GotoTargetXY(nTargetX, nTargetY);
end;
end;
end;}
end;
procedure TPlayMonster.SearchPickUpItem(dwSearchTime: LongWord);
function PickUpItem(VisibleMapItem: pTVisibleMapItem): Boolean;
var
UserItem: pTUserItem;
StdItem: pTStdItem;
MapItem: PTMapItem;
nDeleteCode: Integer;
begin
Result := False;
MapItem := m_PEnvir.GetItem(VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY});
if MapItem = nil then Exit;
if CompareText(VisibleMapItem.sName, sSTRING_GOLDNAME) = 0 then begin
if m_PEnvir.DeleteFromMap(VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, OS_ITEMOBJECT, TObject(MapItem)) = 1 then begin
if (m_Master <> nil) and (not m_Master.m_boDeath) then begin //捡到的钱加给主人
if TPlayObject(m_Master).IncGold(MapItem.Count) then begin
SendRefMsg(RM_ITEMHIDE, 0, Integer(MapItem), VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, '');
if g_boGameLogGold then
AddGameDataLog('4' + #9 +
m_sMapName + #9 +
IntToStr(VisibleMapItem.nX {m_nCurrX}) + #9 +
IntToStr(VisibleMapItem.nY {m_nCurrY}) + #9 +
m_sCharName + #9 +
sSTRING_GOLDNAME + #9 +
IntToStr(MapItem.Count) + #9 +
'1' + #9 +
'0');
Result := True;
m_Master.GoldChanged;
DisPoseAndNil(MapItem);
end else begin
m_PEnvir.AddToMap(VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, OS_ITEMOBJECT, TObject(MapItem));
end;
end;
end;
Exit;
end else begin //捡物品
if (m_Master <> nil) and (not m_Master.m_boDeath) then begin //捡到的物品加给主人
if m_ItemList.Count < g_Config.nCopyHumanBagCount then begin //捡到药品先给自己
StdItem := UserEngine.GetStdItem(MapItem.UserItem.wIndex);
if (StdItem <> nil) and IsPickUpItem(StdItem) then begin
if m_PEnvir.DeleteFromMap(VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, OS_ITEMOBJECT, TObject(MapItem)) = 1 then begin
New(UserItem);
UserItem^ := MapItem.UserItem;
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem <> nil) and IsAddWeightAvailable(UserEngine.GetStdItemWeight(UserItem.wIndex)) then begin
SendRefMsg(RM_ITEMHIDE, 0, Integer(MapItem), VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, '');
m_ItemList.Add(UserItem);
//m_WAbil.Weight := RecalcBagWeight();
if not IsCheapStuff(StdItem.StdMode) then
if StdItem.NeedIdentify = 1 then
AddGameDataLog('4' + #9 +
m_sMapName + #9 +
IntToStr(VisibleMapItem.nX {m_nCurrX}) + #9 +
IntToStr(VisibleMapItem.nY {m_nCurrY}) + #9 +
m_sCharName + #9 +
//UserEngine.GetStdItemName(pu.wIndex) + #9 +
StdItem.Name + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
'0');
Result := True;
DisPoseAndNil(MapItem);
end;
end else begin
DisPoseAndNil(UserItem);
m_PEnvir.AddToMap(VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, OS_ITEMOBJECT, TObject(MapItem));
end;
Exit;
end;
end;
if TPlayObject(m_Master).IsEnoughBag and m_boCanPickUpItem then begin
if m_PEnvir.DeleteFromMap(VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, OS_ITEMOBJECT, TObject(MapItem)) = 1 then begin
New(UserItem);
UserItem^ := MapItem.UserItem;
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if (StdItem <> nil) and TPlayObject(m_Master).IsAddWeightAvailable(UserEngine.GetStdItemWeight(UserItem.wIndex)) then begin
SendRefMsg(RM_ITEMHIDE, 0, Integer(MapItem), VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, '');
TPlayObject(m_Master).AddItemToBag(UserItem);
if not IsCheapStuff(StdItem.StdMode) then
if StdItem.NeedIdentify = 1 then
AddGameDataLog('4' + #9 +
m_sMapName + #9 +
IntToStr(VisibleMapItem.nX {m_nCurrX}) + #9 +
IntToStr(VisibleMapItem.nY {m_nCurrY}) + #9 +
m_sCharName + ' - ' + m_Master.m_sCharName + #9 +
//UserEngine.GetStdItemName(pu.wIndex) + #9 +
StdItem.Name + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
'0');
Result := True;
DisPoseAndNil(MapItem);
if not m_Master.m_boDeath then begin
if TPlayObject(m_Master).m_btRaceServer = RC_PLAYOBJECT then begin
TPlayObject(m_Master).SendAddItem(UserItem);
end;
end;
end else begin
DisPoseAndNil(UserItem);
m_PEnvir.AddToMap(VisibleMapItem.nX, VisibleMapItem.nY {m_nCurrX, m_nCurrY}, OS_ITEMOBJECT, TObject(MapItem));
end;
end;
end;
end;
end;
end;
function IsOfGroup(BaseObject: TBaseObject): Boolean;
var
I: Integer;
GroupMember: TBaseObject;
begin
{ Result := False;
if m_Master.m_GroupOwner = nil then Exit;
for I := 0 to m_Master.m_GroupOwner.m_GroupMembers.Count - 1 do begin
GroupMember := TBaseObject(m_Master.m_GroupOwner.m_GroupMembers.Objects[I]);
if GroupMember = BaseObject then begin
Result := True;
Break;
end;
end; }
end;
var
MapItem: PTMapItem;
VisibleMapItem: pTVisibleMapItem;
I: Integer;
nCheckCode: Integer;
boFound: Boolean;
sName: string;
resourcestring
sExceptionMsg2 = '[Exception] TPlayMonster::SearchItemRange 1-%d %s %s %d %d %d';
begin
{开始拣物品}
//MainOutMessage('开始捡物品');
if GetTickCount - m_dwPickUpItemTick > dwSearchTime then begin
m_dwPickUpItemTick := GetTickCount;
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) {or IsOfGroup(TBaseObject(MapItem.OfBaseObject))} then begin
//GotoTargetXY(VisibleMapItem.nX, VisibleMapItem.nY);
if PickUpItem(VisibleMapItem) then begin
//MainOutMessage('捡到物品');
Break;
end;
end;
end;
end;
end;
end;
end;
end;
function TPlayMonster.IsPickUpItem(StdItem: pTStdItem): Boolean;
begin
Result := False;
if StdItem.StdMode = 0 then begin
if (StdItem.Shape in [0, 1, 2]) then Result := True;
end else
if StdItem.StdMode = 31 then begin
if GetBindItemType(StdItem.Shape) >= 0 then Result := True;
end else begin
Result := False;
end;
end;
function TPlayMonster.EatUseItems(btItemType: Byte): Boolean; {自动吃药}
function EatItems(StdItem: pTStdItem): Boolean;
var
bo06: Boolean;
nOldStatus: Integer;
begin
Result := False;
if m_PEnvir.m_boNODRUG then begin
Exit;
end;
case StdItem.StdMode of
0: begin
case StdItem.Shape of {红药}
0: begin
if (StdItem.AC > 0) then begin
Inc(m_nIncHealth, StdItem.AC);
Result := True;
end;
if (StdItem.MAC > 0) then begin {蓝药}
Inc(m_nIncSpell, StdItem.MAC);
Result := True;
end;
end;
1: begin
if (StdItem.AC > 0) and (StdItem.MAC > 0) then begin
IncHealthSpell(StdItem.AC, StdItem.MAC);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -