@portal_touch(eEnt, pPlayer)
{
if(is_nullent(eEnt) || !is_user_connected(pPlayer))
return;
static
Float: fGameTime,
Float: fNextTime;
fGameTime = get_gametime();
if(fNextTime < fGameTime)
{
new pOwner;
pOwner = get_entvar(eEnt, var_iuser3);
if(is_user_connected(pOwner))
{
new ePortalEnt;
ePortalEnt = NULLENT;
if(get_entvar(eEnt, var_iuser4))
{
if(!is_nullent(g_eUserEntPortal[pOwner][PORTAL_SECONDARY]))
ePortalEnt = g_eUserEntPortal[pOwner][PORTAL_SECONDARY];
}
else
{
if(!is_nullent(g_eUserEntPortal[pOwner][PORTAL_PRIMARY]))
ePortalEnt = g_eUserEntPortal[pOwner][PORTAL_PRIMARY];
}
if(is_nullent(ePortalEnt))
{
fNextTime = fGameTime + 1.0;
return;
}
new Float: vecOriginTeleport[3];
get_entvar(ePortalEnt, var_vuser1, vecOriginTeleport);
if(!is_hull_vacant(vecOriginTeleport, HULL_HUMAN, pPlayer))
{
fNextTime = fGameTime + 1.0;
return;
}
set_entvar(pPlayer, var_origin, vecOriginTeleport);
// Получение всего что надо
new Float:vecInAngle[3];
get_entvar(eEnt, var_vuser2, vecInAngle);
new Float:vecOutAngle[3];
get_entvar(ePortalEnt, var_vuser2, vecOutAngle);
new Float:vecPlayerVel[3];
get_entvar(pPlayer, var_velocity, vecPlayerVel);
new Float:vecPlayerAngle[3];
get_entvar(pPlayer, var_angles, vecPlayerAngle);
new Float:vecPlayerVAngle[3];
get_entvar(pPlayer, var_v_angle, vecPlayerVAngle);
// Просчёт и установка вектора движения игрока
new Float:vecOutVel[3];
Vec_GetOutVel(vecInAngle, vecOutAngle, vecPlayerVel, vecOutVel);
set_entvar(pPlayer, var_velocity, vecOutVel);
// Просчёт и установка угла поворота
new Float:vecResAngle[3];
Vec_GetOutAngle(vecInAngle, vecOutAngle, vecPlayerAngle, vecResAngle);
vecResAngle[0] = vecPlayerVAngle[0];
set_entvar(pPlayer, var_angles, vecResAngle);
set_entvar(pPlayer, var_v_angle, vecResAngle);
set_entvar(pPlayer, var_fixangle, 1);
emit_sound(pPlayer, CHAN_STATIC, g_szPortalGunResource[PG_SND_CREATE_O], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
}
fNextTime = fGameTime + 1.0;
}
}
// Получение угла поворота игрока после прохождения через портал
Vec_GetOutAngle(
const Float:vecInAngle[3], // Угол входного портала
const Float:vecOutAngle[3], // Угол выходного портала
const Float:vecSrcAngle[3], // Входной вектор движения игрока
Float:vecResAngle[3]
) {
for (new i = 0; i < 2; i++) {
vecResAngle[i] = (vecSrcAngle[i] - vecInAngle[i] + vecOutAngle[i]) - 180;
}
}
// Получение вектора движения игрока после прохождения через портал
Vec_GetOutVel(
const Float:vecInAngle[3], // Угол входного портала
const Float:vecOutAngle[3], // Угол выходного портала
const Float:vecSrcVel[3], // Входной вектор движения игрока
Float:vecOutVel[3]
) {
new Float:fSrcSpeed = vector_length(vecSrcVel);
new Float:vecSrcDir[3];
for (new i = 0; i < 3; i++) {
vecSrcDir[i] = -(vecSrcVel[i] / fSrcSpeed);
}
new Float:vecSrcAngle[3];
vector_to_angle(vecSrcDir, vecSrcAngle);
new Float:vecAnglesDiff[3];
for (new i = 0; i < 3; i++) {
vecAnglesDiff[i] = vecSrcAngle[i] - vecInAngle[i] + vecOutAngle[i];
}
angle_vector(vecAnglesDiff, ANGLEVECTOR_FORWARD, vecOutVel);
for (new i = 0; i < 3; i++) {
vecOutVel[i] *= fSrcSpeed;
}
}