… | |
… | |
2 | |
2 | |
3 | # player scheduler, evoking players from ram |
3 | # player scheduler, evoking players from ram |
4 | |
4 | |
5 | our $SCHEDULE_INTERVAL = $cf::CFG{player_schedule_interval} || 10; # time the player scheduler sleeps between runs |
5 | our $SCHEDULE_INTERVAL = $cf::CFG{player_schedule_interval} || 10; # time the player scheduler sleeps between runs |
6 | our $SAVE_TIMEOUT = $cf::CFG{player_save_interval} || 20; # save players every n seconds |
6 | our $SAVE_TIMEOUT = $cf::CFG{player_save_interval} || 20; # save players every n seconds |
|
|
7 | |
|
|
8 | cf::player->attach ( |
|
|
9 | on_load => sub { |
|
|
10 | my ($pl, $path) = @_; |
|
|
11 | |
|
|
12 | my $slots = delete $pl->{_slots}; |
|
|
13 | |
|
|
14 | $pl->ob->current_weapon ($slots->[0]); |
|
|
15 | $pl->combat_ob ($slots->[1]); |
|
|
16 | $pl->ranged_ob ($slots->[2]); |
|
|
17 | }, |
|
|
18 | on_save => sub { |
|
|
19 | my ($pl, $path) = @_; |
|
|
20 | $pl->{_slots} = [$pl->ob->current_weapon, $pl->combat_ob, $pl->ranged_ob]; |
|
|
21 | }, |
|
|
22 | ); |
7 | |
23 | |
8 | our $SCHEDULER = cf::async_ext { |
24 | our $SCHEDULER = cf::async_ext { |
9 | $Coro::current->{desc} = "player scheduler"; |
25 | $Coro::current->{desc} = "player scheduler"; |
10 | |
26 | |
11 | while () { |
27 | while () { |
… | |
… | |
30 | my $ob = $pl->ob; |
46 | my $ob = $pl->ob; |
31 | |
47 | |
32 | my $pl_ref = $pl->refcnt_cnt; |
48 | my $pl_ref = $pl->refcnt_cnt; |
33 | my $ob_ref = $ob->refcnt_cnt; |
49 | my $ob_ref = $ob->refcnt_cnt; |
34 | |
50 | |
35 | ## pl_ref == $pl + ob->contr + %cf::PLAYER |
51 | ## pl_ref == (P)$pl + (P)%cf::PLAYER + (C)ob->contr |
36 | ## ob_ref == $ob + pl->observe + simply being an object |
52 | ## ob_ref == (P)$ob + (C)pl->observe + (C)pl->viewpoint + (C)simply being an object |
|
|
53 | ## !$pl->ns ensures that ob == viewpoint == observe |
37 | if ($pl_ref == 3 && $ob_ref == 3) { |
54 | if ($pl_ref == 3 && $ob_ref == 4) { |
38 | warn "player-scheduler destroy ", $ob->name;#d# |
55 | warn "player-scheduler destroy ", $ob->name;#d# |
39 | |
56 | |
40 | # remove from sight and get fresh "copies" |
57 | # remove from sight and get fresh "copies" |
41 | $pl = delete $cf::PLAYER{$ob->name}; |
58 | $pl = delete $cf::PLAYER{$ob->name}; |
42 | $ob = $pl->ob; |
59 | $ob = $pl->ob; |