home · contact · privacy
Use temporary SpawnPoints to store logged-out players' positions for up to ten minutes.
authorChristian Heller <c.heller@plomlompom.de>
Fri, 18 Dec 2020 23:41:54 +0000 (00:41 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Fri, 18 Dec 2020 23:41:54 +0000 (00:41 +0100)
plomrogue/commands.py
plomrogue/game.py
plomrogue/things.py
rogue_chat.py

index 921d6e011c498744bb64659925be7cce66ffb140..9cdab97a20963109c70460b6135c610b8cf94aaf 100644 (file)
@@ -414,3 +414,17 @@ cmd_THING_CRATE_ITEM.argtypes = 'int:pos int:pos'
 def cmd_MAP_CONTROL_PRESETS(game, draw_control_presets):
     game.draw_control_presets = draw_control_presets
 cmd_MAP_CONTROL_PRESETS.argtypes = 'bool'
+
+def cmd_THING_SPAWNPOINT_CREATED(game, spawnpoint_id, timestamp):
+    import datetime
+    spawnpoint = game.get_thing(spawnpoint_id)
+    if not spawnpoint:
+        raise GameError('thing of ID %s not found' % spawnpoint_id)
+    if spawnpoint.type_ != 'SpawnPoint':
+        raise GameError('thing of ID %s not a SpawnPoint' % spawnpoint_id)
+    if timestamp == 0:
+        spawnpoint.temporary = False
+    else:
+        spawnpoint.temporary = True
+        spawnpoint.created_at = datetime.datetime.fromtimestamp(timestamp)
+cmd_THING_SPAWNPOINT_CREATED.argtypes = 'int:pos int:nonneg'
index 4b5c3372eba5b2d96fccfb72ec0d7e8250645b37..088db9d739a0eb7854608613758c28ff76cc2f0e 100755 (executable)
@@ -351,7 +351,9 @@ class Game(GameBase):
         for s in [s for s in self.things
                   if s.type_ == 'SpawnPoint' and s.name == t.name]:
             t.position = s.position
-            break
+            if s.temporary:
+                self.remove_thing(s)
+                break
 
     def run_tick(self):
 
@@ -367,6 +369,9 @@ class Game(GameBase):
                 t = self.get_player(connection_id)
                 if hasattr(t, 'name'):
                     self.io.send('CHAT ' + quote(t.name + ' left the map.'))
+                spawn_point = self.add_thing('SpawnPoint', t.position)
+                spawn_point.temporary = True
+                spawn_point.name = t.name
                 self.remove_thing(t)
                 to_delete += [connection_id]
         for connection_id in to_delete:
@@ -568,6 +573,20 @@ class Game(GameBase):
                 elif t.type_ == 'Crate':
                     for item in t.content:
                         write(f, 'THING_CRATE_ITEM %s %s' % (t.id_, item.id_))
+                elif t.type_ == 'SpawnPoint':
+                    timestamp = 0
+                    if t.temporary:
+                        timestamp = int(t.created_at.timestamp())
+                    write(f, 'THING_SPAWNPOINT_CREATED %s %s' % (t.id_,
+                                                                 timestamp))
+            next_thing_id = self.new_thing_id()
+            for t in [t for t in self.things if t.type_ == 'Player']:
+                write(f, 'THING %s %s SpawnPoint %s'
+                      % (t.position[0], t.position[1], next_thing_id))
+                write(f, 'GOD_THING_NAME %s %s' % (next_thing_id, t.name))
+                write(f, 'THING_SPAWNPOINT_CREATED %s %s'
+                      % (next_thing_id, int(datetime.datetime.now().timestamp())))
+                next_thing_id += 1
             write(f, 'SPAWN_POINT %s %s' % (self.spawn_point[0],
                                             self.spawn_point[1]))
 
index da995d311dd84b7a777f9c0cc28aae2f091be0d5..2c3f540443b46fbca6b4aee5170619d53d287d59 100644 (file)
@@ -148,6 +148,17 @@ class Thing_SpawnPoint(Thing):
     symbol_hint = 's'
     portable = True
     name = 'username'
+    temporary = False
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.created_at = datetime.datetime.now()
+
+    def proceed(self):
+        super().proceed()
+        if self.temporary and datetime.datetime.now() >\
+           self.created_at + datetime.timedelta(minutes=10):
+            self.game.remove_thing(self)
 
 
 
index 24612896249b62d962ad1d012f60ddf0d6489881..5c072764c52254e6b4f83ab521a48b0bfc27a7ce 100755 (executable)
@@ -16,7 +16,8 @@ from plomrogue.commands import (cmd_ALL, cmd_LOGIN, cmd_NICK, cmd_PING, cmd_THIN
                                 cmd_GOD_PLAYER_FACE, cmd_GOD_PLAYER_HAT,
                                 cmd_GOD_PLAYERS_HAT_CHARS, cmd_PLAYER_HAT,
                                 cmd_TERRAIN_TAG, cmd_THING_DOOR_KEY,
-                                cmd_THING_CRATE_ITEM, cmd_MAP_CONTROL_PRESETS)
+                                cmd_THING_CRATE_ITEM, cmd_MAP_CONTROL_PRESETS,
+                                cmd_THING_SPAWNPOINT_CREATED)
 from plomrogue.tasks import (Task_WAIT, Task_MOVE, Task_WRITE, Task_PICK_UP,
                              Task_DROP, Task_FLATTEN_SURROUNDINGS, Task_DOOR,
                              Task_INTOXICATE, Task_COMMAND, Task_INSTALL,
@@ -76,6 +77,7 @@ game.register_command(cmd_THING_HAT_DESIGN)
 game.register_command(cmd_THING_DOOR_KEY)
 game.register_command(cmd_THING_CRATE_ITEM)
 game.register_command(cmd_MAP_CONTROL_PRESETS)
+game.register_command(cmd_THING_SPAWNPOINT_CREATED)
 game.register_task(Task_WAIT)
 game.register_task(Task_MOVE)
 game.register_task(Task_WRITE)