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

📄 envir.pas

📁 M2原代码 M2原代码
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  bo1A:Boolean;
ResourceString
  sExceptionMsg = '[Exception] TEnvirnoment::MoveToMovingObject';
label
  Loop,Over;
begin
  Result:=0;
  try
    bo1A:=True;
    if not boFlag and GetMapCellInfo(nX,nY,MapCellInfo) then begin
      if MapCellInfo.chFlag = 0 then begin
        if MapCellInfo.ObjList <> nil then begin
          for i:=0 to MapCellInfo.ObjList.Count -1 do begin//004B61AD
            if pTOSObject(MapCellInfo.ObjList.Items[i]).btType = OS_MOVINGOBJECT then begin
              BaseObject:=TBaseObject(pTOSObject(MapCellInfo.ObjList.Items[i]).CellObj);
              if BaseObject <> nil then begin//004B61DB
                if not BaseObject.m_boGhost
                and BaseObject.bo2B9
                and not BaseObject.m_boDeath
                and not BaseObject.m_boFixedHideMode
                and not BaseObject.m_boObMode then begin
                  bo1A:=False;
                  Break;
                end;
              end;//004B6223
            end;//004B6223
          end;//004B622D
        end;//004B6238
      end else begin//004B622D   if MapCellInfo.chFlag = 0 then begin
        Result:= -1;
        bo1A:=False;
      end;//004B6238
    end;//004B6238
    if bo1A then begin  //004B6238
      if GetMapCellInfo(nX,nY,MapCellInfo) and (MapCellInfo.chFlag <> 0) then begin
        Result:= -1;
      end else begin//004B6265
        if GetMapCellInfo(nCX,nCY,MapCellInfo) and (MapCellInfo.ObjList <> nil) then begin
          i:=0;
          while (True) do begin
            if MapCellInfo.ObjList.Count <= i then break;
            OSObject:=MapCellInfo.ObjList.Items[i];
            if OSObject.btType = OS_MOVINGOBJECT then begin
              if TBaseObject(OSObject.CellObj) = TBaseObject(Cert) then begin
                MapCellInfo.ObjList.Delete(i);
                Dispose(OSObject);
                if MapCellInfo.ObjList.Count > 0 then Continue;
                MapCellInfo.ObjList.Free;
                MapCellInfo.ObjList:=nil;
                break;
              end;
             end;
            Inc(i);
          end;
        end;//4B6311
        if GetMapCellInfo(nX,nY,MapCellInfo) then begin
          if (MapCellInfo.ObjList = nil) then begin
            MapCellInfo.ObjList:=TList.Create;
          end;
          New(OSObject);
          OSObject.btType:=OS_MOVINGOBJECT;
          OSObject.CellObj:=Cert;
          OSObject.dwAddTime:=GetTickCount;
          MapCellInfo.ObjList.Add(OSObject);
          Result:=1;
        end;//004B6383
      end;//004B6383
    end;//004B6383
  except
    on e: Exception do begin
      MainOutMessage(sExceptionMsg);
      MainOutMessage(E.Message);
    end;
  end;
//  pMapCellInfo = GetMapCellInfo(nX, nY);
end;
//======================================================================
//检查地图指定座标是否可以移动
//boFlag  如果为TRUE 则忽略座标上是否有角色
//返回值 True 为可以移动,False 为不可以移动
//======================================================================
function TEnvirnoment.CanWalk(nX, nY: Integer; boFlag: Boolean): Boolean;//004B5ED0
var
  MapCellInfo:pTMapCellinfo;
  OSObject:pTOSObject;
  BaseObject       :TBaseObject;
  i:Integer;
begin
  Result:=False;
  if GetMapCellInfo(nX,nY,MapCellInfo) and (MapCellInfo.chFlag = 0) then begin
    Result:=True;
    if not boFlag 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
            and not BaseObject.m_boDeath
            and not BaseObject.m_boFixedHideMode
            and not BaseObject.m_boObMode then begin
              Result:=False;
              Break;
            end;
          end;//004B5FB5
        end;//004B5FB5
      end;
    end;
  end;//004B5FBD
end;

//======================================================================
//检查地图指定座标是否可以移动
//boFlag  如果为TRUE 则忽略座标上是否有角色
//返回值 True 为可以移动,False 为不可以移动
//======================================================================
function TEnvirnoment.CanWalkOfItem(nX, nY: Integer; boFlag,boItem: Boolean): Boolean;//004B5ED0
var
  MapCellInfo:pTMapCellinfo;
  OSObject:pTOSObject;
  BaseObject       :TBaseObject;
  i:Integer;
begin
  Result:=True;
  if GetMapCellInfo(nX,nY,MapCellInfo) and (MapCellInfo.chFlag = 0) then begin
//    Result:=True;
    if  (MapCellInfo.ObjList <> nil) then begin
      for i:=0 to MapCellInfo.ObjList.Count - 1 do begin
        OSObject:=MapCellInfo.ObjList.Items[i];
        if not boFlag and (OSObject.btType = OS_MOVINGOBJECT) then begin
          BaseObject:=TBaseObject(OSObject.CellObj);
          if BaseObject <> nil then begin
            if not BaseObject.m_boGhost
            and BaseObject.bo2B9
            and not BaseObject.m_boDeath
            and not BaseObject.m_boFixedHideMode
            and not BaseObject.m_boObMode then begin
              Result:=False;
              Break;
            end;
          end;//004B5FB5
        end;//004B5FB5
        if not boItem and (OSObject.btType = OS_ITEMOBJECT) then begin
          Result:=False;
          break;
        end;
      end;
    end;
  end;//004B5FBD
end;

function TEnvirnoment.CanWalkEx(nX, nY: Integer; boFlag: Boolean): Boolean;//004B5ED0
var
  MapCellInfo:pTMapCellinfo;
  OSObject:pTOSObject;
  BaseObject       :TBaseObject;
  i:Integer;
  Castle:TUserCastle;
begin
  Result:=False;
  if GetMapCellInfo(nX,nY,MapCellInfo) and (MapCellInfo.chFlag = 0) then begin
    Result:=True;
    if not boFlag 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
            {//01/25 多城堡 控制
            if g_Config.boWarDisHumRun and UserCastle.m_boUnderWar and
              UserCastle.InCastleWarArea(BaseObject.m_PEnvir,BaseObject.m_nCurrX,BaseObject.m_nCurrY) then begin
            }
            Castle:=g_CastleManager.InCastleWarArea(BaseObject);
            if g_Config.boWarDisHumRun and (Castle <> nil) and (Castle.m_boUnderWar) then begin
            end else begin
              if BaseObject.m_btRaceServer =RC_PLAYOBJECT then begin
                if g_Config.boRunHuman or m_boRUNHUMAN then Continue;
              end else begin
                if BaseObject.m_btRaceServer = RC_NPC then begin
                  if g_Config.boRunNpc then Continue;
                end else begin
                  if BaseObject.m_btRaceServer in [RC_GUARD,RC_ARCHERGUARD] then begin
                    if g_Config.boRunGuard then Continue;
                  end else begin
                    if g_Config.boRunMon or m_boRUNMON then Continue;
                  end;
                end;
              end;
            end;

            if not BaseObject.m_boGhost
            and BaseObject.bo2B9
            and not BaseObject.m_boDeath
            and not BaseObject.m_boFixedHideMode
            and not BaseObject.m_boObMode then begin
              Result:=False;
              Break;
            end;
          end;//004B5FB5
        end;//004B5FB5
      end;
    end;
  end;//004B5FBD
end;

constructor TMapManager.Create;
begin
  inherited Create;
end;

destructor TMapManager.Destroy;
var
  I: Integer;
begin
  for I := 0 to Count - 1 do begin
    TEnvirnoment(Items[I]).Free;
  end;
  inherited;
end;
     //Envir:TEnvirnoment
function TMapManager.FindMap(sMapName: String): TEnvirnoment;//4B7350
var
  Map:TEnvirnoment;
  i:Integer;
begin
  Result:=nil;
  Lock;
  try
    for i:=0 to Count -1 do begin
      Map:=TEnvirnoment(Items[i]);
      if CompareText(Map.sMapName,sMapName) = 0 then begin
        Result:=Map;
        Break;
      end;
    end;
  finally
    UnLock;
  end;
end;

function TMapManager.GetMapInfo(nServerIdx: Integer;sMapName: String): TEnvirnoment; //004B7424
var
  i:Integer;
  Envir:TEnvirnoment;
begin
  Result:=nil;
  Lock;
  try
    for i:=0 to Count -1 do begin
      Envir:=Items[i];
      if (Envir.nServerIndex = nServerIdx) and (CompareText(Envir.sMapName,sMapName) = 0) then begin
        Result:=Envir;
        break;
      end;
    end;//004B74C8
  finally
    Unlock;
  end;
end;

function TEnvirnoment.DeleteFromMap(nX, nY: Integer; btType: Byte;
  pRemoveObject: TObject): Integer; //004B6710
var
  MapCellInfo:pTMapCellinfo;
  OSObject:pTOSObject;
  n18:integer;
  btRaceServer:Byte;
ResourceString
  sExceptionMsg1 = '[Exception] TEnvirnoment::DeleteFromMap -> Except 1 ** %d';
  sExceptionMsg2 = '[Exception] TEnvirnoment::DeleteFromMap -> Except 2 ** %d';
begin
  Result:= -1;
  try
    if GetMapCellInfo(nX,nY,MapCellInfo) then begin
      if MapCellInfo <> nil then begin
        try
          if MapCellInfo.ObjList <> nil then begin
            n18:=0;
            while (True) do begin
              if MapCellInfo.ObjList.Count <= n18 then break;
              OSObject:=MapCellInfo.ObjList.Items[n18];
              if OSObject <> nil then begin
                if (OSObject.btType = btType) and (OSObject.CellObj = pRemoveObject) then begin
                  MapCellInfo.ObjList.Delete(n18);
                  DisPose(OSObject);
                  Result:=1;
                  //减地图人物怪物计数
                  if (btType = OS_MOVINGOBJECT) and (not TBaseObject(pRemoveObject).m_boDelFormMaped) then begin
                    TBaseObject(pRemoveObject).m_boDelFormMaped:=True;
                    TBaseObject(pRemoveObject).m_boAddToMaped:=False;
                    btRaceServer:=TBaseObject(pRemoveObject).m_btRaceServer;
                    if btRaceServer = RC_PLAYOBJECT then Inc(m_nHumCount);
                    if btRaceServer >= RC_ANIMAL then Inc(m_nMonCount);
                  end;

                  if MapCellInfo.ObjList.Count > 0 then Continue;
                  MapCellInfo.ObjList.Free;
                  MapCellInfo.ObjList:=nil;
                  break;
                  {//Jacky 处理防止内存泄露 有待换上
                  if MapCellInfo.ObjList.Count <= 0 then begin
                    MapCellInfo.ObjList.Free;
                    MapCellInfo.ObjList:=nil;
                  end;
                  break;
                  }
                end
              end else begin
                MapCellInfo.ObjList.Delete(n18);
                if MapCellInfo.ObjList.Count > 0 then Continue;
                MapCellInfo.ObjList.Free;
                MapCellInfo.ObjList:=nil;
                break;
              end;
              Inc(n18);
            end;
          end else begin
            Result:= -2;
          end;
        except
          OSObject:=nil;
          MainOutMessage(format(sExceptionMsg1,[btType]));
        end;
      end else Result:= -3;
    end else Result:=0;
  except
    MainOutMessage(format(sExceptionMsg2,[btType]));
  end;
end;

function TEnvirnoment.GetItem(nX, nY: Integer): PTMapItem; //004B5B0C
var
  I: Integer;
  MapCellInfo:pTMapCellinfo;
  OSObject:pTOSObject;
  BaseObject:TBaseObject;
begin
  Result:=nil;
  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:=PTMapItem(OSObject.CellObj);
          exit;
        end;
        if OSObject.btType = OS_GATEOBJECT then
          bo2C:=False;
        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 TMapManager.GetMapOfServerIndex(sMapName: String): Integer; //004B7510
var
  i:Integer;
  Envir:TEnvirnoment;
begin

⌨️ 快捷键说明

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