领地权限与面积限制接口:补生物蛋/涂蜡刮蜡两权限字段,新增退费比例与面积限制配置项

This commit is contained in:
ypsdf1
2026-10-02 19:31:20 +08:00
parent 5912c6fd76
commit 9ee8023d90
4 changed files with 57 additions and 3 deletions
+33
View File
@@ -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
View File
@@ -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
View File
@@ -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);
+2
View File
@@ -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],