>>122
ごめんなさい、ただdieとaliveを利用しただけでしたので・・・><
他のスキルも無駄があると思いますのでどなたか直していただけるとうれしいです
あぷろだ2にskill_dbをアップしたのですが、おそらくWeiss033のものよりも古いものを使用していますので、
プリーストのところだけ使用してください
common.pas
SendCSkillList()
{修正}
if (not tc.Skill[i].Data.Job[tc.Job]) and (not tc.Skill[i].Card) and (not DisableSkillLimit) then continue;
if ((290 < i) and (i < 304)) then Continue;
{修正ココまで}
のところを
{修正}
if (not tc.Skill[i].Data.Job[tc.Job]) and (not tc.Skill[i].Card) and (not DisableSkillLimit) and ((i<>12) or (tc.Job<>8)) then continue;
if ((290 < i) and (i < 304)) then Continue;
{修正ココまで}
にして
{アイテム製造修正ココまで}
のすぐあとに
if (tc.Job = 8) and (i = 12) then begin
tc.Skill[i].Data.ReqSkill[0] := 68;
tc.Skill[i].Data.ReqLV[0] := 4;
tc.Skill[i].Data.ReqSkill[1] :=70;
tc.Skill[i].Data.ReqLV[1] := 3;
end;
とすることでプリーストでSWが使用できます。
>>初心者スレ120様
if (not tc.Skill[i].Data.Job[tc.Job]) and (not tc.Skill[i].Card) and (not DisableSkillLimit) and ((i<>12) or (tc.Job<>8)) then continue;
でマジシャンの場合を回避したつもりだったのですがだめでしょうか・・・
79: //マグヌス
begin
for j1 := 1 to 7 do begin
for i1 := 1 to 7 do begin
if ((i1 < 3) or (i1 > 5)) and ((j1 < 3) or (j1 > 5)) then Continue;
xy.X := (MPoint.X) -4 + i1;
xy.Y := (MPoint.Y) -4 + j1;
tn := SetSkillUnit(tm, PID, xy, Tick, $84, tl.Data2[MUseLV], tl.Data1[MUseLV] * 1600);
tn.CData := tc;
tn.MUseLV := MUseLV;
end;
end;
DecSP(tc, MSkill, MUseLV);
WFIFOW( 0, $0117);
WFIFOW( 2, MSkill);
WFIFOL( 4, PID);
WFIFOW( 8, 10);
WFIFOW(10, MPoint.X);
WFIFOW(12, MPoint.Y);
WFIFOL(14, 1);
SendBCmd(tm, xy, 18);
SkillProcessType := 0;
end;
と
TfrmMain.NPCAction()の$7f: //ファイアーウォール処理のあとに
$84: //マグヌス
begin
if ts1.view1 = 2 then m := 21
else m := ts1.Data.Element;
if (m mod 20 = 9) or ((ts1.Data.Race = 6) and (m <> 21)) then begin
//ダメージ算出
dmg[0] := tn.CData.MATK1 + Random(tn.CData.MATK2 - tn.CData.MATK1 + 1) * tn.CData.MATKFix div 100;
dmg[0] := dmg[0] * (100 - ts1.Data.MDEF) div 100; //MDEF%
dmg[0] := dmg[0] - ts1.Data.Param[3]; //MDEF-
if dmg[0] < 1 then dmg[0] := 1;
dmg[0] := dmg[0] * ElementTable[tn.CData.Skill[79].Data.Element][29] div 100;
if dmg[0] < 0 then dmg[0] := 0;
//ダメージパケ送信
WFIFOW( 0, $0114);
WFIFOW( 2, 18);
WFIFOL( 4, tn.ID);
WFIFOL( 8, ts1.ID);
WFIFOL(12, Tick);
WFIFOL(16, 0);
WFIFOL(20, ts1.Data.dMotion);
WFIFOW(24, dmg[0]);
WFIFOW(26, 1);
WFIFOW(28, 1);
WFIFOB(30, 4);
SendBCmd(tm, tn.Point, 31);
DamageProcess1(tm, tn.CData, ts1, dmg[0], Tick);
Dec(tn.Count);
if tn.Count = 0 then begin
DelSkillUnit(tm, tn);
end;
end;
end;
でマグヌスが使用できるのですが、わたしの理解不足でファイアーウォールの//ここの処理がうまくいくかどうか謎
のDec(k)以降の意味がよくわからなかったので処理が足りないかもしれません
for j1 := 1 to 7 do begin
for i1 := 1 to 7 do begin
if ((i1 < 3) or (i1 > 5)) and ((j1 < 3) or (j1 > 5)) then Continue;
xy.X := (MPoint.X) -4 + i1;
xy.Y := (MPoint.Y) -4 + j1;
これだと画面端でやるとサーバとまると思います
if (xy.X < 0) or (xy.X >= tm.Size.X) or (xy.Y < 0) or (xy.Y >= tm.Size.Y) then continue;
こんな感じで範囲外への設置を回避しないとだめです
for j1 := 1 to 8 do begin
for i1 := 1 to 8 do begin
if((i1 < 3) or (i1 > 6)) and ((j1 < 3) or <j1 > 6)) then continue;
if(xy.X < 0) or (xy.X >= tm.Size.X) or (xy.Y < 0) or (xy.Y >= tm.Size.Y) then continue;
xy.X := (tc.MPoint.X) -4 + i1;
xy.Y := (tc.MPoint.Y) -4 + j1;
ワナを使用して1セルにたくさんのモンスターがいるときに攻撃をしていると
無限ループに入ってしまうようなのですが、原因がちょっとわかっていません><
わたしが確認したのはアングルスネアでですが、どなたか修正してくださるとうれしいです
$91: //AS
begin
if tn.Count > 0 then begin
for i1 := -1 to 1 do begin
for j1 := -1 to 1 do begin
c := 0;
while (c >= 0) and (c < tm.Block[tn.Point.X div 8 + i1][tn.Point.Y div 8 + j1].Mob.Count) do begin
ts1 := tm.Block[tn.Point.X div 8 + i1][tn.Point.Y div 8 + j1].Mob.Objects[c] as TMob;
if (ts1 = nil) then begin
Inc(c);
continue;
end;
if (abs(ts1.Point.X - tn.Point.X) < 2) and (abs(ts1.Point.Y - tn.Point.Y) < 2) then begin
tc1 := tn.CData;
if (ts1.Stat1 <> 5) then begin
ts1.nStat := 5;
ts1.BodyTick := Tick + tc1.aMotion;
end;
tn.Count := 0;
tn.Tick := Tick;
ts1.Point := tn.Point;
WFIFOW(0, $0088);
WFIFOL(2, ts1.ID);
WFIFOW(6, ts1.Point.X);
WFIFOW(8, ts1.Point.Y);
SendBCmd(tm, ts1.Point, 10);
end;
inc(c);
end;
end;
end;
if tn.Count = 0 then begin
DelSkillUnit(tm, tn);
end;
end;
end;
でアングルスネアが使用できます
あと、
DamageCalc1()の最後の方の状態1処理を
if ((ts.Stat1 = 2) or (ts.Stat1 = 4)) then begin
DamageProcess1()の最初のところの状態1処理を
if ((ts.Stat1 = 2) or (ts.Stat1 = 4)) and isBreak then begin
その下の方DebugOut.Lines.Add('(*゚∀゚)ノチンチコーレ!');の上を
else if (ts.pcnt <> 0) and (ts.Stat1 <> 5) then begin
cmdStartClick()の//状態1では行動不可のところを
if (ts.Stat1 <> 0) and (ts.Stat1 <> 5) then Continue;
if ts.Stat1 <> 5 then MobAI(tm,ts,Tick) else pcnt := 0;
としてください
アスペルシオ修正しました
68: //アスペルシオ
begin
if MTargetType = 0 then begin
MMode := 0;
Exit;
end;
if tc1 = tc then begin
MMode := 0;
Exit;
end;
SkillProcessType := 3;
end;
と
Common.pasに
//アスペルシオ
if Skill[68].Tick > Tick then begin
WElement[0] := 6;
WElement[1] := 6;
end;
でアスペルシオです
これでPTであれば属性武器なしでウィスパー倒せます♪
結局よくわからなくてムダのあるソースになってしまいましたが
157: //エネルギーコート
begin
tc1 := tc;
ProcessType := 3;
end;
と
反撃ダメージの
//攻撃命中
if dmg[0] <> 0 then begin
のあとに
if tc.Skill[157].Tick > Tick then begin //エネルギーコート
if (tc.SP * 100 / tc.MAXSP) < 1 then tc.SP := 0;
if tc.SP > 0 then begin
i := 1;
if (tc.SP * 100 / tc.MAXSP) > 20 then i := 2;
if (tc.SP * 100 / tc.MAXSP) > 40 then i := 3;
if (tc.SP * 100 / tc.MAXSP) > 60 then i := 4;
if (tc.SP * 100 / tc.MAXSP) > 80 then i := 5;
dmg[0] := dmg[0] - ((dmg[0] * i * 6) div 100);
tc.SP := tc.SP - (tc.MAXSP * (i + 1) * 5) div 1000;
end else tc.Skill[157].Tick := Tick;
SendCStat1(tc, 0, 7, tc.SP);
end;
追加でエネルギーコートが出ます
エネルギーコートではアイコンが出ないのでしょうか・・・
スクリプトが実装されたので
バッシュ、メマー〜のところの
//パケ送信
SendCSkillAtk1(tm, tc, ts, Tick, dmg[0], j);
のあとに
if (Skill[145].Lv <> 0) and (MSkill = 5) and (MUseLV >5) then begin //急所突き
if Random(1000) < Skill[145].Data.Data1[MUseLV] * 10 then begin
if (ts.Stat1 <> 3) then begin
ts.nStat := 3;
ts.BodyTick := Tick + tc.aMotion;
end else ts.BodyTick := ts.BodyTick + 30000;
end;
end;
で急所突き追加です
ちょっと処理が違うかもしれませんが
148: //チャージ_アロー
begin
//とばす方向決定処理
//FWからのパクリ
xy.X := ts.Point.X - Point.X;
xy.Y := ts.Point.Y - Point.Y;
if abs(xy.X) > abs(xy.Y) * 3 then begin
//横向き
if xy.X > 0 then b := 6 else b := 2;
end else if abs(xy.Y) > abs(xy.X) * 3 then begin
//縦向き
if xy.Y > 0 then b := 0 else b := 4;
end else begin
if xy.X > 0 then begin
if xy.Y > 0 then b := 7 else b := 5;
end else begin
if xy.Y > 0 then b := 1 else b := 3;
end;
end;
//ノックバック処理
if (dmg[0] > 0) then begin
SetLength(bb, 4);
bb[0] := 4;
xy := ts.Point;
DirMove(tm, ts.Point, b, bb);
//ブロック移動
if (xy.X div 8 <> ts.Point.X div 8) or (xy.Y div 8 <> ts.Point.Y div 8) then begin
with tm.Block[xy.X div 8][xy.Y div 8].Mob do begin
assert(IndexOf(ts.ID) <> -1, 'MobBlockDelete Error');
Delete(IndexOf(ts.ID));
end;
tm.Block[ts.Point.X div 8][ts.Point.Y div 8].Mob.AddObject(ts.ID, ts);
end;
ts.pcnt := 0;
//パケ送信
WFIFOW(0, $0088);
WFIFOL(2, ts.ID);
WFIFOW(6, ts.Point.X);
WFIFOW(8, ts.Point.Y);
SendBCmd(tm, ts.Point, 10);
end;
if not DamageProcess1(tm, tc, ts, dmg[0], Tick) then
StatCalc1(tc, ts, Tick);
end;
でチャージアローです
矢作成については本物を見たことがないためどのようなスキルなのか全くわからないので作れません
BBとチャージアローについてはディスペルがかからないそうなのでディスペル処理に
if (tc.MSkill <> 62) and (tc.MSkill <> 148)
の条件を追加してください