 # Teleport player in front of another player (or other ent) ?

## Recommended Posts

I am trying to design a function to teleport player A to directly in front of player B and make him face player B. However, I am not familiar enough with vectors and the vector functions to achieve this. How can I determine an origin x units from where player B is facing? And how can I ensure that the player spawns on the ground, not in the ground or in the air?

How are you trying to achieve this? I don't think it's possible with scripting, you probably need to edit the code.

I am trying to do this via the game code rather than scripting.

Subtract the viewangles from the origin to get the direction. Multiply the offset in units by the direction to get the change in units. Add the change in units to the origin to get the final destination.

So if this is a mathematical equation:

a - o = d

d * f = c

c + o = s

Where a = viewangles, o = origin, d = direction, f = offset, c = change from origin and s = solution.

That could probably be simplified somehow.

There are functions VectorMA, VectorAdd, VectorSubtract which do this. I don't know the parameters of each off the top of my head, but the last one is always the result. Also there is VectorCopy.

EDIT: VectorMA is "Multiply + Add", meaning you can do the last two parts of that equation in one line of code.

I updated my original post to clarify that I am trying to teleport player A directly in front of player B and make player A face player B.

Subtract the viewangles from the origin to get the direction. Multiply the offset in units by the direction to get the change in units. Add the change in units to the origin to get the final destination.

So if this is a mathematical equation:
a - o = d
d * f = c
c + o = s
Where a = viewangles, o = origin, d = direction, f = offset, c = change from origin and s = solution.
That could probably be simplified somehow.

There are functions VectorMA, VectorAdd, VectorSubtract which do this. I don't know the parameters of each off the top of my head, but the last one is always the result. Also there is VectorCopy.

EDIT: VectorMA is "Multiply + Add", meaning you can do the last two parts of that equation in one line of code.

Okay, I think I understand the first part, angles - origin = direction, but I'm lost on the rest of it. What is offset, a vector? How do you determine the values to put in the offset? If I wanted to teleport the person 45 units in front of the other, would that be {45.0f, 45.0f, 0}?

As far as the parameters go:

```void _VectorAdd( const vec3_t veca, const vec3_t vecb, vec3_t out ) {
out = veca+vecb;
out = veca+vecb;
out = veca+vecb;
}

void _VectorSubtract( const vec3_t veca, const vec3_t vecb, vec3_t out ) {
out = veca-vecb;
out = veca-vecb;
out = veca-vecb;
}

void _VectorMA( const vec3_t veca, float scale, const vec3_t vecb, vec3_t vecc) {
vecc = veca + scale*vecb;
vecc = veca + scale*vecb;
vecc = veca + scale*vecb;
}
```

Offset is how far you want the other person to be away from you.

So your code should look like the following:

```void Cmd_TeleMe_f(gentity_t* ent) {
float offset = 32.0f;
vec3_t dir, pos;
_VectorSubtract(ent->client->ps.origin, ent->client->ps.viewAngles, dir);
_VectorMA(ent->client->ps.origin, offset, dir, pos);
// pos now contains the position you want that person to teleport to
}
```

The first two args of VectorSubtract might have to be flipped around. I can't remember which way they go.

For getting the other player to face you, I know it's possible. @@Scooper is great with vector math though. Much better than me. I'm pretty sure.

```void Cmd_TeleMe_f(gentity_t* ent)
{
float offset = 32.0f;
vec3_t dir, pos, newAngle;
char buffer[MAX_TOKEN_CHARS];
gentity_t* target = NULL;
int playerIndex = -1;

// Find the target player
trap_Argv( 1, buffer, sizeof( buffer ) );
playerIndex = ClientNumberFromString(ent, buffer, qfalse);

if( playerIndex == -1 )
{
return;
}
target = g_entities[playerIndex];

// Find the forward vector from the target npc's view angles.
AngleVectors(target->client->ps.viewangles, dir, NULL, NULL);

// Find the point that is offset infront of the target player.
VectorMA(target->client->ps.origin, offset, dir, pos);

// Flip the vector so it's pointing towards the target player
VectorScale(dir, -1, dir);

// Use the flipped vector to get new facing angle for yourself
vectoangles(dir, newAngle);

// Teleport yourself(ent) to the position right infront of target(pos) with the new angle facing the target(newAngle)
TeleportPlayer(ent, pos, newAngle);
}
```

Something like this should work.

grant85 likes this

```void Cmd_TeleMe_f(gentity_t* ent)
{
float offset = 32.0f;
vec3_t dir, pos, newAngle;
char buffer[MAX_TOKEN_CHARS];
gentity_t* target = NULL;
int playerIndex = -1;

// Find the target player
trap_Argv( 1, buffer, sizeof( buffer ) );
playerIndex = ClientNumberFromString(ent, buffer, qfalse);

if( playerIndex == -1 )
{
return;
}
target = g_entities[playerIndex];

// Find the forward vector from the target npc's view angles.
AngleVectors(target->client->ps.viewangles, dir, NULL, NULL);

// Find the point that is offset infront of the target player.
VectorMA(target->client->ps.origin, offset, dir, pos);

// Flip the vector so it's pointing towards the target player
VectorScale(dir, -1, dir);

// Use the flipped vector to get new facing angle for yourself
vectoangles(dir, newAngle);

// Teleport yourself(ent) to the position right infront of target(pos) with the new angle facing the target(newAngle)
TeleportPlayer(ent, pos, newAngle);
}
```

Something like this should work.

That's what I needed and the comments help too. Thanks!

np, hope it works. Didn't test anything ... I am thinking about a SP force power not, that allow to the jedi to teleport directly into the face of an opponent for surprise and slay him :