eGameX

 找回密碼
 立即註冊
搜索
查看: 208|回復: 5

[開發中]NPC自動重生

[複製鏈接]
發表於 2017-3-21 00:49:54 | 顯示全部樓層 |閱讀模式
npcdir是存放npc資料的

寫在sea.cgi


  1. # Sub NPC Update
  2. sub NPC_update{


  3.         my  @NPC_uid = ("00002");        # NPC ID
  4.         my  $NPCdir        = 'npcdir';                # NPC帳戶資料存放目錄(※可更改 不可與usrdir相同)
  5.         my        $NPC_cycle = 3;                        # NPC重生週期

  6.        
  7.         &get_date(time);
  8.        
  9.         if($day % $NPC_cycle){
  10.                 my $NPC_upflag = 1;
  11.                 return;
  12.         }
  13.                

  14.         if((!($day % $NPC_cycle) || $day == 1) && $NPC_upflag){
  15.        
  16.                 foreach (@NPC_uid) {
  17.                         my        $NPC_load_file = new Nfile("$NPCdir\/$_\.dat",'read');
  18.                         @npc_ilines = $NPC_load_file->read;
  19.                         if (!@npc_ilines) { &error("NPC資料讀取錯誤"); }
  20.                        
  21.                         open(write_file,">$usrdir\/$_\.dat") or "open file error!";
  22.                         print write_file @npc_ilines;
  23.                         close(write_file);
  24.                 }
  25.                 undef $NPC_upflag;
  26.         }
  27.        
  28. }



複製代碼
並把原本的play函式


  1. sub play {
  2.         &get_me($F{'id'});
  3.         &set_cookie if $F{'mode'} eq 'play';
  4.         &get_host;
  5.         &get_port($area,$port) if $port;
  6.         &get_port($area,$area) if !$port;
  7.         &ship_data;
  8.         $last = time;
  9.         &t_check;
  10.         &sink;



複製代碼
改為這個(其實只是多呼叫一個函式XD)


  1. sub play {
  2.         &get_me($F{'id'});
  3.         &set_cookie if $F{'mode'} eq 'play';
  4.         &get_host;
  5.         &get_port($area,$port) if $port;
  6.         &get_port($area,$area) if !$port;
  7.         &ship_data;
  8.         &NPC_update;
  9.         $last = time;
  10.         &t_check;
  11.         &sink;



複製代碼
 樓主| 發表於 2017-3-21 01:02:56 | 顯示全部樓層
這個方法有個缺點

如果重生那一整天都沒人上線  就會跳過重生(人氣應該不會這麼慘吧)
回復 支持 反對

使用道具 舉報

 樓主| 發表於 2017-3-21 01:26:43 | 顯示全部樓層
原來NFILE要先讀才能寫

優化一下寫法~


  1.         if((!($day % $NPC_cycle) || $day == 1)){
  2.        
  3.                 foreach (@NPC_uid) {
  4.                         my        $NPC_load_file = new Nfile("$NPCdir\/$_\.dat",'read');
  5.                         @npc_ilines = $NPC_load_file->read;
  6.                         if (!@npc_ilines) { &error("NPC資料讀取錯誤"); }
  7.                         my        $NPC_save_file = new Nfile("$usrdir\/$_\.dat",'save');
  8.                         $NPC_save_file->read;
  9.                         $NPC_save_file->write(@npc_ilines); #(bug)
  10.                 }
  11.                 undef $NPC_upflag;
  12.         }


複製代碼
回復 支持 反對

使用道具 舉報

 樓主| 發表於 2017-3-21 01:42:06 | 顯示全部樓層
新增一下讀取確認 防止讀取錯誤整個當機





  1.         if((!($day % $NPC_cycle) || $day == 1)){
  2.        
  3.                 foreach (@NPC_uid) {
  4.                         my        $NPC_load_file = new Nfile("$NPCdir\/$_\.dat",'read');
  5.                         my  @npc_ilines = $NPC_load_file->read;
  6.                         if (!@npc_ilines) { &error("NPC資料讀取錯誤"); }
  7.                         if ($npc_ilines[0] eq "Read Error") {&msg("<font color="#FF0000">NPC檔案不存在!</font>");return;}

  8.                        
  9.                        
  10.                        
  11.                         my        $NPC_save_file = new Nfile("$usrdir\/$_\.dat",'save');
  12.                         my  @npc_update = $NPC_save_file->read;
  13.                         if (!@npc_update) { &error("NPC資料讀取錯誤"); }
  14.                         if ($npc_update[0] eq "Read Error") {&msg("<font color="#FF0000">NPC檔案不存在!</font>");return;}
  15.                        
  16.        
  17.                        
  18.                         $NPC_save_file->write(@npc_ilines);
  19.                 }
  20.                 undef $NPC_upflag;
  21.         }




複製代碼
回復 支持 反對

使用道具 舉報

發表於 2017-3-21 16:20:45 | 顯示全部樓層
Transistor 發表於 2017-3-21 01:02
這個方法有個缺點

如果重生那一整天都沒人上線  就會跳過重生(人氣應該不會這麼慘吧) ...

那是否只要有人登入 就會重生?
回復 支持 反對

使用道具 舉報

發表於 2017-3-21 16:47:41 | 顯示全部樓層
dog29329584 發表於 2017-3-21 16:20
那是否只要有人登入 就會重生?

以他做法是的0 0
回復 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

小黑屋|Archiver|排行榜|eGameX

GMT+8, 2017-11-18 10:42 , Processed in 0.029599 second(s), 6 queries , Gzip On, memcache On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表