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

📄 main.pas

📁 仙境传说(RO)私人服务器端源代码。第一次上传。
💻 PAS
📖 第 1 页 / 共 5 页
字号:
	end;	tm.Block[ts.Point.X div 8][ts.Point.Y div 8].Mob.AddObject(ts.ID, ts);	for j := ts.Point.Y div 8 - 2 to ts.Point.Y div 8 + 2 do begin		for i := ts.Point.X div 8 - 2 to ts.Point.X div 8 + 2 do begin			//廃傝偺恖偵捠抦			for k := 0 to tm.Block[i][j].CList.Count - 1 do begin				tc := tm.Block[i][j].CList.Objects[k] as TChara;				if tc = nil then continue;				if (abs(ts.Point.X - tc.Point.X) < 16) and (abs(ts.Point.Y - tc.Point.Y) < 16) then begin					SendMData(tc.Socket, ts);				end;			end;		end;	end; if (MonsterMob = true) then begin    k := SlaveDBName.IndexOf(ts.Data.Name);
    if (k <> -1) then begin
     ts.isLeader := true;
    end;
end;end;//------------------------------------------------------------------------------procedure TFrmMain.MobSpawn(tm:TMap; ts:TMob; Tick:cardinal);var	i, j, k, l, h, m, ii   :integer;	tc                     :TChara;  ts1                    :TMob;  tss                    :TSlaveDB;beginif (MonsterMob = true) then begin    k := SlaveDBName.IndexOf(ts.Data.Name);    if (k <> -1) then begin     ts.isLeader := true;     tss := SlaveDBName.Objects[k] as TSlaveDB;     if ts.Data.Name = tss.Name then begin     h := tss.TotalSlaves;     ts.SlaveCount := h;     repeat      for i := 0 to 4 do begin        if (tss.Slaves[i] <> -1) and (h <> 0) then begin          ts1 := TMob.Create;					ts1.Data := MobDBName.Objects[tss.Slaves[i]] as TMobDB;					ts1.ID := NowMobID;					Inc(NowMobID);					ts1.Name := ts1.Data.JName;					ts1.JID := ts1.Data.ID;          ts1.LeaderID := ts.ID;          ts1.Data.isLink := false;					ts1.Map := ts.Map;					ts1.Point.X := ts.Point.X;					ts1.Point.Y := ts.Point.Y;					ts1.Dir := ts.Dir;					ts1.HP := ts1.Data.HP;          if ts.Data.Speed < ts1.Data.Speed then begin					ts1.Speed := ts.Data.Speed;          end else begin          ts1.Speed := ts1.Data.Speed;          end;					ts1.SpawnDelay1 := $7FFFFFFF;					ts1.SpawnDelay2 := 0;					ts1.SpawnType := 0;					ts1.SpawnTick := 0;					if ts1.Data.isDontMove then						ts1.MoveWait := $FFFFFFFF					else          ts1.MoveWait := timeGetTime();					ts1.ATarget := 0;					ts1.ATKPer := 100;					ts1.DEFPer := 100;					ts1.DmgTick := 0;          ts1.Element := ts1.Data.Element;          ts1.isActive := false;					for j := 0 to 31 do begin						ts1.EXPDist[j].CData := nil;						ts1.EXPDist[j].Dmg := 0;					end;					if ts1.Data.MEXP <> 0 then begin						for j := 0 to 31 do begin							ts1.MVPDist[j].CData := nil;							ts1.MVPDist[j].Dmg := 0;						end;						ts1.MVPDist[0].Dmg := ts1.Data.HP * 30 div 100; //FA偵30%壛嶼					end;					ts1.isSummon := true;          ts1.isSlave := true;          tm.Mob.AddObject(ts1.ID, ts1);					tm.Block[ts1.Point.X div 8][ts1.Point.Y div 8].Mob.AddObject(ts1.ID, ts1);    for j := ts1.Point.Y div 8 - 2 to ts1.Point.Y div 8 + 2 do begin		for m := ts1.Point.X div 8 - 2 to ts1.Point.X div 8 + 2 do begin			//廃傝偺恖偵捠抦			for k := 0 to tm.Block[m][j].CList.Count - 1 do begin				tc := tm.Block[m][j].CList.Objects[k] as TChara;				if tc = nil then continue;				if (abs(ts1.Point.X - tc.Point.X) < 16) and (abs(ts1.Point.Y - tc.Point.Y) < 16) then begin					SendMData(tc.Socket, ts1);          SendBCmd(tm,ts1.Point,41,tc,False);				end;			end;		end;	  end;          h := h - 1;        end;      end;     until (h <= 0);     end;    end;end;end;//------------------------------------------------------------------------------procedure TFrmMain.MonsterDie(tm:TMap; tc:TChara; ts:TMob; Tick:cardinal);var	k,i,j,m,n:integer;	total:cardinal;	mvpid:integer;	mvpitem:boolean;	mvpcheck:integer;	i1,j1,k1:integer;	l,w:cardinal;	tc1:TChara;  ts1:TMob;	tn:TNPC;	td:TItemDB;	TgtFlag:boolean;	DropFlag:boolean;{僷乕僥傿乕婡擻捛壛}	tpaDB:TStringList;	tpa:TParty;{僷乕僥傿乕婡擻捛壛僐僐傑偱}{僊儖僪婡擻捛壛}	tg  :TGuild;  tgc :TCastle;  tn1 :TNPC;	ge  :cardinal;  str :string;  str2:string;{僊儖僪婡擻捛壛僐僐傑偱}begin	WFIFOW( 0, $0080);	WFIFOL( 2, ts.ID);	WFIFOB( 6, 1);	SendBCmd(tm, ts.Point, 7);	ts.HP := 0;	ts.pcnt := 0;{捛壛}	ts.Stat1 :=0;	ts.Stat2 :=0;	ts.nStat := 0;  ts.Element := ts.Data.Element;	ts.BodyTick := 0;	for i := 0 to 4 do  ts.HealthTick[i] := 0;	ts.isLooting := False;{捛壛僐僐傑偱}	ts.SpawnTick := Tick;	n := tm.Block[ts.Point.X div 8][ts.Point.Y div 8].Mob.IndexOf(ts.ID);  if n = -1 then exit;  if ts.isSlave then begin  ts1 := tm.Mob.IndexOfObject(ts.LeaderID) as TMob;  if (ts1 <> nil) then begin  if (ts1.SlaveCount - 1 <= 0) then begin  ts1.SlaveCount := 0;  end else begin  ts1.SlaveCount := ts1.SlaveCount - 1;  end;  end;  end;if (ts.isEmperium) then beginj := GuildList.IndexOf(tc.GuildID);if (j <> -1) then begintg := GuildList.Objects[j] as TGuild;str := GlobalGMsg;end else beginstr := MapGMsg;end;str2:='blue' + MapGMsg;str := StringReplace(str, '$charaname', tc.Name, [rfReplaceAll]);str := StringReplace(str, '$mapname', ts.Map, [rfReplaceAll]);str2 := StringReplace(str2, '$charaname', tc.Name, [rfReplaceAll]);str2 := StringReplace(str2, '$mapname', ts.Map, [rfReplaceAll]);if (tg <> nil) then beginstr := StringReplace(str, '$guildname', tg.Name, [rfReplaceAll]);str := StringReplace(str, '$guildmaster', tg.MasterName, [rfReplaceAll]);str2 := StringReplace(str2, '$guildname', tg.Name, [rfReplaceAll]);str2 := StringReplace(str2, '$guildmaster', tg.MasterName, [rfReplaceAll]);end;w := 200;WFIFOW(0, $009a);WFIFOW(2, w);WFIFOS(4, str, w - 4);for l := 0 to CharaName.Count - 1 do begintc1 := CharaName.Objects[l] as TChara;if tc1.Login = 2 then tc1.Socket.SendBuf(buf, w);end;w := 200;WFIFOW(0, $009a);WFIFOW(2, w);WFIFOS(4, str2, w - 4);for l := 0 to tm.CList.Count - 1 do begintc1 := tm.CList.Objects[l] as TChara;if (tc1.Login = 2) then tc1.Socket.SendBuf(buf, w);end;if (EmpList.Count > 0) then begink := EmpList.IndexOf(ts.Map);if (k <> - 1) then beginEmpList.Delete(k);end;end;if (CastleList.Count > 0) then beginm := CastleList.IndexOf(ts.Map);if (m <> - 1) then beginCastleList.Delete(m);end;end;ClaimGuildCastle(tc.GuildID,ts.Map);EnableGuildKafra(ts.Map,'Kafra Service',0);for l := 0 to CharaName.Count - 1 do begintc1 := CharaName.Objects[l] as TChara;if (tc1.Map = tm.Name) and (tc1.Login = 2) and ((tc1.GuildID = 0) or (tc1.GuildID <> tc.GuildID))then beginSendCLeave(tc1, 2);tc1.tmpMap := tc1.SaveMap;tc1.Map := tc1.SaveMap;tc1.Point := tc1.SavePoint;MapMove(tc1.Socket, tc1.Map, tc1.Point);end;end;end;if (ts.NPCID <> 0) then begintn := tm.NPC.IndexOfObject(ts.NPCID) as TNPC;tc1 := TChara.Create;tc1.TalkNPCID := 0;tc1.ScriptStep := tn.ScriptInitMS;tc1.AMode := 3;tc1.AData := tn;tc1.Login := 0;NPCScript(tc1,0,1);tc1.Free;ts.NPCID := 0;end;  ts.LeaderID := 0;	tm.Block[ts.Point.X div 8][ts.Point.Y div 8].Mob.Delete(n);   	//僞乕僎僢僩夝彍	for j1 := ts.Point.Y div 8 - 2 to ts.Point.Y div 8 + 2 do begin		for i1 := ts.Point.X div 8 - 2 to ts.Point.X div 8 + 2 do begin			for k1 := 0 to tm.Block[i1][j1].CList.Count - 1 do begin				tc1 := tm.Block[i1][j1].CList.Objects[k1] as TChara;				if ((tc1.AMode = 1) or (tc1.AMode = 2)) and (tc1.ATarget = ts.ID) then begin					tc1.AMode := 0;					tc1.ATarget := 0;				end;				if (tc1.MMode <> 0) and (tc1.MTarget = ts.ID) then begin						tc1.MMode := 0;						tc1.MTarget := 0;				end;			end;		end;	end;	//宱尡抣暘攝張棟	n := 32;	total := 0;	for i := 0 to 31 do begin		if ts.EXPDist[i].CData = nil then begin			n := i;			break;		end;		tc1 := ts.EXPDist[i].CData;		if (tc1.Login = 2) and (tc1.Sit <> 1) and (tc1.Map = tm.Name) then begin			//儘僌傾僂僩偟偰偄傞丄巰傫偱偄傞丄暿偺儅僢僾偵偄傞丄偄偢傟偐偺応崌宱尡抣偼擖傜側偄			Inc(total, ts.EXPDist[i].Dmg);		end;	end;	//MVP張棟	mvpid := -1;	if ts.Data.MEXP <> 0 then begin		mvpcheck := 0;		for i := 0 to 31 do begin			if ts.MVPDist[i].CData = nil then break;			tc1 := ts.MVPDist[i].CData;			if (tc1.Login = 2) and (tc1.Sit <> 1) and (tc1.Map = tm.Name) then begin				//儘僌傾僂僩偟偰偄傞丄巰傫偱偄傞丄暿偺儅僢僾偵偄傞丄偄偢傟偐偺応崌MVP懳徾偵側傜側偄				if mvpcheck < ts.MVPDist[i].Dmg then begin					mvpid := i;					mvpcheck := ts.MVPDist[i].Dmg;				end;			end;		end;		if mvpid <> -1 then begin			tc1 := ts.MVPDist[mvpid].CData;			//MVP昞帵			WFIFOW(0, $010c);			WFIFOL(2, tc1.ID);			SendBCmd(tm, tc1.Point, 6);			//MVP僠僃僢僋			mvpitem := false;			if ts.Data.MEXPPer <= Random(10000) then begin				for i := 0 to 2 do begin					if ts.Data.MVPItem[i].Per > cardinal(Random(10000)) then begin						//MVP傾僀僥儉妉摼						td := ItemDB.IndexOfObject(ts.Data.MVPItem[i].ID) as TItemDB;						//廳検僆乕僶乕傗傾僀僥儉庬椶悢僆乕僶乕偺帪偼丄昁偢宱尡抣偵側傞丂嵶偐偄張棟儅儞僪僋僙('A丮)僲						if tc1.MaxWeight >= tc1.Weight + td.Weight then begin							j := SearchCInventory(tc1, td.ID, td.IEquip);							if j <> 0 then begin								//MVP傾僀僥儉僎僢僩捠抦								WFIFOW( 0, $010a);								WFIFOW( 2, td.ID);								tc1.Socket.SendBuf(buf, 4);								//傾僀僥儉捛壛								tc1.Item[j].ID := td.ID;								tc1.Item[j].Amount := tc1.Item[j].Amount + 1;								tc1.Item[j].Equip := 0;								tc1.Item[j].Identify := 1 - byte(td.IEquip);								tc1.Item[j].Refine := 0;								tc1.Item[j].Attr := 0;								tc1.Item[j].Card[0] := 0;								tc1.Item[j].Card[1] := 0;								tc1.Item[j].Card[2] := 0;								tc1.Item[j].Card[3] := 0;								tc1.Item[j].Data := td;								//廳検捛壛								tc1.Weight := tc1.Weight + td.Weight;								WFIFOW( 0, $00b0);								WFIFOW( 2, $0018);								WFIFOL( 4, tc1.Weight);								tc1.Socket.SendBuf(buf, 8);								//傾僀僥儉僎僢僩捠抦								SendCGetItem(tc1, j, 1);								mvpitem := true;							end;						end;						break;					end;				end;			end;			if not mvpitem then begin				//MVP宱尡抣妉摼昞帵 幚嵺偺壛嶼偼屻偱傑偲傔偰				WFIFOW( 0, $010b);				WFIFOL( 2, ts.Data.MEXP * BaseExpMultiplier);				tc1.Socket.SendBuf(buf, 6);			end;		end;	end;{僷乕僥傿乕婡擻捛壛}	tpaDB := TStringList.Create;	for i := 0 to n - 1 do begin		tc1 := ts.EXPDist[i].CData;		//儘僌傾僂僩偟偰偄傞丄巰傫偱偄傞丄暿偺儅僢僾偵偄傞丄偄偢傟偐偺応崌宱尡抣偼擖傜側偄		if (tc1.Login <> 2) or (tc1.Sit = 1) or (tc1.Map <> tm.Name) then			Continue;		//儀乕僗宱尡抣		l := 100 * Cardinal(ts.EXPDist[i].Dmg) div total;		l := ts.Data.EXP * l div 100;		if n <> 1 then Inc(l);		if i = mvpid then l := l + ts.Data.MEXP; //MVP		l := l * BaseExpMultiplier;		//僕儑僽宱尡抣                {僶僌曬崘 617}                w := ts.Data.JEXP * (cardinal(ts.EXPDist[i].Dmg) div total);                {僶僌曬崘 617}		if n <> 1 then Inc(w);		if i = mvpid then w := w + ts.Data.MEXP; //MVP		w := w * JobExpMultiplier;{僊儖僪婡擻捛壛}		j := GuildList.IndexOf(tc.GuildID);		if (j <> -1) then begin			tg := GuildList.Objects[j] as TGuild;			ge := l * tg.PosEXP[tc1.GuildPos] div 100;			if (ge > l) then ge := l;			if (ge > 0) then begin				l := l - ge;				CalcGuildLvUP(tg, tc1, ge);			end;		end;{僊儖僪婡擻捛壛僐僐傑偱}

⌨️ 快捷键说明

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