ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/player-env.ext
(Generate patch)

Comparing deliantra/server/ext/player-env.ext (file contents):
Revision 1.2 by root, Wed Jul 11 16:26:26 2007 UTC vs.
Revision 1.4 by root, Thu Jul 12 08:40:13 2007 UTC

1#! perl # mandatory 1#! perl # mandatory
2 2
3# this extension provides "environmental effects", 3# this extension provides "environmental effects",
4# meaning mostly background music and region messages right now. 4# meaning mostly background music and region messages right now.
5
6sub parse_facelist($$) {
7 my ($prefix, $list) = @_;
8
9 return undef
10 unless defined $list;
11
12 #TODO, sort by size (smallest first...)
13 [
14 sort { (cf::face::get_data_size $a) <=> (cf::face::get_data_size $b) }
15 grep $_,
16 map +(cf::face::find "$prefix$_"),
17 split /\s*,\s*/, $list
18 ]
19}
5 20
6our %MUSIC_QUEUE; 21our %MUSIC_QUEUE;
7 22
8our $MUSIC_SCHEDULER = cf::async_ext { 23our $MUSIC_SCHEDULER = cf::async_ext {
9 while () { 24 while () {
10 for (keys %MUSIC_QUEUE) { 25 for (keys %MUSIC_QUEUE) {
11 delete $MUSIC_QUEUE{$_}; 26 delete $MUSIC_QUEUE{$_};
12 my $pl = cf::player::find_active $_ 27 my $pl = cf::player::find_active $_
13 or next; 28 or next;
14 29
30 my $ns = $pl->ns
31 or next;
32
33 $ns->extcmd
34 or next;
35
36 my $faces;
37
15 my $map = $pl->ob->map 38 my $map = $pl->ob->map
16 or next; 39 or next;
17 40
18 # 1. update map-specific music info 41 # 1. update map-specific music info
19 unless (exists $map->{music}) { 42 unless (exists $map->{music_faces}) {
20 43 $map->{music_faces} = parse_facelist "music/", $map->{music};
21 } 44 }
22 45
46 my $faces = $map->{music_faces};
47
23 # 2. fall back to region if no map-specific music 48 # 2. fall back to region if no map-specific music
24 unless ($map->{music}) { 49 unless ($faces) {
50 my $rgn = $pl->ob->region
51 or next;
52
53 unless (exists $rgn->{music_faces}) {
54 my $par = $rgn;
55 while () {
56 last if exists $par->{music};
57 $par = $par->parent
58 or last;
59 }
60
61 $rgn->{music_faces} = parse_facelist "music/", $par->{music};
62 }
63
64 $faces = $rgn->{music_faces};
25 } 65 }
66
67 $faces
68 or next;
69
70 my $facestr = join ",", @$faces;
71 $ns->{current_music_faces} ne $facestr
72 or next;
73
74 $ns->{current_music_faces} = $facestr;
75
76 my $msg = {
77 faces => $faces,
78 };
79
80 $msg->{chksum}{$_} = cf::face::get_chksum $_
81 for grep $ns->must_send_face ($_), @$faces;
82
83 $ns->ext_event (music => %$msg);
26 84
27 cf::cede_to_tick; 85 cf::cede_to_tick;
28 } 86 }
29 Coro::schedule unless %MUSIC_QUEUE; 87 Coro::schedule unless %MUSIC_QUEUE;
30 } 88 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines