Fixed bug that had recycled objects not properly forget flags set on them before they were destroyed.

/Griatch
This commit is contained in:
Griatch 2009-09-27 16:36:03 +00:00
parent 0e46a61c85
commit 45ba9ea73c
2 changed files with 37 additions and 28 deletions

View file

@ -384,16 +384,17 @@ class ObjectManager(models.Manager):
#get_nextfree_dbnum() returns either an integer or an old object to recycle.
next_dbref = self.get_nextfree_dbnum()
if type(next_dbref) == type(int()):
if type(next_dbref) == type(int()):
#create new object with a fresh dbref
Object = ContentType.objects.get(app_label="objects",
model="object").model_class()
new_object = Object()
new_object.id = next_dbref
else:
#recycle an old object instead
#recycle an old object's id instead
new_object = next_dbref
new_object.purge_object()
new_object.type = otype
new_object.set_name(name)

View file

@ -113,14 +113,11 @@ class Object(models.Model):
script_parent = models.CharField(max_length=255, blank=True, null=True)
home = models.ForeignKey('self', related_name="obj_home", blank=True, null=True)
type = models.SmallIntegerField(choices=defines_global.OBJECT_TYPES)
# TODO: Move description to an attribute.
#description = models.TextField(blank=True, null=True)
location = models.ForeignKey('self', related_name="obj_location", blank=True, null=True)
flags = models.TextField(blank=True, null=True)
nosave_flags = models.TextField(blank=True, null=True)
date_created = models.DateField(editable=False, auto_now_add=True)
# 'scriptlink' is a 'get' property for retrieving a reference to the correct
# script object. Defined down by get_scriptlink()
scriptlink_cached = None
@ -426,26 +423,6 @@ class Object(models.Model):
return "%s%s" % (parse_ansi(name_string.split(';')[0],
strip_ansi=no_ansi), dbref_string)
def get_flags(self):
"""
Returns an object's flag list.
"""
all_flags = []
if self.flags is not None:
# Add saved flags to the display list
all_flags = all_flags + self.flags.split()
if self.nosave_flags is not None:
# Add non-saved flags to the display list
all_flags = all_flags + self.nosave_flags.split()
if not all_flags:
# Guard against returning 'None'
return ""
else:
# Format the Python list to a space separated string of flags
return " ".join(all_flags)
def destroy(self):
"""
Destroys an object, sets it to GOING. Can still be recovered
@ -489,8 +466,9 @@ class Object(models.Model):
self.type = defines_global.OTYPE_GARBAGE
self.save()
# Clear all attributes
# Clear all attributes & flags
self.clear_all_attributes()
self.clear_all_flags()
def clear_exits(self):
"""
@ -748,6 +726,31 @@ class Object(models.Model):
def unset_flag(self, flag):
self.set_flag(flag,value=False)
def get_flags(self):
"""
Returns an object's flag list.
"""
all_flags = []
if self.flags is not None:
# Add saved flags to the display list
all_flags = all_flags + self.flags.split()
if self.nosave_flags is not None:
# Add non-saved flags to the display list
all_flags = all_flags + self.nosave_flags.split()
if not all_flags:
# Guard against returning 'None'
return ""
else:
# Format the Python list to a space separated string of flags
return " ".join(all_flags)
def clear_all_flags(self):
"Clears all the flags set on object."
flags = self.get_flags()
for flag in flags.split():
self.unset_flag(flag)
def is_connected_plr(self):
"""
Is this object a connected player?
@ -1022,6 +1025,11 @@ class Object(models.Model):
"Set to no state (return to normal operation)"
self.state = None
def purge_object(self):
"Completely clears all aspects of the object."
self.clear_all_attributes()
self.clear_all_flags()
self.clear_state()
# Deferred imports are poopy. This will require some thought to fix.