领地权限与面积限制接口:补生物蛋/涂蜡刮蜡两权限字段,新增退费比例与面积限制配置项
This commit is contained in:
@@ -2662,6 +2662,9 @@ function showLandConfig() {
|
||||
const cfg = window._landCfgData || {};
|
||||
const price = cfg.create_price_per_sqm || '10';
|
||||
const maxLands = cfg.max_lands_per_player || '5';
|
||||
const refundRatio = cfg.refund_ratio_per_cent || '100';
|
||||
const maxFreeArea = cfg.max_free_area_sqm || '3500';
|
||||
const maxSide = cfg.max_land_side_blocks || '7000';
|
||||
const html = `<div style="padding:16px">
|
||||
<h3 style="margin:0 0 12px;color:var(--fg)">⚙️ 领地配置</h3>
|
||||
<div style="margin-bottom:12px">
|
||||
@@ -2672,6 +2675,18 @@ function showLandConfig() {
|
||||
<label style="display:block;font-size:12px;color:var(--dim);margin-bottom:4px">每人最大领地数</label>
|
||||
<input id="cfgMaxLands" type="number" value="${maxLands}" min="1" style="width:100%;padding:8px;background:var(--bg);border:1px solid var(--border);border-radius:4px;color:var(--fg)">
|
||||
</div>
|
||||
<div style="margin-bottom:12px">
|
||||
<label style="display:block;font-size:12px;color:var(--dim);margin-bottom:4px">删除领地退费比例(%) <span style="opacity:.7">0=不退款 100=全额</span></label>
|
||||
<input id="cfgRefundRatio" type="number" value="${refundRatio}" min="0" max="100" style="width:100%;padding:8px;background:var(--bg);border:1px solid var(--border);border-radius:4px;color:var(--fg)">
|
||||
</div>
|
||||
<div style="margin-bottom:12px">
|
||||
<label style="display:block;font-size:12px;color:var(--dim);margin-bottom:4px">单次扩建免审面积上限(㎡) <span style="opacity:.7">超出需管理员现场审批</span></label>
|
||||
<input id="cfgMaxFreeArea" type="number" value="${maxFreeArea}" min="1" style="width:100%;padding:8px;background:var(--bg);border:1px solid var(--border);border-radius:4px;color:var(--fg)">
|
||||
</div>
|
||||
<div style="margin-bottom:12px">
|
||||
<label style="display:block;font-size:12px;color:var(--dim);margin-bottom:4px">领地免审边长上限(格) <span style="opacity:.7">单边超过即需审批,最大 7000×7000</span></label>
|
||||
<input id="cfgMaxSide" type="number" value="${maxSide}" min="1" style="width:100%;padding:8px;background:var(--bg);border:1px solid var(--border);border-radius:4px;color:var(--fg)">
|
||||
</div>
|
||||
<button onclick="saveLandConfig()" style="width:100%;padding:8px;background:var(--accent);color:#fff;border:none;border-radius:4px;cursor:pointer">保存</button>
|
||||
</div>`;
|
||||
showModal('领地配置', '', null, html);
|
||||
@@ -2680,6 +2695,9 @@ function showLandConfig() {
|
||||
async function saveLandConfig() {
|
||||
const price = document.getElementById('cfgPrice')?.value || '10';
|
||||
const maxLands = document.getElementById('cfgMaxLands')?.value || '5';
|
||||
const refundRatio = document.getElementById('cfgRefundRatio')?.value || '100';
|
||||
const maxFreeArea = document.getElementById('cfgMaxFreeArea')?.value || '3500';
|
||||
const maxSide = document.getElementById('cfgMaxSide')?.value || '7000';
|
||||
try {
|
||||
await fetch('api/land_api.php?action=update_config', {
|
||||
method: 'POST',
|
||||
@@ -2691,6 +2709,21 @@ async function saveLandConfig() {
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
body: 'key=max_lands_per_player&value=' + encodeURIComponent(maxLands) + '&secret=' + SECRET + ''
|
||||
});
|
||||
await fetch('api/land_api.php?action=update_config', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
body: 'key=refund_ratio_per_cent&value=' + encodeURIComponent(refundRatio) + '&secret=' + SECRET + ''
|
||||
});
|
||||
await fetch('api/land_api.php?action=update_config', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
body: 'key=max_free_area_sqm&value=' + encodeURIComponent(maxFreeArea) + '&secret=' + SECRET + ''
|
||||
});
|
||||
await fetch('api/land_api.php?action=update_config', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
body: 'key=max_land_side_blocks&value=' + encodeURIComponent(maxSide) + '&secret=' + SECRET + ''
|
||||
});
|
||||
document.querySelector('.modal-close')?.click();
|
||||
loadLands(document.getElementById('C'));
|
||||
} catch(e) {
|
||||
|
||||
+16
-1
@@ -147,6 +147,8 @@ $PERM_DEFAULT_COLS = [
|
||||
'denyWoolShear' => ['col' => 'deny_wool_shear'],
|
||||
'denyAnimalFeeding' => ['col' => 'deny_animal_feeding'],
|
||||
'denyMobAttack' => ['col' => 'deny_mob_attack'],
|
||||
'denySpawnEgg' => ['col' => 'deny_spawn_egg'],
|
||||
'denyWax' => ['col' => 'deny_wax'],
|
||||
'peaceMode' => ['col' => 'peace_mode'],
|
||||
];
|
||||
|
||||
@@ -649,6 +651,8 @@ function initLandTables($db) {
|
||||
'deny_wool_shear' => "INTEGER DEFAULT 0",
|
||||
'deny_animal_feeding' => "INTEGER DEFAULT 0",
|
||||
'deny_mob_attack' => "INTEGER DEFAULT 0",
|
||||
'deny_spawn_egg' => "INTEGER DEFAULT 0",
|
||||
'deny_wax' => "INTEGER DEFAULT 0",
|
||||
'deny_container' => "INTEGER DEFAULT 0",
|
||||
'peace_mode' => "INTEGER DEFAULT 0",
|
||||
'peace_mode_duration' => "INTEGER DEFAULT 0",
|
||||
@@ -833,6 +837,7 @@ function handleSyncLands($db, $post) {
|
||||
confiscate_msg, deny_thrown_projectiles, deny_glowing, deny_redstone_interaction,
|
||||
deny_door_interaction, deny_noteblock_jukebox, deny_lead, deny_crop_harvest,
|
||||
deny_wool_shear, deny_animal_feeding,
|
||||
deny_spawn_egg, deny_wax,
|
||||
warp_x, warp_y, warp_z, warp_yaw, warp_pitch, warp_world,
|
||||
deny_container, deny_mob_attack,
|
||||
enable_announce, announce_template, txt_content, deny_fluid, is_public_building, allow_visitor_teleport)
|
||||
@@ -848,6 +853,7 @@ function handleSyncLands($db, $post) {
|
||||
:confiscate_msg, :deny_thrown_projectiles, :deny_glowing, :deny_redstone_interaction,
|
||||
:deny_door_interaction, :deny_noteblock_jukebox, :deny_lead, :deny_crop_harvest,
|
||||
:deny_wool_shear, :deny_animal_feeding,
|
||||
:deny_spawn_egg, :deny_wax,
|
||||
:warp_x, :warp_y, :warp_z, :warp_yaw, :warp_pitch, :warp_world,
|
||||
:deny_container, :deny_mob_attack,
|
||||
:enable_announce, :announce_template, :txt_content, :deny_fluid, :is_public_building, :allow_visitor_teleport)");
|
||||
@@ -912,6 +918,8 @@ function handleSyncLands($db, $post) {
|
||||
$stmt->bindValue(':deny_crop_harvest', (int)($land['deny_crop_harvest'] ?? 0), SQLITE3_INTEGER);
|
||||
$stmt->bindValue(':deny_wool_shear', (int)($land['deny_wool_shear'] ?? 0), SQLITE3_INTEGER);
|
||||
$stmt->bindValue(':deny_animal_feeding', (int)($land['deny_animal_feeding'] ?? 0), SQLITE3_INTEGER);
|
||||
$stmt->bindValue(':deny_spawn_egg', (int)($land['deny_spawn_egg'] ?? 0), SQLITE3_INTEGER);
|
||||
$stmt->bindValue(':deny_wax', (int)($land['deny_wax'] ?? 0), SQLITE3_INTEGER);
|
||||
// ★ 传送点
|
||||
$stmt->bindValue(':warp_x', (float)($land['warp_x'] ?? 0), SQLITE3_FLOAT);
|
||||
$stmt->bindValue(':warp_y', (float)($land['warp_y'] ?? 0), SQLITE3_FLOAT);
|
||||
@@ -1048,6 +1056,13 @@ function handleUpdateConfig($db, $post) {
|
||||
// ★ 去除前导零:01 → 1,防止静默失败
|
||||
if (is_numeric($value)) $value = (string)(int)$value;
|
||||
|
||||
// ★ 面积限制/退费比例:服务端钳制,防脏值
|
||||
if ($key === 'refund_ratio_per_cent') {
|
||||
$value = (string)max(0, min(100, (int)$value));
|
||||
} elseif ($key === 'max_free_area_sqm' || $key === 'max_land_side_blocks') {
|
||||
$value = (string)max(1, (int)$value);
|
||||
}
|
||||
|
||||
$stmt = $db->prepare("INSERT OR REPLACE INTO web_area_config (key, value) VALUES (:key, :val)");
|
||||
$stmt->bindValue(':key', $key, SQLITE3_TEXT);
|
||||
$stmt->bindValue(':val', $value, SQLITE3_TEXT);
|
||||
@@ -1670,7 +1685,7 @@ function handleUpdateLandField($db, $playerName, $post) {
|
||||
'deny_item_frame', 'deny_glowing', 'deny_redstone_interaction',
|
||||
'deny_door_interaction', 'deny_noteblock_jukebox', 'deny_lead',
|
||||
'deny_crop_harvest', 'deny_wool_shear', 'deny_animal_feeding',
|
||||
'deny_mob_attack', 'deny_fluid',
|
||||
'deny_mob_attack', 'deny_fluid', 'deny_spawn_egg', 'deny_wax',
|
||||
// 高级设置
|
||||
'confiscate_items', 'deny_use_items', 'punish_commands',
|
||||
'peace_mode', 'peace_mode_duration', 'enforce_game_mode',
|
||||
|
||||
+6
-2
@@ -489,6 +489,8 @@ function syncLands() {
|
||||
try { $db->exec("ALTER TABLE web_area_lands ADD COLUMN deny_raid INTEGER DEFAULT 0"); } catch (\Throwable $e) {}
|
||||
try { $db->exec("ALTER TABLE web_area_lands ADD COLUMN deny_container INTEGER DEFAULT 0"); } catch (\Throwable $e) {}
|
||||
try { $db->exec("ALTER TABLE web_area_lands ADD COLUMN deny_mob_attack INTEGER DEFAULT 0"); } catch (\Throwable $e) {}
|
||||
try { $db->exec("ALTER TABLE web_area_lands ADD COLUMN deny_spawn_egg INTEGER DEFAULT 0"); } catch (\Throwable $e) {}
|
||||
try { $db->exec("ALTER TABLE web_area_lands ADD COLUMN deny_wax INTEGER DEFAULT 0"); } catch (\Throwable $e) {}
|
||||
try { $db->exec("ALTER TABLE web_area_lands ADD COLUMN is_public_building INTEGER DEFAULT 0"); } catch (\Throwable $e) {}
|
||||
try { $db->exec("ALTER TABLE web_area_lands ADD COLUMN allow_visitor_teleport INTEGER DEFAULT 0"); } catch (\Throwable $e) {}
|
||||
try { $db->exec("ALTER TABLE web_area_lands ADD COLUMN confiscate_items TEXT DEFAULT ''"); } catch (\Throwable $e) {}
|
||||
@@ -505,7 +507,7 @@ function syncLands() {
|
||||
deny_item_frame, deny_entity_interact, deny_move, deny_pickup, deny_drop, deny_explosion, deny_fall_damage, deny_hunger,
|
||||
deny_all_damage, clear_effects, give_effects, clear_all_bad,
|
||||
admin_changed, deny_thrown_projectiles, deny_glowing, deny_redstone_interaction, deny_door_interaction,
|
||||
deny_noteblock_jukebox, deny_lead, deny_crop_harvest, deny_wool_shear, deny_animal_feeding,
|
||||
deny_noteblock_jukebox, deny_lead, deny_crop_harvest, deny_wool_shear, deny_animal_feeding, deny_spawn_egg, deny_wax,
|
||||
warp_x, warp_y, warp_z, warp_yaw, warp_pitch, warp_world,
|
||||
deny_mount, deny_ender_pearl, deny_bow, deny_potion, deny_fire, deny_raid,
|
||||
deny_container, deny_mob_attack, is_public_building, allow_visitor_teleport,
|
||||
@@ -517,7 +519,7 @@ function syncLands() {
|
||||
:deny_item_frame, :deny_entity_interact, :deny_move, :deny_pickup, :deny_drop, :deny_explosion, :deny_fall_damage, :deny_hunger,
|
||||
:deny_all_damage, :clear_effects, :give_effects, :clear_all_bad,
|
||||
:admin_changed, :deny_thrown_projectiles, :deny_glowing, :deny_redstone_interaction, :deny_door_interaction,
|
||||
:deny_noteblock_jukebox, :deny_lead, :deny_crop_harvest, :deny_wool_shear, :deny_animal_feeding,
|
||||
:deny_noteblock_jukebox, :deny_lead, :deny_crop_harvest, :deny_wool_shear, :deny_animal_feeding, :deny_spawn_egg, :deny_wax,
|
||||
:warp_x, :warp_y, :warp_z, :warp_yaw, :warp_pitch, :warp_world,
|
||||
:deny_mount, :deny_ender_pearl, :deny_bow, :deny_potion, :deny_fire, :deny_raid,
|
||||
:deny_container, :deny_mob_attack, :is_public_building, :allow_visitor_teleport,
|
||||
@@ -578,6 +580,8 @@ function syncLands() {
|
||||
$stmt->bindValue(':deny_crop_harvest', (int)($land['deny_crop_harvest'] ?? 0), SQLITE3_INTEGER);
|
||||
$stmt->bindValue(':deny_wool_shear', (int)($land['deny_wool_shear'] ?? 0), SQLITE3_INTEGER);
|
||||
$stmt->bindValue(':deny_animal_feeding', (int)($land['deny_animal_feeding'] ?? 0), SQLITE3_INTEGER);
|
||||
$stmt->bindValue(':deny_spawn_egg', (int)($land['deny_spawn_egg'] ?? 0), SQLITE3_INTEGER);
|
||||
$stmt->bindValue(':deny_wax', (int)($land['deny_wax'] ?? 0), SQLITE3_INTEGER);
|
||||
$stmt->bindValue(':warp_x', (double)($land['warp_x'] ?? 0), SQLITE3_FLOAT);
|
||||
$stmt->bindValue(':warp_y', (double)($land['warp_y'] ?? 0), SQLITE3_FLOAT);
|
||||
$stmt->bindValue(':warp_z', (double)($land['warp_z'] ?? 0), SQLITE3_FLOAT);
|
||||
|
||||
@@ -3468,6 +3468,8 @@ async function renderLandDetail(el, landName) {
|
||||
['deny_wool_shear', '剪切羊毛/生物', false],
|
||||
['deny_animal_feeding', '投喂动物', false],
|
||||
['deny_mob_attack', '攻击生物', false],
|
||||
['deny_spawn_egg', '生物蛋(生成/孵化)', false],
|
||||
['deny_wax', '涂蜡/刮蜡', false],
|
||||
['deny_fluid', '流体放置', false],
|
||||
['allow_visitor_teleport', '允许传送', true],
|
||||
['is_public_building', '公共建筑设施', true],
|
||||
|
||||
Reference in New Issue
Block a user