… | |
… | |
97 | |
97 | |
98 | if ($ns->{can_widget}) { |
98 | if ($ns->{can_widget}) { |
99 | my $ws = $ns->{ws_worldmap} ||= create_widgets $ns; |
99 | my $ws = $ns->{ws_worldmap} ||= create_widgets $ns; |
100 | $ws->{toplevel}->toggle_visibility; |
100 | $ws->{toplevel}->toggle_visibility; |
101 | } else { |
101 | } else { |
102 | $ns->send_msg ("log", "Your client doesn't support the (required) widget extension. Try CFPlus at http://crossfire.schmorp.de/.", cf::NDI_RED); |
102 | $ns->send_msg ("log", "Your client doesn't support the (required) widget extension. Try the deliantra client at http://www.deliantra.net/.", cf::NDI_RED); |
103 | } |
103 | } |
104 | |
104 | |
105 | cf::override 1; |
105 | cf::override 1; |
106 | }, |
106 | }, |
107 | ; |
107 | ; |
108 | |
108 | |
|
|
109 | cf::post_init { |
109 | cf::async_ext { |
110 | cf::async_ext { |
110 | my $schedule_interval = Coro::Event->timer (after => 1); |
111 | $Coro::current->{desc} = "worldmap updater"; |
111 | |
112 | |
112 | while () { |
113 | while () { |
113 | $schedule_interval->interval ($WORLDMAP_UPDATE_INTERVAL); |
114 | Coro::EV::timer_once $WORLDMAP_UPDATE_INTERVAL; |
114 | $schedule_interval->next; |
|
|
115 | |
115 | |
116 | cf::get_slot 0.01, -50, "worldmap update"; |
116 | cf::get_slot 0.01, -50, "worldmap update"; |
117 | |
117 | |
118 | ++$GENCOUNT; |
118 | ++$GENCOUNT; |
119 | |
119 | |
120 | # recalculate player info |
120 | # recalculate player info |
121 | my %new; |
121 | my %new; |
122 | for (values %cf::PLAYER) { |
122 | for (values %cf::PLAYER) { |
123 | my $map = $_->ob->map |
123 | my $map = $_->ob->map |
124 | or next; |
124 | or next; |
125 | $map =~ /^\/world\/world_(\d\d\d)_(\d\d\d)/ |
125 | $map =~ /^\/world\/world_(\d\d\d)_(\d\d\d)/ |
126 | or next; |
126 | or next; |
127 | |
127 | |
128 | my $ob = $_->ob; |
128 | my $ob = $_->ob; |
129 | my $x = ($1 - 100) * 50 + $ob->x; |
129 | my $x = ($1 - 100) * 50 + $ob->x; |
130 | my $y = ($2 - 100) * 50 + $ob->y; |
130 | my $y = ($2 - 100) * 50 + $ob->y; |
131 | |
131 | |
132 | 0 <= $x && 0 <= $y && $x < 1500 && $y < 1500 |
132 | 0 <= $x && 0 <= $y && $x < 1500 && $y < 1500 |
133 | or next; |
133 | or next; |
134 | |
134 | |
135 | $x = int $x * $MAPW / 1500; |
135 | $x = int $x * $MAPW / 1500; |
136 | $y = int $y * $MAPH / 1500; |
136 | $y = int $y * $MAPH / 1500; |
137 | |
137 | |
138 | my $name = $ob->name; |
138 | my $name = $ob->name; |
139 | |
139 | |
140 | if (my $pi = delete $PLAYERINFO{$name}) { |
140 | if (my $pi = delete $PLAYERINFO{$name}) { |
141 | if ($pi->[0] == $x && $pi->[1] == $y) { |
141 | if ($pi->[0] == $x && $pi->[1] == $y) { |
142 | $new{$name} = $pi; |
142 | $new{$name} = $pi; |
143 | next; |
143 | next; |
|
|
144 | } |
144 | } |
145 | } |
|
|
146 | |
|
|
147 | $new{$name} = [$x, $y]; |
145 | } |
148 | } |
|
|
149 | |
|
|
150 | *PLAYERINFO = \%new; |
|
|
151 | |
|
|
152 | cf::get_slot 0.03, -50, "worldmap socket update"; |
|
|
153 | for (values %cf::PLAYER) { |
|
|
154 | my $ns = $_->ns |
146 | |
155 | or next; |
147 | $new{$name} = [$x, $y]; |
156 | |
|
|
157 | update_worldmap $ns->{ws_worldmap} |
|
|
158 | if $ns->{ws_worldmap} && $ns->{ws_worldmap}{toplevel}{visibility}; |
|
|
159 | } |
148 | } |
160 | } |
149 | |
|
|
150 | *PLAYERINFO = \%new; |
|
|
151 | |
|
|
152 | cf::get_slot 0.03, -50, "worldmap socket update"; |
|
|
153 | for (values %cf::PLAYER) { |
|
|
154 | my $ns = $_->ns |
|
|
155 | or next; |
|
|
156 | |
|
|
157 | update_worldmap $ns->{ws_worldmap} |
|
|
158 | if $ns->{ws_worldmap} && $ns->{ws_worldmap}{toplevel}{visibility}; |
|
|
159 | } |
|
|
160 | } |
161 | }; |
161 | }; |
162 | }; |
162 | |
163 | |