--- deliantra/server/ext/item-worldmap.ext 2007/07/22 20:08:38 1.5 +++ deliantra/server/ext/item-worldmap.ext 2007/07/23 16:53:15 1.6 @@ -4,6 +4,7 @@ our $WORLDMAP_UPDATE_INTERVAL = $cf::CFG{worldmap_update_interval} || 10; +our $GENCOUNT = 0; our %PLAYERINFO; sub update_worldmap { @@ -91,13 +92,18 @@ $schedule_interval->interval ($WORLDMAP_UPDATE_INTERVAL); $schedule_interval->next; + cf::get_slot 0.05; + + ++$GENCOUNT; + # recalculate player info - %PLAYERINFO = (); + my %new; for (values %cf::PLAYER) { my $map = $_->ob->map or next; $map =~ /^\/world\/world_(\d\d\d)_(\d\d\d)/ or next; + my $ob = $_->ob; my $x = ($1 - 100) * 50 + $ob->x; my $y = ($2 - 100) * 50 + $ob->y; @@ -106,12 +112,25 @@ or next; # rounding saves network bandwidth... - $PLAYERINFO{$ob->name} = [(sprintf "%.3f", $x / 1500), (sprintf "%.3f", $y / 1500)]; + $x = sprintf "%.3f", $x / 1500; + $y = sprintf "%.3f", $y / 1500; + + my $name = $ob->name; + + if (my $pi = delete $PLAYERINFO{$name}) { + if ($pi->[0] == $x && $pi->[1] == $y) { + $new{$name} = $pi; + next; + } + } + + $new{$name} = [$x, $y]; } for (values %cf::PLAYER) { my $ns = $_->ns or next; + update_worldmap $ns->{ws_worldmap} if $ns->{ws_worldmap} && $ns->{ws_worldmap}{toplevel}{visibility}; }