本文整理汇总了Python中srctools.Property.find_all方法的典型用法代码示例。如果您正苦于以下问题:Python Property.find_all方法的具体用法?Python Property.find_all怎么用?Python Property.find_all使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类srctools.Property
的用法示例。
在下文中一共展示了Property.find_all方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: res_unst_scaffold_setup
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import find_all [as 别名]
def res_unst_scaffold_setup(res: Property):
group = res['group', 'DEFAULT_GROUP']
if group not in SCAFFOLD_CONFIGS:
# Store our values in the CONFIGS dictionary
targ_inst, links = SCAFFOLD_CONFIGS[group] = {}, {}
else:
# Grab the already-filled values, and add to them
targ_inst, links = SCAFFOLD_CONFIGS[group]
for block in res.find_all("Instance"):
conf = {
# If set, adjusts the offset appropriately
'is_piston': srctools.conv_bool(block['isPiston', '0']),
'rotate_logic': srctools.conv_bool(block['AlterAng', '1'], True),
'off_floor': Vec.from_str(block['FloorOff', '0 0 0']),
'off_wall': Vec.from_str(block['WallOff', '0 0 0']),
'logic_start': block['startlogic', ''],
'logic_end': block['endLogic', ''],
'logic_mid': block['midLogic', ''],
'logic_start_rev': block['StartLogicRev', None],
'logic_end_rev': block['EndLogicRev', None],
'logic_mid_rev': block['EndLogicRev', None],
'inst_wall': block['wallInst', ''],
'inst_floor': block['floorInst', ''],
'inst_offset': block['offsetInst', None],
# Specially rotated to face the next track!
'inst_end': block['endInst', None],
}
for logic_type in ('logic_start', 'logic_mid', 'logic_end'):
if conf[logic_type + '_rev'] is None:
conf[logic_type + '_rev'] = conf[logic_type]
for inst in instanceLocs.resolve(block['file']):
targ_inst[inst] = conf
# We need to provide vars to link the tracks and beams.
for block in res.find_all('LinkEnt'):
# The name for this set of entities.
# It must be a '@' name, or the name will be fixed-up incorrectly!
loc_name = block['name']
if not loc_name.startswith('@'):
loc_name = '@' + loc_name
links[block['nameVar']] = {
'name': loc_name,
# The next entity (not set in end logic)
'next': block['nextVar'],
# A '*' name to reference all the ents (set on the start logic)
'all': block['allVar', None],
}
return group # We look up the group name to find the values.
示例2: load_settings
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import find_all [as 别名]
def load_settings(pit: Property):
if not pit:
SETTINGS.clear()
# No pits are permitted..
return
SETTINGS.update({
'use_skybox': srctools.conv_bool(pit['teleport', '0']),
'tele_dest': pit['tele_target', '@goo_targ'],
'tele_ref': pit['tele_ref', '@goo_ref'],
'off_x': srctools.conv_int(pit['off_x', '0']),
'off_y': srctools.conv_int(pit['off_y', '0']),
'skybox': pit['sky_inst', ''],
'skybox_ceil': pit['sky_inst_ceil', ''],
'targ': pit['targ_inst', ''],
'blend_light': pit['blend_light', '']
})
for inst_type in (
'support',
'side',
'corner',
'double',
'triple',
'pillar',
):
vals = [
prop.value
for prop in
pit.find_all(inst_type + '_inst')
]
if len(vals) == 0:
vals = [""]
PIT_INST[inst_type] = vals
示例3: res_timed_relay_setup
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import find_all [as 别名]
def res_timed_relay_setup(res: Property):
var = res['variable', consts.FixupVars.TIM_DELAY]
name = res['targetname']
disabled = res['disabled', '0']
flags = res['spawnflags', '0']
final_outs = [
Output.parse(subprop)
for prop in res.find_all('FinalOutputs')
for subprop in prop
]
rep_outs = [
Output.parse(subprop)
for prop in res.find_all('RepOutputs')
for subprop in prop
]
# Never use the comma seperator in the final output for consistency.
for out in itertools.chain(rep_outs, final_outs):
out.comma_sep = False
return var, name, disabled, flags, final_outs, rep_outs
示例4: res_vactube_setup
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import find_all [as 别名]
def res_vactube_setup(res: Property):
group = res['group', 'DEFAULT_GROUP']
if group not in VAC_CONFIGS:
# Store our values in the CONFIGS dictionary
config, inst_configs = VAC_CONFIGS[group] = {}, {}
else:
# Grab the already-filled values, and add to them
config, inst_configs = VAC_CONFIGS[group]
for block in res.find_all("Instance"):
# Configuration info for each instance set..
conf = {
# The three sizes of corner instance
('corner', 1): block['corner_small_inst', ''],
('corner', 2): block['corner_medium_inst', ''],
('corner', 3): block['corner_large_inst', ''],
('corner_temp', 1): block['temp_corner_small', ''],
('corner_temp', 2): block['temp_corner_medium', ''],
('corner_temp', 3): block['temp_corner_large', ''],
# Straight instances connected to the next part
'straight': block['straight_inst', ''],
# Supports attach to the 4 sides of the straight part,
# if there's a brush there.
'support': block['support_inst', ''],
'is_tsection': srctools.conv_bool(block['is_tsection', '0']),
('entry', 'wall'): block['entry_inst'],
('entry', 'floor'): block['entry_floor_inst'],
('entry', 'ceiling'): block['entry_ceil_inst'],
'exit': block['exit_inst'],
}
for prop in block.find_all("File"):
try:
size, file = prop.value.split(":", 1)
except ValueError:
size = 1
file = prop.value
for inst in instanceLocs.resolve(file):
inst_configs[inst] = conf, srctools.conv_int(size, 1)
return group
示例5: read_configs
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import find_all [as 别名]
def read_configs(conf: Property) -> None:
"""Read in the fizzler data."""
for fizz_conf in conf.find_all('Fizzlers', 'Fizzler'):
fizz = FizzlerType.parse(fizz_conf)
if fizz.id in FIZZ_TYPES:
raise ValueError('Duplicate fizzler ID "{}"'.format(fizz.id))
FIZZ_TYPES[fizz.id] = fizz
LOGGER.info('Loaded {} fizzlers.', len(FIZZ_TYPES))
if vbsp_options.get(str, 'game_id') != utils.STEAM_IDS['APTAG']:
return
# In Aperture Tag, we don't have portals. For fizzler types which block
# portals (trigger_portal_cleanser), additionally fizzle paint.
for fizz in FIZZ_TYPES.values():
for brush in fizz.brushes:
if brush.keys['classname'].casefold() == 'trigger_portal_cleanser':
brush_name = brush.name
# Retrieve what key is used for start-disabled.
brush_start_disabled = None
for key_map in [brush.keys, brush.local_keys]:
if brush_start_disabled is None:
for key, value in key_map.items():
if key.casefold() == 'startdisabled':
brush_start_disabled = value
break
break # Jump past else.
else:
# No fizzlers in this item.
continue
# Add a paint fizzler brush to these fizzlers.
fizz.brushes.append(FizzlerBrush(
brush_name,
textures={
TexGroup.TRIGGER: const.Tools.TRIGGER,
},
keys={
'classname': 'trigger_paint_cleanser',
'startdisabled': brush_start_disabled or '0',
'spawnflags': '9',
},
local_keys={},
outputs=[],
singular=True,
))
示例6: parse
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import find_all [as 别名]
def parse(cls, prop: Property):
"""Parse this from a property block."""
broken_chance = prop.float('broken_chance')
tex_straight = []
tex_corner = []
brok_straight = []
brok_corner = []
for ant_list, name in zip(
[tex_straight, tex_corner, brok_straight, brok_corner],
('straight', 'corner', 'broken_straight', 'broken_corner'),
):
for sub_prop in prop.find_all(name):
ant_list.append(AntTex.parse(sub_prop))
return cls(
tex_straight,
tex_corner,
brok_straight,
brok_corner,
broken_chance,
)
示例7: build_instance_data
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import find_all [as 别名]
def build_instance_data(editoritems: Property):
"""Build a property tree listing all of the instances for each item.
as well as another listing the input and output commands.
VBSP uses this to reduce duplication in VBSP_config files.
This additionally strips custom instance definitions from the original
list.
"""
instance_locs = Property("AllInstances", [])
cust_inst = Property("CustInstances", [])
commands = Property("Connections", [])
item_classes = Property("ItemClasses", [])
root_block = Property(None, [instance_locs, item_classes, cust_inst, commands])
for item in editoritems.find_all("Item"):
instance_block = Property(item["Type"], [])
instance_locs.append(instance_block)
comm_block = Property(item["Type"], [])
for inst_block in item.find_all("Exporting", "instances"):
for inst in inst_block.value[:]: # type: Property
if inst.name.isdigit():
# Direct Portal 2 value
instance_block.append(Property("Instance", inst["Name"]))
else:
# It's a custom definition, remove from editoritems
inst_block.value.remove(inst)
# Allow the name to start with 'bee2_' also to match
# the <> definitions - it's ignored though.
name = inst.name
if name[:5] == "bee2_":
name = name[5:]
cust_inst.set_key(
(item["type"], name),
# Allow using either the normal block format,
# or just providing the file - we don't use the
# other values.
inst["name"] if inst.has_children() else inst.value,
)
# Look in the Inputs and Outputs blocks to find the io definitions.
# Copy them to property names like 'Input_Activate'.
for io_type in ("Inputs", "Outputs"):
for block in item.find_all("Exporting", io_type, CONN_NORM):
for io_prop in block:
comm_block[io_type[:-1] + "_" + io_prop.real_name] = io_prop.value
# The funnel item type is special, having the additional input type.
# Handle that specially.
if item["type"] == "item_tbeam":
for block in item.find_all("Exporting", "Inputs", CONN_FUNNEL):
for io_prop in block:
comm_block["TBEAM_" + io_prop.real_name] = io_prop.value
# Fizzlers don't work correctly with outputs. This is a signal to
# conditions.fizzler, but it must be removed in editoritems.
if item["ItemClass", ""].casefold() == "itembarrierhazard":
for block in item.find_all("Exporting", "Outputs"):
if CONN_NORM in block:
del block[CONN_NORM]
# Record the itemClass for each item type.
item_classes[item["type"]] = item["ItemClass", "ItemBase"]
# Only add the block if the item actually has IO.
if comm_block.value:
commands.append(comm_block)
return root_block.export()
示例8: res_fix_rotation_axis
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import find_all [as 别名]
def res_fix_rotation_axis(ent: Entity, res: Property):
"""Generate a `func_rotating`, `func_door_rotating` or any similar entity.
This uses the orientation of the instance to detemine the correct
spawnflags to make it rotate in the correct direction. The brush
will be 2x2x2 units large, and always set to be non-solid.
- `Pos` and `name` are local to the
instance, and will set the `origin` and `targetname` respectively.
- `Keys` are any other keyvalues to be be set.
- `Flags` sets additional spawnflags. Multiple values may be
separated by `+`, and will be added together.
- `Classname` specifies which entity will be created, as well as
which other values will be set to specify the correct orientation.
- `AddOut` is used to add outputs to the generated entity. It takes
the options `Output`, `Target`, `Input`, `Param` and `Delay`. If
`Inst_targ` is defined, it will be used with the input to construct
an instance proxy input. If `OnceOnly` is set, the output will be
deleted when fired.
Permitted entities:
* `func_rotating`
* `func_door_rotating`
* `func_rot_button`
* `func_platrot`
"""
des_axis = res['axis', 'z'].casefold()
reverse = srctools.conv_bool(res['reversed', '0'])
door_type = res['classname', 'func_door_rotating']
# Extra stuff to apply to the flags (USE, toggle, etc)
flags = sum(map(
# Add together multiple values
srctools.conv_int,
res['flags', '0'].split('+')
))
name = conditions.local_name(ent, res['name', ''])
axis = Vec(**{des_axis: 1}).rotate_by_str(ent['angles', '0 0 0'])
pos = Vec.from_str(
res['Pos', '0 0 0']
).rotate_by_str(ent['angles', '0 0 0'])
pos += Vec.from_str(ent['origin', '0 0 0'])
door_ent = vbsp.VMF.create_ent(
classname=door_type,
targetname=name,
origin=pos.join(' '),
)
conditions.set_ent_keys(door_ent, ent, res)
for output in res.find_all('AddOut'):
door_ent.add_out(Output(
out=output['Output', 'OnUse'],
inp=output['Input', 'Use'],
targ=output['Target', ''],
inst_in=output['Inst_targ', None],
param=output['Param', ''],
delay=srctools.conv_float(output['Delay', '']),
times=(
1 if
srctools.conv_bool(output['OnceOnly', False])
else -1),
))
# Generate brush
door_ent.solids = [vbsp.VMF.make_prism(pos - 1, pos + 1).solid]
if axis.x > 0 or axis.y > 0 or axis.z > 0:
# If it points forward, we need to reverse the rotating door
reverse = not reverse
flag_values = FLAG_ROTATING[door_type]
# Make the door always non-solid!
flags |= flag_values.get('solid_flags', 0)
# Add or remove flags as needed.
# flags |= bit sets it to 1.
# flags |= ~bit sets it to 0.
if axis.x != 0:
flags |= flag_values.get('x', 0)
else:
flags &= ~flag_values.get('x', 0)
if axis.y != 0:
flags |= flag_values.get('y', 0)
else:
flags &= ~flag_values.get('y', 0)
if axis.z != 0:
flags |= flag_values.get('z', 0)
else:
flags &= ~flag_values.get('z', 0)
if door_type == 'momentary_rot_button':
door_ent['startdirection'] = '1' if reverse else '-1'
else:
if reverse:
flags |= flag_values.get('rev', 0)
#.........这里部分代码省略.........
示例9: parse
# 需要导入模块: from srctools import Property [as 别名]
# 或者: from srctools.Property import find_all [as 别名]
def parse(cls, conf: Property):
"""Read in a fizzler from a config."""
fizz_id = conf['id']
item_ids = [
prop.value.casefold()
for prop in
conf.find_all('item_id')
]
try:
model_name_type = ModelName(conf['NameType', 'same'].casefold())
except ValueError:
LOGGER.warning('Bad model name type: "{}"', conf['NameType'])
model_name_type = ModelName.SAME
model_local_name = conf['ModelName', '']
if not model_local_name:
# We can't rename without a local name.
model_name_type = ModelName.SAME
inst = {}
for inst_type, is_static in itertools.product(FizzInst, (False, True)):
inst_type_name = inst_type.value + ('_static' if is_static else '')
inst[inst_type, is_static] = instances = [
file
for prop in conf.find_all(inst_type_name)
for file in instanceLocs.resolve(prop.value)
]
# Allow specifying weights to bias model locations
weights = conf[inst_type_name + '_weight', '']
if weights:
# Produce the weights, then process through the original
# list to build a new one with repeated elements.
inst[inst_type, is_static] = instances = [
instances[i]
for i in conditions.weighted_random(len(instances), weights)
]
# If static versions aren't given, reuse non-static ones.
# We do False, True so it's already been calculated.
if not instances and is_static:
inst[inst_type, True] = inst[inst_type, False]
if not inst[FizzInst.BASE, False]:
LOGGER.warning('No base instance set! for "{}"!', fizz_id)
voice_attrs = []
for prop in conf.find_all('Has'):
if prop.has_children():
for child in prop:
voice_attrs.append(child.name.casefold())
else:
voice_attrs.append(prop.value.casefold())
pack_lists = {
prop.value
for prop in
conf.find_all('Pack')
}
pack_lists_static = {
prop.value
for prop in
conf.find_all('PackStatic')
}
brushes = [
FizzlerBrush.parse(prop)
for prop in
conf.find_all('Brush')
]
beams = [] # type: List[FizzBeam]
for beam_prop in conf.find_all('Beam'):
offsets = [
Vec.from_str(off.value)
for off in
beam_prop.find_all('pos')
]
keys = Property('', [
beam_prop.find_key('Keys', []),
beam_prop.find_key('LocalKeys', [])
])
beams.append(FizzBeam(
offsets,
keys,
beam_prop.int('RandSpeedMin', 0),
beam_prop.int('RandSpeedMax', 0),
))
try:
temp_conf = conf.find_key('TemplateBrush')
except NoKeyError:
temp_brush_keys = temp_min = temp_max = temp_single = None
else:
temp_brush_keys = Property('--', [
temp_conf.find_key('Keys'),
temp_conf.find_key('LocalKeys', []),
])
# Find and load the templates.
temp_min = temp_conf['Left', None]
#.........这里部分代码省略.........