📄 main.pas
字号:
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 + -