eGameX

 找回密碼
 註冊
搜索
查看: 127|回復: 6

[開發中]NPC自動重生 [複製鏈接]

Rank: 1

金錢
81
威望
0
積分
30
發表於 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;
複製代碼

Rank: 1

金錢
81
威望
0
積分
30
發表於 2017-3-21 01:02:56 |顯示全部樓層
這個方法有個缺點

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

使用道具 舉報

Rank: 1

金錢
81
威望
0
積分
30
發表於 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.         }
複製代碼

使用道具 舉報

Rank: 1

金錢
81
威望
0
積分
30
發表於 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.         }
複製代碼

使用道具 舉報

Rank: 2

金錢
172
威望
0
積分
52
發表於 2017-3-21 16:20:45 |顯示全部樓層
Transistor 發表於 2017-3-21 01:02
這個方法有個缺點

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

那是否只要有人登入 就會重生?
希望網海還能繼續經營,更新...

使用道具 舉報

Rank: 2

金錢
134
威望
0
積分
51
發表於 2017-3-21 16:47:41 |顯示全部樓層
dog29329584 發表於 2017-3-21 16:20
那是否只要有人登入 就會重生?

以他做法是的0 0

使用道具 舉報

管理員

網站測試中

Rank: 9Rank: 9Rank: 9

金錢
1645
威望
4146
積分
7043
發表於 2017-3-30 15:36:01 |顯示全部樓層
謝謝 Transistor 提供的原始碼,努力吸收中

使用道具 舉報

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

Archiver|排行榜|eGameX

GMT+8, 2017-5-1 08:19 , Processed in 0.067256 second(s), 5 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回頂部