move_rope / keyframe_rope
If the game has round restart mechanics this entity may not behave as expected.
move_rope and keyframe_rope are point entities available in all
Source games.
| CRopeKeyframe |
It is an entity that marks a point in a rope. This entity can be shown as keyframe_rope or move_rope, but the two are completely identical in code.
Traditionally, the first entity in a rope chain is a move_rope, with the following ones being keyframe_ropes. This arrangement is required for Hammer to display the rope preview, unless you're using
Hammer++,
TeamSpen's Hammer Addons, or another custom FGD or Hammer build which changes this. Regardless, the game itself does not care which combination is used.
if (!("RopeFix" in getroottable()))
{
::RopeFixListener <- SpawnEntityFromTable("logic_eventlistener",
{
eventname = "teamplay_round_start",
IsEnabled = true,
OnEventFired = "worldspawn,RunScriptCode,RopeFix.SpawnRopes(),-1,-1",
});
RopeFixListener.KeyValueFromString("classname", "move_rope"); // preserve
::RopeFix <-
{
SpawnRopes = function()
{
local table = {}
local len = ropes.len();
for (local i = 0; i < len; i++)
table[i] <- { move_rope = ropes[i] };
SpawnEntityGroupFromTable(table);
},
ropes = [],
};
}
function OnPostSpawn()
{
local kv =
{
origin = self.GetOrigin(),
angles = self.GetAbsAngles(),
targetname = NetProps.GetPropString(self, "m_iName"),
parentname = NetProps.GetPropString(self, "m_iParent"),
spawnflags = NetProps.GetPropInt (self, "m_spawnflags"),
NextKey = NetProps.GetPropString(self, "m_iNextLinkName"),
Slack = NetProps.GetPropInt (self, "m_Slack"),
TextureScale = NetProps.GetPropFloat (self, "m_TextureScale"),
Subdiv = NetProps.GetPropInt (self, "m_Subdiv"),
ScrollSpeed = NetProps.GetPropFloat (self, "m_flScrollSpeed"),
RopeMaterial = NetProps.GetPropString(self, "m_strRopeMaterialModel"),
}
local segments = NetProps.GetPropInt(self, "m_nSegments");
if (segments == 10)
kv.Type <- 0;
else if (segments == 4)
kv.Type <- 1;
else if (segments != 5)
kv.Type <- 2;
local lockedpoints = NetProps.GetPropInt(self, "m_fLockedPoints");
if (!(lockedpoints & 2))
kv.Dangling <- 1;
local flags = NetProps.GetPropInt(self, "m_RopeFlags");
if (flags & 32)
kv.NoWind <- 1;
if (flags & 16)
kv.Breakable <- 1;
if (flags & 4)
kv.Collide <- 1;
if (flags & 2)
kv.Barbed <- 1;
RopeFix.ropes.append(kv);
self.KeyValueFromString("classname", "kill_rope"); // don't preserve
}
Keyvalues
parentname or target).Also displayed in Hammer's 2D views and Entity Report.
Next KeyFrame (NextKey) <targetname>
Slack (Slack) <integer>
Type (Type) <integer choices>
- 0 : Rope
- 1 : Semi-rigid
- 2 : Rigid
Subdivision (Subdiv) <integer>
Barbed (Barbed) <boolean>
Width (1-64) (Width) <float>
Texture Scale (TextureScale) <float>
Collide with world (Collide) <boolean>
Start Dangling (Dangling) <boolean>
Breakable (Breakable) <boolean>
Rope Material (RopeMaterial) <material>
- 0 - Cable
- 1 - Rope
- Else - Chain
Disable Wind (NoWind) <boolean> (removed since
)
This is very expensive, and when overused can cause the world to not render properly, while the console continuously spews out "Scene is too complex".
If you need to have swinging ropes, it might be less expensive to make a model of a rope, that is animated via bones.
Position Interpolator (PositionInterpolator) <integer choices>
Curve Type. Should be left at the default of 2 to ensure accurate rope previews. !FGD for keyframe_rope.
- 0 : Linear
- 1 : Catmull-Rom Spline
- 2 : Rope
Speed (unused) (MoveSpeed) <float>
FGD default is 64.
Flags
- Auto Resize : [1]
- Allows the rope to "stretch" as the entity moves.
Inputs
- SetScrollSpeed <float>
- Set the speed at which the texture scrolls.
- SetForce <angle>
- Apply a force instantaneously to the rope. The parameter should be a vector containing the force to be applied (X Y Z).
- Break
- Break the rope, if it's marked to do so.