전사팩 자동물약기능
몇일간 소스뜯어보다가 자동물약 구현해봤습니다.
커맨드를 통해 자동물약 퍼센트를 설정하면
해당 퍼센트 이하로 현재피가 내려가면 자동으로 물약을 사용하는 소스입니다.
/// CommandController.java 추가
static public boolean toCommand(object o, String cmd){
.
.
.
// 자동물약
}else if(key.equalsIgnoreCase("-자동물약")){
try{
toAutoPotion(o,st);
}catch(Exception e){
if(o!=null)
ChattingController.toChatting(o, "-자동물약 켬 95 : 농축 강력 체력 회복제를 자동으로 사용합니다.", Lineage.CHATTING_MODE_MESSAGE);
ChattingController.toChatting(o, "-자동물약 끔 : 자동물약을 종료합니다.", Lineage.CHATTING_MODE_MESSAGE);
}
return true;
}
.
.
.
}
static private void toAutoPotion(object o, StringTokenizer st) throws Exception{
String onoff = st.nextToken();
PcInstance pc = (PcInstance) o;
if ("켬".equals(onoff)) {
int rate = Integer.valueOf(st.nextToken());
pc.setIsAutoPotion(true);
pc.setAutoPotionPercent(rate);
ChattingController.toChatting(o, new StringBuilder().append("현재 HP가 ").append(rate).append("% 이하이면 농축 강력 체력 회복제를 자동으로 사용합니다.").toString(),
Lineage.CHATTING_MODE_MESSAGE);
} else if ("끔".equals(onoff)){
pc.setIsAutoPotion(false);
pc.setAutoPotionPercent(0);
ChattingController.toChatting(o, new StringBuilder().append("자동물약을 비활성화 합니다.").toString(),
Lineage.CHATTING_MODE_MESSAGE);
}else {
throw new Exception();
}
}
/// Character.java
public class Character extends object {
.
.
.
// 종료처리
@Override
public void close(){
super.close();
level = nowHp = maxHp = dynamicHp = nowMp = maxMp = dynamicMp = ac = dynamicAc =
Str = Con = Dex = Wis = Int = Cha = dynamicInt = dynamicStr = dynamicCon = dynamicDex =
dynamicWis = dynamicCha = dynamicTicHp = dynamicTicMp = lvStr = lvCon =
lvDex = lvWis = lvInt = lvCha = dynamicSp = dynamicMr = food = dynamicEarthress = dynamicWaterress =
dynamicFireress = dynamicWindress = earthress = waterress = fireress = windress = dynamicAddDmg = 0;
itemWeight = exp = setitemHp = setitemMp = setitemInt = setitemStr = setitemCon = setitemDex = setitemWis =
setitemCha = setitemMr = setitemSp = setitemTicHp = setitemTicMp = setitemEarthress = setitemWaterress =
setitemFireress = setitemWindress = dynamicAddDmgBow = dynamicAddHit = dynamicAddHitBow =
setitemAc = reduction = dynamicReduction = dynamicEr = dynamicDg =
dynamicStunlevel=dynamicStunmr = stunlevel = stunmr = autoPotionPercent = 0;
hpMove = mpMove = hpFight = mpFight = isAutoPotion = false;
delay_magic = 0;
TimeHpTic = getHpTime();
TimeMpTic = getMpTime();
}
// 자동물약 변수 추가
private boolean isAutoAttack;
private boolean isAutoPotion;
// 자동물약 getter/setter
public boolean getIsAutoPotion() {
return isAutoPotion;
}
public void setIsAutoPotion(boolean isAutoPotion) {
this.isAutoPotion = isAutoPotion;
}
// CharacterController.java
static public void toTimer(long time){
// 처리할 객체 순회.
for(object o : getList()){
// 자연회복 처리.
try {
if(!o.isDead()){
if(o instanceof Character){
Character cha = (Character)o;
ItemInstance item = null;
int tic_hp = cha.isHpTic() ? cha.hpTic() : 0;
int tic_mp = cha.isMpTic() ? cha.mpTic() : 0;
// 사용자일때 확인하기.
if(cha instanceof PcInstance){
// 인벤토리 무게오바일때
if(cha.getInventory()!=null && cha.getInventory().isWeightPercent(50)==false){
// 여관맵이라면 피 차게해야됨.
// 엑조틱 바이탈라이즈 시전중일때 차게 해야됨.
// 여관맵이 아닐때.
if(!InnController.isInnMap(cha) && !cha.isBuffExoticVitalize() && !cha.isBuffAdditionalFire()) {
tic_hp = tic_mp = 0;
// 요정족 망토를 착용중이라면 피차게 해야됨.
item = cha.getInventory().getSlot(Lineage.SLOT_CLOAK);
if( item!=null && item instanceof ElvenCloak )
tic_hp = 1;
}
}
try {
//자동물약
if(cha.getIsAutoPotion() && cha.getHpPercent() < cha.getAutoPotionPercent() && cha.getInventory()!=null) {
ItemInstance ii = cha.getInventory().findDbNameId(1253);
if(ii != null&& ii.isClick((PcInstance) o)) {
ii.toClick(cha, null);
}
}
}catch(Exception e) {
e.printStackTrace();
}
}
// 버서커상태 무시.
if(o.isBuffBerserks())
tic_hp = tic_mp = 0;
// 틱 처리.
if(tic_hp>0 && cha.getTotalHp()!=cha.getNowHp())
cha.setNowHp(cha.getNowHp() + tic_hp);
if(tic_mp>0 && cha.getTotalMp()!=cha.getNowMp())
cha.setNowMp(cha.getNowMp() + tic_mp);
}
}
} catch (Exception e) {
lineage.share.System.println("자연회복 처리.");
lineage.share.System.println(" : "+o.toString());
lineage.share.System.println(e);
}
// 주기적으로 호출에 사용.
try {
o.toTimer(time);
} catch (Exception e) {
lineage.share.System.println("주기적으로 호출에 사용.");
lineage.share.System.println(" : "+o.toString());
lineage.share.System.println(e);
}
}
}