本文整理汇总了Python中srctools.Property.has_children方法的典型用法代码示例。如果您正苦于以下问题:Python Property.has_children方法的具体用法?Python Property.has_children怎么用?Python Property.has_children使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类srctools.Property
的用法示例。
在下文中一共展示了Property.has_children方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: write_sound
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import has_children [as 别名]
def write_sound(
file: StringIO,
snds: Property,
pack_list: PackList,
snd_prefix: str='*',
) -> None:
"""Write either a single sound, or multiple rndsound.
snd_prefix is the prefix for each filename - *, #, @, etc.
"""
if snds.has_children():
file.write('"rndwave"\n\t{\n')
for snd in snds:
file.write(
'\t"wave" "{sndchar}{file}"\n'.format(
file=snd.value.lstrip(SOUND_CHARS),
sndchar=snd_prefix,
)
)
pack_list.pack_file('sound/' + snd.value.casefold())
file.write('\t}\n')
else:
file.write(
'"wave" "{sndchar}{file}"\n'.format(
file=snds.value.lstrip(SOUND_CHARS),
sndchar=snd_prefix,
)
)
pack_list.pack_file('sound/' + snds.value.casefold())
示例2: parse
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import has_children [as 别名]
def parse(prop: Property):
"""Parse from property values.
The value can be in four forms:
"prop" "material"
"prop" "<scale>|material"
"prop" "<scale>|material|static"
"prop"
{
"tex" "<mat>"
"scale" "<scale>"
"static" "<is_static>"
}
"""
if prop.has_children():
tex = prop['tex']
scale = prop.float('scale', 0.25)
static = prop.bool('static')
else:
vals = prop.value.split('|')
opts = ()
scale_str = '0.25'
if len(vals) == 2:
scale_str, tex = vals
elif len(vals) > 2:
scale_str, tex, *opts = vals
else:
# Unpack to ensure it only has 1 section
[tex] = vals
scale = conv_float(scale_str, 0.25)
static = 'static' in opts
return AntTex(tex, scale, static)
示例3: make_static_pist_setup
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import has_children [as 别名]
def make_static_pist_setup(res: Property):
instances = (
'bottom_0', 'bottom_1', 'bottom_2', 'bottom_3',
'logic_0', 'logic_1', 'logic_2', 'logic_3',
'static_0', 'static_1', 'static_2', 'static_3', 'static_4',
'grate_low', 'grate_high',
)
if res.has_children():
# Pull from config
return {
name: instanceLocs.resolve_one(
res[name, ''],
error=False,
) for name in instances
}
else:
# Pull from editoritems
if ':' in res.value:
from_item, prefix = res.value.split(':', 1)
else:
from_item = res.value
prefix = ''
return {
name: instanceLocs.resolve_one(
'<{}:bee2_{}{}>'.format(from_item, prefix, name),
error=False,
) for name in instances
}
示例4: flag_blockpos_type
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import has_children [as 别名]
def flag_blockpos_type(inst: Entity, flag: Property):
"""Determine the type of a grid position.
If the value is single value, that should be the type.
Otherwise, the value should be a block with 'offset' and 'type' values.
The offset is in block increments, with 0 0 0 equal to the mounting surface.
If 'offset2' is also provided, all positions in the bounding box will
be checked.
The type should be a space-seperated list of locations:
* `VOID` (Outside the map)
* `SOLID` (Full wall cube)
* `EMBED` (Hollow wall cube)
* `AIR` (Inside the map, may be occupied by items)
* `OCCUPIED` (Known to be occupied by items)
* `PIT` (Bottomless pits, any)
* `PIT_SINGLE` (one-high)
* `PIT_TOP`
* `PIT_MID`
* `PIT_BOTTOM`
* `GOO`
* `GOO_SINGLE` (one-deep goo)
* `GOO_TOP` (goo surface)
* `GOO_MID`
* `GOO_BOTTOM` (floor)
"""
pos2 = None
if flag.has_children():
pos1 = resolve_offset(inst, flag['offset', '0 0 0'], scale=128, zoff=-128)
types = flag['type'].split()
if 'offset2' in flag:
pos2 = resolve_offset(inst, flag.value, scale=128, zoff=-128)
else:
types = flag.value.split()
pos1 = Vec()
if pos2 is not None:
bbox = Vec.iter_grid(*Vec.bbox(pos1, pos2), stride=128)
else:
bbox = [pos1]
for pos in bbox:
block = brushLoc.POS['world': pos]
for block_type in types:
try:
allowed = brushLoc.BLOCK_LOOKUP[block_type.casefold()]
except KeyError:
raise ValueError('"{}" is not a valid block type!'.format(block_type))
if block in allowed:
break # To next position
else:
return False # Didn't match any in this list.
return True # Matched all positions.
示例5: res_set_voice_attr
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import has_children [as 别名]
def res_set_voice_attr(res: Property):
"""Sets a number of Voice Attributes.
Each child property will be set. The value is ignored, but must
be present for syntax reasons.
"""
if res.has_children():
for opt in res.value:
vbsp.settings['has_attr'][opt.name] = True
else:
vbsp.settings['has_attr'][res.value.casefold()] = True
return RES_EXHAUSTED
示例6: flag_random
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import has_children [as 别名]
def flag_random(inst: Entity, res: Property) -> bool:
"""Randomly is either true or false."""
if res.has_children():
chance = res['chance', '100']
seed = 'a' + res['seed', '']
else:
chance = res.value
seed = 'a'
# Allow ending with '%' sign
chance = srctools.conv_int(chance.rstrip('%'), 100)
set_random_seed(inst, seed)
return random.randrange(100) < chance
示例7: res_global_input_setup
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import has_children [as 别名]
def res_global_input_setup(res: Property):
if res.has_children():
name = res['name', '']
inp_name, inp_command = Output.parse_name(res['input'])
return name, Output(
out=res['output', 'OnTrigger'],
targ=res['target', ''],
inp=inp_command,
inst_in=inp_name,
delay=srctools.conv_float(res['delay', '']),
param=res['param', ''],
)
else:
out = Output.parse(res)
out.output = '' # Don't need to store GlobalInput...
return '', out
示例8: res_add_inst_var
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import has_children [as 别名]
def res_add_inst_var(inst: Entity, res: Property):
"""Append the value of an instance variable to the filename.
Pass either the variable name, or a set of value->suffix pairs for a
lookup.
"""
if res.has_children():
val = inst.fixup[res['variable', '']]
for rep in res: # lookup the number to determine the appending value
if rep.name == 'variable':
continue # this isn't a lookup command!
if rep.name == val:
conditions.add_suffix(inst, '_' + rep.value)
break
else: # append the value
conditions.add_suffix(inst, '_' + inst.fixup[res.value, ''])
示例9: res_add_variant_setup
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import has_children [as 别名]
def res_add_variant_setup(res: Property) -> object:
if res.has_children():
count = srctools.conv_int(res['Number', ''], None)
if count:
return conditions.weighted_random(
count,
res['weights', ''],
)
else:
return None
else:
count = srctools.conv_int(res.value, None)
if count:
return list(range(count))
else:
return None
示例10: res_calc_opposite_wall_dist
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import has_children [as 别名]
def res_calc_opposite_wall_dist(inst: Entity, res: Property):
"""Calculate the distance between this item and the opposing wall.
The value is stored in the `$var` specified by the property value.
Alternately it is set by `ResultVar`, and `offset` adds or subtracts to the value.
`GooCollide` means that it will stop when goo is found, otherwise it is
ignored.
`GooAdjust` means additionally if the space is goo, the distance will
be modified so that it specifies the surface of the goo.
"""
if res.has_children():
result_var = res['ResultVar']
dist_off = res.float('offset')
collide_goo = res.bool('GooCollide')
adjust_goo = res.bool('GooAdjust')
else:
result_var = res.value
dist_off = 0
collide_goo = adjust_goo = False
origin = Vec.from_str(inst['origin'])
normal = Vec(z=1).rotate_by_str(inst['angles'])
mask = [
brushLoc.Block.SOLID,
brushLoc.Block.EMBED,
brushLoc.Block.PIT_BOTTOM,
brushLoc.Block.PIT_SINGLE,
]
# Only if actually downward.
if normal == (0, 0, -1) and collide_goo:
mask.append(brushLoc.Block.GOO_TOP)
mask.append(brushLoc.Block.GOO_SINGLE)
opposing_pos = brushLoc.POS.raycast_world(
origin,
normal,
mask,
)
if adjust_goo and brushLoc.POS['world': opposing_pos + 128*normal].is_goo:
# If the top is goo, adjust so the 64 below is the top of the goo.
dist_off += 32
inst.fixup[result_var] = (origin - opposing_pos).mag() + dist_off
示例11: debug_flag
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import has_children [as 别名]
def debug_flag(inst: Entity, props: Property):
"""Displays text when executed, for debugging conditions.
If the text ends with an '=', the instance will also be displayed.
As a flag, this always evaluates as true.
"""
# Mark as a warning so it's more easily seen.
if props.has_children():
LOGGER.warning('Debug:')
LOGGER.warning(str(props))
LOGGER.warning(str(inst))
elif props.value.strip().endswith('='):
LOGGER.warning('Debug: {props}{inst!s}'.format(
inst=inst,
props=props.value,
))
else:
LOGGER.warning('Debug: ' + props.value)
return True # The flag is always true
示例12: flag_angles
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import has_children [as 别名]
def flag_angles(inst: Entity, flag: Property):
"""Check that a instance is pointed in a direction.
The value should be either just the angle to check, or a block of
options:
- `Angle`: A unit vector (XYZ value) pointing in a direction, or some
keywords: `+z`, `-y`, `N`/`S`/`E`/`W`, `up`/`down`, `floor`/`ceiling`, or `walls` for any wall side.
- `From_dir`: The direction the unrotated instance is pointed in.
This lets the flag check multiple directions
- `Allow_inverse`: If true, this also returns True if the instance is
pointed the opposite direction .
"""
angle = inst['angles', '0 0 0']
if flag.has_children():
targ_angle = flag['direction', '0 0 0']
from_dir = flag['from_dir', '0 0 1']
if from_dir.casefold() in DIRECTIONS:
from_dir = Vec(DIRECTIONS[from_dir.casefold()])
else:
from_dir = Vec.from_str(from_dir, 0, 0, 1)
allow_inverse = srctools.conv_bool(flag['allow_inverse', '0'])
else:
targ_angle = flag.value
from_dir = Vec(0, 0, 1)
allow_inverse = False
normal = DIRECTIONS.get(targ_angle.casefold(), None)
if normal is None:
return False # If it's not a special angle,
# so it failed the exact match
inst_normal = from_dir.rotate_by_str(angle)
if normal == 'WALL':
# Special case - it's not on the floor or ceiling
return not (inst_normal == (0, 0, 1) or inst_normal == (0, 0, -1))
else:
return inst_normal == normal or (
allow_inverse and -inst_normal == normal
)
示例13: res_add_global_inst
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import has_children [as 别名]
def res_add_global_inst(res: Property):
"""Add one instance in a specific location.
Options:
`allow_multiple`: Allow multiple copies of this instance. If 0, the
instance will not be added if it was already added.
`name`: The targetname of the instance. If blank, the instance will
be given a name of the form `inst_1234`.
`file`: The filename for the instance.
`angles`: The orientation of the instance (defaults to `0 0 0`).
`fixup_style`: The Fixup style for the instance. `0` (default) is
Prefix, `1` is Suffix, and `2` is None.
`position`: The location of the instance. If not set, it will be placed
in a 128x128 nodraw room somewhere in the map. Objects which can
interact with nearby object should not be placed there.
"""
if not res.has_children():
res = Property('AddGlobal', [Property('File', res.value)])
if res.bool('allow_multiple') or res['file'] not in GLOBAL_INSTANCES:
# By default we will skip adding the instance
# if was already added - this is helpful for
# items that add to original items, or to avoid
# bugs.
new_inst = vbsp.VMF.create_ent(
classname="func_instance",
targetname=res['name', ''],
file=instanceLocs.resolve_one(res['file'], error=True),
angles=res['angles', '0 0 0'],
fixup_style=res['fixup_style', '0'],
)
try:
new_inst['origin'] = res['position']
except IndexError:
new_inst['origin'] = vbsp_options.get(Vec, 'global_ents_loc')
GLOBAL_INSTANCES.add(res['file'])
if new_inst['targetname'] == '':
new_inst['targetname'] = "inst_"
new_inst.make_unique()
return RES_EXHAUSTED
示例14: res_add_overlay_inst
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import has_children [as 别名]
def res_add_overlay_inst(inst: Entity, res: Property):
"""Add another instance on top of this one.
If a single value, this sets only the filename.
Values:
`file`: The filename.
`fixup_style`: The Fixup style for the instance. '0' (default) is
Prefix, '1' is Suffix, and '2' is None.
`copy_fixup`: If true, all the $replace values from the original
instance will be copied over.
`move_outputs`: If true, outputs will be moved to this instance.
`offset`: The offset (relative to the base) that the instance
will be placed. Can be set to '<piston_top>' and
'<piston_bottom>' to offset based on the configuration.
'<piston_start>' will set it to the starting position, and
'<piston_end>' will set it to the ending position.
of piston platform handles.
`angles`: If set, overrides the base instance angles. This does
not affect the offset property.
`fixup`/`localfixup`: Keyvalues in this block will be copied to the
overlay entity.
If the value starts with $, the variable will be copied over.
If this is present, copy_fixup will be disabled.
"""
if not res.has_children():
# Use all the defaults.
res = Property('AddOverlay', [
Property('File', res.value)
])
angle = res['angles', inst['angles', '0 0 0']]
orig_name = conditions.resolve_value(inst, res['file', ''])
filename = instanceLocs.resolve_one(orig_name)
if not filename:
if not res.bool('silentLookup'):
LOGGER.warning('Bad filename for "{}" when adding overlay!', orig_name)
# Don't bother making a overlay which will be deleted.
return
overlay_inst = vbsp.VMF.create_ent(
classname='func_instance',
targetname=inst['targetname', ''],
file=filename,
angles=angle,
origin=inst['origin'],
fixup_style=res['fixup_style', '0'],
)
# Don't run if the fixup block exists..
if srctools.conv_bool(res['copy_fixup', '1']):
if 'fixup' not in res and 'localfixup' not in res:
# Copy the fixup values across from the original instance
for fixup, value in inst.fixup.items():
overlay_inst.fixup[fixup] = value
conditions.set_ent_keys(overlay_inst.fixup, inst, res, 'fixup')
if res.bool('move_outputs', False):
overlay_inst.outputs = inst.outputs
inst.outputs = []
if 'offset' in res:
overlay_inst['origin'] = conditions.resolve_offset(inst, res['offset'])
return overlay_inst