📄 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_boCANHORSE :Boolean;
m_boNOBATFLY :Boolean;
m_boCanUseLF :Boolean;
m_boNOYS :Boolean;
m_boNOQB :Boolean;
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;
mirrorname :string[14];
m_weatherEffect :integer;
m_nQfunction :integer;
//06.1.21
m_skillbyhumlabel:string[20];
m_skillbymonlabel:string[20];
m_skillhumlabel:string[20];
m_skillmonlabel:string[20];
m_slevelupgotolabel:string[20];
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);
procedure SetMapXYFlagx(nX, nY,nFlag: Integer);
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;
var
off:array [0..31]of integer =(1, 1, 3, 3, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 9, 9,
2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8,10,10 );
{ TEnvirList }
//004B7038
function TMapManager.AddMapInfo(sMapName, sMapDesc: String; nServerNumber:Integer;MapFlag:pTMapFlag;QuestNPC: TObject):TEnvirnoment;
var
Envir:TEnvirnoment;
i:Integer;
mirror:TEnvirnoment;
begin
Result:=nil;
Envir:=TEnvirnoment.Create;
Envir.sMapName :=sMapName;
Envir.sMapDesc :=sMapDesc;
Envir.nServerIndex :=nServerNumber;
Envir.m_boSAFE :=MapFlag.boSAFE;
Envir.m_boCANHORSE :=MapFlag.boCANHORSE ;
Envir.m_boNOBATFLY :=MapFlag.boNOBATFLY ;
Envir.m_boCanUseLF :=MapFlag.boCanUseLF ;
Envir.m_boNOYS :=MapFlag.boNOYS ;
Envir.m_boNOQB :=MapFlag.boNOQB ;
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;
Envir.mirrorname :=MapFlag.mirrorname;
Envir.m_weatherEffect := MapFlag.m_weatherEffect ;
Envir.m_nQfunction := MapFlag.m_nQfunction;
Envir.m_skillbyhumlabel:= MapFlag.m_skillbyhumlabel ;
Envir.m_skillbymonlabel:= MapFlag.m_skillbymonlabel ;
Envir.m_skillhumlabel:= MapFlag.m_skillhumlabel ;
Envir.m_skillmonlabel:= MapFlag.m_skillmonlabel ;
Envir.m_slevelupgotolabel:= MapFlag.m_slevelupgotolabel ;
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.mirrorname<>'' then begin //镜像地图
mirror:= GetMapInfo(nServerNumber,Envir.mirrorname);
// pointer(Envir.MapCellArray):=pointer(mirror.MapCellArray);
if mirror=nil then begin
MainOutMessage('镜像地图 ' + Envir.sMapName + ' 加载失败,原始地图'+Envir.mirrorname+'未加载!!!');
Envir.Free; //hint加
exit;
end;
Envir.m_nWidth:=mirror.m_nWidth;
Envir.m_nHeight:=mirror.m_nHeight;
Envir.Initialize(Envir.m_nWidth,Envir.m_nHeight);
copymemory(@Envir.MapCellArray[0],@mirror.MapCellArray[0],(Envir.m_nWidth * Envir.m_nHeight) * SizeOf(TMapCellinfo)) ;
Result:=Envir;
Self.Add(Envir);
end
else begin
if Envir.LoadMapData(g_Config.sMapDir + sMapName + '.nmp') then begin //'.map'
Result:=Envir;
Self.Add(Envir);
end else begin
MainOutMessage('地图文件 ' + g_Config.sMapDir + sMapName + '.nmp' + ' 未找到,或者加载出错!!!');
Envir.Free; //hint加
end;
end; //else
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;
if SEnvir.AddToMap(nSMapX,nSMapY,OS_GATEOBJECT,TObject(GateObj))<> nil then
Result:=True
else dispose(GateObj); //hint 泄露
end;
end;
//004B63E4
function TEnvirnoment.AddToMap(nX, nY: Integer; btType: Byte;
pRemoveObject: TObject):Pointer;
var
MapCellInfo:pTMapCellinfo;
OSObject:pTOSObject;
MapItem:PTMapItem;
i:integer;
nGoldCount,Ecode:Integer;
bo1E:Boolean;
btRaceServer:Byte;
ResourceString
sExceptionMsg = '[Exception] TEnvirnoment::AddToMap ECode %d';
begin
Result:=nil;
try
bo1E:=False;
if GetMapCellInfo(nX,nY,MapCellInfo) and (MapCellInfo.chFlag in [0,3]) then begin
Ecode:=0;
if MapCellInfo.ObjList = nil then begin
MapCellInfo.ObjList:=TList.Create;
end else begin
if btType = OS_ITEMOBJECT then begin
Ecode:=1;
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.CellObj=nil then continue;
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;
Ecode:=2;
end;
end;
end;
end;//004B653D
end;//004B653D
if not bo1E and (MapCellInfo.ObjList.Count >= 5) then begin
Result:=nil;
bo1E:=True;
Ecode:=3;
end;//004B6558
end;//004B6558
if btType = OS_EVENTOBJECT then begin
end;
end;//004B655C
if not bo1E then begin
Ecode:=4;
New(OSObject);
OSObject.btType:=btType;
OSObject.CellObj:=pRemoveObject;
OSObject.dwAddTime:=GetTickCount();
MapCellInfo.ObjList.Add(OSObject);
Result:=Pointer(pRemoveObject);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -