📄 usrengn.pas
字号:
unit UsrEngn;
interface
uses
Windows, Classes, SysUtils, StrUtils, Forms, ObjBase, ObjNpc, Envir ,Grobal2,SDK,Magic;
type
TUserEngine = class
m_LoadPlaySection :TRTLCriticalSection;
m_LoadPlayList :TStringList; //从DB读取人物数据
m_PlayObjectList :TStringList; //0x8
m_StringList_0C :TStringList;
m_PlayObjectFreeList :TList; //0x10
m_ChangeHumanDBGoldList :TList; //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 :TList; //List_54
MonsterList :TList; //List_58
m_MonGenList :TList; //List_5C
m_MonFreeList :TList;
m_MagicList :TList; //List_60
m_TimerList :Tlist;
m_AdminList :TGList; //List_64
m_MerchantList :TGList; //List_68
QuestNPCList :TList; //0x6C
List_70 :TList;
m_ChangeServerList :TList;
m_MagicEventList :TList; //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 :TList;
m_ListOfGateIdx :TList;
m_ListOfSocket :TList;
OldMagicList :TList;
private
procedure ProcessMerchants();
procedure ProcessNpcs();
procedure ProcessMissions();
procedure ProcessTimer();
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;
function makenewplay(s_name :string;human:Tplayobject):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 CopyHumData(var PlayObject: TBASEOBJECT;HumData: TPlayObject);
procedure SaveHumanRcd(PlayObject:TPlayObject);
procedure NewHumanYS(PlayObject:TPlayObject;sAccount,sChrName:String;bHair,bJob,bSex:byte;sYsnameMaster:String;nSessionID:Integer);
procedure Run();
procedure PrcocessData();
procedure Execute;
procedure ProcessHumans();
procedure ProcessMonsters();
function RegenMonsterByName(sMap:String;nX,nY:Integer;sMonName:String):TBaseObject;
function RegenMonsterysByName(sMonName: String;human:Tplayobject):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 GetPlayObjectEx(sName:String):TPlayObject;
procedure KickPlayObjectEx(sName:String);
procedure endofflineUser(sAccount,sCharName:String;var boys:boolean);
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 sIPaddr: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:TList):Integer;
function GetNpcList(Envir:TEnvirnoment;nX,nY,nRange:Integer;TmpList:TList):Integer;
procedure ReloadMerchantList();
procedure ReloadNpcList();
procedure HumanExpire(sAccount:String);
function GetMapMonster(Envir:TEnvirnoment;List:TList):Integer;
function GetMapMonsterx(Envir:TEnvirnoment;List:TList):Integer;
function GetAllMonstercount():Integer;
function GetMapRangeMonster(Envir:TEnvirnoment;nX,nY,nRange:Integer;List:TList):Integer;
function GetMapHuman(sMapName:String):Integer;
function GetMapRageHuman(Envir:TEnvirnoment;nRageX,nRageY,nRage:Integer;List:TList):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,Objys,Objmonty, Event, InterMsgClient, InterServerMsg, ObjRobot, HUtil32, svMain,
Castle;
var
nEngRemoteRun:Integer= -1;
{ TUserEngine }
constructor TUserEngine.Create();
begin
InitializeCriticalSection(m_LoadPlaySection);
m_LoadPlayList := TStringList.Create;
m_PlayObjectList := TStringList.Create;
m_StringList_0C := TStringList.Create;
m_PlayObjectFreeList := TList.Create;
m_ChangeHumanDBGoldList := TList.Create;
dwShowOnlineTick := GetTickCount;
dwSendOnlineHumTime := GetTickCount;
dwProcessMapDoorTick := GetTickCount;
dwProcessMissionsTime := GetTickCount;
dwProcessMonstersTick := GetTickCount;
dwRegenMonstersTick := GetTickCount;
m_dwProcessLoadPlayTick := GetTickCount;
dwTime_34 := GetTickCount;
m_nCurrMonGen := 0;
m_nMonGenListPosition := 0;
m_nMonGenCertListPosition := 0;
m_nProcHumIDx := 0;
nProcessHumanLoopTime := 0;
nMerchantPosition := 0;
nNpcPosition := 0;
StdItemList := TList.Create; //List_54
MonsterList := TList.Create;
m_MonGenList := TList.Create;
m_MonFreeList := TList.Create;
m_MagicList := TList.Create;
m_AdminList := TGList.Create;
m_MerchantList := TGList.Create;
QuestNPCList := TList.Create;
m_TimerList := TList.Create; //hint
List_70 := TList.Create;
m_ChangeServerList := TList.Create;
m_MagicEventList := TList.Create;
boItemEvent := False;
n90 := 1800000;
dwProcessMerchantTimeMin := 0;
dwProcessMerchantTimeMax := 0;
dwProcessNpcTimeMin := 0;
dwProcessNpcTimeMax := 0;
m_NewHumanList := TList.Create;
m_ListOfGateIdx := TList.Create;
m_ListOfSocket := TList.Create;
OldMagicList := TList.Create;
end;
destructor TUserEngine.Destroy;
var
I :Integer;
II :Integer;
MonInfo :pTMonInfo;
MonGenInfo :pTMonGenInfo;
MagicEvent :pTMagicEvent;
tmpList :TList;
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(pTMonItem(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;
MonGenInfo.CertList.free; //hint 释放
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;
for i:= 0 to m_AdminList.count -1 do begin //hint 释放
Dispose(pTAdminInfo(m_AdminList.Items[i]));
end;
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 m_TimerList.Count - 1 do begin //定时器指针表
Dispose(pTtimergoto(m_TimerList.Items[i]));
end;
m_TimerList.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:=TList(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;
var
i:Integer;
MonGen:pTMonGenInfo;
begin
MerchantInitialize();
NPCinitialize();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -