diff --git a/conf/config.yaml b/conf/config.yaml index f283bb0e175f5a3f9b1bd1186e3d5246780747b1..019b2da24ce2af409e5667660129818982386b2d 100644 --- a/conf/config.yaml +++ b/conf/config.yaml @@ -9,7 +9,7 @@ :restart_delay: 10 :address: 0.0.0.0 :intro_file: intro.txt -:start_room: 136a3824-e27a-67d0-bfe0-292f070de261 +:start_room: c1551b23-e2ef-628a-a7d9-e76a68d2e789 :restart_limit: 15 :mccp: false :mssp: false diff --git a/lib/aethyr/core/components/storage.rb b/lib/aethyr/core/components/storage.rb index 50c28333a9d17fc145c104545a1da219214e6a7b..de1b36ab8fc0053f39438291fe34f3ea6dddb0b3 100644 --- a/lib/aethyr/core/components/storage.rb +++ b/lib/aethyr/core/components/storage.rb @@ -63,17 +63,6 @@ class StorageMachine end end - #Yeah, so whatever on this little deal. Probably should do it better later. - player.use_color = player.io.display.use_color if player.io - player.color_settings = player.io.display.color_settings if player.io - player.layout = player.io.display.layout_type if player.io - - #Okay, this is tricky. We can't serialize the IO object stored in the Player - #objects. To get around this (we don't want to store it anyhow), we temporarily - #set it to nil, then back to whatever it was. - player_connection = player.instance_variable_get(:@player) - player.instance_variable_set(:@player, nil) - log "Saving player: #{player.name}" store_object(player) @@ -82,7 +71,6 @@ class StorageMachine end log "Player saved: #{player.name}" - player.instance_variable_set(:@player, player_connection) end #Sets password for a given player. Accepts player name or player object. @@ -197,6 +185,8 @@ class StorageMachine #Warning: this temporarily removes the object's observers. def store_object(object) + volatile_data = object.dehydrate() + if object.is_a? Observable observers = object.instance_variable_get(:@observer_peers) unless observers.nil? @@ -225,6 +215,8 @@ class StorageMachine @saved += 1 + object.rehydrate(volatile_data) + log "Stored #{object} # #{object.game_object_id}", Logger::Ultimate end @@ -339,6 +331,9 @@ class StorageMachine object.container = ServerConfig.start_room end end + + object.rehydrate(nil) + return object end diff --git a/lib/aethyr/core/objects/game_object.rb b/lib/aethyr/core/objects/game_object.rb index 4a86b3191fa26adcb0b2fc923af61c4d1142bfff..ecef6a0fb9b24961c1e3d845196264f1856c2869 100644 --- a/lib/aethyr/core/objects/game_object.rb +++ b/lib/aethyr/core/objects/game_object.rb @@ -19,6 +19,13 @@ class GameObject < Publisher alias :can? :respond_to? alias :goid :game_object_id + @@volatile = [] + + def self.volatile(*attrs) + @@volatile += attrs + @@volatile.uniq! + end + #Creates a new GameObject. Most of this long list of parameters is simply ignored at creation time, #because they can all be set later. def initialize(game_object_id = nil, container = nil, name = "", alt_names = Array.new, short_desc = "Nothing interesting here.", long_desc = "", generic = "", sex = "n", article = "a") @@ -72,6 +79,23 @@ class GameObject < Publisher @admin = false end + # removes all volatle data but provides it as a map for restoration in rehydrate + def dehydrate + volatile_data = {} + @@volatile.each do |attr| + volatile_data[attr] = self.instance_variable_get(attr) + self.instance_variable_set(attr, nil) + end + return volatile_data + end + + def rehydrate(volatile_data) + return if volatile_data.nil? + volatile_data.each do |attr, data| + self.instance_variable_set(attr, data) if @@volatile.include? attr + end + end + def flags Hash.new @info.flags end diff --git a/lib/aethyr/core/objects/player.rb b/lib/aethyr/core/objects/player.rb index 885e98100bfc7f9e2eb54b1ca21d54ca3fccc02e..c45f4c01d4b89cbb3c53bfc8fe73e52c84ef6be8 100644 --- a/lib/aethyr/core/objects/player.rb +++ b/lib/aethyr/core/objects/player.rb @@ -42,6 +42,7 @@ class Player < LivingObject attr_reader :admin, :color_settings, :help_library attr_accessor :use_color, :reply_to, :page_height + volatile :@help_library, :@player #Create a new player object with the given socket connection. You must also pass in a game_object_id and a room, although if you pass in nil for game_object_id it will auto-generate one for you. def initialize(connection, game_object_id, room, *args) @@ -58,7 +59,8 @@ class Player < LivingObject @blind = false @reply_to = nil @prompt_shown = false - @player.display.layout(layout: :basic) + @layout = :basic + @player.display.layout(layout: @layout) @help_library = Aethyr::Core::Help::HelpLibrary.new info.stats.satiety = 120 @@ -69,6 +71,19 @@ class Player < LivingObject map_skill.add_xp 750 end + #called right before saving to temporarily remove volatile data. + def dehydrate + volatile_data = super() + @layout = volatile_data[:@player].display.layout_type + return volatile_data + end + + #This should be called anytime the volatile data needs to be restored or initialized during a save or load + def rehydrate(volatile_data) + super(volatile_data) + @help_library = Aethyr::Core::Help::HelpLibrary.new if @help_library.nil? + end + def layout return nil if @player.display.nil? return @player.display.layout_type