mirror of
https://github.com/evennia/evennia.git
synced 2026-03-16 21:06:30 +01:00
We now have a fully functional @set command, complete with flags and attributes.
This commit is contained in:
parent
833d7b3b45
commit
1b03c8cf31
6 changed files with 105 additions and 8 deletions
|
|
@ -13,7 +13,7 @@ class Attribute(models.Model):
|
|||
"""
|
||||
name = models.CharField(maxlength=255)
|
||||
value = models.CharField(maxlength=255)
|
||||
is_hidden = models.BooleanField()
|
||||
is_hidden = models.BooleanField(default=0)
|
||||
object = models.ForeignKey("Object")
|
||||
|
||||
def __str__(self):
|
||||
|
|
@ -97,6 +97,50 @@ class Object(models.Model):
|
|||
"""
|
||||
return ' '.join(self.flags_active)
|
||||
|
||||
def clear_attribute(self, attribute):
|
||||
"""
|
||||
Removes an attribute entirely.
|
||||
|
||||
attribute: (str) The attribute's name.
|
||||
"""
|
||||
if self.has_attribute(attribute):
|
||||
attrib_obj = self.get_attribute_obj(attribute)
|
||||
attrib_obj.delete()
|
||||
del self.attrib_list[attribute]
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def set_attribute(self, attribute, new_value):
|
||||
"""
|
||||
Sets an attribute on an object. Creates the attribute if need
|
||||
be.
|
||||
|
||||
attribute: (str) The attribute's name.
|
||||
new_value: (str) The value to set the attribute to.
|
||||
"""
|
||||
if self.has_attribute(attribute):
|
||||
# Attribute already exists, update it.
|
||||
attrib_obj = self.attrib_list[attribute]
|
||||
attrib_obj.value = new_value
|
||||
attrib_obj.save()
|
||||
else:
|
||||
# Attribute object doesn't exist, create it.
|
||||
new_attrib = Attribute()
|
||||
new_attrib.name = attribute
|
||||
new_attrib.value = new_value
|
||||
new_attrib.object = self
|
||||
new_attrib.save()
|
||||
self.attrib_list[attribute] = new_attrib
|
||||
|
||||
def has_attribute(self, attribute):
|
||||
"""
|
||||
See if we have an attribute set on the object.
|
||||
|
||||
attribute: (str) The attribute's name.
|
||||
"""
|
||||
return self.attrib_list.has_key(attribute)
|
||||
|
||||
def has_flag(self, flag):
|
||||
"""
|
||||
Does our object have a certain flag?
|
||||
|
|
@ -165,11 +209,29 @@ class Object(models.Model):
|
|||
"""
|
||||
return self.location
|
||||
|
||||
def get_attribute(self, attrib):
|
||||
def get_attribute_value(self, attrib):
|
||||
"""
|
||||
Returns the value of an attribute on an object.
|
||||
|
||||
attrib: (str) The attribute's name.
|
||||
"""
|
||||
return self.attrib_list.get(attrib, False)
|
||||
if self.has_attribute(attrib):
|
||||
attrib_value = self.attrib_list[attrib]
|
||||
return attrib_value.value
|
||||
else:
|
||||
return False
|
||||
|
||||
def get_attribute_obj(self, attrib):
|
||||
"""
|
||||
Returns the attribute object matching the specified name.
|
||||
|
||||
attrib: (str) The attribute's name.
|
||||
"""
|
||||
if self.has_attribute(attrib):
|
||||
attrib_obj = self.attrib_list[attrib]
|
||||
return attrib_obj
|
||||
else:
|
||||
return False
|
||||
|
||||
def load_to_location(self):
|
||||
"""
|
||||
|
|
@ -246,6 +308,8 @@ class Object(models.Model):
|
|||
"""
|
||||
Search an object's contents for name and dbref matches. Don't put any
|
||||
logic in here, we'll do that from the end of the command or function.
|
||||
|
||||
oname: (str) The string to filter from.
|
||||
"""
|
||||
return [prospect for prospect in self.contents_list if prospect.name_match(oname)]
|
||||
|
||||
|
|
@ -264,6 +328,8 @@ class Object(models.Model):
|
|||
def get_type(self, return_number=False):
|
||||
"""
|
||||
Returns the numerical or string representation of an object's type.
|
||||
|
||||
return_number: (bool) True returns numeric type, False returns string.
|
||||
"""
|
||||
if return_number:
|
||||
return self.type
|
||||
|
|
@ -273,6 +339,8 @@ class Object(models.Model):
|
|||
def is_type(self, otype):
|
||||
"""
|
||||
See if an object is a certain type.
|
||||
|
||||
otype: (str) A string representation of the object's type (ROOM, THING)
|
||||
"""
|
||||
otype = otype[0]
|
||||
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ def cmd_examine(cdat):
|
|||
session.msg("Zone: %s" % (target_obj.get_zone(),))
|
||||
|
||||
for attribute in target_obj.attrib_list:
|
||||
session.msg("%s%s%s: %s" % (ansi["hilite"], attribute, ansi["normal"], target_obj.get_attribute(attribute)))
|
||||
session.msg("%s%s%s: %s" % (ansi["hilite"], attribute, ansi["normal"], target_obj.get_attribute_value(attribute)))
|
||||
|
||||
con_players = []
|
||||
con_things = []
|
||||
|
|
|
|||
|
|
@ -168,8 +168,23 @@ def cmd_set(cdat):
|
|||
if len(attrib_args) > 1:
|
||||
# We're dealing with an attribute/value pair.
|
||||
attrib_name = attrib_args[0].upper()
|
||||
attrib_value = ' '.join(attrib_args[1:])
|
||||
session.msg("%s - %s set." % (victim.get_name(), attrib_name))
|
||||
splicenum = eq_args[1].find(':') + 1
|
||||
attrib_value = eq_args[1][splicenum:]
|
||||
|
||||
# In global_defines.py, see NOSET_ATTRIBS for protected attribute names.
|
||||
if not functions_db.modifiable_attrib(attrib_name):
|
||||
session.msg("You can't modify that attribute.")
|
||||
return
|
||||
|
||||
if attrib_value:
|
||||
# An attribute value was specified, create or set the attribute.
|
||||
verb = 'set'
|
||||
victim.set_attribute(attrib_name, attrib_value)
|
||||
else:
|
||||
# No value was given, this means we delete the attribute.
|
||||
verb = 'cleared'
|
||||
victim.clear_attribute(attrib_name)
|
||||
session.msg("%s - %s %s." % (victim.get_name(), attrib_name, verb))
|
||||
else:
|
||||
# Flag manipulation form.
|
||||
flag_list = eq_args[1].split()
|
||||
|
|
|
|||
|
|
@ -11,7 +11,16 @@ def modifiable_flag(flagname):
|
|||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def modifiable_attrib(attribname):
|
||||
"""
|
||||
Check to see if a particular attribute is modifiable.
|
||||
"""
|
||||
if attribname not in global_defines.NOSET_ATTRIBS:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def get_nextfree_dbnum():
|
||||
"""
|
||||
Figure out what our next free database reference number is.
|
||||
|
|
|
|||
|
|
@ -11,7 +11,12 @@ OBJECT_TYPES = (
|
|||
# This is a list of flags that the server actually uses. Anything not in this
|
||||
# list is a custom flag.
|
||||
SERVER_FLAGS = ["CONNECTED"]
|
||||
|
||||
# These flags are not saved.
|
||||
NOSAVE_FLAGS = ["CONNECTED"]
|
||||
|
||||
# These flags can't be modified by players.
|
||||
NOSET_FLAGS = ["CONNECTED"]
|
||||
|
||||
# These attribute names can't be modified by players.
|
||||
NOSET_ATTRIBS = ["TEST"]
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ class Server(dispatcher):
|
|||
"""
|
||||
attribute_list = Attribute.objects.all()
|
||||
for attrib in attribute_list:
|
||||
attrib.object.attrib_list[attrib.name] = attrib.value
|
||||
attrib.object.attrib_list[attrib.name] = attrib
|
||||
print ' Attributes Loaded: %d' % (len(attribute_list),)
|
||||
|
||||
def load_cmd_aliases(self):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue