微信扫一扫 分享朋友圈

已有 506 人浏览分享

[服務器教學] 修正煉獄巫師復甦相關問題

[複製鏈接]

初窺門道

Rank: 2

308

威望

375

金錢

216

A幣
主題
13
帖子
66
精華
5
綜合社群主題發文量
0
電玩社群主題發文量
0
娛樂社群主題發文量
0
技術社群主題發文量
13
閱讀權限
20
註冊時間
2019-8-9

精華作者勳章

  • TA的每日心情

    2021-6-8 20:12
  • 簽到天數: 14 天

    連續簽到: 0 天

    [LV.3]偶爾看看II

    精華 a894985459 發表於  2023-5-18 23:07:49 | 顯示全部樓層 | 閱讀模式
    本帖最後由 a894985459 於 2023-5-18 23:16 編輯

    嗨 又是我
    最近跟朋友提到相關Bug 順手看了一下 就順便修復了

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

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

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



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

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

    搜尋
    1. if (stat == MapleBuffStat.SUMMON || stat == MapleBuffStat.PUPPET ||
    複製代碼
    內容大概會是這樣
    1.                 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) {
    2.                     final int summonId = mbsvh.effect.getSourceId();
    3.                     final List<MapleSummon> toRemove = new ArrayList<MapleSummon>();
    4.                     visibleMapObjectsLock.writeLock().lock(); //We need to lock this later on anyway so do it now to prevent deadlocks.
    5.                     summonsLock.writeLock().lock();
    6.                     try {
    7.                         for (MapleSummon summon : summons) {
    8.                             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
    9.                                 map.broadcastMessage(SummonPacket.removeSummon(summon, true));
    10.                                 map.removeMapObject(summon);
    11.                                 visibleMapObjects.remove(summon);
    12.                                 toRemove.add(summon);
    13.                             }
    複製代碼


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


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

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

    宣告處一樣增加
    1. int ReaperTime = 10000 + (2 * ((chr.getSkillLevel(32111006) / 2) * 1000));
    複製代碼
    往下

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

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

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

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

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

    4.                         switch (monster.getId()) {
    5.                             case 8810018:
    6.                             case 8810122:
    7.                             case 8820001:
    8.                                 mc.getClient().getSession().write(EffectPacket.showOwnBuffEffect(buffid, 13, mc.getLevel(), 1)); // HT nine spirit
    9.                                 broadcastMessage(mc, EffectPacket.showBuffeffect(mc.getId(), buffid, 13, mc.getLevel(), 1), false); // HT nine spirit
    10.                                 break;
    11.                         }
    12.                     }
    13.                 }
    14.             } finally {
    15.                 charactersLock.readLock().unlock();
    16.             }
    17.         }
    18. ...
    19. ...
    20. ...
    21. ...
    22.         final int mobid = monster.getId();
    23.         ExpeditionType type = null;
    24.         if (mobid == 8810018 && mapid == 240060200) { // Horntail
    複製代碼
    在上方括弧後增加

    1.         if (chr.getBuffedValue(MapleBuffStat.REAPER) != null) {
    2.             Skill reaper = SkillFactory.getSkill(32111006);
    3.             if (reaper.getEffect(chr.getSkillLevel(reaper)).makeChanceResult()) {
    4.                 MapleSummon summon = chr.getSummons().get(32111006);
    5.                 if (summon == null) {
    6.                     summon = new MapleSummon(chr, 32111006, chr.getSkillLevel(reaper), chr.getPosition(), SummonMovementType.WALK_STATIONARY);
    7.                     summon.setSpawnTime(System.currentTimeMillis());
    8.                     chr.addSummon(summon);
    9.                 }
    10.                 chr.getMap().spawnSummon(summon);
    11.             }
    12.         }
    複製代碼


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


    來講講第二部分 buff會一直存在的問題
    修復點也很簡單
    找到MapleStatEffect.java
    往下搜尋
    1. } else if (sourceid == 32111006) {
    複製代碼
    內容大概會是
    1.             if (isBeholder()) {
    2.                 tosummon.addHP((short) 1);
    3.             } else if (sourceid == 4341006) {
    4.                 applyfrom.cancelEffectFromBuffStat(MapleBuffStat.SHADOWPARTNER);
    5.             } else if (sourceid == 32111006) {
    6.                 applyfrom.cancelEffectFromBuffStat(MapleBuffStat.REAPER);
    7. return true; //no buff
    8.             } else if (sourceid == 35111002) {
    複製代碼
    問題點很簡單

    1. return true;
    複製代碼
    註釋掉或是刪掉就可以了

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

    共收到 0 A幣
    打賞榜
    暫無
    暫無
    暫無
    暫無
    ----
    暫無
    ----
    暫無
    ----
    暫無
    ----

    初窺門道

    Rank: 2

    308

    威望

    375

    金錢

    216

    A幣
    主題
    13
    帖子
    66
    精華
    5
    綜合社群主題發文量
    0
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    13
    閱讀權限
    20
    註冊時間
    2019-8-9

    精華作者勳章

  • TA的每日心情

    2021-6-8 20:12
  • 簽到天數: 14 天

    連續簽到: 0 天

    [LV.3]偶爾看看II

     樓主| a894985459 發表於 2023-6-3 02:36:21 | 顯示全部樓層
    補充一下
    如果有里波召喚數量會超級多的情況的話
    1.         if (chr.getBuffedValue(MapleBuffStat.REAPER) != null) {
    2.             Skill reaper = SkillFactory.getSkill(32111006);
    3.             if (reaper.getEffect(chr.getSkillLevel(reaper)).makeChanceResult()){
    4.                 MapleSummon summon = chr.getSummons().get(32111006);
    5.                 if (summon == null) {
    6.                     summon = new MapleSummon(chr, 32111006, chr.getSkillLevel(reaper), chr.getPosition(), SummonMovementType.WALK_STATIONARY);
    7.                     summon.setSpawnTime(System.currentTimeMillis());
    8.                     chr.addSummon(summon);
    9.                 }
    10.                 chr.getMap().spawnSummon(summon);
    11.             }
    12.         }
    複製代碼
    找到以上這段

    1. if (reaper.getEffect(chr.getSkillLevel(reaper)).makeChanceResult()){
    複製代碼
    這邊 把語法改為
    1. if (reaper.getEffect(chr.getSkillLevel(reaper)).makeChanceResult() && chr.getSummonsSize() < 5){
    複製代碼
    應該就能限制里波的召喚數量問題
    控制在地圖上只能出現5隻里波

    不限制的話可能會變這樣.jpg
    您需要登錄後才可以回帖 登錄 | 註冊會員

    本版積分規則

    66

    發文

    375

    金錢

    216

    A幣

    ----------榮譽勳章----------

    精華作者勳章

    熱門推薦
    圖文推薦
    • 聯繫我們

    小黑屋|AICL社群娛樂集團

    GMT+8, 2024-3-29 21:54 , 網路刷新 0.116687 秒 .

    歡迎來到 AICL網路社群

    版權AICL社群所有 2011-2021.

    Total:123 Today:213 Online:322