feat: 网站布局统一化+公告卡片重做+地形素材归类+加载动画升级+底部栏拆分
- 网站 7 个页签统一内边距/宽度/滚动方式,去掉重复页头 - 公告卡片改为图文大卡(支持后台 image/title/pinned 字段) - assets/terrain/ 拆 6 个子目录并同步 manifest + TERRAIN_ASSETS - 删除 assets/art/(transition 图片已清空) - 加载界面增加随机过渡背景图 + 深色压暗层 - 底部栏建造按钮拆为地形/移动/高度/管理 4 个独立按钮 - 侧面板改为从底部向上展开(WorldBox 风格) - 删除视频背景文件(已回滚为静态 JPG) - 新增 wc1.js(六边形地图渲染)、wc2.js(导航控件)
This commit is contained in:
@@ -1,8 +1,12 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import json
|
||||
import logging
|
||||
import re
|
||||
from odoo import http
|
||||
from odoo.http import request, Response
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _json(data):
|
||||
"""返回 UTF-8 JSON 响应(与 game_base 一致)。"""
|
||||
@@ -59,3 +63,26 @@ class YtWorldApi(http.Controller):
|
||||
if world and settings is not None:
|
||||
world.settings = settings
|
||||
return _json({'ok': True})
|
||||
|
||||
@http.route('/yt_world/api/world/rename', type='http', auth='user',
|
||||
methods=['POST', 'OPTIONS'], csrf=False)
|
||||
def rename_world(self, **kw):
|
||||
"""修改当前用户世界名称。body: {"name": "..."}
|
||||
校验:trim 后 1-24 字符,禁控制字符,空白正常允许。"""
|
||||
user = request.env.user
|
||||
world = request.env['yt.world'].sudo().search(
|
||||
[('user_id', '=', user.id)], limit=1)
|
||||
if not world:
|
||||
return _json({'ok': False, 'error': 'no_world'})
|
||||
body = _post_body()
|
||||
name = (body.get('name') or '').strip()
|
||||
if not name:
|
||||
return _json({'ok': False, 'error': 'empty'})
|
||||
if len(name) > 24:
|
||||
return _json({'ok': False, 'error': 'too_long'})
|
||||
if re.search(r'[\x00-\x1f\x7f]', name):
|
||||
return _json({'ok': False, 'error': 'invalid_char'})
|
||||
old = world.name
|
||||
world.name = name
|
||||
_logger.info('yt.world rename uid=%s %r -> %r', user.id, old, name)
|
||||
return _json({'ok': True, 'name': name})
|
||||
|
||||
Reference in New Issue
Block a user