代码初始化

This commit is contained in:
Giao committed 2026-10-09 18:23:57 +08:00
1 parent c2f5cd98ff
commit e3efeb74ad
2439 files changed
+305661 -1

No files matched your search

+3
View File
@@ -1,4 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="Black">
<option name="sdkName" value="Python 2.7" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7" project-jdk-type="Python SDK" />
</project> </project>
+497
View File
@@ -0,0 +1,497 @@
# -*- coding: utf-8 -*-
"""救护车一次性生成器 (v3,支持多车型):
对 CARS 里的每个车型:
1) 依据其源模型(用户原始模型,已按网易规则做过 X 镜像)逐立方体做层级变换,
得到世界空间 AABB。关键:网易方块实体的渲染映射为 world = (-geo_x/16, geo_y/16, geo_z/16),
即 X 轴镜像;因此碰撞检测必须使用镜像后的世界坐标。
2) 对 4 个车体旋转角 φ(0/90/180/270) 分别求「每格与车体的交集 AABB」,量化到 1/QUANT 格并去重;
几何体根骨骼 Y 角设为 90 - φ(才能得到世界旋转 φ),并把整车居中到主方块中心、车底贴地。
3) 生成:每个车型一份预旋转几何体(4 条,按朝向)、4 个主方块 + 若干形状共享占位方块;
汇总生成 blocks.json、terrain_texture.json,并把布局数据写入 ambulanceServer.py 末尾。
车型命名规则(tag):
主方块 dn_sa:<tag>_main_<yaw>
占位方块 dn_sa:<tag>_ph_<NN> (形状共享,仅提供碰撞)
几何体 geometry.dn_sa_<tag>_<yaw> -> resource_pack/models/entity/<tag>_geo.json
client_entity entity/<tag>_main_<yaw>_block_entity.json
"""
import json
import math
import os
import io
ROOT = r"e:\MCStudioDownload\work\3027246179@qq.com\Cpp\AddOn\0aaaa4f2f16c46e8964025a5ab0ecc02"
BP = os.path.join(ROOT, "behavior_pack_kcH4M5u0")
RP = os.path.join(ROOT, "resource_pack_t7eJjrxY")
BEH_BLOCKS_DIR = os.path.join(BP, "netease_blocks")
ENTITY_DIR = os.path.join(RP, "entity")
MODELS_DIR = os.path.join(RP, r"models\entity")
# ---------------------------------------------------------------- 车型配置
# tag 决定所有资源的命名;src 是源模型;tex 是该车的整车贴图(client_entity 用)
CARS = [
{
"item": "dn_sa:ambulance_car",
"tag": "ambulance_car",
"src": os.path.join(ROOT, "_gen_amb_src.geo.json"),
"tex": "textures/blocks/ambulance_car",
},
{
"item": "dn_sa:ambulance_car_broken",
"tag": "ambulance_car_broken",
"src": os.path.join(ROOT, "_gen_amb_src_broken.geo.json"),
"tex": "textures/blocks/ambulance_broken",
},
{
"item": "dn_sa:ambulance_car_destroyed",
"tag": "ambulance_car_destroyed",
"src": os.path.join(ROOT, "_gen_amb_src_destroyed.geo.json"),
"tex": "textures/blocks/ambulance_destroyed",
},
]
# 模型原点(0,0,0) 对应的主方块格上的位置(最小角)。若游戏内整车整体偏移,改这里即可。
ANCHOR = (0.0, 0.0, 0.0)
QUANT = 8 # 碰撞盒量化精度:1/8 格(约 2 个贴图像素)
YAWS = (0, 90, 180, 270) # 车体在世界空间的旋转角 φ(几何体根骨骼 Y 角 = 90 - φ)
# 玩家朝向象限(0=南+Z,90=西-X,180=北-Z,270=东+X) -> 车体世界旋转角 φ
# 依据:φ=0 时车头(capo)朝 -X;把 -X 经 Ry(φ) 转到玩家朝向
EXTRA_BY_FACING = {0: 90, 90: 0, 180: 270, 270: 180}
# 「车体局部格」(φ=0 坐标系,相对主方块的偏移) —— 这些格子不生成占位方块。
# 1) 挡风玻璃前上方 / 引擎盖正上方那一片:玻璃是斜的(rot -60),它的整体包围盒把它前上方
# 那几格也算了进去,但那里几乎全是空气,碰撞盒会悬在车外。
# 2) 引擎盖最前面(x=-3) 顶层(y=2):该层只有车头那 0.3 格高的一小条,比它后面一格
# (x=-2 顶层已被剔除) 高出来一截,看起来像引擎盖前端多出一块,一并剔除。
# 3) 警灯上方(x=-1) 顶层(y=3):驾驶室顶只有 2.79 高、警灯顶 3.02,这一层(3.0~3.5)全部
# 来自斜挡风玻璃包围盒的溢出,正好悬在警灯上方,看起来像警灯位置高出来一块。
SKIP_LOCAL = {
(-2, 2, -1), (-2, 2, 0), (-2, 2, 1),
(-2, 3, -1), (-2, 3, 0), (-2, 3, 1),
(-3, 2, -1), (-3, 2, 0), (-3, 2, 1),
(-1, 3, -1), (-1, 3, 0), (-1, 3, 1),
}
BLANK_MODEL = "dn_sa:ambulance_blank_model"
# 主方块碰撞盒模式(网易方块实体的模型可见性跟着「方块所在位置」走,主方块碰撞盒太小时,
# 玩家把屏幕转开、方块位置离开视野,整车的实体模型就会停止渲染而消失):
# "model":给主方块一个涵盖整车的碰撞盒(解决上述消失问题)
# "cell" :只用主方块自己那一格的碰撞盒(旧行为,其余碰撞靠占位方块)
MAIN_BOX_MODE = "model"
def model_box(bones, anchor):
"""整车在世界空间(相对主方块)的包围盒 (lo, hi)。"""
boxes = world_boxes(bones, False) # 含零厚度面片,才能真的涵盖整个模型
lo = [min(bx[0][i] for bx in boxes) + anchor[i] for i in range(3)]
hi = [max(bx[1][i] for bx in boxes) + anchor[i] for i in range(3)]
return lo, hi
def skip_cells(phi):
"""把车体局部格按 yaw 旋转成世界格(与几何体同向)。"""
out = set()
for (x, y, z) in SKIP_LOCAL:
if phi == 0:
ax, az = x, z
elif phi == 90:
ax, az = z, -x
elif phi == 180:
ax, az = -x, -z
else:
ax, az = -z, x
out.add((ax, y, az))
return out
# ---------------------------------------------------------------- math
def mat_mul(a, b):
return [[sum(a[i][k] * b[k][j] for k in range(3)) for j in range(3)] for i in range(3)]
def rot_axis(axis, deg):
t = math.radians(deg)
c, s = math.cos(t), math.sin(t)
if axis == 'x':
return [[1, 0, 0], [0, c, -s], [0, s, c]]
if axis == 'y':
return [[c, 0, s], [0, 1, 0], [-s, 0, c]]
return [[c, -s, 0], [s, c, 0], [0, 0, 1]]
def euler(rx, ry, rz):
m = rot_axis('y', ry)
m = mat_mul(m, rot_axis('x', rx))
m = mat_mul(m, rot_axis('z', rz))
return m
def apply(m, v, pivot):
d = [v[i] - pivot[i] for i in range(3)]
return [sum(m[i][k] * d[k] for k in range(3)) + pivot[i] for i in range(3)]
def cube_corners(cube):
o = cube['origin']
s = cube['size']
pt = cube.get('pivot', [0, 0, 0])
pts = [[o[0] + s[0] * dx, o[1] + s[1] * dy, o[2] + s[2] * dz]
for dx in (0, 1) for dy in (0, 1) for dz in (0, 1)]
rot = cube.get('rotation')
if rot and any(abs(v) > 1e-9 for v in rot):
m = euler(rot[0], rot[1], rot[2])
pts = [apply(m, p, pt) for p in pts]
return pts
def bone_world(by_name, bone, p):
b = bone
while b is not None:
rot = b.get('rotation')
if rot and any(abs(v) > 1e-9 for v in rot):
m = euler(rot[0], rot[1], rot[2])
p = apply(m, p, b.get('pivot', [0, 0, 0]))
b = by_name.get(b.get('parent'))
return p
def world_boxes(bones, skip_degenerate=True):
by_name = {b['name']: b for b in bones}
out = []
for b in bones:
for cube in b.get('cubes', []):
pts = [bone_world(by_name, b, p) for p in cube_corners(cube)]
# 网易方块实体:世界 X = -几何体 X(镜像),Y/Z 不变
pts = [[-p[0] / 16.0, p[1] / 16.0, p[2] / 16.0] for p in pts]
lo = [min(p[i] for p in pts) for i in range(3)]
hi = [max(p[i] for p in pts) for i in range(3)]
if skip_degenerate and (hi[0] - lo[0] < 1e-9 or hi[1] - lo[1] < 1e-9
or hi[2] - lo[2] < 1e-9):
continue # 零厚度面片不产生碰撞
out.append((lo, hi))
return out
def cells_for(boxes, anchor):
cells = {}
for lo, hi in boxes:
lo = [lo[i] + anchor[i] for i in range(3)]
hi = [hi[i] + anchor[i] for i in range(3)]
for ix in range(int(math.floor(lo[0])), int(math.floor(hi[0] - 1e-9)) + 1):
for iy in range(int(math.floor(lo[1])), int(math.floor(hi[1] - 1e-9)) + 1):
for iz in range(int(math.floor(lo[2])), int(math.floor(hi[2] - 1e-9)) + 1):
key = (ix, iy, iz)
l = [max(lo[0], ix), max(lo[1], iy), max(lo[2], iz)]
h = [min(hi[0], ix + 1), min(hi[1], iy + 1), min(hi[2], iz + 1)]
if key not in cells:
cells[key] = [l, h]
else:
pl, ph = cells[key]
cells[key] = [[min(pl[i], l[i]) for i in range(3)],
[max(ph[i], h[i]) for i in range(3)]]
return cells
def q(v, quant):
return round(v * quant) / float(quant)
def local_aabb(cell, l, h, quant=QUANT):
"""返回该格内 0~1 的局部 AABB(量化 1/quant),退化则返回 None。"""
lo = [min(1.0, max(0.0, q(l[i] - cell[i], quant))) for i in range(3)]
hi = [min(1.0, max(0.0, q(h[i] - cell[i], quant))) for i in range(3)]
if any(hi[i] - lo[i] <= 1e-6 for i in range(3)):
return None
return tuple(lo + hi)
# ---------------------------------------------------------------- per-car 计算
def load_model(path):
with io.open(path, 'r', encoding='utf-8') as f:
raw = json.load(f)
geo = raw['minecraft:geometry'][0]
root = [b['name'] for b in geo['bones'] if 'parent' not in b][0]
return geo, root
def bones_for_yaw(base_geo, root_name, phi):
"""车体世界旋转 φ 时对应的几何体骨骼:根骨骼 Y=90-φ,并把整车居中到主方块中心、车底贴地。"""
bones = json.loads(json.dumps(base_geo['bones']))
for b in bones:
if b['name'] == root_name:
r = list(b.get('rotation', [0, 0, 0]))
b['rotation'] = [r[0], r[1] - phi, r[2]]
# 求世界包围盒(已含 X 镜像,含零厚度面片),据此算居中/贴地平移量
boxes = world_boxes(bones, False)
lo = [min(bx[0][i] for bx in boxes) for i in range(3)]
hi = [max(bx[1][i] for bx in boxes) for i in range(3)]
cx = (lo[0] + hi[0]) / 2.0
cz = (lo[2] + hi[2]) / 2.0
tw = (0.5 - cx, -lo[1], 0.5 - cz) # 期望世界平移:X/Z 居中,车底 y=0
shift = [-16.0 * tw[0], 16.0 * tw[1], 16.0 * tw[2]] # 几何体空间平移 Δ = 16*diag(-1,1,1)*tw
for b in bones:
p = b.get('pivot', [0, 0, 0])
b['pivot'] = [p[i] + shift[i] for i in range(3)]
for c in b.get('cubes', []):
o = c['origin']
c['origin'] = [o[i] + shift[i] for i in range(3)]
if 'pivot' in c: # 立方体自带旋转轴心也需平移,否则非纯平移
cp = c['pivot']
c['pivot'] = [cp[i] + shift[i] for i in range(3)]
return bones
def wjson(path, obj):
with io.open(path, 'w', encoding='utf-8') as f:
f.write(json.dumps(obj, indent=2, ensure_ascii=False))
f.write(u"\n")
def block_json(identifier, aabb):
lo, hi = aabb
return {
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": identifier,
"register_to_creative_menu": False,
"is_experimental": False,
"category": "dn_sa",
},
"components": {
"netease:solid": {"value": True},
"netease:render_layer": {"value": "alpha"},
"minecraft:destroy_time": {"value": 1.0},
"minecraft:block_light_absorption": {"value": 0},
"netease:aabb": {
"collision": {"min": list(lo), "max": list(hi)},
"clip": {"min": list(lo), "max": list(hi)},
},
},
},
}
# 清理可能残留的旧文件(旧命名 / 旧的占位方块 / 旧的渲染锚点方块与客户端实体)
for f in os.listdir(BEH_BLOCKS_DIR):
if not f.endswith(".json"):
continue
if f == "ambulance_car_main.json" or ("ambulance_car" in f and "_ph_" in f):
os.remove(os.path.join(BEH_BLOCKS_DIR, f))
for f in os.listdir(ENTITY_DIR):
if not f.endswith(".json"):
continue
if "ambulance_car" in f and f.endswith("_block_entity.json"):
os.remove(os.path.join(ENTITY_DIR, f))
old_ent = os.path.join(ENTITY_DIR, "ambulance_car_main_block_entity.json")
if os.path.exists(old_ent):
os.remove(old_ent)
results = []
for car in CARS:
tag = car["tag"]
main_prefix = "dn_sa:%s_main" % tag
ph_prefix = "dn_sa:%s_ph_" % tag
geo_id = "geometry.dn_sa_%s" % tag
base_geo, root_name = load_model(car["src"])
per_yaw = {} # yaw -> {cell: local_aabb}(逐格碰撞盒)
yaw_bones = {} # yaw -> 已旋转/居中/贴地的骨骼
main_box = {} # yaw -> 整车包围盒(主方块「涵盖整个模型」碰撞盒)
shapes = {} # local_aabb -> None(形状共享)
for yaw in YAWS:
bones = bones_for_yaw(base_geo, root_name, yaw)
yaw_bones[yaw] = bones
cells = cells_for(world_boxes(bones), ANCHOR)
skip = skip_cells(yaw)
table = {}
removed = []
for cell, (l, h) in sorted(cells.items()):
if cell in skip:
removed.append(cell)
continue
la = local_aabb(cell, l, h)
if la is None:
continue
table[cell] = la
per_yaw[yaw] = table
main_box[yaw] = model_box(bones, ANCHOR)
for la in table.values():
shapes.setdefault(la, None)
print("[%s] yaw=%3d cells=%3d shapes=%3d removed=%s"
% (tag, yaw, len(table), len(set(table.values())), removed))
# 形状共享占位方块命名(每种「格内碰撞盒」一个变体,被多格复用)
names = {}
for i, shape in enumerate(sorted(shapes.keys())):
names[shape] = "%s%02d" % (ph_prefix, i)
# 每格最终方块名:主方块所在格用主方块,其余用形状共享占位方块
cellname = {}
for yaw in YAWS:
m = {}
for cell, la in per_yaw[yaw].items():
if cell == (0, 0, 0):
continue
m[cell] = names[la]
cellname[yaw] = m
print("[%s] placeholder shapes=%d" % (tag, len(names)))
# 1) 预旋转几何体:每个朝向一条,渲染整车
geos = []
for yaw in YAWS:
desc = dict(base_geo["description"])
desc["identifier"] = "%s_%d" % (geo_id, yaw)
geos.append({"description": desc, "bones": yaw_bones[yaw]})
wjson(os.path.join(MODELS_DIR, "%s_geo.json" % tag),
{"format_version": "1.21.0", "minecraft:geometry": geos})
# 2) client_entity:每个朝向一份,渲染整车
for yaw in YAWS:
name = "%s_%d" % (main_prefix, yaw)
ent = {
"format_version": "1.10.0",
"minecraft:client_entity": {
"description": {
"identifier": name,
"geometry": {"default": "%s_%d" % (geo_id, yaw)},
"textures": {"default": car["tex"]},
"materials": {"default": "entity_alphatest"},
"render_controllers": [
{"controller.render.dn_sa_ambulance_car_main": "variable.variant == 0"}
],
"scripts": {"initialize": ["variable.variant = 0;"]},
}
},
}
wjson(os.path.join(ENTITY_DIR, "%s_main_%d_block_entity.json" % (tag, yaw)), ent)
# 3) 方块定义:主方块(带 block_entity) + 形状共享占位方块
for yaw in YAWS:
name = "%s_%d" % (main_prefix, yaw)
if MAIN_BOX_MODE == "model":
lo, hi = main_box[yaw] # 一个碰撞盒涵盖整车
else:
la = per_yaw[yaw].get((0, 0, 0)) or (0.0, 0.0, 0.0, 1.0, 1.0, 1.0)
lo, hi = la[:3], la[3:]
obj = block_json(name, (lo, hi))
obj["minecraft:block"]["components"]["netease:block_entity"] = {"tick": False, "movable": False}
wjson(os.path.join(BEH_BLOCKS_DIR, "%s_main_%d.json" % (tag, yaw)), obj)
for shape, name in sorted(names.items(), key=lambda kv: kv[1]):
short = name.split(":", 1)[1]
wjson(os.path.join(BEH_BLOCKS_DIR, short + ".json"),
block_json(name, (shape[:3], shape[3:])))
results.append({
"item": car["item"], "tag": tag, "tex": car["tex"],
"main_prefix": main_prefix, "ph_prefix": ph_prefix,
"cellname": cellname, "names": names,
})
print("[%s] wrote geo + %d client_entity + %d block defs"
% (tag, len(YAWS), len(YAWS) + len(names)))
# ---------------------------------------------------------------- blocks.json
blocks = {"format_version": [1, 1, 0]}
blocks["dn_sa:generator"] = {
"sound": "stone",
"client_entity": {
"identifier": "dn_sa:generator",
"hand_model_use_client_entity": True,
"destroyed_textures": "dn_sa:generator_icon",
"block_icon": "dn_sa:generator_icon",
},
}
blocks["dn_sa:salvage_bin"] = {
"sound": "stone",
"client_entity": {
"identifier": "dn_sa:salvage_bin",
"hand_model_use_client_entity": True,
"destroyed_textures": "dn_sa:salvage_bin_icon",
"block_icon": "dn_sa:salvage_bin_icon",
},
}
for car in results:
for yaw in YAWS:
name = "%s_%d" % (car["main_prefix"], yaw)
blocks[name] = {
"sound": "stone",
"client_entity": {
"identifier": name,
"hand_model_use_client_entity": True,
"destroyed_textures": car["item"],
"block_icon": car["item"],
},
}
for car in results:
for shape, name in sorted(car["names"].items(), key=lambda kv: kv[1]):
blocks[name] = {"sound": "stone", "netease_model": BLANK_MODEL}
wjson(os.path.join(RP, "blocks.json"), blocks)
print("wrote blocks.json (%d entries)" % len(blocks))
# ---------------------------------------------------------------- terrain_texture.json
tt_path = os.path.join(RP, r"textures\terrain_texture.json")
with io.open(tt_path, 'r', encoding='utf-8') as f:
tt = json.load(f)
td = tt["texture_data"]
for legacy in ("dn_sa_ambulance_car_main", "dn_sa_ambulance_car_placeholder"):
td.pop(legacy, None)
for key in [k for k in td if k.startswith("dn_sa:ambulance") and "_ph_a" in k]:
td.pop(key, None) # 清掉上一次生成的渲染锚点贴图条目
for car in results:
td["dn_sa_%s" % car["tag"]] = {"textures": car["tex"]} # 方块破坏/图标贴图
for yaw in YAWS:
td["%s_%d" % (car["main_prefix"], yaw)] = {"textures": "textures/blocks/dn_sa_blank"}
wjson(tt_path, tt)
print("wrote terrain_texture.json")
# ---------------------------------------------------------------- 注入碰撞数据到 ambulanceServer.py
MARKER = u"# ==== AUTO-GENERATED LAYOUT DATA (by _gen_amb.py, do not edit) ===="
lines = []
lines.append(u"")
lines.append(MARKER)
lines.append(u"# 玩家朝向象限(0=南+Z,90=西-X,180=北-Z,270=东+X) -> 车体额外 Y 旋转角")
lines.append(u"EXTRA_BY_FACING = {")
for k in sorted(EXTRA_BY_FACING):
lines.append(u" %d: %d," % (k, EXTRA_BY_FACING[k]))
lines.append(u"}")
lines.append(u"# 物品名 -> 车型数据")
lines.append(u"CARS = {}")
for car in results:
lines.append(u"CARS['%s'] = {" % car["item"])
lines.append(u" 'main_prefix': '%s'," % car["main_prefix"])
lines.append(u" 'ph_prefix': '%s'," % car["ph_prefix"])
lines.append(u" 'main': {")
for yaw in YAWS:
lines.append(u" %d: '%s_%d'," % (yaw, car["main_prefix"], yaw))
lines.append(u" },")
lines.append(u" 'cells': {")
for yaw in YAWS:
lines.append(u" %d: {" % yaw)
for cell in sorted(car["cellname"][yaw].keys()):
if cell == (0, 0, 0):
continue
lines.append(u" (%d, %d, %d): '%s',"
% (cell[0], cell[1], cell[2], car["cellname"][yaw][cell]))
lines.append(u" },")
lines.append(u" },")
lines.append(u"}")
data_block = u"\n".join(lines)
server_path = os.path.join(BP, r"Script_dn_sa\ambulanceServer.py")
with io.open(server_path, 'r', encoding='utf-8') as f:
content = f.read()
idx = content.find(MARKER)
if idx < 0:
raise RuntimeError("marker not found in ambulanceServer.py")
with io.open(server_path, 'w', encoding='utf-8') as f:
f.write(content[:idx] + data_block + u"\n")
print("injected layout data into ambulanceServer.py")
old_layout = os.path.join(BP, r"Script_dn_sa\ambulanceLayout.py")
if os.path.exists(old_layout):
os.remove(old_layout)
print("DONE")
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+739
View File
@@ -0,0 +1,739 @@
{
"format_version": "1.21.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.unknown",
"texture_width": 512,
"texture_height": 512,
"visible_bounds_width": 14,
"visible_bounds_height": 5,
"visible_bounds_offset": [0, 1.5, 0]
},
"bones": [
{
"name": "main",
"pivot": [11, -13, -8],
"rotation": [0, 90, 0]
},
{
"name": "car_shapes",
"parent": "main",
"pivot": [11, -13, -8],
"cubes": [
{"origin": [3, 6, -19], "size": [16, 16, 16], "uv": [-28, -14]},
{
"origin": [-8.95, 6, 9.1],
"size": [38.95, 19, 25.08],
"uv": {}
},
{
"origin": [-8, 6, -59.775],
"size": [38, 46.55, 51.775],
"uv": {}
},
{
"origin": [-8.95, 6, -8],
"size": [38.95, 20.9, 17.1],
"uv": {}
},
{
"origin": [-8, 26.9, -7.62],
"size": [38, 17.1, 17.67],
"uv": {}
}
]
},
{
"name": "bone2",
"parent": "main",
"pivot": [26.4375, 1.25, -30.135]
},
{
"name": "carr",
"parent": "bone2",
"pivot": [26.4375, -2.25, -30.135],
"cubes": [
{
"origin": [19.55, 40.5, -62.15],
"size": [5.7, 2.85, 1.9],
"uv": {
"north": {"uv": [286, 479], "uv_size": [6, 3]},
"east": {"uv": [300, 479], "uv_size": [2, 3]},
"south": {"uv": [294, 479], "uv_size": [6, 3]},
"west": {"uv": [292, 479], "uv_size": [2, 3]},
"up": {"uv": [292, 473], "uv_size": [2, 6], "uv_rotation": 270},
"down": {"uv": [294, 479], "uv_size": [2, -6], "uv_rotation": 90}
}
}
]
},
{
"name": "bone3",
"parent": "carr",
"pivot": [26.4375, -2.25, -30.135],
"cubes": [
{
"origin": [-8.95, 15.8, -48.47],
"size": [1.9, 5.7, 58.9],
"uv": {
"north": {"uv": [241, 217], "uv_size": [2, 6]},
"east": {"uv": [179, 217], "uv_size": [62, 6]},
"south": {"uv": [305, 217], "uv_size": [2, 6]},
"west": {"uv": [243, 217], "uv_size": [62, 6]},
"up": {"uv": [241, 155], "uv_size": [2, 62]},
"down": {"uv": [243, 217], "uv_size": [2, -62]}
}
},
{
"origin": [29.05, 15.8, -48.47],
"size": [1.9, 5.7, 58.9],
"uv": {
"north": {"uv": [243, 217], "uv_size": [-2, 6]},
"east": {"uv": [305, 217], "uv_size": [-62, 6]},
"south": {"uv": [307, 217], "uv_size": [-2, 6]},
"west": {"uv": [241, 217], "uv_size": [-62, 6]},
"up": {"uv": [243, 155], "uv_size": [-2, 62]},
"down": {"uv": [245, 217], "uv_size": [-2, -62]}
}
},
{
"origin": [-8.07125, 27.63016, 7.07871],
"size": [38.3325, 8.55, 18.05],
"pivot": [26.295, 34.75516, 8.50371],
"rotation": [-60, 0, 0],
"uv": {
"north": {"uv": [245, 19], "uv_size": [40, 9]},
"east": {"uv": [226, 19], "uv_size": [19, 9]},
"south": {"uv": [304, 19], "uv_size": [40, 9]},
"west": {"uv": [285, 19], "uv_size": [19, 9]},
"up": {"uv": [245, 0], "uv_size": [40, 19]},
"down": {"uv": [285, 19], "uv_size": [40, -19]}
}
},
{
"origin": [-8, 21.5, -6.67],
"size": [38, 14.25, 25.65],
"uv": {
"north": {"uv": [56, 354], "uv_size": [40, 15]},
"east": {"uv": [29, 354], "uv_size": [27, 15]},
"south": {"uv": [123, 354], "uv_size": [40, 15]},
"west": {"uv": [96, 354], "uv_size": [27, 15]},
"up": {"uv": [56, 327], "uv_size": [40, 27]},
"down": {"uv": [96, 354], "uv_size": [40, -27]}
}
},
{
"origin": [-8, 35.75, -59.87],
"size": [38, 2.85, 70.3],
"uv": {
"north": {"uv": [73, 73], "uv_size": [40, 3]},
"east": {"uv": [0, 73], "uv_size": [73, 3]},
"south": {"uv": [187, 73], "uv_size": [40, 3]},
"west": {"uv": [113, 73], "uv_size": [74, 3]},
"up": {"uv": [73, 0], "uv_size": [40, 73]},
"down": {"uv": [113, 73], "uv_size": [40, -74]}
}
},
{
"origin": [-8, 38.6, -59.87],
"size": [38, 8.55, 52.25],
"uv": {
"north": {"uv": [227, 494], "uv_size": [40, 9]},
"east": {"uv": [172, 494], "uv_size": [55, 9]},
"south": {"uv": [322, 494], "uv_size": [40, 9]},
"west": {"uv": [267, 494], "uv_size": [55, 9]},
"up": {"uv": [227, 439], "uv_size": [40, 55]},
"down": {"uv": [267, 494], "uv_size": [40, -55]}
}
},
{
"origin": [-8.095, 15.8, -10.09],
"size": [0, 0.95, 22.04],
"uv": {
"north": {"uv": [237, 297], "uv_size": [0, 1]},
"east": {"uv": [214, 297], "uv_size": [23, 1]},
"south": {"uv": [260, 297], "uv_size": [0, 1]},
"west": {"uv": [237, 297], "uv_size": [23, 1]},
"up": {"uv": [237, 274], "uv_size": [0, 23]},
"down": {"uv": [237, 297], "uv_size": [0, -23]}
}
},
{
"origin": [-8.855, 20.32309, 16.98838],
"size": [39.73375, 1.9, 18.24],
"pivot": [28.3375, 23.17309, 10.33838],
"rotation": [-15, 0, 0],
"uv": {
"north": {"uv": [290, 189], "uv_size": [41, 2]},
"east": {"uv": [271, 189], "uv_size": [19, 2]},
"south": {"uv": [350, 189], "uv_size": [41, 2]},
"west": {"uv": [331, 189], "uv_size": [19, 2]},
"up": {"uv": [290, 170], "uv_size": [41, 19]},
"down": {"uv": [331, 189], "uv_size": [41, -19]}
}
},
{
"origin": [-4.2, 0.6, 10.43],
"size": [30.4, 11.4, 17.1],
"uv": {
"north": {"uv": [272, 242], "uv_size": [32, 12]},
"east": {"uv": [254, 242], "uv_size": [18, 12]},
"south": {"uv": [322, 242], "uv_size": [32, 12]},
"west": {"uv": [304, 242], "uv_size": [18, 12]},
"up": {"uv": [272, 224], "uv_size": [32, 18]},
"down": {"uv": [304, 242], "uv_size": [32, -18]}
}
},
{
"origin": [-4.485, 0.6, -51.32],
"size": [30.97, 15.2, 20.9],
"uv": {
"north": {"uv": [248, 49], "uv_size": [32, 16]},
"east": {"uv": [226, 49], "uv_size": [22, 16]},
"south": {"uv": [302, 49], "uv_size": [32, 16]},
"west": {"uv": [280, 49], "uv_size": [22, 16]},
"up": {"uv": [248, 27], "uv_size": [32, 22]},
"down": {"uv": [280, 49], "uv_size": [32, -22]}
}
}
]
},
{
"name": "bone4",
"parent": "bone3",
"pivot": [26.4375, -1.3, -30.135],
"cubes": [
{
"origin": [-8.95, 5.35, 10.43],
"size": [39.9, 16.15, 23.75],
"uv": {
"north": {"uv": [25, 235], "uv_size": [42, 17]},
"east": {"uv": [0, 235], "uv_size": [25, 17]},
"south": {"uv": [92, 235], "uv_size": [42, 17]},
"west": {"uv": [67, 235], "uv_size": [25, 17]},
"up": {"uv": [25, 210], "uv_size": [42, 25]},
"down": {"uv": [67, 235], "uv_size": [42, -25]}
}
},
{
"origin": [-8.92625, 19.6, 16.985],
"size": [39.8525, 1.9, 1.14],
"uv": {
"north": {"uv": [74, 312], "uv_size": [41, 2]},
"east": {"uv": [73, 312], "uv_size": [1, 2]},
"south": {"uv": [116, 312], "uv_size": [41, 2]},
"west": {"uv": [115, 312], "uv_size": [1, 2]},
"up": {"uv": [74, 311], "uv_size": [41, 1]},
"down": {"uv": [115, 312], "uv_size": [41, -1]}
}
},
{
"origin": [-8.95, 5.35, 26.58],
"size": [39.9, 5.7, 0],
"uv": {
"north": {"uv": [44, 483], "uv_size": [42, 6]},
"east": {"uv": [44, 483], "uv_size": [0, 6]},
"south": {"uv": [86, 483], "uv_size": [42, 6]},
"west": {"uv": [86, 483], "uv_size": [0, 6]},
"up": {"uv": [44, 483], "uv_size": [42, 0]},
"down": {"uv": [86, 483], "uv_size": [42, 0]}
}
},
{
"origin": [-8.95, 11.05, 10.43],
"size": [39.9, 0, 18.05],
"uv": {
"north": {"uv": [98, 473], "uv_size": [42, 0]},
"east": {"uv": [79, 473], "uv_size": [19, 0]},
"south": {"uv": [159, 473], "uv_size": [42, 0]},
"west": {"uv": [140, 473], "uv_size": [19, 0]},
"up": {"uv": [98, 454], "uv_size": [42, 19]},
"down": {"uv": [140, 473], "uv_size": [42, -19]}
}
},
{
"origin": [-8, 7.25, 34.18],
"size": [38, 8.55, 0.95],
"uv": {
"north": {"uv": [165, 342], "uv_size": [40, 9]},
"east": {"uv": [164, 342], "uv_size": [1, 9]},
"south": {"uv": [206, 342], "uv_size": [40, 9]},
"west": {"uv": [205, 342], "uv_size": [1, 9]},
"up": {"uv": [165, 341], "uv_size": [40, 1]},
"down": {"uv": [205, 342], "uv_size": [40, -1]}
}
},
{
"origin": [-8.95, 0.6, 26.58],
"size": [39.9, 4.75, 9.5],
"uv": {
"north": {"uv": [119, 269], "uv_size": [42, 5]},
"east": {"uv": [109, 269], "uv_size": [10, 5]},
"south": {"uv": [171, 269], "uv_size": [42, 5]},
"west": {"uv": [161, 269], "uv_size": [10, 5]},
"up": {"uv": [119, 259], "uv_size": [42, 10]},
"down": {"uv": [161, 269], "uv_size": [42, -10]}
}
},
{
"origin": [5.3, -0.35, 36.08],
"size": [11.4, 4.75, 0.95],
"uv": {
"north": {"uv": [136, 211], "uv_size": [12, 5]},
"east": {"uv": [135, 211], "uv_size": [1, 5]},
"south": {"uv": [149, 211], "uv_size": [12, 5]},
"west": {"uv": [148, 211], "uv_size": [1, 5]},
"up": {"uv": [136, 210], "uv_size": [12, 1]},
"down": {"uv": [148, 211], "uv_size": [12, -1]}
}
},
{
"origin": [5.3, -0.35, -61.58],
"size": [11.4, 4.75, 0.95],
"uv": {
"north": {"uv": [136, 211], "uv_size": [12, 5]},
"east": {"uv": [135, 211], "uv_size": [1, 5]},
"south": {"uv": [149, 211], "uv_size": [12, 5]},
"west": {"uv": [148, 211], "uv_size": [1, 5]},
"up": {"uv": [136, 210], "uv_size": [12, 1]},
"down": {"uv": [148, 211], "uv_size": [12, -1]}
}
},
{
"origin": [-8.95, 0.6, -31.37],
"size": [39.9, 15.2, 41.8],
"uv": {
"north": {"uv": [44, 193], "uv_size": [42, 16]},
"east": {"uv": [0, 193], "uv_size": [44, 16]},
"south": {"uv": [130, 193], "uv_size": [42, 16]},
"west": {"uv": [86, 193], "uv_size": [44, 16]},
"up": {"uv": [44, 149], "uv_size": [42, 44]},
"down": {"uv": [86, 193], "uv_size": [42, -44]}
}
},
{
"origin": [-8.95, 5.35, -48.47],
"size": [39.9, 10.45, 17.1],
"uv": {
"north": {"uv": [384, 362], "uv_size": [42, 11]},
"east": {"uv": [366, 362], "uv_size": [18, 11]},
"south": {"uv": [444, 362], "uv_size": [42, 11]},
"west": {"uv": [426, 362], "uv_size": [18, 11]},
"up": {"uv": [384, 344], "uv_size": [42, 18]},
"down": {"uv": [426, 362], "uv_size": [42, -18]}
}
},
{
"origin": [-8.95, 0.6, -60.82],
"size": [39.9, 4.75, 12.35],
"uv": {
"north": {"uv": [267, 268], "uv_size": [42, 5]},
"east": {"uv": [254, 268], "uv_size": [13, 5]},
"south": {"uv": [322, 268], "uv_size": [42, 5]},
"west": {"uv": [309, 268], "uv_size": [13, 5]},
"up": {"uv": [267, 255], "uv_size": [42, 13]},
"down": {"uv": [309, 268], "uv_size": [42, -13]}
}
}
]
},
{
"name": "bone11",
"parent": "bone4",
"pivot": [-6.3375, 0.6, -34.885],
"cubes": [
{
"origin": [0.55, -0.35, 34.18],
"size": [1.9, 7.6, 3.8],
"uv": {
"north": {"uv": [224, 383], "uv_size": [-2, 8]},
"east": {"uv": [228, 383], "uv_size": [-4, 8]},
"south": {"uv": [230, 383], "uv_size": [-2, 8]},
"west": {"uv": [222, 383], "uv_size": [-4, 8]},
"up": {"uv": [224, 379], "uv_size": [-2, 4]},
"down": {"uv": [226, 383], "uv_size": [-2, -4]}
}
},
{
"origin": [19.55, -0.35, 34.18],
"size": [1.9, 7.6, 3.8],
"uv": {
"north": {"uv": [222, 383], "uv_size": [2, 8]},
"east": {"uv": [218, 383], "uv_size": [4, 8]},
"south": {"uv": [228, 383], "uv_size": [2, 8]},
"west": {"uv": [224, 383], "uv_size": [4, 8]},
"up": {"uv": [222, 379], "uv_size": [2, 4]},
"down": {"uv": [224, 383], "uv_size": [2, -4]}
}
}
]
},
{
"name": "bone12",
"parent": "bone4",
"pivot": [-6.3375, 0.6, 10.335],
"cubes": [
{
"origin": [0.55, -0.35, -62.53],
"size": [1.9, 7.6, 3.8],
"uv": {
"north": {"uv": [224, 383], "uv_size": [-2, 8]},
"east": {"uv": [228, 383], "uv_size": [-4, 8]},
"south": {"uv": [230, 383], "uv_size": [-2, 8]},
"west": {"uv": [222, 383], "uv_size": [-4, 8]},
"up": {"uv": [224, 379], "uv_size": [-2, 4]},
"down": {"uv": [226, 383], "uv_size": [-2, -4]}
}
},
{
"origin": [19.55, -0.35, -62.53],
"size": [1.9, 7.6, 3.8],
"uv": {
"north": {"uv": [222, 383], "uv_size": [2, 8]},
"east": {"uv": [218, 383], "uv_size": [4, 8]},
"south": {"uv": [228, 383], "uv_size": [2, 8]},
"west": {"uv": [224, 383], "uv_size": [4, 8]},
"up": {"uv": [222, 379], "uv_size": [2, 4]},
"down": {"uv": [224, 383], "uv_size": [2, -4]}
}
}
]
},
{
"name": "bone13",
"parent": "bone4",
"pivot": [26.4375, 1.55, -36.785],
"cubes": [
{
"origin": [26.2, 5.35, -59.87],
"size": [4.75, 16.15, 11.4],
"uv": {
"north": {"uv": [49, 265], "uv_size": [5, 17]},
"east": {"uv": [0, 265], "uv_size": [12, 17]},
"south": {"uv": [66, 265], "uv_size": [5, 17]},
"west": {"uv": [54, 265], "uv_size": [12, 17]},
"up": {"uv": [49, 253], "uv_size": [5, 12]},
"down": {"uv": [91, 265], "uv_size": [5, -12]}
}
},
{
"origin": [11, 5.35, -59.87],
"size": [15.2, 0.95, 11.4],
"uv": {
"north": {"uv": [33, 281], "uv_size": [16, 1]},
"east": {"uv": [0, 281], "uv_size": [12, 1]},
"south": {"uv": [71, 281], "uv_size": [16, 1]},
"west": {"uv": [54, 281], "uv_size": [12, 1]},
"up": {"uv": [33, 253], "uv_size": [16, 12]},
"down": {"uv": [75, 265], "uv_size": [16, -12]}
}
},
{
"origin": [-4.2, 5.35, -59.87],
"size": [15.2, 0.95, 11.4],
"uv": {
"north": {"uv": [17, 281], "uv_size": [16, 1]},
"east": {"uv": [0, 281], "uv_size": [12, 1]},
"south": {"uv": [87, 281], "uv_size": [16, 1]},
"west": {"uv": [54, 281], "uv_size": [12, 1]},
"up": {"uv": [17, 253], "uv_size": [16, 12]},
"down": {"uv": [59, 265], "uv_size": [16, -12]}
}
},
{
"origin": [-8.95, 5.35, -59.87],
"size": [4.75, 16.15, 11.4],
"uv": {
"north": {"uv": [12, 265], "uv_size": [5, 17]},
"east": {"uv": [0, 265], "uv_size": [12, 17]},
"south": {"uv": [103, 265], "uv_size": [5, 17]},
"west": {"uv": [54, 265], "uv_size": [12, 17]},
"up": {"uv": [12, 253], "uv_size": [5, 12]},
"down": {"uv": [54, 265], "uv_size": [5, -12]}
}
},
{
"origin": [26.2, 21.5, -59.87],
"size": [3.8, 14.25, 53.2],
"uv": {
"north": {"uv": [92, 133], "uv_size": [4, 15]},
"east": {"uv": [0, 133], "uv_size": [56, 15]},
"south": {"uv": [152, 133], "uv_size": [4, 15]},
"west": {"uv": [96, 133], "uv_size": [56, 15]},
"up": {"uv": [92, 77], "uv_size": [4, 56]},
"down": {"uv": [132, 133], "uv_size": [4, -56]}
}
},
{
"origin": [11, 21.5, -57.97],
"size": [15.2, 14.25, 51.3],
"uv": {
"north": {"uv": [60, 152], "uv_size": [16, 15]},
"east": {"uv": [0, 133], "uv_size": [54, 15]},
"south": {"uv": [156, 133], "uv_size": [16, 15]},
"west": {"uv": [98, 133], "uv_size": [54, 15]},
"up": {"uv": [76, 77], "uv_size": [16, 54]},
"down": {"uv": [116, 131], "uv_size": [16, -54]}
}
},
{
"origin": [11, 6.3, -57.97],
"size": [15.2, 15.2, 9.5],
"uv": {
"north": {"uv": [30, 303], "uv_size": [16, 16]},
"east": {"uv": [0, 265], "uv_size": [10, 16]},
"south": {"uv": [71, 265], "uv_size": [16, 16]},
"west": {"uv": [56, 265], "uv_size": [10, 16]},
"up": {"uv": [33, 253], "uv_size": [16, 10]},
"down": {"uv": [75, 263], "uv_size": [16, -10]}
}
},
{
"origin": [-4.2, 21.5, -57.97],
"size": [15.2, 14.25, 51.3],
"uv": {
"north": {"uv": [44, 152], "uv_size": [16, 15]},
"east": {"uv": [0, 133], "uv_size": [54, 15]},
"south": {"uv": [172, 133], "uv_size": [16, 15]},
"west": {"uv": [98, 133], "uv_size": [54, 15]},
"up": {"uv": [60, 77], "uv_size": [16, 54]},
"down": {"uv": [100, 131], "uv_size": [16, -54]}
}
},
{
"origin": [-4.2, 6.3, -57.97],
"size": [15.2, 15.2, 9.5],
"uv": {
"north": {"uv": [14, 303], "uv_size": [16, 16]},
"east": {"uv": [0, 265], "uv_size": [10, 16]},
"south": {"uv": [87, 265], "uv_size": [16, 16]},
"west": {"uv": [56, 265], "uv_size": [10, 16]},
"up": {"uv": [17, 253], "uv_size": [16, 10]},
"down": {"uv": [59, 263], "uv_size": [16, -10]}
}
},
{
"origin": [-8, 21.5, -59.87],
"size": [3.8, 14.25, 53.2],
"uv": {
"north": {"uv": [56, 133], "uv_size": [4, 15]},
"east": {"uv": [0, 133], "uv_size": [56, 15]},
"south": {"uv": [116, 133], "uv_size": [4, 15]},
"west": {"uv": [60, 133], "uv_size": [56, 15]},
"up": {"uv": [56, 77], "uv_size": [4, 56]},
"down": {"uv": [60, 133], "uv_size": [4, -56]}
}
},
{
"origin": [-8.19, 21.5, -58.92],
"size": [0, 14.25, 32.3],
"uv": {
"north": {"uv": [412, 250], "uv_size": [0, 15]},
"east": {"uv": [412, 243], "uv_size": [52, 25]},
"south": {"uv": [468, 250], "uv_size": [0, 15]},
"west": {"uv": [426, 226], "uv_size": [56, 15]},
"up": {"uv": [412, 194], "uv_size": [0, 56]},
"down": {"uv": [412, 250], "uv_size": [0, -56]}
}
},
{
"origin": [30.19, 21.5, -58.92],
"size": [0, 14.25, 32.3],
"uv": {
"north": {"uv": [412, 250], "uv_size": [0, 15]},
"east": {"uv": [482, 226], "uv_size": [-56, 15]},
"south": {"uv": [468, 250], "uv_size": [0, 15]},
"west": {"uv": [412, 243], "uv_size": [52, 25]},
"up": {"uv": [412, 194], "uv_size": [0, 56]},
"down": {"uv": [412, 250], "uv_size": [0, -56]}
}
}
]
},
{
"name": "trunk1",
"parent": "bone13",
"pivot": [25.92616, 6.3, -59.47766],
"rotation": [0, -27.5, 0]
},
{
"name": "trunk2",
"parent": "bone13",
"pivot": [-3.9625, 6.3, -58.635],
"rotation": [0, 65, 0]
},
{
"name": "bone14",
"parent": "bone3",
"pivot": [11, 11.05, 6.25],
"cubes": [
{
"origin": [-3.25, 39.4075, -2.072],
"size": [28.5, 2.8975, 5.985],
"uv": {
"north": {"uv": [427, 415], "uv_size": [30, 3]},
"east": {"uv": [421, 415], "uv_size": [6, 3]},
"south": {"uv": [463, 415], "uv_size": [30, 3]},
"west": {"uv": [457, 415], "uv_size": [6, 3]},
"up": {"uv": [427, 409], "uv_size": [30, 6]},
"down": {"uv": [457, 415], "uv_size": [30, -6]}
}
},
{
"origin": [17.65, 38.4575, -0.172],
"size": [3.8, 0.9975, 2.185],
"uv": {
"north": {"uv": [450, 426], "uv_size": [4, 1]},
"east": {"uv": [448, 426], "uv_size": [2, 1]},
"south": {"uv": [456, 426], "uv_size": [4, 1]},
"west": {"uv": [454, 426], "uv_size": [2, 1]},
"up": {"uv": [450, 424], "uv_size": [4, 2]},
"down": {"uv": [454, 426], "uv_size": [4, -2]}
}
},
{
"origin": [0.36, 38.4575, -0.153],
"size": [3.8, 0.9975, 2.185],
"uv": {
"north": {"uv": [450, 426], "uv_size": [4, 1]},
"east": {"uv": [448, 426], "uv_size": [2, 1]},
"south": {"uv": [456, 426], "uv_size": [4, 1]},
"west": {"uv": [454, 426], "uv_size": [2, 1]},
"up": {"uv": [450, 424], "uv_size": [4, 2]},
"down": {"uv": [454, 426], "uv_size": [4, -2]}
}
}
]
},
{
"name": "bone15",
"parent": "bone3",
"pivot": [-11.5625, 34.8, -65.285],
"cubes": [
{
"origin": [-9.9, 40.5, -18.07],
"size": [1.9, 2.85, 5.7],
"uv": {
"north": {"uv": [292, 479], "uv_size": [2, 3]},
"east": {"uv": [286, 479], "uv_size": [6, 3]},
"south": {"uv": [300, 479], "uv_size": [2, 3]},
"west": {"uv": [294, 479], "uv_size": [6, 3]},
"up": {"uv": [292, 473], "uv_size": [2, 6]},
"down": {"uv": [294, 479], "uv_size": [2, -6]}
}
}
]
},
{
"name": "bone16",
"parent": "bone3",
"pivot": [33.5625, 34.8, -65.285],
"cubes": [
{
"origin": [30, 40.5, -45.62],
"size": [1.9, 2.85, 5.7],
"uv": {
"north": {"uv": [294, 479], "uv_size": [-2, 3]},
"east": {"uv": [300, 479], "uv_size": [-6, 3]},
"south": {"uv": [302, 479], "uv_size": [-2, 3]},
"west": {"uv": [292, 479], "uv_size": [-6, 3]},
"up": {"uv": [294, 473], "uv_size": [-2, 6]},
"down": {"uv": [296, 479], "uv_size": [-2, -6]}
}
}
]
},
{
"name": "bone5",
"parent": "bone3",
"pivot": [14.0875, 11.05, -38.685]
},
{
"name": "capo",
"parent": "bone5",
"pivot": [26.4375, 20.55, 18.03],
"rotation": [22.5, 0, 0],
"cubes": [
{
"origin": [-8.9495, 21.84359, 17.46388],
"size": [39.899, 1.899, 18.239],
"inflate": 0.01,
"pivot": [28.3375, 23.74309, 9.86338],
"rotation": [-15, 0, 0],
"uv": {
"north": {"uv": [212, 145], "uv_size": [42, 2]},
"east": {"uv": [193, 145], "uv_size": [19, 2]},
"south": {"uv": [273, 145], "uv_size": [42, 2]},
"west": {"uv": [254, 145], "uv_size": [19, 2]},
"up": {"uv": [212, 126], "uv_size": [42, 19]},
"down": {"uv": [254, 145], "uv_size": [42, -19]}
}
},
{
"origin": [-2.2995, 23.93359, 20.31388],
"size": [26.599, -0.001, 12.539],
"inflate": 0.01,
"pivot": [28.3375, 23.93309, 9.86338],
"rotation": [-15, 0, 0],
"uv": {
"north": {"uv": [341, 154], "uv_size": [42, 2]},
"east": {"uv": [322, 154], "uv_size": [19, 2]},
"south": {"uv": [402, 154], "uv_size": [42, 2]},
"west": {"uv": [383, 154], "uv_size": [19, 2]},
"up": {"uv": [458, 296], "uv_size": [-41, -19]},
"down": {"uv": [431, 142], "uv_size": [42, -19]}
}
}
]
},
{
"name": "retrov",
"parent": "bone3",
"pivot": [-12.30688, 16.75, 6.93751]
},
{
"name": "bone",
"parent": "retrov",
"pivot": [-12.30688, 16.75, 6.93751],
"rotation": [0, -12.5, 0],
"cubes": [
{
"origin": [-12.02317, 21.5, 12.50241],
"size": [5.7, 3.8, 0],
"uv": {
"north": {"uv": [0, 9], "uv_size": [6, 4]},
"east": {"uv": [0, 9], "uv_size": [0, 4]},
"south": {"uv": [6, 9], "uv_size": [6, 4]},
"west": {"uv": [6, 9], "uv_size": [0, 4]},
"up": {"uv": [0, 9], "uv_size": [6, 0]},
"down": {"uv": [6, 9], "uv_size": [6, 0]}
}
}
]
},
{
"name": "bone6",
"parent": "retrov",
"pivot": [34.30688, 16.75, 6.93751],
"rotation": [0, 12.5, 0]
},
{
"name": "rodas",
"parent": "bone2",
"pivot": [-3.8675, 6.95, 24.015]
},
{
"name": "front",
"parent": "rodas",
"pivot": [27.0075, 6.95, 19.265]
},
{
"name": "back",
"parent": "rodas",
"pivot": [-3.8675, 6.95, -45.62]
}
]
}
]
}
+134
View File
@@ -0,0 +1,134 @@
# -*- coding: utf-8 -*-
"""把 box_of_nails.bbmodel 转换为网易自定义方块模型(netease:block_geometry)。
转换规则(与官方 CustomBlocksMod 示例的 bbmodel->json 实测结果一致):
cube.origin = [-to.x, from.y, from.z]
cube.size = to - from
cube.pivot = [-bb.origin.x, bb.origin.y, bb.origin.z]
cube.rotation / bone.rotation = [-rx, -ry, rz]
uv: up 面 -> uv=[x2,y2], uv_size=[x1-x2, y1-y2]
其余面 -> uv=[x1,y1], uv_size=[x2-x1, y2-y1]
负的 uv_size 表示贴图镜像(与原格式一致)
贴图为空(texture=null 或零面积)的面不输出
"""
import base64
import json
import os
ROOT = r"e:\MCStudioDownload\work\3027246179@qq.com\Cpp\AddOn\0aaaa4f2f16c46e8964025a5ab0ecc02"
RES = os.path.join(ROOT, "resource_pack_t7eJjrxY")
SRC = r"c:\Users\30272\.trae-cn\attachments\6ac7514c01a7d726cbee7358\7dc21437-b0c4-442b-a225-1ce20d2bdbbc_593d488a-acae-4a41-a007-98367aec6727_box_of_nails.bbmodel"
TEX_NAME = "box_of_nails"
TEX_KEY = "dn_sa_" + TEX_NAME
MODEL_ID = "dn_sa:" + TEX_NAME + "_model"
BONE_NAME = "bone"
FACE_ORDER = ("north", "east", "south", "west", "up", "down")
def num(v):
if isinstance(v, float):
if v.is_integer():
return int(v)
return round(v, 4)
return v
def arr(v):
return "[" + ", ".join(str(num(x)) for x in v) + "]"
def conv_uv(el):
out = []
for face in FACE_ORDER:
f = el["faces"].get(face)
if not f or f.get("texture") is None:
continue
x1, y1, x2, y2 = f["uv"]
if x1 == x2 or y1 == y2:
continue
if face == "up":
entry = "{" + '"uv": %s, "uv_size": %s' % (arr([x2, y2]), arr([x1 - x2, y1 - y2]))
else:
entry = "{" + '"uv": %s, "uv_size": %s' % (arr([x1, y1]), arr([x2 - x1, y2 - y1]))
if f.get("rotation"):
entry += ', "rot": %s' % num(f["rotation"])
entry += "}"
out.append('"%s": %s' % (face, entry))
return out
def main():
with open(SRC, "r", encoding="utf-8") as fp:
bb = json.load(fp)
tex = bb["textures"][0]
tw, th = tex["width"], tex["height"]
# 1) 贴图 -> resourcepack/textures/blocks
raw = base64.b64decode(tex["source"].split(",", 1)[1])
tex_dir = os.path.join(RES, "textures", "blocks")
os.makedirs(tex_dir, exist_ok=True)
tex_path = os.path.join(tex_dir, TEX_NAME + ".png")
with open(tex_path, "wb") as fp:
fp.write(raw)
# 2) 模型 -> resourcepack/models/netease_block
cube_blocks = []
for el in bb["elements"]:
lines = []
lines.append("\t\t\t\t\t{")
body = []
body.append('"origin": %s' % arr([-el["to"][0], el["from"][1], el["from"][2]]))
body.append('"size": %s' % arr([el["to"][i] - el["from"][i] for i in range(3)]))
if el.get("rotation"):
body.append('"pivot": %s' % arr([-el["origin"][0], el["origin"][1], el["origin"][2]]))
body.append('"rotation": %s' % arr([-el["rotation"][0], -el["rotation"][1], el["rotation"][2]]))
uv_lines = conv_uv(el)
txt = ",\n".join("\t\t\t\t\t\t%s" % b for b in body)
txt += ',\n\t\t\t\t\t\t"uv": {\n'
txt += ",\n".join("\t\t\t\t\t\t\t%s" % u for u in uv_lines)
txt += "\n\t\t\t\t\t\t}"
lines.append(txt)
lines.append("\t\t\t\t\t}")
cube_blocks.append("\n".join(lines))
model = []
model.append("{")
model.append('\t"format_version": "1.13.0",')
model.append('\t"netease:block_geometry": {')
model.append('\t\t"description": {')
model.append('\t\t\t"identifier": "%s",' % MODEL_ID)
model.append('\t\t\t"textures": ["%s"],' % TEX_KEY)
model.append('\t\t\t"textures_descriptions": [')
model.append('\t\t\t\t{ "width": %d, "length": %d }' % (tw, th))
model.append('\t\t\t],')
model.append('\t\t\t"use_ao": true')
model.append('\t\t},')
model.append('\t\t"bones": [')
model.append('\t\t\t{')
model.append('\t\t\t\t"name": "%s",' % BONE_NAME)
model.append('\t\t\t\t"pivot": [0, 0, 0],')
model.append('\t\t\t\t"cubes": [')
model.append(",\n".join(cube_blocks))
model.append('\t\t\t\t]')
model.append('\t\t\t}')
model.append('\t\t]')
model.append('\t}')
model.append('}')
text = "\n".join(model) + "\n"
model_dir = os.path.join(RES, "models", "netease_block")
os.makedirs(model_dir, exist_ok=True)
model_path = os.path.join(model_dir, TEX_KEY + ".json")
with open(model_path, "w", encoding="utf-8", newline="\n") as fp:
fp.write(text)
print("texture ->", tex_path)
print("model ->", model_path)
print("identifier:", MODEL_ID, "| terrain_texture key:", TEX_KEY, "| %dx%d" % (tw, th))
print("cubes:", len(bb["elements"]))
if __name__ == "__main__":
main()
+96
View File
@@ -0,0 +1,96 @@
# -*- coding: utf-8 -*-
"""由 box_of_nails 方块贴图(64x64 UV展开图)生成 16x16 的物品图标。
采用等轴测投影组合盒子可见的三个面(顶面 + 正面 + 右侧面),
源贴图中三个面所在的像素区域(由 blockbench 模型 UV 推出):
正面 north px (8, 8) - (18, 13) 10 x 5
右侧 east px (0, 8) - (8, 13) 8 x 5
顶面 up px (8, 13) - (18, 21) 10 x 8
盒子模型尺寸: 宽 10 单位(x) x 高 5 单位(y) x 深 8 单位(z),1 单位 = 1 贴图像素。
"""
import math
import os
from PIL import Image
ROOT = r"e:\MCStudioDownload\work\3027246179@qq.com\Cpp\AddOn\0aaaa4f2f16c46e8964025a5ab0ecc02"
RES = os.path.join(ROOT, "resource_pack_t7eJjrxY")
SRC = os.path.join(RES, "textures", "blocks", "box_of_nails.png")
DST = os.path.join(RES, "textures", "items", "box_of_nails.png")
OUT = 16 # 最终图标边长
SS = 4 # 超采样倍数
SIZE = OUT * SS # 渲染画布边长
TEX_FRONT = (8, 8, 18, 13) # 正面 north
TEX_WEST = (18, 8, 26, 13) # 左侧面 west
TEX_TOP = (8, 13, 18, 21) # 顶面 up
W, H, D = 10.0, 5.0, 8.0 # 盒子宽/高/深(模型单位)
def rasterize(dst, src, origin, uvec, vvec, rect):
"""把源贴图矩形 rect 以平行四边形(origin + s*uvec + t*vvec)填到 dst。"""
x0, y0, x1, y1 = rect
ox, oy = origin
ux, uy = uvec
vx, vy = vvec
det = ux * vy - uy * vx
if abs(det) < 1e-9:
return
corners = [origin, (ox + ux, oy + uy), (ox + ux + vx, oy + uy + vy), (ox + vx, oy + vy)]
minx = max(0, int(math.floor(min(c[0] for c in corners))))
maxx = min(dst.width - 1, int(math.ceil(max(c[0] for c in corners))))
miny = max(0, int(math.floor(min(c[1] for c in corners))))
maxy = min(dst.height - 1, int(math.ceil(max(c[1] for c in corners))))
px = dst.load()
spx = src.load()
sw, sh = src.size
for py in range(miny, maxy + 1):
dy = py + 0.5 - oy
for pxx in range(minx, maxx + 1):
dx = pxx + 0.5 - ox
s = (vy * dx - vx * dy) / det
t = (-uy * dx + ux * dy) / det
if s < 0.0 or s >= 1.0 or t < 0.0 or t >= 1.0:
continue
sx = int(x0 + s * (x1 - x0))
sy = int(y0 + t * (y1 - y0))
sx = min(max(sx, 0), sw - 1)
sy = min(max(sy, 0), sh - 1)
px[pxx, py] = spx[sx, sy]
def main():
src = Image.open(SRC).convert("RGBA")
dst = Image.new("RGBA", (SIZE, SIZE), (0, 0, 0, 0))
cx = math.cos(math.radians(30.0))
cy = math.sin(math.radians(30.0))
# 画布内每模型单位对应的像素数(保证盒子完整落在画布内)
margin = 4
u = min((SIZE - 2 * margin) / ((W + D) * cx),
(SIZE - 2 * margin) / ((W + D) * cy + H))
wv = (W * u * cx, -W * u * cy) # 宽度方向 x(右后上)
dv = (-D * u * cx, -D * u * cy) # 深度方向 z(左后上)
vv = (0.0, H * u) # 竖直向下
# 前上顶点 F(俯视时最靠近观察者的角),整体居中
content_w = (W + D) * u * cx
content_h = (W + D) * u * cy + H * u
fx = (SIZE - content_w) / 2.0 + D * u * cx
fy = (SIZE - content_h) / 2.0 + (W + D) * u * cy
f = (fx, fy)
rasterize(dst, src, f, dv, vv, TEX_WEST) # 左侧面
rasterize(dst, src, f, wv, vv, TEX_FRONT) # 正面
rasterize(dst, src, f, wv, dv, TEX_TOP) # 顶面
icon = dst.resize((OUT, OUT), Image.BOX)
os.makedirs(os.path.dirname(DST), exist_ok=True)
icon.save(DST)
print("icon ->", DST, icon.size)
if __name__ == "__main__":
main()
Whitespace-only changes.
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,358 @@
# -*- coding: utf-8 -*-
#
# 一盒钉子(dn_sa:box_of_nails):物品 + 方块双形态的补给容器
# - 物品耐久用于显示盒内钉子数:max_damage = 65,remaining = 钉子数 + 1
# (空盒 remaining = 1,满盒 remaining = 65;+1 是为了避免耐久归零导致物品损坏)
# - 手持盒子右键方块:放置为 dn_sa:box_of_nails_block(面向跟随玩家朝向),盒内钉子数存入世界存档(按坐标索引)
# - 右键方块:手持钉子时放入(潜行放满,否则放 1 颗);否则取出(潜行全部取出,否则取 1 颗)
# - 破坏方块:还原为一个物品,耐久保留盒内钉子数
# - 描述("已存储:x/64")走物品的 customTips:生成物品时写进 itemDict,之后由
# ChangePlayerItemTipsAndExtraId 覆盖刷新。customTips 会直接覆盖物品 JSON 里的静态文案,
# 所以 JSON 里那行 "已存储:1/64" 只是还没刷新时的兜底显示。
# 注意:读玩家背包必须用 GetPlayerItem —— GetEntityItem 只适用于生物/左右手/装备,
# 官方文档写明"背包不行",用它读背包会一直返回 None,导致描述永远停在 JSON 的静态文案。
import math
import time
import mod.server.extraServerApi as serverApi
compFactory = serverApi.GetEngineCompFactory()
# 测试参数:与 modMain 共用开关与探针(print + 写文件),仅在 DEBUG_TEST 为 True 时输出
try:
from Script_dn_sa.modMain import DEBUG_TEST, probe
except Exception:
DEBUG_TEST = False
def probe(msg):
pass
ITEM_ID = "dn_sa:box_of_nails"
BLOCK_ID = "dn_sa:box_of_nails_block"
NAILS_ID = "dn_sa:nails"
BLOCK_AIR = "minecraft:air"
NAILS_MAX_STACK = 64 # 单叠钉子上限
MAX_CHARGES = 64 # 钉子盒容量
MAX_DAMAGE = MAX_CHARGES + 1 # 物品最大耐久
CONTENTS_KEY = "dn_sa_box_of_nails_contents" # {"维度:x,y,z": 钉子数}
# ServerBlockUseEvent 在按住右键时逐 tick 触发,用冷却间隔避免一次长按连续存取
COOLDOWN_SECONDS = 0.25 # 每次成功存取后的冷却时间
# 物品描述(末行动态显示当前钉子数)
TIPS_TEXT = "手持钉子点击放入,空手点击取出\n包含:钉子\n已存储:%d/%d"
# 点击面 -> 法线偏移(0下 1上 2北 3南 4西 5东)
FACE_OFFSET = {
0: (0, -1, 0),
1: (0, 1, 0),
2: (0, 0, -1),
3: (0, 0, 1),
4: (-1, 0, 0),
5: (1, 0, 0),
}
ITEM_POS = serverApi.GetMinecraftEnum().ItemPosType
INVENTORY = ITEM_POS.INVENTORY
CARRIED = ITEM_POS.CARRIED
def clamp(v, lo, hi):
return lo if v < lo else (hi if v > hi else v)
class BoxOfNailsServer(serverApi.GetServerSystemCls()):
def __init__(self, namespace, name):
super(BoxOfNailsServer, self).__init__(namespace, name)
if DEBUG_TEST:
probe("3/4 BoxOfNailsServer 系统实例已创建")
self.levelId = serverApi.GetLevelId()
self._lastUse = {} # playerId -> 上次成功存取的时间戳(秒)
self._tipsSet = {} # (playerId, slot) -> 已写入的描述文本,防重复写入
self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(),
"AddServerPlayerEvent", self, self.OnPlayerJoin)
self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(),
"ServerItemUseOnEvent", self, self.OnItemUseOn)
self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(),
"ServerBlockUseEvent", self, self.OnBlockUse)
self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(),
"ServerPlayerTryDestroyBlockEvent", self, self.OnTryDestroy)
self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(),
"InventoryItemChangedServerEvent", self, self.OnInventoryChanged)
# ---------- 基础工具 ----------
def _blockComp(self):
return compFactory.CreateBlockInfo(self.levelId)
def _extraComp(self):
return compFactory.CreateExtraData(self.levelId)
@staticmethod
def _key(dim, x, y, z):
return "%d:%d,%d,%d" % (dim, x, y, z)
@staticmethod
def _itemName(itemDict):
"""兼容读取物品 identifier:新版物品字典为 newItemName,旧版为 itemName。"""
if not itemDict:
return None
return itemDict.get("newItemName") or itemDict.get("itemName")
def _loadContents(self):
data = self._extraComp().GetExtraData(CONTENTS_KEY)
return data if isinstance(data, dict) else {}
def _saveContents(self, data):
self._extraComp().SetExtraData(CONTENTS_KEY, data, True)
def _getBlockName(self, x, y, z, dim):
info = self._blockComp().GetBlockNew((x, y, z), dim)
if not info:
return None
return info.get("name")
def _setBlock(self, x, y, z, dim, name, aux=0):
# oldBlockHandling=0(替换),isLegacy=True,updateNeighbors=False
self._blockComp().SetBlockNew((x, y, z), {"name": name, "aux": aux}, 0, dim, True, False)
@staticmethod
def _facingAux(playerId):
"""按玩家面朝方向计算四面向 aux(南=0/西=1/北=2/东=3)。
组件 netease:face_directional 的面向由 SetBlockNew 的 auxValue 决定。
玩家 yaw:0=南(+Z)、90=西(-X)、180=北(-Z)、270=东(+X);
放置时方块「北面」朝向玩家,即方块面向 = 玩家准心方向的反方向。
"""
try:
yaw = float(compFactory.CreateRot(playerId).GetRot()[1]) % 360.0
except Exception:
return 2
quad = int(math.floor(yaw / 90.0 + 0.5)) % 4
return (quad + 2) % 4
# ---------- 物品耐久 <-> 钉子数 ----------
@staticmethod
def _chargesOfRemaining(remaining):
return clamp(int(remaining) - 1, 0, MAX_CHARGES)
@staticmethod
def _remainingOfCharges(charges):
return clamp(int(charges), 0, MAX_CHARGES) + 1
def _handCharges(self, playerId):
itemComp = compFactory.CreateItem(playerId)
return self._chargesOfRemaining(itemComp.GetItemDurability(CARRIED, 0))
def _consumeOne(self, playerId):
itemComp = compFactory.CreateItem(playerId)
slotId = itemComp.GetSelectSlotId()
itemDict = itemComp.GetPlayerItem(INVENTORY, slotId, True)
if not itemDict:
return
count = itemDict.get("count", 1)
itemComp.SetInvItemNum(slotId, count - 1 if count > 1 else 0)
def _giveBox(self, playerId, charges):
"""给予带指定钉子数的盒子;优先放入第一个空槽,便于写入耐久。"""
if not playerId:
return
itemComp = compFactory.CreateItem(playerId)
remainingOfCharges = self._remainingOfCharges(charges)
itemDict = {
"itemName": ITEM_ID, "count": 1, "auxValue": 0, 'customTips': TIPS_TEXT % (remainingOfCharges - 1, 64),
'durability': remainingOfCharges
}
slot = -1
items = itemComp.GetPlayerAllItems(INVENTORY, False) or []
for i, it in enumerate(items):
if it is None:
slot = i
break
if slot < 0:
itemComp.SpawnItemToPlayerInv(itemDict, playerId, -1)
return
itemComp.SpawnItemToPlayerInv(itemDict, playerId, slot)
itemComp.SetItemDurability(INVENTORY, slot, remainingOfCharges)
self._refreshBoxTips(playerId, slot)
# ---------- 动态描述(显示盒内钉子数) ----------
@staticmethod
def _boxTips(charges):
return TIPS_TEXT % (clamp(int(charges), 0, MAX_CHARGES), MAX_CHARGES)
def _refreshBoxTips(self, playerId, slot):
"""把指定槽位盒子物品的描述更新为当前钉子数。"""
if not playerId:
return
itemComp = compFactory.CreateItem(playerId)
key = (playerId, slot)
itemDict = itemComp.GetEntityItem(INVENTORY, slot, True)
if not itemDict or self._itemName(itemDict) != ITEM_ID:
self._tipsSet.pop(key, None)
return
tips = self._boxTips(self._chargesOfRemaining(itemComp.GetItemDurability(INVENTORY, slot)))
if self._tipsSet.get(key) == tips:
return
itemComp.ChangePlayerItemTipsAndExtraId(INVENTORY, slot, tips, "box1")
self._tipsSet[key] = tips
def OnInventoryChanged(self, args):
newItem = args.get("newItemDict")
if not newItem or self._itemName(newItem) != ITEM_ID:
return
self._refreshBoxTips(args.get("playerId"), args.get("slot", -1))
def _notifyOne(self, playerId, text):
"""测试参数用:给玩家发一条聊天提示(仅在 DEBUG_TEST 开启时调用)。"""
if not playerId:
return
try:
compFactory.CreateMsg(playerId).NotifyOneMessage(playerId, text)
except Exception:
pass
def OnPlayerJoin(self, args):
"""玩家进入世界时刷新背包里所有盒子的描述。"""
playerId = args.get("id")
if DEBUG_TEST:
probe("4/4 AddServerPlayerEvent 已触发:脚本与事件监听均正常")
self._notifyOne(playerId, "[dn_sa] 脚本已加载,事件监听正常")
self._refreshAllBoxTips(playerId)
def _refreshAllBoxTips(self, playerId):
if not playerId:
return
itemComp = compFactory.CreateItem(playerId)
items = itemComp.GetPlayerAllItems(INVENTORY, False) or []
for slot, it in enumerate(items):
if it and self._itemName(it) == ITEM_ID:
self._refreshBoxTips(playerId, slot)
# ---------- 放入 / 取出 ----------
def _depositNails(self, playerId, dim, x, y, z, handCount, sneaking):
"""把手中钉子放入盒子(潜行=放满,否则=1 颗);返回是否放入成功。"""
key = self._key(dim, x, y, z)
contents = self._loadContents()
charges = clamp(contents.get(key, 0), 0, MAX_CHARGES)
move = clamp(handCount if sneaking else 1, 0, MAX_CHARGES - charges)
if move <= 0:
return False
itemComp = compFactory.CreateItem(playerId)
itemComp.SetInvItemNum(itemComp.GetSelectSlotId(), handCount - move)
contents[key] = charges + move
self._saveContents(contents)
self._lastUse[playerId] = time.time()
return True
def _withdrawNails(self, playerId, dim, x, y, z, sneaking):
"""从盒子取出钉子(潜行=全部取出,否则=1 颗);返回是否取出成功。"""
key = self._key(dim, x, y, z)
contents = self._loadContents()
charges = clamp(contents.get(key, 0), 0, MAX_CHARGES)
if charges <= 0:
return False
itemComp = compFactory.CreateItem(playerId)
capacity = 0
for it in (itemComp.GetPlayerAllItems(INVENTORY, False) or []):
if it is None:
capacity += NAILS_MAX_STACK
elif self._itemName(it) == NAILS_ID:
capacity += NAILS_MAX_STACK - it.get("count", 0)
take = clamp(charges if sneaking else 1, 0, capacity)
if take <= 0:
return False
itemComp.SpawnItemToPlayerInv({"itemName": NAILS_ID, "count": take, "auxValue": 0}, playerId, -1)
contents[key] = charges - take
self._saveContents(contents)
self._lastUse[playerId] = time.time()
return True
def _isSneaking(self, playerId):
try:
return bool(compFactory.CreatePlayer(playerId).isSneaking())
except Exception:
return False
# ---------- 放置 ----------
def OnItemUseOn(self, args):
itemDict = args.get("itemDict") or {}
itemName = self._itemName(itemDict)
playerId = args.get("entityId")
if not playerId:
return
# 手持钉子点击盒子方块 -> 放入(部分情况下潜行只触发本事件,作为兼容入口)
if itemName == NAILS_ID and args.get("blockName") == BLOCK_ID:
if time.time() - self._lastUse.get(playerId, 0.0) < COOLDOWN_SECONDS:
return
ok = self._depositNails(playerId, args.get("dimensionId", 0),
args.get("x", 0), args.get("y", 0), args.get("z", 0),
itemDict.get("count", 0), self._isSneaking(playerId))
if ok:
args["ret"] = True
return
if itemName != ITEM_ID:
return
off = FACE_OFFSET.get(args.get("face", 0))
if off is None:
return
# 点击的正是钉子盒方块时不放置,避免在盒子上再叠一个盒子
if args.get("blockName") == BLOCK_ID:
return
dim = args.get("dimensionId", 0)
tx = args.get("x", 0) + off[0]
ty = args.get("y", 0) + off[1]
tz = args.get("z", 0) + off[2]
if self._getBlockName(tx, ty, tz, dim) != BLOCK_AIR:
return
charges = self._handCharges(playerId)
self._setBlock(tx, ty, tz, dim, BLOCK_ID, self._facingAux(playerId))
contents = self._loadContents()
contents[self._key(dim, tx, ty, tz)] = charges
self._saveContents(contents)
self._consumeOne(playerId)
# 记录放置时刻:避免按住右键时同一动作紧接着触发 ServerBlockUseEvent 误取出钉子
self._lastUse[playerId] = time.time()
args["ret"] = True
# ---------- 存取 ----------
def OnBlockUse(self, args):
if args.get("blockName") != BLOCK_ID:
return
playerId = args.get("playerId")
if not playerId:
return
args["cancel"] = True
# 该事件按住右键时逐 tick 触发,冷却期内不再处理,避免一次长按连续存取
if time.time() - self._lastUse.get(playerId, 0.0) < COOLDOWN_SECONDS:
return
dim = args.get("dimensionId", 0)
x, y, z = args.get("x", 0), args.get("y", 0), args.get("z", 0)
# 手上/事件中使用的物品:优先用事件自带的物品信息,更准确
itemDict = args.get("itemDict") or {}
itemComp = compFactory.CreateItem(playerId)
hand = itemComp.GetPlayerItem(INVENTORY, itemComp.GetSelectSlotId(), True) or {}
usedName = self._itemName(itemDict) or self._itemName(hand)
# 手持盒子物品时不做存取(属于放置动作的延续,避免误取出钉子)
if usedName == ITEM_ID:
return
sneaking = self._isSneaking(playerId)
if usedName == NAILS_ID:
self._depositNails(playerId, dim, x, y, z,
itemDict.get("count") or hand.get("count", 0), sneaking)
else:
self._withdrawNails(playerId, dim, x, y, z, sneaking)
# ---------- 破坏 ----------
def OnTryDestroy(self, args):
if args.get("fullName") != BLOCK_ID:
return
dim = args.get("dimensionId", 0)
key = self._key(dim, args.get("x", 0), args.get("y", 0), args.get("z", 0))
contents = self._loadContents()
charges = clamp(contents.pop(key, 0), 0, MAX_CHARGES)
self._saveContents(contents)
# 屏蔽默认掉落,改为返还带钉子数的盒子物品
args["spawnResources"] = False
self._giveBox(args.get("playerId"), charges)
@@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
#
# 草药使用效果(对齐 Java 版 sa_essentials 原设定)
# 大部分草药的效果已在各自物品 JSON 的 minecraft:food.effects 中直接配置;
# 本脚本只处理组件无法表达的「解毒」:使用后移除玩家身上的中毒效果。
# crushed_blue_herb / mixed_gb_herbs / mixed_ggb_herbs
# mixed_gyb_herbs / mixed_grb_herbs / mixed_rb_herbs
import mod.server.extraServerApi as serverApi
compFactory = serverApi.GetEngineCompFactory()
POISON_HERBS = (
"dn_sa:crushed_blue_herb",
"dn_sa:mixed_gb_herbs",
"dn_sa:mixed_ggb_herbs",
"dn_sa:mixed_gyb_herbs",
"dn_sa:mixed_grb_herbs",
"dn_sa:mixed_rb_herbs",
)
class HerbServer(serverApi.GetServerSystemCls()):
def __init__(self, namespace, name):
super(HerbServer, self).__init__(namespace, name)
self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(),
"PlayerEatFoodServerEvent", self, self.OnEatFood)
def OnEatFood(self, args):
playerId = args.get("playerId")
itemName = (args.get("itemDict") or {}).get("itemName")
if playerId and itemName in POISON_HERBS:
# 解毒:移除中毒状态
compFactory.CreateEffect(playerId).RemoveEffectFromEntity("poison")
@@ -0,0 +1,88 @@
# -*- coding: utf-8 -*-
#
# 火柴盒:点击方块消耗一点耐久并点燃地面,共20点耐久(对齐Java版sa_core火柴盒=打火石)
import mod.server.extraServerApi as serverApi
compFactory = serverApi.GetEngineCompFactory()
MATCHBOX_ID = "dn_sa:matchbox"
# 需要监听右键的原版方块(地面及常见方块),aux 用 * 匹配所有附加值
LISTEN_BLOCKS = [
"minecraft:grass_block:*",
"minecraft:dirt:*",
"minecraft:coarse_dirt:*",
"minecraft:podzol:*",
"minecraft:mycelium:*",
"minecraft:moss_block:*",
"minecraft:mud:*",
"minecraft:stone:*",
"minecraft:cobblestone:*",
"minecraft:mossy_cobblestone:*",
"minecraft:gravel:*",
"minecraft:sand:*",
"minecraft:sandstone:*",
"minecraft:clay:*",
"minecraft:snow_layer:*",
"minecraft:dirt_path:*",
"minecraft:netherrack:*",
"minecraft:end_stone:*",
"minecraft:obsidian:*",
"minecraft:log:*",
"minecraft:log2:*",
"minecraft:planks:*",
"minecraft:stone_bricks:*",
"minecraft:bricks:*",
"minecraft:terracotta:*",
]
# 点击方块面 -> 火焰放置位置偏移(Facing枚举:0下 1上 2北 3南 4西 5东)
FACE_OFFSETS = {
0: (0, -1, 0),
1: (0, 1, 0),
2: (0, 0, -1),
3: (0, 0, 1),
4: (-1, 0, 0),
5: (1, 0, 0),
}
class MatchboxServer(serverApi.GetServerSystemCls()):
def __init__(self, namespace, name):
super(MatchboxServer, self).__init__(namespace, name)
self.levelId = serverApi.GetLevelId()
self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(),
"ServerBlockUseEvent", self, self.OnBlockUse)
self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(),
"LoadServerAddonScriptsAfter", self, self.OnLoadAddon)
def OnLoadAddon(self, args):
# 注册原版方块对ServerBlockUseEvent的监听
whitelistComp = compFactory.CreateBlockUseEventWhiteList(self.levelId)
for blockName in LISTEN_BLOCKS:
whitelistComp.AddBlockItemListenForUseEvent(blockName)
def OnBlockUse(self, args):
playerId = args.get("playerId")
itemDict = args.get("itemDict") or {}
if itemDict.get("itemName") != MATCHBOX_ID:
return
# 检查主手火柴盒耐久,耐久为0时无法点燃
itemComp = compFactory.CreateItem(playerId)
carried = serverApi.GetMinecraftEnum().ItemPosType.CARRIED
durability = itemComp.GetItemDurability(carried, 0)
if durability <= 0:
return
# 计算点击面外的火焰放置位置
offset = FACE_OFFSETS.get(args.get("face", 1), (0, 1, 0))
firePos = (args["x"] + offset[0], args["y"] + offset[1], args["z"] + offset[2])
dimensionId = args.get("dimensionId")
# 获取目标位置方块(GetBlockNew 属于 CreateBlockInfo 组件)
blockInfoComp = compFactory.CreateBlockInfo(self.levelId)
curBlock = blockInfoComp.GetBlockNew(firePos, dimensionId)
if curBlock is not None and curBlock.get("name") == "minecraft:air":
# 目标位置为空气,放置火焰并消耗一点耐久,拦截该方块的交互逻辑(如同打火石)
# SetBlockNew 同属 CreateBlockInfo 组件
blockInfoComp.SetBlockNew(firePos, {"name": "minecraft:fire", "aux": 0}, 0, dimensionId)
itemComp.SetItemDurability(carried, 0, durability - 1)
args["cancel"] = True
@@ -0,0 +1,91 @@
# -*- coding: utf-8 -*-
#
# 医疗物品:自定义蓄力物品(custom_item_type: ranged_weapon)
# 右键按下开始蓄力,右键抬起触发 ItemReleaseUsingServerEvent;
# 蓄满才生效并消耗 1 个,未蓄满松开则取消(不生效、不消耗)。
import mod.server.extraServerApi as serverApi
compFactory = serverApi.GetEngineCompFactory()
PLASTER = "dn_sa_plaster:bow"
SPLINT = "dn_sa_splint:bow"
ALCOHOL_WIPES = "dn_sa_alcohol_wipes:bow"
BLOOD_BAG = "dn_sa:blood_bag"
BLOOD_BAG_EMPTY = "dn_sa:blood_bag_empty"
# 蓄满所需持有时长(tick,20 tick = 1 秒)
CHARGE_TICKS = 60
CHARGE_ITEMS = (PLASTER, SPLINT, ALCOHOL_WIPES)
HEAL_AMOUNT = 6.0 # 血袋回血量
DONATE_TOTAL = 6 # 空血袋总扣血量
DONATE_STEP = 1.0 # 每次扣血量
DONATE_INTERVAL = 0.5 # 扣血间隔秒数
class MedicalServer(serverApi.GetServerSystemCls()):
def __init__(self, namespace, name):
super(MedicalServer, self).__init__(namespace, name)
self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(),
"ItemReleaseUsingServerEvent", self, self.OnReleaseUsing)
self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(),
"PlayerEatFoodServerEvent", self, self.OnEatFood)
# ---------- 蓄力物品 ----------
def OnReleaseUsing(self, args):
playerId = args.get("playerId")
itemName = (args.get("itemDict") or {}).get("itemName")
if not playerId or itemName not in CHARGE_ITEMS:
return
# 已持有帧数 = 最大使用时长 - 剩余时长
maxUse = args.get("maxUseDuration") or 0
durationLeft = args.get("durationLeft") or 0
held = (maxUse - durationLeft) if maxUse > 0 else CHARGE_TICKS
# 未蓄满:取消本次使用
if held < CHARGE_TICKS:
args["cancel"] = True
return
# 蓄满:施加效果
effectComp = compFactory.CreateEffect(playerId)
if itemName == PLASTER:
effectComp.AddEffectToEntity("regeneration", 5, 0, False)
elif itemName == SPLINT:
effectComp.AddEffectToEntity("resistance", 10, 0, False)
elif itemName == ALCOHOL_WIPES:
effectComp.RemoveEffectFromEntity("poison")
# 消耗 1 个
self._ConsumeOne(playerId)
args["changeItem"] = True
def _ConsumeOne(self, playerId):
itemComp = compFactory.CreateItem(playerId)
slotId = itemComp.GetSelectSlotId()
itemDict = itemComp.GetPlayerItem(serverApi.GetMinecraftEnum().ItemPosType.INVENTORY, slotId, True)
if not itemDict:
return
count = itemDict.get("count", 1)
itemComp.SetInvItemNum(slotId, count - 1)
# ---------- 血袋 / 空血袋 ----------
def OnEatFood(self, args):
playerId = args.get("playerId")
itemName = (args.get("itemDict") or {}).get("itemName")
if not playerId:
return
if itemName == BLOOD_BAG:
self._AddHealth(playerId, HEAL_AMOUNT)
elif itemName == BLOOD_BAG_EMPTY:
for i in range(1, DONATE_TOTAL + 1):
self.AddTimer(DONATE_INTERVAL * i, self._AddHealth, playerId, -DONATE_STEP)
self.AddTimer(DONATE_INTERVAL * (DONATE_TOTAL + 1), self._GiveBloodBag, playerId)
def _AddHealth(self, playerId, delta):
attrType = serverApi.GetMinecraftEnum().AttrType.HEALTH
attrComp = compFactory.CreateAttr(playerId)
cur = attrComp.GetAttrValue(attrType)
limit = attrComp.GetAttrMaxValue(attrType)
attrComp.SetAttrValue(attrType, max(0.0, min(cur + delta, limit)))
def _GiveBloodBag(self, playerId):
itemDict = {"itemName": BLOOD_BAG, "count": 1, "auxValue": 0}
compFactory.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId, -1)
@@ -0,0 +1,53 @@
# -*- coding: utf-8 -*-
from mod.common.mod import Mod
import mod.server.extraServerApi as serverApi
# ===== 测试参数(排查脚本是否被引擎加载) =====
# True :输出各阶段探针(print + 聊天提示 + 写文件),用以定位脚本卡在哪一层
# False:关闭全部探针,恢复正常行为
DEBUG_TEST = True
# 写文件探针路径:print 只进 MCStudio「脚本测试日志」窗口,不保证进 Debug_Log,
# 这里直接追加写入客户端可写目录,作为"脚本是否被引擎加载"的决定性证据。
PROBE_FILE = "C:/Users/30272/AppData/Roaming/MinecraftPE_Netease/dn_sa_probe.log"
def probe(msg):
"""脚本加载探针:仅在 DEBUG_TEST 为 True 时输出(print + 写文件)。"""
if not DEBUG_TEST:
return
try:
print("[dn_sa][PROBE] " + msg)
except Exception:
pass
try:
import time
f = open(PROBE_FILE, "a")
f.write(time.strftime("%Y-%m-%d %H:%M:%S") + " " + msg + "\n")
f.close()
except Exception:
pass
probe("1/4 modMain 模块已被引擎导入")
@Mod.Binding(name="dn_sa", version="1.0")
class DnSaMod(object):
def __init__(self):
pass
@Mod.InitServer()
def DnSaServerInit(self):
probe("2/4 InitServer 已执行,开始注册服务端系统")
serverApi.RegisterSystem("dn_sa", "MatchboxServer", "Script_dn_sa.matchboxServer.MatchboxServer")
serverApi.RegisterSystem("dn_sa", "MedicalServer", "Script_dn_sa.medicalServer.MedicalServer")
serverApi.RegisterSystem("dn_sa", "HerbServer", "Script_dn_sa.herbServer.HerbServer")
serverApi.RegisterSystem("dn_sa", "AmbulanceServer", "Script_dn_sa.ambulanceServer.AmbulanceServer")
serverApi.RegisterSystem("dn_sa", "BoxOfNailsServer", "Script_dn_sa.boxOfNailsServer.BoxOfNailsServer")
probe(" 所有服务端系统注册完成")
@Mod.DestroyServer()
def DnSaServerDestroy(self):
pass
@@ -0,0 +1,55 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_main_0",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
-3.001304368770316,
0.0,
-1.1520586638691073
],
"max": [
4.001304368770316,
3.6238370065174728,
2.152058663869107
]
},
"clip": {
"min": [
-3.001304368770316,
0.0,
-1.1520586638691073
],
"max": [
4.001304368770316,
3.6238370065174728,
2.152058663869107
]
}
},
"netease:block_entity": {
"tick": false,
"movable": false
}
}
}
}
@@ -0,0 +1,55 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_main_180",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
-3.001304368770316,
0.0,
-1.1520586638691073
],
"max": [
4.001304368770316,
3.6238370065174728,
2.152058663869107
]
},
"clip": {
"min": [
-3.001304368770316,
0.0,
-1.1520586638691073
],
"max": [
4.001304368770316,
3.6238370065174728,
2.152058663869107
]
}
},
"netease:block_entity": {
"tick": false,
"movable": false
}
}
}
}
@@ -0,0 +1,55 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_main_270",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
-1.1520586638691068,
0.0,
-3.001304368770316
],
"max": [
2.1520586638691075,
3.6238370065174728,
4.001304368770315
]
},
"clip": {
"min": [
-1.1520586638691068,
0.0,
-3.001304368770316
],
"max": [
2.1520586638691075,
3.6238370065174728,
4.001304368770315
]
}
},
"netease:block_entity": {
"tick": false,
"movable": false
}
}
}
}
@@ -0,0 +1,55 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_main_90",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
-1.152058663869107,
2.220446049250313e-16,
-3.0013043687703163
],
"max": [
2.152058663869107,
3.6238370065174728,
4.001304368770316
]
},
"clip": {
"min": [
-1.152058663869107,
2.220446049250313e-16,
-3.0013043687703163
],
"max": [
2.152058663869107,
3.6238370065174728,
4.001304368770316
]
}
},
"netease:block_entity": {
"tick": false,
"movable": false
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_00",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.25,
0.375,
0.75
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.25,
0.375,
0.75
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_01",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.375,
0.375,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.375,
0.375,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_02",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.5,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.5,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_03",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.75,
0.375,
0.375
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.75,
0.375,
0.375
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_04",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.75,
0.375,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.75,
0.375,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_05",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.75,
1.0,
0.5
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.75,
1.0,
0.5
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_06",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.75,
1.0,
0.875
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.75,
1.0,
0.875
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_07",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.75,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.75,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_08",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.875,
0.375,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.875,
0.375,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_09",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.875,
1.0,
0.75
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.875,
1.0,
0.75
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_10",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.875,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
0.875,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_11",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
0.375,
0.375
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
0.375,
0.375
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_12",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
0.375,
0.75
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
0.375,
0.75
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_13",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
0.375,
0.875
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
0.375,
0.875
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_14",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
0.375,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
0.375,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_15",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
1.0,
0.5
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
1.0,
0.5
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_16",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
1.0,
0.75
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
1.0,
0.75
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_17",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
1.0,
0.875
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
1.0,
0.875
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_18",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.0
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_19",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.125
],
"max": [
0.75,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.125
],
"max": [
0.75,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_20",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.125
],
"max": [
1.0,
0.375,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.125
],
"max": [
1.0,
0.375,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_21",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.125
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.125
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_22",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.25
],
"max": [
0.125,
0.125,
0.5
]
},
"clip": {
"min": [
0.0,
0.0,
0.25
],
"max": [
0.125,
0.125,
0.5
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_23",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.25
],
"max": [
0.375,
0.375,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.25
],
"max": [
0.375,
0.375,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_24",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.25
],
"max": [
0.5,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.25
],
"max": [
0.5,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_25",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.25
],
"max": [
0.875,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.25
],
"max": [
0.875,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_26",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.25
],
"max": [
1.0,
0.375,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.25
],
"max": [
1.0,
0.375,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_27",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.25
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.25
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_28",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.5
],
"max": [
0.125,
0.25,
0.75
]
},
"clip": {
"min": [
0.0,
0.0,
0.5
],
"max": [
0.125,
0.25,
0.75
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_29",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.5
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.5
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_30",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.625
],
"max": [
1.0,
0.375,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.625
],
"max": [
1.0,
0.375,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_31",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.0,
0.75
],
"max": [
0.75,
0.375,
1.0
]
},
"clip": {
"min": [
0.0,
0.0,
0.75
],
"max": [
0.75,
0.375,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_32",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.125,
0.0
],
"max": [
0.75,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.125,
0.0
],
"max": [
0.75,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_33",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.125,
0.0
],
"max": [
1.0,
1.0,
0.75
]
},
"clip": {
"min": [
0.0,
0.125,
0.0
],
"max": [
1.0,
1.0,
0.75
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_34",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.125,
0.25
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.125,
0.25
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_35",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.25,
0.0
],
"max": [
0.75,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.25,
0.0
],
"max": [
0.75,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_36",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.25,
0.0
],
"max": [
0.875,
1.0,
0.5
]
},
"clip": {
"min": [
0.0,
0.25,
0.0
],
"max": [
0.875,
1.0,
0.5
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_37",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.25,
0.0
],
"max": [
1.0,
1.0,
0.75
]
},
"clip": {
"min": [
0.0,
0.25,
0.0
],
"max": [
1.0,
1.0,
0.75
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_38",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.25,
0.0
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.25,
0.0
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_39",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.25,
0.125
],
"max": [
0.5,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.25,
0.125
],
"max": [
0.5,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_40",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.25,
0.25
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.25,
0.25
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_41",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.375,
0.0
],
"max": [
0.75,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.375,
0.0
],
"max": [
0.75,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_42",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.375,
0.0
],
"max": [
0.875,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.375,
0.0
],
"max": [
0.875,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_43",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.375,
0.0
],
"max": [
1.0,
1.0,
0.75
]
},
"clip": {
"min": [
0.0,
0.375,
0.0
],
"max": [
1.0,
1.0,
0.75
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_44",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.375,
0.0
],
"max": [
1.0,
1.0,
0.875
]
},
"clip": {
"min": [
0.0,
0.375,
0.0
],
"max": [
1.0,
1.0,
0.875
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_45",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.375,
0.0
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.375,
0.0
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_46",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.375,
0.125
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.375,
0.125
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_47",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.375,
0.25
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.0,
0.375,
0.25
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_48",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.625,
0.25
],
"max": [
0.125,
1.0,
0.5
]
},
"clip": {
"min": [
0.0,
0.625,
0.25
],
"max": [
0.125,
1.0,
0.5
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_49",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.0,
0.75,
0.5
],
"max": [
0.125,
1.0,
0.75
]
},
"clip": {
"min": [
0.0,
0.75,
0.5
],
"max": [
0.125,
1.0,
0.75
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_50",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.125,
0.0,
0.0
],
"max": [
1.0,
0.375,
1.0
]
},
"clip": {
"min": [
0.125,
0.0,
0.0
],
"max": [
1.0,
0.375,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_51",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.125,
0.0,
0.0
],
"max": [
1.0,
1.0,
0.75
]
},
"clip": {
"min": [
0.125,
0.0,
0.0
],
"max": [
1.0,
1.0,
0.75
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_52",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.125,
0.0,
0.0
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.125,
0.0,
0.0
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_53",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.125,
0.0,
0.25
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.125,
0.0,
0.25
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_54",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.125,
0.25,
0.5
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.125,
0.25,
0.5
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_55",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.125,
0.375,
0.0
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.125,
0.375,
0.0
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_56",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.25,
0.0,
0.0
],
"max": [
0.5,
0.25,
0.125
]
},
"clip": {
"min": [
0.25,
0.0,
0.0
],
"max": [
0.5,
0.25,
0.125
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_57",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.25,
0.0,
0.0
],
"max": [
1.0,
0.375,
0.25
]
},
"clip": {
"min": [
0.25,
0.0,
0.0
],
"max": [
1.0,
0.375,
0.25
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_58",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.25,
0.0,
0.0
],
"max": [
1.0,
0.375,
1.0
]
},
"clip": {
"min": [
0.25,
0.0,
0.0
],
"max": [
1.0,
0.375,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_59",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.25,
0.0,
0.0
],
"max": [
1.0,
1.0,
0.875
]
},
"clip": {
"min": [
0.25,
0.0,
0.0
],
"max": [
1.0,
1.0,
0.875
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_60",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.25,
0.0,
0.0
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.25,
0.0,
0.0
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_61",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.25,
0.0,
0.125
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.25,
0.0,
0.125
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_62",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.25,
0.0,
0.5
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.25,
0.0,
0.5
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_63",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.25,
0.0,
0.625
],
"max": [
1.0,
0.375,
1.0
]
},
"clip": {
"min": [
0.25,
0.0,
0.625
],
"max": [
1.0,
0.375,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_64",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.25,
0.0,
0.875
],
"max": [
0.5,
0.125,
1.0
]
},
"clip": {
"min": [
0.25,
0.0,
0.875
],
"max": [
0.5,
0.125,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_65",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.25,
0.125,
0.0
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.25,
0.125,
0.0
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_66",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.25,
0.25,
0.0
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.25,
0.25,
0.0
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_67",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.25,
0.375,
0.0
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.25,
0.375,
0.0
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_68",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.25,
0.625,
0.875
],
"max": [
0.5,
1.0,
1.0
]
},
"clip": {
"min": [
0.25,
0.625,
0.875
],
"max": [
0.5,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_69",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.25,
0.75,
0.0
],
"max": [
0.5,
1.0,
0.125
]
},
"clip": {
"min": [
0.25,
0.75,
0.0
],
"max": [
0.5,
1.0,
0.125
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_70",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.5,
0.0,
0.0
],
"max": [
0.75,
0.125,
0.125
]
},
"clip": {
"min": [
0.5,
0.0,
0.0
],
"max": [
0.75,
0.125,
0.125
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_71",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.5,
0.0,
0.0
],
"max": [
1.0,
1.0,
0.75
]
},
"clip": {
"min": [
0.5,
0.0,
0.0
],
"max": [
1.0,
1.0,
0.75
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_72",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.5,
0.0,
0.0
],
"max": [
1.0,
1.0,
1.0
]
},
"clip": {
"min": [
0.5,
0.0,
0.0
],
"max": [
1.0,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_73",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.5,
0.0,
0.875
],
"max": [
0.75,
0.25,
1.0
]
},
"clip": {
"min": [
0.5,
0.0,
0.875
],
"max": [
0.75,
0.25,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_74",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.5,
0.25,
0.0
],
"max": [
1.0,
1.0,
0.875
]
},
"clip": {
"min": [
0.5,
0.25,
0.0
],
"max": [
1.0,
1.0,
0.875
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_75",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.5,
0.625,
0.0
],
"max": [
0.75,
1.0,
0.125
]
},
"clip": {
"min": [
0.5,
0.625,
0.0
],
"max": [
0.75,
1.0,
0.125
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_76",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.5,
0.75,
0.875
],
"max": [
0.75,
1.0,
1.0
]
},
"clip": {
"min": [
0.5,
0.75,
0.875
],
"max": [
0.75,
1.0,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_77",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.625,
0.0,
0.0
],
"max": [
1.0,
0.375,
0.75
]
},
"clip": {
"min": [
0.625,
0.0,
0.0
],
"max": [
1.0,
0.375,
0.75
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_78",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.625,
0.0,
0.0
],
"max": [
1.0,
0.375,
1.0
]
},
"clip": {
"min": [
0.625,
0.0,
0.0
],
"max": [
1.0,
0.375,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_79",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.75,
0.0,
0.25
],
"max": [
1.0,
0.375,
1.0
]
},
"clip": {
"min": [
0.75,
0.0,
0.25
],
"max": [
1.0,
0.375,
1.0
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_80",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.875,
0.0,
0.25
],
"max": [
1.0,
0.25,
0.5
]
},
"clip": {
"min": [
0.875,
0.0,
0.25
],
"max": [
1.0,
0.25,
0.5
]
}
}
}
}
}
@@ -0,0 +1,51 @@
{
"format_version": "1.10.0",
"minecraft:block": {
"description": {
"identifier": "dn_sa:ambulance_car_broken_ph_81",
"register_to_creative_menu": false,
"is_experimental": false,
"category": "dn_sa"
},
"components": {
"netease:solid": {
"value": true
},
"netease:render_layer": {
"value": "alpha"
},
"minecraft:destroy_time": {
"value": 1.0
},
"minecraft:block_light_absorption": {
"value": 0
},
"netease:aabb": {
"collision": {
"min": [
0.875,
0.0,
0.5
],
"max": [
1.0,
0.125,
0.75
]
},
"clip": {
"min": [
0.875,
0.0,
0.5
],
"max": [
1.0,
0.125,
0.75
]
}
}
}
}
}
Loaded 100 of 2439 files, more files were not shown because too many files have changed in this diff. Show more