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

📄 usrengn.pas

📁 传世源码可编译的,功能齐全.是学习的好模版,会DELPHI的朋友们也可以自己修改,弄个自己的引擎.
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  for i:=0 to m_MonGenList.Count -1 do begin
    MonGen:=m_MonGenList.Items[i];
    if MonGen <> nil then begin
      MonGen.nRace:= GetMonRace(MonGen.sMonName);
    end;
  end;
end;

function TUserEngine.GetMonRace(sMonName:String):Integer;
var
  i:integer;
  MonInfo:pTMonInfo;
begin
  Result:= -1;
    for i:=0 to MonsterList.Count -1 do begin
      MonInfo:=MonsterList.Items[i];
      if CompareText(MonInfo.sName,sMonName) = 0 then begin
        Result:=MonInfo.btRace;
        break;
      end;
    end;
end;

procedure TUserEngine.MerchantInitialize;
var
  I: Integer;
  Merchant:TMerchant;
  sCaption:String;
begin
  sCaption:=FrmMain.Caption;
  m_MerchantList.Lock;
  try
     for I := m_MerchantList.Count - 1 downto 0 do begin
      Merchant:=TMerchant(m_MerchantList.Items[i]);
      Merchant.m_PEnvir:=g_MapManager.FindMap(Merchant.m_sMapName);
      if Merchant.m_PEnvir <> nil then begin
        Merchant.Initialize;
        if Merchant.m_boAddtoMapSuccess and (not Merchant.m_boIsHide) then begin
          MainOutMessage('Merchant Initalize fail...' + Merchant.m_sCharName + ' ' + Merchant.m_sMapName + '(' + IntToStr(Merchant.m_nCurrX) + ':' + IntToStr(Merchant.m_nCurrY) + ')');
          m_MerchantList.Delete(i);
          Merchant.Free;
        end else begin
          Merchant.LoadNPCScript();   //加载NPC脚本
          Merchant.LoadNPCData();
        end;
      end else begin
        MainOutMessage(Merchant.m_sCharName + 'Merchant Initalize fail... (m.PEnvir=nil)');
        m_MerchantList.Delete(i);
        Merchant.Free;
      end;
      FrmMain.Caption:=sCaption + '[正在初始交易NPC(' + IntToStr(m_MerchantList.Count) + '/' + IntToStr(m_MerchantList.Count - I) + ')]';
    end;
  finally
    m_MerchantList.UnLock;
  end;
end;

procedure TUserEngine.NPCinitialize;
var
  I: Integer;
  NormNpc:TNormNpc;
begin
  for I := QuestNPCList.Count - 1 downto 0 do begin
    NormNpc:=TNormNpc(QuestNPCList.Items[i]);
    NormNpc.m_PEnvir:=g_MapManager.FindMap(NormNpc.m_sMapName);
    if NormNpc.m_PEnvir <> nil then begin
      NormNpc.Initialize;
      if NormNpc.m_boAddtoMapSuccess and (not NormNpc.m_boIsHide) then begin
        MainOutMessage(NormNpc.m_sCharName + ' Npc Initalize fail... ');
        QuestNPCList.Delete(i);
        NormNpc.Free;
      end else begin
        NormNpc.LoadNPCScript();
      end;
    end else begin
      MainOutMessage(NormNpc.m_sCharName + ' Npc Initalize fail... (npc.PEnvir=nil) ');
      QuestNPCList.Delete(i);
      NormNpc.Free;
    end;

  end;
end;

function TUserEngine.GetLoadPlayCount: Integer;
begin
  Result:= m_LoadPlayList.Count;
end;

function TUserEngine.GetOnlineHumCount: Integer;
begin
  Result:= m_PlayObjectList.Count;
end;

function TUserEngine.GetUserCount: Integer;
begin
  Result:= m_PlayObjectList.Count + m_StringList_0C.Count;
end;

procedure TUserEngine.ProcessHumans;
  function IsLogined(sChrName:String):Boolean;
  var
    i:Integer;
  begin
    Result:=False;
    if FrontEngine.InSaveRcdList(sChrName) then begin
      Result:=True;
    end else begin
      for i:= 0 to m_PlayObjectList.Count - 1 do begin
        if CompareText(m_PlayObjectList.Strings[i], sChrName) = 0 then begin
          Result:=True;
          break;
        end;
      end;
    end;
  end;

  function MakeNewHuman(UserOpenInfo:pTUserOpenInfo):TPlayObject;
  var
    PlayObject,hum:TPlayObject;
    Abil:pTAbility;
    Envir:TEnvirnoment;
    nC,nX,nY:integer;
    SwitchDataInfo:pTSwitchDataInfo;
    Castle:TUserCastle;
    canwalk:boolean;
  ResourceString
    sExceptionMsg      = '[Exception] TUserEngine::MakeNewHuman';
    sChangeServerFail1 = 'chg-server-fail-1 [%d] -> [%d] [%s]';
    sChangeServerFail2 = 'chg-server-fail-2 [%d] -> [%d] [%s]';
    sChangeServerFail3 = 'chg-server-fail-3 [%d] -> [%d] [%s]';
    sChangeServerFail4 = 'chg-server-fail-4 [%d] -> [%d] [%s]';
    sErrorEnvirIsNil   = '[Error] PlayObject.PEnvir = nil';
  label
    ReGetMap;
  begin
    Result:=nil;
    try
      PlayObject:=TPlayObject.Create;

      if not g_Config.boVentureServer then begin
        UserOpenInfo.sChrName:='';
        UserOpenInfo.LoadUser.nSessionID:=0;
        SwitchDataInfo:=GetSwitchData(UserOpenInfo.sChrName,UserOpenInfo.LoadUser.nSessionID);
      end else SwitchDataInfo:=nil;

      SwitchDataInfo := nil;

      if SwitchDataInfo = nil then begin
        GetHumData(PlayObject,UserOpenInfo.HumanRcd);
        PlayObject.m_btRaceServer:= RC_PLAYOBJECT;
        if PlayObject.m_sHomeMap = '' then begin
          ReGetMap:
            PlayObject.m_sHomeMap:=GetHomeInfo(PlayObject.m_nHomeX,PlayObject.m_nHomeY);
            PlayObject.m_sMapName:=PlayObject.m_sHomeMap;
            PlayObject.m_nCurrX:=GetRandHomeX(PlayObject);
            PlayObject.m_nCurrY:=GetRandHomeY(PlayObject);
            if PlayObject.m_Abil.Level = 0 then begin
              Abil:=@PlayObject.m_Abil;
              Abil.Level:=1;
              Abil.AC:=0;
              Abil.MAC:=0;
              Abil.DC:=MakeLong(1,2);
              Abil.MC:=MakeLong(1,2);
              Abil.SC:=MakeLong(1,2);
              Abil.MP:=15;
              Abil.HP:=15;
              Abil.MaxHP:=15;
              Abil.MaxMP:=15;
              Abil.Exp:=0;
              Abil.MaxExp:=100;
              Abil.Weight:=0;
              Abil.MaxWeight:=30;
              PlayObject.m_boNewHuman:=True;
            end;
        end;
        Envir:=g_MapManager.GetMapInfo(nServerIndex,PlayObject.m_sMapName);
        if Envir <> nil then begin
          if Envir.m_boFight3Zone then begin //是否在行会战争地图死亡
            if (PlayObject.m_Abil.HP <= 0) and (PlayObject.m_nFightZoneDieCount < 3) then begin
              PlayObject.m_Abil.HP:=PlayObject.m_Abil.MaxHP;
              PlayObject.m_Abil.MP:=PlayObject.m_Abil.MaxMP;
              PlayObject.m_boDieInFight3Zone:=True;
            end else PlayObject.m_nFightZoneDieCount:=0;
          end;
        end;

        PlayObject.m_MyGuild:=g_GuildManager.MemberOfGuild(PlayObject.m_sCharName);
        Castle:=g_CastleManager.InCastleWarArea(Envir,PlayObject.m_nCurrX,PlayObject.m_nCurrY);
        if (Envir <> nil) and (Castle <> nil) and ((Castle.m_MapPalace = Envir) or Castle.m_boUnderWar) then begin
          Castle:=g_CastleManager.IsCastleMember(PlayObject);

          if Castle = nil then begin
            PlayObject.m_sMapName:=PlayObject.m_sHomeMap;
            PlayObject.m_nCurrX:=PlayObject.m_nHomeX - 2 + Random(5);
            PlayObject.m_nCurrY:=PlayObject.m_nHomeY - 2 + Random(5);
          end else begin
            if Castle.m_MapPalace = Envir then begin
              PlayObject.m_sMapName:=Castle.GetMapName();
              PlayObject.m_nCurrX:=Castle.GetHomeX;
              PlayObject.m_nCurrY:=Castle.GetHomeY;
            end;
           end;
        end; //004B00C0

        if (PlayObject.nC4 <= 1) and (PlayObject.m_Abil.Level >= 1) then
          PlayObject.nC4:=2;
        if g_MapManager.FindMap(PlayObject.m_sMapName) = nil then
          PlayObject.m_Abil.HP:=0;
        if PlayObject.m_Abil.HP <= 0 then begin
          PlayObject.ClearStatusTime();
          if PlayObject.PKLevel < 2 then begin
            Castle:=g_CastleManager.IsCastleMember(PlayObject);
            if (Castle <> nil) and Castle.m_boUnderWar then begin
              PlayObject.m_sMapName:=Castle.m_sHomeMap;
              PlayObject.m_nCurrX:=Castle.GetHomeX;
              PlayObject.m_nCurrY:=Castle.GetHomeY;
            end else begin
              PlayObject.m_sMapName:=PlayObject.m_sHomeMap;
              PlayObject.m_nCurrX:=PlayObject.m_nHomeX - 2 + Random(5);
              PlayObject.m_nCurrY:=PlayObject.m_nHomeY - 2 + Random(5);
            end;
          end else begin
            PlayObject.m_sMapName:=g_Config.sRedDieHomeMap{'3'};
            PlayObject.m_nCurrX:=Random(13) + g_Config.nRedDieHomeX{839};
            PlayObject.m_nCurrY:=Random(13) + g_Config.nRedDieHomeY{668};
          end;
          PlayObject.m_Abil.HP:=14;
        end;

        PlayObject.AbilCopyToWAbil();
        Envir:=g_MapManager.GetMapInfo(nServerIndex,PlayObject.m_sMapName);
        if Envir = nil then begin
          PlayObject.m_nSessionID:=UserOpenInfo.LoadUser.nSessionID;
          PlayObject.m_nSocket:=UserOpenInfo.LoadUser.nSocket;
          PlayObject.m_nGateIdx:=UserOpenInfo.LoadUser.nGateIdx;
          PlayObject.m_nGSocketIdx:=UserOpenInfo.LoadUser.nGSocketIdx;
          PlayObject.m_WAbil:=PlayObject.m_Abil;
          PlayObject.m_nServerIndex:=g_MapManager.GetMapOfServerIndex(PlayObject.m_sMapName);
          if PlayObject.m_Abil.HP <> 14 then begin // 14
            MainOutMessage(format(sChangeServerFail1,[nServerIndex,PlayObject.m_nServerIndex,PlayObject.m_sMapName]));
          end;
          SendSwitchData(PlayObject,PlayObject.m_nServerIndex);
          SendChangeServer(PlayObject,PlayObject.m_nServerIndex);
          PlayObject.Free;
          MainOutMessage('HiTe:PlayObject Free');
          exit;
        end;
        nC:=0;
        canwalk:=false;
        if PlayObject.sYsnameMaster<>'' then begin  //如果是元神
                  PlayObject.ysmasterplayer:=nil;
                  hum:=nil;
                  hum:=UserEngine.GetPlayObjectEx(PlayObject.sYsnameMaster);
                   if hum<>nil then begin
                      Envir:= hum.m_PEnvir ;
                      hum.GetFrontPosition(nX,nY);
                      PlayObject.m_nCurrX:=nX;
                      PlayObject.m_nCurrY:=nY;
                       PlayObject.ysmasterplayer:=hum;  //建立人物元神关系
                       hum.Ysplayer:=PlayObject;
                       hum.nyssex :=PlayObject.m_btGender ;    //元神性别
                       hum.wyslevel:=PlayObject.m_Abil.Level;   //元神登级
                       hum.nysjob := PlayObject.m_btjob;        //元神职业
                       PlayObject.M_YSfenghao:=hum.M_YSfenghao ;//元神的封号保存在人物身上
                   end;
                   
                   while (True) do begin
                    if Envir.CanWalk(PlayObject.m_nCurrX,PlayObject.m_nCurrY,True) then  begin
                      canwalk:=true;
                      break;
                    end;
                    PlayObject.m_nCurrX:=PlayObject.m_nCurrX - 3 + Random(6);
                    PlayObject.m_nCurrY:=PlayObject.m_nCurrY - 3 + Random(6);

                    Inc(nC);
                    if nC >= 10 then break;
                  end;  //true

        end  //如果是元神
       else begin
        while (True) do begin
          if Envir.CanWalk(PlayObject.m_nCurrX,PlayObject.m_nCurrY,True) then  begin
            canwalk:=true;
            break;
          end;
          PlayObject.m_nCurrX:=PlayObject.m_nCurrX - 3 + Random(6);
          PlayObject.m_nCurrY:=PlayObject.m_nCurrY - 3 + Random(6);

          Inc(nC);
          if nC >= 5 then break;
        end;
       end;

        if not canwalk then begin
          PlayObject.m_sMapName:=g_Config.sHomeMap;
          Envir:=g_MapManager.FindMap(g_Config.sHomeMap);
          PlayObject.m_nCurrX:=g_Config.nHomeX;
          PlayObject.m_nCurrY:=g_Config.nHomeY;
        end;

        PlayObject.m_PEnvir:=Envir;
        if PlayObject.m_PEnvir = nil then begin
          MainOutMessage(sErrorEnvirIsNil);
          goto ReGetMap;
        end else begin
          PlayObject.m_boReadyRun:=False;
        end;
      end else begin //004B0561
        GetHumData(PlayObject,UserOpenInfo.HumanRcd);
        PlayObject.m_sMapName:=SwitchDataInfo.sMap;
        PlayObject.m_nCurrX:=SwitchDataInfo.wX;
        PlayObject.m_nCurrY:=SwitchDataInfo.wY;
        PlayObject.m_Abil:=SwitchDataInfo.Abil;
        PlayObject.m_WAbil:=SwitchDataInfo.Abil;
        LoadSwitchData(SwitchDataInfo,PlayObject);
        DelSwitchData(SwitchDataInfo);
        Envir:=g_MapManager.GetMapInfo(nServerIndex,PlayObject.m_sMapName);
        if Envir <> nil then begin
          MainOutMessage(format(sChangeServerFail3,[nServerIndex,PlayObject.m_nServerIndex,PlayObject.m_sMapName]));
          PlayObject.m_sMapName:=g_Config.sHomeMap;
          Envir:=g_MapManager.FindMap(g_Config.sHomeMap);
          PlayObject.m_nCurrX:=g_Config.nHomeX;
          PlayObject.m_nCurrY:=g_Config.nHomeY;
        end else begin
          if not Envir.CanWalk(PlayObject.m_nCurrX,PlayObject.m_nCurrY,True) then begin
            MainOutMessage(format(sChangeServerFail4,[nServerIndex,PlayObject.m_nServerIndex,PlayObject.m_sMapName]));
            PlayObject.m_sMapName:=g_Config.sHomeMap;
            Envir:=g_MapManager.FindMap(g_Config.sHomeMap);
            PlayObject.m_nCurrX:=g_Config.nHomeX;
            PlayObject.m_nCurrY:=g_Config.nHomeY;
          end;
          PlayObject.AbilCopyToWAbil();
          PlayObject.m_PEnvir:=Envir;
          if PlayObject.m_PEnvir = nil then begin
            MainOutMessage(sErrorEnvirIsNil);
            goto ReGetMap;
          end else begin
            PlayObject.m_boReadyRun:=False;
            PlayObject.m_boLoginNoticeOK:=True;
            PlayObject.bo6AB:=True;
          end;
        end;
      end;//004B085C
      PlayObject.m_sUserID:=UserOpenInfo.LoadUser.sAccount;
      PlayObject.m_sIPaddr:=UserOpenInfo.LoadUser.sIPaddr;
      PlayObject.m_sIPLocal:=GetIPLocal(PlayObject.m_sIPaddr);
      PlayObject.m_nSocket:=UserOpenInfo.LoadUser.nSocket;
      PlayObject.m_nGSocketIdx:=UserOpenInfo.LoadUser.nGSocketIdx;
      PlayObject.m_nGateIdx:=UserOpenInfo.LoadUser.nGateIdx;

⌨️ 快捷键说明

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