This commit is contained in:
Aaron Kimbre 2022-06-10 12:40:21 -05:00
parent 200370709c
commit 62fb9a3c01
3 changed files with 115 additions and 76 deletions

View File

@ -1,6 +1,7 @@
from app import db from app import db
from sqlalchemy.dialects import sqlite from sqlalchemy.dialects import sqlite
from sqlalchemy_utils import generic_relationship from sqlalchemy_utils import generic_relationship
import enum
class AICombatRoles(db.Model): class AICombatRoles(db.Model):
@ -1410,6 +1411,55 @@ class ComponentsRegistry(db.Model):
component = generic_relationship(component_type, component_id) component = generic_relationship(component_type, component_id)
# From DLU source
class ComponentType(enum.IntEnum):
COMPONENT_TYPE_CONTROLLABLE_PHYSICS = 1 # The ControllablePhysics Component
COMPONENT_TYPE_RENDER = 2 # The Render Component
COMPONENT_TYPE_SIMPLE_PHYSICS = 3 # The SimplePhysics Component
COMPONENT_TYPE_CHARACTER = 4 # The Character Component
COMPONENT_TYPE_SCRIPT = 5 # The Script Component
COMPONENT_TYPE_BOUNCER = 6 # The Bouncer Component
COMPONENT_TYPE_BUFF = 7 # The Buff Component
COMPONENT_TYPE_SKILL = 9 # The Skill Component
COMPONENT_TYPE_ITEM = 11 # The Item Component
COMPONENT_TYPE_VENDOR = 16 # The Vendor Component
COMPONENT_TYPE_INVENTORY = 17 # The Inventory Component
COMPONENT_TYPE_SHOOTING_GALLERY = 19 # The Shooting Gallery Component
COMPONENT_TYPE_RIGID_BODY_PHANTOM_PHYSICS = 20 # The RigidBodyPhantomPhysics Component
COMPONENT_TYPE_COLLECTIBLE = 23 # The Collectible Component
COMPONENT_TYPE_MOVING_PLATFORM = 25 # The MovingPlatform Component
COMPONENT_TYPE_PET = 26 # The Pet Component
COMPONENT_TYPE_VEHICLE_PHYSICS = 30 # The VehiclePhysics Component
COMPONENT_TYPE_MOVEMENT_AI = 31 # The MovementAI Component
COMPONENT_TYPE_PROPERTY = 36 # The Property Component
COMPONENT_TYPE_SCRIPTED_ACTIVITY = 39 # The ScriptedActivity Component
COMPONENT_TYPE_PHANTOM_PHYSICS = 40 # The PhantomPhysics Component
COMPONENT_TYPE_PROPERTY_ENTRANCE = 43 # The PhantomPhysics Component
COMPONENT_TYPE_PROPERTY_MANAGEMENT = 45 # The PropertyManagement Component
COMPONENT_TYPE_REBUILD = 48 # The Rebuild Component
COMPONENT_TYPE_SWITCH = 49 # The Switch Component
COMPONENT_TYPE_ZONE_CONTROL = 50 # The ZoneControl Component
COMPONENT_TYPE_PACKAGE = 53 # The Package Component
COMPONENT_TYPE_PLAYER_FLAG = 58 # The PlayerFlag Component
COMPONENT_TYPE_BASE_COMBAT_AI = 60 # The BaseCombatAI Component
COMPONENT_TYPE_MODULE_ASSEMBLY = 61 # The ModuleAssembly Component
COMPONENT_TYPE_PROPERTY_VENDOR = 65 # The PropertyVendor Component
COMPONENT_TYPE_ROCKET_LAUNCH = 67 # The RocketLaunch Component
COMPONENT_TYPE_RACING_CONTROL = 71 # The RacingControl Component
COMPONENT_TYPE_MISSION_OFFER = 73 # The MissionOffer Component
COMPONENT_TYPE_EXHIBIT = 75 # The Exhibit Component
COMPONENT_TYPE_RACING_STATS = 74 # The Exhibit Component
COMPONENT_TYPE_SOUND_TRIGGER = 77 # The Sound Trigger Component
COMPONENT_TYPE_PROXIMITY_MONITOR = 78 # The Proximity Monitor Component
COMPONENT_TYPE_MISSION = 84 # The Mission Component
COMPONENT_TYPE_ROCKET_LAUNCH_LUP = 97 # The LUP Launchpad Componen
COMPONENT_TYPE_RAIL_ACTIVATOR = 104
COMPONENT_TYPE_POSSESSOR = 107 # The Component 107
COMPONENT_TYPE_POSSESSABLE = 108 # The Component 108
COMPONENT_TYPE_BUILD_BORDER = 114 # The Build Border Component
COMPONENT_TYPE_DESTROYABLE = 1000 # The Destroyable Component
class ControlSchemes(db.Model): class ControlSchemes(db.Model):
__tablename__ = 'ControlSchemes' __tablename__ = 'ControlSchemes'
__bind_key__ = 'cdclient' __bind_key__ = 'cdclient'

View File

@ -12,7 +12,13 @@ from app.models import CharacterInfo
from app.cdclient import ( from app.cdclient import (
Objects, Objects,
Icons, Icons,
ItemSets ItemSets,
ComponentsRegistry,
ComponentType,
RenderComponent,
ItemComponent,
ObjectSkills,
SkillBehavior
) )
import glob import glob
import os import os
@ -21,7 +27,6 @@ from wand.exceptions import BlobError as BE
import pathlib import pathlib
import json import json
import sqlite3
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
from sqlalchemy import or_ from sqlalchemy import or_
@ -71,32 +76,24 @@ def get_dds(filename):
@luclient_blueprint.route('/get_icon_lot/<id>') @luclient_blueprint.route('/get_icon_lot/<id>')
@login_required @login_required
def get_icon_lot(id): def get_icon_lot(id):
icon_path = RenderComponent.query.filter(
RenderComponent.id == ComponentsRegistry.query.filter(
ComponentsRegistry.component_type == ComponentType.COMPONENT_TYPE_RENDER
).filter(ComponentsRegistry.id == id).first().component_id
).first().icon_asset
render_component_id = query_cdclient( if icon_path:
'select component_id from ComponentsRegistry where component_type = 2 and id = ?', icon_path = icon_path.replace("..\\", "").replace("\\", "/")
[id],
one=True
)[0]
# find the asset from rendercomponent given the component id
filename = query_cdclient(
'select icon_asset from RenderComponent where id = ?',
[render_component_id],
one=True
)[0]
if filename:
filename = filename.replace("..\\", "").replace("\\", "/")
else: else:
return redirect(url_for('luclient.unknown')) return redirect(url_for('luclient.unknown'))
cache = f'app/cache/{filename.split(".")[0]}.png' cache = f'app/cache/{icon_path.split(".")[0]}.png'
if not os.path.exists(cache): if not os.path.exists(cache):
root = 'app/luclient/res/' root = 'app/luclient/res/'
try: try:
pathlib.Path(os.path.dirname(cache)).resolve().mkdir(parents=True, exist_ok=True) pathlib.Path(os.path.dirname(cache)).resolve().mkdir(parents=True, exist_ok=True)
with image.Image(filename=f'{root}{filename}'.lower()) as img: with image.Image(filename=f'{root}{icon_path}'.lower()) as img:
img.compression = "no" img.compression = "no"
img.save(filename=cache) img.save(filename=cache)
except BE: except BE:
@ -278,21 +275,11 @@ def register_luclient_jinja_helpers(app):
def get_lot_rarity(lot_id): def get_lot_rarity(lot_id):
if not lot_id: if not lot_id:
return "Missing" return "Missing"
render_component_id = query_cdclient( rarity = ItemComponent.query.filter(
'select component_id from ComponentsRegistry where component_type = 11 and id = ?', ItemComponent.id == ComponentsRegistry.query.filter(
[lot_id], ComponentsRegistry.component_type == ComponentType.COMPONENT_TYPE_ITEM
one=True ).filter(ComponentsRegistry.id == id).first().component_id
) ).first().rarity
if render_component_id:
render_component_id = render_component_id[0]
rarity = query_cdclient(
'select rarity from ItemComponent where id = ?',
[render_component_id],
one=True
)
if rarity:
rarity = rarity[0]
return rarity return rarity
@app.template_filter('get_lot_desc') @app.template_filter('get_lot_desc')
@ -301,12 +288,12 @@ def register_luclient_jinja_helpers(app):
return "Missing" return "Missing"
desc = translate_from_locale(f'Objects_{lot_id}_description') desc = translate_from_locale(f'Objects_{lot_id}_description')
if desc == f'Objects_{lot_id}_description': if desc == f'Objects_{lot_id}_description':
desc = Objects.query.filter(Objects.id == id).first().description desc = Objects.query.filter(Objects.id == lot_id).first()
if desc in ("", None): if desc in ("", None):
desc = None desc = None
else: else:
desc = desc[0] desc = desc.description
if desc in ("", None): if desc in ("", None):
desc = None desc = None
if desc: if desc:
@ -334,12 +321,19 @@ def register_luclient_jinja_helpers(app):
def get_lot_stats(lot_id): def get_lot_stats(lot_id):
if not lot_id: if not lot_id:
return None return None
stats = query_cdclient( stats = SkillBehavior.query.with_entities(
'SELECT imBonusUI, lifeBonusUI, armorBonusUI, skillID, skillIcon FROM SkillBehavior WHERE skillID IN (\ SkillBehavior.imBonusUI,
SELECT skillID FROM ObjectSkills WHERE objectTemplate=?\ SkillBehavior.lifeBonusUI,
)', SkillBehavior.armorBonusUI,
[lot_id] SkillBehavior.skillID,
) SkillBehavior.skillIcon
).filter(
SkillBehavior.skillID in ObjectSkills.query.with_entities(
ObjectSkills.skillID
).filter(
ObjectSkills.objectTemplate == lot_id
).all()
).all()
return consolidate_stats(stats) return consolidate_stats(stats)
@ -347,12 +341,19 @@ def register_luclient_jinja_helpers(app):
def get_set_stats(lot_id): def get_set_stats(lot_id):
if not lot_id: if not lot_id:
return "Missing" return "Missing"
stats = query_cdclient( stats = SkillBehavior.query.with_entities(
'SELECT imBonusUI, lifeBonusUI, armorBonusUI, skillID, skillIcon FROM SkillBehavior WHERE skillID IN (\ SkillBehavior.imBonusUI,
SELECT skillID FROM ItemSetSkills WHERE SkillSetID=?\ SkillBehavior.lifeBonusUI,
)', SkillBehavior.armorBonusUI,
[lot_id] SkillBehavior.skillID,
) SkillBehavior.skillIcon
).filter(
SkillBehavior.skillID == ObjectSkills.query.with_entities(
ObjectSkills.skillID
).filter(
ObjectSkills.objectTemplate == lot_id
).all()
).all()
return consolidate_stats(stats) return consolidate_stats(stats)
@ -364,26 +365,18 @@ def register_luclient_jinja_helpers(app):
def consolidate_stats(stats): def consolidate_stats(stats):
if len(stats) > 1: if stats:
consolidated_stats = {"im": 0, "life": 0, "armor": 0, "skill": []} consolidated_stats = {"im": 0, "life": 0, "armor": 0, "skill": []}
for stat in stats: for stat in stats:
if stat[0]: if stat.imBonusUI:
consolidated_stats["im"] += stat[0] consolidated_stats["im"] += stat.imBonusUI
if stat[1]: if stat.lifeBonusUI:
consolidated_stats["life"] += stat[1] consolidated_stats["life"] += stat.lifeBonusUI
if stat[2]: if stat.armorBonusUI:
consolidated_stats["armor"] += stat[2] consolidated_stats["armor"] += stat.armorBonusUI
if stat[3]: if stat.skillID:
consolidated_stats["skill"].append([stat[3], stat[4]]) consolidated_stats["skill"].append([stat.skillID, stat.skillIcon])
stats = consolidated_stats stats = consolidated_stats
elif len(stats) == 1:
stats = {
"im": stats[0][0] if stats[0][0] else 0,
"life": stats[0][1] if stats[0][1] else 0,
"armor": stats[0][2] if stats[0][2] else 0,
"skill": [[stats[0][3], stats[0][4]]] if stats[0][3] else None,
}
else: else:
stats = None stats = None
return stats return stats

View File

@ -13,6 +13,7 @@ from flask_user import login_required, current_user
from datatables import ColumnDT, DataTables from datatables import ColumnDT, DataTables
import time import time
from app.models import Property, db, UGC, CharacterInfo, PropertyContent, Account, Mail from app.models import Property, db, UGC, CharacterInfo, PropertyContent, Account, Mail
from app.cdclient import ComponentsRegistry, ComponentType, RenderComponent
from app.schemas import PropertySchema from app.schemas import PropertySchema
from app import gm_level, log_audit from app import gm_level, log_audit
from app.cdclient import ZoneTable from app.cdclient import ZoneTable
@ -409,17 +410,12 @@ def ugc(content):
def prebuilt(content, file_format, lod): def prebuilt(content, file_format, lod):
# translate LOT to component id # translate LOT to component id
# we need to get a type of 2 because reasons # we need to get a type of 2 because reasons
render_component_id = query_cdclient( filename = RenderComponent.query.filter(
'select component_id from ComponentsRegistry where component_type = 2 and id = ?', RenderComponent.id == ComponentsRegistry.query.filter(
[content.lot], ComponentsRegistry.component_type == ComponentType.COMPONENT_TYPE_RENDER
one=True ).filter(ComponentsRegistry.id == id).first().component_id
)[0] ).first().render_asset
# find the asset from rendercomponent given the component id
filename = query_cdclient(
'select render_asset from RenderComponent where id = ?',
[render_component_id],
one=True
)
if filename: if filename:
filename = filename[0].split("\\\\")[-1].lower().split(".")[0] filename = filename[0].split("\\\\")[-1].lower().split(".")[0]
if "/" in filename: if "/" in filename: