📄 main.pas
字号:
end; Width := FormWidth; if sl.IndexOfName('Height') <> -1 then begin FormHeight := StrToInt(sl.Values['Height']); end else begin FormHeight := 460; end; Height := FormHeight; if sl.IndexOfName('Priority') <> -1 then begin Priority := StrToInt(sl.Values['Priority']); if Priority > 5 then Priority := 3; end else begin Priority := 3; end; case Priority of 0: PriorityClass := REALTIME_PRIORITY_CLASS; 1: PriorityClass := HIGH_PRIORITY_CLASS; 2: PriorityClass := ABOVE_NORMAL_PRIORITY_CLASS; 3: PriorityClass := NORMAL_PRIORITY_CLASS; 4: PriorityClass := BELOW_NORMAL_PRIORITY_CLASS; 5: PriorityClass := IDLE_PRIORITY_CLASS; else begin Priority := 3; PriorityClass := NORMAL_PRIORITY_CLASS; end; end; SetPriorityClass(GetCurrentProcess(), PriorityClass); if sl.IndexOfName('UseDatabase') <> -1 then begin UseDatabase := StrToBool(sl.Values['UseDatabase']); end else begin UseDatabase := false; end; ini.Free; sl.Free; Show; //僨乕僞撉傒崬傒 DatabaseLoad(Handle); DataLoad(); DebugOut.Lines.Add(''); DebugOut.Lines.Add('"darkWeiss" .// Harbinger Build -- Version 2.9.0.1 -- http://dweiss.sigh.org/forum/'); DebugOut.Lines.Add('This program is protected under the GNU Public License -- This software is provided "as-is" and no warranty, either written or implied of any kind, is provided'); DebugOut.Lines.Add(''); DebugOut.Lines.Add('*** Startup Success ***'); DebugOut.Lines.Add(''); cmdStart.Enabled := true; if AutoStart then PostMessage(cmdStart.Handle, BM_CLICK, 0, 0);{U0x003b} DBsaveTimer.Enabled := True;{U0x003b僐僐傑偱}end;//------------------------------------------------------------------------------procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);var ini :TIniFile;begin if ServerRunning then begin cmdStop.Enabled := false; CancelFlag := true; repeat Application.ProcessMessages; until ServerRunning; end; if WindowState = wsNormal then begin FormLeft := Left; FormTop := Top; FormWidth := Width; FormHeight := Height; end; ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini')); ini.WriteString('Server', 'IP', inet_ntoa(in_addr(ServerIP))); ini.WriteString('Server', 'Name', ServerName); ini.WriteString('Server', 'NPCID', IntToStr(DefaultNPCID)); ini.WriteString('Server', 'sv1port', IntToStr(sv1port)); ini.WriteString('Server', 'sv2port', IntToStr(sv2port)); ini.WriteString('Server', 'sv3port', IntToStr(sv3port)); ini.WriteString('Server', 'WarpDebug', BoolToStr(WarpDebugFlag, true)); ini.WriteString('Server', 'BaseExpMultiplier', IntToStr(BaseExpMultiplier)); ini.WriteString('Server', 'JobExpMultiplier', IntToStr(JobExpMultiplier)); ini.WriteString('Server', 'DisableMonsterActive', BoolToStr(DisableMonsterActive, true)); ini.WriteString('Server', 'AutoStart', BoolToStr(AutoStart, true)); ini.WriteString('Server', 'DisableLevelLimit', BoolToStr(DisableLevelLimit, true)); ini.WriteString('Server', 'EnableMonsterKnockBack', BoolToStr(EnableMonsterKnockBack, true)); ini.WriteString('Server', 'DisableEquipLimit', BoolToStr(DisableEquipLimit, true)); ini.WriteString('Server', 'DropMultiplier', IntToStr(DropMultiplier)); ini.WriteString('Server', 'DisableFleeDown', BoolToStr(DisableFleeDown, true)); ini.WriteString('Server', 'DisableSkillLimit', BoolToStr(DisableSkillLimit, true)); ini.WriteString('Server', 'DefaultZeny', IntToStr(DefaultZeny)); ini.WriteString('Server', 'DefaultMap', DefaultMap); ini.WriteString('Server', 'DefaultPoint_X', IntToStr(DefaultPoint_X)); ini.WriteString('Server', 'DefaultPoint_Y', IntToStr(DefaultPoint_Y)); ini.WriteString('Server', 'DeathBaseLoss', IntToStr(DeathBaseLoss)); ini.WriteString('Server', 'DeathJobLoss', IntToStr(DeathJobLoss)); ini.WriteString('Server', 'MonsterMob', BoolToStr(MonsterMob, true)); ini.WriteString('Server', 'SummonMonsterExp', BoolToStr(SummonMonsterExp, true)); ini.WriteString('Server', 'SummonMonsterAgo', BoolToStr(SummonMonsterAgo, true)); ini.WriteString('Server', 'SummonMonsterName', BoolToStr(SummonMonsterName, true)); ini.WriteString('Server', 'SummonMonsterMob', BoolToStr(SummonMonsterMob, true)); ini.WriteString('Server', 'GlobalGMsg', GlobalGMsg); ini.WriteString('Server', 'MapGMsg', MapGMsg); ini.WriteString('Option', 'Left', IntToStr(FormLeft)); ini.WriteString('Option', 'Top', IntToStr(FormTop)); ini.WriteString('Option', 'Width', IntToStr(FormWidth)); ini.WriteString('Option', 'Height', IntToStr(FormHeight)); ini.WriteString('Option', 'Priority', IntToStr(Priority)); ini.WriteString('Option', 'UseDatabase', BoolToStr(UseDatabase, true)); ini.Free; DataSave(); ScriptList.Free; ItemDB.Free;{傾僀僥儉惢憿捛壛} MaterialDB.Free;{傾僀僥儉惢憿捛壛僐僐傑偱} MobDB.Free; MArrowDB.Free; KafraDB.Free; BannedDB.Free; IDTableDB.Free; SlaveDBName.Free; SkillDB.Free; PlayerName.Free; Player.Free; CharaName.Free; Chara.Free; CharaPID.Free;{僠儍僢僩儖乕儉婡擻捛壛} ChatRoomList.Free;{僠儍僢僩儖乕儉婡擻捛壛僐僐傑偱}{僷乕僥傿乕婡擻捛壛} PartyNameList.Free; CastleList.Free; EmpList.Free;{僷乕僥傿乕婡擻捛壛僐僐傑偱}{僉儏乕儁僢僩} PetDB.Free; PetList.Free;{僉儏乕儁僢僩偙偙傑偱}{業揦僗僉儖捛壛} VenderList.Free;{業揦僗僉儖捛壛僐僐傑偱}{庢堷婡擻捛壛} DealingList.Free;{庢堷婡擻捛壛僐僐傑偱}{巵{敔捛壛} SummonMobList.Free; SummonIOBList.Free; SummonIOVList.Free; SummonICAList.Free; SummonIGBList.Free;{巵{敔捛壛僐僐傑偱}{NPC僀儀儞僩捛壛} ServerFlag.Free; MapInfo.Free;{NPC僀儀儞僩捛壛僐僐傑偱}{僊儖僪婡擻捛壛} GuildList.Free; GSkillDB.Free;{僊儖僪婡擻捛壛僐僐傑偱} Map.Free;end;//------------------------------------------------------------------------------procedure TfrmMain.FormResize(Sender: TObject);begin if WindowState = wsNormal then begin FormLeft := Left; FormTop := Top; FormWidth := Width; FormHeight := Height; end;end;//------------------------------------------------------------------------------//procedure TfrmMain.cbxPriorityClick(Sender: TObject);//var //PriorityClass :cardinal;//begin //Priority := cbxPriority.ItemIndex; //case Priority of //0: PriorityClass := REALTIME_PRIORITY_CLASS; //1: PriorityClass := HIGH_PRIORITY_CLASS; //2: PriorityClass := ABOVE_NORMAL_PRIORITY_CLASS; //3: PriorityClass := NORMAL_PRIORITY_CLASS; //4: PriorityClass := BELOW_NORMAL_PRIORITY_CLASS; //5: PriorityClass := IDLE_PRIORITY_CLASS; //else //begin //cbxPriority.ItemIndex := 3; //Priority := 3; //PriorityClass := NORMAL_PRIORITY_CLASS; //end; //end; //SetPriorityClass(GetCurrentProcess(), PriorityClass);//end;//==============================================================================//==============================================================================// ****************************************************************************// * SERVER 1 : LOGIN SERVER (Port 6900) *// ****************************************************************************//==============================================================================procedure TfrmMain.sv1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);begin DebugOut.Lines.Add('1:Connect from ' + Socket.RemoteAddress);end;//------------------------------------------------------------------------------procedure TfrmMain.sv1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);begin DebugOut.Lines.Add('1:Disconnect from ' + Socket.RemoteAddress);end;//------------------------------------------------------------------------------procedure TfrmMain.sv1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);begin DebugOut.Lines.Add('1:Error ' + IntToStr(ErrorCode)); if ErrorCode = 10053 then Socket.Close; ErrorCode := 0;end;//------------------------------------------------------------------------------procedure TfrmMain.sv1ClientRead(Sender: TObject; Socket: TCustomWinSocket);begin sv1PacketProcess(Socket);end;//==============================================================================//==============================================================================// ****************************************************************************// * SERVER 2 : CHARA SERVER (Port 6121) *// ****************************************************************************//==============================================================================procedure TfrmMain.sv2ClientConnect(Sender: TObject; Socket: TCustomWinSocket);begin DebugOut.Lines.Add('2:Connect from ' + Socket.RemoteAddress);end;//------------------------------------------------------------------------------procedure TfrmMain.sv2ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);begin DebugOut.Lines.Add('2:Disconnect from ' + Socket.RemoteAddress);end;//------------------------------------------------------------------------------procedure TfrmMain.sv2ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);begin DebugOut.Lines.Add('2:Error ' + IntToStr(ErrorCode)); if ErrorCode = 10053 then Socket.Close; ErrorCode := 0;end;//------------------------------------------------------------------------------procedure TfrmMain.sv2ClientRead(Sender: TObject; Socket: TCustomWinSocket);begin sv2PacketProcess(Socket);end;//==============================================================================//==============================================================================// ****************************************************************************// * SERVER 3 : GAME SERVER (Port 5121) *// ****************************************************************************//==============================================================================procedure TfrmMain.sv3ClientConnect(Sender: TObject; Socket: TCustomWinSocket);begin DebugOut.Lines.Add('3:Connect from ' + Socket.RemoteAddress); NowUsers := sv3.Socket.ActiveConnections;end;//------------------------------------------------------------------------------procedure TfrmMain.sv3ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);var tc :TChara; tp :TPlayer;{NPC僀儀儞僩捛壛} i,j :integer; mi :MapTbl;{NPC僀儀儞僩捛壛僐僐傑偱}begin tc := Socket.Data; SendCLeave(tc, 2);{NPC僀儀儞僩捛壛} i := MapInfo.IndexOf(tc.Map); j := -1; if (i <> -1) then begin mi := MapInfo.Objects[i] as MapTbl; if (mi.noSave = true) then j := 0; end; if (tc.Sit = 1) or (j = 0) then begin{NPC僀儀儞僩捛壛僐僐傑偱} tc.Map := tc.SaveMap; tc.Point.X := tc.SavePoint.X; tc.Point.Y := tc.SavePoint.Y; end; tc.Login := 0; tp := tc.PData; tp.Login := 0; DebugOut.Lines.Add('3:Disconnect from ' + Socket.RemoteAddress); NowUsers := sv3.Socket.ActiveConnections; if NowUsers > 0 then Dec(NowUsers);end;//------------------------------------------------------------------------------procedure TfrmMain.sv3ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);begin DebugOut.Lines.Add('3:Error ' + IntToStr(ErrorCode)); if ErrorCode = 10053 then Socket.Close; if ErrorCode = 10054 then Socket.Close; ErrorCode := 0; NowUsers := sv3.Socket.ActiveConnections;end;//------------------------------------------------------------------------------procedure TfrmMain.sv3ClientRead(Sender: TObject; Socket: TCustomWinSocket);begin sv3PacketProcess(Socket);end;//==============================================================================//==============================================================================procedure TFrmMain.MonsterSpawn(tm:TMap; ts:TMob; Tick:cardinal);var i, j, k, l, h, m, ii :integer; tc :TChara; ts1 :TMob; tss :TSlaveDB;begin //Spawn repeat ts.Point.X := ts.Point1.X + Random(ts.Point2.X + 1) - (ts.Point2.X div 2); ts.Point.Y := ts.Point1.Y + Random(ts.Point2.Y + 1) - (ts.Point2.Y div 2); if (ts.Point.X < 0) or (ts.Point.X > tm.Size.X - 2) or (ts.Point.Y < 0) or (ts.Point.Y > tm.Size.Y - 2) then begin if ts.Point.X < 0 then ts.Point.X := 0; if ts.Point.X > tm.Size.X - 2 then ts.Point.X := tm.Size.X - 2; if ts.Point.Y < 0 then ts.Point.Y := 0; if ts.Point.Y > tm.Size.Y - 2 then ts.Point.Y := tm.Size.Y - 2; end;// until (tm.gat[ts.Point.X][ts.Point.Y] and 1) <> 0; until (tm.gat[ts.Point.X, ts.Point.Y] and 1 <> 0); ts.Dir := Random(8); ts.HP := ts.Data.HP; if ts.Data.isDontMove then ts.MoveWait := $FFFFFFFF else ts.MoveWait := Tick + 5000 + Cardinal(Random(10000)); ts.Speed := ts.Data.Speed; ts.ATarget := 0; ts.ARangeFlag := false; ts.ATKPer := 100; ts.DEFPer := 100; ts.DmgTick := 0; for j := 0 to 31 do begin ts.EXPDist[j].CData := nil; ts.EXPDist[j].Dmg := 0; end; if ts.Data.MEXP <> 0 then begin for j := 0 to 31 do begin ts.MVPDist[j].CData := nil; ts.MVPDist[j].Dmg := 0; end; ts.MVPDist[0].Dmg := ts.Data.HP * 30 div 100; //FA偵30%壛嶼
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -