📄 envir.pas
字号:
OSObject : pTOSObject;
BaseObject : TBaseObject;
begin
Result := nil;
if GetMapCellInfo(nX, nY, MapCellInfo) and (MapCellInfo.ObjList <> nil) then
begin
for i := 0 to MapCellInfo.ObjList.Count - 1 do
begin
OSObject := MapCellInfo.ObjList.Items[i];
if OSObject.btType = OS_MOVINGOBJECT then
begin
BaseObject := TBaseObject(OSObject.CellObj);
if ((BaseObject <> nil) and
(not BaseObject.m_boGhost) and
(BaseObject.bo2B9)) and
((not boFlag) or (not BaseObject.m_boDeath)) then
begin
Result := BaseObject;
break;
end;
end;
end;
end;
end;
function TEnvirnoment.GetQuestNPC(BaseObject: TObject; sCharName, sStr: string;
boFlag: Boolean): TObject; //004B6E4C
var
i : Integer;
MapQuestFlag : pTMapQuestInfo;
nFlagValue : Integer;
bo1D : Boolean;
begin
Result := nil;
for i := 0 to m_QuestList.Count - 1 do
begin
MapQuestFlag := m_QuestList.Items[i];
nFlagValue :=
TBaseObject(BaseObject).GetQuestFalgStatus(MapQuestFlag.nFlag);
if nFlagValue = MapQuestFlag.nValue then
begin
if (boFlag = MapQuestFlag.bo10) or (not boFlag) then
begin
bo1D := False;
if (MapQuestFlag.s08 <> '') and (MapQuestFlag.s0C <> '') then
begin
if (MapQuestFlag.s08 = sCharName) and (MapQuestFlag.s0C = sStr) then
bo1D := True;
end;
if (MapQuestFlag.s08 <> '') and (MapQuestFlag.s0C = '') then
begin
if (MapQuestFlag.s08 = sCharName) and (sStr = '') then
bo1D := True;
end;
if (MapQuestFlag.s08 = '') and (MapQuestFlag.s0C <> '') then
begin
if (MapQuestFlag.s0C = sStr) then
bo1D := True;
end;
if bo1D then
begin
Result := MapQuestFlag.NPC;
break;
end;
end;
end;
end;
end;
function TEnvirnoment.GetItemEx(nX, nY: Integer;
var nCount: Integer): Pointer; //004B5C10
var
i : Integer;
MapCellInfo : pTMapCellinfo;
OSObject : pTOSObject;
BaseObject : TBaseObject;
begin
Result := nil;
nCount := 0;
bo2C := False;
if GetMapCellInfo(nX, nY, MapCellInfo) and (MapCellInfo.chFlag = 0) then
begin
bo2C := True;
if MapCellInfo.ObjList <> nil then
begin
for i := 0 to MapCellInfo.ObjList.Count - 1 do
begin
OSObject := MapCellInfo.ObjList.Items[i];
if OSObject.btType = OS_ITEMOBJECT then
begin
Result := Pointer(OSObject.CellObj);
Inc(nCount);
end;
if OSObject.btType = OS_GATEOBJECT then
begin
bo2C := False;
end;
if OSObject.btType = OS_MOVINGOBJECT then
begin
BaseObject := TBaseObject(OSObject.CellObj);
if not BaseObject.m_boDeath then
bo2C := False;
end;
end;
end;
end;
end;
function TEnvirnoment.GetDoor(nX, nY: Integer): pTDoorInfo; //004B6ACC
var
i : Integer;
Door : pTDoorInfo;
begin
Result := nil;
for i := 0 to m_DoorList.Count - 1 do
begin
Door := m_DoorList.Items[i];
if (Door.nX = nX) and (Door.nY = nY) then
begin
Result := Door;
exit;
end;
end;
end;
function TEnvirnoment.IsValidObject(nX, nY, nRage: Integer; BaseObject:
TObject): Boolean; //004B5A3C
var
nXX, nYY, i : Integer;
MapCellInfo : pTMapCellinfo;
OSObject : pTOSObject;
begin
Result := False;
for nXX := nX - nRage to nX + nRage do
begin
for nYY := nY - nRage to nY + nRage do
begin
if GetMapCellInfo(nX, nY, MapCellInfo) and (MapCellInfo.ObjList <> nil)
then
begin
for i := 0 to MapCellInfo.ObjList.Count - 1 do
begin
OSObject := MapCellInfo.ObjList.Items[i];
if OSObject.CellObj = BaseObject then
begin
Result := True;
exit;
end;
end;
end;
end;
end;
end;
function TEnvirnoment.GetRangeBaseObject(nX, nY, nRage: Integer; boFlag:
Boolean;
BaseObjectList: TMyList): Integer; //004B59C0
var
nXX, nYY : Integer;
begin
for nXX := nX - nRage to nX + nRage do
begin
for nYY := nY - nRage to nY + nRage do
begin
GeTBaseObjects(nXX, nYY, boFlag, BaseObjectList);
end;
end;
Result := BaseObjectList.Count;
end;
//boFlag 是否包括死亡对象
//FALSE 包括死亡对象
//TRUE 不包括死亡对象
function TEnvirnoment.GeTBaseObjects(nX, nY: Integer; boFlag: Boolean;
BaseObjectList: TMyList): Integer; //004B58F8
var
i : Integer;
MapCellInfo : pTMapCellinfo;
OSObject : pTOSObject;
BaseObject : TBaseObject;
begin
if GetMapCellInfo(nX, nY, MapCellInfo) and (MapCellInfo.ObjList <> nil) then
begin
for i := 0 to MapCellInfo.ObjList.Count - 1 do
begin
OSObject := MapCellInfo.ObjList.Items[i];
if OSObject.btType = OS_MOVINGOBJECT then
begin
BaseObject := TBaseObject(OSObject.CellObj);
if BaseObject <> nil then
begin
if not BaseObject.m_boGhost and BaseObject.bo2B9 then
begin
if not boFlag or not BaseObject.m_boDeath then
BaseObjectList.Add(BaseObject);
end;
end;
end;
end;
end;
Result := BaseObjectList.Count;
end;
function TEnvirnoment.GetEvent(nX, nY: Integer): TObject; //004B5D24
var
i : Integer;
MapCellInfo : pTMapCellinfo;
OSObject : pTOSObject;
begin
Result := nil;
bo2C := False;
if GetMapCellInfo(nX, nY, MapCellInfo) and (MapCellInfo.ObjList <> nil) then
begin
for i := 0 to MapCellInfo.ObjList.Count - 1 do
begin
OSObject := MapCellInfo.ObjList.Items[i];
if OSObject.btType = OS_EVENTOBJECT then
begin
Result := OSObject.CellObj;
end;
end;
end;
end;
procedure TEnvirnoment.SetMapXYFlag(nX, nY: Integer; boFlag: Boolean); //004B5E8C
var
MapCellInfo : pTMapCellinfo;
begin
if GetMapCellInfo(nX, nY, MapCellInfo) then
begin
if boFlag then
MapCellInfo.chFlag := 0
else
MapCellInfo.chFlag := 2;
end;
end;
function TEnvirnoment.CanFly(nSX, nSY, nDX, nDY: Integer): Boolean; //004B600C
var
r28, r30 : real;
n14, n18, n1C : Integer;
begin
Result := True;
r28 := (nDX - nSX) / 1.0E1;
r30 := (nDY - nDX) / 1.0E1;
n14 := 0;
while (True) do
begin
n18 := ROUND(nSX + r28);
n1C := ROUND(nSY + r30);
if not CanWalk(n18, n1C, True) then
begin
Result := False;
break;
end;
Inc(n14);
if n14 >= 10 then
break;
end;
end;
function TEnvirnoment.GetXYHuman(nMapX, nMapY: Integer): Boolean;
var
i : Integer;
MapCellInfo : pTMapCellinfo;
OSObject : pTOSObject;
BaseObject : TBaseObject;
begin
Result := False;
if GetMapCellInfo(nMapX, nMapY, MapCellInfo) and (MapCellInfo.ObjList <> nil)
then
begin
for i := 0 to MapCellInfo.ObjList.Count - 1 do
begin
OSObject := MapCellInfo.ObjList.Items[i];
if OSObject.btType = OS_MOVINGOBJECT then
begin
BaseObject := TBaseObject(OSObject.CellObj);
if BaseObject.m_btRaceServer = RC_PLAYOBJECT then
begin
Result := True;
break;
end;
end;
end;
end;
end;
function TEnvirnoment.sub_4B5FC8(nX, nY: Integer): Boolean; //0x004B5FC8
var
MapCellInfo : pTMapCellinfo;
begin
Result := True;
if GetMapCellInfo(nX, nY, MapCellInfo) and (MapCellInfo.chFlag = 2) then
Result := False;
end;
function TEnvirnoment.GetEnvirInfo: string;
var
sMsg : string;
begin
sMsg :=
'地图名:%s(%s) DAY:%s DARK:%s SAFE:%s FIGHT:%s FIGHT3:%s QUIZ:%s NORECONNECT:%s(%s) MUSIC:%s(%d) EXPRATE:%s(%f) PKWINLEVEL:%s(%d) PKLOSTLEVEL:%s(%d) PKWINEXP:%s(%d) PKLOSTEXP:%s(%d) DECHP:%s(%d/%d) INCHP:%s(%d/%d)';
sMsg := sMsg +
' DECGAMEGOLD:%s(%d/%d) INCGAMEGOLD:%s(%d/%d) INCGAMEPOINT:%s(%d/%d) RUNHUMAN:%s RUNMON:%s NEEDHOLE:%s NORECALL:%s NOGUILDRECALL:%s NODEARRECALL:%s NOMASTERRECALL:%s NODRUG:%s MINE:%s NOPOSITIONMOVE:%s';
Result := format(sMsg, [sMapName,
sMapDesc,
BoolToCStr(m_boDAY),
BoolToCStr(m_boDARK),
BoolToCStr(m_boSAFE),
BoolToCStr(m_boFightZone),
BoolToCStr(m_boFight3Zone),
BoolToCStr(m_boQUIZ),
BoolToCStr(m_boNORECONNECT), sNoReconnectMap,
BoolToCStr(m_boMUSIC), m_nMUSICID,
BoolToCStr(m_boEXPRATE), m_nEXPRATE / 100,
BoolToCStr(m_boPKWINLEVEL), m_nPKWINLEVEL,
BoolToCStr(m_boPKLOSTLEVEL), m_nPKLOSTLEVEL,
BoolToCStr(m_boPKWINEXP), m_nPKWINEXP,
BoolToCStr(m_boPKLOSTEXP), m_nPKLOSTEXP,
BoolToCStr(m_boDECHP), m_nDECHPTIME, m_nDECHPPOINT,
BoolToCStr(m_boINCHP), m_nINCHPTIME, m_nINCHPPOINT,
BoolToCStr(m_boDecGameGold), m_nDECGAMEGOLDTIME, m_nDecGameGold,
BoolToCStr(m_boIncGameGold), m_nINCGAMEGOLDTIME, m_nIncGameGold,
BoolToCStr(m_boINCGAMEPOINT), m_nINCGAMEPOINTTIME, m_nINCGAMEPOINT,
BoolToCStr(m_boRUNHUMAN),
BoolToCStr(m_boRUNMON),
BoolToCStr(m_boNEEDHOLE),
BoolToCStr(m_boNORECALL),
BoolToCStr(m_boNOGUILDRECALL),
BoolToCStr(m_boNODEARRECALL),
BoolToCStr(m_boNOMASTERRECALL),
BoolToCStr(m_boNODRUG),
BoolToCStr(m_boMINE),
BoolToCStr(m_boNOPOSITIONMOVE)
]);
end;
procedure TEnvirnoment.AddObject(nType: Integer);
begin
case nType of
0: Inc(m_nHumCount);
1: Inc(m_nMonCount);
end;
end;
procedure TEnvirnoment.DelObjectCount(BaseObject: TObject);
var
btRaceServer : Byte;
begin
btRaceServer := TBaseObject(BaseObject).m_btRaceServer;
if btRaceServer = RC_PLAYOBJECT then
Inc(m_nHumCount);
if btRaceServer >= RC_ANIMAL then
Inc(m_nMonCount);
end;
procedure TMapManager.Run;
begin
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -