在 armor_set 增加欄位 效果編號 - effect_id 及 效果間隔 - interval (單位:千分之一秒)
讓使用者在db可以設定穿套裝時設定法術效果及效果出現的頻率。
◇設定部分◇
step 1.
在db下按f6, 輸入下列資料,按ENTER。
ALTER table `armor_set` add `effect_id` int(10) NOT NULL default 0;
ALTER table `armor_set` add `interval` int(10) NOT NULL default 0;
複製代碼step 2.
在 L1ArmorSets 下找個適當的地方加入- ( l1j.server.server.templates.L1ArmorSets) // 套裝效果
private int _effect_id;
public int getEffectId() {
return _effect_id;
}
public void setEffectId(int i) {
_effect_id = i;
}
private int _interval;
public int getInterval() {
return _interval;
}
public void setInterval(int i) {
_interval = i;
}
複製代碼step 3.
在 ArmorSetTable 下找-
as.setDefenseFire(rs.getInt("defense_fire"));
as.setDefenseEarth(rs.getInt("defense_earth"));
複製代碼在下面加入-
as.setEffectId(rs.getInt("effect_id")); // 套裝效果
as.setInterval(rs.getInt("interval"));
複製代碼step 4.
在 L1ArmorSet 下找 - ( l1j.server.server.model.L1ArmorSet)
impl.addEffect(new AcHpMpBonusEffect(armorSets.getAc(),
armorSets.getHp(), armorSets.getMp(), armorSets
.getHpr(), armorSets.getMpr(), armorSets
.getMr()));
複製代碼更動為-
impl.addEffect(new AcHpMpBonusEffect(armorSets.getAc(),
armorSets.getHp(), armorSets.getMp(), armorSets
.getHpr(), armorSets.getMpr(), armorSets
.getMr(),armorSets.getEffectId(),armorSets.getInterval())); // 套裝效果
複製代碼找 -
private final int _regenMp;
private final int _addMr;
複製代碼在下面加入-
private final int _addEffectId; // 套裝效果
private final int _addInterval;
複製代碼找 -
public AcHpMpBonusEffect(int ac, int addHp, int addMp, int regenHp,
int regenMp, int addMr) {
_ac = ac;
_addHp = addHp;
_addMp = addMp;
_regenHp = regenHp;
_regenMp = regenMp;
_addMr = addMr;
}
複製代碼更動為 -
public AcHpMpBonusEffect(int ac, int addHp, int addMp, int regenHp,
int regenMp, int addMr,int addEffectId ,int addInterval) { // 套裝效果
_ac = ac;
_addHp = addHp;
_addMp = addMp;
_regenHp = regenHp;
_regenMp = regenMp;
_addMr = addMr;
_addEffectId = addEffectId; // 套裝效果
_addInterval = addInterval;
}
複製代碼找 -
public void giveEffect(L1PcInstance pc) {
pc.addAc(_ac);
pc.addMaxHp(_addHp);
pc.addMaxMp(_addMp);
pc.addHpr(_regenHp);
pc.addMpr(_regenMp);
pc.addMr(_addMr);
}
複製代碼更動為 -
public void giveEffect(L1PcInstance pc) {
pc.addAc(_ac);
pc.addMaxHp(_addHp);
pc.addMaxMp(_addMp);
pc.addHpr(_regenHp);
pc.addMpr(_regenMp);
pc.addMr(_addMr);
if (_addEffectId !=0){ // 套裝效果
pc.startSustainEffect(pc ,_addEffectId , _addInterval);
}
}
複製代碼找 -
public void cancelEffect(L1PcInstance pc) {
pc.addAc(-_ac);
pc.addMaxHp(-_addHp);
pc.addMaxMp(-_addMp);
pc.addHpr(-_regenHp);
pc.addMpr(-_regenMp);
pc.addMr(-_addMr);
}
複製代碼更動為 -
public void cancelEffect(L1PcInstance pc) {
pc.addAc(-_ac);
pc.addMaxHp(-_addHp);
pc.addMaxMp(-_addMp);
pc.addHpr(-_regenHp);
pc.addMpr(-_regenMp);
pc.addMr(-_addMr);
if (_addEffectId !=0){ // 套裝效果
pc.stopSustainEffect();
}
}
複製代碼step 5.
在 l1j.william 下新增類別 - SustainEffect (原 m大之 skillsound 改寫)package l1j.william;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.serverpackets.S_SkillSound;
public class SustainEffect extends TimerTask {
private static Logger _log = Logger.getLogger(SustainEffect.class.getName());
private final L1PcInstance Active_pc;
private final int effect_id;
public SustainEffect(L1PcInstance pc ,int effect) {
Active_pc = pc;
effect_id = effect;
}
@Override
public void run() {
try {
if (Active_pc.isDead()) {
return;
}
Active_pc.sendPackets(new S_SkillSound(Active_pc.getId(), effect_id));
Active_pc.broadcastPacket(new S_SkillSound(Active_pc.getId(), effect_id)); // 是否加入,請自行考量
} catch (Throwable e) {
_log.log(Level.WARNING, e.getLocalizedMessage(), e);
}
}
}
複製代碼step 6.
在 L1PcInstance 下找個適當的地方加入 -
// 套裝效果
private SustainEffect SustainEffect; // 記得先 import l1j.william.SustainEffect;
public void startSustainEffect(L1PcInstance pc ,int effect_id ,int Interval) {
final int _Interval = Interval; // 間隔時間
SustainEffect = new SustainEffect(pc ,effect_id);
_regenTimer.scheduleAtFixedRate(SustainEffect,_Interval, _Interval);
}
public void stopSustainEffect() {
SustainEffect.cancel();
SustainEffect = null;
}
複製代碼
......................................................
假如實裝OK了
人物走動後 卻出現效果還在屁股後面
請配合法術效果出現、走速、間隔,來調整至適當的情況。
將 skillsound 改成 -
S_EffectLocation packet = new S_EffectLocation(locx, locy, 法術效果編號);
pc.sendPackets(packet);
pc.broadcastPacket(packet); // 若要省資源,可對 broadcastPacket 做限制
其中,locx locy 先判斷是否與上一個 座標相同,若相同則不變~也就是原地停止時效果會在腳下!!
若座標不同則表示是在移動狀態,用取得人物面向,對下一出現的地點做預設,比如往面向前的2格~ (面向0~7的座標寫法可參火牢)
這樣也許可以~不過要實際去做才能調整至適當的情形!!
沒有留言:
張貼留言