📄 usrengn.pas
字号:
unit UsrEngn;
interface
uses
Windows, Classes, SysUtils, StrUtils, Forms, ObjBase, ObjNpc, Envir, Grobal2,
MudUtil, FrnEngn,mylist ;
type
TMonGenInfo = record
sMapName: string[14];
nX: Integer;
nY: Integer;
sMonName: string[14];
nAreaX: Integer;
nAreaY: Integer;
nCount: Integer;
nRange: Integer;
nMissionGenRate: Integer;
nRace: Integer;
dwZenTime: LongWord;
dwStartTime: LongWord;
CertList: TMyList;
Envir: TEnvirnoment;
dwStartTick: Dword;
end;
pTMonGenInfo = ^TMonGenInfo;
TUserEngine = class
m_LoadPlaySection: TRTLCriticalSection;
m_LoadPlayList: TStringList; //从DB读取人物数据
m_PlayObjectList: TStringList; //0x8
m_StringList_0C: TStringList;
m_PlayObjectFreeList: TMyList; //0x10
m_ChangeHumanDBGoldList: TMyList; //0x14
dwShowOnlineTick: LongWord; //0x18
dwSendOnlineHumTime: LongWord; //0x1C
dwProcessMapDoorTick: LongWord; //0x20
dwProcessMissionsTime: LongWord; //0x24
dwRegenMonstersTick: LongWord; //0x28
CalceTime: LongWord; //0x2C
m_dwProcessLoadPlayTick: LongWord; //0x30
// dwTime_34: LongWord; //0x34
m_nCurrMonGen: Integer; //0x38
m_nMonGenListPosition: Integer; //0x3C
m_nMonGenCertListPosition: Integer; //0x40
m_nProcHumIDx: Integer; //0x44 处理人物开始索引(每次处理人物数限制)
nProcessHumanLoopTime: Integer;
nMerchantPosition: Integer; //0x4C
nNpcPosition: Integer; //0x50
StdItemList: TMyList; //List_54
MonsterList: TMyList; //List_58
m_MonGenList: TMyList; //List_5C
m_MonFreeList: TMyList;
m_MagicList: TMyList; //List_60
m_AdminList: TGList; //List_64
m_MerchantList: TGList; //List_68
QuestNPCList: TMyList; //0x6C
// List_70: TList;
m_ChangeServerList: TMyList;
m_MagicEventList: TMyList; //0x78
nMonsterCount: Integer; //怪物总数
nMonsterProcessPostion: Integer; //0x80处理怪物总数位置,用于计算怪物总数
n84: Integer;
nMonsterProcessCount: Integer; //0x88处理怪物数,用于统计处理怪物个数
boItemEvent: Boolean; //ItemEvent
n90: Integer;
dwProcessMonstersTick: LongWord;
dwProcessMerchantTimeMin: Integer;
dwProcessMerchantTimeMax: Integer;
dwProcessNpcTimeMin: LongWord;
dwProcessNpcTimeMax: LongWord;
m_NewHumanList: TMyList;
m_ListOfGateIdx: TMyList;
m_ListOfSocket: TMyList;
OldMagicList: TMyList;
private
procedure ProcessHumans();
procedure ProcessMonsters();
procedure ProcessMerchants();
procedure ProcessNpcs();
procedure ProcessMissions();
procedure Process4AECFC();
procedure ProcessEvents();
procedure ProcessMapDoor();
procedure NPCinitialize;
procedure MerchantInitialize;
function MonGetRandomItems(mon: TBaseObject): Integer;
function RegenMonsters(MonGen: pTMonGenInfo; nCount: Integer): Boolean;
procedure WriteShiftUserData;
function GetGenMonCount(MonGen: pTMonGenInfo): Integer;
function AddBaseObject(sMapName: string; nX, nY: Integer; nMonRace: Integer;
sMonName: string): TBaseObject;
procedure GenShiftUserData();
procedure KickOnlineUser(sChrName: string);
function SendSwitchData(PlayObject: TPlayObject; nServerIndex: Integer):
Boolean;
procedure SendChangeServer(PlayObject: TPlayObject; nServerIndex: Integer);
procedure AddToHumanFreeList(PlayObject: TPlayObject);
procedure GetHumData(PlayObject: TPlayObject; var HumanRcd: THumDataInfo);
function GetHomeInfo(var nX: Integer; var nY: Integer): string;
function GetRandHomeX(PlayObject: TPlayObject): Integer;
function GetRandHomeY(PlayObject: TPlayObject): Integer;
function GetSwitchData(sChrName: string; nCode: Integer): pTSwitchDataInfo;
procedure LoadSwitchData(SwitchData: pTSwitchDataInfo; var PlayObject:
TPlayObject);
procedure DelSwitchData(SwitchData: pTSwitchDataInfo);
procedure MonInitialize(BaseObject: TBaseObject; sMonName: string);
function MapRageHuman(sMapName: string; nMapX, nMapY, nRage: Integer):
Boolean;
function GetOnlineHumCount(): Integer;
function GetUserCount(): Integer;
function GetLoadPlayCount(): Integer;
public
constructor Create();
destructor Destroy; override;
procedure Initialize();
procedure ClearItemList(); virtual;
procedure SwitchMagicList();
procedure SaveHumanRcd(PlayObject: TPlayObject);
procedure Run();
procedure PrcocessData();
procedure Execute;
function RegenMonsterByName(sMAP: string; nX, nY: Integer; sMonName:
string): TBaseObject;
function GetStdItem(nItemIdx: Integer): pTStdItem; overload;
function GetStdItem(sItemName: string): pTStdItem; overload;
function GetStdItemWeight(nItemIdx: Integer): Integer;
function GetStdItemName(nItemIdx: Integer): string;
function GetStdItemIdx(sItemName: string): Integer;
function FindOtherServerUser(sName: string; var nServerIndex): Boolean;
procedure CryCry(wIdent: Word; pMap: TEnvirnoment; nX, nY, nWide: Integer;
btFColor, btBColor: Byte; sMsg: string);
procedure ProcessUserMessage(PlayObject: TPlayObject; DefMsg:
pTDefaultMessage; Buff: PChar);
procedure SendServerGroupMsg(nCode, nServerIdx: Integer; sMsg: string);
function GetMonRace(sMonName: string): Integer;
function GetPlayObject(sName: string): TPlayObject;
function FindPlayObject(Playobject: TObject): TPlayObject;
function GetPlayObjectEx(sName: string;dbindex:Integer): TPlayObject;
procedure KickPlayObjectEx(sName: string);
function FindMerchant(Merchant: TObject): TMerchant;
function FindNPC(GuildOfficial: TObject): TGuildOfficial;
function CopyToUserItemFromName(sItemName: string; item: pTUserItem):
Boolean;
function GetMapOfRangeHumanCount(Envir: TEnvirnoment; nX, nY, nRange:
Integer): Integer;
function GetHumPermission(sUserName: string; var
btPermission: Byte): Boolean;
procedure AddUserOpenInfo(UserOpenInfo: pTUserOpenInfo);
procedure RandomUpgradeItem(item: pTUserItem);
procedure GetUnknowItemValue(item: pTUserItem);
function OpenDoor(Envir: TEnvirnoment; nX, nY: Integer): Boolean;
function CloseDoor(Envir: TEnvirnoment; Door: pTDoorInfo): Boolean;
procedure SendDoorStatus(Envir: TEnvirnoment; nX, nY: Integer; wIdent, wX:
Word; nDoorX, nDoorY, nA: Integer; sStr: string);
function FindMagic(sMagicName: string): pTMagic; overload;
function FindMagic(nMagIdx: Integer): pTMagic; overload;
procedure AddMerchant(Merchant: TMerchant);
function GetMerchantList(Envir: TEnvirnoment; nX, nY, nRange: Integer;
TmpList: TMyList): Integer;
function GetNpcList(Envir: TEnvirnoment; nX, nY, nRange: Integer; TmpList:
TMyList): Integer;
procedure ReloadMerchantList();
procedure ReloadNpcList();
procedure HumanExpire(sAccount: string);
function GetMapMonster(Envir: TEnvirnoment; List: TMyList): Integer;
function GetMapRangeMonster(Envir: TEnvirnoment; nX, nY, nRange: Integer;
List: TMyList): Integer;
function GetMapHuman(sMapName: string): Integer;
function GetMapRageHuman(Envir: TEnvirnoment; nRageX, nRageY, nRage:
Integer; List: TmyList): Integer;
procedure SendBroadCastMsg(sMsg: string; MsgType: TMsgType);
procedure SendBroadCastMsgExt(sMsg: string; MsgType: TMsgType);
procedure sub_4AE514(GoldChangeInfo: pTGoldChangeInfo);
procedure ClearMonSayMsg();
procedure SendQuestMsg(sQuestName: string);
procedure DemoRun();
procedure ClearMerchantData();
property MonsterCount: Integer read nMonsterCount;
property OnlinePlayObject: Integer read GetOnlineHumCount;
property PlayObjectCount: Integer read GetUserCount;
property LoadPlayCount: Integer read GetLoadPlayCount;
end;
var
g_dwEngineTick : LongWord;
g_dwEngineRunTime : LongWord;
implementation
uses IdSrvClient, Guild, ObjMon, M2Share, EDcode, ObjGuard, ObjAxeMon,
ObjMon2, Event, InterMsgClient, InterServerMsg, ObjRobot, HUtil32, svMain,
Castle;
var
nEngRemoteRun : Integer = -1;
tt : Integer;
{ TUserEngine }
constructor TUserEngine.Create();
begin
InitializeCriticalSection(m_LoadPlaySection);
m_LoadPlayList := TStringList.Create;
m_PlayObjectList := TStringList.Create;
m_StringList_0C := TStringList.Create;
m_PlayObjectFreeList := TMyList.create;
m_ChangeHumanDBGoldList := TMyList.create;
dwShowOnlineTick := GetTickCount;
dwSendOnlineHumTime := GetTickCount;
dwProcessMapDoorTick := GetTickCount;
dwProcessMissionsTime := GetTickCount;
dwProcessMonstersTick := GetTickCount;
dwRegenMonstersTick := GetTickCount;
m_dwProcessLoadPlayTick := GetTickCount;
m_nCurrMonGen := 0;
m_nMonGenListPosition := 0;
m_nMonGenCertListPosition := 0;
m_nProcHumIDx := 0;
nProcessHumanLoopTime := 0;
nMerchantPosition := 0;
nNpcPosition := 0;
StdItemList := TMyList.create; //List_54
MonsterList := TMyList.create;
m_MonGenList := TMyList.create;
m_MonFreeList := TMyList.create;
m_MagicList := TMyList.create;
m_AdminList := TGList.Create;
m_MerchantList := TGList.Create;
QuestNPCList := TMyList.create;
//List_70 := TMyList.create;
m_ChangeServerList := TMyList.create;
m_MagicEventList := TMyList.create;
boItemEvent := False;
n90 := 1800000;
dwProcessMerchantTimeMin := 0;
dwProcessMerchantTimeMax := 0;
dwProcessNpcTimeMin := 0;
dwProcessNpcTimeMax := 0;
m_NewHumanList := TMyList.create;
m_ListOfGateIdx := TMyList.create;
m_ListOfSocket := TMyList.create;
OldMagicList := TMyList.create;
end;
destructor TUserEngine.Destroy;
var
i : Integer;
ii : Integer;
MonInfo : pTMonInfo;
MonGenInfo : pTMonGenInfo;
MagicEvent : pTMagicEvent;
TmpList : TMyList;
begin
for i := 0 to m_LoadPlayList.Count - 1 do
begin
DisPose(pTUserOpenInfo(m_LoadPlayList.Objects[i]));
end;
m_LoadPlayList.Free;
for i := 0 to m_PlayObjectList.Count - 1 do
begin
TPlayObject(m_PlayObjectList.Objects[i]).Free;
end;
m_PlayObjectList.Free;
m_StringList_0C.Free;
for i := 0 to m_PlayObjectFreeList.Count - 1 do
begin
TPlayObject(m_PlayObjectFreeList.Items[i]).Free;
end;
m_PlayObjectFreeList.Free;
for i := 0 to m_ChangeHumanDBGoldList.Count - 1 do
begin
DisPose(pTGoldChangeInfo(m_ChangeHumanDBGoldList.Items[i]));
end;
m_ChangeHumanDBGoldList.Free;
for i := 0 to StdItemList.Count - 1 do
begin
DisPose(pTStdItem(StdItemList.Items[i]));
end;
StdItemList.Free;
for i := 0 to MonsterList.Count - 1 do
begin
MonInfo := MonsterList.Items[i];
if MonInfo.ItemList <> nil then
begin
for ii := 0 to MonInfo.ItemList.Count - 1 do
begin
DisPose(pTMonItemInfo(MonInfo.ItemList.Items[ii]));
end;
MonInfo.ItemList.Free;
end;
DisPose(MonInfo);
end;
MonsterList.Free;
for i := 0 to m_MonGenList.Count - 1 do
begin
MonGenInfo := m_MonGenList.Items[i];
for ii := 0 to MonGenInfo.CertList.Count - 1 do
begin
TBaseObject(MonGenInfo.CertList.Items[ii]).Free;
end;
DisPose(pTMonGenInfo(m_MonGenList.Items[i]));
end;
m_MonGenList.Free;
for i := 0 to m_MonFreeList.Count - 1 do
begin
TBaseObject(m_MonFreeList.Items[i]).Free;
end;
m_MonFreeList.Free;
for i := 0 to m_MagicList.Count - 1 do
begin
DisPose(pTMagic(m_MagicList.Items[i]));
end;
m_MagicList.Free;
m_AdminList.Free;
for i := 0 to m_MerchantList.Count - 1 do
begin
TMerchant(m_MerchantList.Items[i]).Free;
end;
m_MerchantList.Free;
for i := 0 to QuestNPCList.Count - 1 do
begin
TNormNpc(QuestNPCList.Items[i]).Free;
end;
QuestNPCList.Free;
//List_70.Free;
for i := 0 to m_ChangeServerList.Count - 1 do
begin
DisPose(pTSwitchDataInfo(m_ChangeServerList.Items[i]));
end;
m_ChangeServerList.Free;
for i := 0 to m_MagicEventList.Count - 1 do
begin
MagicEvent := m_MagicEventList.Items[i];
if MagicEvent.BaseObjectList <> nil then
MagicEvent.BaseObjectList.Free;
DisPose(MagicEvent);
end;
m_MagicEventList.Free;
m_NewHumanList.Free;
m_ListOfGateIdx.Free;
m_ListOfSocket.Free;
for i := 0 to OldMagicList.Count - 1 do
begin
TmpList := TMyList(OldMagicList.Items[i]);
for ii := 0 to TmpList.Count - 1 do
begin
DisPose(pTMagic(TmpList.Items[ii]));
end;
TmpList.Free;
end;
OldMagicList.Free;
DeleteCriticalSection(m_LoadPlaySection);
inherited;
end;
procedure TUserEngine.Initialize; //004B200C
var
i : Integer;
MonGen : pTMonGenInfo;
begin
MerchantInitialize();
NPCinitialize();
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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -