if ( Param[4]*100 div 150) < 100 then begin
MDelay := 100 - (Param[4] * 100) div 150;
end else begin
MDelay := 1;
end;
//関係ありませんがこれはもしかしてディレイじゃなくてキャスティング?
end else if Copy(str, 1, 7) = 'option ' then begin
if Copy(str, 8, 5) = 'sight' then begin
tc.Option := 1;
end else if Copy(str, 8, 4) = 'cart' then begin
tc.Option := 13;
end else if Copy(str, 8, 6) = 'falcon' then begin
tc.Option := 14;
end else if (tc.job = 7) and (Copy(str, 8, 4) = 'peko') then begin
tc.Option := 15;
end else if Copy(str, 8, 3) = 'off' then begin
tc.Option := 0;
end;
WFIFOW(0, $0119);
WFIFOL(2, tc.PID);
WFIFOW(6, 0);
WFIFOW(8, 0);
WFIFOW(10, tc.Option);
WFIFOB(12, 0);
SendBCmd(tm, tc.Point, 13);
に修正してみました
これだと 動くみたいです
dmg[2] := ATK1
if Param[4] >= ATK1 then begin
dmg[1] := ATK1 * ATK1 div 100
if dmg[1] > dmg[2] then dmg[2] := dmg[1]
end else begin
dmg[1] := ATK1 * Param[4] div 100
end;
以下の部分を上のようにすると良いぽいです
//dmg[1] := ATK1 * Param[4] div 100;
//dmg[2] := ATK1 * ATK1 div 100;
//if dmg[1] > dmg[2] then dmg[1] := dmg[2];
//if dmg[1] <= ATK1 then begin
//dmg[2] := ATK1;
//end else begin
//dmg[2] := dmg[1];
//dmg[1] := ATK1;
//end;
if ATK1 > Param[4] then begin
dmg[1] := Param[4];
end else begin
dmg[1] := ATK1;
end;
dmg[1] := dmg[1] * ATK1 div 100;
dmg[2] := ATK1;
この式は弓の最小攻撃力を決める式。
だから小さい方を使ってる。
dmg[2] := ATK1;
if Param[4] >= ATK1 then begin
dmg[1] := ATK1 * ATK1 div 100;
end else begin
dmg[1] := Param[4] * ATK1 div 100;
end;
if dmg[1] > dmg[2] then dmg[2] := dmg[1];
と思ってましたが普通に修正できました…。∧‖∧
if not Skill[j].Data.Job[Job] then begin
を
if (not Skill[j].Data.Job[Job]) and (not DisableSkillLimit) then begin
にすることで上書きは防げます。
for i := 0 to 2 do begin
MemoMap[i] := '';
MemoPoint[i].X := 0;
MemoPoint[i].Y := 0;
end;
end;
+{アイテム製造関係追加}
+if ID < 100001 then ID := ID + 100001;
+{アイテム製造関係追加}
if ID >= NowCharaID then NowCharaID := ID + 1;
end else if Copy(str, 1, 7) = 'refine ' then begin 以下の
if (tc.Item[i].ID <> 0) and (tc.Item[i].Amount <> 0) and tc.Item[i].Data.IEquip and
(tc.Item[i].Equip <> 0) and (tc.Item[i].Card[0] <> $00ff) then begin
BaseNextEXP := ExpTable[0][BaseLV];
if Job = 0 then i := 0
else if Job < 7 then i := 1
else i := 2;
JobNextEXP := ExpTable[i][JobLV];
という部分がありますが
ここで
ノービスはbaseEXPテーブルを
1次職はノービスのJobEXPテーブルを
2次職は1次職のJobEXPテーブルを読みこんでしまっているようです
解決するには
BaseNextEXP := ExpTable[0][BaseLV];
if Job = 0 then i := 1
else if Job < 7 then i := 2
else i := 3;
JobNextEXP := ExpTable[i][JobLV];
とjobに応じて与えられているiの値を全部+1すればOKです
>>499
prontera.gat,150,89,6 script 案内要員 105,{
mes "[案内要員]";
mes "inputのテストを行います";
input @test;
mes "[案内要員]";
mes "入力された数値は$[@test]です。";
set Zeny = @test;
mes "所持金を$[@test]Zenyにしました。";
close;
}
今これで試してみたところ、うまく動作したのですが・・・どうでしょうか?
うまくいかないスクリプトがあれば、それを掲示してもらえると
原因追及が簡単になります。
お困りの時はスクリプトの掲載をお願いします〜<(_ _)>
>>521
回復速度について
CalcAbility()
〜省略〜
if td.HP2 <> 0 then begin //HP回復速度%
HPDelayFix := HPDelayFix + 100 - td.HP2;
end;
if td.SP2 <> 0 then begin //SP回復速度%
SPDelayFix := SPDelayFix + 100 - td.SP2;
end;
CalcStat()
〜省略〜
for i := 0 to 3 do begin
HPDelayFix := 0;
SPDelayFix := 0;
end;
〜省略〜
j := 100 - HPDelayFix;
if j < 0 then j := 0;
k := 100 - SPDelayFix;
if k < 0 then k := 0;
for i:=0 to 3 do begin
HPDelay[i] := HPDelay[i] * Cardinal(j) div 100;
if HPDelay[i] < 150 then HPDelay[i] := 150;
SPDelay[i] := SPDelay[i] * Cardinal(k) div 100;
if SPDelay[i] < 150 then SPDelay[i] := 150;
end;
該当個所は解ると思うのでこれに差し替えてください…。
PT分配エラーについては
if tpa.Member[i].Map = Map then Inc(m);
を
tc1 := tpa.Member[i];
if tc1 <> nil then begin
if tc1.Map = Map then Inc(m);
にして、同様に
if tpa.Member[i].Map = Map then CalcLvUP(tpa.Member[i],l,w);
を
tc1 := tpa.Member[i];
if tc1 <> nil then begin
if tc1.Map = Map then CalcLvUP(tc1,l,w);
に換えてください。
リミットについては
MonsterDie()内の
if DisableLevelLimit or (tc1.BaseLV < 99) then
と
if DisableLevelLimit or ((tc1.Job = 0) and (tc1.JobLV < 10)) or ((tc1.Job <> 0) and (tc1.JobLV < 50)) then
の条件分岐を外して、
CalcLvUP()内の
tc1.BaseEXP := tc1.BaseEXP + EXP;
を
if DisableLevelLimit or (tc1.BaseLV < 99) then
tc1.BaseEXP := tc1.BaseEXP + EXP;
に、
tc1.JobEXP := tc1.JobEXP + JEXP;
を
if DisableLevelLimit or ((tc1.Job = 0) and (tc1.JobLV < 10)) or ((tc1.Job <> 0) and (tc1.JobLV < 50)) then
tc1.JobEXP := tc1.JobEXP + JEXP;
にしてください。
U系にてVerを問わず、マップ移動時に追加移動処理の場所でエラーがでました。
現状他のユーザの方を呼びこんでの実験だったので006では>534>532の線もあり、
004・005での検証でした。前Verでの報告申し訳御座いません。
main.pas
if (tc.MMode = 0) and (tm.gat[NextPoint.X][NextPoint.Y] <> 0) then begin
>>536
やっぱり私の方では出ませんね…。
とりあえず調べる点は
if (tc.MMode = 0) and (tm.gat[NextPoint.X][NextPoint.Y] <> 0) then begin
だと、tcがnilかどうかとNextPointがgatの最大より大きくないか、
tn.Map := ts.Map;
ならtsがnilでないか。
main.pas
//アイテム&スキル効能地処理
k := k + NPCAction(tm,tn,Tick)
箇所にてマグヌスを使い複数の敵を当てた時にエラーが発生致しました。
U0x007cではDec(tn.Count);の位置でデバッガがストップします。
複数の敵が重なった時、マグヌスが消える際の値がおかしくなっているものではと思い、
置き換えて再度テストして見ましたが、上記の効能地の場所にてエラーが起きました。
此方で書き換えたものは$84: //マグヌス以下を
DamageProcess1(tm, tn.CData, ts1, dmg[0], Tick);
if tn.Count >= 1 then Dec(tn.Count);
if tn.Count <= 0 then begin
DelSkillUnit(tm, tn);
に置き換えましたが、上記エラーを含め問題・修正がありましたら
ご意見ご対処等お聞き出来れば幸いです。宜しくお願い致します。
>初心者スレ120様
いつもご意見・修正等有難う御座います。
U0x007cにてポータルが展開せずSPはそのまま消費された状態になっていたのは
此方のスレを読み返して見ると>>566で書かれていた事はこれを差していたのですね。 >>572
はい、書かれました通りです。実力不備な点もあり、曖昧に書いてしまい申し訳御座いませんでした。 >>571
②項ですが、此方では2人以上で叩いている時、敵を撃破したらエラーになりました。
エラーの箇所はMain.pasの
if (tc1.PartyName = '') or (tpa.EXPShare = 0) then begin
でデバッガストップしました。
DB異常ではないと思うので一応。
Weiss:U0x008a
skill_db:あぷろだ2の[Weiss046](THX!)
で、カート引っ張ってマップ移動すると範囲エラーが出ます。
Common.pas Line:1521
if (Option and 8) <> 0 then begin //カート
i := i + Skill[39].Data.Data1[Skill[39].EffectLV];
を
if (Option and 8) <> 0 then begin //カート
i := i + Skill[39].Data.Data1[Skill[39].Lv];
に修正すると動作しました。
ソースを詳しく追っているわけではないので、もしEffectLvがセットされて
呼び出される状況があったら申し訳ないですが。
死体ヒールが仕様なら…ということでちょっとコード書き換えました。
未テストなので自己責任で。
Main.pas Line:2905辺り(ずれてたらごめんなさい)
54: //リザレクション
begin
//if (tc1.Sit <> 1) or (tc1.HP > 0) then beginこれを
if (tc1.Sit <> 1) then begin //こっちに
更に、6,7行ほど下って
tc1.HP := tc1.HP + dmg[0];//これの後に
if tc1.HP > tc1.MAXHP then tc1.HP := tc1.MAXHP;//追加
これで死体ヒールをかけても蘇生出来ると思います。問題は、「死んだふり」中でも
蘇生で強制起立がかかるということでしょうか。
リザとヒールの問題なのですが、今の条件だと死んでいてもスキルがかかってしまうので
わたしはターゲットの判定を
if (tc1 <> nil) or ((tc1.HP = 0) and (MSkill <>54)) then begin
としています
わたしの古い記憶だと本サーバでは死体ヒールができなくなっていたような気がしましたので〜
>>615
うーむ。65さんもDisableSkillLimit辺りが怪しいという返答が来ているので、
SendCSkillList()のforループ先頭に
if (tc.ver2 <> 9) and (157 < i) then Break;
if (157 < i) and (i < 210) then Continue;
コレでも付けてみてください。
DisableSkillLimit関連で怪しいところはコレぐらいですし。
>>621
すません。全然修正のこと書いて無かったですね…。
カートの修正個所は>>599 の
i := i + Skill[39].Data.Data1[Skill[39].EffectLV];
を
i := i + Skill[39].Data.Data1[Skill[39].Lv];
に
カートを着けたとき鯖移動などで落ちるのは >>616 に書かれている通り、
プッシュカート未修得の際起きます。
CalcStat()の移動速度の部分に
if Skill[39].Lv = 0 then
i := i + Skill[39].Data.Data1[1]
else
i := i + Skill[39].Data.Data1[Skill[39].Lv];
と書き換えることで回避できます。
さてと、読み直してみたらまたきちんと書いてない…。
ClacStat()の移動部分のカート部を書き換えてください。
if (Option and 8) <> 0 then begin //カート
if Skill[39].Lv = 0 then
i := i + Skill[39].Data.Data1[1]
else
i := i + Skill[39].Data.Data1[Skill[39].Lv];
end;
こんな感じで。
if (tc.Item[i].ID <> 0) and (tc.Item[i].Amount <> 0) and tc.Item[i].Data.IEquip and
((tc.Item[i].Equip and l) = l) and (tc.Item[i].Card[0] <> $00ff) and
(tc.Item[i].Refine < 10) then begin
↓
if (tc.Item[i].ID <> 0) and (tc.Item[i].Amount <> 0) and tc.Item[i].Data.IEquip and
((tc.Item[i].Equip and l) = l) and (tc.Item[i].Refine < 10) then begin
>>645
の範囲チェックエラーですが、
Main.pasの
MonsterDie手続き内、ターゲット解除処理の
if (tc1.MMode = 0) and (tc1.MTarget = ts.ID) then begin
tc1.MMode := 0;
tc1.MTarget := 0;
end;
を
if (tc1.MMode <> 0) and (tc1.MTarget = ts.ID) then begin
tc1.MMode := 0;
tc1.MTarget := 0;
end;
に変更すると直ると思います。
連続で失礼します。と、ちょっと長くて申し訳ないのですが、
>複数接続の際に装備の変更が他のキャラに送信されない
のはCommon.pas内部、SendCStatの最後にある
if View then begin
//見た目変更
{中略}
end;
これを
if View then begin
//見た目変更
tm := TMap(Map.Objects[Map.IndexOf(tc.Map)]);
for j := tc.Point.Y div 8 - 2 to tc.Point.Y div 8 + 2 do begin
for i := tc.Point.X div 8 - 2 to tc.Point.X div 8 + 2 do begin
for k := 0 to tm.Block[i][j].CList.Count - 1 do begin
tc1 := tm.Block[i][j].CList.Objects[k] as TChara;
if (tc <> tc1) and (abs(tc.Point.X - tc1.Point.X) < 16) and (abs(tc.Point.Y - tc1.Point.Y) < 16) then begin
WFIFOW(0, $00c3);
WFIFOL(2, tc.ID);
WFIFOB(6, 2);
WFIFOB(7, tc.Weapon);
tc1.Socket.SendBuf(buf, 8);
WFIFOB(6, 3);
WFIFOB(7, tc.Head3);
tc1.Socket.SendBuf(buf, 8);
WFIFOB(6, 4);
WFIFOB(7, tc.Head1);
tc1.Socket.SendBuf(buf, 8);
WFIFOB(6, 5);
WFIFOB(7, tc.Head2);
tc1.Socket.SendBuf(buf, 8);
WFIFOB(6, 8);
WFIFOB(7, tc.Shield);
tc1.Socket.SendBuf(buf, 8);
end;
end;
end;
end;
end;
とすると正常に周囲に通知されると思います(余計なパケが増えそうですが)。
変数j, k, tc1, tmは未定義なのでj, kはinteger, tc1はTChara, tmはTMap
として定義して下さい。
#BugFixのコードも技術スレの方がいいでしょうか?
失礼、
>if (tc <> tc1) and (abs(tc.Point.X - tc1.Point.X) < 16) and
(abs(tc.Point.Y - tc1.Point.Y) < 16) then begin
(先の書き込みだと1行、読みにくくて申し訳ありません)
これは
if (abs(tc.Point.X - tc1.Point.X) < 16) and
(abs(tc.Point.Y - tc1.Point.Y) < 16) then begin
の間違いです。
>PT公平分配のバグ
Common.pas PartyDistribution内の
l := (tpa.EXP + (tpa.EXP div 10) * (m - 1)) div m + 1; //適当〜
w := (tpa.JEXP + (tpa.JEXP div 10) * (m - 1)) div m + 1; //適当〜
この二行を
l := (tpa.EXP + 1) div (m - 1);
w := (tpa.JEXP + 1) div (m - 1);
if 2 < m then begin
l := l + (tpa.EXP div 4) * (m - 2) div (m - 1);
w := w + (tpa.JEXP div 4) * (m - 2) div (m - 1);
end;
これに差し替えると、公平分配が正常に動作します。
Note: If this is a derivative of Athena, then you are required by law to post the source code for it, as it is an open source project and you have posted screenshots, which is a form of the open source project in question..
Note also, if it is a derivative of Yare or any other Open Source project and you post those screenshots then what I posted above is also valid.
Not obeying will lead to prosecution, and changing websites will just further the punishment
>>682
At first it's not a derivative of athena.
Old version of Weiss use athena's route search algorithm,
but now use different code. And other code is original.
Weiss official site is stop since 3 months ago. This site is not official.
however, Weiss is under GPL license, I prepare to open Weiss source code.
please wait for some time.
今日はじめてWeissを使い始めたのですがログインしてキャラを作成するまではいいのですが
「Access violation at address 0046531F in module 'Weiss.exe'.Read of adress 00000090」
と読み込み違反やでとでてゲームが始まりません。
何でこうなるんでしょうか?
//47バイト受信
while (len<47) do begin
len := Socket.ReceiveLength;
end;
if len >= 47 then begin
Socket.ReceiveBuf(buf, len);
if (buf[0] = $dd) and (buf[1] = $1) then begin
///////////////////
{
変更前
if len >= 55 then begin
Socket.ReceiveBuf(buf, len);
if (buf[0] = $64) and (buf[1] = $0) then begin
RFIFOL(2, l);
}
////////////////////
それと暗号化されているから取りあえずはパスワード無視
//if tp.Pass = userpass then begin
if tp.Pass <> userpass then begin