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

📄 main.pas

📁 仙境传说(RO)私人服务器端源代码。第一次上传。
💻 PAS
📖 第 1 页 / 共 5 页
字号:
unit 	 Main;interfaceuses	Windows, MMSystem, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,	Dialogs, ScktComp, StdCtrls, ExtCtrls, IniFiles, WinSock, ComCtrls,	List32, Login, CharaSel, Script, Game, Path, Database, Common;type	TfrmMain = class(TForm)		sv1          :TServerSocket;		sv2          :TServerSocket;		sv3          :TServerSocket;		cmdStart     :TButton;		cmdStop      :TButton;		txtDebug     :TMemo;		DBsaveTimer  :TTimer;    Edit1: TEdit;    Button1: TButton;		procedure DBsaveTimerTimer(Sender: TObject);{U0x003b僐僐傑偱}		procedure FormCreate(Sender: TObject);  //edited by The Harbinger -- darkWeiss version		procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);		procedure FormResize(Sender: TObject);		procedure MonsterSpawn(tm:TMap; ts:TMob; Tick:cardinal);   //edited by The Harbinger -- darkWeiss version    procedure MobSpawn(tm:TMap; ts:TMob; Tick:cardinal);   //added by The Harbinger -- darkWeiss version		procedure MonsterDie(tm:TMap; tc:TChara; ts:TMob; Tick:cardinal); //edited by The Harbinger -- darkWeiss version{捛壛}		procedure StatCalc1(tc:TChara; ts:TMob; Tick:cardinal);   //edited by The Harbinger -- darkWeiss version    procedure StatCalc2(tc:TChara; tc1:TChara; Tick:cardinal);  //added by The Harbinger -- darkWeiss version		function CharaMoving(tc:TChara;Tick:cardinal) : boolean; //edited by The Harbinger -- darkWeiss version		procedure CharaSplash(tc:TChara;Tick:cardinal);    procedure CharaSplash2(tc:TChara;Tick:cardinal); //added by The Harbinger -- darkWeiss version		procedure CharaAttack(tc:TChara;Tick:cardinal);  //edited by The Harbinger -- darkWeiss version    procedure CharaAttack2(tc:TChara;Tick:cardinal); //added by The Harbinger -- darkWeiss version		procedure CharaPassive(tc:TChara;Tick:cardinal); //edited by The Harbinger -- darkWeiss version		function	NPCAction(tm:TMap;tn:TNPC;Tick:cardinal) : Integer;		procedure MobAI(tm:TMap;ts:TMob;Tick:cardinal);  //edited by The Harbinger -- darkWeiss version		procedure MobMoveL(tm:TMap;Tick:cardinal);		function	MobMoving(tm:TMap;ts:TMob;Tick:cardinal) : Integer; //edited by The Harbinger -- darkWeiss version		procedure MobAttack(tm:TMap;ts:TMob;Tick:cardinal); //edited by The Harbinger -- darkWeiss version		procedure StatEffect(tm:TMap; ts:TMob; Tick:Cardinal);		procedure CreateField(tc:TChara; Tick:Cardinal);		procedure SkillEffect(tc:TChara; Tick:Cardinal);{捛壛僐僐傑偱}{僉儏乕儁僢僩}    procedure PetMoving( tc:TChara; _Tick:cardinal );{僉儏乕儁僢僩偙偙傑偱}		procedure DamageCalc1(tm:TMap; tc:TChara; ts:TMob; Tick:cardinal; Arms:byte = 0; SkillPer:integer = 0; AElement:byte = 0; HITFix:integer = 0); //edited by The Harbinger -- darkWeiss version		procedure DamageCalc2(tm:TMap; tc:TChara; ts:TMob; Tick:cardinal; SkillPer:integer = 0; AElement:byte = 255; HITFix:integer = 0); //added by The Harbinger -- darkWeiss version   procedure  DamageCalc3(tm:TMap; tc:TChara; tc1:TChara; Tick:cardinal; Arms:byte = 0; SkillPer:integer = 0; AElement:byte = 0; HITFix:integer = 0);  //edited by The Harbinger -- darkWeiss version		function  DamageProcess1(tm:TMap; tc:TChara; ts:TMob; Dmg:integer; Tick:cardinal;isBreak:Boolean = True) : Boolean;  //edited by The Harbinger -- darkWeiss version    function  DamageProcess2(tm:TMap; tc:TChara; tc1:TChara; Dmg:integer; Tick:cardinal;isBreak:Boolean = True) : Boolean;  //added by The Harbinger -- darkWeiss version		procedure sv1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);		procedure sv1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);		procedure sv1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);		procedure sv1ClientRead(Sender: TObject; Socket: TCustomWinSocket);		procedure sv2ClientConnect(Sender: TObject; Socket: TCustomWinSocket);		procedure sv2ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);		procedure sv2ClientRead(Sender: TObject; Socket: TCustomWinSocket);		procedure sv2ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);		procedure sv3ClientConnect(Sender: TObject; Socket: TCustomWinSocket);		procedure sv3ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);		procedure sv3ClientRead(Sender: TObject; Socket: TCustomWinSocket);		procedure sv3ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);		procedure cmdStartClick(Sender: TObject);   //edited by The Harbinger -- darkWeiss version		procedure cmdStopClick(Sender: TObject);    procedure button1Click(Sender: TObject);	private		{ Private 愰尵 }	public		{ Public 愰尵 }	end;const	REALTIME_PRIORITY_CLASS = $100;	HIGH_PRIORITY_CLASS = $80;	ABOVE_NORMAL_PRIORITY_CLASS = $8000;	NORMAL_PRIORITY_CLASS = $20;	BELOW_NORMAL_PRIORITY_CLASS = $4000;	IDLE_PRIORITY_CLASS = $40;var	frmMain       :TfrmMain;	Priority      :cardinal;	TickCheckCnt  :byte;  i             :integer;  j             :integer;  w             :word;	TickCheck     :array[0..9] of cardinal;	dmg           :array[0..7] of integer;implementation{$R *.dfm}//==============================================================================procedure TfrmMain.FormCreate(Sender: TObject);var	sl  :TStringList;	sl1 :TStringList;	ini :TIniFile;  PriorityClass :cardinal;  begin	Randomize;	timeBeginPeriod(1);	timeEndPeriod(1);	SetLength(TrueBoolStrs, 4);	TrueBoolStrs[0] := '1';	TrueBoolStrs[1] := '-1';	TrueBoolStrs[2] := 'true';	TrueBoolStrs[3] := 'True';	SetLength(FalseBoolStrs, 3);	FalseBoolStrs[0] := '0';	FalseBoolStrs[1] := 'false';	FalseBoolStrs[2] := 'False';	//NowAccountID := 0;	NowUsers := 0;	NowLoginID := 0;	NowItemID := 1000;	NowMobID := 1000000;	NowCharaID := 0;	//NowNPCID := 50000;{僉儏乕儁僢僩}  NowPetID := 0;{僉儏乕儁僢僩偙偙傑偱}	AppPath := ExtractFilePath(ParamStr(0));	DebugOut := txtDebug;	Caption := 'darkWeiss 00:00:00:00 Current User Count: 0 / 0'; //ExtractFileName(ChangeFileExt(ParamStr(0), ''));	ScriptList := TStringList.Create;	ItemDB := TIntList32.Create;	ItemDB.Sorted := true;	ItemDBName := TStringList.Create;	ItemDBName.CaseSensitive := True;{傾僀僥儉惢憿捛壛}	MaterialDB := TIntList32.Create;	MaterialDB.Sorted := true;{傾僀僥儉惢憿捛壛僐僐傑偱}	MobDB := TIntList32.Create;	MobDB.Sorted := true;	MobDBName := TStringList.Create;	MobDBName.CaseSensitive := True;  SlaveDBName := TStringList.Create;  SlaveDBName.CaseSensitive := True;  MArrowDB := TIntList32.Create;  MArrowDB.Sorted := true;  KafraDB := TIntList32.Create;  KafraDB.Sorted := true;  BannedDB := TStringList.Create;  BannedDB.CaseSensitive := True;  IDTableDB := TIntList32.Create;  IDTableDB.Sorted := true;	SkillDB := TIntList32.Create;	PlayerName := TStringList.Create;	PlayerName.CaseSensitive := True;	Player := TIntList32.Create;	CharaName := TStringList.Create;	CharaName.CaseSensitive := True;	Chara := TIntList32.Create;	CharaPID := TIntList32.Create;{僷乕僥傿乕婡擻捛壛}	PartyNameList := TStringList.Create;	PartyNameList.CaseSensitive := True;  CastleList := TStringList.Create;	CastleList.CaseSensitive := True;  EmpList := TStringList.Create;	EmpList.CaseSensitive := True;{僷乕僥傿乕婡擻捛壛僐僐傑偱}{僠儍僢僩儖乕儉婡擻捛壛}	ChatRoomList := TIntList32.Create;{僠儍僢僩儖乕儉婡擻捛壛僐僐傑偱}{業揦僗僉儖捛壛}	VenderList := TIntList32.Create;{業揦僗僉儖捛壛僐僐傑偱}{庢堷婡擻捛壛}	DealingList := TIntList32.Create;{庢堷婡擻捛壛僐僐傑偱}{僉儏乕儁僢僩}	PetDB  := TIntList32.Create;        PetList := TIntList32.Create;{僉儏乕儁僢僩偙偙傑偱}{巵{敔捛壛}	SummonMobList := TIntList32.Create;	SummonIOBList := TIntList32.Create;	SummonIOVList := TIntList32.Create;	SummonICAList := TIntList32.Create;	SummonIGBList := TIntList32.Create;{巵{敔捛壛僐僐傑偱}{NPC僀儀儞僩捛壛}	ServerFlag := TStringList.Create;	MapInfo    := TStringList.Create;{NPC僀儀儞僩捛壛僐僐傑偱}{僊儖僪婡擻捛壛}	GuildList := TIntList32.Create;	GSkillDB := TIntList32.Create;{僊儖僪婡擻捛壛僐僐傑偱}	Map := TStringList.Create;	MapList := TStringList.Create;	sl := TStringList.Create;	sl.QuoteChar := '"';	sl.Delimiter := ',';	ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));	sl.Clear;	ini.ReadSectionValues('Server', sl);	sl1 := TStringList.Create;	sl1.Delimiter := '.';	sl1.DelimitedText := sl.Values['IP'];	if sl1.Count = 4 then begin		ServerIP := cardinal(inet_addr(PChar(sl.Values['IP'])));	end else begin		ServerIP := cardinal(inet_addr('127.0.0.1'));		//ServerIP := $0100007f;	end;	sl1.Free;	if sl.IndexOfName('Name') <> -1 then begin		ServerName := sl.Values['Name'];	end else begin		ServerName := 'darkWeiss';	end;	if sl.IndexOfName('NPCID') <> -1 then begin		DefaultNPCID := StrToInt(sl.Values['NPCID']);	end else begin		DefaultNPCID := 50000;	end;	NowNPCID := DefaultNPCID;	if sl.IndexOfName('sv1port') <> -1 then begin		sv1port := StrToInt(sl.Values['sv1port']);	end else begin		sv1port := 6900;	end;	sv1.Port := sv1port;	if sl.IndexOfName('sv2port') <> -1 then begin		sv2port := StrToInt(sl.Values['sv2port']);	end else begin		sv2port := 6121;	end;	sv2.Port := sv2port;	if sl.IndexOfName('sv3port') <> -1 then begin		sv3port := StrToInt(sl.Values['sv3port']);	end else begin		sv3port := 5121;	end;	sv3.Port := sv3port;	if sl.IndexOfName('WarpDebug') <> -1 then begin		WarpDebugFlag := StrToBool(sl.Values['WarpDebug']);	end else begin		WarpDebugFlag := false;	end;	if sl.IndexOfName('BaseExpMultiplier') <> -1 then begin		BaseExpMultiplier := StrToInt(sl.Values['BaseExpMultiplier']);	end else begin		BaseExpMultiplier := 1;	end;	if sl.IndexOfName('JobExpMultiplier') <> -1 then begin		JobExpMultiplier := StrToInt(sl.Values['JobExpMultiplier']);	end else begin		JobExpMultiplier := 1;	end;	if sl.IndexOfName('DisableMonsterActive') <> -1 then begin		DisableMonsterActive := StrToBool(sl.Values['DisableMonsterActive']);	end else begin		DisableMonsterActive := false;	end;	if sl.IndexOfName('AutoStart') <> -1 then begin		AutoStart := StrToBool(sl.Values['AutoStart']);	end else begin		AutoStart := false;	end;  //AutoStart := true;	if sl.IndexOfName('DisableLevelLimit') <> -1 then begin		DisableLevelLimit := StrToBool(sl.Values['DisableLevelLimit']);	end else begin		DisableLevelLimit := false;	end;	if sl.IndexOfName('EnableMonsterKnockBack') <> -1 then begin		EnableMonsterKnockBack := StrToBool(sl.Values['EnableMonsterKnockBack']);	end else begin		EnableMonsterKnockBack := false;	end;	if sl.IndexOfName('DisableEquipLimit') <> -1 then begin		DisableEquipLimit := StrToBool(sl.Values['DisableEquipLimit']);	end else begin		DisableEquipLimit := false;	end;	if sl.IndexOfName('DropMultiplier') <> -1 then begin		DropMultiplier := StrToInt(sl.Values['DropMultiplier']);	end else begin		DropMultiplier := 1;	end;	if sl.IndexOfName('DisableFleeDown') <> -1 then begin		DisableFleeDown := StrToBool(sl.Values['DisableFleeDown']);	end else begin		DisableFleeDown := false;	end;	if sl.IndexOfName('DisableSkillLimit') <> -1 then begin		DisableSkillLimit := StrToBool(sl.Values['DisableSkillLimit']);	end else begin		DisableSkillLimit := false;	end;{U0x008a_fix}	if sl.IndexOfName('DefaultZeny') <> -1 then begin		DefaultZeny := StrToInt(sl.Values['DefaultZeny']);	end else begin		DefaultZeny := 300;	end;	if sl.IndexOfName('DefaultMap') <> -1 then begin		DefaultMap := sl.Values['DefaultMap'];	end else begin		DefaultMap := 'new_zone01';	end;	if sl.IndexOfName('DefaultPoint_X') <> -1 then begin		DefaultPoint_X := StrToInt(sl.Values['DefaultPoint_X']);	end else begin		DefaultPoint_X := 50;	end;	if sl.IndexOfName('DefaultPoint_Y') <> -1 then begin		DefaultPoint_Y := StrToInt(sl.Values['DefaultPoint_Y']);	end else begin		DefaultPoint_Y := 100;	end;	if sl.IndexOfName('GMCheck') <> -1 then begin		GMCheck := StrToIntDef(sl.Values['GMCheck'],0);	end else begin		GMCheck := $FF;	end;	if sl.IndexOfName('DebugCMD') <> -1 then begin		DebugCMD := StrToIntDef(sl.Values['DebugCMD'],0);	end else begin		DebugCMD := $FFFF;	end;  if sl.IndexOfName('DeathBaseLoss') <> -1 then begin		DeathBaseLoss := StrToInt(sl.Values['DeathBaseLoss']);	end else begin		DeathBaseLoss := 1;	end;  if sl.IndexOfName('DeathJobLoss') <> -1 then begin		DeathJobLoss := StrToInt(sl.Values['DeathJobLoss']);	end else begin		DeathJobLoss := 1;	end;  if sl.IndexOfName('MonsterMob') <> -1 then begin		MonsterMob := StrToBool(sl.Values['MonsterMob']);	end else begin		MonsterMob := false;	end;  if sl.IndexOfName('SummonMonsterExp') <> -1 then begin		SummonMonsterExp := StrToBool(sl.Values['SummonMonsterExp']);	end else begin		SummonMonsterExp := false;	end;    if sl.IndexOfName('SummonMonsterAgo') <> -1 then begin		SummonMonsterAgo := StrToBool(sl.Values['SummonMonsterAgo']);	end else begin		SummonMonsterAgo := false;	end;    if sl.IndexOfName('SummonMonsterName') <> -1 then begin		SummonMonsterName := StrToBool(sl.Values['SummonMonsterName']);	end else begin		SummonMonsterName := false;	end;  if sl.IndexOfName('SummonMonsterMob') <> -1 then begin		SummonMonsterMob := StrToBool(sl.Values['SummonMonsterMob']);	end else begin		SummonMonsterMob := false;	end;  if sl.IndexOfName('GlobalGMsg') <> -1 then begin		GlobalGMsg := sl.Values['GlobalGMsg'];	end else begin		GlobalGMsg := 'Guild Base $mapname has been taken by $guildname guild.';	end;  if sl.IndexOfName('MapGMsg') <> -1 then begin		MapGMsg := sl.Values['MapGMsg'];	end else begin		MapGMsg := 'Empelium Has Been Destroyed';	end;{U0x008a_fix_end}	sl.Clear;	ini.ReadSectionValues('Option', sl);	if sl.IndexOfName('Left') <> -1 then begin		FormLeft := StrToInt(sl.Values['Left']);	end else begin		FormLeft := 0;	end;	Left := FormLeft;	if sl.IndexOfName('Top') <> -1 then begin		FormTop := StrToInt(sl.Values['Top']);	end else begin		FormTop := 0;	end;	Top := FormTop;	if sl.IndexOfName('Width') <> -1 then begin		FormWidth := StrToInt(sl.Values['Width']);	end else begin		FormWidth := 500;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -