📄 usrengn.pas
字号:
if (nProcessPosition < MonGen.CertList.Count) and (MonGen.CertList.Count > 0) and (nProcessPosition >= 0) then begin
MonGen.CertList.Delete(nProcessPosition);
Exit;
end;
end; }
if Monster <> nil then begin
MainOutMessage(format(sExceptionMsg, [tCode, Monster.m_sCharName]));
MainOutMessage(E.Message);
end;
end;
end;
g_nMonTimeMin := GetTickCount - dwRunTick;
if g_nMonTimeMax < g_nMonTimeMin then g_nMonTimeMax := g_nMonTimeMin;
end;
function TUserEngine.GetGenMonCount(MonGen: pTMonGenInfo): Integer;
var
i: Integer;
nCount: Integer;
BaseObject: TBaseObject;
begin
nCount := 0;
for i := 0 to MonGen.CertList.Count - 1 do begin
BaseObject := TBaseObject(MonGen.CertList.Items[i]);
if BaseObject <> nil then begin
if not BaseObject.m_boDeath and not BaseObject.m_boGhost then Inc(nCount);
end;
end;
Result := nCount;
end;
function TUserEngine.InQuestNPCList(NPC: TNormNpc): Boolean;
var
i: Integer;
begin
Result := False;
for i := 0 to QuestNPCList.Count - 1 do begin
if (NPC <> nil) and (TNormNpc(QuestNPCList.Items[i]) = NPC) then begin
Result := True;
break;
end;
end;
end;
procedure TUserEngine.ProcessNpcs;
var
dwRunTick, dwCurrTick: LongWord;
i: Integer;
NPC: TNormNpc;
boProcessLimit: Boolean;
begin
dwRunTick := GetTickCount();
boProcessLimit := False;
try
dwCurrTick := GetTickCount();
for i := nNpcPosition to QuestNPCList.Count - 1 do begin
NPC := QuestNPCList.Items[i];
if NPC <> nil then begin
if not NPC.m_boGhost then begin
if Integer(dwCurrTick - NPC.m_dwRunTick) > NPC.m_nRunTime then begin
if (GetTickCount - NPC.m_dwSearchTick) > NPC.m_dwSearchTime then begin
NPC.m_dwSearchTick := GetTickCount();
NPC.SearchViewRange();
end;
if Integer(dwCurrTick - NPC.m_dwRunTick) > NPC.m_nRunTime then begin
NPC.m_dwRunTick := dwCurrTick;
NPC.Run;
end;
end;
end else begin
if (GetTickCount - NPC.m_dwGhostTick) > 60 * 1000 then begin
NPC.Free;
QuestNPCList.Delete(i);
break;
end;
end;
end;
if (GetTickCount - dwRunTick) > g_dwNpcLimit then begin
nNpcPosition := i;
boProcessLimit := True;
break;
end;
end;
if not boProcessLimit then begin
nNpcPosition := 0;
end;
except
MainOutMessage('[Exceptioin] TUserEngine.ProcessNpcs');
end;
dwProcessNpcTimeMin := GetTickCount - dwRunTick;
if dwProcessNpcTimeMin > dwProcessNpcTimeMax then dwProcessNpcTimeMax := dwProcessNpcTimeMin;
end;
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];
if MonGen <> nil then begin
MonGen.CertList.Add(BaseObject);
BaseObject.m_PEnvir.AddObject(1);
BaseObject.m_boAddToMaped := True;
end;
// MainOutMessage(format('MonGet Count:%d',[MonGen.CertList.Count]));
end;
Result := BaseObject;
end;
function TUserEngine.RegenPlayByName(PlayObject: TPlayObject; nX, nY: Integer;
sMonName: string): TBaseObject;
var
nRace: Integer;
BaseObject: TBaseObject;
n18: Integer;
MonGen: pTMonGenInfo;
begin
BaseObject := AddPlayObject(PlayObject, nX, nY, 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;
//var
// i:integer;
// dwProcessTick:LongWord;
resourcestring
sExceptionMsg = '[Exception] TUserEngine::Run';
begin
CalceTime := GetTickCount;
try
if (GetTickCount() - dwShowOnlineTick) > g_Config.dwConsoleShowUserCountTime then begin
dwShowOnlineTick := GetTickCount();
NoticeManager.LoadingNotice;
MainOutMessage('在线数: ' + IntToStr(GetUserCount));
g_CastleManager.Save;
end;
if (GetTickCount() - dwSendOnlineHumTime) > 10000 then begin
dwSendOnlineHumTime := GetTickCount();
FrmIDSoc.SendOnlineHumCountMsg(GetOnlineHumCount);
end;
if Assigned(zPlugOfEngine.UserEngineRun) then begin
try
zPlugOfEngine.UserEngineRun(Self);
except
end;
end;
except
on E: Exception do begin
MainOutMessage(sExceptionMsg);
MainOutMessage(E.Message);
end;
end;
end;
function TUserEngine.GetStdItem(nItemIdx: Integer): pTStdItem;
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;
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;
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;
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;
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;
function TUserEngine.MonGetRandomItems(mon: TBaseObject): Integer; //获取怪物爆物品
var
i: Integer;
ItemList: TList;
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]);
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);
var
StdItem: pTStdItem;
begin
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;
function TUserEngine.CopyToUserItemFromName(sItemName: string; Item: pTUserItem): Boolean;
var
i: In
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -