mud_sanc 板


LINE

經思考後,crontab 還是廢棄好了。 目前決定還是回歸 set_times_check 的做法,然後以最近應該優先 完成的自動排程拍賣系統為例,/cmds/std/_blarket.c 裡面要加上 times_check 函數,以華麗與汙痕書店為例,它要透過下指令觸發, 使用者下指令,它才會去 set_times_check,所以我只要透過下指令 的方式設定排程即可,以書店為例,設定的呼叫段如下: 幾秒後 times_check->set_times_check(names,shop_files,({str,sk}),sk/50); 所以假設我希望 2/15 晚上 21:00 開啟拍賣,這時需要一個計算函 數,計算上面時間與現在時間的秒數差,這個有簡單的方式 Sat Jan 13 21:03:10 2018 現在時間 Thr Feb 15 21:00:00 2018 目標時間 年先不用管,上面做 sscanf 取出 mon 及 day: times=time(); sscanf(ctime(times),"%s %s %s %d:%d:%d %s",week,mon,day,hour,min,sec,year); tar_mon="Feb"; tar_day="15"; tar_hour=21; tar_min=0; t=0; // 這個迴圈做完只是一瞬間的事而已 while(mon!=tar_mon || day!=tar_day) { t+=86400; sscanf(ctime(times+t),"%s %s %s %d:%d:%d %s",week,mon,day, hour,min,sec,year); } 脫離上面 while 的條件就是 mon==tar_mon && day==tar_day,因為 不比年,所以迴圈最多跑三百多次。接著: t=t+(tar_hour-hour)*3600+(tar_min-min)*60; // 秒不用管 幾秒後 times_check->set_times_check("blarket","/cmds/std/_blarket",({參數}),t); 我剛有用 running 實驗,2849340 秒後就是 2018/2/15 晚上九點: if(1) { string week,mon,day,tar_mon,tar_day,year; int times,t,hour,min,sec,tar_hour,tar_min; // 以 2018/02/15 21:00 為例 times=time(); sscanf(ctime(times),"%s %s %s %d:%d:%d %s",week,mon,day,hour,min,sec,year); tar_mon="Feb"; tar_day="15"; tar_hour=21; tar_min=0; t=0; // 這個迴圈做完只是一瞬間的事而已 while(mon!=tar_mon || day!=tar_day) { t+=86400; sscanf(ctime(times+t),"%s %s %s %d:%d:%d %s",week,mon,day, hour,min,sec,year); } t=t+(tar_hour-hour)*3600+(tar_min-min)*60; write("t="+t+", ctime(times+t)="+ctime(times+t)+"\n"); } ========== 程式執行區 ========== t=2849340, ctime(times+t)=Thu Feb 15 21:00:58 2018 ========== 程式執行區 ========== 這比 crontab 穩定多了,因為不需要判斷年,就可以很簡單的做好 防止迴圈過大的判斷(例如在 while 迴圈內加上計數器,超過 400 次就代表給的時間有問題就不設定)。 而且,有需要時再設定即可。 就算是 loop 型的 times_check 同樣也可以交給目標物件去做,好 處就是自己的目標物件要跑怎麼樣的 loop 判斷,自己寫最彈性。 這裡還可以導入 boat 的概念: // 航行計劃 set("plane",({ ({"菲里德軍港","/u/l/laechan/area/felid/room/285-軍港",30,90}), ({"西斯迪克港","/u/l/laechan/area/sisdic/room/001",30,90}), ({"塔塔克高原",TR"015",30,90}),})); 仿照航行計劃,自己編拍賣計劃 // 拍賣計劃 set("blarket",([ "newyear":({ ({......,幾秒後,等待幾秒,..}), . . }), "santa": ... ])); 先編好拍賣計劃,再透過指令去設定,不同的節慶執行不同的拍賣 計劃即可,根據我 blarket 的寫法 void create() { seteuid(getuid(this_object())); if(file_exists("/open/cmds/blarket.o")) restore_object("/open/cmds/blarket"); else data["boards"]=([]); set("pre_clean",1); // 避免被系統當成真正的 room. 2010/08/28 } 我在這邊多寫一個讀取排程的物件資料即可。 以上應該是比較容易實行的方式,維持 times_check 的泛用性, wiz 不用習慣新的系統(crontab),只要知道 times_check 的原理 即可,而這東西已經存在很久也有範例了(/std/new_ob/boat.c)。 最近會優先改 blarket,改好後會實驗,接著就會改農場控制室, 將星星日改成可由系統去定時跑,例如六日一定會跑,再來可以一 三五跑一次之類的,這個改好後也會實驗,再有時間,就是月例大 賽的擲筊王比賽的定期每月月底或每月一號開啟,什麼時間開啟不 重要,因為開啟後至少 n 天的時間是線上玩家都可以去擲的。 Laechan --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.253.167.36
※ 文章網址: https://webptt.com/m.aspx?n=bbs/mud_sanc/M.1515850839.A.820.html ※ 編輯: laechan (111.253.167.36), 01/13/2018 21:46:05







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP