Merge branch 'feature/strictSkills' into dev
Conflicts: service/character.py Implements strict skill requirement handling
This commit is contained in:
@@ -23,7 +23,8 @@ else:
|
||||
pyfalog.debug("Saveddata connection string: {0}", saveddata_connectionstring)
|
||||
|
||||
settings = {
|
||||
"useStaticAdaptiveArmorHardener": False
|
||||
"useStaticAdaptiveArmorHardener": False,
|
||||
"strictSkillLevels": True,
|
||||
}
|
||||
|
||||
# Autodetect path, only change if the autodetection bugs out.
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
# 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
|
||||
|
||||
import eos.config
|
||||
@@ -315,3 +315,24 @@ def directAttributeRequest(itemIDs, attrIDs):
|
||||
|
||||
result = gamedata_session.execute(q).fetchall()
|
||||
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
|
||||
|
||||
@@ -238,6 +238,7 @@ class Item(EqBase):
|
||||
def init(self):
|
||||
self.__race = None
|
||||
self.__requiredSkills = None
|
||||
self.__requiredFor = None
|
||||
self.__moved = False
|
||||
self.__offensive = None
|
||||
self.__assistive = None
|
||||
@@ -290,6 +291,8 @@ class Item(EqBase):
|
||||
eos.db.saveddata_session.delete(override)
|
||||
eos.db.commit()
|
||||
|
||||
srqIDMap = {182: 277, 183: 278, 184: 279, 1285: 1286, 1289: 1287, 1290: 1288}
|
||||
|
||||
@property
|
||||
def requiredSkills(self):
|
||||
if self.__requiredSkills is None:
|
||||
@@ -297,8 +300,7 @@ class Item(EqBase):
|
||||
self.__requiredSkills = requiredSkills
|
||||
# Map containing attribute IDs we may need for required skills
|
||||
# { requiredSkillX : requiredSkillXLevel }
|
||||
srqIDMap = {182: 277, 183: 278, 184: 279, 1285: 1286, 1289: 1287, 1290: 1288}
|
||||
combinedAttrIDs = set(srqIDMap.iterkeys()).union(set(srqIDMap.itervalues()))
|
||||
combinedAttrIDs = set(self.srqIDMap.iterkeys()).union(set(self.srqIDMap.itervalues()))
|
||||
# Map containing result of the request
|
||||
# { attributeID : attributeValue }
|
||||
skillAttrs = {}
|
||||
@@ -308,7 +310,7 @@ class Item(EqBase):
|
||||
attrVal = attrInfo[2]
|
||||
skillAttrs[attrID] = attrVal
|
||||
# Go through all attributeID pairs
|
||||
for srqIDAtrr, srqLvlAttr in srqIDMap.iteritems():
|
||||
for srqIDAtrr, srqLvlAttr in self.srqIDMap.iteritems():
|
||||
# Check if we have both in returned result
|
||||
if srqIDAtrr in skillAttrs and srqLvlAttr in skillAttrs:
|
||||
skillID = int(skillAttrs[srqIDAtrr])
|
||||
@@ -318,6 +320,23 @@ class Item(EqBase):
|
||||
requiredSkills[item] = skillLvl
|
||||
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
|
||||
|
||||
# Get relevant attribute values from db (required skill IDs and levels) for our item
|
||||
q = eos.db.getRequiredFor(self.ID, self.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 = {
|
||||
500001: "caldari",
|
||||
500002: "minmatar",
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
||||
# ===============================================================================
|
||||
|
||||
import time
|
||||
|
||||
from logbook import Logger
|
||||
from itertools import chain
|
||||
@@ -25,6 +26,7 @@ from sqlalchemy.orm import validates, reconstructor
|
||||
|
||||
import eos
|
||||
import eos.db
|
||||
import eos.config
|
||||
from eos.effectHandlerHelpers import HandledItem, HandledImplantBoosterList
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
@@ -324,8 +326,8 @@ class Skill(HandledItem):
|
||||
|
||||
return self.activeLevel or 0
|
||||
|
||||
@level.setter
|
||||
def level(self, level):
|
||||
def setLevel(self, level, persist=False):
|
||||
|
||||
if (level < 0 or level > 5) and level is not None:
|
||||
raise ValueError(str(level) + " is not a valid value for level")
|
||||
|
||||
@@ -333,10 +335,24 @@ class Skill(HandledItem):
|
||||
raise ReadOnlyException()
|
||||
|
||||
self.activeLevel = level
|
||||
self.character.dirtySkills.add(self)
|
||||
|
||||
if self.activeLevel == self.__level and self in self.character.dirtySkills:
|
||||
self.character.dirtySkills.remove(self)
|
||||
if eos.config.settings['strictSkillLevels']:
|
||||
start = time.time()
|
||||
for item, rlevel in self.item.requiredFor.iteritems():
|
||||
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)
|
||||
pyfalog.debug("Strict Skill levels enabled, time to process {}: {}".format(self.item.ID, time.time() - start))
|
||||
|
||||
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
|
||||
def item(self):
|
||||
|
||||
Reference in New Issue
Block a user