a894985459

修正煉獄巫師復甦相關問題精華

發表於 2023-5-18 23:07:49
a894985459 發表於 2023-5-18 23:07:49 | 顯示全部樓層 |閱讀模式
嗨 又是我
最近跟朋友提到相關Bug 順手看了一下 就順便修復了

問題點:里波會幾乎永久存在、甦醒buff不會消失 存在右上角持續閃爍

各端口存在問題不見得一樣
分段教學
1.里波存在時間
2.甦醒buff不會消失 存在右上角持續閃爍

老樣子 打開你的IDE
找到MapleSummon.java
先宣告
private long SpawnTime;
複製代碼
往下隨意一處增加
    public long getSpawnTime(){
        return SpawnTime;
    }
    
    public void setSpawnTime(long now){
        SpawnTime=now;
    }
複製代碼



轉到MapleCharacter.java先宣告
private Map<Integer, MapleSummon> summons2 = new LinkedHashMap<Integer, MapleSummon>();
複製代碼

在來隨意一處增加
    public Map<Integer, MapleSummon> getSummons() {
        return Collections.synchronizedMap(summons2);
    }
複製代碼

搜尋
if (stat == MapleBuffStat.SUMMON || stat == MapleBuffStat.PUPPET ||
複製代碼
內容大概會是這樣
                if (stat == MapleBuffStat.SUMMON || stat == MapleBuffStat.PUPPET || stat == MapleBuffStat.REAPER || stat == MapleBuffStat.BEHOLDER || stat == MapleBuffStat.DAMAGE_BUFF || stat == MapleBuffStat.RAINING_MINES || stat == MapleBuffStat.ANGEL_ATK) {
                    final int summonId = mbsvh.effect.getSourceId();
                    final List<MapleSummon> toRemove = new ArrayList<MapleSummon>();
                    visibleMapObjectsLock.writeLock().lock(); //We need to lock this later on anyway so do it now to prevent deadlocks.
                    summonsLock.writeLock().lock();
                    try {
                        for (MapleSummon summon : summons) {
                            if (summon.getSkill() == summonId || (stat == MapleBuffStat.RAINING_MINES && summonId == 33101008) || (summonId == 35121009 && summon.getSkill() == 35121011) || ((summonId == 86 || summonId == 88 || summonId == 91) && summon.getSkill() == summonId + 999) || ((summonId == 1085 || summonId == 1087 || summonId == 1090 || summonId == 1179) && summon.getSkill() == summonId - 999)) { //removes bots n tots
                                map.broadcastMessage(SummonPacket.removeSummon(summon, true));
                                map.removeMapObject(summon);
                                visibleMapObjects.remove(summon);
                                toRemove.add(summon);
                            }
複製代碼

在
summonsLock.writeLock().lock();
複製代碼
下方增加
int ReaperTime = 10000 + (2 * ((getSkillLevel(32111006) / 2) * 1000));
複製代碼


在括弧下方增加
if(summon.isReaper() && (System.currentTimeMillis()-summon.getSpawnTime()) >= ReaperTime){
                                map.broadcastMessage(SummonPacket.removeSummon(summon, true));
                                map.removeMapObject(summon);
                                visibleMapObjects.remove(summon);
                                toRemove.add(summon);                                
                            }
複製代碼
P.S.注意括弧位置

轉到
SummonHandler.java
搜尋
 public static final void DamageSummon
複製代碼
內容大概會是
    public static final void DamageSummon(final LittleEndianAccessor slea, final MapleCharacter chr) {
        final int unkByte = slea.readByte();
        final int damage = slea.readInt();
        final int monsterIdFrom = slea.readInt();
        //       slea.readByte(); // stance
        final Iterator<MapleSummon> iter = chr.getSummonsReadLock().iterator();
複製代碼

宣告處一樣增加
int ReaperTime = 10000 + (2 * ((chr.getSkillLevel(32111006) / 2) * 1000));
複製代碼
往下
在
        try {
            while (iter.hasNext()) {
                summon = iter.next();
複製代碼
之下增加
if(summon.isReaper() && (System.currentTimeMillis()-summon.getSpawnTime()) >= ReaperTime){
                    chr.getMap().broadcastMessage(SummonPacket.removeSummon(summon, true));
                    chr.getMap().removeMapObject(summon);
                    chr.removeSummon(summon);                                
                    }
複製代碼
在往下搜尋
if (!summon.isMultiAttack()) {
複製代碼
在整段結尾後增加
int ReaperTime = 10000 + (2 * ((chr.getSkillLevel(32111006) / 2) * 1000));
        if(summon.isReaper() && (System.currentTimeMillis()-summon.getSpawnTime()) >= ReaperTime){
        chr.getMap().broadcastMessage(SummonPacket.removeSummon(summon, true));
        chr.getMap().removeMapObject(summon);
        chr.removeSummon(summon);                                
        }
複製代碼
往下搜尋
 public static final void SubSummon
複製代碼
內容大概會是
    public static final void SubSummon(final LittleEndianAccessor slea, final MapleCharacter chr) {
        final MapleMapObject obj = chr.getMap().getMapObject(slea.readInt(), MapleMapObjectType.SUMMON);
        if (obj == null || !(obj instanceof MapleSummon)) {
            return;
        }
        final MapleSummon sum = (MapleSummon) obj;
        if (sum == null || sum.getOwnerId() != chr.getId() || sum.getSkillLevel() <= 0 || !chr.isAlive()) {
            return;
        }
複製代碼
在這之下增加
        int ReaperTime = 10000 + (2 * ((chr.getSkillLevel(32111006) / 2) * 1000));
        if(sum.isReaper() && (System.currentTimeMillis()-sum.getSpawnTime()) >= ReaperTime){        
        chr.getMap().broadcastMessage(SummonPacket.removeSummon(sum, true));
        chr.getMap().removeMapObject(sum);
        chr.removeSummon(sum);
        }
複製代碼

最後找到內容大概類似下方
        if (didAttack) {
            chr.getMap().broadcastMessage(SummonPacket.pvpSummonAttack(chr.getId(), chr.getLevel(), summon.getObjectId(), summon.isFacingLeft() ? 4 : 0x84, summon.getTruePosition(), ourAttacks));
            if (!summon.isMultiAttack()) {
                chr.getMap().broadcastMessage(SummonPacket.removeSummon(summon, true));
                chr.getMap().removeMapObject(summon);
                chr.removeVisibleMapObject(summon);
                chr.removeSummon(summon);
                if (summon.getSkill() != 35121011) {
                    chr.cancelEffectFromBuffStat(MapleBuffStat.SUMMON);
                }
            }
        }
複製代碼
在這下方增加
int ReaperTime = 10000 + (2 * ((chr.getSkillLevel(32111006) / 2) * 1000));
        if(summon.isReaper() && (System.currentTimeMillis()-summon.getSpawnTime()) >= ReaperTime){
        chr.getMap().broadcastMessage(SummonPacket.removeSummon(summon, true));
        chr.getMap().removeMapObject(summon);
        chr.removeSummon(summon);                                
        }
複製代碼

至此 里波已經可以用正常的時間存在與消失

如果有缺少語法
請到MapleSummon.java
隨意一處增加
    public final boolean isReaper() {
return skill == 32111006;
}
複製代碼

轉到MapleMap.java
找到類似內容
                for (final MapleCharacter mc : characters) {
                    if (mc.isAlive()) {
                        buff.applyTo(mc);

                        switch (monster.getId()) {
                            case 8810018:
                            case 8810122:
                            case 8820001:
                                mc.getClient().getSession().write(EffectPacket.showOwnBuffEffect(buffid, 13, mc.getLevel(), 1)); // HT nine spirit
                                broadcastMessage(mc, EffectPacket.showBuffeffect(mc.getId(), buffid, 13, mc.getLevel(), 1), false); // HT nine spirit
                                break;
                        }
                    }
                }
            } finally {
                charactersLock.readLock().unlock();
            }
        }
...
...
...
...
        final int mobid = monster.getId();
        ExpeditionType type = null;
        if (mobid == 8810018 && mapid == 240060200) { // Horntail
複製代碼
在上方括弧後增加

        if (chr.getBuffedValue(MapleBuffStat.REAPER) != null) {
            Skill reaper = SkillFactory.getSkill(32111006);
            if (reaper.getEffect(chr.getSkillLevel(reaper)).makeChanceResult()) {
                MapleSummon summon = chr.getSummons().get(32111006);
                if (summon == null) {
                    summon = new MapleSummon(chr, 32111006, chr.getSkillLevel(reaper), chr.getPosition(), SummonMovementType.WALK_STATIONARY);
                    summon.setSpawnTime(System.currentTimeMillis());
                    chr.addSummon(summon);
                }
                chr.getMap().spawnSummon(summon);
            }
        }
複製代碼


完成後大概會是這樣
            } finally {
                charactersLock.readLock().unlock();
            }
        }
加入的語法
final int mobid = monster.getId();
        ExpeditionType type = null;
        if (mobid == 8810018 && mapid == 240060200) { // Horntail
複製代碼


來講講第二部分 buff會一直存在的問題
修復點也很簡單
找到MapleStatEffect.java
往下搜尋
} else if (sourceid == 32111006) {
複製代碼
內容大概會是
            if (isBeholder()) {
                tosummon.addHP((short) 1);
            } else if (sourceid == 4341006) {
                applyfrom.cancelEffectFromBuffStat(MapleBuffStat.SHADOWPARTNER);
            } else if (sourceid == 32111006) {
                applyfrom.cancelEffectFromBuffStat(MapleBuffStat.REAPER);
return true; //no buff
            } else if (sourceid == 35111002) {
複製代碼
問題點很簡單
把
return true;
複製代碼
註釋掉或是刪掉就可以了

編譯 至此又修復了一個技能
若還有缺少任何涵式請告知

瀏覽 2704 回復 1

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

返回頂部