本排名系統最初由99nets.spofpak首發
經過我的整理,然后經過missu0524的改良(還有一個missu0524的版本,目前還沒有辦法適當地套用在我自己的版本上)
再經由9001183ex的共同努力,目前達成如下效果,在收集排名的同時避免太多人點擊而造成伺服器LAG.
理論上而言,可以套用到從三年前到現在的任何版本......
本段代碼由missu0524所提供
[Copy to clipboard]
CODE:
private String[] getPlayersExp() throws SQLException { //等级排名
String[] name = new String[10];
PreparedStatement pstm1 = null;
ResultSet rs = null;
Connection con = null;
con = L1DatabaseFactory.getInstance().getConnection();
int cc = 0;
while (cc < 10) {
pstm1 = con.prepareStatement("select char_name from characters where accesslevel=0 order by exp DESC limit "+cc+",1;");
rs = pstm1.executeQuery();
while (rs.next()) {
name[cc] = rs.getString("char_name");
}
SQLUtil.close(rs);
cc++;
}
return name;
}
通過讀取DB內所保存的數據而非玩家的當前數據,所以每次讀取的應該是在線玩家上線時的數據,每次有玩家下線,DB資料庫更新此排名也隨之更新.
[Copy to clipboard]
CODE:
if (((L1NpcInstance)obj).getNpcTemplate().get_npcId()==123456) { //排行榜NPC的编号
L1NpcInstance npc = (L1NpcInstance) obj;
int time = npc.getSkillEffectTimeSec(123456);
if (s.equalsIgnoreCase("playersexp")) { //显示等级前10
if (!npc.hasSkillEffect(123456) || pc.isGm()) {
htmldata = getPlayersExp();
htmlid = "getexp";
npc.setSkillEffect(123456, 1800*1000);
} else {
npc.broadcastPacket(new S_NpcChatPacket(npc, "最新排名的信息还需要"+ time +"秒的时间,请稍后再来!", 0));
Thread.sleep(10000);
}
}
}
每半小時可以查詢一人次......這便是此寫法的不是很人性化的一個地方了,為了避免LAG,暫時也只好這樣了.
----------------------------------------------------------------------------
softpak曾經寫過的排行榜,只是拿過來稍稍改了一下.因為softpak以前是發在99的,所以請勿隨意轉載.
希望套用等級排名而又不希望太過於佔用資源導致伺服器LAG的朋友請將此貼所有跟貼看完
看完後相信可以有一個比較適當的解決方法給你!
對話檔命令添加:
if (s.equalsIgnoreCase("playersexp")) { //顯示等級前10
htmldata = getPlayersExp();
htmlid = "playersexp";
}
寫一個<var src="#xx">的對話檔,命令為 playersexp 備用
隨意找個能添加的java
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
private String[] getPlayersExp() throws SQLException { //等級排名 by softpak .jhony修正
String msg1 = null; String msg2 = null; String msg3 = null; String msg4 = null;
String msg5 = null; String msg6 = null; String msg7 = null; String msg8 = null;
String msg9 = null; String msg10 = null;
PreparedStatement pstm1 = null; PreparedStatement pstm2 = null;
PreparedStatement pstm3 = null; PreparedStatement pstm4 = null;
PreparedStatement pstm5 = null; PreparedStatement pstm6 = null;
PreparedStatement pstm7 = null; PreparedStatement pstm8 = null;
PreparedStatement pstm9 = null; PreparedStatement pstm10 = null;
ResultSet rs1 = null; ResultSet rs2 = null;
ResultSet rs3 = null; ResultSet rs4 = null;
ResultSet rs5 = null; ResultSet rs6 = null;
ResultSet rs7 = null; ResultSet rs8 = null;
ResultSet rs9 = null; ResultSet rs10 = null;
Connection con = null;
String[] expresult = null;
con = L1DatabaseFactory.getInstance().getConnection();
pstm1 = con.prepareStatement("select char_name from characters where accesslevel=0 order by exp DESC limit 0,1;");
pstm2 = con.prepareStatement("select char_name from characters where accesslevel=0 order by exp DESC limit 1,1;");
pstm3 = con.prepareStatement("select char_name from characters where accesslevel=0 order by exp DESC limit 2,1;");
pstm4 = con.prepareStatement("select char_name from characters where accesslevel=0 order by exp DESC limit 3,1;");
pstm5 = con.prepareStatement("select char_name from characters where accesslevel=0 order by exp DESC limit 4,1;");
pstm6 = con.prepareStatement("select char_name from characters where accesslevel=0 order by exp DESC limit 5,1;");
pstm7 = con.prepareStatement("select char_name from characters where accesslevel=0 order by exp DESC limit 6,1;");
pstm8 = con.prepareStatement("select char_name from characters where accesslevel=0 order by exp DESC limit 7,1;");
pstm9 = con.prepareStatement("select char_name from characters where accesslevel=0 order by exp DESC limit 8,1;");
pstm10 = con.prepareStatement("select char_name from characters where accesslevel=0 order by exp DESC limit 9,1;");
rs1 = pstm1.executeQuery();
while (rs1.next()) {
msg1 = rs1.getString("char_name");
}
rs2 = pstm2.executeQuery();
while (rs2.next()) {
msg2 = rs2.getString("char_name");
}
rs3 = pstm3.executeQuery();
while (rs3.next()) {
msg3 = rs3.getString("char_name");
}
rs4 = pstm4.executeQuery();
while (rs4.next()) {
msg4 = rs4.getString("char_name");
}
rs5 = pstm5.executeQuery();
while (rs5.next()) {
msg5 = rs5.getString("char_name");
}
rs6 = pstm6.executeQuery();
while (rs6.next()) {
msg6 = rs6.getString("char_name");
}
rs7 = pstm7.executeQuery();
while (rs7.next()) {
msg7 = rs7.getString("char_name");
}
rs8 = pstm8.executeQuery();
while (rs8.next()) {
msg8 = rs8.getString("char_name");
}
rs9 = pstm9.executeQuery();
while (rs9.next()) {
msg9 = rs9.getString("char_name");
}
rs10 = pstm10.executeQuery();
while (rs10.next()) {
msg10 = rs10.getString("char_name");
}
expresult = new String[] {String.valueOf(msg1),String.valueOf(msg2),String.valueOf(msg3),String.valueOf(msg4),String.valueOf(msg5),String.valueOf(msg6),String.valueOf(msg7),String.valueOf(msg8),String.valueOf(msg9),String.valueOf(msg10)};
SQLUtil.close(rs1);
SQLUtil.close(rs2);
SQLUtil.close(rs3);
SQLUtil.close(rs4);
SQLUtil.close(rs5);
SQLUtil.close(rs6);
SQLUtil.close(rs7);
SQLUtil.close(rs8);
SQLUtil.close(rs9);
SQLUtil.close(rs10);
SQLUtil.close(pstm1);
SQLUtil.close(pstm2);
SQLUtil.close(pstm3);
SQLUtil.close(pstm4);
SQLUtil.close(pstm5);
SQLUtil.close(pstm6);
SQLUtil.close(pstm7);
SQLUtil.close(pstm8);
SQLUtil.close(pstm9);
SQLUtil.close(pstm10);
SQLUtil.close(con);
return expresult;
}
|