| 1 |
|
|---|
| 2 |
|
|---|
| 3 |
|
|---|
| 4 |
|
|---|
| 5 |
|
|---|
| 6 |
|
|---|
| 7 |
|
|---|
| 8 |
|
|---|
| 9 |
|
|---|
| 10 |
|
|---|
| 11 |
|
|---|
| 12 |
|
|---|
| 13 |
|
|---|
| 14 |
|
|---|
| 15 |
|
|---|
| 16 |
|
|---|
| 17 |
|
|---|
| 18 |
|
|---|
| 19 |
|
|---|
| 20 |
from xmpp import Message, Presence, NS_MUC_USER |
|---|
| 21 |
|
|---|
| 22 |
from thing import NonPlayableCharacter |
|---|
| 23 |
|
|---|
| 24 |
class Place(object): |
|---|
| 25 |
def __init__(self, world, name, description): |
|---|
| 26 |
self.world = world |
|---|
| 27 |
self.name = name |
|---|
| 28 |
self.description = description |
|---|
| 29 |
|
|---|
| 30 |
self.visitors = list() |
|---|
| 31 |
self.npcs = list() |
|---|
| 32 |
|
|---|
| 33 |
self.things = list() |
|---|
| 34 |
self.exits = dict() |
|---|
| 35 |
|
|---|
| 36 |
def player_leaved(self, player): |
|---|
| 37 |
""" |
|---|
| 38 |
Broadcast unavaibility of Player or NonPlayableCharacter, |
|---|
| 39 |
Trigger on-leave events and remove |
|---|
| 40 |
Player/NonPlayableCharacter from the lists. |
|---|
| 41 |
""" |
|---|
| 42 |
|
|---|
| 43 |
if player.place: |
|---|
| 44 |
message = '/me leaves %s going to %s' % (self.name, |
|---|
| 45 |
player.place.name) |
|---|
| 46 |
else: |
|---|
| 47 |
message = '/me disintegrates' |
|---|
| 48 |
|
|---|
| 49 |
if isinstance(player, NonPlayableCharacter): |
|---|
| 50 |
player.trigger_event('on-self-leave') |
|---|
| 51 |
self.npcs.remove(player) |
|---|
| 52 |
else: |
|---|
| 53 |
self.visitors.remove(player) |
|---|
| 54 |
|
|---|
| 55 |
|
|---|
| 56 |
for npc in self.npcs: |
|---|
| 57 |
pres = Presence(node=npc.presence) |
|---|
| 58 |
pres.setType('unavailable') |
|---|
| 59 |
player.send_presence(npc.name, pres) |
|---|
| 60 |
for visitor in self.visitors: |
|---|
| 61 |
if visitor is not player: |
|---|
| 62 |
pres = visitor.fix_presence() |
|---|
| 63 |
pres.setType('unavailable') |
|---|
| 64 |
player.send_presence(visitor.name, pres) |
|---|
| 65 |
|
|---|
| 66 |
|
|---|
| 67 |
self.broadcast_message(player.name, message) |
|---|
| 68 |
self.broadcast_status(player, 'unavailable') |
|---|
| 69 |
|
|---|
| 70 |
|
|---|
| 71 |
self.trigger_event('on-leave', player) |
|---|
| 72 |
|
|---|
| 73 |
def player_entered(self, player, old_place=None): |
|---|
| 74 |
""" |
|---|
| 75 |
Broadcast avaibility of Player or NonPlayableCharacter, |
|---|
| 76 |
Trigger on-enter events, append |
|---|
| 77 |
Player/NonPlayableCharacter to the lists and send description |
|---|
| 78 |
of the room to the Player. |
|---|
| 79 |
""" |
|---|
| 80 |
|
|---|
| 81 |
if old_place: |
|---|
| 82 |
message = '/me enters in %s coming from %s' % (self.name, |
|---|
| 83 |
old_place.name) |
|---|
| 84 |
else: |
|---|
| 85 |
message = '/me spawns' |
|---|
| 86 |
|
|---|
| 87 |
|
|---|
| 88 |
self.broadcast_status(player) |
|---|
| 89 |
self.broadcast_message(player.name, message) |
|---|
| 90 |
|
|---|
| 91 |
if isinstance(player, NonPlayableCharacter): |
|---|
| 92 |
self.npcs.append(player) |
|---|
| 93 |
player.trigger_event('on-self-enter') |
|---|
| 94 |
else: |
|---|
| 95 |
self.visitors.append(player) |
|---|
| 96 |
|
|---|
| 97 |
|
|---|
| 98 |
for npc in self.npcs: |
|---|
| 99 |
player.send_presence(npc.name, npc.presence) |
|---|
| 100 |
for visitor in self.visitors: |
|---|
| 101 |
if visitor is not player: |
|---|
| 102 |
pres = visitor.fix_presence() |
|---|
| 103 |
player.send_presence(visitor.name, pres) |
|---|
| 104 |
|
|---|
| 105 |
pres = player.fix_presence(to_self=True) |
|---|
| 106 |
player.send_presence(player.name, pres) |
|---|
| 107 |
|
|---|
| 108 |
|
|---|
| 109 |
player.send_message(None, None, |
|---|
| 110 |
'%s: %s' % (self.world.name, |
|---|
| 111 |
self.name.capitalize())) |
|---|
| 112 |
player.send_message(None, |
|---|
| 113 |
'\n******\n\n\n\n**********\n' |
|---|
| 114 |
'Entering %s\n**********' |
|---|
| 115 |
'\n\n%s\nYou can go %s.' % (self.name.capitalize(), |
|---|
| 116 |
self.description, |
|---|
| 117 |
', '.join(self.exits.keys()))) |
|---|
| 118 |
|
|---|
| 119 |
|
|---|
| 120 |
self.trigger_event('on-enter', player) |
|---|
| 121 |
|
|---|
| 122 |
def trigger_event(self, event_type, actor): |
|---|
| 123 |
""" Trigger event of type event_type for all things and npcs """ |
|---|
| 124 |
for npc in self.npcs: |
|---|
| 125 |
if actor is not npc: |
|---|
| 126 |
npc.trigger_event(event_type, actor) |
|---|
| 127 |
for thing in self.things: |
|---|
| 128 |
thing.trigger_event(event_type, actor) |
|---|
| 129 |
|
|---|
| 130 |
def broadcast_status(self, player, status=None): |
|---|
| 131 |
""" Broadcast a presence stanza in the room """ |
|---|
| 132 |
presence = player.fix_presence() |
|---|
| 133 |
if status is not None: |
|---|
| 134 |
presence.setType(status) |
|---|
| 135 |
for visitor in self.visitors: |
|---|
| 136 |
visitor.send_presence(player.name, presence) |
|---|
| 137 |
|
|---|
| 138 |
def broadcast_message(self, from_, message): |
|---|
| 139 |
""" Broadcast a message in all visitors in the room """ |
|---|
| 140 |
for visitor in self.visitors: |
|---|
| 141 |
visitor.send_message(from_, message) |
|---|
| 142 |
|
|---|
| 143 |
|
|---|