详细内容

独家发布冒险岛SF修复卡CPU100%的方法

发布时间:2009/12/30   阅读指数:

现在最流行的恶意卡服BUG就是买满装备以后,按I打开道具栏..点排列道具 “道具栏窗口上的 ↑按扭,就会使服务器CPU使用率高,多开几个号这样搞一下,服务器CPU直接升到%100 导致服务器卡得跟死机一样,而现在很多私服就是因为该原因而被迫关闭,甚至有一些在出售冒险岛服务端的人利用该BUG来威胁正在开冒险岛私服服的人,本人现在将独家公开解决办法:
1、在源码下 ItemSortHandler.java 这个文件 打开后内容如下.:


package net.s f.odinms.net.channel.handler;

import net.s f.odinms.client.MapleClient;
import net.s f.odinms.net.AbstractMaplePacketHandler;
import net.s f.odinms.client.MapleInventoryType;
import net.s f.odinms.client.MapleInventory;
import net.s f.odinms.server.MapleInventoryManipulator;
import net.s f.odinms.server.maps.FakeCharacter;
import net.s f.odinms.tools.MaplePacketCreator;
import net.s f.odinms.tools.data.input.SeekableLittleEndianAccessor;

public class ItemSortHandler extends AbstractMaplePacketHandler {

    @Override
    public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
        c.getPlayer().resetAfkTime();


        slea.readInt();
        byte mode = slea.readByte();

        boolean sorted = false;
        MapleInventoryType pInvType = MapleInventoryType.getByType(mode);
        MapleInventory pInv = c.getPlayer().getInventory(pInvType);

        while (!sorted) {   //我怀疑是这里导致死循环造成的服务器卡CPU的。。
            byte freeSlot = pInv.getNextFreeSlot();
            if (freeSlot != -1) {
                byte itemSlot = -1;
                for (byte i = (byte) (freeSlot + 1); i <= 100; i++) {
                    if (pInv.getItem(i) != null) {
                        itemSlot = i;
                        break;
                    }
                }
                if (itemSlot <= 100 && itemSlot > 0) {
                    MapleInventoryManipulator.move(c, pInvType, itemSlot, freeSlot);
                } else {
                    sorted = true;
                }
            }
        }
        c.getSession().write(MaplePacketCreator.finishedSort(mode));
        c.getSession().write(MaplePacketCreator.enableActions());
    }
}
以上部分代码是端里原始的代码。。个人分析因为上面的排列算法。 使用的   while (!sorted)  WHILE循环导致当道具满的时候,点排列按扭无法跳出循环而造成死循环,从而导致占用服务器CPU过大。。。。 下面是我修改的代码。。大家可以复制整个,替换这个文件的内容..重新编译即可....记住把 s f 中间的空格去掉..


package net.s f.odinms.net.channel.handler;

import net.s f.odinms.client.MapleClient;
import net.s f.odinms.net.AbstractMaplePacketHandler;
import net.s f.odinms.client.MapleInventoryType;
import net.s f.odinms.client.MapleInventory;
import net.s f.odinms.server.MapleInventoryManipulator;
//import net.s f.odinms.server.maps.FakeCharacter;
import net.s f.odinms.tools.MaplePacketCreator;
import net.s f.odinms.tools.data.input.SeekableLittleEndianAccessor;

public class ItemSortHandler extends AbstractMaplePacketHandler {

    @Override
    public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
        c.getPlayer().resetAfkTime();


        slea.readInt();
        byte mode = slea.readByte();
        byte s=0;      
        MapleInventoryType pInvType = MapleInventoryType.getByType(mode);
        MapleInventory pInv = c.getPlayer().getInventory(pInvType);
    
           for(s=0 ;s<90;s++){  //用这个替代while循环,从而解决死循环卡CPU问题
            byte freeSlot = pInv.getNextFreeSlot();
            if (freeSlot != -1) {
                byte itemSlot = -1;
                for (byte i = (byte) (freeSlot + 1); i <= 100; i++) {
                    if (pInv.getItem(i) != null) {
                        itemSlot = i;
                        break;
                    }
                }
                if (itemSlot <= 100 && itemSlot > 0) {
                   MapleInventoryManipulator.move(c, pInvType, itemSlot, freeSlot);
                }else {
                    break;
                }
            }
      
    }   c.getSession().write(MaplePacketCreator.finishedSort(mode));
        c.getSession().write(MaplePacketCreator.enableActions());
        c.getSession().write(MaplePacketCreator.serverNotice(1, "重新排序完成!"));
    }
}

这是我自己发现的。。绝对不是转载或抄袭。。虽然没什么技术含量。。但确实可以解决这个问题。。。要转载请注名出处为爱上冒险岛

本文来源于心动冒险岛(www.lnshengyou.com),如需转载[独家发布冒险岛SF修复卡CPU100%的方法],请写明出处

上一篇:盗窃我们的网站系统始终无法超越我们
下一篇:骑士职业攻击加点,命中偏低的问题
返回顶部