📄 envir.~pas
字号:
unit Envir;
interface
uses
Windows, SysUtils, Classes, Grobal2;
type
TMapHeader = packed record
wWidth :Word;
wHeight :Word;
sTitle :String[16];
UpdateDate :TDateTime;
Reserved :array[0..22] of Char;
end;
TMapUnitInfo = packed record
wBkImg :Word; //32768 $8000 为禁止移动区域
wMidImg :Word;
wFrImg :Word;
btDoorIndex :Byte; //$80 (巩娄), 巩狼 侥喊 牢郸胶
btDoorOffset :Byte; //摧腮 巩狼 弊覆狼 惑措 困摹, $80 (凯覆/摧塞(扁夯))
btAniFrame :Byte; //$80(Draw Alpha) + 橇贰烙 荐
btAniTick :Byte;
btArea :Byte; //瘤开 沥焊
btLight :Byte; //0..1..4 堡盔 瓤苞
end;
pTMapUnitInfo =^TMapUnitInfo;
TMap = array[0..1000 * 1000 -1] of TMapUnitInfo;
pTMap = ^TMap;
TMapCellinfo = record
chFlag :Byte;
bt1 :Byte;
bt2 :Byte;
bt3 :Byte;
ObjList :TList;
end;
pTMapCellinfo =^TMapCellinfo;
TEnvirnoment = class
sMapName :String; //0x4
sMapDesc :String;
MapCellArray :array of TMapCellinfo; //0x0C
nMinMap :Integer; //0x10
nServerIndex :Integer; //0x14
nRequestLevel :Integer; //0x18 进入本地图所需等级
m_nWidth :Integer; //0x1C
m_nHeight :Integer; //0x20
m_boDARK :Boolean; //0x24
m_boDAY :Boolean; //0x25
m_boDarkness :Boolean;
m_boDayLight :Boolean;
m_DoorList :TList; //0x28
bo2C :Boolean;
m_boSAFE :Boolean; //0x2D
m_boFightZone :Boolean; //0x2E
m_boFight3Zone :Boolean; //0x2F //行会战争地图
m_boQUIZ :Boolean; //0x30
m_boNORECONNECT :Boolean; //0x31
m_boNEEDHOLE :Boolean; //0x32
m_boNORECALL :Boolean; //0x33
m_boNOGUILDRECALL :Boolean;
m_boNODEARRECALL :Boolean;
m_boNOMASTERRECALL :Boolean;
m_boNORANDOMMOVE :Boolean; //0x34
m_boNODRUG :Boolean; //0x35
m_boMINE :Boolean; //0x36
m_boNOPOSITIONMOVE :Boolean; //0x37
sNoReconnectMap :String; //0x38
QuestNPC :TObject; //0x3C
nNEEDSETONFlag :Integer; //0x40
nNeedONOFF :Integer; //0x44
m_QuestList :TList; //0x48
m_boRUNHUMAN :Boolean; //可以穿人
m_boRUNMON :Boolean; //可以穿怪
m_boINCHP :Boolean; //自动加HP值
m_boINCGAMEGOLD :Boolean; //自动减游戏币
m_boINCGAMEPOINT :Boolean; //自动加点
m_boDECHP :Boolean; //自动减HP值
m_boDECGAMEGOLD :Boolean; //自动减游戏币
m_boDECGAMEPOINT :Boolean; //自动减点
m_boMUSIC :Boolean; //音乐
m_boEXPRATE :Boolean; //杀怪经验倍数
m_boPKWINLEVEL :Boolean; //PK得等级
m_boPKWINEXP :Boolean; //PK得经验
m_boPKLOSTLEVEL :Boolean; //PK丢等级
m_boPKLOSTEXP :Boolean; //PK丢经验
m_nPKWINLEVEL :Integer; //PK得等级数
m_nPKLOSTLEVEL :Integer; //PK丢等级
m_nPKWINEXP :Integer; //PK得经验数
m_nPKLOSTEXP :Integer; //PK丢经验
m_nDECHPTIME :Integer; //减HP间隔时间
m_nDECHPPOINT :Integer; //一次减点数
m_nINCHPTIME :Integer; //加HP间隔时间
m_nINCHPPOINT :Integer; //一次加点数
m_nDECGAMEGOLDTIME :Integer; //减游戏币间隔时间
m_nDECGAMEGOLD :Integer; //一次减数量
m_nDECGAMEPOINTTIME :Integer; //减游戏点间隔时间
m_nDECGAMEPOINT :Integer; //一次减数量
m_nINCGAMEGOLDTIME :Integer; //加游戏币间隔时间
m_nINCGAMEGOLD :Integer; //一次加数量
m_nINCGAMEPOINTTIME :Integer; //加游戏币间隔时间
m_nINCGAMEPOINT :Integer; //一次加数量
m_nMUSICID :Integer; //音乐ID
m_nEXPRATE :Integer; //经验倍率
m_nMonCount :Integer;
m_nHumCount :Integer;
private
procedure Initialize(nWidth, nHeight: Integer);
public
constructor Create();
destructor Destroy; override;
function AddToMap(nX,nY:Integer;btType:Byte;pRemoveObject:TObject):Pointer;
function CanWalk (nX,nY:Integer;boFlag:Boolean):Boolean;
function CanWalkOfItem (nX,nY:Integer;boFlag,boItem:Boolean):Boolean;
function CanWalkEx (nX,nY:Integer;boFlag:Boolean):Boolean;
function CanFly (nsX,nsY,ndX,ndY:integer):Boolean;
function MoveToMovingObject(nCX, nCY: integer; Cert: TObject; nX,nY: Integer; boFlag: Boolean): Integer;
function GetItem(nX, nY: Integer): PTMapItem;
function DeleteFromMap(nX,nY:Integer;btType:Byte;pRemoveObject:TObject):Integer;
function IsCheapStuff():Boolean;
procedure AddDoorToMap;
function AddToMapMineEvent(nX,nY:Integer;nType:Integer;Event:TObject):TObject;
function LoadMapData(sMapFile:String):Boolean;
function CreateQuest(nFlag,nValue:Integer;s24,s28,s2C:String;boGrouped:Boolean):Boolean;
function GetMapCellInfo(nX,nY:Integer;var MapCellInfo:pTMapCellinfo):Boolean;
function GetXYObjCount(nX,nY:Integer):Integer;
function GetNextPosition(sx, sy, ndir,nFlag:Integer;var snx:Integer;var sny:Integer):Boolean;
function sub_4B5FC8(nX,nY:Integer):Boolean;
procedure VerifyMapTime(nX,nY:Integer;BaseObject:TObject);
function CanSafeWalk(nX,nY:Integer):Boolean;
function ArroundDoorOpened(nX,nY:Integer):Boolean;
function GetMovingObject(nX,nY:Integer;boFlag:Boolean):Pointer;
function GetQuestNPC(BaseObject:TObject;sCharName,sStr:String;boFlag:Boolean):TObject;
function GetItemEx(nX,nY:Integer;var nCount:Integer):Pointer;
function GetDoor(nX,nY:Integer):pTDoorInfo;
function IsValidObject(nX,nY:Integer;nRage:Integer;BaseObject:TObject):Boolean;
function GetRangeBaseObject(nX,nY:Integer;nRage:Integer;boFlag:Boolean;BaseObjectList:TList):Integer;
function GetBaseObjects(nX,nY:Integer;boFlag:Boolean;BaseObjectList:TList):Integer;
function GetEvent(nX,nY:Integer):TObject;
procedure SetMapXYFlag(nX,nY:Integer;boFlag:Boolean);
function GetXYHuman(nMapX, nMapY: Integer):Boolean;
function GetEnvirInfo():String;
procedure AddObject(nType:Integer);
procedure DelObjectCount(BaseObject:TObject);
property MonCount:Integer read m_nMonCount;
property HumCount:Integer read m_nHumCount;
end;
TMapManager = class(TGList) //004B52B0
private
public
constructor Create();
destructor Destroy; override;
procedure LoadMapDoor();
function AddMapInfo(sMapName, sMapDesc: String; nServerNumber: Integer;MapFlag:pTMapFlag;QuestNPC: TObject):TEnvirnoment;
function GetMapInfo(nServerIdx: Integer;sMapName: String): TEnvirnoment;
function AddMapRoute(sSMapNO:String;nSMapX,nSMapY:Integer;sDMapNO:String;nDMapX,nDMapY:Integer):Boolean;
function GetMapOfServerIndex(sMapName:String):Integer;
function FindMap(sMapName:String):TEnvirnoment;
procedure ReSetMinMap();
procedure Run();
procedure ProcessMapDoor();
end;
implementation
uses ObjBase, ObjNpc, M2Share, Event, ObjMon, HUtil32, Castle;
{ TEnvirList }
//004B7038
function TMapManager.AddMapInfo(sMapName, sMapDesc: String; nServerNumber:Integer;MapFlag:pTMapFlag;QuestNPC: TObject):TEnvirnoment;
var
Envir:TEnvirnoment;
i:Integer;
begin
Result:=nil;
Envir:=TEnvirnoment.Create;
Envir.sMapName :=sMapName;
Envir.sMapDesc :=sMapDesc;
Envir.nServerIndex :=nServerNumber;
Envir.m_boSAFE :=MapFlag.boSAFE;
Envir.m_boFightZone :=MapFlag.boFIGHT;
Envir.m_boFight3Zone :=MapFlag.boFIGHT3;
Envir.m_boDARK :=MapFlag.boDARK;
Envir.m_boDAY :=MapFlag.boDAY;
Envir.m_boQUIZ :=MapFlag.boQUIZ;
Envir.m_boNORECONNECT :=MapFlag.boNORECONNECT;
Envir.m_boNEEDHOLE :=MapFlag.boNEEDHOLE;
Envir.m_boNORECALL :=MapFlag.boNORECALL;
Envir.m_boNOGUILDRECALL :=MapFlag.boNOGUILDRECALL;
Envir.m_boNODEARRECALL :=MapFlag.boNODEARRECALL;
Envir.m_boNOMASTERRECALL :=MapFlag.boNOMASTERRECALL;
Envir.m_boNORANDOMMOVE :=MapFlag.boNORANDOMMOVE;
Envir.m_boNODRUG :=MapFlag.boNODRUG;
Envir.m_boMINE :=MapFlag.boMINE;
Envir.m_boNOPOSITIONMOVE :=MapFlag.boNOPOSITIONMOVE;
Envir.m_boRUNHUMAN :=MapFlag.boRUNHUMAN; //可以穿人
Envir.m_boRUNMON :=MapFlag.boRUNMON; //可以穿怪
Envir.m_boDECHP :=MapFlag.boDECHP; //自动减HP值
Envir.m_boINCHP :=MapFlag.boINCHP; //自动加HP值
Envir.m_boDECGAMEGOLD :=MapFlag.boDECGAMEGOLD; //自动减游戏币
Envir.m_boDECGAMEPOINT :=MapFlag.boDECGAMEPOINT; //自动减游戏币
Envir.m_boINCGAMEGOLD :=MapFlag.boINCGAMEGOLD; //自动加游戏币
Envir.m_boINCGAMEPOINT :=MapFlag.boINCGAMEPOINT; //自动加游戏点
Envir.m_boMUSIC :=MapFlag.boMUSIC; //音乐
Envir.m_boEXPRATE :=MapFlag.boEXPRATE; //杀怪经验倍数
Envir.m_boPKWINLEVEL :=MapFlag.boPKWINLEVEL; //PK得等级
Envir.m_boPKWINEXP :=MapFlag.boPKWINEXP; //PK得经验
Envir.m_boPKLOSTLEVEL :=MapFlag.boPKLOSTLEVEL;
Envir.m_boPKLOSTEXP :=MapFlag.boPKLOSTEXP;
Envir.m_nPKWINLEVEL :=MapFlag.nPKWINLEVEL; //PK得等级数
Envir.m_nPKWINEXP :=MapFlag.nPKWINEXP; //PK得经验数
Envir.m_nPKLOSTLEVEL :=MapFlag.nPKLOSTLEVEL;
Envir.m_nPKLOSTEXP :=MapFlag.nPKLOSTEXP;
Envir.m_nPKWINEXP :=MapFlag.nPKWINEXP; //PK得经验数
Envir.m_nDECHPTIME :=MapFlag.nDECHPTIME; //减HP间隔时间
Envir.m_nDECHPPOINT :=MapFlag.nDECHPPOINT; //一次减点数
Envir.m_nINCHPTIME :=MapFlag.nINCHPTIME; //加HP间隔时间
Envir.m_nINCHPPOINT :=MapFlag.nINCHPPOINT; //一次加点数
Envir.m_nDECGAMEGOLDTIME :=MapFlag.nDECGAMEGOLDTIME; //减游戏币间隔时间
Envir.m_nDECGAMEGOLD :=MapFlag.nDECGAMEGOLD; //一次减数量
Envir.m_nINCGAMEGOLDTIME :=MapFlag.nINCGAMEGOLDTIME; //减游戏币间隔时间
Envir.m_nINCGAMEGOLD :=MapFlag.nINCGAMEGOLD; //一次减数量
Envir.m_nINCGAMEPOINTTIME :=MapFlag.nINCGAMEPOINTTIME; //减游戏币间隔时间
Envir.m_nINCGAMEPOINT :=MapFlag.nINCGAMEPOINT; //一次减数量
Envir.m_nMUSICID :=MapFlag.nMUSICID; //音乐ID
Envir.m_nEXPRATE :=MapFlag.nEXPRATE; //经验倍率
Envir.sNoReconnectMap :=MapFlag.sReConnectMap;
Envir.QuestNPC :=QuestNPC;
Envir.nNEEDSETONFlag :=MapFlag.nNEEDSETONFlag;
Envir.nNeedONOFF :=MapFlag.nNeedONOFF;
for i:=0 to MiniMapList.Count -1 do begin
if CompareText(MiniMapList.Strings[i],Envir.sMapName) = 0 then begin
Envir.nMinMap:=Integer(MiniMapList.Objects[i]);
break;
end;
end;
if Envir.LoadMapData(g_Config.sMapDir + sMapName + '.map') then begin
Result:=Envir;
Self.Add(Envir);
end else begin
MainOutMessage('地图文件 ' + g_Config.sMapDir + sMapName + '.map' + ' 未找到!!!');
end;
end;
//004B7280
function TMapManager.AddMapRoute(sSMapNO:String;nSMapX,nSMapY:Integer;sDMapNO:String;nDMapX,nDMapY:Integer):Boolean;
var
GateObj:pTGateObj;
SEnvir:TEnvirnoment;
DEnvir:TEnvirnoment;
begin
Result:=False;
SEnvir:=FindMap(sSMapNO);
DEnvir:=FindMap(sDMapNO);
if (SEnvir <> nil) and (DEnvir <> nil) then begin
New(GateObj);
GateObj.boFlag:=False;
GateObj.DEnvir:=DEnvir;
GateObj.nDMapX:=nDMapX;
GateObj.nDMapY:=nDMapY;
SEnvir.AddToMap(nSMapX,nSMapY,OS_GATEOBJECT,TObject(GateObj));
Result:=True;
end;
end;
//004B63E4
function TEnvirnoment.AddToMap(nX, nY: Integer; btType: Byte;
pRemoveObject: TObject):Pointer;
var
MapCellInfo:pTMapCellinfo;
OSObject:pTOSObject;
MapItem:PTMapItem;
i:integer;
nGoldCount:Integer;
bo1E:Boolean;
btRaceServer:Byte;
ResourceString
sExceptionMsg = '[Exception] TEnvirnoment::AddToMap';
begin
Result:=nil;
try
bo1E:=False;
if GetMapCellInfo(nX,nY,MapCellInfo) and (MapCellInfo.chFlag = 0) then begin
if MapCellInfo.ObjList = nil then begin
MapCellInfo.ObjList:=TList.Create;
end else begin
if btType = OS_ITEMOBJECT then begin
if PTMapItem(pRemoveObject).Name = sSTRING_GOLDNAME then begin
for i:=0 to MapCellInfo.ObjList.Count -1 do begin
OSObject:=MapCellInfo.ObjList.Items[i];
if OSObject.btType = OS_ITEMOBJECT then begin
MapItem:=PTMapItem(pTOSObject(MapCellInfo.ObjList.Items[i]).CellObj);
if MapItem.Name = sSTRING_GOLDNAME then begin
nGoldCount:=MapItem.Count + PTMapItem(pRemoveObject).Count;
if nGoldCount <= 2000 then begin
MapItem.Count:= nGoldCount;
MapItem.Looks:= GetGoldShape(nGoldCount);
MapItem.AniCount:=0;
MapItem.Reserved:=0;
OSObject.dwAddTime:=GetTickCount();
Result:=MapItem;
bo1E:=True;
end;
end;
end;
end;//004B653D
end;//004B653D
if not bo1E and (MapCellInfo.ObjList.Count >= 5) then begin
Result:=nil;
bo1E:=True;
end;//004B6558
end;//004B6558
if btType = OS_EVENTOBJECT then begin
end;
end;//004B655C
if not bo1E then begin
New(OSObject);
OSObject.btType:=btType;
OSObject.CellObj:=pRemoveObject;
OSObject.dwAddTime:=GetTickCount();
MapCellInfo.ObjList.Add(OSObject);
Result:=Pointer(pRemoveObject);
if (btType = OS_MOVINGOBJECT) and (not TBaseObject(pRemoveObject).m_boAddToMaped) then begin
TBaseObject(pRemoveObject).m_boDelFormMaped:=False;
TBaseObject(pRemoveObject).m_boAddToMaped:=True;
btRaceServer:=TBaseObject(pRemoveObject).m_btRaceServer;
if btRaceServer = RC_PLAYOBJECT then Inc(m_nHumCount);
if btRaceServer >= RC_ANIMAL then Inc(m_nMonCount);
end;
end;//004B659F
end;//004B659F
except
MainOutMessage(sExceptionMsg);
end;
end;
procedure TEnvirnoment.AddDoorToMap(); //004B6A74
var
i:integer;
Door:pTDoorInfo;
begin
for i:=0 to m_DoorList.Count -1 do begin
Door:=m_DoorList.Items[i];
AddToMap(Door.nX,Door.nY,OS_DOOR,TObject(Door));
end;
end;
function TEnvirnoment.GetMapCellInfo(nX,nY:Integer;var MapCellInfo:pTMapCellinfo):Boolean;//004B57D8
begin
if (nX >= 0) and (nX < m_nWidth) and (nY >= 0) and (nY < m_nHeight) then begin
MapCellInfo:=@MapCellArray[nX * m_nHeight + nY];
Result:=True;
end else begin//004B5829
Result:=False;
end;
end;
function TEnvirnoment.MoveToMovingObject (nCX, nCY:integer;Cert:TObject;nX,nY:Integer;boFlag:Boolean):Integer;//004B612C
var
MapCellInfo:pTMapCellinfo;
BaseObject:TBaseObject;
OSObject:pTOSObject;
i:Integer;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -