Merge pull request #1350 from vlegoff/ingame_python
Rename the event system into in-game Python system
This commit is contained in:
commit
2f2d9e308a
9 changed files with 92 additions and 95 deletions
|
|
@ -1,9 +1,9 @@
|
||||||
# Evennia event system
|
# Evennia in-game Python system
|
||||||
|
|
||||||
Vincent Le Goff 2017
|
Vincent Le Goff 2017
|
||||||
|
|
||||||
This contrib adds the system of events in Evennia, allowing immortals (or other trusted builders) to
|
This contrib adds the system of in-game Python in Evennia, allowing immortals (or other trusted builders) to
|
||||||
dynamically add features to individual objects. Using events, every immortal or privileged users
|
dynamically add features to individual objects. Using custom Python set in-game, every immortal or privileged users
|
||||||
could have a specific room, exit, character, object or something else behave differently from its
|
could have a specific room, exit, character, object or something else behave differently from its
|
||||||
"cousins". For these familiar with the use of softcode in MU`*`, like SMAUG MudProgs, the ability to
|
"cousins". For these familiar with the use of softcode in MU`*`, like SMAUG MudProgs, the ability to
|
||||||
add arbitrary behavior to individual objects is a step toward freedom. Keep in mind, however, the
|
add arbitrary behavior to individual objects is a step toward freedom. Keep in mind, however, the
|
||||||
|
|
@ -11,26 +11,26 @@ warning below, and read it carefully before the rest of the documentation.
|
||||||
|
|
||||||
## A WARNING REGARDING SECURITY
|
## A WARNING REGARDING SECURITY
|
||||||
|
|
||||||
Evennia's event system will run arbitrary Python code without much restriction. Such a system is as
|
Evennia's in-game Python system will run arbitrary Python code without much restriction. Such a system is as
|
||||||
powerful as potentially dangerous, and you will have to keep in mind these points before deciding to
|
powerful as potentially dangerous, and you will have to keep in mind these points before deciding to
|
||||||
install it:
|
install it:
|
||||||
|
|
||||||
1. Untrusted people can run Python code on your game server with this system. Be careful about who
|
1. Untrusted people can run Python code on your game server with this system. Be careful about who
|
||||||
can use this system (see the permissions below).
|
can use this system (see the permissions below).
|
||||||
2. You can do all of this in Python outside the game. The event system is not to replace all your
|
2. You can do all of this in Python outside the game. The in-game Python system is not to replace all your
|
||||||
game feature.
|
game feature.
|
||||||
|
|
||||||
## Basic structure and vocabulary
|
## Basic structure and vocabulary
|
||||||
|
|
||||||
- At the basis of the event system are **events**. An **event** defines the context in which we
|
- At the basis of the in-game Python system are **events**. An **event** defines the context in which we
|
||||||
would like to call some arbitrary code. For instance, one event is defined on exits and will fire
|
would like to call some arbitrary code. For instance, one event is
|
||||||
every time a character traverses through this exit. Events are described on a
|
defined on exits and will fire every time a character traverses through this exit. Events are described
|
||||||
[typeclass](https://github.com/evennia/evennia/wiki/Typeclasses) (like
|
on a [typeclass](https://github.com/evennia/evennia/wiki/Typeclasses) (like
|
||||||
[exits](https://github.com/evennia/evennia/wiki/Objects#exits) in our example). All objects
|
[exits](https://github.com/evennia/evennia/wiki/Objects#exits) in our example). All objects inheriting
|
||||||
inheriting from this typeclass will have access to this event.
|
from this typeclass will have access to this event.
|
||||||
- **Callbacks** can be set on individual objects, on events defined in code. These **callbacks**
|
- **Callbacks** can be set on individual objects, on events defined in code. These **callbacks**
|
||||||
can contain arbitrary code and describe a specific behavior for an object. When the event fires,
|
can contain arbitrary code and describe a specific behavior for an object. When the event fires,
|
||||||
all callbacks connected to this object's event are executed.
|
all callbacks connected to this object's event are executed.
|
||||||
|
|
||||||
To see the system in context, when an object is picked up (using the default `get` command), a
|
To see the system in context, when an object is picked up (using the default `get` command), a
|
||||||
specific event is fired:
|
specific event is fired:
|
||||||
|
|
@ -41,10 +41,10 @@ specific event is fired:
|
||||||
the "get" event on this object.
|
the "get" event on this object.
|
||||||
4. All callbacks tied to this object's "get" event will be executed in order. These callbacks act
|
4. All callbacks tied to this object's "get" event will be executed in order. These callbacks act
|
||||||
as functions containing Python code that you can write in-game, using specific variables that
|
as functions containing Python code that you can write in-game, using specific variables that
|
||||||
will be listed when you edit the callback itself.
|
will be listed when you edit the callback itself.
|
||||||
5. In individual callbacks, you can add multiple lines of Python code that will be fired at this
|
5. In individual callbacks, you can add multiple lines of Python code that will be fired at this
|
||||||
point. In this example, the `character` variable will contain the character who has picked up
|
point. In this example, the `character` variable will contain the character who has picked up
|
||||||
the object, while `obj` will contain the object that was picked up.
|
the object, while `obj` will contain the object that was picked up.
|
||||||
|
|
||||||
Following this example, if you create a callback "get" on the object "a sword", and put in it:
|
Following this example, if you create a callback "get" on the object "a sword", and put in it:
|
||||||
|
|
||||||
|
|
@ -59,11 +59,11 @@ When you pick up this object you should see something like:
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
Being in a separate contrib, the event system isn't installed by default. You need to do it
|
Being in a separate contrib, the in-game Python system isn't installed by default. You need to do it
|
||||||
manually, following these steps:
|
manually, following these steps:
|
||||||
|
|
||||||
1. Launch the main script (important!):
|
1. Launch the main script (important!):
|
||||||
```@py evennia.create_script("evennia.contrib.events.scripts.EventHandler")```
|
```@py evennia.create_script("evennia.contrib.ingame_python.scripts.EventHandler")```
|
||||||
2. Set the permissions (optional):
|
2. Set the permissions (optional):
|
||||||
- `EVENTS_WITH_VALIDATION`: a group that can edit callbacks, but will need approval (default to
|
- `EVENTS_WITH_VALIDATION`: a group that can edit callbacks, but will need approval (default to
|
||||||
`None`).
|
`None`).
|
||||||
|
|
@ -73,11 +73,11 @@ manually, following these steps:
|
||||||
- `EVENTS_CALENDAR`: type of the calendar to be used (either `None`, `"standard"` or `"custom"`,
|
- `EVENTS_CALENDAR`: type of the calendar to be used (either `None`, `"standard"` or `"custom"`,
|
||||||
default to `None`).
|
default to `None`).
|
||||||
3. Add the `@call` command.
|
3. Add the `@call` command.
|
||||||
4. Inherit from the custom typeclasses of the event system.
|
4. Inherit from the custom typeclasses of the in-game Python system.
|
||||||
- `evennia.contrib.events.typeclasses.EventCharacter`: to replace `DefaultCharacter`.
|
- `evennia.contrib.ingame_python.typeclasses.EventCharacter`: to replace `DefaultCharacter`.
|
||||||
- `evennia.contrib.events.typeclasses.EventExit`: to replace `DefaultExit`.
|
- `evennia.contrib.ingame_python.typeclasses.EventExit`: to replace `DefaultExit`.
|
||||||
- `evennia.contrib.events.typeclasses.EventObject`: to replace `DefaultObject`.
|
- `evennia.contrib.ingame_python.typeclasses.EventObject`: to replace `DefaultObject`.
|
||||||
- `evennia.contrib.events.typeclasses.EventRoom`: to replace `DefaultRoom`.
|
- `evennia.contrib.ingame_python.typeclasses.EventRoom`: to replace `DefaultRoom`.
|
||||||
|
|
||||||
The following sections describe in details each step of the installation.
|
The following sections describe in details each step of the installation.
|
||||||
|
|
||||||
|
|
@ -89,7 +89,7 @@ that a 'callback' property is not defined. After performing step `1` the error w
|
||||||
|
|
||||||
To start the event script, you only need a single command, using `@py`.
|
To start the event script, you only need a single command, using `@py`.
|
||||||
|
|
||||||
@py evennia.create_script("evennia.contrib.events.scripts.EventHandler")
|
@py evennia.create_script("evennia.contrib.ingame_python.scripts.EventHandler")
|
||||||
|
|
||||||
This command will create a global script (that is, a script independent from any object). This
|
This command will create a global script (that is, a script independent from any object). This
|
||||||
script will hold basic configuration, individual callbacks and so on. You may access it directly,
|
script will hold basic configuration, individual callbacks and so on. You may access it directly,
|
||||||
|
|
@ -174,7 +174,7 @@ this:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from evennia import default_cmds
|
from evennia import default_cmds
|
||||||
from evennia.contrib.events.commands import CmdCallback
|
from evennia.contrib.ingame_python.commands import CmdCallback
|
||||||
|
|
||||||
class CharacterCmdSet(default_cmds.CharacterCmdSet):
|
class CharacterCmdSet(default_cmds.CharacterCmdSet):
|
||||||
"""
|
"""
|
||||||
|
|
@ -194,25 +194,25 @@ class CharacterCmdSet(default_cmds.CharacterCmdSet):
|
||||||
|
|
||||||
### Changing parent classes of typeclasses
|
### Changing parent classes of typeclasses
|
||||||
|
|
||||||
Finally, to use the event system, you need to have your typeclasses inherit from the modified event
|
Finally, to use the in-game Python system, you need to have your typeclasses inherit from the modified event
|
||||||
classes. For instance, in your `typeclasses/characters.py` module, you should change inheritance
|
classes. For instance, in your `typeclasses/characters.py` module, you should change inheritance
|
||||||
like this:
|
like this:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from evennia.contrib.events.typeclasses import EventCharacter
|
from evennia.contrib.ingame_python.typeclasses import EventCharacter
|
||||||
|
|
||||||
class Character(EventCharacter):
|
class Character(EventCharacter):
|
||||||
|
|
||||||
# ...
|
# ...
|
||||||
```
|
```
|
||||||
|
|
||||||
You should do the same thing for your rooms, exits and objects. Note that the event system works by
|
You should do the same thing for your rooms, exits and objects. Note that the in-game Python system works by
|
||||||
overriding some hooks. Some of these features might not be accessible in your game if you don't
|
overriding some hooks. Some of these features might not be accessible in your game if you don't
|
||||||
call the parent methods when overriding hooks.
|
call the parent methods when overriding hooks.
|
||||||
|
|
||||||
## Using the `@call` command
|
## Using the `@call` command
|
||||||
|
|
||||||
The event system relies, to a great extent, on its `@call` command. Who can execute this command,
|
The in-game Python system relies, to a great extent, on its `@call` command. Who can execute this command,
|
||||||
and who can do what with it, will depend on your set of permissions.
|
and who can do what with it, will depend on your set of permissions.
|
||||||
|
|
||||||
The `@call` command allows to add, edit and delete callbacks on specific objects' events. The event
|
The `@call` command allows to add, edit and delete callbacks on specific objects' events. The event
|
||||||
|
|
@ -383,7 +383,7 @@ most complex.
|
||||||
|
|
||||||
### The eventfuncs
|
### The eventfuncs
|
||||||
|
|
||||||
In order to make development a little easier, the event system provides eventfuncs to be used in
|
In order to make development a little easier, the in-game Python system provides eventfuncs to be used in
|
||||||
callbacks themselves. You don't have to use them, they are just shortcuts. An eventfunc is just a
|
callbacks themselves. You don't have to use them, they are just shortcuts. An eventfunc is just a
|
||||||
simple function that can be used inside of your callback code.
|
simple function that can be used inside of your callback code.
|
||||||
|
|
||||||
|
|
@ -473,7 +473,7 @@ And if the character Wilfred takes this exit, others in the room will see:
|
||||||
|
|
||||||
Wildred falls into a hole in the ground!
|
Wildred falls into a hole in the ground!
|
||||||
|
|
||||||
In this case, the event system placed the variable "message" in the callback locals, but will read
|
In this case, the in-game Python system placed the variable "message" in the callback locals, but will read
|
||||||
from it when the event has been executed.
|
from it when the event has been executed.
|
||||||
|
|
||||||
### Callbacks with parameters
|
### Callbacks with parameters
|
||||||
|
|
@ -661,15 +661,15 @@ specific events fired.
|
||||||
|
|
||||||
Adding new events should be done in your typeclasses. Events are contained in the `_events` class
|
Adding new events should be done in your typeclasses. Events are contained in the `_events` class
|
||||||
variable, a dictionary of event names as keys, and tuples to describe these events as values. You
|
variable, a dictionary of event names as keys, and tuples to describe these events as values. You
|
||||||
also need to register this class, to tell the event system that it contains events to be added to
|
also need to register this class, to tell the in-game Python system that it contains events to be added to
|
||||||
this typeclass.
|
this typeclass.
|
||||||
|
|
||||||
Here, we want to add a "push" event on objects. In your `typeclasses/objects.py` file, you should
|
Here, we want to add a "push" event on objects. In your `typeclasses/objects.py` file, you should
|
||||||
write something like:
|
write something like:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from evennia.contrib.events.utils import register_events
|
from evennia.contrib.ingame_python.utils import register_events
|
||||||
from evennia.contrib.events.typeclasses import EventObject
|
from evennia.contrib.ingame_python.typeclasses import EventObject
|
||||||
|
|
||||||
EVENT_PUSH = """
|
EVENT_PUSH = """
|
||||||
A character push the object.
|
A character push the object.
|
||||||
|
|
@ -692,7 +692,7 @@ class Object(EventObject):
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- Line 1-2: we import several things we will need from the event system. Note that we use
|
- Line 1-2: we import several things we will need from the in-game Python system. Note that we use
|
||||||
`EventObject` as a parent instead of `DefaultObject`, as explained in the installation.
|
`EventObject` as a parent instead of `DefaultObject`, as explained in the installation.
|
||||||
- Line 4-12: we usually define the help of the event in a separate variable, this is more readable,
|
- Line 4-12: we usually define the help of the event in a separate variable, this is more readable,
|
||||||
though there's no rule against doing it another way. Usually, the help should contain a short
|
though there's no rule against doing it another way. Usually, the help should contain a short
|
||||||
|
|
@ -714,7 +714,7 @@ fired.
|
||||||
|
|
||||||
### Calling an event in code
|
### Calling an event in code
|
||||||
|
|
||||||
The event system is accessible through a handler on all objects. This handler is named `callbacks`
|
The in-game Python system is accessible through a handler on all objects. This handler is named `callbacks`
|
||||||
and can be accessed from any typeclassed object (your character, a room, an exit...). This handler
|
and can be accessed from any typeclassed object (your character, a room, an exit...). This handler
|
||||||
offers several methods to examine and call an event or callback on this object.
|
offers several methods to examine and call an event or callback on this object.
|
||||||
|
|
||||||
|
|
@ -825,7 +825,7 @@ this is out of the scope of this documentation).
|
||||||
The "say" command uses phrase parameters (you can set a "say" callback to fires if a phrase
|
The "say" command uses phrase parameters (you can set a "say" callback to fires if a phrase
|
||||||
contains one specific word).
|
contains one specific word).
|
||||||
|
|
||||||
In both cases, you need to import a function from `evennia.contrib.events.utils` and use it as third
|
In both cases, you need to import a function from `evennia.contrib.ingame_python.utils` and use it as third
|
||||||
parameter in your event definition.
|
parameter in your event definition.
|
||||||
|
|
||||||
- `keyword_event` should be used for keyword parameters.
|
- `keyword_event` should be used for keyword parameters.
|
||||||
|
|
@ -834,7 +834,7 @@ parameter in your event definition.
|
||||||
For example, here is the definition of the "say" event:
|
For example, here is the definition of the "say" event:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from evennia.contrib.events.utils import register_events, phrase_event
|
from evennia.contrib.ingame_python.utils import register_events, phrase_event
|
||||||
# ...
|
# ...
|
||||||
@register_events
|
@register_events
|
||||||
class SomeTypeclass:
|
class SomeTypeclass:
|
||||||
|
|
@ -865,5 +865,5 @@ The best way to do this is to use a custom setting, in your setting file
|
||||||
EVENTS_DISABLED = True
|
EVENTS_DISABLED = True
|
||||||
```
|
```
|
||||||
|
|
||||||
The event system will still be accessible (you will have access to the `@call` command, to debug),
|
The in-game Python system will still be accessible (you will have access to the `@call` command, to debug),
|
||||||
but no event will be called automatically.
|
but no event will be called automatically.
|
||||||
|
|
@ -7,9 +7,9 @@ from collections import namedtuple
|
||||||
class CallbackHandler(object):
|
class CallbackHandler(object):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
The event handler for a specific object.
|
The callback handler for a specific object.
|
||||||
|
|
||||||
The script that contains all events will be reached through this
|
The script that contains all callbacks will be reached through this
|
||||||
handler. This handler is therefore a shortcut to be used by
|
handler. This handler is therefore a shortcut to be used by
|
||||||
developers. This handler (accessible through `obj.callbacks`) is a
|
developers. This handler (accessible through `obj.callbacks`) is a
|
||||||
shortcut to manipulating callbacks within this object, getting,
|
shortcut to manipulating callbacks within this object, getting,
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
"""
|
"""
|
||||||
Module containing the commands of the callback system.
|
Module containing the commands of the in-game Python system.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
@ -10,7 +10,7 @@ from evennia.utils.ansi import raw
|
||||||
from evennia.utils.eveditor import EvEditor
|
from evennia.utils.eveditor import EvEditor
|
||||||
from evennia.utils.evtable import EvTable
|
from evennia.utils.evtable import EvTable
|
||||||
from evennia.utils.utils import class_from_module, time_format
|
from evennia.utils.utils import class_from_module, time_format
|
||||||
from evennia.contrib.events.utils import get_event_handler
|
from evennia.contrib.ingame_python.utils import get_event_handler
|
||||||
|
|
||||||
COMMAND_DEFAULT_CLASS = class_from_module(settings.COMMAND_DEFAULT_CLASS)
|
COMMAND_DEFAULT_CLASS = class_from_module(settings.COMMAND_DEFAULT_CLASS)
|
||||||
|
|
||||||
|
|
@ -358,9 +358,6 @@ class CmdCallback(COMMAND_DEFAULT_CLASS):
|
||||||
|
|
||||||
# Open the editor
|
# Open the editor
|
||||||
callback = dict(callback)
|
callback = dict(callback)
|
||||||
callback["obj"] = obj
|
|
||||||
callback["name"] = callback_name
|
|
||||||
callback["number"] = number
|
|
||||||
self.caller.db._callback = callback
|
self.caller.db._callback = callback
|
||||||
EvEditor(self.caller, loadfunc=_ev_load, savefunc=_ev_save,
|
EvEditor(self.caller, loadfunc=_ev_load, savefunc=_ev_save,
|
||||||
quitfunc=_ev_quit, key="Callback {} of {}".format(
|
quitfunc=_ev_quit, key="Callback {} of {}".format(
|
||||||
|
|
@ -6,14 +6,14 @@ Eventfuncs are just Python functions that can be used inside of calllbacks.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from evennia import ObjectDB, ScriptDB
|
from evennia import ObjectDB, ScriptDB
|
||||||
from evennia.contrib.events.utils import InterruptEvent
|
from evennia.contrib.ingame_python.utils import InterruptEvent
|
||||||
|
|
||||||
def deny():
|
def deny():
|
||||||
"""
|
"""
|
||||||
Deny, that is stop, the event here.
|
Deny, that is stop, the callback here.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
This function will raise an exception to terminate the event
|
This function will raise an exception to terminate the callback
|
||||||
in a controlled way. If you use this function in an event called
|
in a controlled way. If you use this function in an event called
|
||||||
prior to a command, the command will be cancelled as well. Good
|
prior to a command, the command will be cancelled as well. Good
|
||||||
situations to use the `deny()` function are in events that begins
|
situations to use the `deny()` function are in events that begins
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
"""
|
"""
|
||||||
Scripts for the event system.
|
Scripts for the in-game Python system.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
@ -15,8 +15,8 @@ from evennia.utils.ansi import raw
|
||||||
from evennia.utils.create import create_channel
|
from evennia.utils.create import create_channel
|
||||||
from evennia.utils.dbserialize import dbserialize
|
from evennia.utils.dbserialize import dbserialize
|
||||||
from evennia.utils.utils import all_from_module, delay, pypath_to_realpath
|
from evennia.utils.utils import all_from_module, delay, pypath_to_realpath
|
||||||
from evennia.contrib.events.callbackhandler import CallbackHandler
|
from evennia.contrib.ingame_python.callbackhandler import CallbackHandler
|
||||||
from evennia.contrib.events.utils import get_next_wait, EVENTS, InterruptEvent
|
from evennia.contrib.ingame_python.utils import get_next_wait, EVENTS, InterruptEvent
|
||||||
|
|
||||||
# Constants
|
# Constants
|
||||||
RE_LINE_ERROR = re.compile(r'^ File "\<string\>", line (\d+)')
|
RE_LINE_ERROR = re.compile(r'^ File "\<string\>", line (\d+)')
|
||||||
|
|
@ -29,7 +29,7 @@ class EventHandler(DefaultScript):
|
||||||
This script shouldn't be created more than once. It contains
|
This script shouldn't be created more than once. It contains
|
||||||
event (in a non-persistent attribute) and callbacks (in a
|
event (in a non-persistent attribute) and callbacks (in a
|
||||||
persistent attribute). The script method would help adding,
|
persistent attribute). The script method would help adding,
|
||||||
editing and deleting these events.
|
editing and deleting these events and callbacks.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
@ -68,7 +68,7 @@ class EventHandler(DefaultScript):
|
||||||
# Generate locals
|
# Generate locals
|
||||||
self.ndb.current_locals = {}
|
self.ndb.current_locals = {}
|
||||||
self.ndb.fresh_locals = {}
|
self.ndb.fresh_locals = {}
|
||||||
addresses = ["evennia.contrib.events.eventfuncs"]
|
addresses = ["evennia.contrib.ingame_python.eventfuncs"]
|
||||||
addresses.extend(getattr(settings, "EVENTFUNCS_LOCATIONS", ["world.eventfuncs"]))
|
addresses.extend(getattr(settings, "EVENTFUNCS_LOCATIONS", ["world.eventfuncs"]))
|
||||||
for address in addresses:
|
for address in addresses:
|
||||||
if pypath_to_realpath(address):
|
if pypath_to_realpath(address):
|
||||||
|
|
@ -85,7 +85,7 @@ class EventHandler(DefaultScript):
|
||||||
delay(seconds, complete_task, task_id)
|
delay(seconds, complete_task, task_id)
|
||||||
|
|
||||||
# Place the script in the CallbackHandler
|
# Place the script in the CallbackHandler
|
||||||
from evennia.contrib.events import typeclasses
|
from evennia.contrib.ingame_python import typeclasses
|
||||||
CallbackHandler.script = self
|
CallbackHandler.script = self
|
||||||
DefaultObject.callbacks = typeclasses.EventObject.callbacks
|
DefaultObject.callbacks = typeclasses.EventObject.callbacks
|
||||||
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
"""
|
"""
|
||||||
Module containing the test cases for the event system.
|
Module containing the test cases for the in-game Python system.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from mock import Mock
|
from mock import Mock
|
||||||
|
|
@ -12,8 +12,8 @@ from evennia.objects.objects import ExitCommand
|
||||||
from evennia.utils import ansi, utils
|
from evennia.utils import ansi, utils
|
||||||
from evennia.utils.create import create_object, create_script
|
from evennia.utils.create import create_object, create_script
|
||||||
from evennia.utils.test_resources import EvenniaTest
|
from evennia.utils.test_resources import EvenniaTest
|
||||||
from evennia.contrib.events.commands import CmdCallback
|
from evennia.contrib.ingame_python.commands import CmdCallback
|
||||||
from evennia.contrib.events.callbackhandler import CallbackHandler
|
from evennia.contrib.ingame_python.callbackhandler import CallbackHandler
|
||||||
|
|
||||||
# Force settings
|
# Force settings
|
||||||
settings.EVENTS_CALENDAR = "standard"
|
settings.EVENTS_CALENDAR = "standard"
|
||||||
|
|
@ -31,18 +31,18 @@ class TestEventHandler(EvenniaTest):
|
||||||
"""Create the event handler."""
|
"""Create the event handler."""
|
||||||
super(TestEventHandler, self).setUp()
|
super(TestEventHandler, self).setUp()
|
||||||
self.handler = create_script(
|
self.handler = create_script(
|
||||||
"evennia.contrib.events.scripts.EventHandler")
|
"evennia.contrib.ingame_python.scripts.EventHandler")
|
||||||
|
|
||||||
# Copy old events if necessary
|
# Copy old events if necessary
|
||||||
if OLD_EVENTS:
|
if OLD_EVENTS:
|
||||||
self.handler.ndb.events = dict(OLD_EVENTS)
|
self.handler.ndb.events = dict(OLD_EVENTS)
|
||||||
|
|
||||||
# Alter typeclasses
|
# Alter typeclasses
|
||||||
self.char1.swap_typeclass("evennia.contrib.events.typeclasses.EventCharacter")
|
self.char1.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventCharacter")
|
||||||
self.char2.swap_typeclass("evennia.contrib.events.typeclasses.EventCharacter")
|
self.char2.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventCharacter")
|
||||||
self.room1.swap_typeclass("evennia.contrib.events.typeclasses.EventRoom")
|
self.room1.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventRoom")
|
||||||
self.room2.swap_typeclass("evennia.contrib.events.typeclasses.EventRoom")
|
self.room2.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventRoom")
|
||||||
self.exit.swap_typeclass("evennia.contrib.events.typeclasses.EventExit")
|
self.exit.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventExit")
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
"""Stop the event handler."""
|
"""Stop the event handler."""
|
||||||
|
|
@ -249,18 +249,18 @@ class TestCmdCallback(CommandTest):
|
||||||
"""Create the callback handler."""
|
"""Create the callback handler."""
|
||||||
super(TestCmdCallback, self).setUp()
|
super(TestCmdCallback, self).setUp()
|
||||||
self.handler = create_script(
|
self.handler = create_script(
|
||||||
"evennia.contrib.events.scripts.EventHandler")
|
"evennia.contrib.ingame_python.scripts.EventHandler")
|
||||||
|
|
||||||
# Copy old events if necessary
|
# Copy old events if necessary
|
||||||
if OLD_EVENTS:
|
if OLD_EVENTS:
|
||||||
self.handler.ndb.events = dict(OLD_EVENTS)
|
self.handler.ndb.events = dict(OLD_EVENTS)
|
||||||
|
|
||||||
# Alter typeclasses
|
# Alter typeclasses
|
||||||
self.char1.swap_typeclass("evennia.contrib.events.typeclasses.EventCharacter")
|
self.char1.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventCharacter")
|
||||||
self.char2.swap_typeclass("evennia.contrib.events.typeclasses.EventCharacter")
|
self.char2.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventCharacter")
|
||||||
self.room1.swap_typeclass("evennia.contrib.events.typeclasses.EventRoom")
|
self.room1.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventRoom")
|
||||||
self.room2.swap_typeclass("evennia.contrib.events.typeclasses.EventRoom")
|
self.room2.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventRoom")
|
||||||
self.exit.swap_typeclass("evennia.contrib.events.typeclasses.EventExit")
|
self.exit.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventExit")
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
"""Stop the callback handler."""
|
"""Stop the callback handler."""
|
||||||
|
|
@ -268,7 +268,7 @@ class TestCmdCallback(CommandTest):
|
||||||
OLD_EVENTS.update(self.handler.ndb.events)
|
OLD_EVENTS.update(self.handler.ndb.events)
|
||||||
self.handler.stop()
|
self.handler.stop()
|
||||||
for script in ScriptDB.objects.filter(
|
for script in ScriptDB.objects.filter(
|
||||||
db_typeclass_path="evennia.contrib.events.scripts.TimeEventScript"):
|
db_typeclass_path="evennia.contrib.ingame_python.scripts.TimeEventScript"):
|
||||||
script.stop()
|
script.stop()
|
||||||
|
|
||||||
CallbackHandler.script = None
|
CallbackHandler.script = None
|
||||||
|
|
@ -414,18 +414,18 @@ class TestDefaultCallbacks(CommandTest):
|
||||||
"""Create the callback handler."""
|
"""Create the callback handler."""
|
||||||
super(TestDefaultCallbacks, self).setUp()
|
super(TestDefaultCallbacks, self).setUp()
|
||||||
self.handler = create_script(
|
self.handler = create_script(
|
||||||
"evennia.contrib.events.scripts.EventHandler")
|
"evennia.contrib.ingame_python.scripts.EventHandler")
|
||||||
|
|
||||||
# Copy old events if necessary
|
# Copy old events if necessary
|
||||||
if OLD_EVENTS:
|
if OLD_EVENTS:
|
||||||
self.handler.ndb.events = dict(OLD_EVENTS)
|
self.handler.ndb.events = dict(OLD_EVENTS)
|
||||||
|
|
||||||
# Alter typeclasses
|
# Alter typeclasses
|
||||||
self.char1.swap_typeclass("evennia.contrib.events.typeclasses.EventCharacter")
|
self.char1.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventCharacter")
|
||||||
self.char2.swap_typeclass("evennia.contrib.events.typeclasses.EventCharacter")
|
self.char2.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventCharacter")
|
||||||
self.room1.swap_typeclass("evennia.contrib.events.typeclasses.EventRoom")
|
self.room1.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventRoom")
|
||||||
self.room2.swap_typeclass("evennia.contrib.events.typeclasses.EventRoom")
|
self.room2.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventRoom")
|
||||||
self.exit.swap_typeclass("evennia.contrib.events.typeclasses.EventExit")
|
self.exit.swap_typeclass("evennia.contrib.ingame_python.typeclasses.EventExit")
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
"""Stop the callback handler."""
|
"""Stop the callback handler."""
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
"""
|
"""
|
||||||
Typeclasses for the event system.
|
Typeclasses for the in-game Python system.
|
||||||
|
|
||||||
To use thm, one should inherit from these classes (EventObject,
|
To use thm, one should inherit from these classes (EventObject,
|
||||||
EventRoom, EventCharacter and EventExit).
|
EventRoom, EventCharacter and EventExit).
|
||||||
|
|
@ -9,8 +9,8 @@ EventRoom, EventCharacter and EventExit).
|
||||||
from evennia import DefaultCharacter, DefaultExit, DefaultObject, DefaultRoom
|
from evennia import DefaultCharacter, DefaultExit, DefaultObject, DefaultRoom
|
||||||
from evennia import ScriptDB
|
from evennia import ScriptDB
|
||||||
from evennia.utils.utils import delay, inherits_from, lazy_property
|
from evennia.utils.utils import delay, inherits_from, lazy_property
|
||||||
from evennia.contrib.events.callbackhandler import CallbackHandler
|
from evennia.contrib.ingame_python.callbackhandler import CallbackHandler
|
||||||
from evennia.contrib.events.utils import register_events, time_event, phrase_event
|
from evennia.contrib.ingame_python.utils import register_events, time_event, phrase_event
|
||||||
|
|
||||||
# Character help
|
# Character help
|
||||||
CHARACTER_CAN_DELETE = """
|
CHARACTER_CAN_DELETE = """
|
||||||
|
|
@ -121,7 +121,7 @@ parameters that should be present, as separate words, in the
|
||||||
spoken phrase. For instance, you can set an event tthat would
|
spoken phrase. For instance, you can set an event tthat would
|
||||||
fire if the phrase spoken by the character contains "menu" or
|
fire if the phrase spoken by the character contains "menu" or
|
||||||
"dinner" or "lunch":
|
"dinner" or "lunch":
|
||||||
@event/add ... = say menu, dinner, lunch
|
@call/add ... = say menu, dinner, lunch
|
||||||
Then if one of the words is present in what the character says,
|
Then if one of the words is present in what the character says,
|
||||||
this event will fire.
|
this event will fire.
|
||||||
|
|
||||||
|
|
@ -135,12 +135,12 @@ CHARACTER_TIME = """
|
||||||
A repeated event to be called regularly.
|
A repeated event to be called regularly.
|
||||||
This event is scheduled to repeat at different times, specified
|
This event is scheduled to repeat at different times, specified
|
||||||
as parameters. You can set it to run every day at 8:00 AM (game
|
as parameters. You can set it to run every day at 8:00 AM (game
|
||||||
time). You have to specify the time as an argument to @event/add, like:
|
time). You have to specify the time as an argument to @call/add, like:
|
||||||
@event/add here = time 8:00
|
@call/add here = time 8:00
|
||||||
The parameter (8:00 here) must be a suite of digits separated by
|
The parameter (8:00 here) must be a suite of digits separated by
|
||||||
spaces, colons or dashes. Keep it as close from a recognizable
|
spaces, colons or dashes. Keep it as close from a recognizable
|
||||||
date format, like this:
|
date format, like this:
|
||||||
@event/add here = time 06-15 12:20
|
@call/add here = time 06-15 12:20
|
||||||
This event will fire every year on June the 15th at 12 PM (still
|
This event will fire every year on June the 15th at 12 PM (still
|
||||||
game time). Units have to be specified depending on your set calendar
|
game time). Units have to be specified depending on your set calendar
|
||||||
(ask a developer for more details).
|
(ask a developer for more details).
|
||||||
|
|
@ -461,12 +461,12 @@ EXIT_TIME = """
|
||||||
A repeated event to be called regularly.
|
A repeated event to be called regularly.
|
||||||
This event is scheduled to repeat at different times, specified
|
This event is scheduled to repeat at different times, specified
|
||||||
as parameters. You can set it to run every day at 8:00 AM (game
|
as parameters. You can set it to run every day at 8:00 AM (game
|
||||||
time). You have to specify the time as an argument to @event/add, like:
|
time). You have to specify the time as an argument to @call/add, like:
|
||||||
@event/add north = time 8:00
|
@call/add north = time 8:00
|
||||||
The parameter (8:00 here) must be a suite of digits separated by
|
The parameter (8:00 here) must be a suite of digits separated by
|
||||||
spaces, colons or dashes. Keep it as close from a recognizable
|
spaces, colons or dashes. Keep it as close from a recognizable
|
||||||
date format, like this:
|
date format, like this:
|
||||||
@event/add south = time 06-15 12:20
|
@call/add south = time 06-15 12:20
|
||||||
This event will fire every year on June the 15th at 12 PM (still
|
This event will fire every year on June the 15th at 12 PM (still
|
||||||
game time). Units have to be specified depending on your set calendar
|
game time). Units have to be specified depending on your set calendar
|
||||||
(ask a developer for more details).
|
(ask a developer for more details).
|
||||||
|
|
@ -559,12 +559,12 @@ OBJECT_TIME = """
|
||||||
A repeated event to be called regularly.
|
A repeated event to be called regularly.
|
||||||
This event is scheduled to repeat at different times, specified
|
This event is scheduled to repeat at different times, specified
|
||||||
as parameters. You can set it to run every day at 8:00 AM (game
|
as parameters. You can set it to run every day at 8:00 AM (game
|
||||||
time). You have to specify the time as an argument to @event/add, like:
|
time). You have to specify the time as an argument to @call/add, like:
|
||||||
@event/add here = time 8:00
|
@call/add here = time 8:00
|
||||||
The parameter (8:00 here) must be a suite of digits separated by
|
The parameter (8:00 here) must be a suite of digits separated by
|
||||||
spaces, colons or dashes. Keep it as close from a recognizable
|
spaces, colons or dashes. Keep it as close from a recognizable
|
||||||
date format, like this:
|
date format, like this:
|
||||||
@event/add here = time 06-15 12:20
|
@call/add here = time 06-15 12:20
|
||||||
This event will fire every year on June the 15th at 12 PM (still
|
This event will fire every year on June the 15th at 12 PM (still
|
||||||
game time). Units have to be specified depending on your set calendar
|
game time). Units have to be specified depending on your set calendar
|
||||||
(ask a developer for more details).
|
(ask a developer for more details).
|
||||||
|
|
@ -702,7 +702,7 @@ specify a list of keywords as parameters that should be present,
|
||||||
as separate words, in the spoken phrase. For instance, you can
|
as separate words, in the spoken phrase. For instance, you can
|
||||||
set an event tthat would fire if the phrase spoken by the character
|
set an event tthat would fire if the phrase spoken by the character
|
||||||
contains "menu" or "dinner" or "lunch":
|
contains "menu" or "dinner" or "lunch":
|
||||||
@event/add ... = say menu, dinner, lunch
|
@call/add ... = say menu, dinner, lunch
|
||||||
Then if one of the words is present in what the character says,
|
Then if one of the words is present in what the character says,
|
||||||
this event will fire.
|
this event will fire.
|
||||||
|
|
||||||
|
|
@ -716,12 +716,12 @@ ROOM_TIME = """
|
||||||
A repeated event to be called regularly.
|
A repeated event to be called regularly.
|
||||||
This event is scheduled to repeat at different times, specified
|
This event is scheduled to repeat at different times, specified
|
||||||
as parameters. You can set it to run every day at 8:00 AM (game
|
as parameters. You can set it to run every day at 8:00 AM (game
|
||||||
time). You have to specify the time as an argument to @event/add, like:
|
time). You have to specify the time as an argument to @call/add, like:
|
||||||
@event/add here = time 8:00
|
@call/add here = time 8:00
|
||||||
The parameter (8:00 here) must be a suite of digits separated by
|
The parameter (8:00 here) must be a suite of digits separated by
|
||||||
spaces, colons or dashes. Keep it as close from a recognizable
|
spaces, colons or dashes. Keep it as close from a recognizable
|
||||||
date format, like this:
|
date format, like this:
|
||||||
@event/add here = time 06-15 12:20
|
@call/add here = time 06-15 12:20
|
||||||
This event will fire every year on June the 15th at 12 PM (still
|
This event will fire every year on June the 15th at 12 PM (still
|
||||||
game time). Units have to be specified depending on your set calendar
|
game time). Units have to be specified depending on your set calendar
|
||||||
(ask a developer for more details).
|
(ask a developer for more details).
|
||||||
|
|
@ -166,7 +166,7 @@ def time_event(obj, event_name, number, parameters):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
seconds, usual, key = get_next_wait(parameters)
|
seconds, usual, key = get_next_wait(parameters)
|
||||||
script = create_script("evennia.contrib.events.scripts.TimeEventScript", interval=seconds, obj=obj)
|
script = create_script("evennia.contrib.ingame_python.scripts.TimeEventScript", interval=seconds, obj=obj)
|
||||||
script.key = key
|
script.key = key
|
||||||
script.desc = "event on {}".format(key)
|
script.desc = "event on {}".format(key)
|
||||||
script.db.time_format = parameters
|
script.db.time_format = parameters
|
||||||
Loading…
Add table
Add a link
Reference in a new issue