Get strict skills working. Todo: add engine setting
This commit is contained in:
@@ -17,7 +17,7 @@
|
|||||||
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# ===============================================================================
|
# ===============================================================================
|
||||||
|
|
||||||
from sqlalchemy.orm import join, exc
|
from sqlalchemy.orm import join, exc, aliased
|
||||||
from sqlalchemy.sql import and_, or_, select
|
from sqlalchemy.sql import and_, or_, select
|
||||||
|
|
||||||
import eos.config
|
import eos.config
|
||||||
@@ -315,3 +315,24 @@ def directAttributeRequest(itemIDs, attrIDs):
|
|||||||
|
|
||||||
result = gamedata_session.execute(q).fetchall()
|
result = gamedata_session.execute(q).fetchall()
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
def getRequiredFor(itemID, attrMapping):
|
||||||
|
Attribute1 = aliased(Attribute)
|
||||||
|
Attribute2 = aliased(Attribute)
|
||||||
|
|
||||||
|
skillToLevelClauses = []
|
||||||
|
|
||||||
|
for attrSkill, attrLevel in attrMapping.iteritems():
|
||||||
|
skillToLevelClauses.append(and_(Attribute1.attributeID == attrSkill, Attribute2.attributeID == attrLevel))
|
||||||
|
|
||||||
|
queryOr = or_(*skillToLevelClauses)
|
||||||
|
|
||||||
|
q = select((Attribute2.typeID, Attribute2.value),
|
||||||
|
and_(Attribute1.value == itemID, queryOr),
|
||||||
|
from_obj=[
|
||||||
|
join(Attribute1, Attribute2, Attribute1.typeID == Attribute2.typeID)
|
||||||
|
])
|
||||||
|
|
||||||
|
result = gamedata_session.execute(q).fetchall()
|
||||||
|
|
||||||
|
return result
|
||||||
|
|||||||
@@ -250,6 +250,7 @@ class Item(EqBase):
|
|||||||
def init(self):
|
def init(self):
|
||||||
self.__race = None
|
self.__race = None
|
||||||
self.__requiredSkills = None
|
self.__requiredSkills = None
|
||||||
|
self.__requiredFor = None
|
||||||
self.__moved = False
|
self.__moved = False
|
||||||
self.__offensive = None
|
self.__offensive = None
|
||||||
self.__assistive = None
|
self.__assistive = None
|
||||||
@@ -330,6 +331,24 @@ class Item(EqBase):
|
|||||||
requiredSkills[item] = skillLvl
|
requiredSkills[item] = skillLvl
|
||||||
return self.__requiredSkills
|
return self.__requiredSkills
|
||||||
|
|
||||||
|
@property
|
||||||
|
def requiredFor(self):
|
||||||
|
if self.__requiredFor is None:
|
||||||
|
self.__requiredFor = dict()
|
||||||
|
|
||||||
|
# Map containing attribute IDs we may need for required skills
|
||||||
|
srqIDMap = {182: 277, 183: 278, 184: 279, 1285: 1286, 1289: 1287, 1290: 1288}
|
||||||
|
|
||||||
|
# Get relevant attribute values from db (required skill IDs and levels) for our item
|
||||||
|
q = eos.db.getRequiredFor(self.ID, srqIDMap)
|
||||||
|
|
||||||
|
for itemID, lvl in q:
|
||||||
|
# Fetch item from database and fill map
|
||||||
|
item = eos.db.getItem(itemID)
|
||||||
|
self.__requiredFor[item] = lvl
|
||||||
|
|
||||||
|
return self.__requiredFor
|
||||||
|
|
||||||
factionMap = {
|
factionMap = {
|
||||||
500001: "caldari",
|
500001: "caldari",
|
||||||
500002: "minmatar",
|
500002: "minmatar",
|
||||||
@@ -442,7 +461,6 @@ class Item(EqBase):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def price(self):
|
def price(self):
|
||||||
|
|
||||||
# todo: use `from sqlalchemy import inspect` instead (need to verify it works in old and new OS X builds)
|
# todo: use `from sqlalchemy import inspect` instead (need to verify it works in old and new OS X builds)
|
||||||
if self.__price is not None and getattr(self.__price, '_sa_instance_state', None):
|
if self.__price is not None and getattr(self.__price, '_sa_instance_state', None):
|
||||||
pyfalog.debug("Price data for {} was deleted, resetting object".format(self.ID))
|
pyfalog.debug("Price data for {} was deleted, resetting object".format(self.ID))
|
||||||
|
|||||||
@@ -324,8 +324,8 @@ class Skill(HandledItem):
|
|||||||
|
|
||||||
return self.activeLevel or 0
|
return self.activeLevel or 0
|
||||||
|
|
||||||
@level.setter
|
def setLevel(self, level, persist=False):
|
||||||
def level(self, level):
|
|
||||||
if (level < 0 or level > 5) and level is not None:
|
if (level < 0 or level > 5) and level is not None:
|
||||||
raise ValueError(str(level) + " is not a valid value for level")
|
raise ValueError(str(level) + " is not a valid value for level")
|
||||||
|
|
||||||
@@ -333,10 +333,21 @@ class Skill(HandledItem):
|
|||||||
raise ReadOnlyException()
|
raise ReadOnlyException()
|
||||||
|
|
||||||
self.activeLevel = level
|
self.activeLevel = level
|
||||||
self.character.dirtySkills.add(self)
|
|
||||||
|
|
||||||
if self.activeLevel == self.__level and self in self.character.dirtySkills:
|
for item, rlevel in self.item.requiredFor.iteritems():
|
||||||
self.character.dirtySkills.remove(self)
|
if item.group.category.ID == 16: # Skill category
|
||||||
|
if level < rlevel:
|
||||||
|
skill = self.character.getSkill(item.ID)
|
||||||
|
#print "Removing skill: {}, Dependant level: {}, Required level: {}".format(skill, level, rlevel)
|
||||||
|
skill.setLevel(None, persist)
|
||||||
|
|
||||||
|
if persist:
|
||||||
|
self.saveLevel()
|
||||||
|
else:
|
||||||
|
self.character.dirtySkills.add(self)
|
||||||
|
|
||||||
|
if self.activeLevel == self.__level and self in self.character.dirtySkills:
|
||||||
|
self.character.dirtySkills.remove(self)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def item(self):
|
def item(self):
|
||||||
|
|||||||
@@ -371,12 +371,9 @@ class Character(object):
|
|||||||
char = eos.db.getCharacter(charID)
|
char = eos.db.getCharacter(charID)
|
||||||
skill = char.getSkill(skillID)
|
skill = char.getSkill(skillID)
|
||||||
if isinstance(level, basestring) or level > 5 or level < 0:
|
if isinstance(level, basestring) or level > 5 or level < 0:
|
||||||
skill.level = None
|
skill.setLevel(None, persist)
|
||||||
else:
|
else:
|
||||||
skill.level = level
|
skill.setLevel(level, persist)
|
||||||
|
|
||||||
if persist:
|
|
||||||
skill.saveLevel()
|
|
||||||
|
|
||||||
eos.db.commit()
|
eos.db.commit()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user