⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 envirok.pas

📁 传世源码可编译的,功能齐全.是学习的好模版,会DELPHI的朋友们也可以自己修改,弄个自己的引擎.
💻 PAS
📖 第 1 页 / 共 4 页
字号:
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_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_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; //xjs加
     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; //xjs加
    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;
    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 in [0,3]) 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);

     on e: Exception do begin
      MainOutMessage(sExceptionMsg);
      MainOutMessage(E.Message);
     end;
  end;
end;

procedure TEnvirnoment.AddDoorToMap(); //004B6A74
var

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -