從此以後不再死的不明不白!!!
自動記錄死亡前詳細訊息
讓你找到原因!!!
範例:
使用方法: (超簡單~只有兩個步驟!)
1.
在 config.txt 中加入下列設定 (位置隨便都可以,我是加在" LOG 紀錄檔 (其它)"區域)
logDeath 1
# 是否要開啟角色死亡記錄,在 logs/deathlog.txt
# Plugin 功能,若 openkore/plugins/ 裡沒有 Autopsy.pl 的話此功能無效
logDeathSize 50
# 角色死亡記錄的行數,記錄死亡前幾行的訊息
deathMessage 您已經死了
2.
將以下代碼存成 Autopsy.pl
置於 openkore 的 plugins 目錄裡面 (ex: c:\ok\plugins)
##########################################################################
# This software is open source, licensed under the GNU General Public
# License, version 2.
# Basically, this means that you're allowed to modify and distribute
# this software. However, if you distribute modified versions, you MUST
# also distribute the source code.
# See http://www.gnu.org/licenses/gpl.html for the full license.
##########################################################################
#Autopsy.pl
#Plugin by: PlayingSafe, Openkore
#Revision 3 by Rbin
#Openkore 2.0.0 (SVN) upper
#How to use
#At your config file put
#logDeath 1 <-- put 1 to enable logging
#logDeathSize # <--- put your desired number of lines to save
#deathMessage <-- put the "You have died" word on your local language if kore is set to local language
#example:
#logDeathSize 25 (this will save 25 lines of console messages)
#deathMessage You have died (Default language English)
package Autopsy;
use Utils;
use strict;
use Plugins;
use Globals;
use Settings;
use Log qw(message debug);
Plugins::register('Autopsy', 'Record console messages after bot died', \&unload);
my $cHook = Log::addHook(\&cHook, "DeathLog");
sub unload {
Log::delHook('cHook', $cHook);
}
my @messages = ();
sub cHook {
my $type = shift;
my $domain = (shift or "console");
my $level = (shift or 0);
my $currentVerbosity = shift;
my $message = shift;
my $user_data = shift;
my $logfile = shift;
my $deathmsg = shift;
my $location = shift;
if ($level <= $currentVerbosity && $config{'logDeath'} == 1) {
my (undef, $microseconds) = Time::HiRes::gettimeofday;
$microseconds = substr($microseconds, 0, 2);
my $message2 = "[".getFormattedDate(int(time)).".$microseconds] ".$message;
push(@messages, $message2);
my $size = scalar @messages;
if ($size == $config{'logDeathSize'} + 1) {
shift(@messages);
}
if ($config{logAppendUsername}) {
$logfile = "$Settings::logs_folder/deathlog_$config{username}_$config{char}.txt";
} else {
$logfile = "$Settings::logs_folder/deathlog.txt";
}
$deathmsg = $config{'deathMessage'};
if ($message =~ /$deathmsg/) {
my $pos = calcPosition($char);
$location = "\nYou died at " . $field->descName . " (" . $field->name . ") : $pos->{x}, $pos->{y}\n";
use encoding 'utf8';
open(DFILE, ">>:utf8", "$logfile"); {
print DFILE "\n*** Start of console death log ***\n\n";
print DFILE @messages;
print DFILE $location;
print DFILE "\n*** End of console death log ***\n\n";
close(DFILE);
}
}
}
}
return 1;
以上轉至htht大大的分享!!
----------------------------------------------------------------------------------------------
本帖最後由 sofax222 於 2013-4-9 21:30 編輯
之後的這個功能SOFAX222大大會實作到主程式中了,
而不以插件為之 !!
請注意: 以下修改涉及主程式修改,
稍有不慎恐會造成 Openkore 無法執行,若無把握請勿嘗試,
建議修改前先備份該相關檔案,以備不時之需
開啟 src/Log.pm 程式檔
修改(1)
先找到「use Modules 'register';」字串,
原紿程式碼:
use Modules 'register';
use Globals qw(%config $interface %consoleColors $field);
use Utils::DataStructures qw(binAdd existsInList);
use Utils qw(binAdd existsInList getFormattedDate);
修改後程式碼:
use Modules 'register';
use Globals qw(%config $interface %consoleColors $field %cities_lut %maps_lut $char);
use Field;
use Utils::DataStructures qw(binAdd existsInList);
use Utils qw(binAdd existsInList getFormattedDate calcPosition);
也就是
1. 在第 02 行最後面「);」之前插入「 %cities_lut %maps_lut $char」。
2. 新增插入第 03 行
3. 在第 05 行最後面「);」之前插入「 calcPosition」。
修改(2)
先找到「our $warningVerbosity」字串,
原紿程式碼:
our $warningVerbosity;
our $errorVerbosity;
修改後程式碼:
our $warningVerbosity;
our $errorVerbosity;
our @messages=();
也就是新增插入第 03 行
修改(3)
先找到「# Print to files」字串,
原紿程式碼:
}
}
# Print to files
修改後程式碼:
}
if($config{logDeath} && $config{'deathMessage'} && $field) {
my (undef, $microseconds) = Time::HiRes::gettimeofday;
$microseconds = substr($microseconds, 0, 2);
my $message2 = "[".getFormattedDate(int(time)).".$microseconds] ".$message;
my $logfile;
push(@messages, $message2);
if ($#messages == $config{'logDeathSize'} + 1) {
shift(@messages);
}
if ($config{logAppendUsername}) {
$logfile = "$Settings::logs_folder/deathlog_$config{username}_$config{char}.txt";
} else {
$logfile = "$Settings::logs_folder/deathlog.txt";
}
my $deathmsg = $config{'deathMessage'};
if ($message =~ /$deathmsg/) {
my $pos = calcPosition($char);
my $location = "You died at $maps_lut{$field->baseName.'.rsw'} (".$field->baseName.") : $pos->{x}, $pos->{y}\n";
use encoding 'utf8';
open(DFILE, ">>:utf8", "$logfile");
print DFILE "*** Start of console death log ***\n";
print DFILE @messages;
print DFILE $location;
print DFILE "*** End of console death log ***\n\n";
close(DFILE);
}
}
}
# Print to files
也就是新增插入第 02~29 行
然後在 config.txt 檔案中加入以下三個設定參數:
logDeath 1
# 是否開啟死亡記錄功能,1:開啟,0:關閉
logDeathSize 50
# 記錄死亡前幾行的 Console 訊息
deathMessage You have died at
# 死亡時 Console 所顯示的訊息片段
記錄會寫到 logs 資料夾中。