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

📄 usrengn.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  dwProcessNpcTimeMin := GetTickCount - dwRunTick;
  if dwProcessNpcTimeMin > dwProcessNpcTimeMax then
    dwProcessNpcTimeMax := dwProcessNpcTimeMin;
end;
//004ADE3C

function TUserEngine.RegenMonsterByName(sMAP: string; nX, nY: Integer;
  sMonName: string): TBaseObject;
var
  nRace                                 : Integer;
  BaseObject                            : TBaseObject;
  n18                                   : Integer;
  MonGen                                : pTMonGenInfo;
begin
  nRace := GetMonRace(sMonName);
  BaseObject := AddBaseObject(sMAP, nX, nY, nRace, sMonName);
  if BaseObject <> nil then
  begin
    n18 := m_MonGenList.Count - 1;
    if n18 < 0 then
      n18 := 0;
    MonGen := m_MonGenList.Items[n18];
    MonGen.CertList.Add(BaseObject);
    BaseObject.m_PEnvir.AddObject(1);
    BaseObject.m_boAddToMaped := True;
    //    MainOutMessage(format('MonGet Count:%d',[MonGen.CertList.Count]));
  end;

  Result := BaseObject;
end;

procedure TUserEngine.Run;                                  //004B20B8
var
 code:Integer;
resourcestring
  sExceptionMsg                         = '[Exception] TUserEngine::Run';
begin
  CalceTime := GetTickCount;
  try

    if (GetTickCount() - dwShowOnlineTick) > g_Config.dwConsoleShowUserCountTime
      then
    begin

      dwShowOnlineTick := GetTickCount();
      NoticeManager.LoadingNotice;

      MainOutMessage('在线数: ' + IntToStr(GetUserCount));
      code:=1;
      g_CastleManager.Save;
      code:=2;
    end;
    if (GetTickCount() - dwSendOnlineHumTime) > 10000 then
    begin
      dwSendOnlineHumTime := GetTickCount();
      code:=3;
      FrmIDSoc.SendOnlineHumCountMsg(GetOnlineHumCount);

    end;
  except
    on E: Exception do
    begin
      MainOutMessage(sExceptionMsg+'  code='+Inttostr(code));
          {$IF SHowErr = 1}
           MainOutMessage(E.Message);
          {$IFEND}
    end;
  end;


end;

function TUserEngine.GetStdItem(nItemIdx: Integer): pTStdItem; //004AC2F8
begin
  Result := nil;
  Dec(nItemIdx);
  if (nItemIdx >= 0) and (StdItemList.Count > nItemIdx) then
  begin
    Result := StdItemList.Items[nItemIdx];
    if Result.Name = '' then
      Result := nil;
  end;
end;

function TUserEngine.GetStdItem(sItemName: string): pTStdItem; //004AC348
var
  i                                     : Integer;
  StdItem                               : pTStdItem;
begin
  Result := nil;
  if sItemName = '' then
    exit;
  for i := 0 to StdItemList.Count - 1 do
  begin
    StdItem := StdItemList.Items[i];
    if CompareText(StdItem.Name, sItemName) = 0 then
    begin
      Result := StdItem;
      break;
    end;
  end;
end;

function TUserEngine.GetStdItemWeight(nItemIdx: Integer): Integer; //004AC2B0
var
  StdItem                               : pTStdItem;
begin
  Dec(nItemIdx);
  if (nItemIdx >= 0) and (StdItemList.Count > nItemIdx) then
  begin
    StdItem := StdItemList.Items[nItemIdx];
    Result := StdItem.Weight;
  end
  else
  begin
    Result := 0;
  end;
end;

function TUserEngine.GetStdItemName(nItemIdx: Integer): string; //004AC1AC
begin
  Result := '';
  Dec(nItemIdx);
  if (nItemIdx >= 0) and (StdItemList.Count > nItemIdx) then
  begin
    Result := pTStdItem(StdItemList.Items[nItemIdx]).Name;
  end
  else
    Result := '';
end;

function TUserEngine.FindOtherServerUser(sName: string;
  var nServerIndex): Boolean;
begin
  Result := False;
end;

//004AEA00

procedure TUserEngine.CryCry(wIdent: Word; pMap: TEnvirnoment; nX, nY,
  nWide: Integer; btFColor, btBColor: Byte; sMsg: string);
var
  i                                     : Integer;
  PlayObject                            : TPlayObject;
begin
  for i := 0 to m_PlayObjectList.Count - 1 do
  begin
    PlayObject := TPlayObject(m_PlayObjectList.Objects[i]);
    if not PlayObject.m_boGhost and
      (PlayObject.m_PEnvir = pMap) and
      (PlayObject.m_boBanShout) and
      (abs(PlayObject.m_nCurrX - nX) < nWide) and
      (abs(PlayObject.m_nCurrY - nY) < nWide) then
    begin

      //PlayObject.SendMsg(nil,wIdent,0,0,$FFFF,0,sMsg);
      PlayObject.SendMsg(nil, wIdent, 0, btFColor, btBColor, 0, sMsg);
    end;
  end;
end;

procedure TUserEngine.DemoRun;
begin
  Run();
end;

function TUserEngine.MonGetRandomItems(mon: TBaseObject): Integer; //004AD2E8
var
  i                                     : Integer;
  ItemList                              : TMyList;
  iname                                 : string;
  MonItem                               : pTMonItemInfo;
  UserItem                              : pTUserItem;
  StdItem                               : pTStdItem;
  Monster                               : pTMonInfo;
begin
  ItemList := nil;
  for i := 0 to MonsterList.Count - 1 do
  begin
    Monster := MonsterList.Items[i];
    if CompareText(Monster.sName, mon.m_sCharName) = 0 then
    begin
      ItemList := Monster.ItemList;
      break;
    end;
  end;
  if ItemList <> nil then
  begin
    for i := 0 to ItemList.Count - 1 do
    begin
      MonItem := pTMonItemInfo(ItemList[i]);
      Randomize;
      if Random(MonItem.MaxPoint) <= MonItem.SelPoint then
      begin
        if CompareText(MonItem.ItemName, sSTRING_GOLDNAME) = 0 then
        begin
          mon.m_nGold := mon.m_nGold + (MonItem.Count div 2) +
            Random(MonItem.Count);
        end
        else
        begin
          //蜡聪农 酒捞袍 捞亥飘....
          iname := '';
          ////if (BoUniqueItemEvent) and (not mon.BoAnimal) then begin
          ////   if GetUniqueEvnetItemName (iname, numb) then begin
                //numb; //iname
          ////   end;
          ////end;
          if iname = '' then
            iname := MonItem.ItemName;

          New(UserItem);
          if CopyToUserItemFromName(iname, UserItem) then
          begin
            UserItem.Dura := ROUND((UserItem.DuraMax / 100) * (20 +
              Random(80)));

            StdItem := GetStdItem(UserItem.wIndex);
            ////if pstd <> nil then
            ////   if pstd.StdMode = 50 then begin  //惑前鼻
            ////      pu.Dura := numb;
            ////   end;
            if Random(g_Config.nMonRandomAddValue {10}) = 0 then
              RandomUpgradeItem(UserItem);
            if StdItem.StdMode in [15, 19, 20, 21, 22, 23, 24, 26] then
            begin
              if (StdItem.Shape = 130) or (StdItem.Shape = 131) or (StdItem.Shape
                = 132) then
              begin
                GetUnknowItemValue(UserItem);
              end;
            end;
            mon.m_ItemList.Add(UserItem)
          end
          else
            DisPose(UserItem);
        end;
      end;
    end;
  end;
  Result := 1;
end;

procedure TUserEngine.RandomUpgradeItem(item: pTUserItem);  //004AD0C8
var
  StdItem                               : pTStdItem;
begin
  Randomize;


  StdItem := GetStdItem(item.wIndex);
  if StdItem = nil then
    exit;
  case StdItem.StdMode of
    5, 6: ItemUnit.RandomUpgradeWeapon(item);               //004AD14A
    10, 11: ItemUnit.RandomUpgradeDress(item);
    19: ItemUnit.RandomUpgrade19(item);
    20, 21, 24: ItemUnit.RandomUpgrade202124(item);
    26: ItemUnit.RandomUpgrade26(item);
    22: ItemUnit.RandomUpgrade22(item);
    23: ItemUnit.RandomUpgrade23(item);
    15: ItemUnit.RandomUpgradeHelMet(item);
  end;
end;

procedure TUserEngine.GetUnknowItemValue(item: pTUserItem); //004AD1D4
var
  StdItem                               : pTStdItem;
begin
  StdItem := GetStdItem(item.wIndex);
  if StdItem = nil then
    exit;
  case StdItem.StdMode of
    15: ItemUnit.UnknowHelmet(item);
    22, 23: ItemUnit.UnknowRing(item);
    24, 26: ItemUnit.UnknowNecklace(item);
  end;
end;

//004AC404

function TUserEngine.CopyToUserItemFromName(sItemName: string; item:
  pTUserItem): Boolean;
var
  i                                     : Integer;
  StdItem                               : pTStdItem;
begin
  Result := False;
  if sItemName <> '' then
  begin
    for i := 0 to StdItemList.Count - 1 do
    begin
      StdItem := StdItemList.Items[i];
      if CompareText(StdItem.Name, sItemName) = 0 then
      begin
        FillChar(item^, SizeOf(TUserItem), #0);
        item.wIndex := i + 1;
        item.MakeIndex := GetItemNumber();
        item.Dura := StdItem.DuraMax;
        item.DuraMax := StdItem.DuraMax;
        Result := True;
        break;
      end;
    end;
  end;
end;

procedure TUserEngine.ProcessUserMessage(PlayObject: TPlayObject; DefMsg:
  pTDefaultMessage; Buff: PChar);                           //004B232C
var
  sMsg                                  : string;
resourcestring
  sExceptionMsg                           =
    '[Exception] TUserEngine::ProcessUserMessage..';
begin
  if (DefMsg = nil) then
    exit;
  try
    if Buff = nil then
      sMsg := ''
    else
      sMsg := StrPas(Buff);

    case DefMsg.Ident of
      CM_SPELL:
        begin                                               //3017
          //if PlayObject.GetSpellMsgCount <=2 then  //如果队排里有超过二个魔法操作,则不加入队排
          if g_Config.boSpellSendUpdateMsg then
          begin //使用UpdateMsg 可以防止消息队列里有多个操作
            PlayObject.SendUpdateMsg(PlayObject,
              DefMsg.Ident,
              DefMsg.Tag,
              LoWord(DefMsg.Recog),
              HiWord(DefMsg.Recog),
              MakeLong(DefMsg.Param,
              DefMsg.Series),
              '');
          end
          else
          begin
            PlayObject.SendMsg(PlayObject,
              DefMsg.Ident,
              DefMsg.Tag,
              LoWord(DefMsg.Recog),
              HiWord(DefMsg.Recog),
              MakeLong(DefMsg.Param,
              DefMsg.Series),
              '');
          end;
        end;

      CM_QUERYUSERNAME:
        begin                                               //80
          PlayObject.SendMsg(PlayObject, DefMsg.Ident, 0, DefMsg.Recog,
            DefMsg.Param {x}, DefMsg.Tag {y}, '');
        end;

      CM_DROPITEM,
        CM_TAKEONITEM,
        CM_TAKEOFFITEM,
        CM_1005,

      CM_MERCHANTDLGSELECT,
        CM_MERCHANTQUERYSELLPRICE,
        CM_USERSELLITEM,
        CM_USERBUYITEM,
        CM_USERGETDETAILITEM,

      CM_CREATEGROUP,
        CM_ADDGROUPMEMBER,
        CM_DELGROUPMEMBER,
        CM_USERREPAIRITEM,
        CM_MERCHANTQUERYREPAIRCOST,
        CM_DEALTRY,
        CM_DEALADDITEM,
      

⌨️ 快捷键说明

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