2013年6月8日 星期六

【Java教學】SosoDEmoN自創聲望系統

小弟拜讀傑大的人物頭銜所產生的聲望系統 
http://bbs.99nets.com/read.php?tid=669865&fpage=3 

大家可以自我調整範圍 & 道具發放的條件來控制聲望 
預設 
LV1 聲望0-9 
LV2 聲望10-29 
LV3 聲望30-49 
LV4 聲望50-69 
LV5 聲望70-89 
LV6 聲望90-109 
LV7 聲望110-129 
LV8  聲望130-149 
LV9 聲望150-169 
LV10 聲望170-199 
LV11 聲望200 

下面就開始教學囉 

1-1 S_OtherCharPacks.java 

搜尋 int status = STATUS_PC; 
下貼上 
  1. // sosodemon add 稱號系統 0-200 BY.SosoDEmoN Start
  2. String famename = \"\";
  3. if (pc.getFameLevel() == 0 && pc.getFameLevel() <= 9) {
  4. famename = L1WilliamSystemMessage.ShowMessage(1301);
  5. }
  6. if (pc.getFameLevel() == 10 && pc.getFameLevel() <= 29) {
  7. famename = L1WilliamSystemMessage.ShowMessage(1302);
  8. }  
  9. if (pc.getFameLevel() >= 30 && pc.getFameLevel() <= 49) {
  10. famename = L1WilliamSystemMessage.ShowMessage(1303);
  11. }  
  12. if (pc.getFameLevel() >= 50 && pc.getFameLevel() <= 69) {
  13. famename = L1WilliamSystemMessage.ShowMessage(1304);
  14. }  
  15. if (pc.getFameLevel() >= 70 && pc.getFameLevel() <= 89) {
  16. famename = L1WilliamSystemMessage.ShowMessage(1305);
  17. }  
  18. if (pc.getFameLevel() >= 90 && pc.getFameLevel() <= 109) {
  19. famename = L1WilliamSystemMessage.ShowMessage(1306);
  20. }  
  21. if (pc.getFameLevel() >= 110 && pc.getFameLevel() <= 129) {
  22. famename = L1WilliamSystemMessage.ShowMessage(1307);
  23. }  
  24. if (pc.getFameLevel() >= 130 && pc.getFameLevel() <= 149) {
  25. famename = L1WilliamSystemMessage.ShowMessage(1308);
  26. }  
  27. if (pc.getFameLevel() >= 150 && pc.getFameLevel() <= 169) {
  28. famename = L1WilliamSystemMessage.ShowMessage(1309);
  29. }  
  30. if (pc.getFameLevel() >= 170 && pc.getFameLevel() <= 199) {
  31. famename = L1WilliamSystemMessage.ShowMessage(1310);
  32. }
  33. if (pc.getFameLevel() >= 200) {
  34. famename = L1WilliamSystemMessage.ShowMessage(1311);
  35. }
  36. // sosodemon add 稱號系統 0-200 BY.SosoDEmoN End
复制代码


1-2 一樣在S_OtherCharPacks.java 搜尋 writeS(pc.getName()); 
改成
  1. writeS(pc.getName() + famename);// sosodemon add 稱號系統 0-150 BY.SosoDEmoN
复制代码


2-1 l1j\\server\\server\\storage\\mysql\\MySqlCharacterStorage.java 
搜尋pc.setName(rs.getString(\"char_name\")); 
下新增
  1. pc.setFameLevel(rs.getInt(\"FamenameLevel\"));// sosodemon add 稱望系統 BY.SosoDEmoN
复制代码


2-2 搜尋 \"INSERT INTO characters SET account_name=?,objid=?,char_name=?, (抱歉這串很長) 
在 char_name=? 與 level=? 中間新增
  1. FamenameLevel=?,
复制代码


2-3 搜尋 pstm.setString(++i, pc.getName()); 
下新增
  1. pstm.setInt(++i, pc.getFameLevel()); // sosodemon add 稱望系統 BY.SosoDEmoN
复制代码


2-4搜尋 UPDATE characters SET 
在level=?之前加上
  1. FamenameLevel=?,
复制代码


2-5 在2-4這一長串下的 
pstm.setInt(++i, pc.getLevel()); 之前新增
  1. pstm.setInt(++i, pc.getFameLevel()); // sosodemon add 稱望系統 BY.SosoDEmoN
复制代码


3-1 L1PcInstance.java 
找個地方貼上
  1. // sosodemon add 稱望系統 BY.SosoDEmoN Start
  2. private int _fameLevel = 0;public int getFameLevel() {
  3. return _fameLevel;
  4. }
  5. public void setFameLevel(int i) {
  6. _fameLevel = i;
  7. }
  8. // sosodemon add 稱望系統 BY.SosoDEmoN End
复制代码


4-1 C_ItemUSe.java 
找個地方貼上
  1. else if (itemId == 80101) { // +1 聲望
  2. if (pc.getFameLevel() <= 200){
  3. pc.sendPackets(new S_SystemMessage(\"您的聲望值提高了1點。\"));
  4. pc.setFameLevel(pc.getFameLevel() + 1);
  5. pc.getInventory().removeItem(l1iteminstance, 1);
  6. pc.save();
  7. }else {
  8. pc.sendPackets(new S_SystemMessage(\"您的聲望值已到了極限\"));
  9. }
  10. } else if (itemId == 80102) { // +3 聲望
  11. if (pc.getFameLevel() <= 200){
  12. pc.sendPackets(new S_SystemMessage(\"您的聲望值提高了3點。\"));
  13. pc.setFameLevel(pc.getFameLevel() + 3);
  14. pc.getInventory().removeItem(l1iteminstance, 1);
  15. pc.save();
  16. }else {
  17. pc.sendPackets(new S_SystemMessage(\"您的聲望值已到了極限\"));
  18. }
  19. } else if (itemId == 80103) { // +5 聲望
  20. if (pc.getFameLevel() <= 200){
  21. pc.sendPackets(new S_SystemMessage(\"您的聲望值提高了5點。\"));
  22. pc.setFameLevel(pc.getFameLevel() + 5);
  23. pc.getInventory().removeItem(l1iteminstance, 1);
  24. pc.save();
  25. }else {
  26. pc.sendPackets(new S_SystemMessage(\"您的聲望值已到了極限\"));
  27. }
  28. } else if (itemId == 80104) { // +10 聲望
  29. if (pc.getFameLevel() <= 200){
  30. pc.sendPackets(new S_SystemMessage(\"您的聲望值提高了10點。\"));
  31. pc.setFameLevel(pc.getFameLevel() + 10);
  32. pc.getInventory().removeItem(l1iteminstance, 1);
  33. pc.save();
  34. }else {
  35. pc.sendPackets(new S_SystemMessage(\"您的聲望值已到了極限\"));
  36. }
  37. }
复制代码



DB內的characters開啟設計表 ,在char_name 和 level兩欄位中間新增 FamenameLevel int 10 0 (記得補上預設值0.避免無法新創角色) 
DB內的william_system_message內新增1301~1311 玩家所看到的稱號(可寫自己愛的聲望名稱可彩色. 1301~1311代表請參考 教學 1-1) 
DB的etcitem新增80101.80102.80103.80104~ 

PS~ 自己無法看到聲望,別人才看的到,但也不影響對話的名稱 


******************* 
4/19 修正 & 回答如下 
1. 
if (pc.getFameLevel() == 200) 
改成if (pc.getFameLevel() >= 200) 這樣就不會有超過或不等於200會沒有聲望名稱 

2.聲望道具判斷改了超過200就不在追加使用聲望道具 (有點多 請看一下道具部份原碼) 

3.要自己改查詢 只要選擇pc.getFameLevel() 這個下去查就可以了 
類似的可以參考一下偷窺卡 就是那種意思 



顏色真不明顯 實際上 [LV2]是金色的 




ItemTable.java

搜尋item.setToBeSavedAtOnce(
後新增
  1. item.setCheckFameLevel(rs.getInt("CheckFameLV")); // sosodemon add 物品聲望值控制
复制代码
搜尋weapon.setMaxUseTime(rs.getInt("max_use_time"));
後新增
  1. weapon.setCheckFameLevel(rs.getInt("CheckFameLV")); // sosodemon add 武器聲望值控制
复制代码
搜尋armor.setMaxUseTime(rs.getInt("max_use_time"));
後新增
  1. armor.setCheckFameLevel(rs.getInt("CheckFameLV")); // sosodemon add 防具聲望值控制
复制代码
L1Item.java
  1. //        sosodemon add 聲望控制 BY SosoDEmoN
  2.         private int _checkfamenameLevel; 

  3.         public int getCheckFameLevel() {
  4.                 return _checkfamenameLevel;
  5.         }

  6.         public void setCheckFameLevel(int i) {
  7.                 _checkfamenameLevel = i;
  8.         }
复制代码
C_ItemUSe.java
搜尋int item_maxlvl = ((L1EtcItem) l1iteminstance.getItem())
.getMaxLevel();後新增
  1. int fameLV = l1iteminstance.getItem().getCheckFameLevel();//sosodemon add 物品聲望控制
复制代码
搜尋pc.sendPackets(new S_ServerMessage(673, String
return;後新增
  1. //                                sosodemon add 物品聲望控制
  2.                                 else if (fameLV > pc.getFameLevel()) {
  3.                                         pc.sendPackets(new S_SystemMessage("您的聲望值不足。 需要聲望:【"+ fameLV +"】"));                                        
  4.                                         return;
  5.                                 }
复制代码
搜尋第一個else if (max != 0 && max < pc.getLevel())
else if 範圍後新增
  1. //sosodemon add 武器聲望控制
  2.                                 else if (fameLV > pc.getFameLevel()) {
  3.                                         pc.sendPackets(new S_SystemMessage("您的聲望值不足。 需要聲望:【"+ fameLV +"】"));
  4.                                 }
复制代码
搜尋第二個else if (max != 0 && max < pc.getLevel())
else if 範圍後新增
  1. //                                sosodemon add 防具聲望控制
  2.                                 else if (fameLV > pc.getFameLevel()) {
  3.                                         pc.sendPackets(new S_SystemMessage("您的聲望值不足。 需要聲望:【"+ fameLV +"】"));
  4.                                 } else {
  5.                                         UseArmor(pc, l1iteminstance);
  6.                                 }
复制代码
DB的armor.etcitem.weapon資料表新增CheckFameLV  int  10  0 (預設0)

----------------------------------------------


有三個地方需要修正才能正常執行

(1)按照步驟之後在S_OtherCharPacks.java
出現無法解析L1WilliamSystemMessage的錯誤

後來發現原來得另外在開頭增加
import l1j.william.L1WilliamSystemMessage;


即可修正..



(2)然後在C_ItemUSe會出現無法解析isDelayEffect的錯誤...
這裡版大貼的程式碼最後
pc.sendPackets(new S_SystemMessage("您的聲望值已到了極限"));
}
}
第二個 } 要取消就會正常了

(3)再來是...
2-4搜尋 UPDATE characters SET在level=?之前加上FamenameLevel=?,的部份
底下還有一個pstm.setInt(++i, pc.getLevel());的上面必須多加一個
pstm.setInt(++i, pc.getFameLevel());

----------------------------------------------

沒有留言:

張貼留言