本文整理汇总了Python中utils.Vec.from_str方法的典型用法代码示例。如果您正苦于以下问题:Python Vec.from_str方法的具体用法?Python Vec.from_str怎么用?Python Vec.from_str使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类utils.Vec
的用法示例。
在下文中一共展示了Vec.from_str方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: res_replace_instance
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def res_replace_instance(inst: VLib.Entity, res):
"""Replace an instance with another entity.
'keys' and 'localkeys' defines the new keyvalues used.
'targetname' and 'angles' are preset, and 'origin' will be used to offset
the given amount from the current location.
If 'keep_instance' is true, the instance entity will be kept instead of
removed.
"""
import vbsp
origin = Vec.from_str(inst['origin'])
angles = inst['angles']
if not utils.conv_bool(res['keep_instance', '0'], False):
inst.remove() # Do this first to free the ent ID, so the new ent has
# the same one.
# We copy to allow us to still acess the $fixups and other values.
new_ent = inst.copy(des_id=inst.id)
new_ent.clear_keys()
# Ensure there's a classname, just in case.
new_ent['classname'] = 'info_null'
vbsp.VMF.add_ent(new_ent)
conditions.set_ent_keys(new_ent, inst, res)
origin += Vec.from_str(new_ent['origin']).rotate_by_str(angles)
new_ent['origin'] = origin
new_ent['angles'] = angles
new_ent['targetname'] = inst['targetname']
示例2: flag_angles
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def flag_angles(inst, flag):
"""Check that a instance is pointed in a 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 = utils.conv_bool(flag["allow_inverse", "0"])
else:
targ_angle = flag.value
from_dir = Vec(0, 0, 1)
allow_inverse = False
if angle == targ_angle:
return True # Check for exact match
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
angle = Vec.from_str(angle, 0, 0, 0)
inst_normal = from_dir.rotate(angle.x, angle.y, angle.z)
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)
示例3: flag_brush_at_loc
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def flag_brush_at_loc(inst, flag):
"""Checks to see if a wall is present at the given location.
- Pos is the position of the brush, where `0 0 0` is the floor-position
of the brush.
- Dir is the normal the face is pointing. (0 0 -1) is 'up'.
- Type defines the type the brush must be:
- "Any" requires either a black or white brush.
- "None" means that no brush must be present.
- "White" requires a portalable surface.
- "Black" requires a non-portalable surface.
- SetVar defines an instvar which will be given a value of "black",
"white" or "none" to allow the result to be reused.
- If gridPos is true, the position will be snapped so it aligns with
the 128 brushes (Useful with fizzler/light strip items).
- RemoveBrush: If set to 1, the brush will be removed if found.
Only do this to EmbedFace brushes, since it will remove the other
sides as well.
"""
from conditions import VMF
pos = Vec.from_str(flag['pos', '0 0 0'])
pos.z -= 64 # Subtract so origin is the floor-position
pos = pos.rotate_by_str(inst['angles', '0 0 0'])
# Relative to the instance origin
pos += Vec.from_str(inst['origin', '0 0 0'])
norm = Vec.from_str(flag['dir', '0 0 -1']).rotate_by_str(
inst['angles', '0 0 0']
)
if utils.conv_bool(flag['gridpos', '0']):
for axis in 'xyz':
# Don't realign things in the normal's axis -
# those are already fine.
if norm[axis] == 0:
pos[axis] = pos[axis] // 128 * 128 + 64
result_var = flag['setVar', '']
should_remove = utils.conv_bool(flag['RemoveBrush', False], False)
des_type = flag['type', 'any'].casefold()
brush = SOLIDS.get(pos.as_tuple(), None)
if brush is None or brush.normal != norm:
br_type = 'none'
else:
br_type = str(brush.color)
if should_remove:
VMF.remove_brush(
brush.solid,
)
if result_var:
inst.fixup[result_var] = br_type
if des_type == 'any' and br_type != 'none':
return True
return des_type == br_type
示例4: res_faith_mods
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def res_faith_mods(inst, res):
"""Modify the trigger_catrapult that is created for ItemFaithPlate items.
"""
# Get data about the trigger this instance uses for flinging
fixup_var = res["instvar", ""]
offset = utils.conv_int(res["raise_trig", "0"])
if offset:
angle = Vec.from_str(inst["angles", "0 0 0"])
offset = Vec(0, 0, offset).rotate(angle.x, angle.y, angle.z)
":type offset Vec"
for trig in VMF.by_class["trigger_catapult"]:
if inst["targetname"] in trig["targetname"]:
if offset: # Edit both the normal and the helper trigger
trig["origin"] = (Vec.from_str(trig["origin"]) + offset).join(" ")
for solid in trig.solids:
solid.translate(offset)
for out in trig.outputs:
if out.inst_in == "animate_angled_relay":
out.inst_in = res["angled_targ", "animate_angled_relay"]
out.input = res["angled_in", "Trigger"]
if fixup_var:
inst.fixup[fixup_var] = "angled"
break
elif out.inst_in == "animate_straightup_relay":
out.inst_in = res["straight_targ", "animate_straightup_relay"]
out.input = res["straight_in", "Trigger"]
if fixup_var:
inst.fixup[fixup_var] = "straight"
break
示例5: res_fizzler_pair
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def res_fizzler_pair(begin_inst, res):
"""Modify the instance of a fizzler to link with its pair."""
orig_target = begin_inst['targetname']
if 'modelEnd' in orig_target:
return # We only execute starting from the start side.
orig_target = orig_target[:-11] # remove "_modelStart"
end_name = orig_target + '_modelEnd' # What we search for
# The name all these instances get
pair_name = orig_target + '-model' + str(begin_inst.id)
orig_file = begin_inst['file']
begin_file = res['StartInst', orig_file]
end_file = res['EndInst', orig_file]
mid_file = res['MidInst', '']
begin_inst['file'] = begin_file
begin_inst['targetname'] = pair_name
angles = Vec.from_str(begin_inst['angles'])
# We round it to get rid of 0.00001 inprecision from the calculations.
direction = round(Vec(0, 0, 1).rotate(angles.x, angles.y, angles.z))
':type direction: utils.Vec'
print(end_name, direction)
begin_pos = Vec.from_str(begin_inst['origin'])
axis_1, axis_2, main_axis = PAIR_AXES[direction.as_tuple()]
for end_inst in VMF.by_class['func_instance']:
if end_inst['targetname', ''] != end_name:
# Only examine this barrier hazard's instances!
continue
end_pos = Vec.from_str(end_inst['origin'])
if (
begin_pos[axis_1] == end_pos[axis_1] and
begin_pos[axis_2] == end_pos[axis_2]
):
length = int(end_pos[main_axis] - begin_pos[main_axis])
break
else:
utils.con_log('No matching pair for {}!!'.format(orig_target))
return
end_inst['targetname'] = pair_name
end_inst['file'] = end_file
if mid_file != '':
# Go 64 from each side, and always have at least 1 section
# A 128 gap will have length = 0
for dis in range(0, abs(length) + 1, 128):
new_pos = begin_pos + direction*dis
VMF.create_ent(
classname='func_instance',
targetname=pair_name,
angles=begin_inst['angles'],
file=mid_file,
origin=new_pos.join(' '),
)
示例6: join_markers
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def join_markers(inst_a, inst_b, is_start=False):
"""Join two marker ents together with corners.
This returns a list of solids used for the vphysics_motion trigger.
"""
origin_a = Vec.from_str(inst_a['ent']['origin'])
origin_b = Vec.from_str(inst_b['ent']['origin'])
norm_a = Vec(-1, 0, 0).rotate_by_str(inst_a['ent']['angles'])
norm_b = Vec(-1, 0, 0).rotate_by_str(inst_b['ent']['angles'])
config = inst_a['conf']
if norm_a == norm_b:
# Either straight-line, or s-bend.
dist = (origin_a - origin_b).mag()
if origin_a + (norm_a * dist) == origin_b:
make_straight(
origin_a,
norm_a,
dist,
config,
is_start,
)
# else: S-bend, we don't do the geometry for this..
return
if norm_a == -norm_b:
# U-shape bend..
make_ubend(
origin_a,
origin_b,
norm_a,
config,
max_size=inst_a['size'],
)
return
try:
corner_ang, flat_angle = CORNER_ANG[norm_a.as_tuple(), norm_b.as_tuple()]
if origin_a[flat_angle] != origin_b[flat_angle]:
# It needs to be flat in this angle!
raise ValueError
except ValueError:
# The tubes need two corners to join together - abort for that.
return
else:
make_bend(
origin_a,
origin_b,
norm_a,
norm_b,
corner_ang,
config,
max_size=inst_a['size'],
)
示例7: res_fizzler_pair
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def res_fizzler_pair(begin_inst, res):
"""Modify the instance of a fizzler to link with its pair."""
orig_target = begin_inst["targetname"]
if "modelEnd" in orig_target:
return # We only execute starting from the start side.
orig_target = orig_target[:-11] # remove "_modelStart"
end_name = orig_target + "_modelEnd" # What we search for
# The name all these instances get
pair_name = orig_target + "-model" + str(begin_inst.id)
orig_file = begin_inst["file"]
begin_file = res["StartInst", orig_file]
end_file = res["EndInst", orig_file]
mid_file = res["MidInst", ""]
begin_inst["file"] = begin_file
begin_inst["targetname"] = pair_name
angles = Vec.from_str(begin_inst["angles"])
# We round it to get rid of 0.00001 inprecision from the calculations.
direction = Vec(0, 0, 1).rotate(angles.x, angles.y, angles.z)
":type direction: utils.Vec"
begin_pos = Vec.from_str(begin_inst["origin"])
axis_1, axis_2, main_axis = PAIR_AXES[direction.as_tuple()]
for end_inst in VMF.by_class["func_instance"]:
if end_inst["targetname", ""] != end_name:
# Only examine this barrier hazard's instances!
continue
end_pos = Vec.from_str(end_inst["origin"])
if begin_pos[axis_1] == end_pos[axis_1] and begin_pos[axis_2] == end_pos[axis_2]:
length = int(end_pos[main_axis] - begin_pos[main_axis])
break
else:
utils.con_log("No matching pair for {}!!".format(orig_target))
return
end_inst["targetname"] = pair_name
end_inst["file"] = end_file
if mid_file != "":
# Go 64 from each side, and always have at least 1 section
# A 128 gap will have length = 0
for dis in range(0, abs(length) + 1, 128):
new_pos = begin_pos + direction * dis
VMF.create_ent(
classname="func_instance",
targetname=pair_name,
angles=begin_inst["angles"],
file=mid_file,
origin=new_pos.join(" "),
)
示例8: res_unst_scaffold_setup
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def res_unst_scaffold_setup(res):
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": utils.conv_bool(block["isPiston", "0"]),
"rotate_logic": utils.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 resolve_inst(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.
示例9: flag_goo_at_loc
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def flag_goo_at_loc(inst, flag):
"""Check to see if a given location is submerged in goo.
0 0 0 is the origin of the instance, values are in 128 increments.
"""
pos = Vec.from_str(flag.value).rotate_by_str(inst['angles', '0 0 0'])
pos *= 128
pos += Vec.from_str(inst['origin'])
# Round to 128 units, then offset to the center
pos = pos // 128 * 128 + 64 # type: Vec
val = pos.as_tuple() in GOO_LOCS
return val
示例10: track_scan
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def track_scan(
tr_set,
track_inst,
start_track: VLib.Entity,
middle_file: str,
x_dir: int,
):
"""Build a set of track instances extending from a point.
:param track_inst: A dictionary mapping origins to track instances
:param start_track: The instance we start on
:param middle_file: The file for the center track piece
:param x_dir: The direction to look (-1 or 1)
"""
track = start_track
move_dir = Vec(x_dir*128, 0, 0).rotate_by_str(track['angles'])
while track:
tr_set.add(track)
next_pos = Vec.from_str(track['origin']) + move_dir
track = track_inst.get(next_pos.as_tuple(), None)
if track is None:
return
if track['file'].casefold() != middle_file:
# If the next piece is an end section, add it then quit
tr_set.add(track)
return
示例11: res_import_template_setup
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def res_import_template_setup(res):
temp_id = res['id'].casefold()
face = Vec.from_str(res['face_pos', '0 0 -64'])
norm = Vec.from_str(res['normal', '0 0 1'])
replace_tex = defaultdict(list)
for prop in res.find_key('replace', []):
replace_tex[prop.name].append(prop.value)
offset = Vec.from_str(res['offset', '0 0 0'])
return (
temp_id,
dict(replace_tex),
face,
norm,
offset,
)
示例12: find_indicator_panels
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def find_indicator_panels(inst):
"""We need to locate indicator panels, so they aren't overwritten.
"""
if inst['file'].casefold() not in resolve_inst('[indpan]'):
return
loc = Vec(0, 0, -64).rotate_by_str(inst['angles'])
loc += Vec.from_str(inst['origin'])
# Sometimes (light bridges etc) a sign will be halfway between
# tiles, so in that case we need to force 2 tiles.
loc_min = (loc - (15, 15, 0)) // 32 * 32 + (16, 16, 0)
loc_max = (loc + (15, 15, 0)) // 32 * 32 + (16, 16, 0)
FORCE_LOCATIONS.add(loc_min.as_tuple())
FORCE_LOCATIONS.add(loc_max.as_tuple())
示例13: res_translate_inst
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def res_translate_inst(inst, res):
"""Translate the instance locally by the given amount.
The special values <piston>, <piston_bottom> and <piston_top> can be
used to offset it based on the starting position, bottom or top position
of a piston platform.
"""
folded_val = res.value.casefold()
if folded_val == '<piston>':
folded_val = (
'<piston_top>' if
utils.conv_bool(inst.fixup['$start_up'])
else '<piston_bottom>'
)
if folded_val == '<piston_top>':
val = Vec(z=128 * utils.conv_int(inst.fixup['$top_level', '1'], 1))
elif folded_val == '<piston_bottom>':
val = Vec(z=128 * utils.conv_int(inst.fixup['$bottom_level', '0'], 0))
else:
val = Vec.from_str(res.value)
offset = val.rotate_by_str(inst['angles'])
inst['origin'] = (offset + Vec.from_str(inst['origin'])).join(' ')
示例14: res_faith_mods
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def res_faith_mods(inst, res):
"""Modify the trigger_catrapult that is created for ItemFaithPlate items.
Values:
- raise_trig: Raise or lower the trigger_catapults by this amount.
- angled_targ, angled_in: Instance entity and input for angled plates
- straight_targ, straight_in: Instance entity and input for
straight plates
- instvar: A $replace value to set to either 'angled' or '
'straight'.
"""
# Get data about the trigger this instance uses for flinging
fixup_var = res['instvar', '']
offset = utils.conv_int(res['raise_trig', '0'])
if offset:
offset = Vec(0, 0, offset).rotate_by_str(inst['angles', '0 0 0'])
':type offset Vec'
for trig in vbsp.VMF.by_class['trigger_catapult']:
if inst['targetname'] in trig['targetname']:
if offset: # Edit both the normal and the helper trigger
trig['origin'] = (
Vec.from_str(trig['origin']) +
offset
).join(' ')
for solid in trig.solids:
solid.translate(offset)
# Inspect the outputs to determine the type.
# We also change them if desired, since that's not possible
# otherwise.
for out in trig.outputs:
if out.inst_in == 'animate_angled_relay':
out.inst_in = res['angled_targ', 'animate_angled_relay']
out.input = res['angled_in', 'Trigger']
if fixup_var:
inst.fixup[fixup_var] = 'angled'
break # There's only one output we want to look for...
elif out.inst_in == 'animate_straightup_relay':
out.inst_in = res[
'straight_targ', 'animate_straightup_relay'
]
out.input = res['straight_in', 'Trigger']
if fixup_var:
inst.fixup[fixup_var] = 'straight'
break
示例15: res_import_template_setup
# 需要导入模块: from utils import Vec [as 别名]
# 或者: from utils.Vec import from_str [as 别名]
def res_import_template_setup(res):
temp_id = res['id'].casefold()
force = res['force', ''].casefold().split()
if 'white' in force:
force_colour = MAT_TYPES.white
elif 'black' in force:
force_colour = MAT_TYPES.black
elif 'invert' in force:
force_colour = 'INVERT'
else:
force_colour = None
if 'world' in force:
force_type = TEMP_TYPES.world
elif 'detail' in force:
force_type = TEMP_TYPES.detail
else:
force_type = TEMP_TYPES.default
for size in ('2x2', '4x4', 'wall', 'special'):
if size in force:
force_grid = size
break
else:
force_grid = None
replace_tex = defaultdict(list)
for prop in res.find_key('replace', []):
replace_tex[prop.name].append(prop.value)
replace_brush = res['replaceBrush', None]
if replace_brush:
replace_brush_pos = Vec.from_str(replace_brush)
replace_brush_pos.z -= 64 # 0 0 0 defaults to the floor.
else:
replace_brush_pos = None
return (
temp_id,
dict(replace_tex),
force_colour,
force_grid,
force_type,
replace_brush_pos,
)