现在最流行的恶意卡服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.leyoucx.com),如需转载[独家发布冒险岛SF修复卡CPU100%的方法],请写明出处
上一篇:盗窃我们的网站系统始终无法超越我们