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

📄 main.pas

📁 仙境传说(RO)私人服务器端源代码。第一次上传。
💻 PAS
📖 第 1 页 / 共 5 页
字号:
	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 + -