Witam, od razu przejde do rzeczy... więc tak przy kompilacji wyskakuje oto taki błąd -
kod pliku uq_jumpstats_stocks.inc
#if defined _jumpstats_stocks_included
#endinput
#endif
#define _jumpstats_stocks_included
#include <jumpstats_const>
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <cstrike>
#include <engine>
#include <fun>
#include <xs>
#include <hamsandwich>
stock Color:CvarToColor(cvar)
{
switch( get_pcvar_num(cvar) )
{
case 1: return GREEN;
case 2: return TEAM_COLOR;
case 3: return GREY;
case 4: return RED;
case 5: return BLUE;
}
return NORMAL;
}
stock CvarToRGB(cvar, &r, &g, &b)
{
/*static color[16];
get_pcvar_string(cvar, color, sizeof(color) - 1);
if( contain( color, " " ) != -1 )
{
static piece[5];
strbreak(color, piece, sizeof(piece) - 1, color, sizeof(color) - 1);
r = str_to_num(piece);
strbreak(color, piece, sizeof(piece) - 1, color, sizeof(color) - 1);
g = str_to_num(piece);
b = str_to_num(color);
}
else
{
new iValue = str_to_num( color );
r = iValue / 1000000;
iValue %= 1000000;
g = iValue / 1000;
b = iValue % 1000;
}
r = clamp( r, 0, 255 );
g = clamp( g, 0, 255 );
b = clamp( b, 0, 255 );*/
static color[16];
get_pcvar_string(cvar, color, sizeof(color) - 1);
static piece[5];
strbreak(color, piece, sizeof(piece) - 1, color, sizeof(color) - 1);
r = str_to_num(piece);
strbreak(color, piece, sizeof(piece) - 1, color, sizeof(color) - 1);
g = str_to_num(piece);
b = str_to_num(color);
}
stock LoadResetCommands(function[])
{
new filename[64];
get_configsdir(filename, sizeof(filename) - 1);
add(filename, sizeof(filename) - 1, "/jumpstats_reset.ini");
// dont need to check if file exists, because in jumpstats_main, it creates one
new f = fopen(filename, "rt");
new data[64];
while( !feof(f) )
{
fgets(f, data, sizeof(data) - 1);
if( !data[0]
|| data[0] == ';'
|| data[0] == '/' && data[1] == '/' ) continue;
register_clcmd(data, function);
}
fclose(f);
}
stock FormatSaveFiles()
{
static bool:executed;
if( executed ) return;
executed = true;
new dir[64];
get_datadir(dir, sizeof(dir) - 1);
add(dir, sizeof(dir) - 1, "/jumpstats");
if( !dir_exists(dir) )
{
mkdir(dir);
}
for( new i = 0; i < JUMP_TYPES; i++ )
{
format(g_jump_filenames[i], sizeof(g_jump_filenames[]) - 1, "%s/%s.txt", dir, g_jump_filenames[i]);
}
}
stock GetDirection(client)
{
static Float:angles[3];
pev(client, pev_v_angle, angles);
engfunc(EngFunc_MakeVectors, angles);
global_get(glb_v_forward, angles);
angles[2] = 0.0;
xs_vec_normalize(angles, angles);
xs_vec_mul_scalar(angles, 250.0, angles);
static Float:velocity[3];
pev(client, pev_velocity, velocity);
new Float:angle = AngleBetweenVectors(angles, velocity, 2, degrees);
if( 45.5 <= angle < 120.0 )
{
return DIR_SIDEWAYS;
}
else if( 134.5 <= angle <= 180.0 )
{
return DIR_BACKWARDS;
}
return DIR_FORWARDS;
}
stock DirectionNameToValue(const direction[])
{
switch( direction[0] )
{
//case 'F', 'f': return DIR_FORWARDS;
case 'S', 's': return DIR_SIDEWAYS;
case 'B', 'b': return DIR_BACKWARDS;
}
return DIR_FORWARDS;
}
stock bool:IsTeamAllowed(client, teamflags)
{
static const req_flags[CsTeams] =
{
(1 << 2), // c = spectator
(1 << 0), // a = t
(1 << 1), // b = ct
(1 << 2) // c = spectator
};
new CsTeams:team = cs_get_user_team(client);
if( !( teamflags & req_flags[ team ] ) )
{
static max_players;
if( !max_players )
{
max_players = get_maxplayers();
}
for( new i = 1; i <= max_players; i++ )
{
if( is_user_alive(i) && cs_get_user_team(i) != team )
{
return false;
}
}
}
return true;
/*new team = max(0, (_:cs_get_user_team(client)) - 1);
new flag = 1 << team;
return bool:(!!(teamflags & flag));*/
//return !!(teamflags & (1 << max(0, (_:cs_get_user_team(client)) - 1)));
}
stock bool:IsTechAllowed(jump_type, techflags)
{
return !!(techflags & (1 << jump_type));
}
stock Float:AngleBetweenVectors(Float:vector1[3], Float:vector2[3], dimensions, anglemode:angletype)
{
if( !(2 <= dimensions <= 3) ) return 0.0;
static Float:v1[3], Float:v2[3];
xs_vec_copy(vector1, v1);
xs_vec_copy(vector2, v2);
if( dimensions == 2 )
{
v1[2] = v2[2] = 0.0;
}
// cos angle = (v1 * v2) / (v1.length * v2.length)
// angle = acos((v1 * v2) / (v1.length * v2.length))
// v1 * v2 = dot product
new Float:lengths = vector_length(v1) * vector_length(v2);
if( lengths == 0.0 )
{
lengths = 1.0;
}
return floatacos(xs_vec_dot(v1, v2) / lengths, angletype);
}
stock GetSpectatedPlayer(client)
{
if( !is_user_alive(client)
&& ((1 << pev(client, pev_iuser1)) & ((1 << 1)|(1 << 2)|(1 << 4))) )
{
new player = pev(client, pev_iuser2);
if( is_user_alive(player) )
{
return player;
}
}
return client;
}
stock bool:IsUserSpectatingPlayer(spectater, player)
{
return (GetSpectatedPlayer(spectater) == player);
}
stock bool:IsUserDucking(client)
{
static Float:absmin[3], Float:absmax[3];
pev(client, pev_absmin, absmin);
pev(client, pev_absmax, absmax);
return !((absmin[2] + 64.0) < absmax[2]);
}
stock bool:IsUserOnGround(client)
{
return !!(pev(client, pev_flags) & FL_ONGROUND2);
}
// Distance calculations are courtesy of SchlumPF, which he optimized the code he got from NumB, who got them from eDark.
// frame_x[0] = data out of the first frame after jumping ; frame_x[1] = data out of the last frame before landing
stock CalculateLandOrigin(bool:ducking, Float:gravity, Float:current_origin[3], Float:frame_origin[2][3], Float:frame_velocity[2][3], Float:land_origin[3])
{
static Float:airtime;
static Float:distancex, Float:distancey;
airtime = floatdiv(((floatsqroot(frame_velocity[0][2] * frame_velocity[0][2] + (2 * gravity * (frame_origin[0][2] - current_origin[2]))) * -1) - frame_velocity[1][2]), (gravity * -1));
frame_velocity[1][0] = floatabs(frame_velocity[1][0]);
frame_velocity[1][1] = floatabs(frame_velocity[1][1]);
distancex = airtime * frame_velocity[1][0];
distancey = airtime * frame_velocity[1][1];
if( frame_origin[1][0] < current_origin[0] ) land_origin[0] = frame_origin[1][0] + distancex;
else land_origin[0] = frame_origin[1][0] - distancex;
if( frame_origin[1][1] < current_origin[1] ) land_origin[1] = frame_origin[1][1] + distancey;
else land_origin[1] = frame_origin[1][1] - distancey;
if( ducking ) current_origin[2] += 18.0;
land_origin[2] = current_origin[2];
}
// frame_x[0] = data out of the first frame after jumping ; failed_x[1] = data out of the last frame in which the player could have landed
stock Float:GetFailedDistance( bool:ducking, Float:gravity, Float:jumpoff_origin[3], Float:current_velocity[3], Float:failed_origin[3], Float:failed_velocity[3] )
{
static Float:airtime, Float:land_origin[3], Float:distance;
if( ducking ) jumpoff_origin[2] -= 18.0;
airtime = ((floatsqroot((failed_velocity[2] * failed_velocity[2]) - (2.0 * -gravity * (failed_origin[2] - jumpoff_origin[2])))*-1) - failed_velocity[2] ) / -gravity;
land_origin[0] = floatabs( failed_origin[0] - jumpoff_origin[0] ) + floatabs( current_velocity[0] * airtime );
land_origin[1] = floatabs( failed_origin[1] - jumpoff_origin[1] ) + floatabs( current_velocity[1] * airtime );
distance = vector_length(land_origin) + EXTRA_DISTANCE;
if( ducking ) jumpoff_origin[2] += 18.0;
return distance;
}
stock Float:GetClientWeaponMaxspeed(client)
{
static const OFFSET_SHIELD = 510;
static const HAS_SHIELD = 1 << 24;
static const USING_SHIELD = 1 << 16;
static Float:maxspeed;
new shield = get_pdata_int(client, OFFSET_SHIELD);
if( shield & USING_SHIELD )
{
maxspeed = 180.0;
}
else if( shield & HAS_SHIELD )
{
maxspeed = 250.0;
}
else
{
static const m_pActiveItem = 373;
new iWeaponEntity = get_pdata_cbase( client, m_pActiveItem );
if( pev_valid( iWeaponEntity ) )
{
ExecuteHamB(Ham_CS_Item_GetMaxSpeed, iWeaponEntity, maxspeed);
}
else
{
switch( get_user_weapon( client ) )
{
case CSW_SG550, CSW_AWP, CSW_G3SG1:
{
maxspeed = 210.0;
}
case CSW_M249:
{
maxspeed = 220.0;
}
case CSW_AK47:
{
maxspeed = 221.0;
}
case CSW_M3, CSW_M4A1:
{
maxspeed = 230.0;
}
case CSW_SG552:
{
maxspeed = 235.0;
}
case CSW_XM1014, CSW_AUG, CSW_GALIL, CSW_FAMAS:
{
maxspeed = 240.0;
}
case CSW_P90:
{
maxspeed = 245.0;
}
case CSW_SCOUT:
{
maxspeed = 260.0;
}
// in case there is no weapon, or something bugged
// I like to have precautions =)
//case CSW_P228, CSW_HEGRENADE, CSW_C4, CSW_MAC10, CSW_SMOKEGRENADE, CSW_ELITE, CSW_FIVESEVEN,
// CSW_UMP45, CSW_USP, CSW_GLOCK18, CSW_MP5NAVY, CSW_TMP, CSW_FLASHBANG, CSW_DEAGLE, CSW_KNIFE:
default:
{
maxspeed = 250.0;
}
}
}
}
if( cs_get_user_vip(client) )
{
static const Float:VIP_MAXSPEED = 227.0;
// fix for plugins using VIP status but didn't set maxspeed
// also fix for plugins using cs_set_user_vip() but player's maxspeed hasn't changed yet
if( get_user_maxspeed(client) == maxspeed )
{
set_user_maxspeed(client, VIP_MAXSPEED);
}
return VIP_MAXSPEED;
}
return maxspeed;
}
stock MakeNameMOTDSafe(name[128], maxchars)
{
name[32] = 0;
replace_all(name, 127, "<", "<");
replace_all(name, 127, ">", ">");
if( maxchars > 128 ) return;
new last;
for( new i = 0; i < 128 && name[i]; )
{
if( name[i] == '&'
&& (name[i + 1] == 'l' || name[i + 1] == 'g')
&& name[i + 2] == 't'
&& name[i + 3] == ';' )
{
i += 3;
}
if( ++i > maxchars )
{
break;
}
last = i;
}
name[last] = 0;
}
stock bool:IsWeaponAllowed(client, weapon, weaponflags)
{
/*new real = cs_get_user_shield(client) ? 2 : weapon;
return !!(weaponflags & (1 << real));*/
return !!(weaponflags & (1 << (cs_get_user_shield(client) ? 2 : weapon)));
}
//#define ENTITY_EDGES_WORK
#define USE_FAKE_JUMP_ENTITY
//#define USE_TEST_BEAM
#if defined USE_TEST_BEAM
stock g_beam_sprite;
#endif
// Credits to SchlumPF for original code without entity support
stock GetEdgeDistances( iJumpType, bool:bDucking, bool:bFailed, Float:vJumpedAt[ 3 ], Float:vLandedAt[ 3 ], bool:bJumpEntity,\
Float:vEntityOrigin[ 3 ], Float:vEntityAngles[ 3 ], Float:vEntityMins[ 3 ], Float:vEntityMaxs[ 3 ],\
&Float:fJumpEdge, &Float:fLandEdge, &iBlock )
{
fJumpEdge = -1.0;
fLandEdge = -1.0;
iBlock = -1;
vJumpedAt[ 2 ] -= 36.0;
vLandedAt[ 2 ] = vJumpedAt[ 2 ];
#if !defined ENTITY_EDGES_WORK
if( bJumpEntity )
{
// disabled until I can get it to work
// make compiler happy
vEntityOrigin[ 0 ] = vEntityAngles[ 1 ] = vEntityMins[ 2 ] + vEntityMaxs[ 2 ];
return 0;
}
#endif
static Float:vMiddle[ 3 ];
xs_vec_add( vJumpedAt, vLandedAt, vMiddle );
xs_vec_div_scalar( vMiddle, 2.0, vMiddle );
vMiddle[ 2 ] = vLandedAt[ 2 ] - 1.0;
if( engfunc( EngFunc_PointContents, vMiddle ) != CONTENTS_EMPTY )
{
//client_print( 0, print_chat, "[EdgeDistances] Middle origin is not empty." );
return 0;
}
static iHull;
iHull = ( bDucking || bFailed ) ? HULL_HEAD : HULL_HUMAN;
vJumpedAt[ 2 ] = vLandedAt[ 2 ] = vMiddle[ 2 ];
#if defined ENTITY_EDGES_WORK
#if defined USE_FAKE_JUMP_ENTITY
static Float:vPlaneNormal[ 3 ], Float:vJumpPos[ 3 ], Float:vLandPos[ 3 ], iEntity;
if( bJumpEntity )
{
if( !iEntity )
{
iEntity = create_entity( "info_target" );
entity_set_int( iEntity, EV_INT_solid, SOLID_BBOX );
entity_set_int( iEntity, EV_INT_movetype, MOVETYPE_FLY );
entity_set_model( iEntity, "models/w_usp.mdl" );
}
entity_set_vector( iEntity, EV_VEC_angles, vEntityAngles );
entity_set_size( iEntity, vEntityMins, vEntityMaxs );
entity_set_origin( iEntity, vEntityOrigin );
set_entity_visibility( iEntity, 0 );
}
engfunc( EngFunc_TraceHull, vMiddle, vJumpedAt, IGNORE_MONSTERS, iHull, -1, 0 );
if( bJumpEntity )
{
entity_set_origin( iEntity, Float:{ 0.0, 0.0, -55000.0 } );
static Float:fFraction;
get_tr2( 0, TR_flFraction, fFraction );
client_print( 0, print_chat, "Entity fraction: %f", fFraction );
if( fFraction == 1.0 )
{
return 0;
}
}
get_tr2( 0, TR_vecPlaneNormal, vPlaneNormal );
if( vPlaneNormal[ 2 ] != 0.0 )
{
//client_print( 0, print_chat, "[EdgeDistances] vPlaneNormal[ 2 ] is not 0.0 for jump edge");
return 0;
}
get_tr2( 0, TR_vecEndPos, vJumpPos );
if( floatabs( vPlaneNormal[ 0 ] ) == 1.0 && vPlaneNormal[ 1 ] == 0.0 )
{
if( iJumpType != JUMP_LADDERJUMP )
{
fJumpEdge = floatabs( vJumpPos[ 0 ] - vJumpedAt[ 0 ] );
}
}
else if( vPlaneNormal[ 0 ] == 0.0 && floatabs( vPlaneNormal[ 1 ] ) == 1.0 )
{
if( iJumpType != JUMP_LADDERJUMP )
{
fJumpEdge = floatabs( vJumpPos[ 1 ] - vJumpedAt[ 1 ] );
}
}
else
{
//client_print( 0, print_chat, "[EdgeDistances] Invalid vPlaneNormal for jump wall { %f, %f }", vPlaneNormal[ 0 ], vPlaneNormal[ 1 ]);
return 0;
}
#else
static Float:vPlaneNormal[ 3 ], Float:vJumpPos[ 3 ], Float:vLandPos[ 3 ];
if( bJumpEntity )
{
static Float:vJumpPos[ 3 ], Float:vPlaneNormal[ 3 ];
new Float:fDistance = GetBoxHitPos(
vEntityOrigin,\
vEntityAngles,\
vEntityMins,\
vEntityMaxs,\
vMiddle,\
vJumpedAt,\
vJumpPos,\
vPlaneNormal
);
if( fDistance == 0.0 )
{
//client_print( 0, print_chat, "[EdgeDistances] Could not find the edge of the jump entity");
return 0;
}
//client_print( 0, print_chat, "vJumpPlane: {%f, %f, %f}", vPlaneNormal[ 0 ], vPlaneNormal[ 1 ], vPlaneNormal[ 2 ] );
//MakeBeamPoints( 0, vMiddle, vJumpPos, ( vMiddle[ 2 ] + 1.0 ), g_beam_sprite, 50, 255, 255, 0 );
if( vPlaneNormal[ 1 ] == 0.0 )
{
if( iJumpType != JUMP_LADDERJUMP )
{
fJumpEdge = floatabs( vJumpPos[ 0 ] - vJumpedAt[ 0 ] );
}
}
else if( vPlaneNormal[ 0 ] == 0.0 )
{
if( iJumpType != JUMP_LADDERJUMP )
{
fJumpEdge = floatabs( vJumpPos[ 1 ] - vJumpedAt[ 1 ] );
}
}
else
{
//client_print( 0, print_chat, "[EdgeDistances] Invalid vPlaneNormal for jump entity { %f, %f }", vPlaneNormal[ 0 ], vPlaneNormal[ 1 ]);
return 0;
}
}
else
{
engfunc( EngFunc_TraceHull, vMiddle, vJumpedAt, IGNORE_MONSTERS, iHull, -1, 0 );
get_tr2( 0, TR_vecPlaneNormal, vPlaneNormal );
if( vPlaneNormal[ 2 ] != 0.0 )
{
//client_print( 0, print_chat, "[EdgeDistances] vPlaneNormal[ 2 ] is not 0.0 for jump edge");
return 0;
}
get_tr2( 0, TR_vecEndPos, vJumpPos );
if( floatabs( vPlaneNormal[ 0 ] ) == 1.0 && vPlaneNormal[ 1 ] == 0.0 )
{
if( iJumpType != JUMP_LADDERJUMP )
{
fJumpEdge = floatabs( vJumpPos[ 0 ] - vJumpedAt[ 0 ] );
}
}
else if( vPlaneNormal[ 0 ] == 0.0 && floatabs( vPlaneNormal[ 1 ] ) == 1.0 )
{
if( iJumpType != JUMP_LADDERJUMP )
{
fJumpEdge = floatabs( vJumpPos[ 1 ] - vJumpedAt[ 1 ] );
}
}
else
{
//client_print( 0, print_chat, "[EdgeDistances] Invalid vPlaneNormal for jump wall { %f, %f }", vPlaneNormal[ 0 ], vPlaneNormal[ 1 ]);
return 0;
}
}
#endif
#else
static Float:vPlaneNormal[ 3 ], Float:vJumpPos[ 3 ], Float:vLandPos[ 3 ];
engfunc( EngFunc_TraceHull, vMiddle, vJumpedAt, IGNORE_MONSTERS, iHull, -1, 0 );
get_tr2( 0, TR_vecPlaneNormal, vPlaneNormal );
if( vPlaneNormal[ 2 ] != 0.0 )
{
//client_print( 0, print_chat, "[EdgeDistances] vPlaneNormal[ 2 ] is not 0.0 for jump edge");
return 0;
}
get_tr2( 0, TR_vecEndPos, vJumpPos );
if( floatabs( vPlaneNormal[ 0 ] ) == 1.0 && vPlaneNormal[ 1 ] == 0.0 )
{
if( iJumpType != JUMP_LADDERJUMP )
{
fJumpEdge = floatabs( vJumpPos[ 0 ] - vJumpedAt[ 0 ] );
}
}
else if( vPlaneNormal[ 0 ] == 0.0 && floatabs( vPlaneNormal[ 1 ] ) == 1.0 )
{
if( iJumpType != JUMP_LADDERJUMP )
{
fJumpEdge = floatabs( vJumpPos[ 1 ] - vJumpedAt[ 1 ] );
}
}
else
{
//client_print( 0, print_chat, "[EdgeDistances] Invalid vPlaneNormal for jump wall { %f, %f }", vPlaneNormal[ 0 ], vPlaneNormal[ 1 ]);
return 0;
}
#endif
fJumpEdge -= HLBSP_EXTRA;
if( bFailed )
{
static Float:vEnd[ 3 ];
xs_vec_copy( vLandedAt, vEnd );
if( vPlaneNormal[ 1 ] == 0.0 )
{
vEnd[ 0 ] += ( vPlaneNormal[ 0 ] * 300.0 );
}
else //if( vPlaneNormal[ 0 ] == 0.0 )
{
vEnd[ 1 ] += ( vPlaneNormal[ 1 ] * 300.0 );
}
engfunc( EngFunc_TraceHull, vMiddle, vEnd, IGNORE_MONSTERS, iHull, -1, 0 );
get_tr2( 0, TR_vecPlaneNormal, vPlaneNormal );
if( vPlaneNormal[ 2 ] != 0.0 )
{
//client_print( 0, print_chat, "[EdgeDistances] vPlaneNormal[ 2 ] is not 0.0 for land edge");
return 0;
}
get_tr2( 0, TR_vecEndPos, vLandPos );
if( floatabs( vPlaneNormal[ 0 ] ) == 1.0 && vPlaneNormal[ 1 ] == 0.0 )
{
vEnd[ 0 ] = vLandPos[ 0 ] - ( vPlaneNormal[ 0 ] * 16.1 );
vEnd[ 1 ] = vLandPos[ 1 ];
vEnd[ 2 ] = vLandPos[ 2 ] + 37.0;
}
else if( vPlaneNormal[ 0 ] == 0.0 && floatabs( vPlaneNormal[ 1 ] ) == 1.0 )
{
vEnd[ 0 ] = vLandPos[ 0 ];
vEnd[ 1 ] = vLandPos[ 1 ] - ( vPlaneNormal[ 1 ] * 16.1 );
vEnd[ 2 ] = vLandPos[ 2 ] + 37.0;
}
else
{
//client_print( 0, print_chat, "[EdgeDistances] Invalid vPlaneNormal for land wall { %f, %f }", vPlaneNormal[ 0 ], vPlaneNormal[ 1 ]);
return 0;
}
vMiddle[ 2 ] += 37.0;
engfunc( EngFunc_TraceHull, vMiddle, vEnd, IGNORE_MONSTERS, iHull, -1, 0 );
static Float:fFraction;
get_tr2( 0, TR_flFraction, fFraction );
if( fFraction < 1.0 )
{
//client_print( 0, print_chat, "[EdgeDistances] Something wrong with failed");
return 0;
}
}
else
{
engfunc( EngFunc_TraceHull, vMiddle, vLandedAt, IGNORE_MONSTERS, iHull, -1, 0 );
get_tr2( 0, TR_vecPlaneNormal, vPlaneNormal );
if( vPlaneNormal[ 2 ] != 0.0 )
{
//client_print( 0, print_chat, "[EdgeDistances] vPlaneNormal[ 2 ] is not 0.0 for land edge");
return 0;
}
get_tr2( 0, TR_vecEndPos, vLandPos );
}
if( iJumpType == JUMP_LADDERJUMP )
{
xs_vec_copy( vJumpedAt, vJumpPos );
}
static Float:fBlock;
if( floatabs( vPlaneNormal[ 0 ] ) == 1.0 && vPlaneNormal[ 1 ] == 0.0 )
{
fLandEdge = floatabs( vLandPos[ 0 ] - vLandedAt[ 0 ] );
fBlock = floatabs( vJumpPos[ 0 ] - vLandPos[ 0 ] );
}
else if( vPlaneNormal[ 0 ] == 0.0 && floatabs( vPlaneNormal[ 1 ] ) == 1.0 )
{
fLandEdge = floatabs( vLandPos[ 1 ] - vLandedAt[ 1 ] );
fBlock = floatabs( vJumpPos[ 1 ] - vLandPos[ 1 ] );
}
else
{
//client_print( 0, print_chat, "[EdgeDistances] Invalid vPlaneNormal for land wall { %f, %f }. floatabs( 1.000000 ) = %f", vPlaneNormal[ 0 ], vPlaneNormal[ 1 ], floatabs( 1.000000 ));
return 0;
}
fLandEdge -= HLBSP_EXTRA;
if( iJumpType != JUMP_LADDERJUMP )
{
if( bJumpEntity )
{
fBlock += ( ( EXTRA_DISTANCE / 2.0 ) + 1.0 );
}
else
{
fBlock += EXTRA_DISTANCE;
}
}
/*else
{
fBlock += 0.5;
}*/
//client_print( 0, print_chat, "fBlock = %f", fBlock );
iBlock = floatround( fBlock );
return ( g_iBlockSizes[ iJumpType ][ BLOCK_MIN ] <= iBlock <= g_iBlockSizes[ iJumpType ][ BLOCK_MAX ] ) ? 1 : 0;
}
// Thanks to joaquimandrade for the following code below
stock const g_iAngleDirections[ ] =
{
ANGLEVECTOR_FORWARD,
ANGLEVECTOR_RIGHT,
ANGLEVECTOR_UP
};
enum Size
{
SIZE_MINS,
SIZE_MAXS
};
stock Float:GetBoxHitPos( Float:vOrigin[ 3 ], Float:vAngles[ 3 ], Float:vMins[ 3 ], Float:vMaxs[ 3 ], Float:vStart[ 3 ], Float:vStop[ 3 ], Float:vHit[ 3 ], Float:vHitPlane[ 3 ] )
{
static Float:vAngleVectors[ sizeof( g_iAngleDirections ) ][ 3 ];
for( new i = 0; i < sizeof( g_iAngleDirections ); i++ )
{
angle_vector( vAngles, g_iAngleDirections[ i ], vAngleVectors[ i ] );
xs_vec_normalize( vAngleVectors[ i ], vAngleVectors[ i ] );
}
static const iPlaneData[ ][ 3 ] =
{
{ ANGLEVECTOR_FORWARD, _:SIZE_MINS, 0 },
{ ANGLEVECTOR_FORWARD, _:SIZE_MAXS, 0 },
{ ANGLEVECTOR_RIGHT, _:SIZE_MINS, 1 },
{ ANGLEVECTOR_RIGHT, _:SIZE_MAXS, 1 }
};
static const Float:fDefaultDistance = 99999.9;
new Float:fSmallestDistance = fDefaultDistance;
static Float:vDirection[ 3 ];
xs_vec_sub( vStop, vStart, vDirection );
static Float:vSize[ Size ][ 3 ];
xs_vec_copy( vMins, vSize[ SIZE_MINS ] );
xs_vec_copy( vMaxs, vSize[ SIZE_MAXS ] );
static Float:vPlane[ 4 ], Float:vHit2[ 3 ], Float:fDistance;
for( new i = 0; i < sizeof( iPlaneData ); i++ )
{
GetPlane( vOrigin, vSize[ Size:iPlaneData[ i ][ 1 ] ][ iPlaneData[ i ][ 2 ] ], vAngleVectors, iPlaneData[ i ][ 0 ], vPlane );
if( xs_plane_rayintersect( vPlane, vStart, vDirection, vHit2 ) )
{
//MakeBeamPoints( 0, vStart, vHit2, ( vStart[ 2 ] + 10.0 ), g_beam_sprite, 50, 255, 0, 255 );
fDistance = vector_distance( vStart, vHit2 );
if( fSmallestDistance > fDistance )
{
fSmallestDistance = fDistance;
xs_vec_copy( vHit2, vHit );
xs_vec_copy( vPlane, vHitPlane );
}
}
}
return ( fSmallestDistance == fDefaultDistance ) ? 0.0 : fSmallestDistance;
}
stock GetPlane( Float:vOrigin[ 3 ], Float:fSizeScalar, Float:vAngleVectors[ sizeof( g_iAngleDirections ) ][ 3 ], iAngle, Float:vPlane[ 4 ] )
{
static Float:vPath[ 3 ];
xs_vec_mul_scalar( vAngleVectors[ iAngle - 1 ], fSizeScalar, vPath );
xs_vec_add( vPath, vOrigin, vPath );
static Float:vExtraPoints[ 2 ][ 3 ], iPoint;
iPoint = 0;
static Float:vExtraPath[ 3 ];
for( new i = 0; i < sizeof( g_iAngleDirections ); i++ )
{
if( g_iAngleDirections[ i ] != iAngle )
{
xs_vec_mul_scalar( vAngleVectors[ i ], 10.0, vExtraPath );
xs_vec_add( vExtraPath, vPath, vExtraPoints[ iPoint++ ] );
}
}
xs_plane_3p( vPlane, vPath, vExtraPoints[ 0 ], vExtraPoints[ 1 ] );
}
stock MakeBeamPoints( client, Float:vStart[ ], Float:vStop[ ], Float:fHeight, iSprite, iTime, iRed, iGreen, iBlue )
{
message_begin( client ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, SVC_TEMPENTITY, _, client );
write_byte( TE_BEAMPOINTS );
engfunc( EngFunc_WriteCoord, vStart[ 0 ] );
engfunc( EngFunc_WriteCoord, vStart[ 1 ] );
engfunc( EngFunc_WriteCoord, fHeight );
engfunc( EngFunc_WriteCoord, vStop[ 0 ] );
engfunc( EngFunc_WriteCoord, vStop[ 1 ] );
engfunc( EngFunc_WriteCoord, fHeight );
write_short( iSprite );
write_byte( 1 );
write_byte( 5 );
write_byte( iTime );
write_byte( 20 );
write_byte( 0 );
write_byte( iRed );
write_byte( iGreen );
write_byte( iBlue );
write_byte( 200 );
write_byte( 200 );
message_end( );
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/


Dodatki SourceMod













