--- deliantra/server/lib/cf.pm 2007/12/17 08:03:22 1.405 +++ deliantra/server/lib/cf.pm 2008/02/01 15:54:07 1.411 @@ -29,7 +29,7 @@ use Data::Dumper; use Digest::MD5; use Fcntl; -use YAML::Syck (); +use YAML (); use IO::AIO 2.51 (); use Time::HiRes; use Compress::LZF; @@ -41,9 +41,6 @@ Coro::State::cctx_stacksize 256000; # 1-2MB stack, for deep recursions in maze generator Compress::LZF::sfreeze_cr { }; # prime Compress::LZF so it does not use require later -# work around bug in YAML::Syck - bad news for perl6, will it be as broken wrt. unicode? -$YAML::Syck::ImplicitUnicode = 1; - $Coro::main->prio (Coro::PRIO_MAX); # run main coroutine ("the server") with very high priority sub WF_AUTOCANCEL () { 1 } # automatically cancel this watcher on reload @@ -196,6 +193,21 @@ }; } +$Coro::State::DIEHOOK = sub { + return unless $^S eq 0; # "eq", not "==" + + if ($Coro::current == $Coro::main) {#d# + warn "DIEHOOK called in main context, Coro bug?\n";#d# + return;#d# + }#d# + + # kill coroutine otherwise + warn Carp::longmess $_[0]; + Coro::terminate +}; + +$SIG{__DIE__} = sub { }; #d#? + @safe::cf::global::ISA = @cf::global::ISA = 'cf::attachable'; @safe::cf::object::ISA = @cf::object::ISA = 'cf::attachable'; @safe::cf::player::ISA = @cf::player::ISA = 'cf::attachable'; @@ -971,7 +983,7 @@ 0 } -=item $bool = cf::global::invoke (EVENT_CLASS_XXX, ...) +=item $bool = cf::global->invoke (EVENT_CLASS_XXX, ...) =item $bool = $attachable->invoke (EVENT_CLASS_XXX, ...) @@ -1306,8 +1318,7 @@ if (exists $v->{meta}{mandatory}) { warn $msg; - warn "mandatory extension failed to load, exiting.\n"; - exit 1; + cf::cleanup "mandatory extension failed to load, exiting."; } warn $msg; @@ -3220,28 +3231,32 @@ cf::cede_to_tick; } + } + + cf::global->invoke (EVENT_GLOBAL_RESOURCE_UPDATE); + + 1 +} - if (my $soundconf = delete $res->{"res/sound.conf"}) { - $soundconf = $enc->decode (delete $soundconf->{data}); +cf::global->attach (on_resource_update => sub { + if (my $soundconf = $RESOURCE{"res/sound.conf"}) { + $soundconf = JSON::XS->new->utf8->relaxed->decode ($soundconf->{data}); - for (0 .. SOUND_CAST_SPELL_0 - 1) { - my $sound = $soundconf->{compat}[$_] - or next; + for (0 .. SOUND_CAST_SPELL_0 - 1) { + my $sound = $soundconf->{compat}[$_] + or next; - my $face = cf::face::find "sound/$sound->[1]"; - cf::sound::set $sound->[0] => $face; - cf::sound::old_sound_index $_, $face; # gcfclient-compat - } + my $face = cf::face::find "sound/$sound->[1]"; + cf::sound::set $sound->[0] => $face; + cf::sound::old_sound_index $_, $face; # gcfclient-compat + } - while (my ($k, $v) = each %{$soundconf->{event}}) { - my $face = cf::face::find "sound/$v"; - cf::sound::set $k => $face; - } + while (my ($k, $v) = each %{$soundconf->{event}}) { + my $face = cf::face::find "sound/$v"; + cf::sound::set $k => $face; } } - - 1 -} +}); register_exticmd fx_want => sub { my ($ns, $want) = @_; @@ -3306,7 +3321,7 @@ or return; local $/; - *CFG = YAML::Syck::Load <$fh>; + *CFG = YAML::Load <$fh>; $EMERGENCY_POSITION = $CFG{emergency_position} || ["/world/world_105_115", 5, 37]; @@ -3544,8 +3559,7 @@ 1 } or do { warn $@; - warn "error while reloading, exiting."; - exit 1; + cf::cleanup "error while reloading, exiting."; }; warn "reloaded"; @@ -3558,8 +3572,8 @@ # coro crashes during coro_state_free->destroy here. $RELOAD_WATCHER ||= EV::timer 0, 0, sub { - undef $RELOAD_WATCHER; do_reload_perl; + undef $RELOAD_WATCHER; }; }