… | |
… | |
7 | |
7 | |
8 | use CFClient; |
8 | use CFClient; |
9 | use CFClient::UI; |
9 | use CFClient::UI; |
10 | |
10 | |
11 | use base 'Crossfire::Protocol::Base'; |
11 | use base 'Crossfire::Protocol::Base'; |
|
|
12 | |
|
|
13 | our %open_logs; |
12 | |
14 | |
13 | sub new { |
15 | sub new { |
14 | my $class = shift; |
16 | my $class = shift; |
15 | |
17 | |
16 | my $self = $class->SUPER::new (@_); |
18 | my $self = $class->SUPER::new (@_); |
… | |
… | |
58 | # per server |
60 | # per server |
59 | $self->{mapcache} = CFClient::db_table "mapcache_$self->{host}_$self->{port}"; |
61 | $self->{mapcache} = CFClient::db_table "mapcache_$self->{host}_$self->{port}"; |
60 | |
62 | |
61 | $self |
63 | $self |
62 | } |
64 | } |
|
|
65 | |
|
|
66 | sub logprint { |
|
|
67 | my ($self, @a) = @_; |
|
|
68 | my $filename = "$Crossfire::VARDIR/log.$self->{host}"; |
|
|
69 | |
|
|
70 | my $fh = $open_logs{$filename}; |
|
|
71 | unless ($fh) { |
|
|
72 | # FIXME: handle this more gracefully? |
|
|
73 | open $fh, ">>", $filename |
|
|
74 | or die "Couldn't open logfile: log.$self->{host}: $!"; |
|
|
75 | |
|
|
76 | $open_logs{$filename} = $fh; |
|
|
77 | } |
|
|
78 | |
|
|
79 | my ($sec, $min, $hour, $mday, $mon, $year) = localtime (time); |
|
|
80 | |
|
|
81 | my $ts = sprintf "%04d-%02d-%02d %02d:%02d:%02d", |
|
|
82 | $year + 1900, $mon + 1, $mday, $hour, $min, $sec; |
|
|
83 | |
|
|
84 | print $fh "$ts ", @a, "\n"; |
|
|
85 | $fh->flush; |
|
|
86 | } |
|
|
87 | |
|
|
88 | |
63 | |
89 | |
64 | sub stats_update { |
90 | sub stats_update { |
65 | my ($self, $stats) = @_; |
91 | my ($self, $stats) = @_; |
66 | |
92 | |
67 | if (my $exp = $stats->{+CS_STAT_EXP64}) { |
93 | if (my $exp = $stats->{+CS_STAT_EXP64}) { |
… | |
… | |
79 | |
105 | |
80 | if ($self->{record}) { |
106 | if ($self->{record}) { |
81 | push @{$self->{record}}, $command; |
107 | push @{$self->{record}}, $command; |
82 | } |
108 | } |
83 | |
109 | |
|
|
110 | $self->logprint ("send: ", $command); |
84 | $self->send_command ($command); |
111 | $self->send_command ($command); |
85 | ::status $command; |
112 | ::status $command; |
86 | } |
113 | } |
87 | |
114 | |
88 | sub start_record { |
115 | sub start_record { |
… | |
… | |
105 | sub feed_map1a { |
132 | sub feed_map1a { |
106 | my ($self, $data) = @_; |
133 | my ($self, $data) = @_; |
107 | |
134 | |
108 | $self->{map}->map1a_update ($data); |
135 | $self->{map}->map1a_update ($data); |
109 | $self->{map_widget}->update; |
136 | $self->{map_widget}->update; |
|
|
137 | } |
|
|
138 | |
|
|
139 | sub magicmap { |
|
|
140 | my ($self, $w, $h, $x, $y, $data) = @_; |
|
|
141 | |
|
|
142 | $self->{map_widget}->set_magicmap ($w, $h, $x, $y, $data); |
110 | } |
143 | } |
111 | |
144 | |
112 | sub flush_map { |
145 | sub flush_map { |
113 | my ($self) = @_; |
146 | my ($self) = @_; |
114 | |
147 | |
… | |
… | |
279 | # I love transactions |
312 | # I love transactions |
280 | for (1..100) { |
313 | for (1..100) { |
281 | my $txn = $CFClient::DB_ENV->txn_begin; |
314 | my $txn = $CFClient::DB_ENV->txn_begin; |
282 | my $status = $self->{facemap}->db_get (id => $id); |
315 | my $status = $self->{facemap}->db_get (id => $id); |
283 | if ($status == 0 || $status == BerkeleyDB::DB_NOTFOUND) { |
316 | if ($status == 0 || $status == BerkeleyDB::DB_NOTFOUND) { |
284 | $id = ($id || 16) + 1; |
317 | $id = ($id || 64) + 1; |
285 | if ($self->{facemap}->put (id => $id) == 0 |
318 | if ($self->{facemap}->put (id => $id) == 0 |
286 | && $self->{facemap}->put ($hash => $id) == 0) { |
319 | && $self->{facemap}->put ($hash => $id) == 0) { |
287 | $txn->txn_commit; |
320 | $txn->txn_commit; |
288 | |
321 | |
289 | goto gotid; |
322 | goto gotid; |
… | |
… | |
369 | [0.55, 0.41, 0.13], |
402 | [0.55, 0.41, 0.13], |
370 | [0.99, 0.77, 0.26], |
403 | [0.99, 0.77, 0.26], |
371 | [0.74, 0.65, 0.41], |
404 | [0.74, 0.65, 0.41], |
372 | ); |
405 | ); |
373 | |
406 | |
|
|
407 | $self->logprint ("info: ", $text); |
|
|
408 | |
374 | my $time = sprintf "%02d:%02d:%02d", (localtime time)[2,1,0]; |
409 | my $time = sprintf "%02d:%02d:%02d", (localtime time)[2,1,0]; |
375 | |
410 | |
376 | # try to create single paragraphs of multiple lines sent by the server |
411 | # try to create single paragraphs of multiple lines sent by the server |
377 | $text =~ s/(?<=\S)\n(?=\w)/ /g; |
412 | $text =~ s/(?<=\S)\n(?=\w)/ /g; |
378 | |
413 | |