修過過的內容
duration += from.getStat().dotTime * 1000;
long aniTime = duration;
/*if (skilz != null) {
aniTime += skilz.getAnimationTime();
}*/
status.setCancelTask(aniTime);
if (poison && getHp() > 1) {
//if (getStats().isBoss()) {
// return;
//}
if (status.getchr() != null) {
return;
}
status.setDotTime(duration);
int poisonDot = from.getStat().dot;
int damageIncrease = from.getStat().getDamageIncrease(eff.getSourceId());
if (damageIncrease > eff.getDOT()) {
poisonDot += damageIncrease;
} else {
poisonDot += eff.getDOT();
}
if (from.isAdmin()) {
from.dropMessage(6, "[持續傷害] 開始處理效果 - 技能ID:" + eff.getSourceId());
from.dropMessage(6, "[持續傷害] 加成 - 技能ID:" + eff.getDOT() + " 被動: " + from.getStat().dot + " 被動加成: " + damageIncrease + " 最終加成:" + poisonDot);
}
int poisonDamage = (int) (aniTime / 1000 * ((int) (poisonDot * from.getStat().getCurrentMaxBaseDamage() / 100.0D) / 2));
int damagex = (int) (((getHp() > poisonDamage) ? poisonDamage : (getHp() - 1)) / (aniTime / 1000));
status.setValue(status.getStati(), damagex);
if (from.isAdmin()) {
from.dropMessage(6, "[持續傷害] 持續傷害: " + ((getHp() > poisonDamage) ? poisonDamage : (getHp() - 1)) + " 持續時間:" + aniTime + " 持續掉血:" + status.getX());
}
status.setPoisonSchedule(status.getX(), from);
} else if (statusSkill == 4111003 || statusSkill == 14111001) { // shadow web
try {
poisons.add(status);
status.scheduledoPoison(this);//持续掉血
} finally {
poisonsLock.writeLock().unlock();
}
private boolean reflect = false;
private long cancelTime = 0;
private long dotTime = 0;
private boolean newpoison = true;
public final void cancelPoisonSchedule(MapleMonster mm) {
mm.doPoison(this, weakChr);
this.poisonSchedule = 0;
this.weakChr = null;
}
public WeakReference<MapleCharacter> getchr() {
return this.weakChr;
}
public void setDotTime(long duration) {
this.dotTime = duration;
}
public long getDotTime() {
return this.dotTime;
}
public void setnewpoison(boolean s) {
this.newpoison = s;
}
public void scheduledoPoison(final MapleMonster mon) {
final java.util.Timer timer = new java.util.Timer(true);
final long time = System.currentTimeMillis();
final MonsterStatusEffect eff = this;
if (newpoison) {
TimerTask task = new TimerTask() {
@Override
public void run() {
if (time + getDotTime() > System.currentTimeMillis() && mon.isAlive()) {
//每次需要执行的代码放到这里面。
//if (weakChr.get().isAdmin()) {
// weakChr.get().dropMessage(6, "[持续伤害] 持续伤害");
//}
setnewpoison(false);
mon.doPoison(eff, weakChr);
} else {
setnewpoison(true);
//cancelPoisonSchedule(mon);
timer.cancel();
}
}
};
timer.schedule(task, 0, 1000);
}
}
添加持續掉血類傷害後,會出現隨機返回介面的情況,有時候第一次攻擊就會返回介面,持續掉血的方法,是從TMS端裡抄襲的,請問,問題大概出現在什麼地方呢?有經驗的朋友,希望能指教一下!謝謝!!
補充:當我開啟MaplePacketEncoder.java 的封包發送後,出現返回介面的概率很少出現。
if (ServerConstants.DEBUG) {
int packetLen = inputInitialPacket.length;
int pHeader = readFirstShort(inputInitialPacket);
String pHeaderStr = Integer.toHexString(pHeader).toUpperCase();
pHeaderStr = StringUtil.getLeftPaddedStr(pHeaderStr, '0', 4);
String op = lookupRecv(pHeader);
String Recv = "伺服端發送 " + op + " [" + pHeaderStr + "] (" + packetLen + ")\r\n";
if (packetLen <= 50000) {
//String RecvTo = Recv + HexTool.toString(inputInitialPacket) + "\r\n" + HexTool.toStringFromAscii(inputInitialPacket);//數據包解析
String RecvTo = Recv + HexTool.toString(inputInitialPacket);
System.out.println(RecvTo + "\r\n");
}
}
|