Would you like to react to this message? Create an account in a few clicks or log in to continue.

小.大咘這粉重要!~(關於卡CPU...

2 posters

向下

小.大咘這粉重要!~(關於卡CPU... Empty 小.大咘這粉重要!~(關於卡CPU...

發表  bb9782011 周四 6月 24, 2010 9:11 pm

小.大咘XD
我去浪漫找到1篇文章關於卡CPU...
因為我看不懂所以給你看XD...- -"
沒用也沒辦法-//-

引用自:http://bbs.yoyo-do.com/thread-797962-1-2.html

解決辦法:
1、在源碼下 ItemSortHandler.java 這個文件 打開後內容如下.:


package net.sf.odinms.net.channel.handler;

import net.sf.odinms.client.MapleClient;
import net.sf.odinms.net.AbstractMaplePacketHandler;
import net.sf.odinms.client.MapleInventoryType;
import net.sf.odinms.client.MapleInventory;
import net.sf.odinms.server.MapleInventoryManipulator;
import net.sf.odinms.server.maps.FakeCharacter;
import net.sf.odinms.tools.MaplePacketCreator;
import net.sf.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過大。。。。 下面是我修改的代碼。。大家可以複製整個,替換這個文件的內容..重新編譯即可....

package net.sf.odinms.net.channel.handler;

import net.sf.odinms.client.MapleClient;
import net.sf.odinms.net.AbstractMaplePacketHandler;
import net.sf.odinms.client.MapleInventoryType;
import net.sf.odinms.client.MapleInventory;
import net.sf.odinms.server.MapleInventoryManipulator;
import net.sf.odinms.server.maps.FakeCharacter;
import net.sf.odinms.tools.MaplePacketCreator;
import net.sf.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, "重新排序完成!"));
}




引用自:http://bbs.yoyo-do.com/thread-797962-1-2.html


bb9782011 在 周五 6月 25, 2010 9:11 pm 作了第 1 次修改 (原因 : 怕有人拿來作怪)
bb9782011
bb9782011

文章數 : 4
注冊日期 : 2010-06-06
年齡 : 28
來自 : 台中

回頂端 向下

小.大咘這粉重要!~(關於卡CPU... Empty 回復: 小.大咘這粉重要!~(關於卡CPU...

發表  FoReVeR☆咘 周四 6月 24, 2010 9:36 pm


大咘說~ 本服端無法更改卡CPU的BUG
FoReVeR☆咘
FoReVeR☆咘
↗GM↙
↗GM↙

文章數 : 50
注冊日期 : 2010-01-01
年齡 : 29
來自 : 棉被底下xD

http://forever2.forum888.biz

回頂端 向下

回頂端


 
這個論壇的權限:
無法 在這個版面回復文章