2013年6月9日 星期日

【Java教學】簡易的自動補血道具


紫色部分為 0327 新增加 開啟 & 關閉 顯示 

麻煩請稍做更新,以免出現一些小問題 
(目前已知問題:古白消耗完畢,自動關閉皆正常;但天照不會自動更新為\"關閉\",應該是要加入類PINKNAME判斷
會有一支青龍一直跑出來的大大們,請把下面這句 註解掉 
//_pc.sendPackets(new S_SkillSound(_pc.getId(), 6588)); 

如果有多餘寫法 or 更好的建議,歡迎分享,小弟願意精進 

小弟想新增祭司系統,不知道有無大大可以教學或是有收藏文資料能分享,感謝萬分 

在祭司系統沒搞出來,先暫時用這個頂頂吧!! 

簡易的自動補血道具 

參考修改 夜小空 所發的 隨身補師(虛擬)-好用的道具 網頁如右 http://bbs.99nets.com/read.php?tid=578453 

參考修改 missu0524 所發的 持續魔法特效 網頁如右 http://bbs.99nets.com/read.php?tid=758269&fpage=2 

參考修改 alen6700 && eason817 兩位大大,提出測試意見與修改方法 

eason817 大有提出依照PINKNAME判斷法修改 isAutoHp() 

有興趣玩家可試著測試看看,小弟並無加入判斷 


【修改開始】 

首先請先裝好 missu0524 的持續魔法特效 

開啟 L1PcInstance 這一段有做修改,請核對作更正 

找到 private MpReductionByAwake _mpReductionByAwake; 
在下方新增
private SkillSound _SkillSoundAutoHp;//add 修改持續出現魔法特效 by missu0524



找到 private boolean _mpReductionActiveByAwake; 
在下方新增
private boolean _SkillSoundActiveAutoHp;//add 修改持續出現魔法特效 by missu0524



找到public void setGres(boolean flag) {
_isGres = flag;
}
 
在下方新增
//0327 新增 自動補血判斷
public boolean isAutoHp() {
return _isAutoHp;
}
public void setAutoHp(boolean flag) {
_isAutoHp = flag;
}
//0327 新增 自動補血判斷



找到 private boolean _isPinkName = false; 
在下方新增
private boolean _isAutoHp = false;//ADD 0327 自動補血參數




找到 missu0524 大所寫的這段 
public void startSkillSound() {
final int INTERVAL = 4000; //
間隔時間
SkillSound SkillSound;
SkillSound = new SkillSound(this);
_regenTimer.scheduleAtFixedRate(SkillSound,
INTERVAL, INTERVAL);
}
 
在下方新增 這一段有做修改,請核對作更正 
public void startSkillSound_autoHP() {
final int INTERVAL = 600; // 間隔時間
if (!_SkillSoundActiveAutoHp) {
_SkillSoundAutoHp = new SkillSound(this);
_regenTimer.scheduleAtFixedRate(_SkillSoundAutoHp,
INTERVAL, INTERVAL);
_SkillSoundActiveAutoHp = true;
setAutoHp(true);//自動補血判定 0327新增
}
}
public void stopSkillSound_autoHP() {
if (_SkillSoundActiveAutoHp) {
_SkillSoundAutoHp.cancel();
_SkillSoundAutoHp = null;
_SkillSoundActiveAutoHp = false;
setAutoHp(false);//自動補血判定 0327新增
}
}



final int INTERVAL = 600; // 間隔時間 
這段為補血的間隔時間,依個人需求設定即可。 

L1PcInstance 這邊就完成了 

再來請開啟 missu0524 所新增的 SkillSound 
這是原檔,因為有人反應無法下載,故放上
M大有反應,小弟會撤掉這段。 
複製後,貼上文件夾,改副檔名為JAVA 
SkillSound .java

package Threading;
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 SkillSound extends TimerTask {
private static Logger _log = Logger.getLogger(SkillSound.class
.getName());
private final L1PcInstance _pc;
public SkillSound(L1PcInstance pc) { //建構
_pc = pc;
}
@Override
public void run() {
try {
if (_pc.isDead()) {
return;
}
_pc.sendPackets(new S_SkillSound(_pc.getId(), 6588));
} catch (Throwable e) {
_log.log(Level.WARNING, e.getLocalizedMessage(), e);
}
}
}



會有一支青龍一直跑出來的大大們,請把下面這句 註解掉 
//_pc.sendPackets(new S_SkillSound(_pc.getId(), 6588)); 
找到 import l1j.server.server.model.Instance.L1PcInstance; 
在下方新增

import l1j.server.server.model.Instance.L1ItemInstance;
import l1j.server.server.serverpackets.S_SystemMessage;



再來依照下方修改即可 黑色為原本語法、紫色為新增語法 
public void run() {
try {
if (_pc.isDead()) {
return;
}
 
// 封鎖 LinHelp無條件喝水功能 //木乃伊,衝暈,大地屏障
if (_pc.isParalyzed() || _pc.hasSkillEffect(33) || _pc.hasSkillEffect(71) || _pc.hasSkillEffect(87) || _pc.hasSkillEffect(157)) {
return;
}
/** 無法使用道具地圖 */
if (!_pc.getMap().isUsableItem()) {
_pc.stopSkillSound_autoHP(); //自動停止
_pc.sendPackets(new S_SystemMessage(\"這個地圖無法使用自動補血,關閉 天照。\"));
return;
}


//天照<自動補血
int pcLV = _pc.getLevel(); //玩家等級 

int pcHP = _pc.getCurrentHp(); //玩家目前HP 

int autoHP = ((short)(_pc.getMaxHp()*0.5)); 
//設定 低於最大HP的多少值,補血(目前設定 為最大HP的一半

int autoHP2 =((short)(_pc.getCurrentHp()* 0.05)); 
// 設定 <補血量的條件之一> 0.05是我隨便亂設定的,自行修改判斷 

int auto_HP = autoHP2 + pcLV; //補血總量 

if (_pc.getInventory().checkItem(40024)){ //檢查身上有無 古代白水40024 

if (_pc.getInventory().checkItem(700115)&& (pcHP < autoHP)) { 
//檢查身上有無 天照700117&& 判斷玩家目前HP是否小於最大HP的一半 

_pc.setCurrentHp(pcHP + (autoHP2 + pcLV)); 
//補血總量 = (目前HP*0.05 + 等級值
_pc.sendPackets(new S_SkillSound(_pc.getId(), 832)); //832 魔法圖示 
_pc.broadcastPacket(new S_SkillSound(_pc.getId(), 832)); 
if(auto_HP > 150){ //補血量 高於150 古白消耗 2瓶;低於則 1 
_pc.getInventory().consumeItem(40024, 2); // 扣除消耗 古白
}else { _pc.getInventory().consumeItem(40024, 1); // 扣除消耗 古白
} //下面是增設白水喝完,自動停止 
else {_pc.stopSkillSound_autoHP(); //自動停止,擺在這裡 
_pc.sendPackets(new S_SystemMessage(\"\\\\fW\"+\"天照,所需藥水不足。\")); 
_pc.sendPackets(new S_SystemMessage(\"\\\\fW\"+\"關閉自動補血,天照。\")); 
_pc.sendPackets(new S_SkillSound(_pc.getId(), 6588)); //會一直出現青龍,註解掉這段 
} catch (Throwable e) { 
_log.log(Level.WARNING, e.getLocalizedMessage(), e); 

SkillSound 這邊就完成了 

再來請開啟 C_ItemUSe 

此段 標註0327為新增部分 
隨便個找個位子,加入

} else if (itemId == 700115){ //天照 <自動補血道具>
if(pc.getInventory().checkItem(700115)&& pc.getInventory().checkItem(40024)){
if (!pc.isAutoHp()) {// 0327新增沒有開啟 自動補血判斷,則執行以下
//檢查身上有無 天照 700115 && 古代白水 40024
pc.startSkillSound_autoHP();
  pc.sendPackets(new S_SystemMessage(\"\\\\fW\"+\"開啟自動補血,天照。\"));
l1iteminstance.setNowAutoHp(true); //0327新增
}else{pc.stopSkillSound_autoHP(); //0327新增
pc.sendPackets(new S_SystemMessage(\"\\\\fW\"+\"關閉自動補血,天照。\")); //0327新增
  l1iteminstance.setNowAutoHp(false); //0327新增
} //0327新增
}else{pc.stopSkillSound_autoHP();
pc.sendPackets(new S_SystemMessage(\"\\\\fW\"+\"天照,所需藥水不足。\"));
l1iteminstance.setNowAutoHp(false); //0327新增
}  
//End



再來請開啟 L1ItemInstance 

找到 public void stopEquipmentTimer(L1PcInstance pc) { 
if (getRemainingTime() > 0) { 
_equipmentTimer.cancel(); 
_equipmentTimer = null; 
在下方新增

//ADD 0327 自動補血開關 參數
private boolean _isNowAutoHp = false;

public boolean isNowAutoHp() {
return _isNowAutoHp;
}
public void setNowAutoHp(boolean flag) {
_isNowAutoHp = flag;
}
//END




找到if (itemId == 40001 || itemId == 40002) { // 40001 or
if (getRemainingTime() <= 0) {
name.append(\" ($11)\");
}
}
}
 
在下方新增
if (itemId == 700115) { //0327 新增 自動補血 天照 開關
if (!isNowAutoHp()) { // 開啟參數,讓核心判定物品是否開啟
name.append(\"(關閉)\");
} else {
name.append(\"(開啟)\");
}
}



DB 道具

700115天照天照materialnormalgemstone0313829830100000000100000010


以下追加 防止LH2、木乃伊、大地屏障、衝擊之暈、特定地圖無法使用的寫法 
SkillSound.java

if (_pc.isDead()) {
return;
}



下方加入:
// 封鎖 LinHelp無條件喝水功能 //木乃伊,衝暈,大地屏障
if (_pc.isParalyzed() || _pc.hasSkillEffect(33) || _pc.hasSkillEffect(71) || _pc.hasSkillEffect(87) || _pc.hasSkillEffect(157)) {
return;
}

/** 下面這個就看個人要不要加上 */
if (!_pc.getMap().isUsableItem()) {
_pc.sendPackets(new S_SystemMessage("這個地圖無法使用自動喝水,關閉自動喝水功能。"));
_pc.stopSkillSound_autoHP(); //自動停止,擺在這裡 (此處修正部分為順序)
}


沒有留言:

張貼留言