2014年8月8日 星期五

【Java教學】套裝一定時間顯示動畫特效

在 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的座標寫法可參火牢)

這樣也許可以~不過要實際去做才能調整至適當的情形!!

沒有留言:

張貼留言