chenhui540

求助!添加持續掉血類傷害後,會出現隨機返回介面(待測試)

發表於 2023-4-22 19:06:08
chenhui540 發表於 2023-4-22 19:06:08 | 顯示全部樓層 |閱讀模式
1.png
2.png

修過過的內容


        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端裡抄襲的,請問,問題大概出現在什麼地方呢?有經驗的朋友,希望能指教一下!謝謝!!

6.png



補充:當我開啟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");
                }
            }



瀏覽 2879 回復 5

您需要登錄後才可以回帖 登錄 | 註冊會員

返回頂部