2022-01-16 18:22:00 +00:00
|
|
|
import click
|
|
|
|
from flask.cli import with_appcontext
|
2022-03-13 02:09:35 +00:00
|
|
|
import random
|
|
|
|
import string
|
|
|
|
import datetime
|
2022-01-16 18:22:00 +00:00
|
|
|
from flask_user import current_app
|
|
|
|
from app import db
|
2022-01-27 05:11:49 +00:00
|
|
|
from app.models import Account, PlayKey, CharacterInfo, Property, PropertyContent, UGC
|
|
|
|
import pathlib
|
|
|
|
import zlib
|
2022-02-10 18:01:51 +00:00
|
|
|
from wand import image
|
|
|
|
from wand.exceptions import BlobError as BE
|
|
|
|
import app.pylddlib as ldd
|
|
|
|
from multiprocessing import Pool
|
|
|
|
from functools import partial
|
2022-01-16 18:22:00 +00:00
|
|
|
|
2022-03-13 02:09:35 +00:00
|
|
|
|
2022-01-16 18:22:00 +00:00
|
|
|
@click.command("init_db")
|
|
|
|
@click.argument('drop_tables', nargs=1)
|
|
|
|
@with_appcontext
|
|
|
|
def init_db(drop_tables=False):
|
|
|
|
""" Initialize the database."""
|
|
|
|
|
|
|
|
print('Initializing Database.')
|
|
|
|
if drop_tables:
|
|
|
|
print('Dropping all tables.')
|
|
|
|
db.drop_all()
|
|
|
|
print('Creating all tables.')
|
|
|
|
db.create_all()
|
|
|
|
print('Database has been initialized.')
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
@click.command("init_accounts")
|
|
|
|
@with_appcontext
|
|
|
|
def init_accounts():
|
|
|
|
""" Initialize the accounts."""
|
|
|
|
|
|
|
|
# Add accounts
|
|
|
|
print('Creating Admin account.')
|
2022-01-27 05:11:49 +00:00
|
|
|
find_or_create_account(
|
2022-01-16 18:22:00 +00:00
|
|
|
'admin',
|
|
|
|
'example@example.com',
|
|
|
|
'Nope',
|
|
|
|
)
|
|
|
|
|
|
|
|
return
|
|
|
|
|
2022-03-13 02:09:35 +00:00
|
|
|
|
2022-01-27 05:11:49 +00:00
|
|
|
@click.command("load_property")
|
|
|
|
@click.argument('zone')
|
|
|
|
@click.argument('player')
|
|
|
|
@with_appcontext
|
|
|
|
def load_property(zone, player):
|
2022-02-25 17:46:13 +00:00
|
|
|
"""shoves property data into db"""
|
2022-01-27 05:11:49 +00:00
|
|
|
char = CharacterInfo.query.filter(CharacterInfo.name == player).first()
|
|
|
|
if not char:
|
|
|
|
print("Character not Found")
|
|
|
|
return 404
|
|
|
|
|
2022-03-13 02:09:35 +00:00
|
|
|
prop = Property.query.filter(Property.owner_id == char.id).filter(Property.zone_id == zone).first()
|
2022-01-27 05:11:49 +00:00
|
|
|
|
|
|
|
if not prop:
|
|
|
|
print(f"Property {zone} not claimed by Character: {char.name}")
|
|
|
|
return 404
|
|
|
|
|
|
|
|
prop_files = pathlib.Path('property_files/')
|
|
|
|
for i in prop_files.glob('**/*'):
|
|
|
|
if i.suffix == '.lxfml':
|
|
|
|
lxfml = ""
|
|
|
|
with open(i, "r") as file:
|
|
|
|
lxfml = file.read()
|
|
|
|
compressed_lxfml = zlib.compress(lxfml.encode())
|
|
|
|
|
|
|
|
new_ugc = UGC(
|
|
|
|
account_id=char.account_id,
|
|
|
|
character_id=char.id,
|
|
|
|
is_optimized=0,
|
|
|
|
lxfml=compressed_lxfml,
|
|
|
|
bake_ao=0,
|
|
|
|
filename=i.name
|
|
|
|
)
|
|
|
|
new_ugc.save()
|
|
|
|
|
|
|
|
new_prop_content = PropertyContent(
|
|
|
|
id=i.stem,
|
|
|
|
property_id=prop.id,
|
|
|
|
ugc_id=new_ugc.id,
|
|
|
|
lot=14,
|
|
|
|
x=0,
|
|
|
|
y=0,
|
|
|
|
z=0,
|
|
|
|
rx=0,
|
|
|
|
ry=0,
|
|
|
|
rz=0,
|
|
|
|
rw=1
|
|
|
|
)
|
|
|
|
new_prop_content.save()
|
|
|
|
|
2022-03-13 02:09:35 +00:00
|
|
|
|
2022-02-10 18:01:51 +00:00
|
|
|
@click.command("gen_image_cache")
|
|
|
|
def gen_image_cache():
|
2022-02-25 17:46:13 +00:00
|
|
|
"""generates image cache"""
|
2022-02-10 18:01:51 +00:00
|
|
|
luclient = pathlib.Path('app/luclient/res')
|
|
|
|
files = [path for path in luclient.rglob("*.dds") if path.is_file()]
|
|
|
|
|
|
|
|
for file in files:
|
|
|
|
cache = get_cache_file(file).with_suffix(".png")
|
|
|
|
if not cache.exists():
|
|
|
|
try:
|
|
|
|
print(f"Convert {file.as_posix()} to {cache}")
|
|
|
|
cache.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
with image.Image(filename=str(file.as_posix())) as img:
|
|
|
|
img.compression = "no"
|
|
|
|
img.save(filename=str(cache.as_posix()))
|
|
|
|
except BE:
|
|
|
|
return print(f"Error on {file}")
|
|
|
|
|
2022-03-13 02:09:35 +00:00
|
|
|
|
2022-02-10 18:01:51 +00:00
|
|
|
@click.command("gen_model_cache")
|
|
|
|
def gen_model_cache():
|
2022-02-25 17:46:13 +00:00
|
|
|
"""generate model obj cache"""
|
2022-02-10 18:01:51 +00:00
|
|
|
luclient = pathlib.Path('app/luclient/res')
|
|
|
|
files = [path for path in luclient.rglob("*.lxfml") if path.is_file()]
|
|
|
|
pool = Pool(processes=4)
|
|
|
|
pool.map(partial(convert_lxfml_to_obj, lod=0), files)
|
|
|
|
pool.map(partial(convert_lxfml_to_obj, lod=1), files)
|
|
|
|
pool.map(partial(convert_lxfml_to_obj, lod=2), files)
|
|
|
|
|
2022-03-13 02:09:35 +00:00
|
|
|
|
2022-02-10 18:01:51 +00:00
|
|
|
def convert_lxfml_to_obj(file, lod):
|
|
|
|
mtl = get_cache_file(file).with_suffix(f".lod{lod}.mtl")
|
|
|
|
if not mtl.exists():
|
|
|
|
mtl.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
print(f"Convert LXFML {file.as_posix()} to obj and mtl @ {mtl}")
|
|
|
|
try:
|
2022-03-13 02:09:35 +00:00
|
|
|
ldd.main(str(file.as_posix()), str(mtl.with_suffix("").as_posix()), lod) # convert to OBJ
|
2022-02-10 18:01:51 +00:00
|
|
|
except Exception as e:
|
|
|
|
print(f"ERROR on {file}:\n {e}")
|
|
|
|
else:
|
|
|
|
# print(f"Already Exists: {file} with LOD {lod}")
|
|
|
|
return
|
|
|
|
|
2022-03-13 02:09:35 +00:00
|
|
|
|
2022-02-10 18:01:51 +00:00
|
|
|
def get_cache_file(path):
|
2022-02-25 17:46:13 +00:00
|
|
|
"""helper"""
|
2022-02-10 18:01:51 +00:00
|
|
|
# convert to list so that we can change elements
|
|
|
|
parts = list(path.parts)
|
|
|
|
|
|
|
|
# replace part that matches src with dst
|
|
|
|
parts[parts.index("luclient")] = "cache"
|
|
|
|
del parts[parts.index("res")]
|
|
|
|
|
|
|
|
return pathlib.Path(*parts)
|
2022-01-16 18:22:00 +00:00
|
|
|
|
2022-03-13 02:09:35 +00:00
|
|
|
|
2022-01-16 18:22:00 +00:00
|
|
|
def find_or_create_account(name, email, password, gm_level=9):
|
|
|
|
""" Find existing account or create new account """
|
|
|
|
account = Account.query.filter(Account.email == email).first()
|
|
|
|
if not account:
|
|
|
|
key = ""
|
|
|
|
for j in range(4):
|
|
|
|
key += ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(4)) + '-'
|
|
|
|
# Remove last dash
|
|
|
|
key = key[:-1]
|
|
|
|
|
|
|
|
play_key = PlayKey(
|
|
|
|
key_string=key
|
|
|
|
)
|
|
|
|
db.session.add(play_key)
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
play_key = PlayKey.query.filter(PlayKey.key_string == key).first()
|
2022-03-13 02:09:35 +00:00
|
|
|
account = Account(
|
|
|
|
email=email,
|
|
|
|
username=name,
|
|
|
|
password=current_app.user_manager.password_manager.hash_password(password),
|
|
|
|
play_key_id=play_key.id,
|
|
|
|
email_confirmed_at=datetime.datetime.utcnow(),
|
|
|
|
gm_level=gm_level
|
|
|
|
)
|
2022-01-16 18:22:00 +00:00
|
|
|
play_key.key_uses = 0
|
|
|
|
db.session.add(account)
|
|
|
|
db.session.add(play_key)
|
|
|
|
db.session.commit()
|
2022-03-13 02:09:35 +00:00
|
|
|
return # account
|