--- deliantra/server/lib/cf.pm 2010/02/03 20:48:22 1.506 +++ deliantra/server/lib/cf.pm 2010/04/15 06:07:51 1.517 @@ -110,6 +110,9 @@ our %RESOURCE; +our $OUTPUT_RATE_MIN = 4000; +our $OUTPUT_RATE_MAX = 100000; + our $TICK = MAX_TIME * 1e-6; # this is a CONSTANT(!) our $NEXT_RUNTIME_WRITE; # when should the runtime file be written our $NEXT_TICK; @@ -398,7 +401,7 @@ =item cf::periodic $interval, $cb Like EV::periodic, but randomly selects a starting point so that the actions -get spread over timer. +get spread over time. =cut @@ -505,7 +508,7 @@ my ($job) = @_; if ($Coro::current == $Coro::main) { - my $time = EV::time; + my $time = AE::time; # this is the main coro, too bad, we have to block # till the operation succeeds, freezing the server :/ @@ -532,7 +535,7 @@ } } - my $time = EV::time - $time; + my $time = AE::time - $time; $TICK_START += $time; # do not account sync jobs to server load @@ -588,6 +591,17 @@ wantarray ? @res : $res[-1] } +sub objinfo { + ( + "counter value" => cf::object::object_count, + "objects created" => cf::object::create_count, + "objects destroyed" => cf::object::destroy_count, + "freelist size" => cf::object::free_count, + "allocated objects" => cf::object::objects_size, + "active objects" => cf::object::actives_size, + ) +} + =item $coin = coin_from_name $name =cut @@ -1312,7 +1326,7 @@ use File::Glob (); cf::player->attach ( - on_command => sub { + on_unknown_command => sub { my ($pl, $name, $params) = @_; my $cb = $COMMAND{$name} @@ -1535,6 +1549,19 @@ } } +cf::player->attach ( + on_load => sub { + my ($pl, $path) = @_; + + # restore slots saved in save, below + my $slots = delete $pl->{_slots}; + + $pl->ob->current_weapon ($slots->[0]); + $pl->combat_ob ($slots->[1]); + $pl->ranged_ob ($slots->[2]); + }, +); + sub save($) { my ($pl) = @_; @@ -1550,6 +1577,9 @@ cf::get_slot 0.01; + # save slots, to be restored later + local $pl->{_slots} = [$pl->ob->current_weapon, $pl->combat_ob, $pl->ranged_ob]; + $pl->save_pl ($path); cf::cede_to_tick; } @@ -1771,7 +1801,7 @@ # mit "rum" bekleckern, nicht $self->_create_random_map ( $rmp->{wallstyle}, $rmp->{wall_name}, $rmp->{floorstyle}, $rmp->{monsterstyle}, - $rmp->{treasurestyle}, $rmp->{layoutstyle}, $rmp->{doorstyle}, $rmp->{decorstyle}, + $rmp->{treasurestyle}, $rmp->{layoutstyle}, $rmp->{doorstyle}, $rmp->{decorstyle}, $rmp->{miningstyle}, $rmp->{origin_map}, $rmp->{final_map}, $rmp->{exitstyle}, $rmp->{this_map}, $rmp->{exit_on_final_map}, $rmp->{xsize}, $rmp->{ysize}, @@ -2095,6 +2125,9 @@ $self->post_load; } +# customize the map for a given player, i.e. +# return the _real_ map. used by e.g. per-player +# maps to change the path to ~playername/mappath sub customise_for { my ($self, $ob) = @_; @@ -3133,7 +3166,7 @@ } cf::client->attach ( - on_destroy => sub { + on_client_destroy => sub { my ($ns) = @_; $_->cancel for values %{ (delete $ns->{_coro}) || {} }; @@ -3512,11 +3545,6 @@ LOG llevInfo, "Copyright (C) 1994 Mark Wedel."; LOG llevInfo, "Copyright (C) 1992 Frank Tore Johansen."; - cf::init_experience; - cf::init_anim; - cf::init_attackmess; - cf::init_dynamic; - $Coro::current->prio (Coro::PRIO_MAX); # give the main loop max. priority # we must not ever block the main coroutine @@ -3531,6 +3559,11 @@ evthread_start IO::AIO::poll_fileno; cf::sync_job { + cf::init_experience; + cf::init_anim; + cf::init_attackmess; + cf::init_dynamic; + cf::load_settings; cf::load_materials; @@ -3540,7 +3573,6 @@ cf::init_uuid; cf::init_signals; - cf::init_commands; cf::init_skills; cf::init_beforeplay; @@ -3558,6 +3590,9 @@ (pop @POST_INIT)->(0) while @POST_INIT; }; + cf::object::thawer::errors_are_fatal 0; + warn "parse errors in files are no longer fatal from this point on.\n"; + main_loop; } @@ -3568,14 +3603,14 @@ BEGIN { our %SIGWATCHER = (); for my $signal (qw(INT HUP TERM)) { - $SIGWATCHER{$signal} = EV::signal $signal, sub { + $SIGWATCHER{$signal} = AE::signal $signal, sub { cf::cleanup "SIG$signal"; }; } } sub write_runtime_sync { - my $t0 = EV::time; + my $t0 = AE::time; # first touch the runtime file to show we are still running: # the fsync below can take a very very long time. @@ -3607,7 +3642,7 @@ aio_rename "$RUNTIMEFILE~", $RUNTIMEFILE and return; - warn sprintf "runtime file written (%gs).\n", EV::time - $t0; + warn sprintf "runtime file written (%gs).\n", AE::time - $t0; 1 } @@ -3755,7 +3790,7 @@ return if $RELOAD++; - my $t1 = EV::time; + my $t1 = AE::time; while ($RELOAD) { warn "reloading..."; @@ -3868,7 +3903,7 @@ --$RELOAD; } - $t1 = EV::time - $t1; + $t1 = AE::time - $t1; warn "reload completed in ${t1}s\n"; }; @@ -3881,7 +3916,7 @@ $RELOAD_WATCHER ||= cf::async { Coro::AIO::aio_wait cache_extensions; - $RELOAD_WATCHER = EV::timer $TICK * 1.5, 0, sub { + $RELOAD_WATCHER = AE::timer $TICK * 1.5, 0, sub { do_reload_perl; undef $RELOAD_WATCHER; }; @@ -3932,7 +3967,7 @@ cf::server_tick; # one server iteration - #for(1..3e6){} EV::now_update; $NOW=EV::now; # generate load #d# + #for(1..3e6){} AE::now_update; $NOW=AE::now; # generate load #d# if ($NOW >= $NEXT_RUNTIME_WRITE) { $NEXT_RUNTIME_WRITE = List::Util::max $NEXT_RUNTIME_WRITE + 10, $NOW + 5.;