So... I'm trying to create some kind of script that would link player to a script model and limit the player angles like playerLinkToDelta function...
This is how I tried to limit player angles but it fails when the script model reaces yaw of 0...
Code:
playerLinkAC( player, target, pitch_max, pitch_min, yaw_max, yaw_min )
{
// THIS WILL "FAIL" @ ANGLE OF 0...
// PLAYER WILL ROTATE 360...
level endon( "unlink_angles" );
while( 1 )
{
player.x = player getPlayerAngles();
pitch = player.x[0];
yaw = player.x[1];
roll = player.x[2];
yaw_a = ( target.angles[1] );
yaw_b = ( player.angles[1] );
dif = player angle_dif( yaw_a, yaw_b );
wait( 0.05 );
if( pitch < pitch_min )
{
player setPlayerAngles( ( ( pitch + 0.20 ), player.x[1], player.x[2] ) );
}
if( pitch > pitch_max )
{
player setPlayerAngles( ( ( pitch - 0.20 ), player.x[1], player.x[2] ) );
}
if( dif <= yaw_max )
{
player setPlayerAngles( ( player.x[0], ( yaw + 0.20 ), player.x[2] ) );
}
if( dif >= yaw_min )
{
player setPlayerAngles( ( player.x[0], ( yaw - 0.20 ), player.x[2] ) );
}
}
}
// ORIGINAL SCRIPT IN COMMON_SCRIPTS\UTILITY.GSC
angle_dif( oldangle, newangle )
{
// returns the difference between two yaws
if( oldangle == newangle )
return 0;
oldangle += 30;
newangle += 30;
while (newangle > 360)
newangle -=360;
while (newangle < 0)
newangle +=360;
while (oldangle > 360)
oldangle -=360;
while (oldangle < 0)
oldangle +=360;
olddif = undefined;
newdif = undefined;
if (newangle > 180)
newdif = 360 - newangle;
else
newdif = newangle;
if (oldangle > 180)
olddif = 360 - oldangle;
else
olddif = oldangle;
outerdif = newdif + olddif;
innerdif = 0;
//if (newangle > oldangle)
innerdif = newangle - oldangle;
//else
//innerdif = oldangle - newangle;
if (innerdif < outerdif)
return innerdif;
else
return outerdif;
}
And the script is called from _ac130.gsc ( custom script, not the SP one )
Code:
self thread playerLinkAC( self, level.ac130, 55, 20, -30, 30 );
If anyone knows a better solution to this I would really appreciate if you would share it with us.
EDIT:
I have tried to spawn a turret and link it to player but the problem is that the limited angles of turret won't rotate with the AC-130 and thus the player can only look to one direction.
The AC-130 is linked to a script origin at map center and the script origin is rotated.
Main()
Code:
main()
{
self endon( "disconnect" );
level endon( "ac130_stop" );
self notify( "nvg_off" );
self.nvgOn = false;
self.irOn = false;
self bear\_nvg::nvgView();
self takeallweapons();
self disableWeapons();
self maps\mp\gametypes\_weapons::detach_all_weapons();
self detachall();
self setModel( "" );
if( self hasPerk( "specialty_fastreload" ) )
self unSetPerk( "specialty_fastreload" );
if( self hasPerk( "specialty_rof" ) )
self unSetPerk( "specialty_rof" );
self.isAC130 = true;
iPrintLnBold( self.name + " is flying an AC-130!" );
level.center_link = spawn( "script_origin", level.mapCenter );
level.ac130 = spawnplane( self, "script_model", self getOrigin() );
level.ac130.origin = level.mapCenter + ( -3000, 0, 2000 );
level.ac130 setModel( "bear_ac130" );
level.ac130.angles = ( 45, 0, 0 );
level.ac130.team = self.pers["team"];
level.ac130.damage = 0;
level.ac130.flares = false;
level.ac130.smoke = false;
self_link = spawn( "script_origin", level.ac130 getTagOrigin( "tag_player" ) );
self.origin = level.ac130 getTagOrigin( "tag_player" );
self_link linkTo( level.ac130 );
level.ac130 linkTo( level.center_link );
self setplayerangles ( level.ac130.angles );
self linkTo( self_link );
/*turret = spawnTurret( "misc_turret", self.origin + ( 0, 0, 0 ), "saw_bipod_crouch_mp" );
turret.angles = ( self getPlayerAngles() - ( self getPlayerAngles()[0], 0, 0 ) );
turret setleftarc( 89 );
turret setrightarc( 89 );
turret settoparc( 89 );
turret setbottomarc( 89 );
turret setmodel( "weapon_minigun" );
turret.weaponinfo = "saw_bipod_crouch_mp";
turret.targetname = "test01";
turret linkTo( self );
trig = spawn( "trigger_use_touch", self getOrigin(), 0, 3000, 30 );
trig.targetname = "test01";*/
level.center_link rotateYaw( ( level.ac130_time * 2 ), level.ac130_time );
//playerLinkAC( player, target, pitch_max, pitch_min, yaw_max, yaw_min );
self thread playerLinkAC( self, level.ac130, 55, 20, -30, 30 );
self thread controls();
self thread ac_end_spectator();
self thread ac_end_player();
self thread ac_end_player_alt();
self thread ac_end_world();
self thread ac_end_quit();
self thread ac_end_death();
self thread ac_end_force();
self thread ac_damage();
self thread ac_fx();
self thread ac_brightness();
self thread ac_hud();
self thread ac_shellshock();
self thread sounds();
self thread weapons();
self thread switchWeapons();
self thread switchVision();
self thread ac_fire();
self thread ac_tweaks();
ambientStop( 3 );
set_ambient( "ac130" );
self enableWeapons();
wait( level.ac130_time );
level notify( "ac130_leave" );
}