Skip to content

Commit

Permalink
[FEATURE] Add replay command (admin), make it able to rejuke current …
Browse files Browse the repository at this point in the history
…map for admins.
  • Loading branch information
tomvlk committed May 20, 2017
1 parent c4dd22e commit dc916eb
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 17 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.rst
Expand Up @@ -16,6 +16,7 @@ Apps

* Bugfix: Fixing issue with removing or erasing maps.
* Improvement: Dedimania now also works in cup mode.
* Feature: Add //replay command for admins, make it able to juke the current map for non-players (ops and admins)


0.3.1
Expand Down
11 changes: 11 additions & 0 deletions docs/source/apps/contrib/admin.rst
Expand Up @@ -63,6 +63,17 @@ Functionality:
Required permission:
``admin:restart``, requires admin level 1.

Replay map
~~~~~~~~~~
Command:
``//replay``
Parameters:
None.
Functionality:
Queue the current map to be replayed
Required permission:
``admin:replay``, requires admin level 1.

Add Local map
~~~~~~~~~~~~~
Command:
Expand Down
17 changes: 13 additions & 4 deletions pyplanet/apps/contrib/admin/map.py
Expand Up @@ -25,6 +25,7 @@ async def on_start(self):
await self.instance.permission_manager.register('previous', 'Skip to the previous map', app=self.app, min_level=1)
await self.instance.permission_manager.register('next', 'Skip to the next map', app=self.app, min_level=1)
await self.instance.permission_manager.register('restart', 'Restart the maps', app=self.app, min_level=1)
await self.instance.permission_manager.register('replay', 'Replay the maps', app=self.app, min_level=1)
await self.instance.permission_manager.register('add_local_map', 'Add map from server disk', app=self.app, min_level=2)
await self.instance.permission_manager.register('remove_map', 'Remove map from server', app=self.app, min_level=2)
await self.instance.permission_manager.register('write_map_list', 'Write Matchsettings to file', app=self.app, min_level=2)
Expand All @@ -34,6 +35,7 @@ async def on_start(self):
Command(command='skip', target=self.next_map, perms='admin:next', admin=True),
Command(command='previous', aliases=['prev'], target=self.prev_map, perms='admin:previous', admin=True),
Command(command='restart', aliases=['res', 'rs'], target=self.restart_map, perms='admin:restart', admin=True),
Command(command='replay', target=self.replay_map, perms='admin:replay', admin=True),
Command(command='local', namespace='add', target=self.add_local_map, perms='admin:add_local_map', admin=True)
.add_param('map', nargs=1, type=str, required=True, help='Map filename (relative to Maps directory).'),
Command(command='remove', target=self.remove_map, perms='admin:remove_map', admin=True, description='Remove map from maplist.')
Expand All @@ -53,10 +55,7 @@ async def prev_map(self, player, data, **kwargs):
return await self.instance.chat(message, player.login)

if 'jukebox' in self.instance.apps.apps:
self.instance.apps.apps['jukebox'].jukebox = [
{'player': player, 'map': self.instance.map_manager.previous_map}
] + self.instance.apps.apps['jukebox'].jukebox
pass
self.instance.apps.apps['jukebox'].insert_map(player, self.instance.map_manager.previous_map)
else:
await self.instance.map_manager.set_next_map(self.instance.map_manager.previous_map)

Expand All @@ -80,6 +79,16 @@ async def restart_map(self, player, data, **kwargs):
self.instance.chat(message)
)

async def replay_map(self, player, data, **kwargs):
if 'jukebox' in self.instance.apps.apps:
self.instance.apps.apps['jukebox'].insert_map(player, self.instance.map_manager.current_map)
else:
await self.instance.map_manager.set_next_map(self.instance.map_manager.current_map)

await self.instance.chat(
'$ff0Admin $fff{}$z$s$ff0 has queued this map for replay.'.format(player.nickname)
)

async def write_map_list(self, player, data, **kwargs):
setting = settings.MAP_MATCHSETTINGS
if isinstance(setting, dict) and self.instance.process_name in setting:
Expand Down
30 changes: 18 additions & 12 deletions pyplanet/apps/contrib/jukebox/__init__.py
Expand Up @@ -31,6 +31,15 @@ async def on_start(self):
# Register callback.
self.instance.signal_manager.listen(mp_signals.flow.podium_start, self.podium_start)

def insert_map(self, player, map):
self.jukebox = [{'player': player, 'map': map}] + self.jukebox

def append_map(self, player, map):
self.jukebox.append({'player': player, 'map': map})

def clear_jukebox(self):
self.jukebox.clear()

async def show_map_list(self, player, data, **kwargs):
view = MapListView(self)
if data.search is not None:
Expand Down Expand Up @@ -87,7 +96,7 @@ async def add_to_jukebox(self, player, map):
await self.instance.chat(message, player)
return

if map.get_id() == self.instance.map_manager.current_map.get_id():
if map.get_id() == self.instance.map_manager.current_map.get_id() and player.level == 0:
message = '$i$f00You can\'t add the current map to the jukebox!'
await self.instance.chat(message, player)
return
Expand All @@ -113,14 +122,11 @@ async def drop_from_jukebox(self, player, instance):
await self.instance.chat(message)

async def podium_start(self, **kwargs):
while True:
if len(self.jukebox) == 0:
break
next = self.jukebox.pop(0)
if next['map'].get_id() != self.instance.map_manager.current_map.get_id():
message = '$fa0The next map will be $fff{}$z$s$fa0 as requested by $fff{}$z$s$fa0.'.format(next['map'].name, next['player'].nickname)
await asyncio.gather(
self.instance.chat(message),
self.instance.map_manager.set_next_map(next['map'])
)
break
if len(self.jukebox) == 0:
return
next = self.jukebox.pop(0)
message = '$fa0The next map will be $fff{}$z$s$fa0 as requested by $fff{}$z$s$fa0.'.format(next['map'].name, next['player'].nickname)
await asyncio.gather(
self.instance.chat(message),
self.instance.map_manager.set_next_map(next['map'])
)
5 changes: 4 additions & 1 deletion pyplanet/contrib/map/manager.py
Expand Up @@ -159,7 +159,10 @@ async def set_next_map(self, map):
map = await self.get_map(map)
if not isinstance(map, Map):
raise Exception('When setting the map, you should give an Map instance!')
await self._instance.gbx('SetNextMapIdent', map.uid)
if map.file:
await self._instance.gbx('ChooseNextMap', map.file)
else:
await self._instance.gbx('SetNextMapIdent', map.uid)
self._next_map = map

@property
Expand Down

0 comments on commit dc916eb

Please sign in to comment.