├── BehaviourPack ├── cameras │ └── presets │ │ └── example_player_effects.json ├── entities │ ├── bat.json │ ├── shulker_bullet.json │ └── small_fireball.json ├── functions │ ├── get_owner.mcfunction │ └── reset.mcfunction ├── items │ ├── config_file.json │ └── usf_op.json ├── manifest.json ├── manifestR.json ├── pack_icon.png └── scripts │ ├── Main.js │ ├── data.js │ ├── functions │ ├── admin_functions.js │ ├── land.js │ └── usfApi.js │ ├── md5.js │ ├── text.js │ └── ui.js ├── License ├── LogServer ├── LogServer.json ├── Main.js ├── permissions.json ├── start.cmd ├── start.sh └── 使用方法.txt ├── README(English).md ├── README.md ├── start.cmd ├── 使用须知.txt ├── 全功能使用方法.txt ├── 支持我.jpg ├── 文件说明(必看!).txt └── 更新日志.txt /BehaviourPack/cameras/presets/example_player_effects.json: -------------------------------------------------------------------------------- 1 | { 2 | "format_version": "1.19.50", 3 | "minecraft:camera_preset": { 4 | "identifier": "usf:example_player_effects", 5 | "inherit_from": "minecraft:free", 6 | "player_effects": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /BehaviourPack/entities/bat.json: -------------------------------------------------------------------------------- 1 | { 2 | "format_version": "1.16.0", 3 | "minecraft:entity": { 4 | "description": { 5 | "identifier": "minecraft:bat", 6 | "is_spawnable": true, 7 | "is_summonable": true, 8 | "is_experimental": false 9 | }, 10 | "component_groups": { 11 | "usf:data_trade":{ 12 | "minecraft:inventory":{ 13 | "can_be_siphoned_from": false, 14 | "container_type": "minecart_chest", 15 | "inventory_size": 270, 16 | "private": true 17 | } 18 | }, 19 | "usf:boss":{ 20 | "minecraft:boss": { 21 | "should_darken_sky": false, 22 | "hud_range": 9999999, 23 | "name": "Bar" 24 | }, 25 | "minecraft:health": { 26 | "value": 100, 27 | "max": 100 28 | } 29 | }, 30 | "usf:text": { 31 | "minecraft:persistent": {}, 32 | "minecraft:scale": { 33 | "value": 0.02 34 | }, 35 | "minecraft:behavior.look_at_player": { 36 | "priority": 0, 37 | "look_distance": 12.0, 38 | "probability": 1 39 | }, 40 | "minecraft:friction_modifier": { 41 | "value": 0.0 42 | }, 43 | "minecraft:pushable": { 44 | "is_pushable": false, 45 | "is_pushable_by_piston": false 46 | }, 47 | "minecraft:movement": { 48 | "value": 0 49 | }, 50 | "minecraft:damage_sensor": { 51 | "triggers": { 52 | "cause": "all", 53 | "deals_damage": false 54 | } 55 | }, 56 | "minecraft:physics": { 57 | "has_gravity": false, 58 | "has_collision": false 59 | }, 60 | "minecraft:breathable": { 61 | "total_supply": 15, 62 | "suffocate_time": 0, 63 | "breathes_air": true, 64 | "breathes_water": true, 65 | "breathes_solids": true 66 | }, 67 | "minecraft:nameable": { 68 | "always_show": true, 69 | "allow_name_tag_renaming": false 70 | } 71 | }, 72 | "minecraft:base": { 73 | "minecraft:damage_sensor": { 74 | "triggers": { 75 | "cause": "fall", 76 | "deals_damage": false 77 | } 78 | }, 79 | "minecraft:hurt_on_condition": { 80 | "damage_conditions": [ 81 | { 82 | "filters": { 83 | "test": "in_lava", 84 | "subject": "self", 85 | "operator": "==", 86 | "value": true 87 | }, 88 | "cause": "lava", 89 | "damage_per_tick": 4 90 | } 91 | ] 92 | }, 93 | "minecraft:movement": { 94 | "value": 0.1 95 | }, 96 | "minecraft:navigation.float": { 97 | "can_path_over_water": true 98 | }, 99 | "minecraft:movement.basic": {}, 100 | "minecraft:jump.static": {}, 101 | "minecraft:behavior.float": { 102 | "priority": 0 103 | }, 104 | "minecraft:breathable": { 105 | "total_supply": 15, 106 | "suffocate_time": 0 107 | }, 108 | "minecraft:behavior.float_wander": { 109 | "xz_dist": 10, 110 | "y_dist": 7, 111 | "y_offset": -2.0, 112 | "random_reselect": true, 113 | "float_duration": [ 114 | 0.1, 115 | 0.35 116 | ] 117 | }, 118 | "minecraft:can_fly": {}, 119 | "minecraft:health": { 120 | "value": 6, 121 | "max": 6 122 | }, 123 | "minecraft:nameable": {}, 124 | "minecraft:physics": {} 125 | } 126 | }, 127 | "components": { 128 | "minecraft:is_hidden_when_invisible": {}, 129 | "minecraft:type_family": { 130 | "family": [ 131 | "bat", 132 | "mob" 133 | ] 134 | }, 135 | "minecraft:collision_box": { 136 | "width": 0.5, 137 | "height": 0.9 138 | }, 139 | "minecraft:conditional_bandwidth_optimization": {} 140 | }, 141 | "events": { 142 | "usf:data_trade": { 143 | "add": { 144 | "component_groups": [ 145 | "usf:data_trade", 146 | "usf:text" 147 | ] 148 | } 149 | }, 150 | "minecraft:entity_spawned": { 151 | "add": { 152 | "component_groups": [ 153 | "minecraft:base" 154 | ] 155 | } 156 | }, 157 | "usf:text": { 158 | "add": { 159 | "component_groups": [ 160 | "usf:text" 161 | ] 162 | }, 163 | "remove": { 164 | "component_groups": [ 165 | "minecraft:base" 166 | ] 167 | } 168 | } 169 | } 170 | } 171 | } -------------------------------------------------------------------------------- /BehaviourPack/entities/shulker_bullet.json: -------------------------------------------------------------------------------- 1 | { 2 | "format_version": "1.10.0", 3 | "minecraft:entity": { 4 | "description": { 5 | "identifier": "minecraft:shulker_bullet", 6 | "is_spawnable": false, 7 | "is_summonable": true, 8 | "is_experimental": false 9 | }, 10 | "component_groups": { 11 | "usf:land":{ 12 | "minecraft:timer": { 13 | "looping": true, 14 | "time": [0.1,0.1], 15 | "time_down_event": { 16 | "event": "usf:land_tick" 17 | } 18 | } 19 | }, 20 | "usf:data_trade":{ 21 | "minecraft:inventory":{ 22 | "can_be_siphoned_from": false, 23 | "container_type": "inventory", 24 | "inventory_size": 1024, 25 | "private": true 26 | } 27 | }, 28 | "usf:data_board":{ 29 | "minecraft:scale": { 30 | "value": 0.4 31 | } 32 | }, 33 | "minecraft:normal":{ 34 | "minecraft:projectile": { 35 | "on_hit": { 36 | "impact_damage": { 37 | "damage": 4, 38 | "knockback": true, 39 | "should_bounce": true 40 | }, 41 | "mob_effect": { 42 | "effect": "levitation", 43 | "durationeasy": 200, 44 | "durationnormal": 200, 45 | "durationhard": 200, 46 | "amplifier": 0 47 | }, 48 | "remove_on_hit": { 49 | }, 50 | "particle_on_hit": { 51 | "particle_type": "largeexplode", 52 | "on_other_hit": true 53 | } 54 | }, 55 | "hit_sound": "bullet.hit", 56 | "destroyOnHurt": true, 57 | "crit_particle_on_hurt": true, 58 | "power": 1.6, 59 | "gravity": 0.05, 60 | "uncertainty_base": 16, 61 | "uncertainty_multiplier": 4, 62 | "anchor": 1, 63 | "offset": [ 0, -0.1, 0 ], 64 | "homing": true 65 | } 66 | } 67 | }, 68 | "components": { 69 | "minecraft:collision_box": { 70 | "width": 0.625, 71 | "height": 0.625 72 | }, 73 | 74 | "minecraft:physics": { 75 | "has_collision": false 76 | }, 77 | "minecraft:conditional_bandwidth_optimization": { 78 | "default_values": { 79 | "max_optimized_distance": 80.0, 80 | "max_dropped_ticks": 7, 81 | "use_motion_prediction_hints": true 82 | } 83 | } 84 | }, 85 | 86 | "events":{ 87 | "usf:land_tick":{ 88 | 89 | }, 90 | "usf:add_to_land":{ 91 | "add": { 92 | "component_groups": [ "usf:land" ] 93 | } 94 | }, 95 | "minecraft:entity_spawned":{ 96 | "add": { 97 | "component_groups": [ "minecraft:normal" ] 98 | } 99 | }, 100 | "usf:stop":{ 101 | "remove": { 102 | "component_groups": [ "minecraft:normal" ] 103 | } 104 | }, 105 | "usf:data_trade":{ 106 | "add": { 107 | "component_groups": [ "usf:data_trade" ] 108 | } 109 | }, 110 | "usf:data_board":{ 111 | "add": { 112 | "component_groups": [ "usf:data_board" ] 113 | } 114 | } 115 | } 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /BehaviourPack/entities/small_fireball.json: -------------------------------------------------------------------------------- 1 | { 2 | "format_version": "1.12.0", 3 | "minecraft:entity": { 4 | "description": { 5 | "identifier": "minecraft:small_fireball", 6 | "is_spawnable": false, 7 | "is_summonable": true, 8 | "is_experimental": false 9 | }, 10 | "components": { 11 | "minecraft:collision_box": { 12 | "width": 0.31, 13 | "height": 0.31 14 | }, 15 | "minecraft:projectile": { 16 | 17 | "on_hit": { 18 | "impact_damage": { 19 | "damage": 5, 20 | "knockback": true, 21 | "catch_fire": true, 22 | "semi_random_diff_damage": false 23 | }, 24 | "catch_fire": { 25 | "fire_affected_by_griefing": true 26 | }, 27 | "remove_on_hit": { } 28 | }, 29 | "power": 1.3, 30 | "gravity": 0.00, 31 | "inertia": 1, 32 | "liquid_inertia": 1, 33 | "anchor": 2, 34 | "offset": [ 0, 0.5, 0 ], 35 | "semi_random_diff_damage": true, 36 | "uncertainty_base": 10.0, 37 | "reflect_on_hurt": true 38 | }, 39 | "minecraft:physics": { 40 | }, 41 | "minecraft:pushable": { 42 | "is_pushable": true, 43 | "is_pushable_by_piston": true 44 | }, 45 | "minecraft:conditional_bandwidth_optimization": { 46 | "default_values": { 47 | "max_optimized_distance": 80.0, 48 | "max_dropped_ticks": 7, 49 | "use_motion_prediction_hints": true 50 | } 51 | } 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /BehaviourPack/functions/get_owner.mcfunction: -------------------------------------------------------------------------------- 1 | scriptevent usf:get_owner -------------------------------------------------------------------------------- /BehaviourPack/functions/reset.mcfunction: -------------------------------------------------------------------------------- 1 | scriptevent usf:reset -------------------------------------------------------------------------------- /BehaviourPack/items/config_file.json: -------------------------------------------------------------------------------- 1 | { 2 | "format_version": "1.20.10", 3 | "minecraft:item": { 4 | "description": { 5 | "identifier": "usf:config_file", 6 | "category": "equipment" 7 | }, 8 | "components": { 9 | "minecraft:max_stack_size": 1, 10 | "minecraft:display_name": { 11 | "value": "策略文件" 12 | }, 13 | "minecraft:icon": { 14 | "texture": "paper" 15 | }, 16 | "minecraft:glint": true 17 | }, 18 | "events": {} 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /BehaviourPack/items/usf_op.json: -------------------------------------------------------------------------------- 1 | { 2 | "format_version": "1.20.10", 3 | "minecraft:item": { 4 | "description": { 5 | "identifier": "usf:op", 6 | "category": "equipment" 7 | }, 8 | "components": { 9 | "minecraft:max_stack_size": 64, 10 | "minecraft:display_name": { 11 | "value": "OP" 12 | }, 13 | "minecraft:icon": { 14 | "texture": "trident" 15 | }, 16 | "minecraft:glint": true 17 | }, 18 | "events": {} 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /BehaviourPack/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "format_version": 2, 3 | "header": { 4 | "description": "By EarthDLL,保留所有权利\n适配1.21.70:by 凋空凌", 5 | "name": "服务器管理框架V2(基于GameTest框架)1.21+", 6 | "uuid": "9472c503-5a92-43c8-7ddf-0492de2362d7", 7 | "version": [1, 0, 0], 8 | "min_engine_version": [1, 21, 60] 9 | }, 10 | "modules": [ 11 | { 12 | "description": "By EarthDLL,保留所有权利", 13 | "type": "script", 14 | "language":"javascript", 15 | "uuid": "317b0654-acf7-903f-8639-9dd226ee395f", 16 | "version": [1, 0, 0], 17 | "entry": "scripts/Main.js" 18 | } 19 | ], 20 | "dependencies": [ 21 | { 22 | "module_name": "@minecraft/server", 23 | "version": "2.0.0-beta" 24 | }, 25 | { 26 | "module_name": "@minecraft/server-ui", 27 | "version": "2.0.0-beta" 28 | } 29 | ] 30 | } -------------------------------------------------------------------------------- /BehaviourPack/manifestR.json: -------------------------------------------------------------------------------- 1 | { 2 | "format_version": 2, 3 | "header": { 4 | "description": "By EarthDLL,保留所有权利", 5 | "name": "服务器管理框架V2(基于GameTest框架)1.21+", 6 | "uuid": "9472c503-5a92-43c8-7ddf-0492de2362d7", 7 | "version": [1, 0, 0], 8 | "min_engine_version": [1, 21, 0] 9 | }, 10 | "modules": [ 11 | { 12 | "description": "By EarthDLL,保留所有权利", 13 | "type": "script", 14 | "language":"javascript", 15 | "uuid": "317b0654-acf7-903f-8639-9dd226ee395f", 16 | "version": [1, 0, 0], 17 | "entry": "scripts/Main.js" 18 | } 19 | ], 20 | "dependencies": [ 21 | { 22 | "module_name": "@minecraft/server", 23 | "version": "2.0.0-beta" 24 | }, 25 | { 26 | "module_name": "@minecraft/server-ui", 27 | "version": "2.0.0-beta" 28 | }, 29 | { 30 | "module_name": "@minecraft/server-net", 31 | "version": "1.0.0-beta" 32 | } 33 | ] 34 | 35 | } -------------------------------------------------------------------------------- /BehaviourPack/pack_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USFrameTeam/Unknown-Server-Framework/9adebab5adc9202df560be5ad04ef1c4e305f37c/BehaviourPack/pack_icon.png -------------------------------------------------------------------------------- /BehaviourPack/scripts/data.js: -------------------------------------------------------------------------------- 1 | export const usf_config = { 2 | "name":{ 3 | "format" : "/name", 4 | "able":false 5 | }, 6 | "hacker" : { 7 | allow : [ "chest" ], 8 | back : false, 9 | kick : false 10 | }, 11 | "rule" : { 12 | able : false, 13 | data : "" 14 | }, 15 | "chat_board":{ 16 | able : false 17 | }, 18 | "config_item" : {}, 19 | "groups" :{ 20 | "able" : false, 21 | "max" : 2, //每人可创建的群组 22 | }, 23 | "other":{ 24 | "chat_board":false, 25 | "online" : "" 26 | }, 27 | "land":{ 28 | "able":false, 29 | "max":2, 30 | "board" : "", 31 | "price" : 0, 32 | "must" : false, 33 | "show" : "§e你已进入/name的领地!", 34 | "view" : false, 35 | }, 36 | "log" : { 37 | "able" : true, 38 | "down" : 30, 39 | "address" : "http://127.0.0.1:1024/", 40 | "allow" : [] 41 | }, 42 | "tp" : { 43 | "random_range":10000, 44 | "per" : true, 45 | "per_conut" : 50, 46 | "die" : false, 47 | "back" : false, 48 | "down" : 30, 49 | "pp" : false, 50 | "share" : true, 51 | "world" : false, 52 | "group" : false, 53 | "random_end" : true, 54 | }, 55 | "board" : { 56 | "able" : false, 57 | "first" : "", 58 | "_" : "" 59 | }, 60 | "hurt":{ 61 | "able" : false, 62 | "type" : 0 //"" 63 | }, 64 | "time":{ 65 | "able" : false, 66 | "type" : 0 , //0为秒,1为分钟 67 | "show" : false 68 | }, 69 | "tip" : { 70 | "able" : false 71 | }, 72 | "chat" : { 73 | "format" : "[/tag]/sender >> /text", 74 | "tag" : "", 75 | "clear" : false, 76 | "length" : 1024, 77 | "disable" : false 78 | }, 79 | "cd_items" : ["minecraft:clock"], 80 | "ban_entity" : [], 81 | "ban_item" : [], 82 | "scores": [], 83 | "score":{ 84 | "able" :false, 85 | "id" : "" 86 | }, 87 | "tran" : { 88 | able : false, 89 | board : "", 90 | free : 0 91 | }, 92 | "game":{ 93 | "kill" : false, 94 | "creeper" : false, 95 | "sign" : false, 96 | "r_in" : 0, 97 | "r_di" : 0, 98 | "r_rs" : 0, 99 | "fb" : false, 100 | "lock": false, 101 | }, 102 | "store" : { 103 | "able" : false, 104 | "moneys" : "", 105 | "groups" : {} 106 | }, 107 | "commands" : [ "cd" , "op" , "tpaccept" , "home"], 108 | language : 0, 109 | "copy_boards" : "", 110 | "mini" : { 111 | land_tag : false, 112 | clear_tag : false 113 | }, 114 | "timer" : "", 115 | "limit" : {}, 116 | "daily":{ 117 | able : false, 118 | command : "" 119 | } 120 | } 121 | 122 | export const data_format = { 123 | //0-string 1-int 2-float 124 | job_format : { 125 | }, 126 | command_format : { 127 | code : [0], 128 | open : [0], 129 | hotbar : [1], 130 | name : [0,0], 131 | knock : [2,2,2,2], 132 | health : [0,2], 133 | tag : [0], 134 | fire : [2], 135 | show : [0,0,0], 136 | ui : [0], 137 | back : [], 138 | tpa : [], 139 | commandblock : [1,1,1], 140 | var : [0,0,0], 141 | test : [1,1,0,0,0], 142 | get : [0,0,0] 143 | }, 144 | item_events : ["knock","runner","tp"], 145 | score : ["die","di","bb","pb","damage","health","kill","join","buy","earn","hurt","hurt_time","kill_monster"], 146 | events : ["join","die","pos","chat","di","bb","pb","attack","sleep","kill"], 147 | land_permission : ["bb","ib","ie","pb"], 148 | hacker : [ "chest" ], 149 | commands : [ "cd" , "op" , "tpaccept" , "home" , "back" , "die" , "unsleep" , "land" , "tpr" , "unland"], 150 | logs : [ 151 | "chat" , "chat_" , "jl", //Join & Leave 152 | "bb", "pb", //Break / Place Block 153 | "di" , "kill" , 154 | "die" , "sign" , 155 | "lo" , 156 | "chest" , "tp", "info","ib", 157 | ], 158 | allow_blocks:[ 159 | "minecraft:crafting_table", 160 | "minecraft:smithing_table", 161 | "minecraft:stonecutter_block", 162 | "minecraft:loom", 163 | "minecraft:enchanting_table", 164 | "minecraft:ender_chest", 165 | ], 166 | lock_item :{ 167 | able : false, 168 | }, 169 | info :{ 170 | join_times : 0, 171 | block : false, 172 | ban_time : 0, 173 | score : {}, 174 | }, 175 | config_file : { 176 | title : "", 177 | body : "", 178 | groups : {}, 179 | things : [] 180 | }, 181 | board : { 182 | able : true, 183 | texts : [], 184 | up : false, 185 | name : "", 186 | icon : null 187 | }, 188 | menu : ["欢迎来到主菜单!"], 189 | group :{ 190 | creater : "", 191 | member : [], 192 | message : [], 193 | name : "", 194 | board : "", 195 | pos : [], 196 | id : "", 197 | in : [], 198 | }, 199 | pos : { 200 | owner : "", 201 | di : "", 202 | x : 0, 203 | y : 0, 204 | z : 0, 205 | name : "", 206 | icon : "", 207 | home : false, 208 | }, 209 | land:{ 210 | "id" : "", 211 | "di" : "minecraft:overworld", 212 | "distance" : 0, 213 | "from" : { 214 | x: 0, y: 0, z:0 215 | }, 216 | "to" : { 217 | x: 0, y: 0, z:0 218 | }, 219 | "creater": "", 220 | "group" : [], 221 | "member":[], 222 | "wel" : "", 223 | "name" : "", 224 | "mem_per" : [], 225 | "other_per" : [] 226 | }, 227 | lock_config : { 228 | able : false, 229 | items : [] 230 | }, 231 | good : { 232 | id : "", 233 | state : 0 , 234 | group : "", 235 | title : "", 236 | index : 0, 237 | global_count : 0, 238 | personal_count : 0, 239 | update_type : 0, 240 | update_time : 60, 241 | money : "", 242 | money_item : "minecraft:", 243 | price : 1, 244 | icon : "", 245 | custom_icon : "", 246 | name : "", 247 | description : "", 248 | chest : "", 249 | slot : 0, 250 | item : "minecraft:", 251 | hide : false, 252 | bar : 0, 253 | count : 1, 254 | code : "", 255 | back : false, 256 | type : 9, 257 | last : 0, 258 | updated : 0, 259 | } 260 | } 261 | 262 | 263 | const ui_path = "textures/ui/" 264 | export const ui_icon = { 265 | star : ui_path + "permissions_member_star.png", 266 | sword : "textures/items/iron_sword.png", 267 | slow_ness : ui_path + "slowness_effect.png", 268 | heart : ui_path + "heart_new.png", 269 | key_board : ui_path + "chat_keyboard.png", 270 | stick : "textures/items/stick.png", 271 | stop : "textures/blocks/barrier.png", 272 | land : ui_path + "icon_new.png", 273 | trade : ui_path + "trade_icon.png", 274 | scoreboard : ui_path + "subscription_glyph_color.png", 275 | chat : ui_path + "comment.png", 276 | ok : ui_path + "confirm.png", 277 | craft_table : ui_path + "icon_crafting.png", 278 | rubbish : ui_path + "trash_default.png", 279 | op : ui_path + "op.png", 280 | event : ui_path + "saleribbon.png", 281 | villager : ui_path + "icon_deals.png", 282 | pos:ui_path + "paste.png", 283 | map : ui_path + "icon_map.png", 284 | random : ui_path + "icon_random.png", 285 | group : ui_path + "dressing_room_skins.png", 286 | info : ui_path + "infobulb.png", 287 | copy : ui_path + "copy.png", 288 | up : ui_path + "tooltip_inverted_chevron.png", 289 | down : ui_path + "arrow_down_small.png", 290 | slot : ui_path + "selected_hotbar_slot.png", 291 | back : ui_path + "arrow_dark_left_stretch.png", 292 | server : ui_path + "servers.png", 293 | setting : ui_path + "gear.png", 294 | ping : ui_path + "Ping_Green.png", 295 | content : ui_path + "hanging_sign.png", 296 | brush : ui_path + "text_color_paintbrush.png", 297 | off : ui_path + "Ping_Offline_Red_Dark.png", 298 | system : ui_path + "timer.png", 299 | tip : ui_path + "UpdateGlyph.png", 300 | online : ui_path + "online.png", 301 | share : ui_path + "share_microsoft.png", 302 | go : ui_path + "send_icon.png", 303 | delete : ui_path + "realms_red_x.png", 304 | edit : ui_path + "book_edit_default.png", 305 | more : ui_path + "anvil_icon.png", 306 | add: ui_path + "anvil-plus.png", 307 | compass : "textures/items/compass_item.png", 308 | player : ui_path + "Friend2.png", 309 | clock : "textures/items/clock_item.png", 310 | command : "textures/blocks/command_block_front_mipmap.png", 311 | "sign" : "textures/items/sign.png" , 312 | manager : ui_path + "anvil_icon.png", 313 | die :ui_path + "wither_effect.png", 314 | speed :ui_path + "speed_effect.png", 315 | eye : ui_path + "night_vision_effect.png", 316 | mute : ui_path + "mute_on.png", 317 | "world" : ui_path + "world_glyph_color_2x.png" , 318 | "big" : ui_path + "icon_preview.png", 319 | "water" : ui_path + "water_breathing_effect.png", 320 | lock : ui_path + "icon_lock.png", 321 | } 322 | 323 | export const pictures = { 324 | "world" : ui_path + "world_glyph_color_2x.png" , 325 | "bottle" : ui_path + "achievements.png" , 326 | "chat" : ui_path + "comment.png" , 327 | "star" : ui_path + "filledStar.png" , 328 | "glass" : ui_path + "magnifyingGlass.png" , 329 | "coin" : ui_path + "MCoin.png" , 330 | "gift" : ui_path + "gift_square.png", 331 | "missing" : "textures/misc/missing_texture.png" , 332 | "bed" : "textures/items/bed_red.png" , 333 | "boat" : "textures/items/boat_oak.png" , 334 | "emerald" : "textures/items/emerald.png" , 335 | "endereye" : "textures/items/ender_eye.png" , 336 | "sign" : "textures/items/sign.png" , 337 | "totem" : "textures/items/totem.png" , 338 | "bell" : "textures/items/villagebell.png" , 339 | "wheat" : "textures/items/wheat.png" , 340 | "trident" : "textures/items/trident.png" , 341 | "ore" : "textures/blocks/diamond_ore.png" , 342 | "end" : "textures/blocks/end_stone.png" , 343 | "flower" : "textures/blocks/flower_rose.png" , 344 | "path" : "textures/blocks/grass_path_side.png" , 345 | "snow" : "textures/blocks/grass_side_snowed.png" , 346 | "hay" : "textures/blocks/hay_block_side.png" , 347 | "ice" : "textures/blocks/ice.png" , 348 | "mushroom" : "textures/blocks/mycelium_side.png" , 349 | "rail" : "textures/blocks/rail_normal.png" , 350 | "nether" : "textures/blocks/nether_brick.png" , 351 | "netherrack" : "textures/blocks/netherrack.png" , 352 | "sand" : "textures/blocks/sandstone_smooth.png" , 353 | //V2 354 | "wool" : "textures/blocks/wool_colored_white.png" , 355 | "lamp" : "textures/blocks/redstone_lamp_on.png" , 356 | "mob" : "textures/blocks/mob_spawner.png" , 357 | "tnt" : "textures/blocks/tnt_side.png" , 358 | "bucket" : "textures/items/bucket_water.png" , 359 | "campfire" : "textures/items/campfire.png" , 360 | "chest" : "textures/blocks/chest_front.png" , 361 | 362 | "meat" : "textures/items/beef_cooked.png", 363 | "book" : "textures/items/book_normal.png", 364 | "bow" : "textures/items/bow_standby.png", 365 | "cake" : "textures/items/cake.png", 366 | "ex" : "textures/items/experience_bottle.png", 367 | "rod" : "textures/items/fishing_rod_uncast.png", 368 | "sword" : "textures/items/gold_sword.png", 369 | "shovel" : "textures/items/gold_shovel.png", 370 | "pickaxe" : "textures/items/gold_pickaxe.png", 371 | "axe" : "textures/items/gold_axe.png", 372 | "hoe" : "textures/items/gold_hoe.png", 373 | "kelp" : "textures/items/kelp.png", 374 | "map" : "textures/items/map_filled.png", 375 | "bottle" : "textures/items/potion_bottle_absorption.png", 376 | "trade" : ui_path + "trade_icon.png", 377 | "bed" : "textures/items/bed_red.png", 378 | "boat" : "textures/items/boat_oak.png", 379 | "lantern" : "textures/items/lantern.png", 380 | "commmand" : "textures/blocks/command_block_back_mipmap.png", 381 | } 382 | 383 | export const minecraft = { 384 | sign : [ 385 | "standing_sign", 386 | "spruce_standing_sign", 387 | "birch_standing_sign", 388 | "jungle_standing_sign", 389 | "acacia_standing_sign", 390 | "darkoak_standing_sign", 391 | "mangrove_standing_sign", 392 | "cherry_standing_sign", 393 | "bamboo_standing_sign", 394 | "crimson_standing_sign", 395 | "warped_standing_sign", 396 | "wall_sign", 397 | "spruce_wall_sign", 398 | "" 399 | ] 400 | } 401 | 402 | export const command_list = [ "tppoint","login","Ban","Version","NPC","Npc","land","Fill","tpaccept","reset" , "cd" , "菜单" , "talk" , "私聊" , "tp" , "传送" , "死" , "die", "usf"] 403 | -------------------------------------------------------------------------------- /BehaviourPack/scripts/functions/admin_functions.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USFrameTeam/Unknown-Server-Framework/9adebab5adc9202df560be5ad04ef1c4e305f37c/BehaviourPack/scripts/functions/admin_functions.js -------------------------------------------------------------------------------- /BehaviourPack/scripts/functions/land.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USFrameTeam/Unknown-Server-Framework/9adebab5adc9202df560be5ad04ef1c4e305f37c/BehaviourPack/scripts/functions/land.js -------------------------------------------------------------------------------- /BehaviourPack/scripts/functions/usfApi.js: -------------------------------------------------------------------------------- 1 | //等以后有机会整理一下usf代码 2 | import * as mc from "@minecraft/server" 3 | 4 | class GetMention { 5 | static get_di(id) { 6 | return world.getDimension(id); 7 | }; 8 | 9 | 10 | static get_ban_list() { 11 | return to_array(parse_json(get_data("ban")), []); 12 | }; 13 | 14 | 15 | static get_items(id) { 16 | var all = []; 17 | try { 18 | var items = overworld.runCommand(`strcuture load items.${id} 0 -64 0`); 19 | } catch (err) { 20 | return []; 21 | }; 22 | if (items.successCount === 1 && !un(chest_block)) { 23 | var com = chest_block.getComponent("minecraft:inventory").container; 24 | for (var i = 0; i < com.size; i++) { 25 | all.push(com.getItem(i)); 26 | } 27 | return all; 28 | } 29 | return []; 30 | }; 31 | 32 | 33 | static get_text(id) { 34 | var text = dictionary[id] 35 | if (config.language === 1) { 36 | text = fixed_texts.ZW[id] 37 | } 38 | if (text == undefined) { 39 | text = fixed_texts.ZN[id] 40 | } 41 | if (text == undefined) { 42 | return t.get_text(id, to_number(config.language), 0) 43 | } 44 | return text; 45 | }; 46 | 47 | 48 | static get_player_path(player) { 49 | return `Players/${player.name}` 50 | } 51 | } -------------------------------------------------------------------------------- /BehaviourPack/scripts/md5.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Configurable variables. You may need to tweak these to be compatible with 4 | * the server-side, but the defaults work in most cases. 5 | */ 6 | var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ 7 | var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ 8 | var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ 9 | let lmd5 = {} 10 | 11 | /* 12 | * Perform a simple self-test to see if the VM is working 13 | */ 14 | function md5_vm_test() { 15 | return hex_md5("111111") == "96e79218965eb72c92a549dd5a330112"; 16 | } 17 | 18 | /* 19 | * Calculate the MD5 of an array of little-endian words, and a bit length 20 | */ 21 | function core_md5(x, len) { 22 | /* append padding */ 23 | x[len >> 5] |= 0x80 << ((len) % 32); 24 | x[(((len + 64) >>> 9) << 4) + 14] = len; 25 | 26 | var a = 1732584193; 27 | var b = -271733879; 28 | var c = -1732584194; 29 | var d = 271733878; 30 | 31 | for (var i = 0; i < x.length; i += 16) { 32 | var olda = a; 33 | var oldb = b; 34 | var oldc = c; 35 | var oldd = d; 36 | 37 | a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936); 38 | d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586); 39 | c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); 40 | b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); 41 | a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897); 42 | d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); 43 | c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341); 44 | b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983); 45 | a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); 46 | d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417); 47 | c = md5_ff(c, d, a, b, x[i + 10], 17, -42063); 48 | b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162); 49 | a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); 50 | d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101); 51 | c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290); 52 | b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); 53 | 54 | a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510); 55 | d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632); 56 | c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713); 57 | b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302); 58 | a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691); 59 | d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083); 60 | c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335); 61 | b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848); 62 | a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438); 63 | d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690); 64 | c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961); 65 | b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); 66 | a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467); 67 | d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784); 68 | c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); 69 | b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734); 70 | 71 | a = md5_hh(a, b, c, d, x[i + 5], 4, -378558); 72 | d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463); 73 | c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); 74 | b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556); 75 | a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060); 76 | d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); 77 | c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632); 78 | b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640); 79 | a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174); 80 | d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222); 81 | c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979); 82 | b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189); 83 | a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487); 84 | d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835); 85 | c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520); 86 | b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651); 87 | 88 | a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844); 89 | d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); 90 | c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905); 91 | b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055); 92 | a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); 93 | d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606); 94 | c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523); 95 | b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799); 96 | a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); 97 | d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744); 98 | c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380); 99 | b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); 100 | a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070); 101 | d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379); 102 | c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259); 103 | b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551); 104 | 105 | a = safe_add(a, olda); 106 | b = safe_add(b, oldb); 107 | c = safe_add(c, oldc); 108 | d = safe_add(d, oldd); 109 | } 110 | return Array(a, b, c, d); 111 | 112 | } 113 | 114 | /* 115 | * These functions implement the four basic operations the algorithm uses. 116 | */ 117 | function md5_cmn(q, a, b, x, s, t) { 118 | return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b); 119 | } 120 | function md5_ff(a, b, c, d, x, s, t) { 121 | return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); 122 | } 123 | function md5_gg(a, b, c, d, x, s, t) { 124 | return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); 125 | } 126 | function md5_hh(a, b, c, d, x, s, t) { 127 | return md5_cmn(b ^ c ^ d, a, b, x, s, t); 128 | } 129 | function md5_ii(a, b, c, d, x, s, t) { 130 | return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); 131 | } 132 | 133 | /* 134 | * Calculate the HMAC-MD5, of a key and some data 135 | */ 136 | function core_hmac_md5(key, data) { 137 | var bkey = str2binl(key); 138 | if (bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz); 139 | 140 | var ipad = Array(16), opad = Array(16); 141 | for (var i = 0; i < 16; i++) { 142 | ipad[i] = bkey[i] ^ 0x36363636; 143 | opad[i] = bkey[i] ^ 0x5C5C5C5C; 144 | } 145 | 146 | var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); 147 | return core_md5(opad.concat(hash), 512 + 128); 148 | } 149 | 150 | /* 151 | * Add integers, wrapping at 2^32. This uses 16-bit operations internally 152 | * to work around bugs in some JS interpreters. 153 | */ 154 | function safe_add(x, y) { 155 | var lsw = (x & 0xFFFF) + (y & 0xFFFF); 156 | var msw = (x >> 16) + (y >> 16) + (lsw >> 16); 157 | return (msw << 16) | (lsw & 0xFFFF); 158 | } 159 | 160 | /* 161 | * Bitwise rotate a 32-bit number to the left. 162 | */ 163 | function bit_rol(num, cnt) { 164 | return (num << cnt) | (num >>> (32 - cnt)); 165 | } 166 | 167 | /* 168 | * Convert a string to an array of little-endian words 169 | * If chrsz is ASCII, characters >255 have their hi-byte silently ignored. 170 | */ 171 | function str2binl(str) { 172 | var bin = Array(); 173 | var mask = (1 << chrsz) - 1; 174 | for (var i = 0; i < str.length * chrsz; i += chrsz) 175 | bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32); 176 | return bin; 177 | } 178 | 179 | /* 180 | * Convert an array of little-endian words to a string 181 | */ 182 | function binl2str(bin) { 183 | var str = ""; 184 | var mask = (1 << chrsz) - 1; 185 | for (var i = 0; i < bin.length * 32; i += chrsz) 186 | str += String.fromCharCode((bin[i >> 5] >>> (i % 32)) & mask); 187 | return str; 188 | } 189 | 190 | /* 191 | * Convert an array of little-endian words to a hex string. 192 | */ 193 | function binl2hex(binarray) { 194 | var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; 195 | var str = ""; 196 | for (var i = 0; i < binarray.length * 4; i++) { 197 | str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) + 198 | hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF); 199 | } 200 | return str; 201 | } 202 | 203 | /* 204 | * Convert an array of little-endian words to a base-64 string 205 | */ 206 | function binl2b64(binarray) { 207 | var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 208 | var str = ""; 209 | for (var i = 0; i < binarray.length * 4; i += 3) { 210 | var triplet = (((binarray[i >> 2] >> 8 * (i % 4)) & 0xFF) << 16) 211 | | (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8) 212 | | ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF); 213 | for (var j = 0; j < 4; j++) { 214 | if (i * 8 + j * 6 > binarray.length * 32) str += b64pad; 215 | else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F); 216 | } 217 | } 218 | return str; 219 | } 220 | 221 | 222 | /* 223 | * These are the functions you'll usually want to call 224 | * They take string arguments and return either hex or base-64 encoded strings 225 | */ 226 | lmd5.hex_md5 = function (s) { return binl2hex(core_md5(str2binl(s), s.length * chrsz)); } 227 | lmd5.b64_md5 = function (s) { return binl2b64(core_md5(str2binl(s), s.length * chrsz)); } 228 | lmd5.str_md5 = function (s) { return binl2str(core_md5(str2binl(s), s.length * chrsz)); } 229 | lmd5.hex_hmac_md5 = function (key, data) { return binl2hex(core_hmac_md5(key, data)); } 230 | lmd5.b64_hmac_md5 = function (key, data) { return binl2b64(core_hmac_md5(key, data)); } 231 | lmd5.str_hmac_md5 = function (key, data) { return binl2str(core_hmac_md5(key, data)); } 232 | 233 | export default lmd5 -------------------------------------------------------------------------------- /BehaviourPack/scripts/text.js: -------------------------------------------------------------------------------- 1 | 2 | export var texts = { 3 | "score.bb" : "破坏方块", 4 | "score.pb" : "放置方块", 5 | "score.login" : "每日登录游戏", 6 | "score.pvp" : "PVP", 7 | "score.kill" : "杀怪", 8 | "score.hit" : "攻击生物", 9 | 10 | //0.6.20新增 11 | "input" : "输入内容", 12 | "back" : "返回", 13 | 14 | "bb" : "破坏方块", 15 | "pb" : "放置方块(开启前需要开启 与方块交互)", 16 | "ib" : "与方块交互", 17 | "ie" : "与生物交互", 18 | 19 | "unsleep" : "§e当前未入睡的玩家:", 20 | "home.none" : "§e[传送系统]当前无Home传送点", 21 | "home.back" : `§e[传送系统]欢迎回到Home坐标点`, 22 | "home.select" : "选择Home点", 23 | "home.select2" : "选择你的Home点,点击立即传送.", 24 | "tp.fail" : "无请求或玩家不存在!", 25 | "board.diable" : "§e留言板功能未开启", 26 | "board" : "留言板", 27 | "board.go" : "留言", 28 | "board.content" : "留言内容", 29 | "board.new" : "新增留言", 30 | "board.clear" : "清空留言板", 31 | "sign.tip" : "§e双击告示牌以编辑", 32 | "talk.stop" : `你已被禁言!剩余[0]s`, 33 | "talk.public" : "私聊玩家已离线,当前已切换为公共聊天", 34 | "talk.public.group" : "聊群不存在,当前已切换为公共聊天", 35 | "point.get" : "已选取坐标点", 36 | 37 | "group.init" : "群组 - [0]", 38 | "group.name" : "群组名:", 39 | "group.id" : "群组ID:", 40 | "group.announcement" : "公告:", 41 | "group.owner" : "群主:", 42 | "group.member" : "群员:", 43 | "group.his" : "历史消息", 44 | 45 | "mobGriefing" : "生物破坏", 46 | "keepInventory" : "死亡不掉落", 47 | "tntExplodes" : "TNT爆炸", 48 | "showCoordinates" : "显示坐标", 49 | "pvp" : "PVP", 50 | "doMobSpawning" : "生物生成", 51 | "doImmediateRespawn" : "立即重生", 52 | "commandBlocksEnabled" : "允许命令方块", 53 | 54 | //---------------------- 55 | 56 | "follow.tip" : "跟踪开始后,你可以使用+op命令退出跟踪.", 57 | 58 | "action.land" : "空手[点击]/[右键]方块以选取坐标点\n输入+land 或 打开主菜单创建领地\n潜行时输入+land 或 打开主菜单取消创建", 59 | 60 | "commands.cd" : "打开主菜单", 61 | "commands.op" : "打开管理界面", 62 | "commands.tpaccept" : "玩家互传", 63 | "commands.home" : "Home点传送", 64 | "commands.back" : "返回死亡点", 65 | "commands.die" : "自杀", 66 | "commands.land" : "创建领地", 67 | "commands.unland" : "取消创建领地", 68 | "commands.unsleep" : "显示未入睡玩家", 69 | "commands.tpr" : "随机传送", 70 | 71 | "log.chat" : "聊天记录(Chat.log)", 72 | "log.chat_" : "聊天显示在日志服务器控制台", 73 | "log.lo" : "记录玩家位置/每60s", 74 | "log.die" : "玩家死亡记录", 75 | "log.kill" : "玩家击杀记录", 76 | "log.jl" : "玩家进出游戏记录", 77 | "log.info" : "玩家信息", 78 | "log.chest" : "容器记录", 79 | "log.pb" : "放置方块记录", 80 | "log.bb" : "破坏方块记录", 81 | "log.tp" : "USF内置传送记录", 82 | "log.di" : "维度改变记录", 83 | "log.ib" : "与方块交互", 84 | "log.info" : "玩家信息(Info.log)", 85 | "log.sign" : "告示牌更改记录(Sign.log)", 86 | 87 | "overworld.name" : "§b主世界§r", 88 | "end.name" : "§5末地§r", 89 | "nether.name" : "§4下界§r", 90 | "Log/start": "USF插件已启动!", 91 | "Log/reload_all": "USF加载完成!", 92 | "Log/watchdog" : "性能监视器:@0", 93 | 94 | "land.4" : "§e[管理员]§r", 95 | "land.3" : "§e[领地主]§r", 96 | "land.2" : "§e[领地成员]§r", 97 | "land.1" : "§e[群组成员]§r", 98 | "land.0" : "§e[访客]§r", 99 | "land.two" : "未选择两个坐标点", 100 | "about" : ["服务器信息§?Something about the Server"], 101 | "board_text" : ["欢迎来到服务器§?Welcome to this Server!"], 102 | "menu": ["欢迎来到主菜单§?Welcome to the Menu"], 103 | "helps" : ["你好,欢迎使用帮助页面§?Hi,welcome to Help Page","命令使用大全:§?Plugin Commands:","cd,主菜单:打开主菜单§?cd : Open the menu","talk,私聊:打开私聊界面§?talk : open Private chat Page","die,死:立即自杀§?Kill yourself immediately","tpaccept : 同意tpa请求§?tpaccept : Accept others' tp request"], 104 | 105 | "tip.init":"欢迎使用USF,当前插件未初始化!\n在聊天栏输入§b/function get_owner§r获取§6超级管理员§r\n或在服务器后台输入§n/scriptevent usf:get_owner 玩家名§r获取\n注意:单人存档的插件OP和服务器的插件OP无法互通,请先上传到服务器再初始化!", 106 | 107 | "data/die" : "死亡记录", 108 | "data/break" : "挖掘方块量", 109 | "data/place" : "放置方块量", 110 | "data/join" : "加入游戏次数", 111 | "data/chat" : "聊天数", 112 | "data/health" : "玩家(带Health标签的实体)生命值", 113 | "data/x" : "当前位置x轴", 114 | "data/y" : "当前位置y轴", 115 | "data/z" : "当前位置z轴", 116 | "data/di" : "当前维度(0=主世界 1=下界 2=末地 3=其他)", 117 | "data/sneak" : "玩家潜行时间(0=未潜行)(1秒=10)", 118 | "data/slot" : "玩家选择的快捷栏", 119 | "data/health_listen" : "生命值监听", 120 | 121 | 122 | "tran_text" : "\n此内容启用了转义,输入以下内容会自动转换\n/worldspawn >> 世界出生点\n/pos >>玩家当前位置\n/§rlist >>玩家列表\n/§rname >>玩家名称\n/§ralltime >>世界运行总时间(秒)\n/§rboard.记分版ID.score >>玩家记分版分数\n/§rdimension >>玩家所在维度\n/tag >>聊天头衔\n/health >>玩家生命值\n/n >> 换行\n/unsleep >>未入睡玩家\n/worldspawn >>世界出生点\n/respawn >> 玩家出生点\n/join >>玩家进入游戏次数\n/items >> 掉落物数量\n/date >>年.月.日\n/time >>时.分.秒\n/level >>等级\nvar()>>显示全局变量,括号内输入变量名", 123 | "tran_text_" : "\n此内容启用了转义,输入以下内容会自动转换\n/worldspawn >> 世界出生点\n/§rlist >>玩家列表\n/§ralltime >>世界运行总时间(秒)\n/n >> 换行\n/unsleep >>未入睡玩家\n/worldspawn >>世界出生点\n/items >> 掉落物数量\n/date >>年.月.日\n/time >>时.分.秒\nvar()>>显示全局变量,括号内输入变量名", 124 | "tran_mess" : "\n/§rsender >>发送者名称\n/§rtag >>聊天头衔/§rtext >>聊天内容", 125 | 126 | "Scriptevent/error/NotFound" : "[USF]你所找的命令\"@0\"不存在", 127 | 128 | "Weather.Rain.Thunder" : "§e天气转为:雷雨", 129 | "Weather.Rain" : "下雨", 130 | "Weather.Thunder" : "雷暴", 131 | "Weather.Clear" : "晴天", 132 | 133 | "tp/callback" : "", 134 | 135 | "framework/Closed" : "插件状态 [开启|关闭]", 136 | 137 | "OP/Enable" : "OP [否|是]", 138 | "OP/Player" : "玩家管理功能", 139 | "OP/BanList" : "封禁列表管理", 140 | "OP/Score" : "记分版修改", 141 | "OP/BagCheck" : "背包检查", 142 | "OP/Setting" : "修改插件设置", 143 | 144 | "slot/0" : "物品栏1", 145 | "slot/1" : "物品栏2", 146 | "slot/2" : "物品栏3", 147 | "slot/3" : "物品栏4", 148 | "slot/4" : "物品栏5", 149 | "slot/5" : "物品栏6", 150 | "slot/6" : "物品栏7", 151 | "slot/7" : "物品栏8", 152 | "slot/8" : "物品栏9", 153 | 154 | 155 | "Pictures.world" : "地球", 156 | "Pictures.bottle" : "药水瓶", 157 | "Pictures.chat" : "聊天框", 158 | "Pictures.star" : "星星", 159 | "Pictures.glass" : "放大镜", 160 | "Pictures.coin" : "金币", 161 | "Pictures.missing" : "材质丢失", 162 | "Pictures.bed" : "床", 163 | "Pictures.boat" : "船", 164 | "Pictures.endereye" : "末影之眼", 165 | "Pictures.emerald" : "绿宝石", 166 | "Pictures.trident" : "三叉戟", 167 | "Pictures.wheat" : "小麦", 168 | "Pictures.bell" : "钟", 169 | "Pictures.sign" : "告示牌", 170 | "Pictures.totem" : "不死图腾", 171 | "Pictures.ore" : "钻石矿", 172 | "Pictures.end" : "末地石", 173 | "Pictures.flower" : "花", 174 | "Pictures.path" : "草径", 175 | "Pictures.snow" : "雪", 176 | "Pictures.hay" : "干草块", 177 | "Pictures.gift" : "礼物", 178 | "Pictures.ice" : "冰", 179 | "Pictures.mushroom" : "菌丝", 180 | "Pictures.sand" : "沙石", 181 | "Pictures.netherrack" : "下界岩", 182 | "Pictures.nether" : "下界砖块", 183 | "Pictures.rail" : "铁路", 184 | "Pictures.wool" : "羊毛", 185 | "Pictures.tnt" : "TNT", 186 | "Pictures.lamp" : "红石灯", 187 | "Pictures.mob" : "刷怪笼", 188 | "Pictures.campfire" : "篝火", 189 | "Pictures.bucket" : "水桶", 190 | "Pictures.chest" : "箱子", 191 | 192 | "Pictures.meat" : "肉", 193 | "Pictures.book" : "书本", 194 | "Pictures.bow" : "弓", 195 | "Pictures.cake" : "蛋糕", 196 | "Pictures.ex" : "经验瓶", 197 | "Pictures.rod" : "钓鱼竿", 198 | "Pictures.sword" : "剑", 199 | "Pictures.shovel" : "铲", 200 | "Pictures.pickaxe" : "镐", 201 | "Pictures.axe" : "斧", 202 | "Pictures.hoe" : "锄", 203 | "Pictures.kelp" : "海带", 204 | "Pictures.map" : "地图", 205 | "Pictures.bottle" : "水瓶", 206 | "Pictures.trade" : "交易", 207 | "Pictures.bed" : "红床", 208 | "Pictures.boat" : "船", 209 | "Pictures.lantern" : "灯笼", 210 | "Pictures.commmand" : "命令方块", 211 | 212 | "PlayerChoise/title":"玩家选择器" 213 | } 214 | 215 | export var texts_ZW = { 216 | "score.bb" : "破壞方塊", 217 | "score.pb" : "放置方塊", 218 | "score.login" : "每日登錄遊戲", 219 | "score.pvp" : "PVP", 220 | "score.kill" : "殺怪", 221 | "score.hit" : "攻擊生物", 222 | "follow.tip" : "跟踪开始后,你可以使用+op命令退出跟踪.", 223 | "action.land" : "空手[點擊]/[右鍵]方塊以選取坐標點\n輸入+land創建領地\n打開主菜單以取消創建", 224 | "commands.cd" : "打開主菜單", 225 | "commands.op" : "打開管理界面", 226 | "commands.tpaccept" : "玩家互傳", 227 | "commands.home" : "Home點傳送", 228 | "commands.back" : "返回死亡點", 229 | "commands.die" : "自殺", 230 | "commands.land" : "領地設置", 231 | "commands.unsleep" : "顯示未入睡玩家", 232 | "log.chat" : "聊天記錄(Chat.log)", 233 | "log.chat_" : "聊天顯示在日誌伺服器控制台", 234 | "log.lo" : "記錄玩家位置/每60s", 235 | "log.die" : "玩家死亡記錄", 236 | "log.kill" : "玩家擊殺記錄", 237 | "log.jl" : "玩家進出遊戲記錄", 238 | "log.chest" : "容器記錄", 239 | "log.pb" : "放置方塊記錄", 240 | "log.bb" : "破壞方塊記錄", 241 | "log.tp" : "USF內置傳送記錄", 242 | "log.di" : "維度改變記錄", 243 | "log.sign" : "告示牌更改記錄(Sign.log)", 244 | "overworld.name" : "§b主世界§r", 245 | "end.name" : "§5末地§r", 246 | "nether.name" : "§4下界§r", 247 | "Log/start": "USF插件已啟動!", 248 | "Log/reload_all": "USF加載完成!", 249 | "Log/watchdog" : "性能監視器:@0", 250 | "land.4" : "§e[管理員]§r", 251 | "land.3" : "§e[領地主]§r", 252 | "land.2" : "§e[領地成員]§r", 253 | "land.1" : "§e[群組成員]§r", 254 | "land.0" : "§e[訪客]§r", 255 | "land.two" : "未選擇兩個坐標點", 256 | "about" : ["伺服器資訊§?Something about the Server"], 257 | "board_text" : ["歡迎來到伺服器§?Welcome to this Server!"], 258 | "menu": ["歡迎來到主菜單§?Welcome to the Menu"], 259 | "helps" : ["你好,歡迎使用幫助頁面§?Hi,welcome to Help Page","命令使用大全:§?Plugin Commands:","cd,主菜單:打開主菜單§?cd : Open the menu","talk,私聊:打開私聊界面§?talk : open Private chat Page","die,死:立即自殺§?Kill yourself immediately","tpaccept : 同意tpa請求§?tpaccept : Accept others' tp request"], 260 | "tip.init":"歡迎使用USF,當前插件未初始化!\n在聊天欄輸入§b/function get_owner§r獲取§6超級管理員§r\n或在伺服器後臺輸入§n/scriptevent usf:get_owner 玩家名§r獲取", 261 | "data/die" : "死亡記錄", 262 | "data/break" : "挖掘方塊量", 263 | "data/place" : "放置方塊量", 264 | "data/join" : "加入遊戲次數", 265 | "data/chat" : "聊天數", 266 | "data/health" : "玩家(帶Health標籤的實體)生命值", 267 | "data/x" : "當前位置x軸", 268 | "data/y" : "當前位置y軸", 269 | "data/z" : "當前位置z軸", 270 | "data/di" : "當前維度(0=主世界 1=下界 2=末地 3=其他)", 271 | "data/sneak" : "玩家潛行時間(0=未潛行)(1秒=10)", 272 | "data/slot" : "玩家選擇的快捷欄", 273 | "data/health_listen" : "生命值監聽", 274 | "tran_text" : "\n此內容啟用了轉義,輸入以下內容會自動轉換\n/worldspawn >> 世界出生點\n/pos >>玩家當前位置\n/§rlist >>玩家列表\n/§rname >>玩家名稱\n/§ralltime >>世界運行總時間(秒)\n/§rboard.計分板ID.score >>玩家計分板分數\n/§rboard.計分板ID.name >>該計分板顯示名稱\n/§rdimension >>玩家所在維度\n/tag >>聊天頭銜\n/health >>玩家生命值\n/n >> 換行\n/unsleep >>未入睡玩家\n/worldspawn >>世界出生點\n/respawn >> 玩家出生點\n/join >>玩家進入遊戲次數\n/items >> 掉落物數量\n/date >>年.月.日\n/time >>時.分.秒\n/level >>等級", 275 | "tran_text_" : "\n此內容啟用了轉義,輸入以下內容會自動轉換\n/worldspawn >> 世界出生點\n/§rlist >>玩家列表\n/§ralltime >>世界運行總時間(秒)\n/§rboard.計分板ID.name >>該計分板顯示名稱\n/n >> 換行\n/unsleep >>未入睡玩家\n/worldspawn >>世界出生點\n/items >> 掉落物數量\n/date >>年.月.日\n/time >>時.分.秒", 276 | "tran_mess" : "\n/§rsender >>發送者名稱\n/§rtag >>聊天頭銜/§rtext >>聊天內容", 277 | "Scriptevent/error/NotFound" : "[USF]你所找的命令\"@0\"不存在", 278 | "Weather.Rain.Thunder" : "§e天氣轉為:雷雨", 279 | "Weather.Rain" : "下雨", 280 | "Weather.Thunder" : "雷暴", 281 | "Weather.Clear" : "晴天", 282 | "tp/callback" : "", 283 | "framework/Closed" : "插件狀態 [開啟|關閉]", 284 | "OP/Enable" : "OP [否|是]", 285 | "OP/Player" : "玩家管理功能", 286 | "OP/BanList" : "封禁列表管理", 287 | "OP/Score" : "計分板修改", 288 | "OP/BagCheck" : "背包檢查", 289 | "OP/Setting" : "修改插件設置", 290 | "slot/0" : "物品欄1", 291 | "slot/1" : "物品欄2", 292 | "slot/2" : "物品欄3", 293 | "slot/3" : "物品欄4", 294 | "slot/4" : "物品欄5", 295 | "slot/5" : "物品欄6", 296 | "slot/6" : "物品欄7", 297 | "slot/7" : "物品欄8", 298 | "slot/8" : "物品欄9", 299 | "Pictures.world" : "地球", 300 | "Pictures.bottle" : "藥水瓶", 301 | "Pictures.chat" : "聊天框", 302 | "Pictures.star" : "星星", 303 | "Pictures.glass" : "放大鏡", 304 | "Pictures.coin" : "金幣", 305 | "Pictures.missing" : "材質丟失", 306 | "Pictures.bed" : "床", 307 | "Pictures.boat" : "船", 308 | "Pictures.endereye" : "末影之眼", 309 | "Pictures.emerald" : "綠寶石", 310 | "Pictures.trident" : "三叉戟", 311 | "Pictures.wheat" : "小麥", 312 | "Pictures.bell" : "鐘", 313 | "Pictures.sign" : "告示牌", 314 | "Pictures.totem" : "不死圖騰", 315 | "Pictures.ore" : "鑽石礦", 316 | "Pictures.end" : "末地石", 317 | "Pictures.flower" : "花", 318 | "Pictures.path" : "草徑", 319 | "Pictures.snow" : "雪", 320 | "Pictures.hay" : "乾草塊", 321 | "Pictures.ice" : "冰", 322 | "Pictures.mushroom" : "菌絲", 323 | "Pictures.sand" : "沙石", 324 | "Pictures.netherrack" : "下界岩", 325 | "Pictures.nether" : "下界磚塊", 326 | "Pictures.rail" : "鐵路", 327 | "Pictures.wool" : "羊毛", 328 | "Pictures.tnt" : "TNT", 329 | "Pictures.lamp" : "紅石燈", 330 | "Pictures.mob" : "刷怪籠", 331 | "Pictures.campfire" : "營火", 332 | "Pictures.bucket" : "水桶", 333 | "Pictures.chest" : "箱子", 334 | "Pictures.meat" : "肉", 335 | "Pictures.book" : "書本", 336 | "Pictures.bow" : "弓", 337 | "Pictures.cake" : "蛋糕", 338 | "Pictures.ex" : "經驗瓶", 339 | "Pictures.rod" : "釣魚竿", 340 | "Pictures.sword" : "劍", 341 | "Pictures.shovel" : "鏟", 342 | "Pictures.pickaxe" : "鎬", 343 | "Pictures.axe" : "斧", 344 | "Pictures.hoe" : "鋤", 345 | "Pictures.kelp" : "海帶", 346 | "Pictures.map" : "地圖", 347 | "Pictures.bottle" : "水瓶", 348 | "PlayerChoise/title":"玩家選擇器" 349 | 350 | } 351 | 352 | export function get_text(id,lang){ 353 | if(is_string(id)){ 354 | var text = undefined 355 | if(lang === 1){ 356 | text = texts_ZW[id] 357 | } 358 | 359 | if(text == undefined){ 360 | text = texts[id] 361 | } 362 | 363 | return is_string(text) ? text : id 364 | } 365 | return id 366 | } 367 | 368 | function is_string(v){ 369 | return typeof(v) == "string" ? true : false 370 | } -------------------------------------------------------------------------------- /BehaviourPack/scripts/ui.js: -------------------------------------------------------------------------------- 1 | /* USF V2(0.6.10+) UI系统 2 | 版权©归 EarthDLL所有 3 | 开源代码,二次传播、修改无需同意 4 | */ 5 | 6 | import { system } from "@minecraft/server"; 7 | import { ActionFormData, 8 | MessageFormData, 9 | ModalFormData, 10 | ActionFormResponse 11 | } from "@minecraft/server-ui"; 12 | import {get_text} from "./text.js" 13 | 14 | function to_array(value , none = []){ 15 | return Array.isArray(value) ? value : none 16 | } 17 | 18 | function to_string(value , none = ""){ 19 | return typeof(value) == "string" ? value : none 20 | } 21 | 22 | function array2string(array = [] , none = ""){ 23 | if(is_string(array)){return array} 24 | else{ 25 | if(is_array(array)){ 26 | var text = "" 27 | for(var cf of array){ 28 | text += "\n" + cf 29 | } 30 | return text.slice(1) 31 | } 32 | } 33 | return none 34 | } 35 | 36 | function array_get(arr , index , none = ""){ 37 | if(arr.length > index){ 38 | return arr[index] 39 | } 40 | return none 41 | } 42 | 43 | function is_string(v ){ 44 | return typeof(v) == "string" ? true : false 45 | } 46 | 47 | function is_object(v ){ 48 | return typeof(v) == "object" ? true : false 49 | } 50 | 51 | function is_array(v ){ 52 | return Array.isArray(v) 53 | } 54 | 55 | export function btnBar(){ 56 | 57 | this.title = "" 58 | this.body = "" 59 | this.btns = [] 60 | this.busy = function() {} 61 | this.busy_wait = 1 62 | this.cancel = function(){} 63 | 64 | this.ui = new ActionFormData() 65 | .title(this.title).body(this.body) 66 | 67 | 68 | this.show = function(player){ 69 | this.ui = this.ui.title(this.title) 70 | 71 | var body = this.body 72 | if(is_array(body)){ 73 | body = array2string(body) 74 | } 75 | this.ui = this.ui.body(body) 76 | 77 | for(var cf of this.btns){ 78 | 79 | var icon = null 80 | if(is_string(cf.icon)){ 81 | icon = cf.icon 82 | } 83 | 84 | this.ui = this.ui.button(to_string(cf.text),icon) 85 | } 86 | 87 | this.show_out(player) 88 | } 89 | 90 | this.show_out = function(player){ 91 | this.ui.show(player).then((result) => { 92 | if(result.canceled){ 93 | if(result.cancelationReason === "UserClosed"){ 94 | this.cancel() 95 | } 96 | else{ 97 | if(typeof(this.busy) !== "function"){ 98 | system.runTimeout(()=>{ 99 | this.show_out(player) 100 | },this.busy_wait) 101 | } 102 | else{ 103 | this.busy() 104 | } 105 | } 106 | }else{ 107 | const selectedIndex = result.selection; 108 | if ( 109 | selectedIndex >= 0 && 110 | selectedIndex < this.btns.length && 111 | typeof this.btns[selectedIndex]?.func === "function" 112 | ) { 113 | const { func, op } = this.btns[selectedIndex]; 114 | func(op); 115 | } else { 116 | console.error("无效的按钮选择:", selectedIndex); 117 | } 118 | } 119 | }) 120 | } 121 | } 122 | 123 | export function infoBar(){ 124 | 125 | this.ui = new ModalFormData() 126 | .title("") 127 | 128 | this.title = "" 129 | this.busy = function(){} 130 | this.busy_wait = 1 131 | this.cancel = function(){} 132 | this.things = [] 133 | this.back = function(result){} 134 | 135 | 136 | this.match = function (array){ 137 | if(is_array(array) && this.things.length > 0){ 138 | this.things[this.things.length - 1].match = array 139 | } 140 | } 141 | this.options = function( id = "" , text = "" , options = [""] , value = 0){ 142 | var input = { 143 | "type" : "options", 144 | "text" : text, 145 | "id" : id, 146 | "options" : options, 147 | "value" : value 148 | } 149 | this.things.push(input) 150 | } 151 | this.input = function( id = "" ,text = "" , place = "" , value = ""){ 152 | var input = { 153 | "type" : "input", 154 | "text" : text, 155 | "id" : id, 156 | "place" : place, 157 | "value" : value 158 | } 159 | this.things.push(input) 160 | } 161 | this.toggle = function( id = "" ,text = "" , value = false){ 162 | var input = { 163 | "type" : "toggle", 164 | "text" : text, 165 | "id" : id, 166 | "value" : value 167 | } 168 | this.things.push(input) 169 | } 170 | this.range = function(id = "", text = "", min = 0, max = 1, step = 1, value = 0) { 171 | const input = { 172 | type: "range", 173 | text: text, 174 | id: id, 175 | min: min, 176 | max: max, 177 | step: Math.max(1, step), // 步长至少为1 178 | value: Math.max(min, Math.min(value, max)) // 确保默认值在范围内 179 | }; 180 | this.things.push(input); 181 | }; 182 | 183 | this.show = function(player,call_back){ 184 | this.back = call_back 185 | this.ui = this.ui.title(this.title) 186 | 187 | for(var cf of this.things){ 188 | switch(cf.type){ 189 | case "toggle": 190 | this.ui = this.ui.toggle(cf.text,{ defaultValue: cf.value }) 191 | break; 192 | case "input": 193 | this.ui = this.ui.textField(cf.text,cf.place,{ defaultValue: cf.value }) 194 | break; 195 | case "range": 196 | this.ui = this.ui.slider(cf.text,cf.min,cf.max, 197 | { 198 | step: cf.step, 199 | defaultValue: cf.value } 200 | ) 201 | break; 202 | case "options": 203 | this.ui = this.ui.dropdown(cf.text, cf.options, { defaultIndex: { defaultValue: cf.value } }) 204 | break; 205 | } 206 | } 207 | this.show_out(player) 208 | } 209 | 210 | this.show_out = function(player){ 211 | this.ui.show(player).then((result) => { 212 | if(result.canceled){ 213 | if(result.cancelationReason === "UserClosed"){ 214 | this.cancel() 215 | } 216 | else{ 217 | if(typeof(this.busy) !== "function"){ 218 | system.runTimeout(()=>{ 219 | this.show_out(player) 220 | },this.busy_wait) 221 | } 222 | else{ 223 | this.busy() 224 | } 225 | } 226 | }else{ 227 | var object = {} 228 | for(var cf=0; cf this.things[cf].max){ 237 | data = this.things[cf].min 238 | } 239 | } 240 | if(object[this.things[cf].id] === undefined){ 241 | object[this.things[cf].id] = data 242 | } 243 | else{ 244 | if(is_array(object[this.things[cf].id])){ 245 | object[this.things[cf].id].push(data) 246 | } 247 | else{ 248 | object[this.things[cf].id] = [object[this.things[cf].id] , data] 249 | } 250 | } 251 | } 252 | 253 | this.back(object) 254 | } 255 | }) 256 | } 257 | } 258 | 259 | export function arrayEditor(){ 260 | this.back = function(){} 261 | this.array = [] 262 | this.tran = false 263 | this.look = ()=>{ 264 | return this.array 265 | } 266 | 267 | this.edit = function(player,array){ 268 | this.array = array 269 | this.show(player,array) 270 | } 271 | 272 | this.show = function(player,array){ 273 | var ui = new infoBar() 274 | ui.title = "多行文本编辑器" 275 | ui.cancel = ()=>{ 276 | this.back() 277 | } 278 | ui.toggle("look","预览:\n"+array2string(this.look()),true) 279 | for(var i=0;i < array.length;i++){ 280 | ui.input("texts",`行${i+1}`,"输入内容(无内容则删除)",array[i]) 281 | } 282 | if(this.tran){ 283 | ui.toggle("look",get_text("tran_text"),true) 284 | } 285 | ui.range("add","要添加的行数",0,10,1,0) 286 | ui.toggle("finish","结束编辑",false) 287 | ui.show(player,(r)=>{ 288 | var texts = r.texts 289 | if(is_string(texts)){ 290 | texts = [texts] 291 | } 292 | if(texts === undefined){ 293 | texts = [] 294 | } 295 | array.length = 0 296 | for(var i=0;i 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . -------------------------------------------------------------------------------- /LogServer/LogServer.json: -------------------------------------------------------------------------------- 1 | { 2 | "address" : "127.0.0.1", 3 | "port" : 1024 4 | } -------------------------------------------------------------------------------- /LogServer/Main.js: -------------------------------------------------------------------------------- 1 | const readline = require('readline'); 2 | const fs = require("fs"); 3 | const process = require("process"); 4 | var http = require('http'); 5 | 6 | var config = undefined 7 | 8 | function get_time(){ 9 | var date = new Date() 10 | return `[${date.getMonth()+1}.${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}]` 11 | } 12 | 13 | function log(text){ 14 | console.log(`${get_time()}${text}`) 15 | } 16 | 17 | function get_date(){ 18 | var date = new Date() 19 | return `${date.getFullYear()}.${date.getMonth()+1}.${date.getDate()}` 20 | } 21 | 22 | try{ 23 | var data = fs.readFileSync('./LogServer.json').toString() 24 | config = JSON.parse(data) 25 | }catch(err){ 26 | log("无法读取LogServer.json文件,即将退出程序...") 27 | process.exit() 28 | } 29 | 30 | const rl = readline.createInterface({ 31 | input: process.stdin, 32 | output: process.stdout 33 | }); 34 | 35 | rl.on('line', (text) => { 36 | if(text === "stop"){ 37 | log("退出日志程序!") 38 | process.exit() 39 | } 40 | }); 41 | 42 | var server = http.createServer(function (req, res) { 43 | res.statusCode = 200; 44 | res.setHeader('Content-Type', 'text/plain'); 45 | res.end("usf"); 46 | 47 | var data = req.headers.usf 48 | try{ 49 | data = JSON.parse(data) 50 | }catch(err){} 51 | 52 | if(typeof(data) === "object"){ 53 | data.text = decodeURI(data.text) 54 | data.path = decodeURI(data.path) 55 | switch(data.type){ 56 | case "log": 57 | var path = "./Log/" + get_date() + "/" + data.path + ".log" 58 | fs.mkdirSync(path.slice(0,path.lastIndexOf("/")),{ recursive: true }) 59 | fs.writeFile(path,get_time() + data.text + "\n",{ 60 | flag : "a" 61 | },(err)=>{ 62 | if(err != null){ 63 | log(`Can't Record:\nPath:${path}\nText:${data.text}`) 64 | } 65 | }) 66 | break 67 | case "print": 68 | log(data.text) 69 | break 70 | } 71 | } 72 | }) 73 | 74 | server.listen(config.port,config.address,()=>{ 75 | log("日志服务器已搭建完成!") 76 | }); 77 | -------------------------------------------------------------------------------- /LogServer/permissions.json: -------------------------------------------------------------------------------- 1 | { 2 | "allowed_modules": [ 3 | "@minecraft/server-gametest", 4 | "@minecraft/server", 5 | "@minecraft/server-ui", 6 | "@minecraft/server-admin", 7 | "@minecraft/server-editor", 8 | "@minecraft/server-net" 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /LogServer/start.cmd: -------------------------------------------------------------------------------- 1 | chcp 65001 2 | PowerShell -Command "node Main.js" -------------------------------------------------------------------------------- /LogServer/start.sh: -------------------------------------------------------------------------------- 1 | node ./Main.js -------------------------------------------------------------------------------- /LogServer/使用方法.txt: -------------------------------------------------------------------------------- 1 | USF V2 服务器日志功能使用方法: 2 | 3 | 提醒:该功能只能用于BDS服务端!存档与Realm无法使用 4 | 5 | 一、前置准备 6 | 2.网上搜索NodeJS并下载系统对应版本 7 | (Windows : https://nodejs.org/dist/v20.11.0/node-v20.11.0-x64.msi)(64位系统) 8 | (Linux : https://nodejs.org/dist/v20.11.0/node-v20.11.0-linux-x64.tar.xz)(X86系统)(其他类型的系统自行前往官网) 9 | 3.安装NodeJS 10 | (Windows:双击打开安装包即可安装) 11 | (Linux:见https://blog.csdn.net/qq_45830276/article/details/126022778) 12 | 13 | 二、插件准备 14 | 1.进入服务器,打开服务器设置页面,填写好插件地址(一般不做修改),选择需要记录的日志 15 | 2.关闭服务器 16 | 3.将目录下的permissions.json覆盖掉BDS目录\config\default下的permissions.json 17 | 4.打开服务器存档文件夹 > behaviour_packs > (USF对应的文件夹,一半是"无名氏B") 18 | 里面有 manifest.json 和 manifestR.json 两个文件夹 19 | 将 manifest.json 删除 , 将manifestR.json改名为manifest.json(即用manifestR.json替换manifest.json) 20 | (每次更新插件,您都需要做这一步) 21 | 22 | 三、启动日志服务器 23 | 1.任意处新建一个文件夹,将Main.js和LogServer.json文件拖进去 24 | 2.启动日志服务器(确保已安装nodejs) 25 | Windows : 将start.cmd也拉入文件夹,双击cmd文件即可启动 26 | Linux : 将start.sh也拉入文件夹,运行该文件即可启动 27 | 3.启动BDS即可 28 | 29 | 关闭服务器:输入stop,回车,即可 30 | 日志保存在文件夹的Log文件夹内 31 | 32 | 33 | 现在推荐使用USFLog Plus,minebbs可以搜到 -------------------------------------------------------------------------------- /README(English).md: -------------------------------------------------------------------------------- 1 | UnknowServerFramework (USF) 2 | 3 | Based on the original Minecraft Bedrock Edition Gametest 4 | 5 | Version: 0.6.26(B) Beta 6 | 7 | Applicable for Minecraft BE BDS, personal archives, LLSE, and Realms survival assistance and server management plugins 8 | 9 | Author: EarthDLL 10 | 11 | Special Thanks: dyf189, Command Wither, all members of the group chat 12 | 13 | Official release/authorized resource link: https://www.minebbs.com/threads/usf.17109/ 14 | 15 | USF Docs 16 | 17 | Main Server: http://usf.earthdll.cn/?project 18 | 19 | Backup: http://usf.gtemc.cn/?project 20 | 21 | (Backup domain) https://github.com/dyf189/Unknow-Server-Frame_Help-Docs (GitHub open source, backup during DDoS and downtime) 22 | 23 | Third-party documentation: https://usf.7b7t.eu.org 24 | 25 | Implemented Systems/Features: 26 | 27 | Teleportation system, group system, territory system, announcement feature, management functionality 28 | 29 | Details of each function: 30 | 31 | Teleportation System: 32 | 33 | Return to death point 34 | Player TP 35 | Fixed teleportation points (set by admin) 36 | World shared points (set by players) 37 | Personal teleportation points 38 | Group shared points 39 | Random teleportation 40 | Home function 41 | Group System: 42 | 43 | Group message history 44 | In-group chat 45 | Territory sharing 46 | Territory System: 47 | 48 | Set open members/teams 49 | Set public territories 50 | Announcement Feature: 51 | 52 | Multiple announcements 53 | Pinned announcements 54 | New member announcements 55 | Management Functionality: 56 | 57 | Backpack inspection 58 | Perspective tracking 59 | Manage territories 60 | Ban entities 61 | Edit administrators 62 | Edit ban list 63 | Mute/block 64 | Set titles 65 | Plugin Settings: 66 | 67 | Set server entry prompts 68 | 69 | Set game assistance features 70 | 71 | Log system 72 | 73 | Scoreboard default values 74 | 75 | Scoring system 76 | 77 | Health display 78 | 79 | Player name format modification 80 | 81 | Chat display format modification 82 | 83 | Teleportation points, territory, group settings 84 | 85 | Built-in command settings for the plugin 86 | 87 | Settings for opening the main menu of the plugin 88 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | [English](/README(English).md) 4 | 5 | ### UnknowServerFramework(USF) 6 | 7 | 基于原版MinecraftBedrockEdition ScriptAPI 8 | 9 | 当前开源版本:0.6.26(B)测试版 10 | 最新版本:0.7.4(C)社区测试版 11 | 更多版本请查看压缩包内文件 12 | 适用于MinecraftBE官方服务端(BDS)、个人存档、LLSE和Realms的生存辅助向、服务器管理插件 13 | 作者:EarthDLL(USFrameTeam)、XiaoXiaoYang、Antonbin(社区贡献者) 14 | 15 | 16 | 特别鸣谢:dyf189,Command Wither,交流群全体成员 17 | 官方发布/授权发布的资源地址: 18 | __https://www.minebbs.com/threads/usf.17109/__ 19 | 20 | # USF文档站 21 | USF文档站(官方站点) 22 | 主域名:https://www.usfpack.site/ 23 | —— 24 | https://usframeteam.github.io/ 25 | (GithubPage,稳定访问,DDOS关服时备份) 26 | 一般问题文档里都有,来群里问也没有用 27 | 28 | # USF下载站 29 | usfdown.zuyst.top 30 | 31 | # 已实现的系统/功能: 32 | 传送系统、群组系统、领地系统、公告功能、管理功能 33 | 各功能详情: 34 | ## ①传送系统:​ 35 | - 返回死亡点​ 36 | - 玩家TP​ 37 | - 固定传送点(管理员设定)​ 38 | - 世界共享点(玩家设定)​ 39 | - 个人传送点​ 40 | - 群组共享点​ 41 | - 随机传送​ 42 | - Home功能​ 43 | ## ②群组系统:​ 44 | - 群组历史消息​ 45 | - 群组内聊天​ 46 | - 领地共享​ 47 | ## ③领地系统:​ 48 | - 设置开放成员/队伍​ 49 | - 设置公共领地​ 50 | ## ④公告功能:​ 51 | - 多公告​ 52 | - 顶置公告​ 53 | - 新成员公告​ 54 | ## ⑤管理功能:​ 55 | - 背包检查​ 56 | - 视角跟踪​ 57 | - 管理领地​ 58 | - 封禁实体​ 59 | - 编辑管理员​ 60 | - 编辑封禁名单​ 61 | - 禁言/屏蔽 ​ 62 | - 设置头衔 ​ 63 | 64 | 65 | 插件设置: 66 | 设置进服提示语 67 | 设置游戏辅助功能 68 | 日志系统 69 | 计分板默认值 70 | 积分系统 71 | 血量显示 72 | 玩家名格式修改 73 | 聊天显示格式修改 74 | 传送点、领地、群组设置 75 | 插件内置命令设置 76 | 插件主菜单打开方式设置 77 | -------------------------------------------------------------------------------- /start.cmd: -------------------------------------------------------------------------------- 1 | chcp 65001 2 | bedrock_server.exe -------------------------------------------------------------------------------- /使用须知.txt: -------------------------------------------------------------------------------- 1 | 无名氏服务器框架 2 | Unknown Server FrameWork 3 | Copyright © 2023 EarthDLL. All rights reserved. 4 | 欢迎使用本插件 5 | 本插件是基于《Minecraft基岩版》官方提供的GameTest框架制作的 6 | 适用于个人存档与BDS为核心的服务器管理框架 7 | 8 | 作者:EarthDLL 9 | 特别鸣谢:DYF189,Command Wither,交流群全体成员 10 | 11 | 插件版本:0.7.1C 12 | 兼容的游戏版本:1.21.70 13 | 适用范围:基岩版本地存档、BDS、LLSE、Realms 14 | 文档站:http://usf.earthdll.cn/?project 15 | 16 | 联系方式: 17 | QQ交流群:107403959 18 | b站@ED还活着(UID:85607592) 19 | 苦力怕论坛@EarthDLL 20 | MineBBS@地球DLL 21 | 22 | 目前官方发布/授权发布的资源地址: 23 | 1.https://www.minebbs.com/threads/usf.17109/ 24 | 2.https://klpbbs.com/thread-92297-1-1.html 25 | 26 | GitHub地址(可反馈bug): 27 | https://github.com/EarthDLL/Unknown-Server-Framework 28 | 29 | 使用方法: 30 | 1.新建存档/打开存档设置 31 | 2.开启实验性玩法-测试版API 32 | 3.加载插件行为包 33 | 4.根据提示输入命令"/function get_owner"获取最高权限OP并开启插件功能 34 | 35 | 问答: 36 | 1.插件的OP权限是怎么样的? 37 | 插件op不同于游戏的op,是分开的。 38 | USF的op分为普通op与最高op(owner) 39 | 不同点: 40 | 最高op是可以管理op列表,强制拥有全部功能(2级) 41 | 普通op则不能管理op列表(1级) 42 | 43 | 2.如何给予玩家最高op权限? 44 | 默认情况下,第一次输入function get_owner命令时,该玩家就会被给予最高op 45 | 在此之后,该条指令会被禁用 46 | 在服务器后台输入scriptevent usf:get_owner可以让全部在线玩家获得最高op 47 | 48 | 49 | 3.如何修改最高op? 50 | 1.在游戏内输入/scriptevent usf:reset 51 | 这条命令会告诉插件,有玩家在申请重置 52 | 2.在30秒内在控制台/存档主人端 输入reload命令 53 | 一般的服务器op并不能执行reload命令,只有后台可以,这一步是用作验证的 54 | 3.此时最高op已重置,重新输入/function get_owner命令即可获取最高OP 55 | 56 | 4.如何给予玩家插件OP? 57 | 目前只能在『op界面』的『op管理』中给予 58 | 59 | 5.如果不小心把op封禁了怎么办? 60 | V2无法踢出op,秒了 61 | 62 | 6.为啥USF会和其他模组冲突,导致其他模组无法使用 63 | 这是由于优先级导致的,在行为包设置界面将usf移动到最下面即可 64 | 65 | 7.使用USF能支持大量玩家或大体量存档吗? 66 | 在大量玩家的情况下,ui的操作可能会变得不适 67 | 但在不开启大量反作弊模块情况下,usf不会做统计实体、扫描背包等工作 68 | 可以说插件几乎不会对运行产生影响,所有新功能都不会使用低优化的方案 69 | 70 | 8.usf存档怎么在bds上运行? 71 | bds不能直接装usf,与其他模组一样,将本地装好usf的存档移动到服务器即可 72 | 73 | 9.如何升级USF? 74 | 首先我们把.mcpack的文件后缀改为.zip,打开会看到"无名氏B"这个文件夹 75 | 我们将"无名氏B"解压出来 76 | 接下来我们打开存档文件夹(具体位置上网找) 77 | 打开里面的behavior_packs文件夹 78 | 将里面的"无名氏B"文件夹(旧版本的)删除,把新版本(刚解压的)移动过去 79 | 这样就升级完成了 80 | 81 | 10.如何打开op界面 82 | 管理员在主菜单底下便可找到"管理界面"功能 83 | 若没有开启主菜单,可以通过命令/give @s usf:op 84 | 来获取op物品(其样式为三叉戟),接着使用该物品点击地面即可弹出管理界面 85 | V2你也可以使用+op来打开管理界面 86 | 87 | 88 | 兼容表(此处所指的游戏版本均为正式版): 89 | V2: 90 | 0.6.30 For Minecraft1.21.20 91 | 0.6.29同0.6.23 92 | 0.6.28同0.6.23 93 | 0.6.27同0.6.23 94 | 0.6.26同0.6.23 95 | 0.6.25同0.6.23 96 | 0.6.24同0.6.23 97 | 0.6.23 For Minecraft1.21.0 and Minecraft1.21.1 and Minecraft1.21.2 98 | 0.6.22 For Minecraft1.21.0 and Minecraft1.21.1 and Minecraft1.21.2 99 | 0.6.21 For Minecraft1.21.0 and Minecraft1.21.1 and Minecraft1.21.2 100 | 0.6.19 For Minecraft1.21.0 and Minecraft1.21.1 101 | 0.6.18 For Minecraft1.20.8x 102 | 0.6.17 For Minecraft1.20.50/51 and Minecraft1.20.60 103 | 0.6.16 For Minecraft1.20.50/51 and Minecraft1.20.60 104 | 0.6.15 For Minecraft1.20.50/51 and Minecraft1.20.60 105 | 0.6.14 For Minecraft1.20.50/51 and Minecraft1.20.60 106 | 0.6.13 For Minecraft1.20.50/51 and Minecraft1.20.60 107 | 0.6.12 For Minecraft1.20.50/51 108 | 0.6.11 For Minecraft1.20.50/51 109 | 0.6.10 For Minecraft1.20.50/51 110 | 111 | V1: 112 | 0.6.16 For Minecraft1.20.60 113 | 0.6.14 For Minecraft1.20.60 114 | 0.6.8 For Minecraft1.20.50/51 115 | 0.6.7 For Minecraft1.20.40.23 116 | 0.6.6 For Minecraft1.20.30 117 | 0.6.5 For Minecraft1.20.30 118 | 0.6.4 For Minecraft1.20.10/11/12 119 | 0.6.3 For Minecraft1.20.10/11/12 120 | 0.6.2 For Minecraft1.20.10.23/24/25(测试版) 121 | 0.6.1 For Minecraft1.20.10.21/22(测试版) 122 | 0.6.0 For Minecraft1.20.10.21/22(测试版) 123 | 0.5.5 For Minecraft1.19.8x 124 | 0.5.4 For Minecraft1.19.7x 125 | 0.5.3 For Minecraft1.19.7x 126 | 0.5.2 For Minecraft1.19.7x 127 | 0.5.1 For Minecraft1.19.7x 128 | 0.4.1/0.4.2 For Minecraft1.19.6x 129 | 0.0.2/0.0.3/0.3.x For Minecraft1.19.5x 130 | -------------------------------------------------------------------------------- /全功能使用方法.txt: -------------------------------------------------------------------------------- 1 | USF全功能使用方法: 2 | 更新日期:2024.08.14 3 | 最新版本:0.6.30(S) 4 | 5 | 一、留言板 6 | 新建方法:放置一个讲台,手持任意一本附魔书,点击讲台,附魔书就会放在讲台中,就建好了一个留言板 7 | 使用方法:单击(右键)该讲台方块,就可以打开留言板,里面会显示留言内容、并且可以留下留言 8 | 注意事项: 9 | 1.留言板内容存储在附魔书内,将书去除后该附魔书仍会保存内容 10 | 2.仅插件OP和留言板最初的创建者可以清空留言板 11 | 12 | 13 | 14 | 二、领地 15 | 配置方法: 16 | 1.新建一个计分板用于领地扣费(使用/scoreboard objectives add 记分板ID dummy) 17 | 2.打开「管理界面>插件设置>领地设置」,开启领地功能,填写你刚才创建的计分板ID 18 | 3.打开「管理界面>插件设置>插件命令设置」,打开land命令 19 | 警告: 20 | 若计分板不存在,主菜单不会显示领地功能(仅0.6.13-0.6.19) 21 | 若关闭领地功能,领地数据不会丢失,但所有领地均失效,直到功能重新开启 22 | 若不打开land命令,则无法创建领地(仅0.6.13-0.6.24) 23 | 提示: 24 | 插件OP可无限新建领地,但仍会正常扣费(需版本0.6.14F及以上) 25 | 可配合命令、「计分板默认值」、「积分设置」自动化赋予领地分数 26 | 新建领地方法: 27 | 1.打开领地界面>新建领地,进入编辑模式 28 | 2.在世界中选取至少两个点 29 | 3.输入+land命令(或打开主菜单)打开创建页面(若分数不足、领地重叠,则不会打开) 30 | 4.调整Y轴,可选择继续预览、取消创建、确认创建 31 | 5.打开主菜单即可取消创建领地(需版本0.6.14F及以上) 32 | 删除领地: 33 | 领地主人可在「领地」页面中删除领地 34 | 插件OP可进入对应领地,打开「领地」界面,此时会显示当前领地名、领地id。可在「管理界面>删除领地」中填入领地id来删除 35 | 注意事项: 36 | 1.插件0.6.14+创建的领地在领地主删除后可退回金额 37 | 2.插件最大的范围为126*126 38 | 39 | 40 | 41 | 三.自定义菜单(策略文件) 42 | 策略文件使用方法: 43 | 1.获取物品usf:config_file 44 | 2.将物品拿在手上,单击/右键方块即可打开策略文件编辑页面 45 | 3.在编辑页面可以设置 菜单标题、页面文字、设置二级菜单、按钮 46 | 按钮功能详解: 47 | 执行命令:无 48 | 新商品:新建一个商品,这个商品直接保存在策略文件中,不会在全局商店展示 49 | 传送点:新建一个传送点,可以从个人传送点复制过来 50 | 连接全局商品:点击按钮跳转到某个全局商品的界面 51 | 确认界面:显示一个新界面,只有一个关闭按钮,可以设置该界面的标题与内容 52 | 创建自定义菜单方法: 53 | 硬绑定方块: 54 | 1.手持策略文件,潜行,单击/右键方块,会显示界面 55 | 2.选择绑定按钮即可将策略文件的设置绑定到方块上 56 | 3.右键需要绑定的方块就可以打开菜单 57 | 软绑定方块: 58 | 1.在需要绑定的方块下面放一个容器(箱子、熔炉、发射器、木桶等都可以) 59 | 2.将策略文件放置在容器第一格即可绑定 60 | 3.右键需要绑定的方块就可以打开菜单 61 | 绑定到某一物品: 62 | 1.手持策略文件,打开【管理界面>插件设置>全局策略文件】界面,进行绑定 63 | 2.绑定后,持那个物品单击方块即可打开界面 64 | 绑定到NPC: 65 | 1.手持策略文件,右键/长按NPC即可绑定 66 | 2.绑定后,攻击/交互都可以打开菜单 67 | 3.再次做绑定操作可覆盖原先的界面 68 | 69 | 注意事项: 70 | 绑定后无法直接对界面进行更改,只能用修改后的策略文件进行覆盖,因此绑定后的策略文件一定要妥善保存! 71 | 72 | 73 | 74 | 四、传送点 75 | 注意事项: 76 | 1.新建传送点可以选择当前位置,也可以从个人传送点复制过来 77 | 2.固定传送点只能由管理员设置,并且直接显示传送点在传送点主界面 78 | 3.世界公共点则是全服可添加 79 | 4.可以通过全局事件对玩家使用传送点进行响应 80 | 5.插件OP 可以在个人传送点界面点击“管理玩家个人点”,来查看某玩家的全部个人点 81 | 82 | 83 | 84 | 五、编辑物品特殊效果 85 | 命令执行者使用方法: 86 | 1.点击“编辑命令集”按钮(有些版本显示错误,显示成“编辑物品集” 87 | 2.在弹出的多行编辑器中,每行输入一串命令 88 | 3.记住你要执行的那串命令现在在第几行(记住行号) 89 | 4.编辑物品效果,选择命令执行者,下方输入行号 90 | (也就是说,假设你要执行的那串命令在第1行,你就填1) 91 | 92 | 93 | 94 | 六、USF特殊命令 95 | 使用方法:该命令的执行者是 要执行命令的玩家/实体 96 | 格式: 97 | (需要指定某玩家时)/execute as 玩家 run scriptevent usf:command 命令 98 | (当@s就是这个玩家时)/scriptevent usf:command 命令 99 | 注意事项:命令部分不需要引号引起来!直接输入就行! 100 | 101 | 可使用的命令: 102 | 1.code 103 | 用途:执行配置代码 104 | 可执行目标:玩家 105 | 格式:code 代码 106 | 例子:/scriptevent usf:command code {"item":"minecraft:apple","amount":1} 107 | (对玩家运行一个 给予玩家1个苹果的配置代码) 108 | 2.page 109 | 用途:打开界面 110 | 可执行目标:玩家 111 | 格式:open 界面ID 112 | 界面ID: cd(主菜单)、pos(传送界面)、store(商店界面)、board(公告)、chat(聊天设置界面)、land(领地界面)、group(群组界面)、tran(转账机) 113 | 例子:/scriptevent usf:command open land 114 | (让玩家打开领地界面) 115 | 3.hotbar 116 | 用途:切换玩家手持物品 117 | 可执行目标:玩家 118 | 格式:hotbar 物品栏序号 119 | 物品栏序号:1-9 120 | 例子:/scriptevent usf:command hotbar 1 121 | (让玩家手持物品切换到物品栏第一个) 122 | 4.name 123 | 用途:设置玩家头顶的名字(支持转义) 124 | 可执行目标:玩家 125 | 格式: 126 | name set 名字(一次性修改,下线重置) 127 | name format 名字(设置名字格式,优先级大于全局名字格式) 128 | 例子:/scriptevent usf:command name set USF 129 | (将玩家的名字改为USF) 130 | 5.knock 131 | 用途:让玩家附加击退 132 | 可执行目标:玩家 133 | 格式:knock x轴方向量 z轴方向量 水平方向击退力度 垂直方向击退力度(难以直接表达,自行调试) 134 | 例子:/scriptevent usf:command knock 1.5 1.5 1 1 135 | (让玩家向东南方向(1.5,1.5)附加力度为1.5的击退) 136 | 6.health 137 | 用途:设置玩家生命值 138 | 可执行目标:玩家 139 | 格式: 140 | health set 生命值 (设置生命值) 141 | health add 生命值 (添加生命值) 142 | 例子:/scriptevent usf:command health add -5 143 | (让玩家生命值-5) 144 | 7.tag 145 | 用途:设置玩家头衔 146 | 可执行目标:玩家 147 | 格式:tag 头衔 (头衔设置为Reset则删除头衔) 148 | 例子:/scriptevent usf:command tag hi 149 | (让玩家头衔设置为hi) 150 | 8.fire 151 | 用途:让玩家着火 152 | 可执行目标:玩家 153 | 格式:fire 时间/秒 154 | 例子:/scriptevent usf:command fire 5 155 | (让玩家着火5s) 156 | 9.show 157 | 用途:向玩家展示消息(支持转义) 158 | 可执行目标:任何实体 159 | 格式: 160 | show chat 目标选择器 消息(聊天栏展示消息) 161 | show actionbar 目标选择器 消息(ActionBar展示消息) 162 | 这里的目标选择器略有不同,要写成两个@号,例如@e要写成@@e 163 | 例子:/scriptevent usf:command show chat @@a /health 164 | (向全体玩家发送消息,消息内容为ta的生命值) 165 | 10.ui 166 | 用途:用于打开方块的自定义界面(该方块不需要在常加载区块,但仅限主世界) 167 | 可执行目标:玩家 168 | 格式:ui x坐标.y坐标.z坐标 169 | 例子:/scriptevent usf:command ui 0.0.0 170 | (若主世界0,0,0坐标的方块绑定了自定义界面,则向玩家展示该自定义界面) 171 | 11.back 172 | 用途:返回死亡点(仅玩家死过才能传送) 173 | 可执行目标:玩家 174 | 格式:back 175 | 例子:/scriptevent usf:command back 176 | (让玩家返回死亡点) 177 | 12.tpa 178 | 用途:打开玩家传送页面 179 | 可执行目标:玩家 180 | 格式:tpa 181 | 例子:/scriptevent usf:command tpa 182 | (让玩家打开玩家传送页面) 183 | 13.commandblock 184 | 用途:运行一个命令方块 185 | 原理:在这个命令方块上方放置一个红石块,持续2tick(该命令方块要在加载的区块中) 186 | 可执行目标:任何实体 187 | 格式:commandblock x坐标 y坐标 z坐标 188 | 例子:/scriptevent usf:command commandblock 0 0 0 189 | (锁定该实体所在维度的0,0,0坐标的方块,在其上方放置红石块,持续2tick) 190 | 14.var 191 | 用途:设置全局变量(注意:全局变量并非永久保存,关服即重置) 192 | 可执行目标:任何实体 193 | 格式: 194 | var set 变量名 值(将变量名设置为值) 195 | var copy 变量名 计分板ID(将变量名设置为该实体计分板的分数) 196 | var player name 变量名(将变量的值设为玩家名称)(若执行者不是玩家则无效) 197 | 例子: 198 | /scriptevent usf:command var set A B 199 | (将变量A设置成"B") 200 | /scriptevent usf:command var copy A B 201 | (将变量A设置成该实体在计分板"B"的分数) 202 | /scriptevent usf:command var player name A 203 | (将变量A设置成该玩家名称) 204 | 注:若变量值带空格的话,在前面输入**,例如:/scriptevent usf:command var set A **BB AA CC 205 | 206 | 15.test 207 | 用途:检测计分板分数,执行命令 208 | 可执行目标:任何实体 209 | 格式: 210 | test 最小值 最大值 [测试条件] **命令 211 | 测试条件: 212 | player list (玩家数量) 213 | tag 标签 (含标签的玩家数量) 214 | score 计分板ID(该实体计分板分数) 215 | 例子: 216 | /scriptevent usf:command test 0 10 player list **say 玩家数量爆棚 217 | (当玩家数量在0-10时,发送消息"玩家数量爆棚") 218 | /scriptevent usf:command test 0 10 tag ok **say 玩家数量爆棚 219 | (当含ok标签的玩家数量在0-10时,发送消息"玩家数量爆棚") 220 | /scriptevent usf:command test 0 10 score ok **kill @s 221 | (当该实体在ok计分板的分数在0-10时,杀死该实体) 222 | 16.get 223 | 用途:获取测试数据并保存到该实体的计分板 224 | 可执行目标:任何实体 225 | 格式: 226 | get 计分板ID [获取内容] 227 | 获取内容: 228 | player list (玩家数量) 229 | tag 标签 (含标签的玩家数量) 230 | 例子: 231 | /scriptevent usf:command get ok tag usf 232 | (将该实体在ok计分板的分数设为 含usf标签的玩家数量) 233 | 234 | -------------------------------------------------------------------------------- /支持我.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USFrameTeam/Unknown-Server-Framework/9adebab5adc9202df560be5ad04ef1c4e305f37c/支持我.jpg -------------------------------------------------------------------------------- /文件说明(必看!).txt: -------------------------------------------------------------------------------- 1 | V2 2 | 无名氏B 3 | 行为包,插件主体,请选择对应游戏版本导入 4 | 无名氏R 5 | 资源包,附加功能,包括NPC的ui更改,以及右上角ActionBar 6 | 自行选择是否安装 7 | 8 | -------- 9 | V1 10 | 仍使用V1旧版本的用户,请无视上面的文件 11 | 进入V1文件夹直接安装Addon 12 | (若此版本没有V1部分,则V1无更新) 13 | 14 | ------ 15 | 若您是新用户,请使用V2版本 16 | 查看「使用须知」的兼容表选择对应包 17 | 使用教程详见「常见问题」或打开文档站 18 | http://www.usfpack.site -------------------------------------------------------------------------------- /更新日志.txt: -------------------------------------------------------------------------------- 1 | 插件作者:EarthDLL(earthdll@outlook.com) 2 | 管理员:悠米看悠米 3 | 插件名:无名氏牌服务器插件(Unkown Server FrameWork) 4 | 5 | 在不侵犯作者版权情况下,可自行修改、分发、二次修改、二次分发 6 | 禁止以付费形式传播本插件主体部分(包含日志) 7 | USF0.7.4C 8 | 重构了部分函数以提高插件性能 9 | 修复在视角跟踪下因服务器卡顿导致夜视结束后延迟生效的问题 10 | 修复视角跟踪第一视角无法使用的问题 11 | 修复视角跟踪自由视角无法使用的问题 12 | 修复视角跟踪被跟踪玩家退出后持续报错的问题 13 | 修复Sign变更检测和箱子物品变动检测功能无法使用的问题 14 | 修复聊天设置,聊天对象不可用的问题 15 | 修复玩家未完全进入服务器时偶尔导致的报错 16 | 17 | USF0.7.3C 18 | 1.管理界面-插件设置-其他功能新增其他模组支持选项,打开后遵循规范的模组在没有权限的领地内将无法使用模组的功能 19 | 2.修复管理界面-性能检测的tps始终显示为20的问题 20 | 21 | USF0.7.2C 22 | 适配1.21.70+ 23 | 修复玩家传送无法传送的问题 24 | 25 | USF0.7.1C 26 | 适配1.21.70+ 27 | 该版本代表社区维护usf的第一个版本 28 | 29 | USF0.6.35B适配1.21.60 30 | USF06.34B 适配1.21.50 31 | 32 | USF06.33B 适配1.21.40-42 33 | 34 | USF0.6.32B 35 | 适配1.21.30+ 36 | 37 | USF0.6.31(S) 38 | 适配1.21.31 39 | 40 | USF0.6.30(S)更新: 41 | 适配1.21.30 42 | 43 | bug修复: 44 | 移除了Herobrine 45 | 46 | USF0.6.29(B)更新: 47 | 1.修复自定义菜单的二级页面,将“返回”按钮列入排序列表,导致页面无法显示的bug 48 | 2.自定义页面新增“打开页面运行命令”、“关闭页面运行命令”功能,类似原版NPC 49 | (当自定义页面没有按钮时,页面不会显示,但会运行“打开页面运行命令”) 50 | 3.将打开管理页面的"OP"物品的使用方式改为单击/右键方块 51 | 4.修复留言板禁用后还会弹出页面的bug 52 | 5.将潜行输入+land命令取消创建领地,改为单独的+unland命令 53 | 6.新增特殊命令[back](返回死亡点)、[tpa](打开玩家互传页面) 54 | 7.现在传送玩家会发送请求UI 55 | 8.现在可以将自定义界面绑定到NPC上,覆盖NPC的功能 56 | 9.为初始化添加插件OP不互通的提示语 57 | 10.数据统计新增“击杀敌对生物”统计 58 | 11.新增特殊命令commandblock 59 | 12.管理界面新增“重置我的签到”功能,可以恢复到未签到状态,方便调试 60 | 13.为show特殊命令添加目标选择器 61 | 14.新增全局变量特殊命令(var) 62 | 15.新增转义var(全局变量名),可以转义为全局变量 63 | 16.新增条件检测特殊命令(test) 64 | 17.新增数据获取特殊命令(get) 65 | 66 | USF0.6.28(B)更新: 67 | 1.现在玩家名格式功能属于可选功能 68 | 2.现在玩家名更新时间由5s改为2s 69 | 3.新增10个USF特殊命令 70 | 4.修复部分页面会无限弹出的bug 71 | 5.新增每日签到功能 72 | 6.修复转义中/time不是北京时间的问题 73 | 7.修复商品的“每日、每月、每周更新”不是按北京时间的问题 74 | 8.修复插件操作无分数的计分板可能报错的问题 75 | 9.数据统计新增“购买物品金额”、“收购物品金额”统计 76 | 10.将策略文件的编辑方式由副手改为主手,避免使用节假日实验性玩法功能 77 | 78 | USF0.6.27(F)更新: 79 | 1.修复复制物品栏物品时,无论是否复制成功都显示“物品不存在”的bug 80 | 2.修复了小木斧在部分设备下无法选择两点的问题 81 | 3.修复开启方块交互日志后,玩家空手交互会报错的问题 82 | 4.修复开启方块交互日志后,创建领地无法选点的问题 83 | 5.修复二次编辑悬浮字时关闭页面,会直接删除悬浮字的bug 84 | 85 | USF0.6.26(B)更新: 86 | 1.修复更改游戏规则可能会收到0的消息的bug 87 | 2.修复创建领地时actionBar显示错误的问题 88 | 3.管理界面新增“复制物品栏物品功能” 89 | 4.新增“玩家方块行为限制”功能,可以限制含Tag的玩家破坏、放置、交互特定的方块 90 | 5.修复使用tpr命令的错误 91 | 6.修复取消创建领地会全图显示的问题 92 | 7.新增“方块交互”日志,可以记录玩家和方块交互记录,例如使用打火石等 93 | 94 | USF0.6.25(B)更新: 95 | 1.修复了商店功能导致0,319,0位置产生箱子的问题 96 | 2.修复了商店滑动条会显示"0-512"的错误字样 97 | 3.现在公共领地不输入领地欢迎语,在公共领地内不会收到提示 98 | 4.修复了售卖物品时,若不修改售卖物品会导致物品数量、选择样式、配置代码均无法修改的问题 99 | 5.重新添加了 小木斧 功能 100 | 6.新增"计分板聊天室功能",计分板内分数相同的玩家直接形成单独的聊天群组 101 | 102 | USF0.6.24(F)更新 103 | 1.修复最维度最底层与方块交互、点传会报错的问题 104 | 2.修复部分页面在windows端电脑会出现多次的问题 105 | 3.修复了管理员创建领地时,领地一定会变成公共领地的bug 106 | 4.修复了公告只有一个时弹出错误的问题 107 | 5.修复"命令级"写错为"物品集" 108 | 109 | 110 | USF 0.6.23(E)更新: 111 | 1.新增公共领地,仅管理员可创建,购买时不花费,所有管理员均可编辑 112 | 2.修复计分板转义的错误 113 | 3.删除board.计分板id.name转义 114 | 4.新增玩家信息日志 115 | 5.修复/time转义显示错误的问题 116 | 6.修复新增几个图标名字错误的问题 117 | 7.修复使用主菜单创建领地时,若未选择两个点会报错的问题 118 | 8.现在潜行状态下输入+land、打开主菜单会取消创建领地 119 | 9.修复锁定物品打死掉落的问题 120 | 10.将领地功能改为正式功能 121 | 11.添加标签组功能 122 | 12.新增全局商店功能 123 | 13.小游戏功能:玩家进入游戏自动清理以下划线开头的tag 124 | 14.新增(自定义菜单)配置文件功能 125 | 15.新增全局事件功能,触发事件执行命令,能够进行标签限制 126 | 事件:玩家进游戏、玩家死亡、玩家使用传送点、玩家发送消息、玩家转换维度、破坏方块、放置方块、玩家攻击、玩家睡觉、玩家杀死生物 127 | 16.新增计分板计时器功能,可以将1个计分板设置为计时器,可以进行分数计时,支持正计时与倒计时 128 | 17.修复编辑锁定物品时,关闭界面,会导致锁定物品被意外删除的bug 129 | 18.现在为玩家添加reload_lock_item标签可以立马刷新锁定物品 130 | 19.锁定物品新增标签限制,只有含有标签的玩家才会锁定某些物品(兼容旧版本,旧版本更新后默认无视标签) 131 | 20.重置“积分功能”,改为“数据统计功能” 132 | 更改:改为方案模式,有相同tag的玩家共享一套数据统计方案 133 | 新支持:支持玩家进游戏、挖掘方块、放置方块、对生物造成的伤害、杀死生物数量、玩家死亡、玩家生命值实时统计 134 | 新支持:增加“限制条件”选项,可以对统计进行限制,例如只有杀死某一种生物才能加分 135 | 同时支持多个统计项,例如杀死不同种类的生物,分别算入不同计分板的操作 136 | 21.将插件中所有“计分板”改为“记分版” 137 | 22.更新日志系统 138 | 23.现在收到转账的玩家会收到一条消息提示 139 | 140 | USF 0.6.22(B)更新: 141 | 1.现在“你无权在领地操作”会显示1.5s,不会被覆盖 142 | 2.现在可以部分修改成员、非领地成员的领地操作权限 143 | 3.现在玩家可以在主界面查看当前领地的详情 144 | 4.新增计分板:离线玩家自动剔除功能 145 | 5.新增图标:交易、红床、船、命令方块、灯笼 146 | 6.现在主菜单快捷自杀为可选功能,需要在辅助游戏功能设置中开启 147 | 7.新增转账功能 148 | 149 | USF 0.6.21(B)更新: 150 | 兼容1.21.0-1.21.2 151 | 1.修复“修改传送点时不会修改维度”的问题(GH#22) 152 | 2.新增进入领地日志记录(GH#26) 153 | 3.游戏模式更改记录日志 154 | 4.修复无法获取玩家手部物品导致的问题 155 | 5.修复创造模式发射火焰弹会减少的问题(GH#12) 156 | 6.现在火焰弹爆炸位置会小范围破坏方块并产生火焰(GH#12) 157 | 7.现在领地界面会显示开始、终点(GH#29) 158 | 8.现在可以强行禁用聊天系统(GH#25) 159 | 9.新增聊天过滤词,聊天内容含过滤词的usf不处理(GH#25) 160 | 10.重新加入游戏规则锁定功能(GH#17) 161 | 11.插件Owner现可以在“OP管理界面”删除其他Owner(GH#16) 162 | 12.升级“查看所有群组”系统,现在可以直接进入群组系统修改群组(GH#37) 163 | 13.现在可以禁止末地使用随机传送 164 | 14.现在领地配置计分板错误时,会显示领地按钮,但会弹出无法使用领地功能的警告 165 | 15.现在在新建领地时,打开主菜单即可进入领地编辑页面,不需要+land命令 166 | 16.添加tpr命令,快捷随机传送 167 | 17.现在领地配置完后,若计分板不存在,会立即弹出确认弹窗 168 | 169 | USF 0.6.19(B)更新: 170 | 适配1.21.0/1.21.1 171 | 172 | USF 0.6.18(B)更新: 173 | 适配1.20.80 174 | 175 | USF 0.6.17-F(B)更新: 176 | 177 | V2:修复OP界面检测权限失败的问题 178 | 179 | USF 0.6.17(B)更新: 180 | 支持版本:1.20.5x正式版 / 1.20.60正式版 181 | (插件已重写,不兼容0.6.10以下版本) 182 | 183 | 1.游戏辅助添加投射火焰弹功能 184 | 2.新增个人传送点检查功能(自调查问卷) 185 | 3.新增传送返回功能,传送到传送点/TPA后可返回传送前的位置(自调查问卷) 186 | 4.新增悬浮字功能 187 | 5.现在管理员可删除分享传送点 188 | 6.现在分享传送点会显示剩余时间 189 | 7.现在可以选择禁用"传送点分享"功能 190 | 8.新增封禁掉落物功能,特定id的掉落物将无法生成 191 | 9.新增繁体中文 192 | 由于时间关系,繁体中文内容很少,仍需补充 193 | 194 | Bug修复: 195 | 1.修复日志设置界面显示错误的问题 196 | 2.修复管理玩家领地时,领地数量显示为管理玩家的领地数量的问题 197 | 3.修复全局转义无效的问题 198 | 4.修复开启"usf传送记录"日志后,跟踪视角会产生问题的问题 199 | 5.修复积分统计中玩家积分无限堆积的问题 200 | 6.修复积分统计未开启也照样统计的问题 201 | 7.修复/health过于准确的问题 202 | 8.修复传送点分享两次才有效的问题 203 | 204 | USF 0.6.16(B)更新: 205 | 支持版本:1.20.5x正式版 / 1.20.60正式版 206 | (插件已重写,不兼容0.6.10以下版本) 207 | 208 | V2 209 | 添加了以下内容: 210 | 1添加/Health转义, 转化为玩家生命值 211 | 2添加/n转义,转化为换行符(转义符统一使用/) 212 | 3.添加/level转义符,转换为玩家当前等级 213 | 4. 添加/respawn转义,转换为玩家出生点 214 | 5.添加/join转义,转换为自0.6.10以来玩家插入游戏的次数 215 | 6.实装config.hacker.kick, 反作弊生效后踢出玩家 216 | 7添加管理员日志功能,可以手动添加日志,或查看插件警告 217 | 8.现在反作弊会将结果反馈到管理员日志 218 | 9.性能检测新增配置文件占用列表 219 | 10.新增/items转义,转换为掉落物数量 220 | 11.重置留言板功能 221 | 开启方法「插件设置>其他功能设置」中打开留言板 222 | 使用方法:将任意附魔书放入讲台中即成留言板,仅创建者可清空留言板。 223 | 留言板内的留言格式和聊天格式相同,可在插件设置里修改 224 | 12.创建领地界面修改y轴后选择暂时预览才会生效,以避免修改轴后立刻创建导致不会重新检测重叠、不会重新计算价格的问题13.新增/date和/time转义符,分别转换为年月日和时分秒 225 | 13.改进多行文本编辑器删除阻住赛的分割线,且预览时会进行转义,而不是显示原文本 226 | 14.现在封禁实体编辑完成后会提示可能无效的id 227 | 15.日志添加使用usf传送的日志 228 | 16.管理界面添加全局变量输出功能,输出usf当前配置文件与玩家id列表, 用于辅助bug测试 229 | 17.修复新玩家无法进行积分统计、游戏时间统计的问题 230 | 18.自定义图标新增14个常用物品图标 231 | 19.现在可以通过"/tag 玩家 add usf.tag:头衔名"命令来设置玩家头衔 232 | 或使用"/tag 玩家 add usf.tag:Reset"命令来重置玩家头衔 233 | 20.现在op也可以打开“op管理”界面,但只能查看op和owner,无法编辑 234 | 21.修复"玩家名格式设置"界面标题显示错误的问题,添加"默认头衔"选项 235 | 236 | 修复了以下问题: 237 | 1.修复群组只能打开最后一个的bug 238 | 2.修复开放队伍显示、编辑错误的问题 239 | 3.修复玩家id列表读取成玩家名字列表的bug 240 | 4.修复V2安装方法中打开节假日创作者的错误说法,V2一直不需要开启此实验性玩法 241 | 5.修复提示页面无返回值仍显示返回按钮的bug 242 | 6.修复确认界面点击取消仍返回true的重大错误,这将解决 243 | ①点击取消仍删除领地的bug 244 | ②点击取消仍解散队伍的bug 245 | ③点击取消仍退出队伍的bug 246 | 7.修复上线次数达200人次后,部分玩家在插件中显示为[离线玩家]的问题 247 | 原理:当玩家进入游戏时,玩家id将会保存在id列表最前面,当列表大于200时删除最旧的玩家d(不能无限存) 248 | bug所在:如果个玩家第二次进入游戏,那么他的d将移动到最前面,而bug则是复制到前面之后忘了删之前的!!! 249 | 于是,要是一个玩家进入游戏100次,他的id就会占用100次. 于是很快就会能到后面被删掉 250 | 8.修复视角跟踪无法在bds使用的bug(使用的预设要开启实验性玩法,因此直接内置到插件里面了) 251 | 9.修复下界砖自定义图标显示错误的问题 252 | 253 | V1: 254 | 1.破坏性更新:性能监测-活塞活动统计:停止兼容 255 | 2.修复防止箱子、漏斗时报错的问题 256 | 257 | USF 0.6.15(B)更新: 258 | 支持版本:1.20.5x正式版 / 1.20.60正式版 259 | (插件已重写,不兼容0.6.10以下版本) 260 | 261 | V2: 262 | 1.管理员加入管理模式,开启后可无需权限修改领地 263 | 2.修改op界面的图标以符合逻辑 264 | 3.新增/count转义,转换为在线人数 265 | 4.现在视角追踪会给予夜视 266 | 267 | Bug: 268 | 1.修复积分设置后无限报错的问题 269 | 2.修复领地内方块判断错误的问题 270 | 3.修复管理员无法无限新建群组的问题 271 | 4.更改维度后删除玩家的领地标记点 272 | 5.现在无法重复选取领地坐标点 273 | 6.修复检查玩家背包后,潜影盒出现在玩家位置而不是进入玩家背包的bug 274 | 7.修复进服/重生/换维度给予抗性6而不是抗性5的bug 275 | 276 | USF 0.6.14(F)更新: 277 | 支持版本:1.20.5x正式版 / 1.20.60正式版 278 | (插件已重写,不兼容0.6.10以下版本) 279 | 280 | V2: 281 | 1.现在进入领地后会显示领地等级,分别显示为"领地主"、"领地成员"、"群组成员"、"访客" 282 | 2.物品锁定添加"立刻重载"按钮 283 | 3.现在玩家自行删除领地会退回价格(仅最新版本创建的领地才支持) 284 | 4.现在创建领地时打开主菜单即可退出创建 285 | 286 | Bug: 287 | 1.修复公开群组无法使用的问题 288 | 2.修复op无法无限制创建领地的问题 289 | 3.当领地未设置欢迎语时不会再显示空的一行 290 | 4.现在离开领地后离开清空actionbar 291 | 5.修复物品锁定界面,显示的物品栏比实际少1的问题 292 | 6.现在玩家不能和领地内的生物交互 293 | 7.修复无法获取scoreboardIdentity导致计分板操作报错的问题 294 | 8.现在领地成员、领地群组内容后面不会出现逗号 295 | 9.修复领地尺寸比实际小1*1*1的问题 296 | 297 | V1: 298 | 兼容1.20.60 299 | 300 | USF 0.6.13(E)更新: 301 | 支持版本:1.20.50正式版 / 1.20.60正式版 302 | (插件已重写,不兼容0.6.10以下版本) 303 | 304 | 1.添加反“自动偷箱”功能 305 | 2.现在无法获取容器信息后仍会记录更改的玩家 306 | 3.重置背包检查功能 307 | 4.添加领地(实验性)功能 308 | 5.重置视角跟踪功能 309 | 310 | Bug: 311 | 1.修复放置方块时可能出现的问题 312 | 2.修复容器被破坏后无限爆错的问题 313 | 3.修复因UI的Bug导致个人传送点不能打开的问题 314 | 4.修正:当滑动条UI意外超出范围时自动调整为最小值 315 | 5.修复破防告示牌后疯狂抱错的问题 316 | 317 | USF0.6.12(E)更新: 318 | 支持版本:1.20.50正式版 319 | (插件已重写,不兼容旧版本) 320 | 321 | 1.加入世界共享点功能,最多支持100个共享点 322 | (共享点创建后仅创建者和OP可以编辑) 323 | 2.现在关闭传送点详情页面时,会正确返回上一页 324 | 3.实装+home命令,存在多个Home点时弹出窗口选择 325 | 4.现在删除传送点、取消创建传送点,会返回上一页 326 | 5.实装群组共享点 327 | 6.添加usf命令设置,添加+die与+back命令 328 | 7.日志新增破坏方块记录 329 | (格式 : Break 方块ID*数量 (维度ID:XYZ坐标)) 330 | (其中 :维度ID 0>主世界 1>地狱 2>末地) 331 | 8.日志新增放置方块记录 332 | (格式 : Place 方块ID*数量 (维度ID:XYZ坐标)) 333 | (其中 :维度ID 0>主世界 1>地狱 2>末地) 334 | 9.现在日志系统以天为统计单位 335 | 10.日志新增维度改变记录 336 | 11.新增玩家击杀与被击杀记录 337 | 12.新增转义/unsleep,转换为未入睡的玩家列表 338 | 新增命令+unsleep,展示未入睡的玩家列表 339 | 13.日志系统新增"冷却时间",当无法连接日志服务器时暂时冷却 340 | 可以大大缓解因无法连接而弹出大量警告的刷屏问题 341 | 14.日志新增容器记录功能,可以记录玩家打开容器的记录以及对容器的修改 342 | (适用范围:箱子/木桶/潜影盒/熔炉类/讲台/发射器/漏斗) 343 | 15.日志新增告示牌修改记录 344 | 16.积分添加"攻击生物"统计 345 | 346 | Bug: 347 | 1.修复传送点创建者显示玩家id而不显示玩家名的bug 348 | 2.修复了/list转义后有两个逗号的问题 349 | 3.修复"游戏时间统计"首次设置为"每分钟"时,新建的计分板显示为"每秒"的错误 350 | 4.修复主菜单重复打开的问题(其实就是加了1s冷却) 351 | 352 | USF0.6.11(E)更新: 353 | 支持版本:1.20.50正式版 354 | (插件已重写,不兼容旧版本) 355 | 356 | 1.重置物品锁定功能 357 | 2.添加6个新图标(篝火、水桶、羊毛、红石灯、刷怪笼、TNT) 358 | 新加游戏辅助功能 359 | 1.设置苦力怕爆炸是否破坏地形 360 | 2.设置告示牌是否需要双击才能编辑 361 | 3.支持在玩家进入游戏、重生、切换维度时给予抗性5(免伤)效果,时间0-30秒 362 | 4.非op锁定生存模式 363 | 364 | Bug: 365 | 1.修复个人传送点、固定传送点只能打开最后一个的问题 366 | 2.修复以分钟统计游戏时间的错误问题 367 | 3.修复个人传送点无法取消创建的问题 368 | 4.修复选择图标显示英文、下界砖块显示错误的问题 369 | 5.修复随机传送距离无法正常修改的问题 370 | 6.修复了随机传送无法冷却的bug 371 | 372 | USF0.6.10(E)更新: 373 | 支持版本:1.20.50正式版 374 | (插件已重写,不兼容旧版本) 375 | 376 | 1.重写ui系统,提升性能 377 | 2.重置部分功能 378 | 379 | bug修复: 380 | 1.现在不需要"夏日节假日"实验性玩法即可获取usf:op物品 381 | 382 | USF0.6.7(B)更新: 383 | 支持版本:1.20.50正式版 384 | 385 | 1.强行移除Login功能 386 | 2.现在会封禁实体将移除实体,并非杀死实体 387 | 3.加入区块备份功能,可以创建回档 388 | 4.加入玩家追踪功能,可跟踪玩家视角 389 | 5.修复+offhand命令,但该功能已废弃,重构版本将移除 390 | 391 | ———————————— 392 | 393 | USF0.6.6(F)更新: 394 | 支持版本:1.20.30正式版 395 | 注意:资源包有更新 396 | 397 | 1.重新恢复了计分板编辑功能 398 | 2.重新加入了性能监视功能 399 | 3.完善了文档,回答主要问题 400 | 4.更新资源包易适应1.20.30 401 | 402 | ———————————— 403 | 404 | USF0.6.5(S)更新: 405 | 支持版本:1.20.30正式版 406 | 407 | 兼容1.20.30正式版 408 | 1.现在可以在setting.js内写死op名,写死的op拥有最高等级 409 | 2.新增usfAPI接口(scriptevent usfAPI:*****),旨在兼容其他addon 410 | 3.现在防范围挖掘可以强行制止玩家挖掘方块 411 | 4.加入usf命令可查询USF版本信息 412 | 413 | ———————————— 414 | 415 | USF0.6.4(B)更新: 416 | 支持版本:1.20.10正式版、1.20.10.23、1.20.10.24/25 417 | 1.加入NPC功能 418 | 2.添加调试棒 419 | 3.添加反作弊范围挖掘 420 | 4.添加禁用实体功能 421 | 5.现在主菜单可选择关闭 422 | 6.现在默认只有钟可以打开主菜单 423 | 7.现在公告过多时可设置展开 424 | 8.修复检查背包的错误 425 | 9.添加offhand命令,实现主副手切换 426 | 10.添加数据统计功能 427 | 428 | 优化: 429 | 1.现在主菜单为可选项,需手动开启 430 | 431 | ———————————— 432 | 433 | USF0.6.3(B)更新: 434 | 支持版本:1.20.10正式版、1.20.10.23、1.20.10.24/25 435 | 注:高级功能系统有更新!请覆盖源文件! 436 | 437 | 1.为主菜单加入Group功能 438 | 2.完善小木斧功能 439 | 3.重新整理日志系统: 440 | 1)按日期分类,提高查找效率 441 | 2)简化日志消息,尽量简洁 442 | 3)下列行为加入日志系统: 443 | 私聊 444 | 4.为下界、末地添加了随机传送功能 445 | 5.现在小木斧支持填充非原版方块 446 | 6.现在玩家可选择关闭自动翻译功能 447 | 7.添加免蜜蜡封告示牌的功能(手持蜜蜡点击告示牌) 448 | 8.为进服提示语添加多语言支持与转换功能 449 | 9.添加/dimension以显示玩家坐标 450 | 10.添加苦力怕爆炸时保护地形功能 451 | 11.实验性加入领地功能,不可投入使用 452 | 12.增加侧边栏编辑功能 453 | 13.将贡献值系统完全移出插件 454 | 14.为大量页面提供英文翻译 455 | 456 | bug修复: 457 | 1.修复玩家管理界面显示错误的bug 458 | 2.修复放置留言版功能按钮有时不显示的bug 459 | 3.现在放置留言板时会放置在方块中心位置 460 | 4.修复部分页面设置关闭后无法更改的bug 461 | 5.修复取消添加group后仍添加的bug 462 | 6.修复默认设置可能被修改的bug(原来js的const是可改的?) 463 | 7.修复了告示牌无法打开留言板的问题 464 | 8.适应性解决ActionBar会抛出错误的问题 465 | 9.修复了data_entity无法获取的问题 466 | 10.修复了tips只换一行的bug 467 | 11.修复内容转换中/list显示错误的bug 468 | 12.多行数据编辑创建一行会自动跳到那一行 469 | 13.现在聊天时的维度语言以接受者为准 470 | 471 | ———————————— 472 | 473 | USF0.6.2(F)更新: 474 | 475 | bug修复: 476 | 1.修复挖掘方块时的错误报错 477 | 2.删除部分多余调试消息 478 | 479 | ———————————— 480 | 481 | USF0.6.1(B)更新: 482 | 1.加入游戏规则锁定功能 483 | 2.加入服务器性能页面 484 | 3.血量显示功能升级 485 | 4.重新加入队伍系统(不稳定) 486 | 487 | bug修复: 488 | 1.修复了emoji页面显示不正常的问题 489 | 2.修复了游戏时间统计出现的bug 490 | (mojang的问题!自从1.19.60后一直没修这个bug!!!) 491 | 3.现在回调信息只显示给开启“页面调试模式”的玩家、 492 | 4.修复传送时可能出现的错误 493 | 5.修复私聊显示错误的问题 494 | 6.修复数据实体可能丢失的问题 495 | 7.修复队伍可能丢失的问题 496 | 497 | ———————————— 498 | 499 | USF 0.6.0(B)更新: 500 | 501 | 1.移除了Herobrine 502 | 2.修复ui的setCancel无效 503 | 3.更新了多行内容编辑页面,提高效率 504 | 4.提高tick工作效率 505 | 5.加入下列script事件(scriptevent命令) 506 | usf:manager 507 | 管理插件功能 508 | usf:test 509 | 测试 510 | usf:sign_board 511 | 生成留言板 512 | 6.使用动态属性保存数据,提高稳定性与安全性 513 | 7.加入最高权限OP,提高op安全性 514 | 8.将部分文本移出至setting.js统一管理 515 | 9.加入override.js用于自定义内容并不受更新影响 516 | 10.加入下来新对象与方法,用于快捷统一整理系统 517 | new arrayEditor()新建多行内容编辑 518 | save_data,save_entity_data,get_data,get_entity_data获取/保存数据 519 | 11.加入留言板功能 520 | 1.与实体交互可打开 521 | 2.在告示牌开头输入"§?"后,单击告示牌自动搜寻2格内的留言板 522 | 12.加入插件状态功能,可随时关闭/打开插件 523 | 13.加入"历史id"功能,能识别改名后的玩家 524 | 14.将语言分割符§s改成§? 525 | 15.移除信息箱,仍需要常加载区块 526 | 16.插件自带emoji改为可选项,UI的body部分支持显示emoji 527 | 17.封禁列表界面升级 528 | 18.传送页面升级,加入传送点详情功能,支持自定义图标 529 | 19.加入传送点分享功能,支持命令与页面传送 530 | 20.加入更多传送点功能,支持40个 531 | 21.加入世界传送点功能,支持40个 532 | 22.加入私人坐标点分享功能 533 | 23.TPA功能可使用双向传送 534 | 24.加入op等级与op权限功能,深入订制op 535 | 25.加入头衔功能,可在玩家设置中调整玩家功能 536 | 26.加入最高OP修改功能 537 | 27.加入禁言功能 538 | 28.高级功能加入跨语言翻译功能 539 | 29.加入页面调试模式 540 | 30.现在可以设置传送界面的内容 541 | 542 | bug修复与部分优化: 543 | 1.所有命令必须以+开头,如+tpaccept 544 | 2.修复关闭“创建传送点”页面后出现的问题 545 | 3.只有在主世界才会显示随机传送按钮 546 | 4.将游戏时间统计单位改为分钟 547 | 5.修复时间统计时的报错 548 | 6.修复随机传送后出现的bug 549 | 550 | 注:交易功能仍在施工,请勿使用 551 | 552 | ———————————— 553 | 554 | USF 0.5.7(B)更新: 555 | 556 | 1.修改版权说明,使用Apache license 2.0开源许可证 557 | 通俗来说: 558 | 1.代码开源,任何人可以把代码用于任何目的与修改,不需要同意 559 | 2.开源一旦授权则永久有效 560 | 3.修改或使用本插件代码后在新作品中标注来源,并且需要附带一份Apache license 2.0 561 | (可标注 "部分代码来自EarthDLL(earthdll@outlook.com)" ) 562 | 大家可以放心使用代码啦! 563 | 564 | 2.适配1.20.0版本 565 | 如有任何bug,请立即报告 566 | (单人模式下,设置->创建者->开启"开启日志内容GUI",如屏幕有任何报错,则截图报告,能帮助查找错误) 567 | 3.现在玩家加入日志会有两条(玩家id和玩家出生位置) 568 | 569 | ———————————— 570 | 571 | USF 0.5.6(B)更新: 572 | 573 | 高级功能系统: 574 | 正式启用 575 | 版本号:1.0 576 | 577 | 1.帮助页面支持多语言与转义,删除一个特殊的宽字符 578 | 2.新的命令支持:打开界面 579 | /scriptevent usf:open <界面id> 580 | 为执行者打开界面id对应界面 581 | 使用命令方块则需要execute命令 582 | 界面id: 583 | Help 帮助界面 584 | Board 公告栏界面 585 | Menu 主菜单 586 | Lang 语言界面 587 | 例:/execute as @p run scriptevent usf:open Help 588 | 为最近的玩家打开帮助页面 589 | 3.下面界面支持多语言: 590 | 1.关于界面 591 | 2.玩家互动界面 592 | 3.我的界面 593 | 4.现在传送时会显示title 594 | 5.部分事件的命名空间由"EarthDLL"改为"usf" 595 | 596 | bug修复: 597 | 1.修复了无法清理违禁物品的bug 598 | 2.现在无插件op的玩家无法使用工作模式 599 | 600 | (因为适配1.20.0,直接把两个版本的分支合并) 601 | 602 | ———————————— 603 | 604 | USF 0.5.5(S)更新: 605 | 606 | 适配1.19.80正式版 607 | 608 | bug修复: 609 | 1.删除判断op的调试功能 610 | 2.恢复密码箱功能 611 | 612 | Made by EarthDLL 613 | 614 | ———————————— 615 | 616 | USF 0.5.4(B)更新: 617 | 618 | 重要事件: 619 | 1.插件开源 620 | 2."日志系统"改名为"高级功能后端系统" 621 | 622 | 1.制作了新的ui系统,超强超高效率 623 | 2.添加了对多语言的支持,支持英文/中文 624 | 3.优化部分ui界面 625 | 4.自定义界面内容全部支持多语言 626 | 使用语言间隔符号 §s 627 | 5.部分ui的内容修改移动到目标界面下方 628 | (开启工作模式后自动显示) 629 | 630 | bug修复: 631 | 1.修复公告无法显示的bug 632 | 633 | Made by EarthDLL 634 | 635 | ———————————— 636 | 637 | USF 0.5.3(B)更新: 638 | 639 | 1.删除反范围挖掘功能(新版bds已经自带) 640 | 2.删除服务器反馈功能(没用) 641 | 3.加强密码箱防御力 642 | 4.信息箱被破坏自动重新保存 643 | 644 | Bug修复: 645 | 1.修复上个版本打包错误导致一系列问题 646 | 2.帮助mojang移除了Herobrine 647 | 3.修复了无法保存名字带空格的玩家的日志的问题 648 | 4.修复背包检查关闭时发生的错误 649 | 650 | Made by EarthDLL™ 651 | 652 | ———————————— 653 | 654 | USF 0.5.2(B)更新: 655 | 注:资源包有修改,需要更新! 656 | 657 | 接下来会对插件所有UI界面进行重新设计: 658 | 进度:3% 659 | 660 | 1.修改了登录方式,现在从聊天框直接输入密码登录 661 | 2.新增login命令,可以注册密码 662 | 3.修改了actionBar的位置,显示在右上角避免被遮 663 | 4.重新加入了日志系统文件 664 | 5.为README文件增加英文版 665 | 6.现在可以自定义出生点位置 666 | 7.延迟密码箱逗留时间,矿物打开密码箱不会再卡出 667 | 8.更新背包检查高级功能 668 | 669 | Made by EarthDLL™ 670 | 671 | ———————————— 672 | 673 | USF 0.5.1(B)更新: 674 | 支持1.19.70版本 675 | 676 | Made by EarthDLL™ 677 | 678 | ———————————— 679 | 680 | USF0.4.2(F)更新: 681 | 本版本修复了0.4.1的恶性bug 682 | 683 | 1.帮助界面现在可以在插件设置中更改,支持转义 684 | 2.现在可以手动开启/关闭 清洁工,杀死违禁生物,清理生物蛋 685 | 686 | bug修复: 687 | 1.违禁物品不再读取失败 688 | 2.修复了tpaccept显示名字出错,扣除贡献值错误的问题 689 | ·这么明显的bug居然没人提 690 | 3.删除了测试使用的"1" 691 | 4.转义文字每行开头现在自动"§r" 692 | ·不再出现多行一种颜色的情况 693 | 5.将部分变量var改成const常量,规范代码 694 | 6.修改可转义的内容时,编辑框不会再出错 695 | 7.现在插件op登录验证失败也会踢出 696 | 8.将插件设置界面分为两部分 697 | 9.设置不再丢失(这可真是个神奇的bug) 698 | 699 | Made by EarthDLL™ 700 | 701 | ———————————— 702 | 703 | USF0.4.1(F)更新: 704 | 705 | 1.将部分脚本实现接口化,减少命令的使用 706 | ·贡献值修改/添加使用接口 707 | ·私聊及系统提示 708 | ·音效播放 709 | 2.现在手持指定物品单击/右键方块也能打开主菜单 710 | ·该功能在冒险模式下也能打开 711 | ·异步打开菜单1秒内只能打开一个以防止bug 712 | 3.现在反作弊踢人模式默认关闭 713 | 4.插件公告默认不使用"无名氏服务器"的内容 714 | 5.修复了保存违禁物品时可能导致的error 715 | 6.将"服务器信息"界面改为"关于"界面 716 | 7.添加新的转义文字,适用于自定义菜单内容 717 | ·获取玩家名,获取玩家列表,获取计分板名字/分数,获取总时间,获取玩家位置 718 | 8.现在主菜单文字以及关于(旧服务器信息)页面文字可改,支持转义 719 | 9.公告内容支持转义 720 | 10.减少登录/注册页面弹出,避免卡顿 721 | 11.添加修改密码选项 722 | 723 | bug修复 724 | 1.修复1.19.60版本不能显示伤害血量的bug 725 | 726 | 注:由于配置信息加载问题,单人存档中可能会跳过登录,多人服务器不受影响 727 | 已知但未修复的bug: 728 | 关闭登录模式后不会弹出公告 729 | 730 | Made by EarthDLL™ 731 | 732 | ———————————— 733 | 734 | USF0.3.3(E)更新: 735 | 736 | 实验性版本 737 | 1.在设置中可开启/关闭登录模式(默认关闭) 738 | 2.完善npc系统(目前可执行的仅广播消息和运行命令) 739 | 740 | bug修复: 741 | 1.修复蝙蝠npc消失的问题 742 | 743 | 744 | 修改:B/entities/bat.json 745 | 修改:B/scripts/Main.js 746 | 747 | Made by EarthDLL™ 748 | 749 | ———————————— 750 | 751 | USF0.3.2(B)更新: 752 | 753 | 1.加入登录系统(测试ing) 754 | 2.修复小木斧选中多次的bug,并且显示红石信号(当方块被充能) 755 | 3.完善反推万物活塞 756 | 4.现在可修改违禁物品、严禁放置方块、严禁破坏方块 757 | 758 | 文件修改:B/enties/Main.js 759 | 760 | Made by EarthDLL™ 761 | 762 | ———————————— 763 | 764 | USF0.3.1(E)更新: 765 | 766 | 版本号变更: 767 | 原定v0.0.3更变更为v0.3 768 | 旧版本号:主版本.更新版本.分支+字母+版本号(1.2.3B1) 769 | 新版本号:主版本.更新版本.分支(字母)(将分支与版本号合并) 770 | 字母含义:B(beta)测试版,F(fix)修复版,S(stable)稳定版,E(experimental)实验版本 771 | 772 | 1.添加新指令Float(只有管理员可用的指令全部大写开头) 773 | 2.添加悬浮字功能 774 | 3.使用矿物打开菜单不会再有延迟 775 | 4.跨维度传送和加入游戏时给予玩家7s等级4抗性提升 776 | 5.添加进群显示欢迎消息,在管理界面-插件设置-tip处可改 777 | 778 | Bug修复 779 | 1.封禁列表内玩家不再重复 780 | 781 | 注:本版本为实验性版本,以下功能仍不完善(仅供体验) 782 | 1.悬浮字 783 | 2.反推万物活塞 784 | 785 | 文件修改: 786 | 新增:B/entities/bat.json 787 | 修改:B/scripts/Main.js 788 | 789 | Made by EarthDLL™ 790 | 791 | ———————————— 792 | 793 | 0.1.2B2更新 794 | Bug修复: 795 | 1.修复team读取失败的问题 796 | 2.修复[清洁工]显示错误的问题 797 | (该版本合并到0.3) 798 | 799 | ———————————— 800 | 801 | 0.1.2B1更新: 802 | BUG修复: 803 | 1.修复tpaccept的错误 804 | 2.修复了密码箱下方能放置漏斗的bug 805 | 3.清洁工使用新提醒方式 806 | 4.非箱主不能在密码箱旁边放置箱子 807 | 808 | ———————————— 809 | 810 | 0.1.0B1更新: 811 | 1.兼容最新1.19.60正式版 812 | 2.贡献值修改使用橙色以增加分辨度 813 | 3.修改tpa功能,更加人性化 814 | 4.随机传送后给予缓降 815 | 5.检测到违禁物品自动清除(之前是替换为苹果) 816 | 6.现在kick功能仅提示一次(防止刷屏) 817 | 7.修改log颜色(深红→浅红)便于阅读 818 | 8.公告功能再次重构 819 | 9.玩家8格范围内的物品不会被清除 820 | 10.清理非末地的末影龙 821 | 11.公告可以保存 822 | 12.使用新方法储存服务器信息 823 | 13.将部分"返回上一级"按钮调至最上面 824 | 14.管理界面新增"运行命令"功能 825 | 15.新增Fill blocks(小木斧)功能 826 | 16.新增封禁列表管理功能,封禁列表将永久保存 827 | 17.部分传送点支持跨纬度传送 828 | 18.添加插件设置功能,可自由开关踢人模式 829 | 19.将"光源方块"和"隐形基岩"加入黑名单 830 | 831 | 832 | Bug修复: 833 | 1.修复tpa贡献值错误 834 | 2.修复在密码箱下面放置漏斗时有几率检测失败的bug 835 | 3.修复部分ui标题错误 836 | 4.修复无法获取信息时刷屏问题(新版本自动初始化) 837 | 5.修复nbt箱子检测错误的bug 838 | 839 | ———————————— 840 | 841 | 0.0.03更新: 842 | 1.漏斗不能放置在密码箱下面,且不能将漏斗推至密码箱下方 843 | 2.使用hex_md5对密码箱进行加密 844 | 3.违禁物品现在已数组变量形式保存(kick_item) 845 | 4.当违禁物品以掉落物形式出现时自动销毁 846 | 5.已删除 847 | 6.修改公告功能重构 848 | 7.加强范围挖掘,自动恢复地形 849 | 8.管理界面的封禁功能改成kick踢人 850 | 9.密码纸现可以回收 851 | 852 | Bug修复: 853 | 1.修复entities统计出现重大错误的问题 854 | 855 | --------------------------------------------------------------------------------